Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }