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