Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        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);
        }
Exemple #7
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;
        }