Example #1
0
        void SetIndices(MLOD mlod, GenericRCOLResource.GenericRCOLResource.ChunkReference myIBI, Int32 beforeLength, Int32 afterPos, Int32[] indices)
        {
            Int32[] before = new Int32[beforeLength];
            Array.Copy(mBuffer, 0, before, 0, before.Length);

            Int32[] after = new Int32[mBuffer.Length - afterPos];
            Array.Copy(mBuffer, afterPos, after, 0, after.Length);

            mBuffer = new Int32[before.Length + indices.Length + after.Length];
            Array.Copy(before, 0, mBuffer, 0, before.Length);
            Array.Copy(indices, 0, mBuffer, before.Length, indices.Length);
            Array.Copy(after, 0, mBuffer, before.Length + indices.Length, after.Length);

            int offset = beforeLength + indices.Length - afterPos;

            if (offset != 0)
            {
                foreach (MLOD.Mesh m in mlod.Meshes.FindAll(m => m.IndexBufferIndex.Equals(myIBI)))
                {
                    if (m.StartIndex > beforeLength)
                    {
                        m.StartIndex += offset;
                        foreach (MLOD.GeometryState g in m.GeometryStates)
                        {
                            if (g.StartIndex > beforeLength)
                            {
                                g.StartIndex += offset;
                            }
                        }
                    }
                }
            }
        }
Example #2
0
 public MTST(EventHandler handler, uint nameHash, GenericRCOLResource.GenericRCOLResource.ChunkReference index,
             IEnumerable <Entry> list)
     : base(handler, null)
 {
     this.nameHash = nameHash;
     this.index    = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, index);
     this.list     = list == null ? null : new EntryList(OnRCOLChanged, list);
 }
Example #3
0
 public VBUF(EventHandler handler, uint version, FormatFlags flags, GenericRCOLResource.GenericRCOLResource.ChunkReference swizzleInfo,
             byte[] buffer)
     : this(handler)
 {
     mVersion     = version;
     mFlags       = flags;
     mSwizzleInfo = swizzleInfo;
     mBuffer      = buffer;
 }
Example #4
0
 public LODEntry(EventHandler handler, GenericRCOLResource.GenericRCOLResource.ChunkReference modelLodIndex,
                 LODInfoFlags flags, LODId id, float minZValue, float maxZValue)
     : base(handler)
 {
     mModelLodIndex = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, modelLodIndex);
     mFlags         = flags;
     mId            = id;
     mMinZValue     = minZValue;
     mMaxZValue     = maxZValue;
 }
Example #5
0
            private void Parse(Stream s)
            {
                BinaryReader br = new BinaryReader(s);

                mModelLodIndex = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
                mFlags         = (LODInfoFlags)br.ReadUInt32();
                mId            = (LODId)br.ReadUInt32();
                mMinZValue     = br.ReadSingle();
                mMaxZValue     = br.ReadSingle();
            }
Example #6
0
 void Parse(Stream s)
 {
     if (_RCOLTag == "GEOM")
     {
         index = new BinaryReader(s).ReadInt32();
     }
     else
     {
         data = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
     }
     ReadZeros(s, 12);
 }
Example #7
0
 public ElementTextureRef(EventHandler handler, DependentList <TGIBlock> ParentTGIBlocks = null,
                          string RCOLTag = "MATD")
     : this(handler, (FieldType)0, ParentTGIBlocks, RCOLTag)
 {
     if (_RCOLTag == "GEOM")
     {
         index = 0;
     }
     else
     {
         data = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler);
     }
 }
Example #8
0
 public ElementTextureRef(EventHandler handler, ElementTextureRef basis,
                          DependentList <TGIBlock> ParentTGIBlocks = null, string RCOLTag = null)
     : this(handler, basis.field, ParentTGIBlocks ?? basis._ParentTGIBlocks, RCOLTag ?? basis._RCOLTag)
 {
     if (_RCOLTag == "GEOM")
     {
         index = basis.index;
     }
     else
     {
         data = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, basis.data);
     }
 }
Example #9
0
        protected override void Parse(Stream s)
        {
            BinaryReader br  = new BinaryReader(s);
            string       tag = FOURCC(br.ReadUInt32());

            if (tag != Tag)
            {
                throw new InvalidDataException(string.Format("Invalid Tag read: '{0}'; expected: '{1}'; at 0x{2:X8}", tag, Tag, s.Position));
            }
            mVersion     = br.ReadUInt32();
            mFlags       = (FormatFlags)br.ReadUInt32();
            mSwizzleInfo = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
            mBuffer      = new Byte[s.Length - s.Position];
            s.Read(mBuffer, 0, mBuffer.Length);
        }
Example #10
0
        private bool SetVertices(MLOD mlod, GenericRCOLResource.GenericRCOLResource.ChunkReference myVBI, long beforeLength, int count, VRTF vrtf, IEnumerable <Vertex> vertices, float[] uvscales)
        {
            bool okay = true;

            byte[] before = new byte[beforeLength];
            Array.Copy(mBuffer, before, before.Length);

            long afterPos = Math.Min(mBuffer.Length, beforeLength + (count * vrtf.Stride));

            byte[] after = new byte[mBuffer.Length - afterPos];
            Array.Copy(mBuffer, afterPos, after, 0, after.Length);

            long offset = 0;

            using (MemoryStream mg = new MemoryStream())
            {
                if (!SetVertices(mg, vrtf, vertices, uvscales))
                {
                    okay = false;
                }
                offset = beforeLength + mg.Length - afterPos;

                mBuffer = new byte[before.Length + mg.Length + after.Length];
                Array.Copy(before, mBuffer, before.Length);
                Array.Copy(mg.ToArray(), 0, mBuffer, before.Length, mg.Length);
                Array.Copy(after, 0, mBuffer, before.Length + mg.Length, after.Length);

                mg.Close();
            }

            int voffset = (int)offset / vrtf.Stride;

            if (offset != 0)
            {
                foreach (MLOD.Mesh m in mlod.Meshes.Where(m => m.VertexBufferIndex.Equals(myVBI) && m.StreamOffset > beforeLength))
                {
                    m.StreamOffset = (uint)(m.StreamOffset + offset);
                    foreach (MLOD.GeometryState g in m.GeometryStates)
                    {
                        if (g.MinVertexIndex * vrtf.Stride > beforeLength)
                        {
                            g.MinVertexIndex += voffset;
                        }
                    }
                }
            }
            return(okay);
        }
Example #11
0
            public Mesh(EventHandler handler, MLOD owner)
                : base(handler)
            {
                mOwner = owner;

                mMaterialIndex       = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, 0);
                mVertexFormatIndex   = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, 0);
                mVertexBufferIndex   = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, 0);
                mIndexBufferIndex    = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, 0);
                mBounds              = new BoundingBox(handler);
                mSkinControllerIndex = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, 0);
                mJointReferences     = new UIntList(handler);
                mGeometryStates      = new GeometryStateList(handler);
                mScaleOffsetIndex    = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, 0);
                mMirrorPlane         = new Vector4(handler);//mOwner.Version > 0x00000201
            }
Example #12
0
        protected override void Parse(Stream s)
        {
            BinaryReader r = new BinaryReader(s);

            tag = r.ReadUInt32();
            if (tag != (uint)FOURCC("MTST"))
            {
                throw new InvalidDataException(String.Format("Invalid Tag read: '{0}'; expected: 'MTST'; at 0x{1:X8}", FOURCC(tag), s.Position));
            }
            version = r.ReadUInt32();
            if (version != 0x00000200)
            {
                throw new InvalidDataException(String.Format("Invalid Version read: 0x{0:X8}; expected 0x00000200; at 0x{1:X8}", version, s.Position));
            }

            nameHash = r.ReadUInt32();
            index    = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
            list     = new EntryList(OnRCOLChanged, s);
        }
Example #13
0
        public override Stream UnParse()
        {
            MemoryStream s  = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(s);

            bw.Write((UInt32)FOURCC(Tag));
            bw.Write(mVersion);
            bw.Write((UInt32)mFlags);
            if (mSwizzleInfo == null)
            {
                mSwizzleInfo = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, 0);
            }
            mSwizzleInfo.UnParse(s);
            if (mBuffer == null)
            {
                mBuffer = new byte[0];
            }
            bw.Write(mBuffer);
            return(s);
        }
Example #14
0
        public override Stream UnParse()
        {
            MemoryStream ms = new MemoryStream();
            BinaryWriter w  = new BinaryWriter(ms);

            w.Write(tag);
            w.Write(version);

            w.Write(nameHash);
            if (index == null)
            {
                this.index = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, 0);
            }
            index.UnParse(ms);
            if (list == null)
            {
                this.list = new EntryList(OnRCOLChanged);
            }
            list.UnParse(ms);

            return(ms);
        }
Example #15
0
            private void Parse(Stream s)
            {
                BinaryReader br           = new BinaryReader(s);
                long         expectedSize = br.ReadUInt32();
                long         start        = s.Position;

                mName              = br.ReadUInt32();
                mMaterialIndex     = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
                mVertexFormatIndex = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
                mVertexBufferIndex = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
                mIndexBufferIndex  = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
                uint val = br.ReadUInt32();

                mPrimitiveType       = (ModelPrimitiveType)(val & 0x000000FF);
                mFlags               = (MeshFlags)(val >> 8);
                mStreamOffset        = br.ReadUInt32();
                mStartVertex         = br.ReadInt32();
                mStartIndex          = br.ReadInt32();
                mMinVertexIndex      = br.ReadInt32();
                mVertexCount         = br.ReadInt32();
                mPrimitiveCount      = br.ReadInt32();
                mBounds              = new BoundingBox(handler, s);
                mSkinControllerIndex = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
                mJointReferences     = new UIntList(handler, s);
                mScaleOffsetIndex    = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s);
                mGeometryStates      = new GeometryStateList(handler, s);
                if (mOwner.Version > 0x00000201)
                {
                    mParentName  = br.ReadUInt32();
                    mMirrorPlane = new Vector4(handler, s);
                }
                long actualSize = s.Position - start;

                if (actualSize != expectedSize)
                {
                    throw new Exception(String.Format("Expected end at {0}, actual end was {1}", expectedSize,
                                                      actualSize));
                }
            }
Example #16
0
            public Mesh(EventHandler handler, MLOD owner,
                        uint name,
                        GenericRCOLResource.GenericRCOLResource.ChunkReference materialIndex, GenericRCOLResource.GenericRCOLResource.ChunkReference vertexFormatIndex,
                        GenericRCOLResource.GenericRCOLResource.ChunkReference vertexBufferIndex, GenericRCOLResource.GenericRCOLResource.ChunkReference indexBufferIndex,
                        ModelPrimitiveType primitiveType, MeshFlags flags,
                        uint streamOffset, int startVertex, int startIndex, int minVertexIndex, int vertexCount,
                        int primitiveCount,
                        BoundingBox bounds, GenericRCOLResource.GenericRCOLResource.ChunkReference skinControllerIndex,
                        UIntList jointReferences, GeometryStateList geometryStates, GenericRCOLResource.GenericRCOLResource.ChunkReference scaleOffsetIndex,
                        uint parentName, Vector4 mirrorPlane)
                : base(handler)
            {
                mOwner = owner;

                mName                = name;
                mMaterialIndex       = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, materialIndex);
                mVertexFormatIndex   = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, vertexFormatIndex);
                mVertexBufferIndex   = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, vertexBufferIndex);
                mIndexBufferIndex    = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, indexBufferIndex);
                mPrimitiveType       = primitiveType;
                mFlags               = flags;
                mStreamOffset        = streamOffset;
                mStartVertex         = startVertex;
                mStartIndex          = startIndex;
                mMinVertexIndex      = minVertexIndex;
                mVertexCount         = vertexCount;
                mPrimitiveCount      = primitiveCount;
                mBounds              = new BoundingBox(handler, bounds);
                mSkinControllerIndex = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, skinControllerIndex);
                mJointReferences     = jointReferences == null ? null : new UIntList(handler, jointReferences);
                mGeometryStates      = geometryStates == null ? null : new GeometryStateList(handler, geometryStates);
                mScaleOffsetIndex    = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, scaleOffsetIndex);
                if (mOwner.Version > 0x00000201)
                {
                    mParentName  = parentName;
                    mMirrorPlane = new Vector4(handler, mirrorPlane);
                }
            }
Example #17
0
 public ElementTextureRef(EventHandler handler, FieldType field, GenericRCOLResource.GenericRCOLResource.ChunkReference data)
     : this(handler, field, null, "MATD")
 {
     this.data = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, data);
 }
Example #18
0
 void SetIndices(MLOD mlod, GenericRCOLResource.GenericRCOLResource.ChunkReference myIBI, ModelPrimitiveType type, Int32 startIndex, Int32 primCount, Int32[] indices)
 {
     SetIndices(mlod, myIBI, startIndex, startIndex + primCount * IndexCountFromPrimitiveType(type), indices);
 }
Example #19
0
 public Entry(EventHandler handler, GenericRCOLResource.GenericRCOLResource.ChunkReference index, State materialSet)
     : base(handler)
 {
     this.index         = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, index);
     this.materialState = materialSet;
 }
Example #20
0
 void Parse(Stream s)
 {
     index = new GenericRCOLResource.GenericRCOLResource.ChunkReference(handler, s); materialState = (State) new BinaryReader(s).ReadUInt32();
 }