Beispiel #1
0
            public Track(EndianBinaryReader er, int Id)
            {
                er.BaseStream.Position = TrackHeaderAddress + Id * 0x30;
                Header = new TrackHeader(er);
                er.BaseStream.Position = Header.DLOffset;
                DL = MIO0.Decompress(er.ReadBytes((int)(Header.DLEnd - Header.DLOffset)));
                er.BaseStream.Position = Header.TrackDataOffset;
                byte[] VtxData = MIO0.Decompress(er.ReadBytes((int)(Header.VertexDataMIO0Length & 0xFFFFFF)));
                VertexData = new VertexDataEntry[Header.VertexDataNrEntries];
                for (int i = 0; i < Header.VertexDataNrEntries; i++)
                {
                    VertexData[i] = new VertexDataEntry(VtxData, i * 0xE);
                }
                LevelScript            = er.ReadBytes((int)(Header.TrackDataEnd - Header.TrackDataOffset - (Header.VertexDataMIO0Length & 0xFFFFFF)));
                er.BaseStream.Position = Header.TexTableOffset;
                List <TexTableEntry> texes = new List <TexTableEntry>();

                while (true)
                {
                    var v = new TexTableEntry(er);
                    if (v.GPUTexAddress == 0)
                    {
                        break;
                    }
                    texes.Add(v);
                }
                TexTable = texes.ToArray();
            }
        internal VertexDataEntry ExtractData(VertexElementSemantic semantic,
                                             int vertexCount, InputSource source,
                                             List <PointComponents> indexSets, int accessIndex)
        {
            float[ , ] fdata = null;
            uint[ , ] idata  = null;
            switch (semantic)
            {
            case VertexElementSemantic.Diffuse:
                idata = new uint[vertexCount, 1];
                for (int i = 0; i < vertexCount; ++i)
                {
                    PointComponents components = indexSets[i];
                    int             inputIndex = components[accessIndex];
                    ColorEx         color      = ColorEx.Black;
                    color.r = (float)source.Accessor.GetParam("R", inputIndex);
                    color.g = (float)source.Accessor.GetParam("G", inputIndex);
                    color.b = (float)source.Accessor.GetParam("B", inputIndex);
                    if (source.Accessor.ContainsParam("A"))
                    {
                        color.a = (float)source.Accessor.GetParam("A", inputIndex);
                    }
                    idata[i, 0] = Root.Instance.RenderSystem.ConvertColor(color);
                }
                break;

            case VertexElementSemantic.TexCoords:
                fdata = new float[vertexCount, 2];
                for (int i = 0; i < vertexCount; ++i)
                {
                    PointComponents components = indexSets[i];
                    int             inputIndex = components[accessIndex];
                    // S,T or U,V ?
                    if (source.Accessor.ContainsParam("S"))
                    {
                        fdata[i, 0] = (float)source.Accessor.GetParam("S", inputIndex);
                        fdata[i, 1] = 1.0f - (float)source.Accessor.GetParam("T", inputIndex);
                    }
                    else if (source.Accessor.ContainsParam("U"))
                    {
                        fdata[i, 0] = (float)source.Accessor.GetParam("U", inputIndex);
                        fdata[i, 1] = 1.0f - (float)source.Accessor.GetParam("V", inputIndex);
                    }
                    else
                    {
                        Debug.Assert(false, "Invalid param names");
                    }
                }
                break;

            case VertexElementSemantic.Position:
            case VertexElementSemantic.Normal:
            case VertexElementSemantic.Tangent:
            case VertexElementSemantic.Binormal:
                fdata = new float[vertexCount, 3];
                for (int i = 0; i < vertexCount; ++i)
                {
                    PointComponents components = indexSets[i];
                    int             inputIndex = components[accessIndex];
                    Vector3         tmp        = Vector3.Zero;
                    tmp.x = (float)source.Accessor.GetParam("X", inputIndex);
                    tmp.y = (float)source.Accessor.GetParam("Y", inputIndex);
                    tmp.z = (float)source.Accessor.GetParam("Z", inputIndex);
                    for (int j = 0; j < 3; ++j)
                    {
                        fdata[i, j] = tmp[j];
                    }
                }
                break;

            default:
                m_Log.InfoFormat("Unknown semantic: {0}", semantic);
                return(null);
            }
            if (fdata == null && idata == null)
            {
                return(null);
            }

            VertexDataEntry vde = new VertexDataEntry();

            vde.semantic = semantic;
            vde.fdata    = fdata;
            vde.idata    = idata;
            return(vde);
        }
        internal VertexDataEntry ExtractData( VertexElementSemantic semantic,
                                            int vertexCount, InputSource source,
                                            List<PointComponents> indexSets, int accessIndex )
        {
            float[ , ] fdata = null;
            uint[ , ] idata = null;
            switch( semantic )
            {
            case VertexElementSemantic.Diffuse:
                idata = new uint[ vertexCount, 1 ];
                for( int i = 0; i < vertexCount; ++i )
                {
                    PointComponents components = indexSets[ i ];
                    int inputIndex = components[ accessIndex ];
                    ColorEx color = ColorEx.Black;
                    color.r = (float) source.Accessor.GetParam( "R", inputIndex );
                    color.g = (float) source.Accessor.GetParam( "G", inputIndex );
                    color.b = (float) source.Accessor.GetParam( "B", inputIndex );
                    if( source.Accessor.ContainsParam( "A" ) )
                        color.a = (float) source.Accessor.GetParam( "A", inputIndex );
                    idata[ i, 0 ] = Root.Instance.RenderSystem.ConvertColor( color );
                }
                break;
            case VertexElementSemantic.TexCoords:
                fdata = new float[ vertexCount, 2 ];
                for( int i = 0; i < vertexCount; ++i )
                {
                    PointComponents components = indexSets[ i ];
                    int inputIndex = components[ accessIndex ];
                    // S,T or U,V ?
                    if( source.Accessor.ContainsParam( "S" ) )
                    {
                        fdata[ i, 0 ] = (float) source.Accessor.GetParam( "S", inputIndex );
                        fdata[ i, 1 ] = 1.0f - (float) source.Accessor.GetParam( "T", inputIndex );
                    }
                    else if( source.Accessor.ContainsParam( "U" ) )
                    {
                        fdata[ i, 0 ] = (float) source.Accessor.GetParam( "U", inputIndex );
                        fdata[ i, 1 ] = 1.0f - (float) source.Accessor.GetParam( "V", inputIndex );
                    }
                    else
                    {
                        Debug.Assert( false, "Invalid param names" );
                    }
                }
                break;
            case VertexElementSemantic.Position:
            case VertexElementSemantic.Normal:
            case VertexElementSemantic.Tangent:
            case VertexElementSemantic.Binormal:
                fdata = new float[ vertexCount, 3 ];
                for( int i = 0; i < vertexCount; ++i )
                {
                    PointComponents components = indexSets[ i ];
                    int inputIndex = components[ accessIndex ];
                    Vector3 tmp = Vector3.Zero;
                    tmp.x = (float) source.Accessor.GetParam( "X", inputIndex );
                    tmp.y = (float) source.Accessor.GetParam( "Y", inputIndex );
                    tmp.z = (float) source.Accessor.GetParam( "Z", inputIndex );
                    for( int j = 0; j < 3; ++j )
                        fdata[ i, j ] = tmp[ j ];
                }
                break;
            default:
                m_Log.InfoFormat( "Unknown semantic: {0}", semantic );
                return null;
            }
            if( fdata == null && idata == null )
                return null;

            VertexDataEntry vde = new VertexDataEntry();
            vde.semantic = semantic;
            vde.fdata = fdata;
            vde.idata = idata;
            return vde;
        }