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 | }
|
---|