glc_lod.cpp
Go to the documentation of this file.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
00028 #include "glc_lod.h"
00029
00030
00031 quint32 GLC_Lod::m_ChunkId= 0xA708;
00032
00033
00034 GLC_Lod::GLC_Lod()
00035 : m_Accuracy(0.0)
00036 , m_IboId(0)
00037 , m_IndexVector()
00038 , m_IndexSize(0)
00039 {
00040
00041 }
00042
00043
00044 GLC_Lod::GLC_Lod(double accuracy)
00045 : m_Accuracy(accuracy)
00046 , m_IboId(0)
00047 , m_IndexVector()
00048 , m_IndexSize(0)
00049 {
00050
00051 }
00052
00053
00054 GLC_Lod::GLC_Lod(const GLC_Lod& lod)
00055 : m_Accuracy(lod.m_Accuracy)
00056 , m_IboId(0)
00057 , m_IndexVector(lod.indexVector())
00058 , m_IndexSize(lod.m_IndexSize)
00059 {
00060
00061
00062 }
00063
00064
00065 GLC_Lod& GLC_Lod::operator=(const GLC_Lod& lod)
00066 {
00067 if (this != &lod)
00068 {
00069 m_Accuracy= lod.m_Accuracy;
00070 m_IboId= 0;
00071 m_IndexVector= lod.indexVector();
00072 m_IndexSize= lod.m_IndexSize;
00073 }
00074
00075 return *this;
00076 }
00077
00078 GLC_Lod::~GLC_Lod()
00079 {
00080
00081 if (0 != m_IboId)
00082 {
00083 glDeleteBuffers(1, &m_IboId);
00084 }
00085 }
00086
00088
00090
00091 quint32 GLC_Lod::chunckID()
00092 {
00093 return m_ChunkId;
00094 }
00095
00096
00097 QVector<GLuint> GLC_Lod::indexVector() const
00098 {
00099 if (0 != m_IboId)
00100 {
00101
00102 const int sizeOfIbo= m_IndexSize;
00103 const GLsizeiptr dataSize= sizeOfIbo * sizeof(GLuint);
00104 QVector<GLuint> indexVector(sizeOfIbo);
00105
00106 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IboId);
00107 GLvoid* pIbo = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_READ_ONLY);
00108 memcpy(indexVector.data(), pIbo, dataSize);
00109 glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
00110 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
00111 return indexVector;
00112 }
00113 else
00114 {
00115 return m_IndexVector;
00116 }
00117 }
00118
00119
00120 QDataStream &operator<<(QDataStream &stream, const GLC_Lod &lod)
00121 {
00122 quint32 chunckId= GLC_Lod::m_ChunkId;
00123 stream << chunckId;
00124
00125 stream << lod.m_Accuracy;
00126 stream << lod.indexVector();
00127
00128 return stream;
00129 }
00130 QDataStream &operator>>(QDataStream &stream, GLC_Lod &lod)
00131 {
00132 quint32 chunckId;
00133 stream >> chunckId;
00134 Q_ASSERT(chunckId == GLC_Lod::m_ChunkId);
00135
00136 stream >> lod.m_Accuracy;
00137
00138 QVector<GLuint> indexVector;
00139 stream >> indexVector;
00140
00141 *(lod.indexVectorHandle())= indexVector;
00142 return stream;
00143 }
00144