blob: c5cdd45d19b8434338eb9344fb3aa5e91c28e46a [file] [log] [blame]
Zack Rusin8e7a4ff2011-04-07 01:15:48 -04001#include "vertexdatainterpreter.h"
2
3#include <QListWidget>
4#include <QStringList>
5
6#include <QDebug>
7
8#include <GL/gl.h>
9
Zack Rusinb9341152011-04-07 19:09:28 -040010#include <qmath.h>
11
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040012static int
13sizeForType(int glType)
14{
15 switch(glType) {
16 case GL_FLOAT:
17 return sizeof(GLfloat);
18 case GL_UNSIGNED_BYTE:
19 return sizeof(GLubyte);
20 case GL_BYTE:
21 return sizeof(GLbyte);
22 case GL_SHORT:
23 return sizeof(GLshort);
24 case GL_UNSIGNED_SHORT:
25 return sizeof(GLushort);
26 case GL_INT:
27 return sizeof(GLint);
28 case GL_UNSIGNED_INT:
29 return sizeof(GLuint);
Zack Rusinb9341152011-04-07 19:09:28 -040030 case GL_DOUBLE:
31 return sizeof(GLdouble);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040032 default:
33 return sizeof(GLint);
34 }
35}
36
37template <typename T>
38static QStringList
39convertData(const QByteArray &dataArray,
40 int type,
41 int stride,
Zack Rusin1b917052011-04-07 19:38:40 -040042 int numComponents,
43 int startingOffset)
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040044{
45 QStringList strings;
46
Zack Rusin1b917052011-04-07 19:38:40 -040047 int dataSize = dataArray.size() - startingOffset;
48 const char *data = dataArray.constData() + startingOffset;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040049 int typeSize = sizeForType(type);
Zack Rusinb9341152011-04-07 19:09:28 -040050 int elementSize = numComponents * typeSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040051
Zack Rusinb9341152011-04-07 19:09:28 -040052 if (!stride)
53 stride = elementSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040054
Zack Rusin1b917052011-04-07 19:38:40 -040055 int numElements = dataSize / stride;
Zack Rusinb9341152011-04-07 19:09:28 -040056
57 if ((numElements % numComponents) != 0) {
Zack Rusin1b917052011-04-07 19:38:40 -040058 int temp = qFloor(dataSize / (float)stride);
Zack Rusinb9341152011-04-07 19:09:28 -040059 int fullElemSize = temp * stride;
Zack Rusin1b917052011-04-07 19:38:40 -040060 if (fullElemSize + numComponents * typeSize <= dataSize) {
Zack Rusinb9341152011-04-07 19:09:28 -040061 /* num full elements plus the part of the buffer in which we fit */
62 numElements = temp + 1;
63 } else {
64 numElements = temp;
65 }
66 }
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040067
68#if 0
69 qDebug() << "numElements = "<<numElements;
Zack Rusinb9341152011-04-07 19:09:28 -040070 qDebug() << "elementSize = "<<elementSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040071 qDebug() << "stride = "<<stride;
72 qDebug() << "numComponents = "<<numComponents;
Zack Rusinb9341152011-04-07 19:09:28 -040073 qDebug() << "typeSize = "<<typeSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040074#endif
75
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040076
Zack Rusinb9341152011-04-07 19:09:28 -040077 for (int i = 0; i < numElements; ++i) {
78 QString vectorString = QString::fromLatin1("%1) [").arg(i);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040079 for (int j = 0; j < numComponents; ++j) {
Zack Rusinb9341152011-04-07 19:09:28 -040080 int offset = i*stride + j*typeSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040081 const T *elementPtr =
Zack Rusinb9341152011-04-07 19:09:28 -040082 (const T*)(data + offset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040083 T elem = *elementPtr;
84 vectorString += QString::number(elem);
85 if ((j + 1) < numComponents)
86 vectorString += QLatin1String(", ");
87 }
88 vectorString += "]";
89 strings += vectorString;
90 }
91
92 return strings;
93}
94
95
96VertexDataInterpreter::VertexDataInterpreter(QObject *parent)
97 : QObject(parent),
98 m_listWidget(0),
99 m_type(GL_FLOAT),
100 m_stride(16),
Zack Rusin1b917052011-04-07 19:38:40 -0400101 m_components(4),
102 m_startingOffset(0)
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400103{
104}
105
106void VertexDataInterpreter::setData(const QByteArray &data)
107{
108 m_data = data;
109 if (m_listWidget)
110 m_listWidget->clear();
111}
112
113QByteArray VertexDataInterpreter::data() const
114{
115 return m_data;
116}
117
118void VertexDataInterpreter::setType(int type)
119{
120 m_type = type;
121}
122
123int VertexDataInterpreter::type() const
124{
125 return m_type;
126}
127
128void VertexDataInterpreter::setStride(int stride)
129{
130 m_stride = stride;
131}
132
133int VertexDataInterpreter::stride() const
134{
135 return m_stride;
136}
137
138void VertexDataInterpreter::setComponents(int num)
139{
140 m_components = num;
141}
142
143int VertexDataInterpreter::components() const
144{
145 return m_components;
146}
147
148void VertexDataInterpreter::setListWidget(QListWidget *listWidget)
149{
150 m_listWidget = listWidget;
151}
152
153void VertexDataInterpreter::interpretData()
154{
155 if (!m_listWidget)
156 return;
157
158 m_listWidget->clear();
159
160 if (m_data.isEmpty() || !m_components)
161 return;
162
163 QStringList lst;
164 switch(m_type) {
165 case GL_FLOAT:
Zack Rusin1b917052011-04-07 19:38:40 -0400166 lst = convertData<float>(m_data, m_type, m_stride, m_components,
167 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400168 break;
169 case GL_UNSIGNED_BYTE:
Zack Rusin1b917052011-04-07 19:38:40 -0400170 lst = convertData<quint8>(m_data, m_type, m_stride, m_components,
171 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400172 break;
173 case GL_BYTE:
Zack Rusin1b917052011-04-07 19:38:40 -0400174 lst = convertData<qint8>(m_data, m_type, m_stride, m_components,
175 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400176 break;
177 case GL_SHORT:
Zack Rusin1b917052011-04-07 19:38:40 -0400178 lst = convertData<qint16>(m_data, m_type, m_stride, m_components,
179 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400180 break;
181 case GL_UNSIGNED_SHORT:
Zack Rusin1b917052011-04-07 19:38:40 -0400182 lst = convertData<quint16>(m_data, m_type, m_stride, m_components,
183 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400184 break;
185 case GL_INT:
Zack Rusin1b917052011-04-07 19:38:40 -0400186 lst = convertData<unsigned int>(m_data, m_type, m_stride, m_components,
187 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400188 break;
189 case GL_UNSIGNED_INT:
Zack Rusin1b917052011-04-07 19:38:40 -0400190 lst = convertData<int>(m_data, m_type, m_stride, m_components,
191 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400192 break;
Zack Rusinb9341152011-04-07 19:09:28 -0400193 case GL_DOUBLE:
Zack Rusin1b917052011-04-07 19:38:40 -0400194 lst = convertData<double>(m_data, m_type, m_stride, m_components,
195 m_startingOffset);
Zack Rusinb9341152011-04-07 19:09:28 -0400196 break;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400197 default:
198 qDebug()<<"unkown gltype = "<<m_type;
199 }
200 //qDebug()<<"list is "<<lst;
201 m_listWidget->addItems(lst);
202}
203
204
205void VertexDataInterpreter::setTypeFromString(const QString &str)
206{
207 if (str == QLatin1String("GL_FLOAT")) {
208 setType(GL_FLOAT);
209 } else if (str == QLatin1String("GL_INT")) {
210 setType(GL_INT);
211 } else if (str == QLatin1String("GL_UNSIGNED_INT")) {
212 setType(GL_UNSIGNED_INT);
213 } else if (str == QLatin1String("GL_SHORT")) {
214 setType(GL_SHORT);
215 } else if (str == QLatin1String("GL_UNSIGNED_SHORT")) {
216 setType(GL_UNSIGNED_SHORT);
217 } else if (str == QLatin1String("GL_BYTE")) {
218 setType(GL_BYTE);
219 } else if (str == QLatin1String("GL_UNSIGNED_BYTE")) {
220 setType(GL_UNSIGNED_BYTE);
Zack Rusinb9341152011-04-07 19:09:28 -0400221 } else if (str == QLatin1String("GL_DOUBLE")) {
222 setType(GL_DOUBLE);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400223 } else {
224 qDebug()<<"unknown vertex data type";
225 }
226}
227
Zack Rusin1b917052011-04-07 19:38:40 -0400228int VertexDataInterpreter::startingOffset() const
229{
230 return m_startingOffset;
231}
232
233void VertexDataInterpreter::setStartingOffset(int offset)
234{
235 m_startingOffset = offset;
236}
237
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400238#include "vertexdatainterpreter.moc"