#include <QtCore/QObject>
#include "MeshBuilder.h"
using namespace mudbox;
MB_PLUGIN( "MeshBuilder", "Build Simple Meshes", "Autodesk", "http://www.mudbox3d.com", Initializer );
void Initializer(void)
{
Kernel()->Interface()->AddCallbackMenuItem( mudbox::Interface::menuMesh, QString::null, QObject::tr("Build Simple Meshes"), Execute);
}
void Execute(void)
{
Mesh *pTriPlane = BuildTrianglePlane();
pTriPlane->SetName("TriPlane");
Geometry *pGeoPlane = CreateInstance<Geometry>();
pGeoPlane->SetName("TriPlane Geometry");
if (SubdivisionLevel *pTriPlaneSL = dynamic_cast<SubdivisionLevel *>(pTriPlane))
{
pGeoPlane->AddLevel(pTriPlaneSL);
pGeoPlane->SetActiveLevel(pTriPlaneSL);
}
Kernel()->Scene()->AddGeometry(pGeoPlane);
Mesh *pQuadCube = BuildQuadCube();
pQuadCube->SetName("QuadCube");
Geometry *pGeoCube = dynamic_cast<Geometry *>(Geometry::CreateInstances());
pGeoCube->SetName("QuadCube Geometry");
SubdivisionLevel *pQuadCubeSL0 = dynamic_cast<SubdivisionLevel *>(pQuadCube);
MB_ASSERT(pQuadCubeSL0);
pGeoCube->AddLevel(pQuadCubeSL0);
SubdivisionLevel *pQuadCubeSL1 = pQuadCubeSL0->Subdivide(false, false, false);
pGeoCube->AddLevel(pQuadCubeSL1);
SubdivisionLevel *pQuadCubeSL2 = pQuadCubeSL1->Subdivide(false, true, false);
pGeoCube->AddLevel(pQuadCubeSL2);
pGeoCube->SetActiveLevel(pQuadCubeSL2);
Kernel()->Scene()->AddGeometry(pGeoCube);
Kernel()->Scene()->SetActiveGeometry(pGeoCube);
Kernel()->ViewPort()->Redraw();
Kernel()->Interface()->RefreshUI();
}
Mesh *BuildTrianglePlane()
{
Mesh *pMesh = Kernel()->Scene()->CreateMesh(Topology::typeTriangular);
MB_ASSERT(pMesh->VertexCount() == 0);
MB_ASSERT(pMesh->VertexNormalCount() == 0);
MB_ASSERT(pMesh->TCCount() == 0);
MB_ASSERT(pMesh->FaceCount() == 0);
pMesh->SetVertexCount(4);
pMesh->SetVertexPosition(0, Vector(-400, 0, 0));
pMesh->SetVertexPosition(1, Vector(-200, 0, 0));
pMesh->SetVertexPosition(2, Vector(-200, 200, 0));
pMesh->SetVertexPosition(3, Vector(-400, 200, 0));
MB_ASSERT(pMesh->VertexCount() == 4);
pMesh->SetFaceCount(2);
pMesh->SetTriangleIndex(0, 0, 0);
pMesh->SetTriangleIndex(0, 1, 1);
pMesh->SetTriangleIndex(0, 2, 2);
pMesh->SetTriangleIndex(1, 0, 0);
pMesh->SetTriangleIndex(1, 1, 2);
pMesh->SetTriangleIndex(1, 2, 3);
MB_ASSERT(pMesh->FaceCount() == 2);
pMesh->SetTCCount(6);
pMesh->SetVertexTC(0, TC(0.1f, 0.1f));
pMesh->SetVertexTC(1, TC(1.1f, 0.1f));
pMesh->SetVertexTC(2, TC(1.9f, 0.1f));
pMesh->SetVertexTC(3, TC(0.1f, 0.9f));
pMesh->SetVertexTC(4, TC(0.9f, 0.9f));
pMesh->SetVertexTC(5, TC(1.9f, 0.9f));
MB_ASSERT(pMesh->TCCount() == 6);
pMesh->SetTriangleTCI(0, 0, 0);
pMesh->SetTriangleTCI(0, 1, 4);
pMesh->SetTriangleTCI(0, 2, 3);
pMesh->SetTriangleTCI(1, 0, 1);
pMesh->SetTriangleTCI(1, 1, 2);
pMesh->SetTriangleTCI(1, 2, 5);
MB_ASSERT(pMesh->HasTC() == true);
pMesh->RecalculateAdjacency();
pMesh->RecalculateNormals();
return pMesh;
}
Mesh *BuildQuadCube()
{
Mesh *pMesh = Kernel()->Scene()->CreateMesh(Topology::typeQuadric);
pMesh->SetVertexCount(8);
pMesh->SetVertexPosition(0, Vector(100, 0, 300));
pMesh->SetVertexPosition(1, Vector(300, 0, 300));
pMesh->SetVertexPosition(2, Vector(300, 0, 100));
pMesh->SetVertexPosition(3, Vector(100, 0, 100));
pMesh->SetVertexPosition(4, Vector(100, 200, 300));
pMesh->SetVertexPosition(5, Vector(300, 200, 300));
pMesh->SetVertexPosition(6, Vector(300, 200, 100));
pMesh->SetVertexPosition(7, Vector(100, 200, 100));
pMesh->SetFaceCount(6);
unsigned int aFaceIndices[] = {
0, 1, 5, 4, 2, 3, 7, 6, 1, 2, 6, 5, 3, 0, 4, 7, 4, 5, 6, 7, 1, 0, 3, 2
};
unsigned int iFIdx = 0;
for (unsigned int iF = 0; iF < 6; ++iF)
{
pMesh->SetQuadIndex(iF, 0, aFaceIndices[iFIdx++]);
pMesh->SetQuadIndex(iF, 1, aFaceIndices[iFIdx++]);
pMesh->SetQuadIndex(iF, 2, aFaceIndices[iFIdx++]);
pMesh->SetQuadIndex(iF, 3, aFaceIndices[iFIdx++]);
}
pMesh->RecalculateAdjacency();
pMesh->RecalculateNormals();
MB_ASSERT(pMesh->HasTC() == false);
return pMesh;
}