bool TSShapeLoader::processNode(AppNode* node) { // Detect bounds node if ( node->isBounds() ) { if ( boundsNode ) { Con::warnf( "More than one bounds node found" ); return false; } boundsNode = node; // Process bounds geometry MatrixF boundsMat(boundsNode->getNodeTransform(DefaultTime)); boundsMat.inverse(); zapScale(boundsMat); for (S32 iMesh = 0; iMesh < boundsNode->getNumMesh(); iMesh++) { AppMesh* mesh = boundsNode->getMesh(iMesh); MatrixF transform = mesh->getMeshTransform(DefaultTime); transform.mulL(boundsMat); mesh->lockMesh(DefaultTime, transform); } return true; } // Detect sequence markers if ( node->isSequence() ) { //appSequences.push_back(new AppSequence(node)); return false; } // Add this node to the subshape (create one if needed) if ( subshapes.size() == 0 ) subshapes.push_back( new TSShapeLoader::Subshape ); subshapes.last()->branches.push_back( node ); return true; }
void TSShapeLoader::generateFrame(TSShape::Object& obj, F32 t, bool addFrame, bool addMatFrame) { for (int iMesh = 0; iMesh < obj.numMeshes; iMesh++) { AppMesh* appMesh = appMeshes[obj.startMeshIndex + iMesh]; U32 oldNumPoints = appMesh->points.size(); U32 oldNumUvs = appMesh->uvs.size(); // Get the mesh geometry at time, 't' // Geometry verts, normals and tverts can be animated (different set for // each frame), but the TSDrawPrimitives stay the same, so the way lockMesh // works is that it will only generate the primitives once, then after that // will just append verts, normals and tverts each time it is called. appMesh->lockMesh(t, appMesh->objectOffset); // Calculate vertex normals if required if (appMesh->normals.size() != appMesh->points.size()) appMesh->computeNormals(); // If this is the first call, set the number of points per frame if (appMesh->numFrames == 0) { appMesh->vertsPerFrame = appMesh->points.size(); } else { // Check frame topology => ie. that the right number of points, normals // and tverts was added if ((appMesh->points.size() - oldNumPoints) != appMesh->vertsPerFrame) { Con::warnf("Wrong number of points (%d) added at time=%f (expected %d)", appMesh->points.size() - oldNumPoints, t, appMesh->vertsPerFrame); addFrame = false; } if ((appMesh->normals.size() - oldNumPoints) != appMesh->vertsPerFrame) { Con::warnf("Wrong number of normals (%d) added at time=%f (expected %d)", appMesh->normals.size() - oldNumPoints, t, appMesh->vertsPerFrame); addFrame = false; } if ((appMesh->uvs.size() - oldNumUvs) != appMesh->vertsPerFrame) { Con::warnf("Wrong number of tverts (%d) added at time=%f (expected %d)", appMesh->uvs.size() - oldNumUvs, t, appMesh->vertsPerFrame); addMatFrame = false; } } // Because lockMesh adds points, normals AND tverts each call, if we didn't // actually want another frame or matFrame, we need to remove them afterwards. // In the common case (we DO want the frame), we can do nothing => the // points/normals/tverts are already in place! if (addFrame) { appMesh->numFrames++; } else { appMesh->points.setSize(oldNumPoints); appMesh->normals.setSize(oldNumPoints); } if (addMatFrame) { appMesh->numMatFrames++; } else { appMesh->uvs.setSize(oldNumPoints); } } }