source: OGRE/trunk/ogrenew/Tools/Wings3DExporter/io3d_ogre.py @ 657

Revision 657, 4.1 KB checked in by mattausch, 18 years ago (diff)

added ogre dependencies and patched ogre sources

Line 
1
2# write a mesh in OGRE XML format
3
4import sys
5
6#import libxml2 as myxml
7import xmlout as myxml
8
9import pprint
10
11def vector_to_xml(elem, vector, coord_names):
12        for i in range(len(coord_names)):
13                coord = "%.6f" % vector[i]
14                elem.setProp(coord_names[i], coord)
15
16class ogre_writer:
17
18        def __init__(self):
19
20                self.xmldoc = myxml.newDoc("1.0")
21                if not self.xmldoc:
22                        raise IOError("Unable to create doc!!!")
23
24                mesh_elem = myxml.newNode("mesh")
25                try:
26                        mesh_elem.docSetRootElement(self.xmldoc)
27                except myxml.treeError:
28                        pass
29                self.materials_elem = mesh_elem.newChild(None, "materials", None)
30                self.sharedgeometry_elem = mesh_elem.newChild(None, "sharedgeometry", None)
31                self.submeshes_elem = mesh_elem.newChild(None, "submeshes", None)
32
33        def add(self, mesh):
34                if mesh.shared_geometry:
35                        self.add_geometry(self.sharedgeometry_elem, mesh.glverts)
36                else:
37                        self.sharedgeometry_elem.setProp("vertexcount", "0")
38                for submesh in mesh.subs:
39                        self.add_material(submesh.mat_data)
40                        self.add_submesh(submesh, mesh.shared_geometry)
41
42        def add_material(self, mat):
43                material_elem = self.materials_elem.newChild(None, "material", None)
44                material_elem.setProp("name", mat.name)
45
46                rgba = ["red", "green", "blue", "alpha"]
47
48                ambient_elem = material_elem.newChild(None, "ambient", None)
49                vector_to_xml(ambient_elem, mat.ambient, rgba)
50
51                diffuse_elem = material_elem.newChild(None, "diffuse", None)
52                vector_to_xml(diffuse_elem, mat.diffuse, rgba)
53
54                specular_elem = material_elem.newChild(None, "specular", None)
55                vector_to_xml(specular_elem, mat.specular, rgba)
56
57                shininess_elem = material_elem.newChild(None, "shininess", None)
58                shininess_elem.setProp("value", str(mat.shininess))
59
60                texs_elem = material_elem.newChild(None, "texturelayers", None)
61                for tex in mat.textures:
62                        tex_elem = texs_elem.newChild(None, "texturelayer", None)
63                        tex_elem.setProp("texture", str(tex))
64
65        def add_geometry(self, geometry_elem, vertices):
66                "add given vertices to an XML element"
67
68                geometry_elem.setProp("vertexcount", str(len(vertices)))
69
70                want_uvs = vertices[0].uv != None
71                vb_elem = geometry_elem.newChild(None, "vertexbuffer", None)
72                vb_elem.setProp("positions", "true")
73                vb_elem.setProp("normals", "true")
74                vb_elem.setProp("colours_diffuse", "false")
75                if want_uvs:
76                        vb_elem.setProp("texture_coords", "1")
77                        vb_elem.setProp("texture_coord_dimensions_0", "2")
78                else:
79                        vb_elem.setProp("texture_coords", "0")
80
81                try:
82                        for vert in vertices:
83                                vertex_elem = vb_elem.newChild(None, "vertex", None)
84
85                                position_elem = vertex_elem.newChild(None, "position", None)
86                                vector_to_xml(position_elem, vert.pos, ["x", "y", "z"])
87
88                                normal_elem = vertex_elem.newChild(None, "normal", None)
89                                vector_to_xml(normal_elem, vert.normal, ["x", "y", "z"])
90
91                                if want_uvs:
92                                        texcoord_elem = vertex_elem.newChild(None, "texcoord", None)
93                                        vector_to_xml(texcoord_elem, vert.uv, ["u", "v"])
94                except:
95                        pp = pprint.PrettyPrinter(indent=4,width=78)
96                        pp.pprint(vertices)
97
98                        raise
99
100        def add_faces(self, submesh_elem, faces):
101                faces_elem = submesh_elem.newChild(None, "faces", None)
102                faces_elem.setProp("count", str(len(faces)))
103                for face in faces:
104                        face_elem = faces_elem.newChild(None, "face", None)
105                        for index in range(3):
106                                face_elem.setProp("v%d" % (index + 1), str(face[index]))
107
108        def add_submesh(self, submesh, use_shared):
109                submesh_elem = self.submeshes_elem.newChild(None, "submesh", None)
110                submesh_elem.setProp("material", submesh.mat_data.name)
111                if use_shared:
112                        submesh_elem.setProp("usesharedvertices", "true")
113                        self.add_faces(submesh_elem, submesh.gltris)
114                else:
115                        submesh_elem.setProp("usesharedvertices", "false")
116                        self.add_faces(submesh_elem, submesh.gltris)
117                        geometry_elem = submesh_elem.newChild(None, "geometry", None)
118                        self.add_geometry(geometry_elem, submesh.glverts)
119                submesh_elem.setProp("use32bitindexes", "false")
120                submesh_elem.setProp("operationtype", str("triangle_list"))
121
122        def write(self, filename):
123                self.xmldoc.saveFormatFile(filename, 1)
124                self.xmldoc.freeDoc()
125
126# Create our xml document
127def write_ogre(mesh, filename):
128        ow = ogre_writer()
129        ow.add(mesh)
130        ow.write(filename)
131
132
133
Note: See TracBrowser for help on using the repository browser.