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