コード例 #1
0
ファイル: MeshDesc.cpp プロジェクト: dabroz/Tamy
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;
   }
}
コード例 #2
0
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;
   }

}
コード例 #3
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;
}
コード例 #4
0
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;
   }
}