glc_primitivegroup.cpp

Go to the documentation of this file.
00001 /****************************************************************************
00002 
00003  This file is part of the GLC-lib library.
00004  Copyright (C) 2005-2008 Laurent Ribon (laumaya@users.sourceforge.net)
00005  Version 2.0.0 Beta 1, packaged on April 2010.
00006 
00007  http://glc-lib.sourceforge.net
00008 
00009  GLC-lib is free software; you can redistribute it and/or modify
00010  it under the terms of the GNU General Public License as published by
00011  the Free Software Foundation; either version 2 of the License, or
00012  (at your option) any later version.
00013 
00014  GLC-lib is distributed in the hope that it will be useful,
00015  but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  GNU General Public License for more details.
00018 
00019  You should have received a copy of the GNU General Public License
00020  along with GLC-lib; if not, write to the Free Software
00021  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00022 
00023 *****************************************************************************/
00024 
00026 
00027 #include "glc_primitivegroup.h"
00028 #include "../glc_state.h"
00029 
00030 // Class chunk id
00031 quint32 GLC_PrimitiveGroup::m_ChunkId= 0xA700;
00032 
00033 // Default constructor
00034 GLC_PrimitiveGroup::GLC_PrimitiveGroup(GLC_uint materialId)
00035 : m_Id(materialId)
00036 , m_TrianglesIndex()
00037 , m_TrianglesGroupsSizes()
00038 , m_TrianglesGroupOffset()
00039 , m_TrianglesGroupOffseti()
00040 , m_TrianglesId()
00041 , m_StripsIndex()
00042 , m_StripIndexSizes()
00043 , m_StripIndexOffset()
00044 , m_StripIndexOffseti()
00045 , m_StripsId()
00046 , m_FansIndex()
00047 , m_FansIndexSizes()
00048 , m_FanIndexOffset()
00049 , m_FanIndexOffseti()
00050 , m_FansId()
00051 , m_IsFinished(false)
00052 , m_TrianglesIndexSize(0)
00053 , m_TrianglesStripSize(0)
00054 , m_TrianglesFanSize(0)
00055 {
00056 
00057 
00058 }
00060 GLC_PrimitiveGroup::GLC_PrimitiveGroup(const GLC_PrimitiveGroup& group)
00061 : m_Id(group.m_Id)
00062 , m_TrianglesIndex(group.m_TrianglesIndex)
00063 , m_TrianglesGroupsSizes(group.m_TrianglesGroupsSizes)
00064 , m_TrianglesGroupOffset(group.m_TrianglesGroupOffset)
00065 , m_TrianglesGroupOffseti(group.m_TrianglesGroupOffseti)
00066 , m_TrianglesId(group.m_TrianglesId)
00067 , m_StripsIndex(group.m_StripsIndex)
00068 , m_StripIndexSizes(group.m_StripIndexSizes)
00069 , m_StripIndexOffset(group.m_StripIndexOffset)
00070 , m_StripIndexOffseti(group.m_StripIndexOffseti)
00071 , m_StripsId(group.m_StripsId)
00072 , m_FansIndex(group.m_FansIndex)
00073 , m_FansIndexSizes(group.m_FansIndexSizes)
00074 , m_FanIndexOffset(group.m_FanIndexOffset)
00075 , m_FanIndexOffseti(group.m_FanIndexOffseti)
00076 , m_FansId(group.m_FansId)
00077 , m_IsFinished(group.m_IsFinished)
00078 , m_TrianglesIndexSize(group.m_TrianglesIndexSize)
00079 , m_TrianglesStripSize(group.m_TrianglesStripSize)
00080 , m_TrianglesFanSize(group.m_TrianglesFanSize)
00081 {
00082 
00083 
00084 }
00085 
00087 GLC_PrimitiveGroup::GLC_PrimitiveGroup(const GLC_PrimitiveGroup& group, GLC_uint id)
00088 : m_Id(id)
00089 , m_TrianglesIndex(group.m_TrianglesIndex)
00090 , m_TrianglesGroupsSizes(group.m_TrianglesGroupsSizes)
00091 , m_TrianglesGroupOffset(group.m_TrianglesGroupOffset)
00092 , m_TrianglesGroupOffseti(group.m_TrianglesGroupOffseti)
00093 , m_TrianglesId(group.m_TrianglesId)
00094 , m_StripsIndex(group.m_StripsIndex)
00095 , m_StripIndexSizes(group.m_StripIndexSizes)
00096 , m_StripIndexOffset(group.m_StripIndexOffset)
00097 , m_StripIndexOffseti(group.m_StripIndexOffseti)
00098 , m_StripsId(group.m_StripsId)
00099 , m_FansIndex(group.m_FansIndex)
00100 , m_FansIndexSizes(group.m_FansIndexSizes)
00101 , m_FanIndexOffset(group.m_FanIndexOffset)
00102 , m_FanIndexOffseti(group.m_FanIndexOffseti)
00103 , m_FansId(group.m_FansId)
00104 , m_IsFinished(group.m_IsFinished)
00105 , m_TrianglesIndexSize(group.m_TrianglesIndexSize)
00106 , m_TrianglesStripSize(group.m_TrianglesStripSize)
00107 , m_TrianglesFanSize(group.m_TrianglesFanSize)
00108 {
00109 
00110 
00111 }
00112 
00113 // = operator
00114 GLC_PrimitiveGroup& GLC_PrimitiveGroup::operator=(const GLC_PrimitiveGroup& group)
00115 {
00116         if (this != &group)
00117         {
00118                 m_Id= group.m_Id;
00119                 m_TrianglesIndex= group.m_TrianglesIndex;
00120                 m_TrianglesGroupsSizes= group.m_TrianglesGroupsSizes;
00121                 m_TrianglesGroupOffset= group.m_TrianglesGroupOffset;
00122                 m_TrianglesGroupOffseti= group.m_TrianglesGroupOffseti;
00123                 m_TrianglesId= group.m_TrianglesId;
00124                 m_StripsIndex= group.m_StripsIndex;
00125                 m_StripIndexSizes= group.m_StripIndexSizes;
00126                 m_StripIndexOffset= group.m_StripIndexOffset;
00127                 m_StripIndexOffseti= group.m_StripIndexOffseti;
00128                 m_StripsId= group.m_StripsId;
00129                 m_FansIndex= group.m_FansIndex;
00130                 m_FansIndexSizes= group.m_FansIndexSizes;
00131                 m_FanIndexOffset= group.m_FanIndexOffset;
00132                 m_FanIndexOffseti= group.m_FanIndexOffseti;
00133                 m_FansId= group.m_FansId;
00134                 m_IsFinished= group.m_IsFinished;
00135                 m_TrianglesIndexSize= group.m_TrianglesIndexSize;
00136                 m_TrianglesStripSize= group.m_TrianglesStripSize;
00137                 m_TrianglesFanSize= group.m_TrianglesFanSize;
00138         }
00139         return *this;
00140 }
00141 
00142 GLC_PrimitiveGroup::~GLC_PrimitiveGroup()
00143 {
00144 
00145 }
00146 // Return the class Chunk ID
00147 quint32 GLC_PrimitiveGroup::chunckID()
00148 {
00149         return m_ChunkId;
00150 }
00151 
00152 // Add triangles to the group
00153 void GLC_PrimitiveGroup::addTriangles(const IndexList& input, GLC_uint id)
00154 {
00155         m_TrianglesIndex+= input;
00156         m_TrianglesIndexSize= m_TrianglesIndex.size();
00157 
00158         m_TrianglesGroupsSizes.append(static_cast<GLsizei>(input.size()));
00159 
00160         if (m_TrianglesGroupOffseti.isEmpty())
00161         {
00162                 m_TrianglesGroupOffseti.append(0);
00163         }
00164         int offset= m_TrianglesGroupOffseti.last() + m_TrianglesGroupsSizes.last();
00165         m_TrianglesGroupOffseti.append(offset);
00166 
00167         // The Triangles group id
00168         if (0 != id) m_TrianglesId.append(id);
00169         else Q_ASSERT(m_TrianglesId.isEmpty());
00170 }
00171 
00172 // Add triangle strip to the group
00173 void GLC_PrimitiveGroup::addTrianglesStrip(const IndexList& input, GLC_uint id)
00174 {
00175         m_StripsIndex+= input;
00176         m_TrianglesStripSize= m_StripsIndex.size();
00177 
00178         m_StripIndexSizes.append(static_cast<GLsizei>(input.size()));
00179 
00180         if (m_StripIndexOffseti.isEmpty())
00181         {
00182                 m_StripIndexOffseti.append(0);
00183         }
00184         int offset= m_StripIndexOffseti.last() + m_StripIndexSizes.last();
00185         m_StripIndexOffseti.append(offset);
00186 
00187         // The strip id
00188         if (0 != id) m_StripsId.append(id);
00189         else Q_ASSERT(m_StripsId.isEmpty());
00190 }
00191 // Set the triangle index offset
00192 void GLC_PrimitiveGroup::setTrianglesOffset(GLvoid* pOffset)
00193 {
00194         m_TrianglesGroupOffseti.pop_back();
00195         const int size= m_TrianglesGroupOffseti.size();
00196         for (int i= 0; i < size; ++i)
00197         {
00198                 m_TrianglesGroupOffset.append(BUFFER_OFFSET(static_cast<GLsizei>(m_TrianglesGroupOffseti[i]) * sizeof(GLuint) + reinterpret_cast<GLsizeiptr>(pOffset)));
00199         }
00200         m_TrianglesGroupOffseti.clear();
00201 }
00202 
00203 // Set the triangle index offset
00204 void GLC_PrimitiveGroup::setTrianglesOffseti(int offset)
00205 {
00206         m_TrianglesGroupOffseti.pop_back();
00207         const int size= m_TrianglesGroupOffseti.size();
00208         for (int i= 0; i < size; ++i)
00209         {
00210                 m_TrianglesGroupOffseti[i]= m_TrianglesGroupOffseti[i] + offset;
00211         }
00212 }
00213 
00214 // Set base triangle strip offset
00215 void GLC_PrimitiveGroup::setBaseTrianglesStripOffset(GLvoid* pOffset)
00216 {
00217         m_StripIndexOffseti.pop_back();
00218         const int size= m_StripIndexOffseti.size();
00219         for (int i= 0; i < size; ++i)
00220         {
00221                 m_StripIndexOffset.append(BUFFER_OFFSET(static_cast<GLsizei>(m_StripIndexOffseti[i]) * sizeof(GLuint) + reinterpret_cast<GLsizeiptr>(pOffset)));
00222         }
00223         m_StripIndexOffseti.clear();
00224 }
00225 
00226 // Set base triangle strip offset
00227 void GLC_PrimitiveGroup::setBaseTrianglesStripOffseti(int offset)
00228 {
00229         m_StripIndexOffseti.pop_back();
00230         const int size= m_StripIndexOffseti.size();
00231         for (int i= 0; i < size; ++i)
00232         {
00233                 m_StripIndexOffseti[i]= m_StripIndexOffseti[i] + offset;
00234         }
00235 }
00236 
00238 void GLC_PrimitiveGroup::addTrianglesFan(const IndexList& input, GLC_uint id)
00239 {
00240         m_FansIndex+= input;
00241         m_TrianglesFanSize= m_FansIndex.size();
00242 
00243         m_FansIndexSizes.append(static_cast<GLsizei>(input.size()));
00244 
00245         if (m_FanIndexOffseti.isEmpty())
00246         {
00247                 m_FanIndexOffseti.append(0);
00248         }
00249         int offset= m_FanIndexOffseti.last() + m_FansIndexSizes.last();
00250         m_FanIndexOffseti.append(offset);
00251 
00252         // The fan id
00253         if (0 != id) m_FansId.append(id);
00254         else Q_ASSERT(m_FansId.isEmpty());
00255 
00256 
00257 }
00258 
00259 // Set base triangle fan offset
00260 void GLC_PrimitiveGroup::setBaseTrianglesFanOffset(GLvoid* pOffset)
00261 {
00262         m_FanIndexOffseti.pop_back();
00263         const int size= m_FanIndexOffseti.size();
00264         for (int i= 0; i < size; ++i)
00265         {
00266                 m_FanIndexOffset.append(BUFFER_OFFSET(static_cast<GLsizei>(m_FanIndexOffseti[i]) * sizeof(GLuint) + reinterpret_cast<GLsizeiptr>(pOffset)));
00267         }
00268         m_FanIndexOffseti.clear();
00269 }
00270 
00271 // Set base triangle fan offset
00272 void GLC_PrimitiveGroup::setBaseTrianglesFanOffseti(int offset)
00273 {
00274         m_FanIndexOffseti.pop_back();
00275         const int size= m_FanIndexOffseti.size();
00276         for (int i= 0; i < size; ++i)
00277         {
00278                 m_FanIndexOffseti[i]= m_FanIndexOffseti[i] + offset;
00279         }
00280 }
00281 
00282 // Change index to VBO mode
00283 void GLC_PrimitiveGroup::changeToVboMode()
00284 {
00285 
00286         m_TrianglesGroupOffset.clear();
00287         const int triangleOffsetSize= m_TrianglesGroupOffseti.size();
00288         for (int i= 0; i < triangleOffsetSize; ++i)
00289         {
00290                 m_TrianglesGroupOffset.append(BUFFER_OFFSET(static_cast<GLsizei>(m_TrianglesGroupOffseti.at(i)) * sizeof(GLuint)));
00291         }
00292         m_TrianglesGroupOffseti.clear();
00293 
00294         m_StripIndexOffset.clear();
00295         const int stripOffsetSize= m_StripIndexOffseti.size();
00296         for (int i= 0; i < stripOffsetSize; ++i)
00297         {
00298                 m_StripIndexOffset.append(BUFFER_OFFSET(static_cast<GLsizei>(m_StripIndexOffseti.at(i)) * sizeof(GLuint)));
00299         }
00300         m_StripIndexOffseti.clear();
00301 
00302         m_FanIndexOffset.clear();
00303         const int fanOffsetSize= m_FanIndexOffseti.size();
00304         for (int i= 0; i < fanOffsetSize; ++i)
00305         {
00306                 m_FanIndexOffset.append(BUFFER_OFFSET(static_cast<GLsizei>(m_FanIndexOffseti.at(i)) * sizeof(GLuint)));
00307         }
00308         m_FanIndexOffseti.clear();
00309 }
00310 
00311 // Clear the group
00312 void GLC_PrimitiveGroup::clear()
00313 {
00314         m_TrianglesIndex.clear();
00315         m_TrianglesGroupsSizes.clear();
00316         m_TrianglesGroupOffset.clear();
00317         m_TrianglesGroupOffseti.clear();
00318         m_StripsIndex.clear();
00319         m_StripIndexSizes.clear();
00320         m_StripIndexOffset.clear();
00321         m_StripIndexOffseti.clear();
00322         m_FansIndex.clear();
00323         m_FansIndexSizes.clear();
00324         m_FanIndexOffset.clear();
00325         m_FanIndexOffseti.clear();
00326         m_IsFinished= false;
00327         m_TrianglesIndexSize= 0;
00328         m_TrianglesStripSize= 0;
00329         m_TrianglesFanSize= 0;
00330 }
00331 
00332 
00333 // Non Member methods
00334 // Non-member stream operator
00335 QDataStream &operator<<(QDataStream &stream, const GLC_PrimitiveGroup &primitiveGroup)
00336 {
00337         Q_ASSERT(primitiveGroup.isFinished());
00338         quint32 chunckId= GLC_PrimitiveGroup::m_ChunkId;
00339         stream << chunckId;
00340 
00341         // Primitive group id
00342         stream << primitiveGroup.m_Id;
00343 
00344         // Triangles, strips and fan offset index
00345         OffsetVectori trianglesGroupOffseti;
00346         OffsetVectori stripIndexOffseti;
00347         OffsetVectori fanIndexOffseti;
00348 
00349         // Get triangles, strips and fans offset
00350         if (GLC_State::vboUsed())
00351         {
00352                 // Convert offset to index
00353                 // Triangles offset
00354                 const int triangleIndexOffsetSize= primitiveGroup.m_TrianglesGroupOffset.size();
00355                 for (int i= 0; i < triangleIndexOffsetSize; ++i)
00356                 {
00357                         trianglesGroupOffseti.append(static_cast<GLuint>(reinterpret_cast<GLsizeiptr>(primitiveGroup.m_TrianglesGroupOffset.at(i)) / sizeof(GLuint)));
00358                 }
00359 
00360                 // Trips offsets
00361                 const int stripIndexOffsetSize= primitiveGroup.m_StripIndexOffset.size();
00362                 for (int i= 0; i < stripIndexOffsetSize; ++i)
00363                 {
00364                         stripIndexOffseti.append(static_cast<GLuint>(reinterpret_cast<GLsizeiptr>(primitiveGroup.m_StripIndexOffset.at(i)) / sizeof(GLuint)));
00365                 }
00366                 // Fans offsets
00367                 const int fanIndexOffsetSize= primitiveGroup.m_FanIndexOffset.size();
00368                 for (int i= 0; i < fanIndexOffsetSize; ++i)
00369                 {
00370                         fanIndexOffseti.append(static_cast<GLuint>(reinterpret_cast<GLsizeiptr>(primitiveGroup.m_FanIndexOffset.at(i)) / sizeof(GLuint)));
00371                 }
00372         }
00373         else
00374         {
00375                 trianglesGroupOffseti= primitiveGroup.m_TrianglesGroupOffseti;
00376                 stripIndexOffseti= primitiveGroup.m_StripIndexOffseti;
00377                 fanIndexOffseti= primitiveGroup.m_FanIndexOffseti;
00378         }
00379         // Triangles index
00380         stream << primitiveGroup.m_TrianglesIndexSize;
00381         stream << trianglesGroupOffseti;
00382         stream << primitiveGroup.m_TrianglesGroupsSizes;
00383         stream << primitiveGroup.m_TrianglesId;
00384 
00385         // Triangles strips index
00386         stream << primitiveGroup.m_TrianglesStripSize;
00387         stream << stripIndexOffseti;
00388         stream << primitiveGroup.m_StripIndexSizes;
00389         stream << primitiveGroup.m_StripsId;
00390 
00391         // Triangles fans index
00392         stream << primitiveGroup.m_TrianglesFanSize;
00393         stream << fanIndexOffseti;
00394         stream << primitiveGroup.m_FansIndexSizes;
00395         stream << primitiveGroup.m_FansId;
00396 
00397         return stream;
00398 }
00399 QDataStream &operator>>(QDataStream &stream, GLC_PrimitiveGroup &primitiveGroup)
00400 {
00401         quint32 chunckId;
00402         stream >> chunckId;
00403         Q_ASSERT(chunckId == GLC_PrimitiveGroup::m_ChunkId);
00404         stream >> primitiveGroup.m_Id;
00405 
00406         // Triangles index
00407         stream >> primitiveGroup.m_TrianglesIndexSize;
00408         stream >> primitiveGroup.m_TrianglesGroupOffseti;
00409         stream >> primitiveGroup.m_TrianglesGroupsSizes;
00410         stream >> primitiveGroup.m_TrianglesId;
00411 
00412         // Triangles strips index
00413         stream >> primitiveGroup.m_TrianglesStripSize;
00414         stream >> primitiveGroup.m_StripIndexOffseti;
00415         stream >> primitiveGroup.m_StripIndexSizes;
00416         stream >> primitiveGroup.m_StripsId;
00417 
00418         // Triangles fans index
00419         stream >> primitiveGroup.m_TrianglesFanSize;
00420         stream >> primitiveGroup.m_FanIndexOffseti;
00421         stream >> primitiveGroup.m_FansIndexSizes;
00422         stream >> primitiveGroup.m_FansId;
00423 
00424 
00425         primitiveGroup.finish();
00426 
00427         return stream;
00428 }
00429 

SourceForge.net Logo

©2005 Laurent Ribon