protected override int OnCalculateSize(bool force) { _texIndices = 0; int size = 12; foreach (SRT0TextureNode n in Children) { _texIndices += 1 << n._textureIndex; size += 4 + n.CalculateSize(true); } return(size); }
protected override bool OnInitialize() { if ((_name == null) && (Header->_stringOffset != 0)) { _name = Header->ResourceString; } _texIndices = (TextureIndices)(int)Header->_textureIndices; _unk1 = Header->_unk1; for (int i = 0; i < 8; i++) { _textureIndices[i] = ((Header->_textureIndices >> i) & 1); } return((int)_texIndices > 0); }
/// <inheritdoc /> protected override Task DeserializeAsync(Stream stream) { using (var reader = new BinaryReader(stream, FileEncoding.Default, true)) { Id = reader.ReadUInt64(); Type = reader.ReadStruct <ModelType>(); LoadMesh(reader, out Vector3[] vertices, out ushort[] vertexIndices, out ushort[] textureIndices, out byte[] materialIndices); Vertices = vertices; VertexIndices = vertexIndices; TextureIndices = new[] { new UvMap { Channel = PrimaryChannelIndex, TextureIndices = textureIndices } }; MaterialIndices = materialIndices; TextureCoordinates = ReadTextureCoordinates(reader).ToArray(); // Loop any remaining data. First 4 bytes per segment are a descriptor. while (stream.Position < stream.Length) { Enum.TryParse(reader.ReadString(4), true, out MeshDataDescriptor descriptor); switch (descriptor) { case MeshDataDescriptor.TMAP: TextureIndices = TextureIndices.Concat(ReadUvMaps(reader, VertexIndices.Count)).ToArray(); break; case MeshDataDescriptor.NORM: Normals = ReadNormals(reader, Vertices.Count).ToArray(); break; default: throw new SilentHunterParserException($"Unexpected descriptor '{descriptor}'."); } } } return(Task.CompletedTask); }
public override int OnCalculateSize(bool force) { _texIndices = 0; int size = 12; foreach (SRT0TextureNode n in Children) { if (n._indirect) { _indIndices += 1 << n._textureIndex; } else { _texIndices += 1 << n._textureIndex; } size += 4 + n.CalculateSize(true); } return(size); }
/// <inheritdoc /> protected override Task SerializeAsync(Stream stream) { using (var writer = new BinaryWriter(stream, FileEncoding.Default, true)) { writer.Write(Id); writer.WriteStruct(Type); UvMap uvMap = TextureIndices.Any(ti => ti.Channel == PrimaryChannelIndex) ? TextureIndices.First(ti => ti.Channel == PrimaryChannelIndex) : TextureIndices.First(); WriteMesh(writer, Vertices, VertexIndices, uvMap.TextureIndices ?? new ushort[0], MaterialIndices); WriteTextureCoordinates(writer, TextureCoordinates); WriteUvMaps(writer, TextureIndices); WriteNormals(writer, Normals); } return(Task.CompletedTask); }
public override bool OnInitialize() { if ((_name == null) && (Header->_stringOffset != 0)) { _name = Header->ResourceString; } _texIndices = (TextureIndices)(int)Header->_textureIndices; _indIndices = (IndirectTextureIndices)(int)Header->_indirectIndices; for (int i = 0; i < 8; i++) { _usageIndices[i] = ((Header->_textureIndices >> i) & 1); } for (int i = 0; i < 3; i++) { _usageIndices[i + 8] = ((Header->_indirectIndices >> i) & 1); } return((int)_texIndices > 0 || (int)_indIndices > 0); }
public override int OnCalculateSize(bool force) { _texIndices = 0; _indIndices = 0; _dataLength = 0; _entryLength = 12; foreach (SRT0TextureNode n in Children) { if (n._indirect) { _indIndices |= (IndirectTextureIndices)(1 << n._textureIndex); } else { _texIndices |= (TextureIndices)(1 << n._textureIndex); } n.CalculateSize(true); _entryLength += 4 + n._entryLength; _dataLength += n._dataLength; } return(_entryLength + _dataLength); }
public override int OnCalculateSize(bool force) { _texIndices = 0; int size = 12; foreach (SRT0TextureNode n in Children) { if (n._indirect) _indIndices += 1 << n._textureIndex; else _texIndices += 1 << n._textureIndex; size += 4 + n.CalculateSize(true); } return size; }
public override bool OnInitialize() { if ((_name == null) && (Header->_stringOffset != 0)) _name = Header->ResourceString; _texIndices = (TextureIndices)(int)Header->_textureIndices; _indIndices = (IndirectTextureIndices)(int)Header->_indirectIndices; for (int i = 0; i < 8; i++) _usageIndices[i] = ((Header->_textureIndices >> i) & 1); for (int i = 0; i < 3; i++) _usageIndices[i + 8] = ((Header->_indirectIndices >> i) & 1); return (int)_texIndices > 0 || (int)_indIndices > 0; }