public void Write(Stream stream) { var collisionList = new List <Collision>(); var collisionMeshList = new List <RawCollisionMesh>(); var collisionMeshGroupList = new List <RawCollisionMeshGroup>(); foreach (var node in CollisionMeshGroupList) { var start = node.Meshes.Count > 0 ? collisionMeshList.Count : 0; collisionMeshGroupList.Add(new RawCollisionMeshGroup { Child1 = node.Child1, Child2 = node.Child2, Child3 = node.Child3, Child4 = node.Child4, Child5 = node.Child5, Child6 = node.Child6, Child7 = node.Child7, Child8 = node.Child8, BoundingBox = node.BoundingBox, CollisionMeshStart = (ushort)start, CollisionMeshEnd = (ushort)(start + node.Meshes.Count) }); foreach (var mesh in node.Meshes) { collisionMeshList.Add(new RawCollisionMesh { BoundingBox = mesh.BoundingBox, CollisionStart = (ushort)collisionList.Count, CollisionEnd = (ushort)(collisionList.Count + mesh.Collisions.Count), v10 = mesh.v10, v12 = mesh.v12 }); collisionList.AddRange(mesh.Collisions); } } var bbCache = new WriteCache <BoundingBoxInt16, string>(x => x.ToString()); bbCache.AddConstant(BoundingBoxInt16.Invalid, -1); foreach (var item in collisionList) { bbCache.Add(item.BoundingBox); } var surfaceCache = new WriteCache <SurfaceFlags, int>(x => x.Flags); foreach (var item in collisionList) { surfaceCache.Add(item.SurfaceFlags); } var planeCache = new WriteCache <Plane, string>(x => x.ToString()); foreach (var item in collisionList) { planeCache.Add(item.Plane); } var entries = new List <Entry>(8); AddEntry(entries, HeaderSize, 1); AddEntry(entries, CollisionMeshGroupList.Count * Col1Size, 0x10); AddEntry(entries, collisionMeshList.Count * Col2Size, 0x10); AddEntry(entries, collisionList.Count * Col3Size, 4); AddEntry(entries, VertexList.Count * Col4Size, 0x10); AddEntry(entries, planeCache.Count * Col5Size, 0x10); AddEntry(entries, bbCache.Count * BoundingBoxSize, 0x10); AddEntry(entries, surfaceCache.Count * Col7Size, 4); stream.Position = 0; BinaryMapping.WriteObject(stream, new Header { MagicCode = MagicCode, Version = 1, Unknown08 = Unknown08, Unknown0c = Unknown0c, Entries = entries.ToArray() }); WriteCoctEntry(stream, collisionMeshGroupList); WriteCoctEntry(stream, collisionMeshList); WriteCoctEntry(stream, collisionList .Select(x => new RawCollision { v00 = x.v00, Vertex1 = x.Vertex1, Vertex2 = x.Vertex2, Vertex3 = x.Vertex3, Vertex4 = x.Vertex4, PlaneIndex = planeCache[x.Plane], BoundingBoxIndex = bbCache[x.BoundingBox], SurfaceFlagsIndex = surfaceCache[x.SurfaceFlags], })); stream.AlignPosition(0x10); WriteValueEntry(stream, VertexList, WriteVector4); WriteValueEntry(stream, planeCache, WritePlane); WriteValueEntry(stream, bbCache, WriteBoundingBoxInt16); WriteCoctEntry(stream, surfaceCache); }
public void Write(Stream stream) { var collisionList = new List <Collision>(); var collisionMeshList = new List <RawCollisionMesh>(); var collisionMeshGroupList = new List <RawNode>(); foreach (var node in Nodes) { var start = node.Meshes.Count > 0 ? collisionMeshList.Count : 0; collisionMeshGroupList.Add(new RawNode { Child1 = node.Child1, Child2 = node.Child2, Child3 = node.Child3, Child4 = node.Child4, Child5 = node.Child5, Child6 = node.Child6, Child7 = node.Child7, Child8 = node.Child8, BoundingBox = node.BoundingBox, CollisionMeshStart = (ushort)start, CollisionMeshEnd = (ushort)(start + node.Meshes.Count) }); foreach (var mesh in node.Meshes) { collisionMeshList.Add(new RawCollisionMesh { BoundingBox = mesh.BoundingBox, CollisionStart = (ushort)collisionList.Count, CollisionEnd = (ushort)(collisionList.Count + mesh.Collisions.Count), Visibility = mesh.Visibility, Group = mesh.Group }); collisionList.AddRange(mesh.Collisions); } } var bbCache = new WriteCache <BoundingBoxInt16, string>(x => x.ToString()); bbCache.AddConstant(BoundingBoxInt16.Invalid, -1); foreach (var item in collisionList) { bbCache.Add(item.BoundingBox); } var surfaceCache = new WriteCache <Attributes, int>(x => x.Flags); foreach (var item in collisionList) { surfaceCache.Add(item.Attributes); } var planeCache = new WriteCache <Plane, string>(x => x.ToString()); foreach (var item in collisionList) { planeCache.Add(item.Plane); } var entries = new List <Entry>(8); AddEntry(entries, HeaderSize, 1); AddEntry(entries, Nodes.Count * NodeSize, 0x10); AddEntry(entries, collisionMeshList.Count * MeshSize, 0x10); AddEntry(entries, collisionList.Count * PolygonSize, 4); AddEntry(entries, VertexList.Count * Col4Size, 0x10); AddEntry(entries, planeCache.Count * Col5Size, 0x10); AddEntry(entries, bbCache.Count * BoundingBoxSize, 0x10); AddEntry(entries, surfaceCache.Count * AttributesSize, 4); stream.Position = 0; BinaryMapping.WriteObject(stream, new Header { MagicCode = MagicCode, Version = 1, Depth = Depth, Type = Type, Entries = entries.ToArray() }); WriteCoctEntry(stream, collisionMeshGroupList); WriteCoctEntry(stream, collisionMeshList); WriteCoctEntry(stream, collisionList .Select(x => new RawCollision { Ground = x.Ground, FloorLevel = x.FloorLevel, Vertex1 = x.Vertex1, Vertex2 = x.Vertex2, Vertex3 = x.Vertex3, Vertex4 = x.Vertex4, PlaneIndex = planeCache[x.Plane], BoundingBoxIndex = bbCache[x.BoundingBox], AttributeIndex = surfaceCache[x.Attributes], })); stream.AlignPosition(0x10); WriteValueEntry(stream, VertexList, WriteVector4); WriteValueEntry(stream, planeCache, WritePlane); WriteValueEntry(stream, bbCache, WriteBoundingBoxInt16); WriteCoctEntry(stream, surfaceCache); }