Esempio n. 1
0
        protected override void ProcessInternal(ChunkedData subChunks)
        {
            if (!IsSane)
            {
                return;
            }

            var wmoReferencesChunk = subChunks.GetChunkByName("MCRW");

            if (wmoReferencesChunk == null)
            {
                return;
            }
            var stream   = wmoReferencesChunk.GetStream();
            var reader   = new BinaryReader(stream);
            var refCount = (int)(wmoReferencesChunk.Length / 4);

            for (int i = 0; i < refCount; i++)
            {
                int index = reader.ReadInt32();
                if (index < 0 || index >= _definitions.Count)
                {
                    continue;
                }

                var wmo = _definitions[index];

                if (_drawn.Contains(wmo.UniqueId))
                {
                    continue;
                }
                _drawn.Add(wmo.UniqueId);

                if (wmo.MwidIndex >= _paths.Count)
                {
                    continue;
                }

                var path  = _paths[(int)wmo.MwidIndex];
                var model = Cache.WorldModel.Get(path);
                if (model == null)
                {
                    model = new WorldModelRoot(path);
                    Cache.WorldModel.Insert(path, model);
                }

                if (Vertices == null)
                {
                    Vertices = new List <Vector3>(1000);
                }
                if (Triangles == null)
                {
                    Triangles = new List <Triangle <uint> >(1000);
                }

                InsertModelGeometry(Vertices, Triangles, wmo, model);
            }
        }
Esempio n. 2
0
        protected override void ProcessInternal(ChunkedData subChunks)
        {
            if (!IsSane)
                return;

            var doodadReferencesChunk = subChunks.GetChunkByName("MCRD");
            if (doodadReferencesChunk == null)
                return;
            var stream = doodadReferencesChunk.GetStream();
            var reader = new BinaryReader(stream);
            var refCount = (int)(doodadReferencesChunk.Length/4);
            
            for (int i = 0; i < refCount; i++)
            {
                int index = reader.ReadInt32();
                if (index < 0 || index >= _definitions.Count)
                    continue;

                var doodad = _definitions[index];

                if (_drawn.Contains(doodad.UniqueId))
                    continue;
                _drawn.Add(doodad.UniqueId);

                if (doodad.MmidIndex >= _paths.Count)
                    continue;

                var path = _paths[(int) doodad.MmidIndex];
                var model = Cache.Model.Get(path);
                if (model == null)
                {
                    model = new Model(path);
                    Cache.Model.Insert(path, model);
                }

                if (!model.IsCollidable)
                    continue;

                // some weak heuristic to save memory allocation time
                if (Vertices == null)
                    Vertices = new List<Vector3>((int)(refCount * model.Vertices.Length * 0.2));
                if (Triangles == null)
                    Triangles = new List<Triangle<uint>>((int)(refCount * model.Triangles.Length * 0.2));

                InsertModelGeometry(doodad, model);
            }
        }
Esempio n. 3
0
        protected override void ProcessInternal(ChunkedData subChunks)
        {
            if (!IsSane)
                return;

            var wmoReferencesChunk = subChunks.GetChunkByName("MCRW");
            if (wmoReferencesChunk == null)
                return;
            var stream = wmoReferencesChunk.GetStream();
            var reader = new BinaryReader(stream);
            var refCount = (int)(wmoReferencesChunk.Length / 4);
            for (int i = 0; i < refCount; i++)
            {
                int index = reader.ReadInt32();
                if (index < 0 || index >= _definitions.Count)
                    continue;

                var wmo = _definitions[index];

                if (_drawn.Contains(wmo.UniqueId))
                    continue;
                _drawn.Add(wmo.UniqueId);

                if (wmo.MwidIndex >= _paths.Count)
                    continue;

                var path = _paths[(int) wmo.MwidIndex];
                var model = Cache.WorldModel.Get(path);
                if (model == null)
                {
                    model = new WorldModelRoot(path);
                    Cache.WorldModel.Insert(path, model);
                }

                if (Vertices == null)
                    Vertices = new List<Vector3>(1000);
                if (Triangles == null)
                    Triangles = new List<Triangle<uint>>(1000);

                InsertModelGeometry(Vertices, Triangles, wmo, model);
            }
        }
Esempio n. 4
0
        public WorldModelGroup(string path, int groupIndex)
        {
            Data = new ChunkedData(path);
            GroupIndex = groupIndex;

            var mainChunk = Data.GetChunkByName("MOGP");
            var firstSub = mainChunk.FindSubChunkOffset("MOPY");
            if (firstSub == -1)
                return;
            var stream = mainChunk.GetStream();
            stream.Seek(firstSub, SeekOrigin.Begin);
            SubData = new ChunkedData(stream, (int)(mainChunk.Length - firstSub));

            ReadBoundingBox();
            ReadMaterials();
            ReadTriangles();
            ReadVertices();
            ReadNormals();
            ReadLiquid();
        }
Esempio n. 5
0
        public WorldModelGroup(string path, int groupIndex)
        {
            Data       = new ChunkedData(path);
            GroupIndex = groupIndex;

            var mainChunk = Data.GetChunkByName("MOGP");
            var firstSub  = mainChunk.FindSubChunkOffset("MOPY");

            if (firstSub == -1)
            {
                return;
            }
            var stream = mainChunk.GetStream();

            stream.Seek(firstSub, SeekOrigin.Begin);
            SubData = new ChunkedData(stream, (int)(mainChunk.Length - firstSub));

            ReadBoundingBox();
            ReadMaterials();
            ReadTriangles();
            ReadVertices();
            ReadNormals();
            ReadLiquid();
        }
Esempio n. 6
0
        protected override void ProcessInternal(ChunkedData subChunks)
        {
            if (!IsSane)
            {
                return;
            }

            var doodadReferencesChunk = subChunks.GetChunkByName("MCRD");

            if (doodadReferencesChunk == null)
            {
                return;
            }
            var stream   = doodadReferencesChunk.GetStream();
            var reader   = new BinaryReader(stream);
            var refCount = (int)(doodadReferencesChunk.Length / 4);

            for (int i = 0; i < refCount; i++)
            {
                int index = reader.ReadInt32();
                if (index < 0 || index >= _definitions.Count)
                {
                    continue;
                }

                var doodad = _definitions[index];

                if (_drawn.Contains(doodad.UniqueId))
                {
                    continue;
                }
                _drawn.Add(doodad.UniqueId);

                if (doodad.MmidIndex >= _paths.Count)
                {
                    continue;
                }

                var path  = _paths[(int)doodad.MmidIndex];
                var model = Cache.Model.Get(path);
                if (model == null)
                {
                    model = new Model(path);
                    Cache.Model.Insert(path, model);
                }

                if (!model.IsCollidable)
                {
                    continue;
                }

                // some weak heuristic to save memory allocation time
                if (Vertices == null)
                {
                    Vertices = new List <Vector3>((int)(refCount * model.Vertices.Length * 0.2));
                }
                if (Triangles == null)
                {
                    Triangles = new List <Triangle <uint> >((int)(refCount * model.Triangles.Length * 0.2));
                }

                InsertModelGeometry(doodad, model);
            }
        }