[1114] | 1 | namespace Oni.Motoko
|
---|
| 2 | {
|
---|
| 3 | internal class GeometryDatWriter
|
---|
| 4 | {
|
---|
| 5 | private Geometry geometry;
|
---|
| 6 | private ImporterFile importer;
|
---|
| 7 |
|
---|
| 8 | public static ImporterDescriptor Write(Geometry geometry, ImporterFile importer)
|
---|
| 9 | {
|
---|
| 10 | var writer = new GeometryDatWriter
|
---|
| 11 | {
|
---|
| 12 | geometry = geometry,
|
---|
| 13 | importer = importer
|
---|
| 14 | };
|
---|
| 15 |
|
---|
| 16 | return writer.WriteGeometry();
|
---|
| 17 | }
|
---|
| 18 |
|
---|
| 19 | private ImporterDescriptor WriteGeometry()
|
---|
| 20 | {
|
---|
| 21 | var triangleStrips = Stripify.FromTriangleList(geometry.Triangles);
|
---|
| 22 | var triangleList = Stripify.ToTriangleList(triangleStrips);
|
---|
| 23 |
|
---|
| 24 | var faceNormals = new Vector3[triangleList.Length / 3];
|
---|
| 25 | var faceIndices = new int[faceNormals.Length];
|
---|
| 26 |
|
---|
| 27 | for (int i = 0; i < triangleList.Length; i += 3)
|
---|
| 28 | {
|
---|
| 29 | var p0 = geometry.Points[triangleList[i + 0]];
|
---|
| 30 | var p1 = geometry.Points[triangleList[i + 1]];
|
---|
| 31 | var p2 = geometry.Points[triangleList[i + 2]];
|
---|
| 32 |
|
---|
| 33 | var faceNormal = Vector3.Normalize(Vector3.Cross(p1 - p0, p2 - p0));
|
---|
| 34 | int faceIndex = i / 3;
|
---|
| 35 |
|
---|
| 36 | faceNormals[faceIndex] = faceNormal;
|
---|
| 37 | faceIndices[faceIndex] = faceIndex;
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | var m3gm = importer.CreateInstance(TemplateTag.M3GM, geometry.Name);
|
---|
| 41 | var pnta = importer.CreateInstance(TemplateTag.PNTA);
|
---|
| 42 | var vcra1 = importer.CreateInstance(TemplateTag.VCRA);
|
---|
| 43 | var vcra2 = importer.CreateInstance(TemplateTag.VCRA);
|
---|
| 44 | var txca = importer.CreateInstance(TemplateTag.TXCA);
|
---|
| 45 | var idxa1 = importer.CreateInstance(TemplateTag.IDXA);
|
---|
| 46 | var idxa2 = importer.CreateInstance(TemplateTag.IDXA);
|
---|
| 47 |
|
---|
| 48 | using (var writer = m3gm.OpenWrite(4))
|
---|
| 49 | {
|
---|
| 50 | writer.Write(pnta);
|
---|
| 51 | writer.Write(vcra1);
|
---|
| 52 | writer.Write(vcra2);
|
---|
| 53 | writer.Write(txca);
|
---|
| 54 | writer.Write(idxa1);
|
---|
| 55 | writer.Write(idxa2);
|
---|
| 56 |
|
---|
| 57 | if (geometry.TextureName != null)
|
---|
| 58 | writer.Write(importer.CreateInstance(TemplateTag.TXMP, geometry.TextureName));
|
---|
| 59 | else
|
---|
| 60 | writer.Write(0);
|
---|
| 61 |
|
---|
| 62 | writer.Skip(4);
|
---|
| 63 | }
|
---|
| 64 |
|
---|
| 65 | pnta.WritePoints(geometry.Points);
|
---|
| 66 | vcra1.WriteVectors(geometry.Normals);
|
---|
| 67 | vcra2.WriteVectors(faceNormals);
|
---|
| 68 | txca.WriteTexCoords(geometry.TexCoords);
|
---|
| 69 | idxa1.WriteIndices(triangleStrips);
|
---|
| 70 | idxa2.WriteIndices(faceIndices);
|
---|
| 71 |
|
---|
| 72 | return m3gm;
|
---|
| 73 | }
|
---|
| 74 | }
|
---|
| 75 | }
|
---|