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; }