00001
00002 #include "TriangleData.h"
00003 #include "TrimeshShape.h"
00004
00005 namespace vrsode
00006 {
00007
00008 TriangleData::TriangleData(unsigned int p_vCount, unsigned int p_iCount)
00009 {
00010 m_activeDataPool = 1;
00011
00012 m_callbackFunction = 0;
00013 m_callbackShape = 0;
00014
00015 m_vertexArraySize[0] = p_vCount * 3;
00016 m_vertexArraySize[1] = 0;
00017
00018 m_indexArraySize[0] = p_iCount;
00019 m_indexArraySize[1] = 0;
00020
00021 m_vertexArrayFill[0] = 0;
00022 m_vertexArrayFill[1] = 0;
00023
00024 m_indexArrayFill[0] = 0;
00025 m_indexArrayFill[1] = 0;
00026
00027 m_vertexArray[0] = (VO_TRIMESH_COORD_TYPE*)
00028 malloc(sizeof(VO_TRIMESH_COORD_TYPE) * m_vertexArraySize[0]);
00029 assert(m_vertexArray[0]);
00030
00031 m_indexArray[0] = (VO_TRIMESH_INDEX_TYPE*)
00032 malloc(sizeof(VO_TRIMESH_INDEX_TYPE) * m_indexArraySize[0]);
00033 assert(m_indexArray[0]);
00034
00035 m_vertexArray[1] = 0;
00036 m_indexArray[1] = 0;
00037 }
00038
00039 TriangleData::~TriangleData()
00040 {
00041 free(m_vertexArray[m_activeDataPool]);
00042 free(m_indexArray[m_activeDataPool]);
00043 }
00044
00045 void
00046 TriangleData::addVertex(VRS::Vector3Base<VO_TRIMESH_COORD_TYPE> p_vertex)
00047 {
00048 addVertex(p_vertex[0], p_vertex[1], p_vertex[2]);
00049 }
00050
00051 void
00052 TriangleData::addVertex(VO_TRIMESH_COORD_TYPE p_x,
00053 VO_TRIMESH_COORD_TYPE p_y,
00054 VO_TRIMESH_COORD_TYPE p_z)
00055 {
00056 assert(m_vertexArrayFill[!m_activeDataPool] + 3
00057 <= m_vertexArraySize[!m_activeDataPool]);
00058
00059 m_vertexArray[!m_activeDataPool]
00060 [m_vertexArrayFill[!m_activeDataPool]++] = p_x;
00061 m_vertexArray[!m_activeDataPool]
00062 [m_vertexArrayFill[!m_activeDataPool]++] = p_y;
00063 m_vertexArray[!m_activeDataPool]
00064 [m_vertexArrayFill[!m_activeDataPool]++] = p_z;
00065 }
00066
00067 void
00068 TriangleData::addIndex(VRS::Vector3Base<VO_TRIMESH_INDEX_TYPE> p_index)
00069 {
00070 addIndex(p_index[0], p_index[1], p_index[2]);
00071 }
00072
00073 void
00074 TriangleData::addIndex(VO_TRIMESH_INDEX_TYPE p_1,
00075 VO_TRIMESH_INDEX_TYPE p_2,
00076 VO_TRIMESH_INDEX_TYPE p_3)
00077 {
00078 assert(m_indexArrayFill[!m_activeDataPool] + 3
00079 <= m_indexArraySize[!m_activeDataPool]);
00080
00081 m_indexArray[!m_activeDataPool]
00082 [m_indexArrayFill[!m_activeDataPool]++] = p_1;
00083 m_indexArray[!m_activeDataPool]
00084 [m_indexArrayFill[!m_activeDataPool]++] = p_2;
00085 m_indexArray[!m_activeDataPool]
00086 [m_indexArrayFill[!m_activeDataPool]++] = p_3;
00087 }
00088
00089 void
00090 TriangleData::addTriangle(VRS::Vector3Base<VO_TRIMESH_COORD_TYPE> p_1,
00091 VRS::Vector3Base<VO_TRIMESH_COORD_TYPE> p_2,
00092 VRS::Vector3Base<VO_TRIMESH_COORD_TYPE> p_3)
00093 {
00094 unsigned int firstIndex = m_vertexArrayFill[!m_activeDataPool] / 3;
00095
00096 addVertex(p_1);
00097 addVertex(p_2);
00098 addVertex(p_3);
00099
00100 addIndex(firstIndex, firstIndex + 1, firstIndex + 2);
00101 }
00102
00103 void
00104 TriangleData::addTriangle(VO_TRIMESH_COORD_TYPE p_11,
00105 VO_TRIMESH_COORD_TYPE p_12, VO_TRIMESH_COORD_TYPE p_13,
00106 VO_TRIMESH_COORD_TYPE p_21,
00107 VO_TRIMESH_COORD_TYPE p_22, VO_TRIMESH_COORD_TYPE p_23,
00108 VO_TRIMESH_COORD_TYPE p_31,
00109 VO_TRIMESH_COORD_TYPE p_32, VO_TRIMESH_COORD_TYPE p_33)
00110 {
00111 addTriangle(
00112 VRS::Vector3Base<VO_TRIMESH_COORD_TYPE>(p_11, p_12, p_13),
00113 VRS::Vector3Base<VO_TRIMESH_COORD_TYPE>(p_21, p_22, p_23),
00114 VRS::Vector3Base<VO_TRIMESH_COORD_TYPE>(p_31, p_32, p_33));
00115 }
00116
00117 void
00118 TriangleData::addQuad(VRS::Vector3Base<VO_TRIMESH_COORD_TYPE> p_1,
00119 VRS::Vector3Base<VO_TRIMESH_COORD_TYPE> p_2,
00120 VRS::Vector3Base<VO_TRIMESH_COORD_TYPE> p_3,
00121 VRS::Vector3Base<VO_TRIMESH_COORD_TYPE> p_4)
00122 {
00123
00124 addTriangle(p_1, p_2, p_3);
00125 addTriangle(p_1, p_3, p_4);
00126 }
00127
00128 void
00129 TriangleData::addQuad(VO_TRIMESH_COORD_TYPE p_11, VO_TRIMESH_COORD_TYPE p_12,
00130 VO_TRIMESH_COORD_TYPE p_13,
00131 VO_TRIMESH_COORD_TYPE p_21, VO_TRIMESH_COORD_TYPE p_22,
00132 VO_TRIMESH_COORD_TYPE p_23,
00133 VO_TRIMESH_COORD_TYPE p_31, VO_TRIMESH_COORD_TYPE p_32,
00134 VO_TRIMESH_COORD_TYPE p_33,
00135 VO_TRIMESH_COORD_TYPE p_41, VO_TRIMESH_COORD_TYPE p_42,
00136 VO_TRIMESH_COORD_TYPE p_43)
00137 {
00138
00139 addTriangle(p_11, p_12, p_13, p_21, p_22, p_23, p_31, p_32, p_33);
00140 addTriangle(p_11, p_12, p_13, p_31, p_32, p_33, p_41, p_42, p_43);
00141 }
00142
00143 VO_TRIMESH_COORD_TYPE*
00144 TriangleData::vertexArray()
00145 {
00146 return m_vertexArray[m_activeDataPool];
00147 }
00148
00149 VO_TRIMESH_INDEX_TYPE*
00150 TriangleData::indexArray()
00151 {
00152 return m_indexArray[m_activeDataPool];
00153 }
00154
00155 unsigned int
00156 TriangleData::vertexCount() const
00157 {
00158 return m_vertexArrayFill[m_activeDataPool] / 3;
00159 }
00160
00161 unsigned int
00162 TriangleData::indexCount() const
00163 {
00164 return m_indexArrayFill[m_activeDataPool];
00165 }
00166
00167 unsigned int
00168 TriangleData::triangleCount() const
00169 {
00170 return m_indexArrayFill[m_activeDataPool] / 3;
00171 }
00172
00173
00174 const std::vector<VRS::Vector3Base<double> >
00175 TriangleData::explicitVertexList() const
00176 {
00177 std::vector<VRS::Vector3Base<double> > pureVertexList;
00178
00179 for(unsigned int index = 0; index < indexCount(); index++)
00180 pureVertexList.push_back(
00181 VRS::Vector3Base<double>(
00182 (double)m_vertexArray[m_activeDataPool]
00183 [m_indexArray[m_activeDataPool][index] * 3 + 0],
00184 (double)m_vertexArray[m_activeDataPool]
00185 [m_indexArray[m_activeDataPool][index] * 3 + 1],
00186 (double)m_vertexArray[m_activeDataPool]
00187 [m_indexArray[m_activeDataPool][index] * 3 + 2]));
00188
00189 return pureVertexList;
00190 }
00191
00192 const std::vector<VRS::Vector3Base<double> >
00193 TriangleData::explicitVertexListForLines() const
00194 {
00195 std::vector<VRS::Vector3Base<double> > pureVertexList;
00196
00197 for(unsigned int index = 0; index < indexCount(); index += 3)
00198 {
00199 pureVertexList.push_back(
00200 VRS::Vector3Base<double>(
00201 (double)m_vertexArray[m_activeDataPool]
00202 [m_indexArray[m_activeDataPool][index] * 3 + 0],
00203 (double)m_vertexArray[m_activeDataPool]
00204 [m_indexArray[m_activeDataPool][index] * 3 + 1],
00205 (double)m_vertexArray[m_activeDataPool]
00206 [m_indexArray[m_activeDataPool][index] * 3 + 2]));
00207 pureVertexList.push_back(
00208 VRS::Vector3Base<double>(
00209 (double)m_vertexArray[m_activeDataPool]
00210 [m_indexArray[m_activeDataPool][index+1] * 3 + 0],
00211 (double)m_vertexArray[m_activeDataPool]
00212 [m_indexArray[m_activeDataPool][index+1] * 3 + 1],
00213 (double)m_vertexArray[m_activeDataPool]
00214 [m_indexArray[m_activeDataPool][index+1] * 3 + 2]));
00215 pureVertexList.push_back(
00216 VRS::Vector3Base<double>(
00217 (double)m_vertexArray[m_activeDataPool]
00218 [m_indexArray[m_activeDataPool][index] * 3 + 0],
00219 (double)m_vertexArray[m_activeDataPool]
00220 [m_indexArray[m_activeDataPool][index] * 3 + 1],
00221 (double)m_vertexArray[m_activeDataPool]
00222 [m_indexArray[m_activeDataPool][index] * 3 + 2]));
00223 pureVertexList.push_back(
00224 VRS::Vector3Base<double>(
00225 (double)m_vertexArray[m_activeDataPool]
00226 [m_indexArray[m_activeDataPool][index+2] * 3 + 0],
00227 (double)m_vertexArray[m_activeDataPool]
00228 [m_indexArray[m_activeDataPool][index+2] * 3 + 1],
00229 (double)m_vertexArray[m_activeDataPool]
00230 [m_indexArray[m_activeDataPool][index+2] * 3 + 2]));
00231 pureVertexList.push_back(
00232 VRS::Vector3Base<double>(
00233 (double)m_vertexArray[m_activeDataPool]
00234 [m_indexArray[m_activeDataPool][index+1] * 3 + 0],
00235 (double)m_vertexArray[m_activeDataPool]
00236 [m_indexArray[m_activeDataPool][index+1] * 3 + 1],
00237 (double)m_vertexArray[m_activeDataPool]
00238 [m_indexArray[m_activeDataPool][index+1] * 3 + 2]));
00239 pureVertexList.push_back(
00240 VRS::Vector3Base<double>(
00241 (double)m_vertexArray[m_activeDataPool]
00242 [m_indexArray[m_activeDataPool][index+2] * 3 + 0],
00243 (double)m_vertexArray[m_activeDataPool]
00244 [m_indexArray[m_activeDataPool][index+2] * 3 + 1],
00245 (double)m_vertexArray[m_activeDataPool]
00246 [m_indexArray[m_activeDataPool][index+2] * 3 + 2]));
00247 }
00248
00249 return pureVertexList;
00250 }
00251
00252 unsigned int
00253 TriangleData::sizeOfVertexStride()
00254 {
00255 return 3 * sizeof(VO_TRIMESH_COORD_TYPE);
00256 }
00257
00258 unsigned int
00259 TriangleData::sizeOfTriangleStride()
00260 {
00261 return 3 * sizeof(VO_TRIMESH_INDEX_TYPE);
00262 }
00263
00264 void
00265 TriangleData::setGeometryChangeCallback(VRS::SO<TrimeshShape> p_shape,
00266 void (TrimeshShape::*p_function)())
00267 {
00268 m_callbackShape = p_shape;
00269 m_callbackFunction = p_function;
00270 }
00271
00272 void
00273 TriangleData::reportGeometryChange()
00274 {
00275 if(m_callbackShape && m_callbackFunction)
00276 (m_callbackShape->*m_callbackFunction)();
00277 }
00278
00279 void
00280 TriangleData::initDataUpdate(unsigned int p_vCount, unsigned int p_iCount)
00281 {
00282 cleanInactivePool();
00283 m_vertexArraySize[!m_activeDataPool] = p_vCount * 3;
00284 m_indexArraySize[!m_activeDataPool] = p_iCount;
00285
00286 m_vertexArrayFill[!m_activeDataPool] = 0;
00287 m_indexArrayFill[!m_activeDataPool] = 0;
00288
00289 m_vertexArray[!m_activeDataPool] = (VO_TRIMESH_COORD_TYPE*)
00290 malloc(sizeof(VO_TRIMESH_COORD_TYPE) *
00291 m_vertexArraySize[!m_activeDataPool]);
00292 assert(m_vertexArray[!m_activeDataPool]);
00293
00294 m_indexArray[!m_activeDataPool] = (VO_TRIMESH_INDEX_TYPE*)
00295 malloc(sizeof(VO_TRIMESH_INDEX_TYPE) *
00296 m_indexArraySize[!m_activeDataPool]);
00297 assert(m_indexArray[!m_activeDataPool]);
00298 }
00299
00300 void
00301 TriangleData::initDataUpdateKeepCurrent()
00302 {
00303 initDataUpdate(m_vertexArraySize[m_activeDataPool] / 3,
00304 m_indexArraySize[m_activeDataPool]);
00305
00306 memcpy(m_vertexArray[!m_activeDataPool],
00307 m_vertexArray[m_activeDataPool],
00308 m_vertexArraySize[m_activeDataPool] *
00309 sizeof(VO_TRIMESH_COORD_TYPE));
00310
00311 memcpy(m_indexArray[!m_activeDataPool],
00312 m_indexArray[m_activeDataPool],
00313 m_indexArraySize[m_activeDataPool] *
00314 sizeof(VO_TRIMESH_INDEX_TYPE));
00315
00316 m_vertexArrayFill[!m_activeDataPool] = m_vertexArrayFill[m_activeDataPool];
00317 m_indexArrayFill[!m_activeDataPool] = m_indexArrayFill[m_activeDataPool];
00318 }
00319
00320 void
00321 TriangleData::cleanInactivePool()
00322 {
00323 if(m_vertexArray[!m_activeDataPool])
00324 free(m_vertexArray[!m_activeDataPool]);
00325
00326 if(m_indexArray[!m_activeDataPool])
00327 free(m_indexArray[!m_activeDataPool]);
00328
00329 m_vertexArray[!m_activeDataPool] = 0;
00330 m_indexArray[!m_activeDataPool] = 0;
00331 m_vertexArraySize[!m_activeDataPool] = 0;
00332 m_indexArraySize[!m_activeDataPool] = 0;
00333 m_vertexArrayFill[!m_activeDataPool] = 0;
00334 m_indexArrayFill[!m_activeDataPool] = 0;
00335 }
00336
00337 void
00338 TriangleData::rollbackDataUpdate()
00339 {
00340 cleanInactivePool();
00341 }
00342
00343 void
00344 TriangleData::commitDataUpdate()
00345 {
00346 m_activeDataPool = !m_activeDataPool;
00347 reportGeometryChange();
00348 cleanInactivePool();
00349 }
00350
00351 VO_TRIMESH_COORD_TYPE*
00352 TriangleData::uncommittedVertexArray()
00353 {
00354 return m_vertexArray[!m_activeDataPool];
00355 }
00356
00357 VO_TRIMESH_INDEX_TYPE*
00358 TriangleData::uncommittedIndexArray()
00359 {
00360 return m_indexArray[!m_activeDataPool];
00361 }
00362
00363 void
00364 TriangleData::dump()
00365 {
00366 std::cout << "Vertex Array Dump for TriangleData " << this << std::endl;
00367
00368 for(unsigned int i = 0; i < vertexCount() * 3; i += 3)
00369 std::cout << "Vertex " << i / 3 << ": "
00370 << m_vertexArray[m_activeDataPool][i+0] << " "
00371 << m_vertexArray[m_activeDataPool][i+1] << " "
00372 << m_vertexArray[m_activeDataPool][i+2] << " " << std::endl;
00373
00374 std::cout << std::endl;
00375 }
00376
00377 void
00378 TriangleData::createDebugCube()
00379 {
00380
00381 addVertex(-1, -1, -1);
00382 addVertex(-1, -1, 1);
00383 addVertex(-1, 1, -1);
00384 addVertex(-1, 1, 1);
00385 addVertex( 1, -1, -1);
00386 addVertex( 1, -1, 1);
00387 addVertex( 1, 1, -1);
00388 addVertex( 1, 1, 1);
00389
00390
00391 addIndex(0, 1, 2);
00392 addIndex(1, 2, 3);
00393 addIndex(4, 5, 6);
00394 addIndex(5, 6, 7);
00395 addIndex(1, 3, 5);
00396 addIndex(3, 5, 7);
00397 addIndex(0, 2, 4);
00398 addIndex(2, 4, 6);
00399 addIndex(0, 1, 4);
00400 addIndex(1, 4, 5);
00401 addIndex(2, 3, 6);
00402 addIndex(3, 6, 7);
00403 }
00404
00405 void
00406 TriangleData::createDebugThing()
00407 {
00408 addVertex(-3,-3,-3);
00409 addVertex( 0, 0, 3);
00410 addVertex( 0, 3, 3);
00411 addVertex( 3, 3, 3);
00412 addVertex( 0, 0,-3);
00413 addVertex( 0,-3,-3);
00414 addVertex( 0, 0, 0);
00415
00416 addIndex(6,1,2);
00417 addIndex(1,2,3);
00418 addIndex(6,1,3);
00419 addIndex(6,2,3);
00420 addIndex(6,4,5);
00421 addIndex(4,5,0);
00422 addIndex(6,4,0);
00423 addIndex(6,5,0);
00424 }
00425
00426 void
00427 TriangleData::setIndexArrayFill(unsigned int p_fill)
00428 {
00429 m_indexArrayFill[!m_activeDataPool] = p_fill;
00430 }
00431
00432 void
00433 TriangleData::setVertexArrayFill(unsigned int p_fill)
00434 {
00435 m_vertexArrayFill[!m_activeDataPool] = p_fill * 3;
00436 }
00437
00438 }