1 |
using System; |
2 |
using Oni.Motoko; |
3 |
|
4 |
namespace Oni.Totoro |
5 |
{ |
6 |
internal class BodyDaeWriter |
7 |
{ |
8 |
private static readonly Vector3[] defaultPose = |
9 |
{ |
10 |
new Vector3(0.0f, 90.0f, 90.0f), |
11 |
|
12 |
new Vector3(0.0f, 180.0f, 0.0f), |
13 |
new Vector3(0.0f, 0.0f, 0.0f), |
14 |
new Vector3(0.0f, 0.0f, 0.0f), |
15 |
|
16 |
new Vector3(0.0f, 180.0f, 0.0f), |
17 |
new Vector3(0.0f, 0.0f, 0.0f), |
18 |
new Vector3(0.0f, 0.0f, 0.0f), |
19 |
|
20 |
new Vector3(0.0f, 0.0f, 0.0f), |
21 |
new Vector3(0.0f, 0.0f, 0.0f), |
22 |
new Vector3(0.0f, 0.0f, 0.0f), |
23 |
new Vector3(0.0f, 0.0f, 0.0f), |
24 |
|
25 |
new Vector3(90.0f, 90.0f, 90.0f), |
26 |
new Vector3(0.0f, 90.0f, 0.0f), |
27 |
new Vector3(0.0f, 0.0f, 0.0f), |
28 |
new Vector3(-90.0f, 0.0f, 0.0f), |
29 |
|
30 |
new Vector3(-90.0f, -90.0f, 90.0f), |
31 |
new Vector3(0.0f, -90.0f, 0.0f), |
32 |
new Vector3(0.0f, 0.0f, 0.0f), |
33 |
new Vector3(90.0f, 0.0f, 0.0f) |
34 |
}; |
35 |
|
36 |
private readonly GeometryDaeWriter geometryWriter; |
37 |
|
38 |
public BodyDaeWriter(GeometryDaeWriter geometryWriter) |
39 |
{ |
40 |
this.geometryWriter = geometryWriter; |
41 |
} |
42 |
|
43 |
public Dae.Node Write(Body body, bool noAnimation, InstanceDescriptor[] textures) |
44 |
{ |
45 |
return WriteNode(body.Root, noAnimation, textures); |
46 |
} |
47 |
|
48 |
private Dae.Node WriteNode(BodyNode bodyNode, bool useDefaultPose, InstanceDescriptor[] textures) |
49 |
{ |
50 |
if (textures != null) |
51 |
bodyNode.Geometry.Texture = textures[bodyNode.Index]; |
52 |
|
53 |
var daeNode = geometryWriter.WriteNode(bodyNode.Geometry, bodyNode.Name); |
54 |
|
55 |
daeNode.Transforms.Translate("pos", bodyNode.Translation); |
56 |
|
57 |
if (useDefaultPose) |
58 |
{ |
59 |
var rot = defaultPose[bodyNode.Index]; |
60 |
|
61 |
daeNode.Transforms.Rotate("rotX", Vector3.Right, rot.X); |
62 |
daeNode.Transforms.Rotate("rotY", Vector3.Up, rot.Y); |
63 |
daeNode.Transforms.Rotate("rotZ", Vector3.Backward, rot.Z); |
64 |
} |
65 |
else |
66 |
{ |
67 |
daeNode.Transforms.Rotate("rotX", Vector3.Right, 0.0f); |
68 |
daeNode.Transforms.Rotate("rotY", Vector3.Up, 0.0f); |
69 |
daeNode.Transforms.Rotate("rotZ", Vector3.Backward, 0.0f); |
70 |
} |
71 |
|
72 |
foreach (var childBodyNode in bodyNode.Nodes) |
73 |
daeNode.Nodes.Add(WriteNode(childBodyNode, useDefaultPose, textures)); |
74 |
|
75 |
return daeNode; |
76 |
} |
77 |
} |
78 |
} |