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

SourceForge.net Logo

©2005-2011 Laurent Ribon