1 #include "../include/animorph/OgreXMLExporter.h"
2 #include "../include/animorph/xmlParser.h"
3 using namespace std;
4 using namespace Animorph;
5
exportFile(const string & filename)6 bool OgreXMLExporter::exportFile (const string& filename)
7 {
8
9 //TextureVector &texturevector (mesh.getTextureVectorRef ());
10 MaterialVector &materialvector (mesh.getMaterialVectorRef ());
11
12 string temp,temp2;
13 string file_ending_cut(cutFileEnding (filename, ".obj"));
14
15 string bname = file_ending_cut.substr (filename.find_last_of (PATH_SEPARATOR)+1, filename.size ());
16 int index = bname.find_last_of("/");
17 temp = bname.substr(index+1);
18
19 XMLNode xMainNode,xNodeSubmeshes,xNode_mesh;
20 xMainNode = XMLNode::createXMLTopNode("",TRUE);
21 xNode_mesh = xMainNode.addChild("mesh");
22 xNodeSubmeshes = xNode_mesh.addChild("submeshes");
23
24 //subdivide by materials:
25 //int mv_size = materialvector.size();
26 for (uint32_t m = 0 ;m<materialvector.size();m++){
27 bool found = false;
28 for (uint32_t m1= 0; m1<m;m1++){
29
30 //already rendered this material???
31 if(materialvector[m1].getName() == materialvector[m].getName()){
32 found = true;
33 break;
34 }
35 }
36 if (found == true)
37 continue;
38 InsertASubmeshNode(&xNodeSubmeshes,NULL,m);
39 }
40 return (eXMLErrorNone == xMainNode.writeToFile((file_ending_cut+".mesh.xml").c_str()));
41 }
InsertASubmeshNode(XMLNode * xNodeSubmeshes,XMLNode * Node,int index_material)42 void OgreXMLExporter::InsertASubmeshNode(XMLNode *xNodeSubmeshes,XMLNode *Node, int index_material)
43 {
44 MaterialVector &materialvector (mesh.getMaterialVectorRef ());
45 TextureVector &texturevector (mesh.getTextureVectorRef ());
46 FaceVector &facevector (mesh.getFaceVectorRef ());
47 VertexVector &vertexvector (mesh.getVertexVectorRef ());
48
49 XMLNode xNodeSubmesh;
50 XMLNode xNode_faces;
51 XMLNode xNode_face,xNode_geometry,xNode_vertexbuffer,xNode_vertexbuffer_uv,xNode_vertex;;
52 unsigned int i , j ;
53 int vx_counter = -1, vx_counter_max = -1;
54 int faces_counter = 0;
55
56 xNodeSubmesh = xNodeSubmeshes->addChild("submesh");
57 xNode_faces = xNodeSubmesh.addChild("faces");
58 xNode_geometry = xNodeSubmesh.addChild("geometry");
59
60 xNode_vertexbuffer = xNode_geometry.addChild("vertexbuffer");
61 xNode_vertexbuffer.addAttribute("positions","true");
62 xNode_vertexbuffer.addAttribute("normals","true");
63
64 xNode_vertexbuffer_uv = xNode_geometry.addChild("vertexbuffer");
65 xNode_vertexbuffer_uv.addAttribute("texture_coord_dimensions_0","2");
66 xNode_vertexbuffer_uv.addAttribute("texture_coords","1");
67
68 xNodeSubmesh.addAttribute("material",materialvector[index_material].getName ().c_str());
69 xNodeSubmesh.addAttribute("usesharedvertices","false");
70 xNodeSubmesh.addAttribute("use32bitindexes","false");
71 xNodeSubmesh.addAttribute("operationtype","triangle_list");
72 //unsigned int facevectorsize = facevector.size ();
73
74 for ( i = 0; i < facevector.size (); i++)
75 {
76 const Face &face(facevector[i]);
77
78 if(materialvector[face.getMaterialIndex()].getName() != materialvector[index_material].getName())
79 continue;
80
81
82
83 xNode_face = xNode_faces.addChild("face");
84 int triangle = 0;
85 unsigned int casize = face.getSize();
86 if (casize >4)
87 casize++;
88 if (casize <3)
89 casize++;
90
91 faces_counter++;
92 for (j = 0; j < face.getSize(); j++)
93 {
94 int vertex_number = face.getVertexAtIndex(j);
95 //cout << texture_number << endl;
96
97 Vertex &vertex = vertexvector[vertex_number];
98 Vector3f vector = vertex.co * tm;
99 Vector3f vector_no = vertex.no * tm;
100 vx_counter++;
101
102 std::ostringstream out_stream;
103 out_stream << vx_counter;
104 switch(j%3){
105 case 0:
106 xNode_face.addAttribute("v1",out_stream.str().c_str());
107 break;
108 case 1:
109 xNode_face.addAttribute("v2",out_stream.str().c_str());
110 break;
111 case 2:
112 xNode_face.addAttribute("v3",out_stream.str().c_str());
113 break;
114 }
115
116 TextureFace &texture_face = texturevector[i];
117 Vector2f &uv = texture_face[j];
118
119 if(vx_counter>vx_counter_max){
120 vx_counter_max = vx_counter;
121
122 XMLNode xNode_normal,xNode_position,xNode_texcoord;
123 xNode_vertex = xNode_vertexbuffer.addChild("vertex");
124 xNode_position = xNode_vertex.addChild("position");
125 xNode_normal = xNode_vertex.addChild("normal");
126
127 std::ostringstream x,y,z,x1,y1,z1,x2,y2;
128 x << vector.x;
129 xNode_position.addAttribute("x",x.str().c_str());
130 y << vector.y;
131 xNode_position.addAttribute("y",y.str().c_str());
132 z << vector.z;
133 xNode_position.addAttribute("z",z.str().c_str());
134
135
136
137 x1 << vector_no.x;
138 xNode_normal.addAttribute("x",x1.str().c_str());
139 y1 << vector_no.y;
140 xNode_normal.addAttribute("y",y1.str().c_str());
141 z1 << vector_no.z;
142 xNode_normal.addAttribute("z",z1.str().c_str());
143
144 xNode_vertex = xNode_vertexbuffer_uv.addChild("vertex");
145 xNode_texcoord = xNode_vertex.addChild("texcoord");
146
147
148 x2 << uv.x;
149 xNode_texcoord.addAttribute("u",x2.str().c_str());
150
151 y2 << uv.y;
152 xNode_texcoord.addAttribute("v",y2.str().c_str());
153
154 }
155 triangle ++;
156 if((j%3)==2 && ( (j+1) != face.getSize()) && triangle == 3){
157 j -= 2;
158 vx_counter -= 2;
159 xNode_face = xNode_faces.addChild("face");
160 triangle = 0;
161 faces_counter++;
162 }
163 }
164
165 }
166 std::ostringstream out_stream,out_stream2;
167 out_stream << faces_counter;
168
169 xNode_faces.addAttribute("count",out_stream.str().c_str());
170
171 out_stream2 << (vx_counter_max + 1);
172 xNode_geometry.addAttribute("vertexcount",out_stream2.str().c_str());
173
174 if (faces_counter == 0)
175 xNodeSubmesh.deleteNodeContent(0);
176 }
177