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