vrsode/src/TriangleData.cpp

Go to the documentation of this file.
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     // FIXME: share vertices
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     // FIXME: use delegation here or above
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     // 8 vertices
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     // 12 triangles
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 }

Generated on Fri May 11 21:01:58 2007 for Random Racer by  doxygen 1.5.1