int Object::createPlane( Material* mat , float w , float h , float* color , float xTile , float yTile , Vector3 const& normal , Vector3 const& alignDir , Vector3 const& offset , bool invYDir ) { Vector3 yLen = normal.cross( alignDir ); assert( yLen.length2() > 1e-4 ); yLen.normalize(); Vector3 xLen = yLen.cross( normal ); xLen *= 0.5f * w; yLen *= 0.5f * h; if ( invYDir ) yLen = -yLen; Vector3 n = normal; n.normalize(); int texLen = 2; VertexType type = ( color ) ? CFVT_XYZ_N_CF1 : CFVT_XYZ_N; //VertexType type = ( color ) ? CFVT_XYZ_CF1 : CFVT_XYZ; MeshBuilder builder = MeshBuilder( type | CFVF_TEX1( 2 ) ); if ( color ) builder.setColor( color ); builder.setNormal( n ); builder.reserveVexterBuffer( 4 ); builder.reserveIndexBuffer( 12 ); builder.setPosition( offset - xLen - yLen ); builder.setTexCoord( 0 , 0 , 0 ); builder.addVertex(); builder.setPosition( offset + xLen - yLen ); builder.setTexCoord( 0 ,xTile, 0 ); builder.addVertex(); builder.setPosition( offset + xLen + yLen ); builder.setTexCoord( 0 , xTile , yTile ); builder.addVertex(); builder.setPosition( offset - xLen + yLen ); builder.setTexCoord( 0 , 0 , yTile ); builder.addVertex(); builder.addQuad( 0 , 1 , 2 , 3 ); return builder.createIndexTrangle( this , mat ); }
//THIS MUST HAPPEN AFTER IMPORTING SKELETONS. //----------------------------------------------------------------------------------- static void ImportMesh(SceneImport* import, FbxMesh* mesh, MatrixStack4x4& matrixStack, std::map<int, FbxNode*>& nodeToJointIndex) { MeshBuilder builder = MeshBuilder(); ASSERT_OR_DIE(mesh->IsTriangleMesh(), "Was unable to load the mesh, it's not a triangle mesh!"); Matrix4x4 geoTransform = GetGeometricTransform(mesh); matrixStack.Push(geoTransform); int controlPointCount = mesh->GetControlPointsCount(); //Figure out our weighs for all verts before importing any of them std::vector<SkinWeight> skinWeights; if (HasSkinWeights(mesh)) { skinWeights.resize(controlPointCount); GetSkinWeights(import, skinWeights, mesh, nodeToJointIndex); } else { FbxNode* node = mesh->GetNode(); //Walk tree up till you reach the node associated with that joint. //Find the first parent node that has a joint associated with it //All vertices (fully weighted) //All Skin Weights = indices{jointINdex, 0, 0, 0 } weights{1.0f, 0.0f, 0.0f, 0.0f}; int jointIndex = Skeleton::INVALID_JOINT_INDEX; for (auto iter = nodeToJointIndex.begin(); iter != nodeToJointIndex.end(); ++iter) { if (iter->second == node) { jointIndex = iter->first; break; } } if (jointIndex == Skeleton::INVALID_JOINT_INDEX) { for (unsigned int i = 0; i < skinWeights.size(); ++i) { skinWeights[i].indices = Vector4Int::ZERO; skinWeights[i].weights = Vector4::UNIT_X; } } else { for (unsigned int i = 0; i < skinWeights.size(); ++i) { skinWeights[i].indices = Vector4Int(jointIndex, 0, 0, 0); skinWeights[i].weights = Vector4::UNIT_X; } } } builder.Begin(); { Matrix4x4 transform = matrixStack.GetTop(); int polyCount = mesh->GetPolygonCount(); for (int polyIndex = 0; polyIndex < polyCount; ++polyIndex) { int vertCount = mesh->GetPolygonSize(polyIndex); ASSERT_OR_DIE(vertCount == 3, "Vertex count was not 3"); for (int vertIndex = 0; vertIndex < vertCount; ++vertIndex) { ImportVertex(builder, transform, mesh, polyIndex, vertIndex, skinWeights); } } } builder.End(); FbxSurfaceMaterial* material = mesh->GetNode()->GetMaterial(0); builder.SetMaterialName(material->GetName()); matrixStack.Pop(); import->meshes.push_back(builder); }