Beispiel #1
0
	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 );
	}
Beispiel #2
0
    //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);
    }