00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00025 #include "glc_primitivegroup.h"
00026 #include "../glc_state.h"
00027
00028
00029 quint32 GLC_PrimitiveGroup::m_ChunkId= 0xA700;
00030
00031
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
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
00145 quint32 GLC_PrimitiveGroup::chunckID()
00146 {
00147 return m_ChunkId;
00148 }
00149
00150
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
00166 if (0 != id) m_TrianglesId.append(id);
00167 else Q_ASSERT(m_TrianglesId.isEmpty());
00168 }
00169
00170
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
00186 if (0 != id) m_StripsId.append(id);
00187 else Q_ASSERT(m_StripsId.isEmpty());
00188 }
00189
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
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
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
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
00251 if (0 != id) m_FansId.append(id);
00252 else Q_ASSERT(m_FansId.isEmpty());
00253
00254
00255 }
00256
00257
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
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
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
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
00332
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
00340 stream << primitiveGroup.m_Id;
00341
00342
00343 OffsetVectori trianglesGroupOffseti;
00344 OffsetVectori stripIndexOffseti;
00345 OffsetVectori fanIndexOffseti;
00346
00347
00348 if (GLC_State::vboUsed())
00349 {
00350
00351
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
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
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
00378 stream << primitiveGroup.m_TrianglesIndexSize;
00379 stream << trianglesGroupOffseti;
00380 stream << primitiveGroup.m_TrianglesGroupsSizes;
00381 stream << primitiveGroup.m_TrianglesId;
00382
00383
00384 stream << primitiveGroup.m_TrianglesStripSize;
00385 stream << stripIndexOffseti;
00386 stream << primitiveGroup.m_StripIndexSizes;
00387 stream << primitiveGroup.m_StripsId;
00388
00389
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
00405 stream >> primitiveGroup.m_TrianglesIndexSize;
00406 stream >> primitiveGroup.m_TrianglesGroupOffseti;
00407 stream >> primitiveGroup.m_TrianglesGroupsSizes;
00408 stream >> primitiveGroup.m_TrianglesId;
00409
00410
00411 stream >> primitiveGroup.m_TrianglesStripSize;
00412 stream >> primitiveGroup.m_StripIndexOffseti;
00413 stream >> primitiveGroup.m_StripIndexSizes;
00414 stream >> primitiveGroup.m_StripsId;
00415
00416
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