blob: a3012310e1349e7b4cf87bdad79671e281cbfecc [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
Zack Rusinb9341152011-04-07 19:09:28 -04008#include <qmath.h>
9
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040010static int
José Fonseca933070e2011-05-10 20:27:00 +010011sizeForType(int type)
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040012{
José Fonseca933070e2011-05-10 20:27:00 +010013 switch(type) {
14 case DT_INT8:
15 case DT_UINT8:
16 return 1;
17 case DT_INT16:
18 case DT_UINT16:
19 return 2;
20 case DT_INT32:
21 case DT_UINT32:
22 return 4;
23 case DT_FLOAT:
24 return sizeof(float);
25 case DT_DOUBLE:
26 return sizeof(double);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040027 default:
José Fonseca933070e2011-05-10 20:27:00 +010028 return sizeof(int);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040029 }
30}
31
32template <typename T>
33static QStringList
34convertData(const QByteArray &dataArray,
35 int type,
36 int stride,
Zack Rusin1b917052011-04-07 19:38:40 -040037 int numComponents,
38 int startingOffset)
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040039{
40 QStringList strings;
41
Zack Rusin1b917052011-04-07 19:38:40 -040042 int dataSize = dataArray.size() - startingOffset;
43 const char *data = dataArray.constData() + startingOffset;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040044 int typeSize = sizeForType(type);
Zack Rusinb9341152011-04-07 19:09:28 -040045 int elementSize = numComponents * typeSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040046
Zack Rusinb9341152011-04-07 19:09:28 -040047 if (!stride)
48 stride = elementSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040049
Zack Rusin1b917052011-04-07 19:38:40 -040050 int numElements = dataSize / stride;
Zack Rusinb9341152011-04-07 19:09:28 -040051
52 if ((numElements % numComponents) != 0) {
Zack Rusin1b917052011-04-07 19:38:40 -040053 int temp = qFloor(dataSize / (float)stride);
Zack Rusinb9341152011-04-07 19:09:28 -040054 int fullElemSize = temp * stride;
Zack Rusin1b917052011-04-07 19:38:40 -040055 if (fullElemSize + numComponents * typeSize <= dataSize) {
Zack Rusinb9341152011-04-07 19:09:28 -040056 /* num full elements plus the part of the buffer in which we fit */
57 numElements = temp + 1;
58 } else {
59 numElements = temp;
60 }
61 }
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040062
63#if 0
64 qDebug() << "numElements = "<<numElements;
Zack Rusinb9341152011-04-07 19:09:28 -040065 qDebug() << "elementSize = "<<elementSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040066 qDebug() << "stride = "<<stride;
67 qDebug() << "numComponents = "<<numComponents;
Zack Rusinb9341152011-04-07 19:09:28 -040068 qDebug() << "typeSize = "<<typeSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040069#endif
70
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040071
Zack Rusinb9341152011-04-07 19:09:28 -040072 for (int i = 0; i < numElements; ++i) {
73 QString vectorString = QString::fromLatin1("%1) [").arg(i);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040074 for (int j = 0; j < numComponents; ++j) {
Zack Rusinb9341152011-04-07 19:09:28 -040075 int offset = i*stride + j*typeSize;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040076 const T *elementPtr =
Zack Rusinb9341152011-04-07 19:09:28 -040077 (const T*)(data + offset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040078 T elem = *elementPtr;
79 vectorString += QString::number(elem);
80 if ((j + 1) < numComponents)
81 vectorString += QLatin1String(", ");
82 }
83 vectorString += "]";
84 strings += vectorString;
85 }
86
87 return strings;
88}
89
90
91VertexDataInterpreter::VertexDataInterpreter(QObject *parent)
92 : QObject(parent),
93 m_listWidget(0),
José Fonseca933070e2011-05-10 20:27:00 +010094 m_type(DT_FLOAT),
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040095 m_stride(16),
Zack Rusin1b917052011-04-07 19:38:40 -040096 m_components(4),
97 m_startingOffset(0)
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040098{
99}
100
101void VertexDataInterpreter::setData(const QByteArray &data)
102{
103 m_data = data;
104 if (m_listWidget)
105 m_listWidget->clear();
106}
107
108QByteArray VertexDataInterpreter::data() const
109{
110 return m_data;
111}
112
113void VertexDataInterpreter::setType(int type)
114{
115 m_type = type;
116}
117
118int VertexDataInterpreter::type() const
119{
120 return m_type;
121}
122
123void VertexDataInterpreter::setStride(int stride)
124{
125 m_stride = stride;
126}
127
128int VertexDataInterpreter::stride() const
129{
130 return m_stride;
131}
132
133void VertexDataInterpreter::setComponents(int num)
134{
135 m_components = num;
136}
137
138int VertexDataInterpreter::components() const
139{
140 return m_components;
141}
142
143void VertexDataInterpreter::setListWidget(QListWidget *listWidget)
144{
145 m_listWidget = listWidget;
146}
147
148void VertexDataInterpreter::interpretData()
149{
150 if (!m_listWidget)
151 return;
152
153 m_listWidget->clear();
154
155 if (m_data.isEmpty() || !m_components)
156 return;
157
158 QStringList lst;
159 switch(m_type) {
José Fonseca933070e2011-05-10 20:27:00 +0100160 case DT_INT8:
Zack Rusin1b917052011-04-07 19:38:40 -0400161 lst = convertData<qint8>(m_data, m_type, m_stride, m_components,
162 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400163 break;
José Fonseca933070e2011-05-10 20:27:00 +0100164 case DT_UINT8:
165 lst = convertData<quint8>(m_data, m_type, m_stride, m_components,
166 m_startingOffset);
167 break;
168 case DT_INT16:
Zack Rusin1b917052011-04-07 19:38:40 -0400169 lst = convertData<qint16>(m_data, m_type, m_stride, m_components,
170 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400171 break;
José Fonseca933070e2011-05-10 20:27:00 +0100172 case DT_UINT16:
Zack Rusin1b917052011-04-07 19:38:40 -0400173 lst = convertData<quint16>(m_data, m_type, m_stride, m_components,
174 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400175 break;
José Fonseca933070e2011-05-10 20:27:00 +0100176 case DT_INT32:
177 lst = convertData<qint32>(m_data, m_type, m_stride, m_components,
178 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400179 break;
José Fonseca933070e2011-05-10 20:27:00 +0100180 case DT_UINT32:
181 lst = convertData<quint32>(m_data, m_type, m_stride, m_components,
182 m_startingOffset);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400183 break;
José Fonseca933070e2011-05-10 20:27:00 +0100184 case DT_FLOAT:
185 lst = convertData<float>(m_data, m_type, m_stride, m_components,
186 m_startingOffset);
187 break;
188 case DT_DOUBLE:
Zack Rusin1b917052011-04-07 19:38:40 -0400189 lst = convertData<double>(m_data, m_type, m_stride, m_components,
190 m_startingOffset);
Zack Rusinb9341152011-04-07 19:09:28 -0400191 break;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400192 default:
193 qDebug()<<"unkown gltype = "<<m_type;
194 }
195 //qDebug()<<"list is "<<lst;
196 m_listWidget->addItems(lst);
197}
198
199
200void VertexDataInterpreter::setTypeFromString(const QString &str)
201{
202 if (str == QLatin1String("GL_FLOAT")) {
José Fonseca933070e2011-05-10 20:27:00 +0100203 setType(DT_FLOAT);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400204 } else if (str == QLatin1String("GL_INT")) {
José Fonseca933070e2011-05-10 20:27:00 +0100205 setType(DT_INT32);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400206 } else if (str == QLatin1String("GL_UNSIGNED_INT")) {
José Fonseca933070e2011-05-10 20:27:00 +0100207 setType(DT_UINT32);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400208 } else if (str == QLatin1String("GL_SHORT")) {
José Fonseca933070e2011-05-10 20:27:00 +0100209 setType(DT_INT16);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400210 } else if (str == QLatin1String("GL_UNSIGNED_SHORT")) {
José Fonseca933070e2011-05-10 20:27:00 +0100211 setType(DT_UINT16);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400212 } else if (str == QLatin1String("GL_BYTE")) {
José Fonseca933070e2011-05-10 20:27:00 +0100213 setType(DT_INT8);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400214 } else if (str == QLatin1String("GL_UNSIGNED_BYTE")) {
José Fonseca933070e2011-05-10 20:27:00 +0100215 setType(DT_UINT8);
Zack Rusinb9341152011-04-07 19:09:28 -0400216 } else if (str == QLatin1String("GL_DOUBLE")) {
José Fonseca933070e2011-05-10 20:27:00 +0100217 setType(DT_DOUBLE);
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400218 } else {
219 qDebug()<<"unknown vertex data type";
220 }
221}
222
Zack Rusin1b917052011-04-07 19:38:40 -0400223int VertexDataInterpreter::startingOffset() const
224{
225 return m_startingOffset;
226}
227
228void VertexDataInterpreter::setStartingOffset(int offset)
229{
230 m_startingOffset = offset;
231}
232
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400233#include "vertexdatainterpreter.moc"