TSubdivVert* TSubdivVert::findPoint() { TVector tFacePoint (0, 0, 0); DWord dwFaceCount; TVector tEdgePoint (0, 0, 0); DWord dwEdgeCount; TVector tPosition; if ( ptNextVert != NULL ) { return ptNextVert; } dwFaceCount = 0; for (const_face_iterator tIter1 = beginFace(); ( tIter1 != endFace() ) ;tIter1++) { dwFaceCount++; tFacePoint += (*tIter1)->findPoint()->tPosition; } dwEdgeCount = 0; for (const_edge_iterator tIter2 = beginEdge(); ( tIter2 != endEdge() ) ;tIter2++) { TSubdivVert* ptFirst = (*tIter2)->ptFirstVert; TSubdivVert* ptSecond = (*tIter2)->ptSecondVert; dwEdgeCount++; tEdgePoint += ptFirst->tPosition + ptSecond->tPosition; } tPosition = tFacePoint / (TScalar)dwFaceCount; tPosition += tEdgePoint / (TScalar)dwEdgeCount; tPosition += (TScalar)(dwEdgeCount - 3) * this->tPosition; tPosition /= (TScalar)dwEdgeCount; ptNextVert = new TSubdivVert("", tPosition); ptNextVert->bRemainingDepth = bRemainingDepth - 1; return ptNextVert; } /* findPoint() */
Mesh::Mesh(Object *parent, const char *fileName, Game::Surface *texture, int _flags): Object(parent), vertexCount(0), faceCount(0), currentFace(0), currentVertex(0), vertex(0), transformedVertex(0), face(0), flags(_flags) { transformation.makeIdentity(); TagFile file(fileName); int i; beginMesh(); while(1) switch(file.readTag()) { case 0: // list of vertices { vertexCount = file.getDataSize() / sizeof(SerializedVertex); SerializedVertex *v = new SerializedVertex[vertexCount]; vertex = new Vertex[vertexCount]; transformedVertex = new Vertex[vertexCount]; file.readData((unsigned char*)v, sizeof(SerializedVertex)*vertexCount); for(i=0; i<vertexCount; i++) { setTexCoord(v[i].u, v[i].v); // addVertex(Vector(v[i].x >> 1, v[i].y >> 1, v[i].z >> 1)); addVertex(Vector(v[i].x, v[i].y, v[i].z)); } delete[] v; } break; case 1: // list of faces { faceCount = file.getDataSize() / sizeof(SerializedTriangle); SerializedTriangle *t = new SerializedTriangle[faceCount]; face = new Face[faceCount]; file.readData((unsigned char*)t, sizeof(SerializedTriangle)*faceCount); for(i=0; i<faceCount; i++) { beginFace(3); setTexture(texture); addFaceVertex(t[i].a); addFaceVertex(t[i].b); addFaceVertex(t[i].c); endFace(); } delete[] t; } break; default: endMesh(); return; } }