Esempio n. 1
0
        public override uint Write(EndianWriter writer, uint imageBase, bool DX, Dictionary <string, uint> labels)
        {
            // writing vertices
            uint vertexAddress = 0;

            if (VertexChunks != null && VertexChunks.Length > 0)
            {
                if (labels.ContainsKey(VertexName))
                {
                    vertexAddress = labels[VertexName];
                }
                else
                {
                    vertexAddress = writer.Position + imageBase;
                    foreach (VertexChunk cnk in VertexChunks)
                    {
                        cnk.Write(writer);
                    }
                    // end chunk
                    byte[] bytes = new byte[8];
                    bytes[0] = 255;
                    writer.Write(bytes);
                }
            }
            uint polyAddress = 0;

            if (PolyChunks != null && PolyChunks.Length > 0)
            {
                if (labels.ContainsKey(PolyName))
                {
                    polyAddress = labels[PolyName];
                }
                else
                {
                    polyAddress = writer.Position + imageBase;
                    foreach (PolyChunk cnk in PolyChunks)
                    {
                        cnk.Write(writer);
                    }
                    // end chunk
                    byte[] bytes = new byte[2];
                    bytes[0] = 255;
                    writer.Write(bytes);
                }
            }

            uint address = writer.Position + imageBase;

            labels.AddLabel(Name, address);
            writer.WriteUInt32(vertexAddress);
            writer.WriteUInt32(polyAddress);
            MeshBounds.Write(writer);
            return(address);
        }
    Vector3 GetBoundsOffset(MeshBounds bounds, Collider coll)
    {
        var extents = coll.bounds.extents;

        switch (bounds)
        {
        case MeshBounds.Width:
            return(extents.x * coll.transform.right);

        case MeshBounds.Height:
            return(extents.y * coll.transform.up);

        case MeshBounds.Depth:
            return(extents.z * coll.transform.forward);
        }
        return(Vector3.zero);
    }
Esempio n. 3
0
        void AddMeshRendererComponents(Entity e, int nVertex, int nIndex, NativeArray <SimpleVertex> vertices)
        {
            MeshRenderer mr = EntityManager.GetComponentData <MeshRenderer>(e);

            mr.startIndex = 0;
            mr.indexCount = nIndex;
            EntityManager.SetComponentData(e, mr);

            DynamicMeshData dmd = EntityManager.GetComponentData <DynamicMeshData>(e);

            dmd.Dirty       = true;
            dmd.NumIndices  = nIndex;
            dmd.NumVertices = nVertex;

            MeshBounds mb = default;

            mb.Bounds = MeshHelper.ComputeBounds(vertices);

            EntityManager.SetComponentData <DynamicMeshData>(e, dmd);
            EntityManager.SetComponentData(e, mb);
        }
Esempio n. 4
0
        public override uint Write(EndianWriter writer, uint imageBase, bool DX, Dictionary <string, uint> labels)
        {
            VertexSet[] sets         = VertexData.Values.ToArray();
            uint[]      vtxAddresses = new uint[VertexData.Count];
            for (int i = 0; i < sets.Length; i++)
            {
                VertexSet vtxSet = sets[i];
                vtxAddresses[i] = writer.Position + imageBase;
                IOType outputType = vtxSet.DataType.ToStructType();

                switch (vtxSet.Attribute)
                {
                case VertexAttribute.Position:
                case VertexAttribute.Normal:
                    foreach (Vector3 vec in vtxSet.Vector3Data)
                    {
                        vec.Write(writer, outputType);
                    }
                    break;

                case VertexAttribute.Color0:
                case VertexAttribute.Color1:
                    foreach (Color col in vtxSet.ColorData)
                    {
                        col.Write(writer, outputType);
                    }
                    break;

                case VertexAttribute.Tex0:
                case VertexAttribute.Tex1:
                case VertexAttribute.Tex2:
                case VertexAttribute.Tex3:
                case VertexAttribute.Tex4:
                case VertexAttribute.Tex5:
                case VertexAttribute.Tex6:
                case VertexAttribute.Tex7:
                    foreach (Vector2 uv in vtxSet.UVData)
                    {
                        (uv * 256).Write(writer, outputType);
                    }
                    break;

                case VertexAttribute.PositionMatrixId:
                case VertexAttribute.Null:
                default:
                    throw new FormatException($"Vertex set had an invalid or unavailable type: {vtxSet.Attribute}");
                }
            }

            uint vtxAddr = writer.Position + imageBase;

            // writing vertex attributes
            for (int i = 0; i < sets.Length; i++)
            {
                VertexSet vtxSet = sets[i];

                writer.Write(new byte[] { (byte)vtxSet.Attribute, (byte)vtxSet.StructSize });
                writer.WriteUInt16((ushort)vtxSet.DataLength);

                uint structure = (uint)vtxSet.StructType;
                structure |= (uint)((byte)vtxSet.DataType << 4);
                writer.WriteUInt32(structure);

                writer.WriteUInt32(vtxAddresses[i]);
                writer.WriteUInt32((uint)(vtxSet.DataLength * vtxSet.StructSize));
            }

            // empty vtx attribute
            byte[] nullVtx = new byte[16];
            nullVtx[0] = 0xFF;
            writer.Write(nullVtx);

            // writing geometry data
            uint[] WriteMeshData(Mesh[] meshes)
            {
                uint[]          result       = new uint[meshes.Length * 4];
                IndexAttributes indexAttribs = IndexAttributes.HasPosition;

                for (int i = 0, ri = 0; i < meshes.Length; i++, ri += 4)
                {
                    Mesh m = meshes[i];

                    IndexAttributes?t = m.IndexAttributes;
                    if (t.HasValue)
                    {
                        indexAttribs = t.Value;
                    }

                    // writing parameters
                    result[ri]     = writer.Position + imageBase;
                    result[ri + 1] = (uint)m.Parameters.Length;
                    foreach (IParameter p in m.Parameters)
                    {
                        p.Write(writer);
                    }

                    // writing polygons
                    uint addr = writer.Position;
                    foreach (Poly p in m.Polys)
                    {
                        p.Write(writer, indexAttribs);
                    }
                    result[ri + 2] = addr + imageBase;
                    result[ri + 3] = writer.Position - addr;
                }
                return(result);
            }

            uint[] opaqueMeshStructs      = WriteMeshData(OpaqueMeshes);
            uint[] transparentMeshStructs = WriteMeshData(TransparentMeshes);

            // writing geometry properties
            uint opaqueAddress = writer.Position + imageBase;

            foreach (uint i in opaqueMeshStructs)
            {
                writer.Write(i);
            }

            uint transparentAddress = writer.Position + imageBase;

            foreach (uint i in transparentMeshStructs)
            {
                writer.Write(i);
            }

            uint address = writer.Position + imageBase;

            labels.AddLabel(Name, address);

            writer.WriteUInt32(vtxAddr);
            writer.WriteUInt32(0);
            writer.WriteUInt32(opaqueAddress);
            writer.WriteUInt32(transparentAddress);
            writer.WriteUInt16((ushort)OpaqueMeshes.Length);
            writer.WriteUInt16((ushort)TransparentMeshes.Length);
            MeshBounds.Write(writer);
            return(address);
        }
Esempio n. 5
0
        public override void WriteNJA(TextWriter writer, bool DX, List <string> labels, string[] textures)
        {
            // write position data
            if (!labels.Contains(PositionName))
            {
                writer.Write("POINT ");
                writer.Write(PositionName);
                writer.WriteLine("[]");

                writer.WriteLine("START");
                writer.WriteLine();

                foreach (Vector3 p in Positions)
                {
                    writer.Write("\tVERT ");
                    p.WriteNJA(writer, IOType.Float);
                    writer.WriteLine(",");
                }

                writer.WriteLine("END");
                writer.WriteLine();

                labels.Add(PositionName);
            }

            // write normal data
            if (!labels.Contains(NormalName))
            {
                writer.Write("NORMAL ");
                writer.Write(NormalName);
                writer.WriteLine("[]");

                writer.WriteLine("START");
                writer.WriteLine();

                foreach (Vector3 p in Normals)
                {
                    writer.Write("\tNORM ");
                    p.WriteNJA(writer, IOType.Float);
                    writer.WriteLine(",");
                }

                writer.WriteLine("END");
                writer.WriteLine();

                labels.Add(NormalName);
            }

            // writing meshset data
            foreach (Mesh m in Meshes)
            {
                m.WriteDataNJA(writer, labels);
            }

            // write meshsets
            if (!labels.Contains(MeshName))
            {
                writer.Write(DX ? "MESHSET " : "MESHSET_SADX ");
                writer.Write(MeshName);
                writer.WriteLine("[]");

                writer.WriteLine("START");
                writer.WriteLine();

                foreach (Mesh m in Meshes)
                {
                    m.WriteMeshsetNJA(writer, DX);
                    writer.WriteLine();
                }

                writer.WriteLine("END");
                writer.WriteLine();

                labels.Add(MeshName);
            }

            // write materials
            if (!labels.Contains(MaterialName))
            {
                writer.Write("MATERIAL ");
                writer.Write(MaterialName);
                writer.WriteLine("[]");

                writer.WriteLine("START");
                writer.WriteLine();

                foreach (Material m in Materials)
                {
                    m.WriteNJA(writer, textures);
                    writer.WriteLine();
                }

                writer.WriteLine("END");
                writer.WriteLine();

                labels.Add(MaterialName);
            }

            // write attach
            writer.Write(DX ? "MODEL_SADX \t\t" : "MODEL \t\t");
            writer.Write(Name);
            writer.WriteLine("[]");
            writer.WriteLine("START");

            writer.Write("Points \t\t");
            writer.Write(PositionName);
            writer.WriteLine(",");

            writer.Write("Normal \t\t");
            writer.Write(NormalName);
            writer.WriteLine(",");

            writer.Write("PointNum \t");
            writer.Write(Positions.Length);
            writer.WriteLine(",");

            writer.Write("Meshset \t");
            writer.Write(MeshName);
            writer.WriteLine(",");

            writer.Write("Materials \t");
            writer.Write(MaterialName);
            writer.WriteLine(",");

            writer.Write("MeshsetNum \t");
            writer.Write(Meshes.Length);
            writer.WriteLine(",");

            writer.Write("MatNum \t\t");
            writer.Write(Materials.Length);
            writer.WriteLine(",");

            MeshBounds.WriteNJA(writer);
            writer.WriteLine();

            writer.WriteLine("END");
            writer.WriteLine();
        }
Esempio n. 6
0
        public override uint Write(EndianWriter writer, uint imageBase, bool DX, Dictionary <string, uint> labels)
        {
            // writing positions
            uint posAddress;

            if (labels.ContainsKey(PositionName))
            {
                posAddress = labels[PositionName];
            }
            else
            {
                posAddress = writer.Position + imageBase;
                labels.AddLabel(PositionName, posAddress);
                foreach (Vector3 p in Positions)
                {
                    p.Write(writer, IOType.Float);
                }
            }

            // writing normals
            uint nrmAddress = 0;

            if (Normals != null)
            {
                if (labels.ContainsKey(NormalName))
                {
                    nrmAddress = labels[NormalName];
                }
                else
                {
                    nrmAddress = writer.Position + imageBase;
                    labels.AddLabel(NormalName, nrmAddress);
                    foreach (Vector3 p in Normals)
                    {
                        p.Write(writer, IOType.Float);
                    }
                }
            }

            // writing meshsets
            uint meshAddress;

            if (labels.ContainsKey(MeshName))
            {
                meshAddress = labels[MeshName];
            }
            else
            {
                // writing meshset data
                foreach (Mesh m in Meshes)
                {
                    m.WriteData(writer, imageBase, labels);
                }

                meshAddress = writer.Position + imageBase;
                labels.AddLabel(MeshName, meshAddress);
                foreach (Mesh m in Meshes)
                {
                    m.WriteMeshset(writer, DX, labels);
                }
            }

            // writing materials
            uint materialAddress;

            if (labels.ContainsKey(MaterialName))
            {
                materialAddress = labels[MaterialName];
            }
            else
            {
                materialAddress = writer.Position + imageBase;
                labels.AddLabel(MaterialName, materialAddress);
                foreach (Material m in Materials)
                {
                    m.Write(writer);
                }
            }

            // writing the attach

            uint outAddress = writer.Position + imageBase;

            labels.AddLabel(Name, outAddress);

            writer.WriteUInt32(posAddress);
            writer.WriteUInt32(nrmAddress);
            writer.WriteUInt32((uint)Positions.Length);
            writer.WriteUInt32(meshAddress);
            writer.WriteUInt32(materialAddress);
            writer.WriteUInt16((ushort)Meshes.Length);
            writer.WriteUInt16((ushort)Materials.Length);
            MeshBounds.Write(writer);
            if (DX)
            {
                writer.WriteUInt32(0);
            }

            return(outAddress);
        }