示例#1
0
                public Primitive(Mesh _Owner, FBX.Scene.Nodes.Mesh.Primitive _Primitive)
                {
                    m_Owner = _Owner;

                    m_MaterialID = (ushort)_Primitive.MaterialParms.ID;

                    m_Faces    = new Face[_Primitive.FacesCount];
                    m_Vertices = new Vertex[_Primitive.VerticesCount];

                    // Retrieve streams
                    FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE[] Usages =
                    {
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.POSITION,
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.NORMAL,
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TANGENT,
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.BITANGENT,
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TEXCOORDS,
                    };
                    FBX.Scene.Nodes.Mesh.Primitive.VertexStream[][] Streams = new FBX.Scene.Nodes.Mesh.Primitive.VertexStream[Usages.Length][];
                    for (int UsageIndex = 0; UsageIndex < Usages.Length; UsageIndex++)
                    {
                        Streams[UsageIndex] = _Primitive.FindStreamsByUsage(Usages[UsageIndex]);
                        if (Streams[UsageIndex].Length == 0)
                        {
                            throw new Exception("No stream for usage " + Usages[UsageIndex] + "! Can't complete target vertex format!");
                        }
                    }

                    // Build local space bounding box
                    float3 Temp = new float3();

                    WMath.Vector[] VertexPositions = Streams[0][0].Content as WMath.Vector[];
                    foreach (WMath.Vector VertexPosition in VertexPositions)
                    {
                        Temp.FromVector3(VertexPosition);
                        m_BBoxMin.Min(Temp);
                        m_BBoxMax.Max(Temp);
                    }

                    // Build faces
                    int FaceIndex = 0;

                    foreach (FBX.Scene.Nodes.Mesh.Primitive.Face F in _Primitive.Faces)
                    {
                        m_Faces[FaceIndex].V0 = F.V0;
                        m_Faces[FaceIndex].V1 = F.V1;
                        m_Faces[FaceIndex].V2 = F.V2;
                        FaceIndex++;
                    }

                    // Build vertices
                    for (int VertexIndex = 0; VertexIndex < m_Vertices.Length; VertexIndex++)
                    {
                        for (int UsageIndex = 0; UsageIndex < Usages.Length; UsageIndex++)
                        {
                            FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE Usage = Usages[UsageIndex];
                            switch (Usage)
                            {
                            case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.POSITION:
                            {
                                float3[] Stream = Streams[UsageIndex][0].Content as float3[];
                                m_Vertices[VertexIndex].P = Stream[VertexIndex];
                                break;
                            }

                            case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.NORMAL:
                            {
                                float3[] Stream = Streams[UsageIndex][0].Content as float3[];
                                m_Vertices[VertexIndex].N = Stream[VertexIndex];
                                break;
                            }

                            case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TANGENT:
                            {
                                float3[] Stream = Streams[UsageIndex][0].Content as float3[];
                                m_Vertices[VertexIndex].G = Stream[VertexIndex];
                                break;
                            }

                            case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.BITANGENT:
                            {
                                float3[] Stream = Streams[UsageIndex][0].Content as float3[];
                                m_Vertices[VertexIndex].B = Stream[VertexIndex];
                                break;
                            }

                            case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TEXCOORDS:
                            {
                                float2[] Stream = Streams[UsageIndex][0].Content as float2[];
                                m_Vertices[VertexIndex].T = Stream[VertexIndex];
                                break;
                            }
                            }
                        }
                    }
                }
示例#2
0
文件: GCX.cs 项目: Patapom/GodComplex
                public Primitive( Mesh _Owner, FBX.Scene.Nodes.Mesh.Primitive _Primitive )
                {
                    m_Owner = _Owner;

                    m_MaterialID = (ushort) _Primitive.MaterialParms.ID;

                    m_Faces = new Face[_Primitive.FacesCount];
                    m_Vertices = new Vertex[_Primitive.VerticesCount];

                    // Retrieve streams
                    FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE[]	Usages = {
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.POSITION,
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.NORMAL,
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TANGENT,
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.BITANGENT,
                        FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TEXCOORDS,
                    };
                    FBX.Scene.Nodes.Mesh.Primitive.VertexStream[][]		Streams = new FBX.Scene.Nodes.Mesh.Primitive.VertexStream[Usages.Length][];
                    for ( int UsageIndex=0; UsageIndex < Usages.Length; UsageIndex++ )
                    {
                        Streams[UsageIndex] = _Primitive.FindStreamsByUsage( Usages[UsageIndex] );
                        if ( Streams[UsageIndex].Length == 0 )
                            throw new Exception( "No stream for usage " + Usages[UsageIndex] + "! Can't complete target vertex format!" );
                    }

                    // Build local space bounding box
                    float3	Temp = new float3();
                    WMath.Vector[]	VertexPositions = Streams[0][0].Content as WMath.Vector[];
                    foreach ( WMath.Vector VertexPosition in VertexPositions ) {
                        Temp.FromVector3( VertexPosition );
                        m_BBoxMin.Min( Temp );
                        m_BBoxMax.Max( Temp );
                    }

                    // Build faces
                    int	FaceIndex = 0;
                    foreach ( FBX.Scene.Nodes.Mesh.Primitive.Face F in _Primitive.Faces )
                    {
                        m_Faces[FaceIndex].V0 = F.V0;
                        m_Faces[FaceIndex].V1 = F.V1;
                        m_Faces[FaceIndex].V2 = F.V2;
                        FaceIndex++;
                    }

                    // Build vertices
                    for ( int VertexIndex=0; VertexIndex < m_Vertices.Length; VertexIndex++ )
                    {
                        for ( int UsageIndex=0; UsageIndex < Usages.Length; UsageIndex++ )
                        {
                            FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE	Usage = Usages[UsageIndex];
                            switch ( Usage )
                            {
                                case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.POSITION:
                                {
                                    float3[]	Stream = Streams[UsageIndex][0].Content as float3[];
                                    m_Vertices[VertexIndex].P = Stream[VertexIndex];
                                    break;
                                }
                                case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.NORMAL:
                                {
                                    float3[]	Stream = Streams[UsageIndex][0].Content as float3[];
                                    m_Vertices[VertexIndex].N = Stream[VertexIndex];
                                    break;
                                }
                                case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TANGENT:
                                {
                                    float3[]	Stream = Streams[UsageIndex][0].Content as float3[];
                                    m_Vertices[VertexIndex].G = Stream[VertexIndex];
                                    break;
                                }
                                case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.BITANGENT:
                                {
                                    float3[]	Stream = Streams[UsageIndex][0].Content as float3[];
                                    m_Vertices[VertexIndex].B = Stream[VertexIndex];
                                    break;
                                }
                                case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TEXCOORDS:
                                {
                                    float2[]	Stream = Streams[UsageIndex][0].Content as float2[];
                                    m_Vertices[VertexIndex].T = Stream[VertexIndex];
                                    break;
                                }
                            }
                        }
                    }
                }