void MeshDesc::load(Serializer& serializer) { std::string tmpStr; serializer.loadString(m_name); m_isSkin = serializer.loadBool(); unsigned int count = serializer.loadInt(); for (unsigned int i = 0; i < count; ++i) { serializer.loadString(tmpStr); m_materials.push_back(tmpStr); } count = serializer.loadInt(); for (unsigned int i = 0; i < count; ++i) { m_vertices.push_back(LitVertex()); m_vertices.back().load(serializer); } count = serializer.loadInt(); for (unsigned int i = 0; i < count; ++i) { m_faces.push_back(Face()); m_faces.back().load(serializer); } count = serializer.loadInt(); for (unsigned int i = 0; i < count; ++i) { BonesInfluenceDefinition& influencingBones = m_bonesInfluencingAttribute[i]; unsigned int namesCount = serializer.loadInt(); for (unsigned int j = 0; j < namesCount; ++j) { serializer.loadString(tmpStr); influencingBones.push_back(tmpStr); } } count = serializer.loadInt(); for (unsigned int i = 0; i < count; ++i) { m_skinBones.push_back(SkinBoneDefinition()); m_skinBones.back().load(serializer); } serializer.loadMatrix(m_localMtx); count = serializer.loadInt(); for (unsigned int i = 0; i < count; ++i) { MeshDesc* newChild = new MeshDesc(); m_children.push_back(newChild); newChild->load(serializer); newChild->m_parent = this; } }
void DebugGeometryBuilder::addCone( const FastFloat& baseSize, const Vector& start, const Vector& end, std::vector< LitVertex >& outVertices, std::vector< Face >& outFaces ) { // calculate additional vectors needed for cuboid construction Vector dir; dir.setSub( end, start ); dir.normalize(); Vector perpVec1, perpVec2; VectorUtil::calculatePerpendicularVector( dir, perpVec1 ); perpVec1.normalize(); perpVec2.setCross( dir, perpVec1 ); perpVec1.mul( baseSize ); perpVec2.mul( baseSize ); // calculate the vertices and outFaces uint firstVtxIdx = outVertices.size(); uint firstFaceIdx = outFaces.size(); for( uint i = 0; i < 5; ++i ) { outVertices.push_back( LitVertex() ); } for( uint i = 0; i < 6; ++i ) { outFaces.push_back( Face() ); } Vector tmpVec; { perpVec1.mul( Float_6 ); perpVec2.mul( Float_6 ); tmpVec.setAdd( start, perpVec1 ); tmpVec.sub( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 0].m_coords ); tmpVec.setSub( start, perpVec1 ); tmpVec.sub( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 1].m_coords ); tmpVec.setAdd( start, perpVec1 ); tmpVec.add( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 2].m_coords ); tmpVec.setSub( start, perpVec1 ); tmpVec.add( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 3].m_coords ); FastFloat tipSizeMultiplier; tipSizeMultiplier.setFromFloat( 12 ); tipSizeMultiplier.mul( baseSize ); tmpVec.setMulAdd( dir, tipSizeMultiplier, end ); tmpVec.store( outVertices[firstVtxIdx + 4].m_coords ); // cone bottom outFaces[firstFaceIdx + 0].idx[0] = firstVtxIdx + 0; outFaces[firstFaceIdx + 0].idx[1] = firstVtxIdx + 1; outFaces[firstFaceIdx + 0].idx[2] = firstVtxIdx + 2; outFaces[firstFaceIdx + 1].idx[0] = firstVtxIdx + 1; outFaces[firstFaceIdx + 1].idx[1] = firstVtxIdx + 3; outFaces[firstFaceIdx + 1].idx[2] = firstVtxIdx + 2; // cone top outFaces[firstFaceIdx + 2].idx[0] = firstVtxIdx + 0; outFaces[firstFaceIdx + 2].idx[1] = firstVtxIdx + 4; outFaces[firstFaceIdx + 2].idx[2] = firstVtxIdx + 1; outFaces[firstFaceIdx + 3].idx[0] = firstVtxIdx + 1; outFaces[firstFaceIdx + 3].idx[1] = firstVtxIdx + 4; outFaces[firstFaceIdx + 3].idx[2] = firstVtxIdx + 3; outFaces[firstFaceIdx + 4].idx[0] = firstVtxIdx + 3; outFaces[firstFaceIdx + 4].idx[1] = firstVtxIdx + 4; outFaces[firstFaceIdx + 4].idx[2] = firstVtxIdx + 2; outFaces[firstFaceIdx + 5].idx[0] = firstVtxIdx + 2; outFaces[firstFaceIdx + 5].idx[1] = firstVtxIdx + 4; outFaces[firstFaceIdx + 5].idx[2] = firstVtxIdx + 0; } }
// TriangleList reads a triangle list from file // iGraphic* TriangleList(const wchar_t* file, const Colour& colour) { iGraphic* graphic = nullptr; // construct filename with path int len = strlen(file) + strlen(ASSET_DIRECTORY) + 1; wchar_t* absFile = new wchar_t[len + 1]; ::nameWithDir(absFile, ASSET_DIRECTORY, file, len); // open file for input std::wifstream in(absFile, std::ios::in); delete [] absFile; float x, y, z, xc = 0, yc = 0, zc = 0; unsigned no = 0; // count the number of records while (in) { in >> x >> y >> z; xc += x; yc += y; zc += z; no++; } in.clear(); in.seekg(0); if (no) { VertexList<LitVertex>* vertexList = (VertexList<LitVertex>*)CreateVertexList<LitVertex>(TRIANGLE_LIST, no); xc /= no; yc /= no; zc /= no; for (unsigned i = 0; i < no; i++) { in >> x >> y >> z; vertexList->add(LitVertex(Vector(x - xc, y - yc, (z - zc) * MODEL_Z_AXIS), colour)); } graphic = vertexList; } return graphic; }
void DebugGeometryBuilder::addCuboid( const FastFloat& size, const Vector& start, const Vector& end, std::vector< LitVertex >& outVertices, std::vector< Face >& outFaces ) { // calculate additional vectors needed for cuboid construction Vector dir; dir.setSub( end, start ); dir.normalize(); Vector perpVec1, perpVec2; VectorUtil::calculatePerpendicularVector( dir, perpVec1 ); perpVec1.normalize(); perpVec2.setCross( dir, perpVec1 ); perpVec1.mul( size ); perpVec2.mul( size ); // draw the cuboid uint firstVtxIdx = outVertices.size(); uint firstFaceIdx = outFaces.size(); for( uint i = 0; i < 8; ++i ) { outVertices.push_back( LitVertex() ); } for( uint i = 0; i < 12; ++i ) { outFaces.push_back( Face() ); } Vector tmpVec; { // bottom face vertices tmpVec.setAdd( start, perpVec1 ); tmpVec.sub( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 0].m_coords ); tmpVec.setSub( start, perpVec1 ); tmpVec.sub( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 1].m_coords ); tmpVec.setAdd( start, perpVec1 ); tmpVec.add( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 2].m_coords ); tmpVec.setSub( start, perpVec1 ); tmpVec.add( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 3].m_coords ); // top face vertices tmpVec.setAdd( end, perpVec1 ); tmpVec.sub( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 4].m_coords ); tmpVec.setSub( end, perpVec1 ); tmpVec.sub( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 5].m_coords ); tmpVec.setAdd( end, perpVec1 ); tmpVec.add( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 6].m_coords ); tmpVec.setSub( end, perpVec1 ); tmpVec.add( perpVec2 ); tmpVec.store( outVertices[firstVtxIdx + 7].m_coords ); // add the lines: // bottom face outFaces[firstFaceIdx + 0].idx[0] = firstVtxIdx + 0; outFaces[firstFaceIdx + 0].idx[1] = firstVtxIdx + 1; outFaces[firstFaceIdx + 0].idx[2] = firstVtxIdx + 2; outFaces[firstFaceIdx + 1].idx[0] = firstVtxIdx + 1; outFaces[firstFaceIdx + 1].idx[1] = firstVtxIdx + 3; outFaces[firstFaceIdx + 1].idx[2] = firstVtxIdx + 2; // top face outFaces[firstFaceIdx + 2].idx[0] = firstVtxIdx + 5; outFaces[firstFaceIdx + 2].idx[1] = firstVtxIdx + 4; outFaces[firstFaceIdx + 2].idx[2] = firstVtxIdx + 7; outFaces[firstFaceIdx + 3].idx[0] = firstVtxIdx + 4; outFaces[firstFaceIdx + 3].idx[1] = firstVtxIdx + 6; outFaces[firstFaceIdx + 3].idx[2] = firstVtxIdx + 7; // right face outFaces[firstFaceIdx + 4].idx[0] = firstVtxIdx + 1; outFaces[firstFaceIdx + 4].idx[1] = firstVtxIdx + 5; outFaces[firstFaceIdx + 4].idx[2] = firstVtxIdx + 3; outFaces[firstFaceIdx + 5].idx[0] = firstVtxIdx + 5; outFaces[firstFaceIdx + 5].idx[1] = firstVtxIdx + 7; outFaces[firstFaceIdx + 5].idx[2] = firstVtxIdx + 3; // left face outFaces[firstFaceIdx + 6].idx[0] = firstVtxIdx + 0; outFaces[firstFaceIdx + 6].idx[1] = firstVtxIdx + 4; outFaces[firstFaceIdx + 6].idx[2] = firstVtxIdx + 1; outFaces[firstFaceIdx + 7].idx[0] = firstVtxIdx + 4; outFaces[firstFaceIdx + 7].idx[1] = firstVtxIdx + 5; outFaces[firstFaceIdx + 7].idx[2] = firstVtxIdx + 1; // front face outFaces[firstFaceIdx + 8].idx[0] = firstVtxIdx + 2; outFaces[firstFaceIdx + 8].idx[1] = firstVtxIdx + 6; outFaces[firstFaceIdx + 8].idx[2] = firstVtxIdx + 0; outFaces[firstFaceIdx + 9].idx[0] = firstVtxIdx + 6; outFaces[firstFaceIdx + 9].idx[1] = firstVtxIdx + 4; outFaces[firstFaceIdx + 9].idx[2] = firstVtxIdx + 0; // back face outFaces[firstFaceIdx + 10].idx[0] = firstVtxIdx + 3; outFaces[firstFaceIdx + 10].idx[1] = firstVtxIdx + 7; outFaces[firstFaceIdx + 10].idx[2] = firstVtxIdx + 2; outFaces[firstFaceIdx + 11].idx[0] = firstVtxIdx + 7; outFaces[firstFaceIdx + 11].idx[1] = firstVtxIdx + 6; outFaces[firstFaceIdx + 11].idx[2] = firstVtxIdx + 2; } }