Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/mount_points/src/lib/graphics/importer/static_model.cc @ 10302

Last change on this file since 10302 was 10302, checked in by patrick, 17 years ago

even more performance saved now, since the obb tree doesn't get build every time

File size: 8.2 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14
15   2005-07-06: (Patrick) added new function buildTriangleList()
16*/
17
18#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_IMPORTER
19
20#include "static_model.h"
21
22#include "debug.h"
23#include <stdarg.h>
24
25
26
27
28/////////////
29/// MODEL ///
30/////////////
31ObjectListDefinition(StaticModel);
32
33/**
34 * @brief Creates a 3D-Model.
35 *
36 * assigns it a Name and a Type
37 */
38StaticModel::StaticModel(const std::string& modelName)
39    : data(new StaticModelData(modelName))
40{
41  this->registerObject(this, StaticModel::_objectList);
42  PRINTF(4)("new 3D-Model is being created\n");
43  this->setName(modelName);
44}
45
46StaticModel::StaticModel(const StaticModel& staticModel)
47    : data(staticModel.data)
48{
49  this->registerObject(this, StaticModel::_objectList);
50  this->setName(staticModel.getName());
51  this->updateBase();
52}
53
54
55/**
56 * @brief deletes an Model.
57 *
58 * Looks if any from model allocated space is still in use, and if so deleted it.
59 */
60StaticModel::~StaticModel()
61{
62  PRINTF(4)("Deleting Model ");
63
64  // mark this stuff as beeing deleted
65  this->pModelInfo.pVertices = NULL;
66  this->pModelInfo.pNormals = NULL;
67  this->pModelInfo.pTexCoor = NULL;
68  this->pModelInfo.pTriangles = NULL;
69}
70
71StaticModel& StaticModel::operator=(const StaticModel& model)
72{
73  this->data = model.data;
74  this->updateBase();
75  return *this;
76};
77
78
79/**
80 * @brief Finalizes an Object. This can be done outside of the Class.
81 */
82void StaticModel::finalize()
83{
84  data->finalize();
85  this->updateBase();
86}
87
88void StaticModel::acquireData(const StaticModelData::Pointer& data)
89{
90  this->data = data;
91  this->updateBase();
92}
93
94
95
96/**
97 * extract the mount points from this file: looking at each group and checking if the group realy is a mountpoint marker
98 * if so get place and orientation
99 */
100void StaticModel::extractMountPoints()
101{
102
103  // go through all groups and check if they are mounts
104  std::vector<StaticModelData::Group>::const_iterator groupIt = this->data->getGroups().begin();
105  for( ; groupIt != this->data->getGroups().end(); groupIt++)
106  {
107    //PRINTF(0)("Found a MountPoint: %s\n", groupName.c_str());
108
109    // get the name of this group and check if it's a mout point identifier
110    std::string groupName = (*groupIt).name;
111    std::vector<Vector> vertices;
112
113    // check if the name has a "MP" prefix or else it won't work
114    if( groupName.find("MP.", 0) == std::string::npos)
115      continue;
116
117
118    PRINTF(0)("Found a MountPoint: %s\n", groupName.c_str());
119
120    // now check if it is a mount point identifier
121    if( (*groupIt)._faces.size() != 6)
122    {
123      PRINTF(1)("the face count of %s is wrong, perhaps you missnamed this object or used the wrong mount point object (got %i faces)\n",
124                groupName.c_str(), (*groupIt)._faces.size());
125    }
126
127    // now extract the direction from the length:
128    std::vector<StaticModelData::Face>::const_iterator faceIt = (*groupIt)._faces.begin();
129    for( ; faceIt < (*groupIt)._faces.end(); faceIt++)
130    {
131      // now go through all modelfaceelements
132      std::vector<StaticModelData::FaceElement>::const_iterator faceElementIt = (*faceIt)._elements.begin();
133      for( ; faceElementIt < (*faceIt)._elements.end(); faceElementIt++)
134      {
135        int vert = (*faceElementIt).vertexNumber;
136        vertices.push_back(Vector(this->data->getVertices()[vert*3],
137                                  this->data->getVertices()[vert*3 + 1],
138                                  this->data->getVertices()[vert*3 + 2]));
139      }
140    }
141
142    // vertex with the max surrounding faces is the up-point (pyramid like object)
143    std::vector<Vector>::const_iterator it = vertices.begin();
144    Vector tmpPoint;
145    int tmpCount;
146    Vector up;
147    int maxCount = 0;
148    for( ; it < vertices.end(); it++)
149    {
150      tmpCount = 0;
151      tmpPoint = (*it);
152      //
153      std::vector<Vector>::const_iterator it2 = vertices.begin();
154      for( ; it2 < vertices.end(); it2++)
155        if( tmpPoint == *it2)
156          tmpCount++;
157
158      // if this is the vertex with the most surrounding vertices
159      if( tmpCount > maxCount)
160      {
161        up = tmpPoint;
162        maxCount = tmpCount;
163      }
164    }
165
166
167
168
169    // now get the center of the object
170    Vector center;
171    it = vertices.begin();
172    for( ; it < vertices.end(); it++)
173      center += (*it);
174    // scale
175    center /= vertices.size();
176
177//     PRINTF(0)("Up Point\n");
178//     up.debug();
179//
180//     PRINTF(0)("Center\n");
181//     center.debug();
182//
183//     PRINTF(0)("Forward\n");
184//     forward.debug();
185
186    // now add the mount point
187    this->addMountPoint( up, forward, center, groupName);
188  }
189}
190
191
192
193/**
194 * @brief adds a new Face
195 * @param faceElemCount the number of Vertices to add to the Face.
196 * @param type The information Passed with each Vertex
197*/
198bool StaticModel::addFace(int faceElemCount, VERTEX_FORMAT type, ...)
199{
200  va_list itemlist;
201  va_start (itemlist, type);
202  bool retVal = this->data->addFace(faceElemCount, type, itemlist);
203  va_end(itemlist);
204  return retVal;
205}
206
207void StaticModel::updateBase()
208{
209  // write out the modelInfo data used for the collision detection!
210  this->pModelInfo.pVertices = &this->data->getVertices()[0];
211  this->pModelInfo.numVertices = this->data->getVertices().size();
212  this->pModelInfo.pNormals = &this->data->getNormals()[0];
213  this->pModelInfo.numNormals = this->data->getNormals().size();
214  this->pModelInfo.pTexCoor = &this->data->getTexCoords()[0];
215  this->pModelInfo.numTexCoor = this->data->getTexCoords().size();
216
217  this->pModelInfo.pTriangles = this->data->getTrianglesExt();
218  this->pModelInfo.numTriangles = this->data->getTriangles().size();
219}
220
221
222/**
223 *  Includes a default model
224 *
225 * This will inject a Cube, because this is the most basic model.
226 */
227void StaticModel::cubeModel()
228{
229  this->addVertex (-0.5, -0.5, 0.5);
230  this->addVertex (0.5, -0.5, 0.5);
231  this->addVertex (-0.5, 0.5, 0.5);
232  this->addVertex (0.5, 0.5, 0.5);
233  this->addVertex (-0.5, 0.5, -0.5);
234  this->addVertex (0.5, 0.5, -0.5);
235  this->addVertex (-0.5, -0.5, -0.5);
236  this->addVertex (0.5, -0.5, -0.5);
237
238  this->addVertexTexture (0.0, 0.0);
239  this->addVertexTexture (1.0, 0.0);
240  this->addVertexTexture (0.0, 1.0);
241  this->addVertexTexture (1.0, 1.0);
242  this->addVertexTexture (0.0, 2.0);
243  this->addVertexTexture (1.0, 2.0);
244  this->addVertexTexture (0.0, 3.0);
245  this->addVertexTexture (1.0, 3.0);
246  this->addVertexTexture (0.0, 4.0);
247  this->addVertexTexture (1.0, 4.0);
248  this->addVertexTexture (2.0, 0.0);
249  this->addVertexTexture (2.0, 1.0);
250  this->addVertexTexture (-1.0, 0.0);
251  this->addVertexTexture (-1.0, 1.0);
252
253  this->addVertexNormal (0.0, 0.0, 1.0);
254  this->addVertexNormal (0.0, 0.0, 1.0);
255  this->addVertexNormal (0.0, 0.0, 1.0);
256  this->addVertexNormal (0.0, 0.0, 1.0);
257  this->addVertexNormal (0.0, 1.0, 0.0);
258  this->addVertexNormal (0.0, 1.0, 0.0);
259  this->addVertexNormal (0.0, 1.0, 0.0);
260  this->addVertexNormal (0.0, 1.0, 0.0);
261  this->addVertexNormal (0.0, 0.0, -1.0);
262  this->addVertexNormal (0.0, 0.0, -1.0);
263  this->addVertexNormal (0.0, 0.0, -1.0);
264  this->addVertexNormal (0.0, 0.0, -1.0);
265  this->addVertexNormal (0.0, -1.0, 0.0);
266  this->addVertexNormal (0.0, -1.0, 0.0);
267  this->addVertexNormal (0.0, -1.0, 0.0);
268  this->addVertexNormal (0.0, -1.0, 0.0);
269  this->addVertexNormal (1.0, 0.0, 0.0);
270  this->addVertexNormal (1.0, 0.0, 0.0);
271  this->addVertexNormal (1.0, 0.0, 0.0);
272  this->addVertexNormal (1.0, 0.0, 0.0);
273  this->addVertexNormal (-1.0, 0.0, 0.0);
274  this->addVertexNormal (-1.0, 0.0, 0.0);
275  this->addVertexNormal (-1.0, 0.0, 0.0);
276  this->addVertexNormal (-1.0, 0.0, 0.0);
277
278  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 0,0,0, 1,1,1, 3,3,2, 2,2,3);
279  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,2,4, 3,3,5, 5,5,6, 4,4,7);
280  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 4,4,8, 5,5,9, 7,7,10, 6,6,11);
281  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,6,12, 7,7,13, 1,9,14, 0,8,15);
282  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,1,16, 7,10,17, 5,11,18, 3,3,19);
283  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,12,20, 0,0,21, 2,2,22, 4,13,23);
284}
Note: See TracBrowser for help on using the repository browser.