// ------------------------------------------------------------------------------------------------ // Construct a mesh with a specific shape (callback) aiMesh* StandardShapes::MakeMesh (unsigned int num, void (*GenerateFunc)( unsigned int,std::vector<aiVector3D>&)) { std::vector<aiVector3D> temp; (*GenerateFunc)(num,temp); return MakeMesh(temp,3); }
// ------------------------------------------------------------------------------------------------ // Construct a mesh with a specific shape (callback) aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)( std::vector<aiVector3D>&, bool)) { std::vector<aiVector3D> temp; unsigned num = (*GenerateFunc)(temp,true); return MakeMesh(temp,num); }
DX_Frame* dxExporter::MakeObjectFrame( int obj ) { DX_STRING nodeName, tempName; DX_Frame *dx_root = _sceneRoot; DX_Frame *dx_lst = _sceneRoot; DX_Frame *dx_frm; int num_layer = globals_.getObjectFuncs()->maxLayers( obj ); for (int n = 0; n < num_layer; n++) { if(globals_.getObjectFuncs()->layerExists( obj, n )) { LWW::MeshInfo mesh = globals_.layerMesh( obj, n ); dx_frm = new DX_Frame; dx_frm->idx = dx_lst ? dx_lst->idx+1 : 0; dx_frm->frameType = DX_FRAME_MESH; dx_frm->frameTransformMatrix = MakeFrameMatrix( NULL ); dx_frm->mesh = MakeMesh( mesh ); dx_frm->parent = NULL; dx_frm->child = NULL; dx_frm->sibling = NULL; dx_frm->next = NULL; DX_FileUniqName( tempName, mesh.filename() ); if(mesh.name()) _snprintf( nodeName, sizeof(nodeName), "%s%d_%s_%s", _options->framePrefix, dx_frm->idx, tempName, mesh.name() ); else _snprintf( nodeName, sizeof(nodeName), "%s%d_%s_Layer%d", _options->framePrefix, dx_frm->idx, tempName, n+1 ); DX_MakeNodeName( dx_frm->nodeName, nodeName ); if (dx_lst) { dx_lst->next = dx_frm; if (dx_lst != dx_root) { dx_lst->sibling = dx_frm; } } if (dx_root->child == NULL) { dx_root->child = dx_frm; dx_frm->parent = dx_root; } dx_lst = dx_frm; } } return dx_frm; }
DX_Frame* dxExporter::MakeItemFrame( LWW::Item item ) { DX_STRING nodeName, tempName; DX_Frame* dx_pvt = NULL; DX_Frame* dx_lst = _sceneRoot; while (dx_lst->next) { dx_lst = dx_lst->next; } DX_Frame* dx_frm = new DX_Frame; dx_frm->idx = dx_lst ? dx_lst->idx+1 : 0; dx_frm->item = item; dx_frm->mesh = NULL; dx_frm->parent = NULL; dx_frm->child = NULL; dx_frm->sibling = NULL; dx_frm->next = NULL; switch (item.type()) { case LWI_OBJECT: if (item.toObject().numPoints() > 0) dx_frm->frameType = DX_FRAME_MESH; else dx_frm->frameType = DX_FRAME_NULL; break; case LWI_LIGHT: dx_frm->frameType = DX_FRAME_LIGHT; break; case LWI_CAMERA: dx_frm->frameType = DX_FRAME_CAMERA; break; case LWI_BONE: dx_frm->frameType = DX_FRAME_BONE; break; } dx_frm->frameTransformMatrix = MakeFrameMatrix( dx_frm ); CalcFrameMatrix( dx_frm ); DX_FileBodyName( tempName, (char *)item.name() ); sprintf( nodeName, "%s%d_%s", _options->framePrefix, dx_frm->idx, tempName ); DX_MakeNodeName( dx_frm->nodeName, nodeName ); if (dx_lst) dx_lst->next = dx_frm; /* Extra Frame for PIVOT */ LWDVector pivotPosition; item.param(LWIP_PIVOT, 0, pivotPosition); if (!_options->useMatrixKey && USE_PIVOT(pivotPosition)) { dx_pvt = new DX_Frame; dx_pvt->idx = dx_frm->idx + 1; dx_pvt->item = item; dx_pvt->frameType = DX_FRAME_PIVOT; dx_pvt->frameTransformMatrix = MakeFrameMatrix( dx_pvt ); dx_pvt->mesh = NULL; dx_pvt->parent = dx_frm; dx_pvt->child = NULL; dx_pvt->sibling = NULL; dx_pvt->next = NULL; CalcFrameMatrix( dx_pvt ); DX_FileBodyName( tempName, (char *)item.name() ); sprintf( nodeName, "%s%d_%s_Pivot", _options->framePrefix, dx_pvt->idx, tempName ); DX_MakeNodeName( dx_pvt->nodeName, nodeName ); dx_frm->mesh = NULL; dx_frm->sibling = NULL; dx_frm->next = dx_pvt; dx_frm->child = dx_pvt; } if (dx_frm->frameType == DX_FRAME_MESH) { if (dx_pvt) { dx_pvt->mesh = MakeMesh( item.toObject().meshInfo( TRUE ) ); } else { dx_frm->mesh = MakeMesh( item.toObject().meshInfo( TRUE ) ); } } return dx_frm; }
MeshRoot * Mesh::Manager::MakeGlobe( F32 radius, U32 bands, Bitmap * texture) { U32 i, j, LastIndex, BandsX2, LastBandStartIndex; U32 TopBandStartIndex, BottomBandStartIndex, zvert; U32 dowrap = 1; // U32 dowrap = 0; Vector BaseVec, BandVec, WVec, TempVec; F32 zmin, c1, c2, c0, stickwid, r1, r2; F32 *rads; BandsX2 = bands*2; Quaternion att; Matrix matY, matZ; matY.ClearData(); matZ.ClearData(); att.Set( PI / bands, Matrix::I.Up()); matY.Set( att); att.Set( PI / bands, Matrix::I.Front()); matZ.Set( att); U32 vertC = 2 + (BandsX2 + 1) * (bands - 1); U32 faceC = BandsX2 * bands + BandsX2 * (bands - 2); rads = new F32[bands + 1]; ASSERT( rads); MeshRoot * root = MakeMesh( vertC, vertC, vertC, faceC, texture); Vector * vects = root->vertices.data; Vector * norms = root->normals.data; UVPair * uvs = root->uvs.data; FaceObj * faces = root->faces.data; zmin = 32000.0f; // point at the top BaseVec.x = 0.0f; BaseVec.y = radius; BaseVec.z = 0.0f; U32 vertCount = 0, faceCount = 0; vects[vertCount] = BaseVec; norms[vertCount] = norms[vertCount]; norms[vertCount].Normalize(); vertCount++; BandVec = BaseVec; // create the vertices in each band in turn for (i = 1; i < bands; i++) { // rotate around Z to the next band's latitude matZ.Transform( TempVec, BandVec); WVec = BandVec = TempVec; rads[i] = (F32) sqrt( WVec.x * WVec.x + WVec.z * WVec.z); // do the vertices in this band U32 startVert = vertCount; for (j = 0; j < BandsX2; j++) { WVec = TempVec; vects[vertCount] = WVec; norms[vertCount] = vects[vertCount]; norms[vertCount].Normalize(); vertCount++; if (WVec.z < zmin) { zmin = WVec.z; zvert = vertCount; } // rotate around Y to the next vertex's longitude matY.Transform( TempVec, WVec); } // duplicate band start vert at the end (for texture wrapping) vects[vertCount] = vects[startVert]; norms[vertCount] = vects[vertCount]; norms[vertCount].Normalize(); vertCount++; } // point at the bottom BaseVec.y = -radius; vects[vertCount] = BaseVec; norms[vertCount] = vects[vertCount]; norms[vertCount].Normalize(); LastIndex = vertCount; vertCount++; r1 = 0.0f; r2 = 1.0f / (F32) bands; // top band stickwid = 100 * rads[1] / radius; stickwid += (100 - stickwid)/2; for (i = 0; i < BandsX2; i++, faceCount++) { faces[faceCount].verts[0] = 0; // faces[faceCount].verts[1] = ((i + 1) % BandsX2) + 1; faces[faceCount].verts[1] = (WORD) (((i + 1) % (BandsX2 + 1)) + 1); faces[faceCount].verts[2] = (WORD) (i + 1); faces[faceCount].norms[0] = faces[faceCount].verts[0]; faces[faceCount].norms[1] = faces[faceCount].verts[1]; faces[faceCount].norms[2] = faces[faceCount].verts[2]; faces[faceCount].uvs[0] = faces[faceCount].verts[0]; faces[faceCount].uvs[1] = faces[faceCount].verts[1]; faces[faceCount].uvs[2] = faces[faceCount].verts[2]; faces[faceCount].buckyIndex = 0; if (dowrap == 1) { c1 = (F32) i / (F32) BandsX2; c2 = (F32) (i + 1) / (F32) BandsX2; c0 = (c1 + 0.5f) / (F32) BandsX2; uvs[faces[faceCount].verts[0]].u = c0; uvs[faces[faceCount].verts[0]].v = r1; uvs[faces[faceCount].verts[1]].u = c1; uvs[faces[faceCount].verts[1]].v = r2; uvs[faces[faceCount].verts[2]].u = c2; uvs[faces[faceCount].verts[2]].v = r2; } else { uvs[faces[faceCount].verts[0]].u = 0.5f; uvs[faces[faceCount].verts[0]].v = 0.0f; uvs[faces[faceCount].verts[1]].u = 0.0f; uvs[faces[faceCount].verts[1]].v = 1.0f; uvs[faces[faceCount].verts[2]].u = 1.0f; uvs[faces[faceCount].verts[2]].v = 1.0f; } } // middle bands for (j = 0; j < bands - 2; j++) { // TopBandStartIndex = j * BandsX2 + 1; // BottomBandStartIndex = (j + 1) * BandsX2 + 1; TopBandStartIndex = j * (BandsX2 + 1) + 1; BottomBandStartIndex = (j + 1) * (BandsX2 + 1) + 1; r1 = (F32) (j + 1) / (F32) bands; r2 = (F32) (j + 2) / (F32) bands; for (i = 0; i < BandsX2; i++, faceCount += 2) { faces[faceCount].verts[0] = (WORD) (i + TopBandStartIndex); // faces[faceCount].verts[1] = ((i + 1) % BandsX2) + TopBandStartIndex; // faces[faceCount].verts[2] = ((i + 1) % BandsX2) + BottomBandStartIndex; faces[faceCount].verts[1] = (WORD) (((i + 1) % (BandsX2 + 1)) + TopBandStartIndex); faces[faceCount].verts[2] = (WORD) (((i + 1) % (BandsX2 + 1)) + BottomBandStartIndex); faces[faceCount].norms[0] = faces[faceCount].verts[0]; faces[faceCount].norms[1] = faces[faceCount].verts[1]; faces[faceCount].norms[2] = faces[faceCount].verts[2]; faces[faceCount].uvs[0] = faces[faceCount].verts[0]; faces[faceCount].uvs[1] = faces[faceCount].verts[1]; faces[faceCount].uvs[2] = faces[faceCount].verts[2]; faces[faceCount].buckyIndex = 0; // faces[faceCount+1].verts[0] = ((i + 1) % BandsX2) + BottomBandStartIndex; faces[faceCount+1].verts[0] = (WORD) (((i + 1) % (BandsX2 + 1)) + BottomBandStartIndex); faces[faceCount+1].verts[1] = (WORD) (i + BottomBandStartIndex); faces[faceCount+1].verts[2] = (WORD) (i + TopBandStartIndex); faces[faceCount+1].norms[0] = faces[faceCount+1].verts[0]; faces[faceCount+1].norms[1] = faces[faceCount+1].verts[1]; faces[faceCount+1].norms[2] = faces[faceCount+1].verts[2]; faces[faceCount+1].uvs[0] = faces[faceCount+1].verts[0]; faces[faceCount+1].uvs[1] = faces[faceCount+1].verts[1]; faces[faceCount+1].uvs[2] = faces[faceCount+1].verts[2]; faces[faceCount+1].buckyIndex = 0; if (dowrap == 1) { c1 = (F32) i / (F32) BandsX2; c2 = (F32) (i + 1) / (F32) BandsX2; uvs[faces[faceCount].verts[0]].u = c1; uvs[faces[faceCount].verts[0]].v = r1; uvs[faces[faceCount].verts[1]].u = c2; uvs[faces[faceCount].verts[1]].v = r1; uvs[faces[faceCount].verts[2]].u = c2; uvs[faces[faceCount].verts[2]].v = r2; uvs[faces[faceCount+1].verts[0]].u = c2; uvs[faces[faceCount+1].verts[0]].v = r2; uvs[faces[faceCount+1].verts[1]].u = c1; uvs[faces[faceCount+1].verts[1]].v = r2; uvs[faces[faceCount+1].verts[2]].u = c1; uvs[faces[faceCount+1].verts[2]].v = r1; } else { uvs[faces[faceCount].verts[0]].u = 1.0f; uvs[faces[faceCount].verts[0]].v = 0.0f; uvs[faces[faceCount].verts[1]].u = 0.0f; uvs[faces[faceCount].verts[1]].v = 0.0f; uvs[faces[faceCount].verts[2]].u = 0.0f; uvs[faces[faceCount].verts[2]].v = 1.0f; uvs[faces[faceCount+1].verts[0]].u = 0.0f; uvs[faces[faceCount+1].verts[0]].v = 1.0f; uvs[faces[faceCount+1].verts[1]].u = 1.0f; uvs[faces[faceCount+1].verts[1]].v = 1.0f; uvs[faces[faceCount+1].verts[2]].u = 1.0f; uvs[faces[faceCount+1].verts[2]].v = 0.0f; } } } // bottom band // LastBandStartIndex = BandsX2 * (bands - 2) + 1; LastBandStartIndex = (BandsX2 + 1) * (bands - 2) + 1; r1 = (F32) (bands - 1) / (F32) bands; r2 = 1.0f; for (i = 0; i < BandsX2; i++, faceCount++) { faces[faceCount].verts[0] = (WORD) LastIndex; faces[faceCount].verts[1] = (WORD) (LastBandStartIndex + i); // faces[faceCount].verts[2] = LastBandStartIndex + ((i + 1) % BandsX2); faces[faceCount].verts[2] = (WORD) (LastBandStartIndex + ((i + 1) % (BandsX2 + 1))); faces[faceCount].norms[0] = faces[faceCount].verts[0]; faces[faceCount].norms[1] = faces[faceCount].verts[1]; faces[faceCount].norms[2] = faces[faceCount].verts[2]; faces[faceCount].uvs[0] = faces[faceCount].verts[0]; faces[faceCount].uvs[1] = faces[faceCount].verts[1]; faces[faceCount].uvs[2] = faces[faceCount].verts[2]; faces[faceCount].buckyIndex = 0; if (dowrap == 1) { c1 = (F32) i / (F32) BandsX2; c2 = (F32) (i + 1) / (F32) BandsX2; c0 = c1 - 0.5f / (F32) BandsX2; uvs[faces[faceCount].verts[0]].u = c0; uvs[faces[faceCount].verts[0]].v = r2; uvs[faces[faceCount].verts[1]].u = c1; uvs[faces[faceCount].verts[1]].v = r1; uvs[faces[faceCount].verts[2]].u = c2; uvs[faces[faceCount].verts[2]].v = r1; } else { uvs[faces[faceCount].verts[0]].u = 0.5f; uvs[faces[faceCount].verts[0]].v = 0.0f; uvs[faces[faceCount].verts[1]].u = 0.0f; uvs[faces[faceCount].verts[1]].v = 1.0f; uvs[faces[faceCount].verts[2]].u = 1.0f; uvs[faces[faceCount].verts[2]].v = 1.0f; } } delete [] rads; root->Setup(); // setup up face plane equations // root->SetupPlanes(); if (!SetupRoot(*root, root->GetName())) { delete root; root = NULL; } return root; }