00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00026
00027 #include "glc_primitivegroup.h"
00028 #include "../glc_state.h"
00029
00030
00031 quint32 GLC_PrimitiveGroup::m_ChunkId= 0xA700;
00032
00033
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
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
00147 quint32 GLC_PrimitiveGroup::chunckID()
00148 {
00149 return m_ChunkId;
00150 }
00151
00152
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
00168 if (0 != id) m_TrianglesId.append(id);
00169 else Q_ASSERT(m_TrianglesId.isEmpty());
00170 }
00171
00172
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
00188 if (0 != id) m_StripsId.append(id);
00189 else Q_ASSERT(m_StripsId.isEmpty());
00190 }
00191
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
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
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
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
00253 if (0 != id) m_FansId.append(id);
00254 else Q_ASSERT(m_FansId.isEmpty());
00255
00256
00257 }
00258
00259
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
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
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
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
00334
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
00342 stream << primitiveGroup.m_Id;
00343
00344
00345 OffsetVectori trianglesGroupOffseti;
00346 OffsetVectori stripIndexOffseti;
00347 OffsetVectori fanIndexOffseti;
00348
00349
00350 if (GLC_State::vboUsed())
00351 {
00352
00353
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
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
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
00380 stream << primitiveGroup.m_TrianglesIndexSize;
00381 stream << trianglesGroupOffseti;
00382 stream << primitiveGroup.m_TrianglesGroupsSizes;
00383 stream << primitiveGroup.m_TrianglesId;
00384
00385
00386 stream << primitiveGroup.m_TrianglesStripSize;
00387 stream << stripIndexOffseti;
00388 stream << primitiveGroup.m_StripIndexSizes;
00389 stream << primitiveGroup.m_StripsId;
00390
00391
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
00407 stream >> primitiveGroup.m_TrianglesIndexSize;
00408 stream >> primitiveGroup.m_TrianglesGroupOffseti;
00409 stream >> primitiveGroup.m_TrianglesGroupsSizes;
00410 stream >> primitiveGroup.m_TrianglesId;
00411
00412
00413 stream >> primitiveGroup.m_TrianglesStripSize;
00414 stream >> primitiveGroup.m_StripIndexOffseti;
00415 stream >> primitiveGroup.m_StripIndexSizes;
00416 stream >> primitiveGroup.m_StripsId;
00417
00418
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