diff options
Diffstat (limited to 'MapTool/t3d')
-rw-r--r-- | MapTool/t3d/common.h | 24 | ||||
-rw-r--r-- | MapTool/t3d/material.cpp | 4 | ||||
-rw-r--r-- | MapTool/t3d/material.h | 9 | ||||
-rw-r--r-- | MapTool/t3d/mesh.cpp | 4 | ||||
-rw-r--r-- | MapTool/t3d/mesh.h | 18 | ||||
-rw-r--r-- | MapTool/t3d/model.cpp | 4 | ||||
-rw-r--r-- | MapTool/t3d/model.h | 16 | ||||
-rw-r--r-- | MapTool/t3d/objreader.cpp | 80 | ||||
-rw-r--r-- | MapTool/t3d/objreader.h | 30 |
9 files changed, 189 insertions, 0 deletions
diff --git a/MapTool/t3d/common.h b/MapTool/t3d/common.h new file mode 100644 index 0000000..15b65b8 --- /dev/null +++ b/MapTool/t3d/common.h @@ -0,0 +1,24 @@ +#ifndef T3DCOMMON_H +#define T3DCOMMON_H + +struct Vec { + float x, y, z; +}; + +struct Vec2 { + float x, y; +}; + +struct Triangle { + Vec vertex[3]; + Vec2 texcoord[3]; + Vec normal[3]; +}; + +struct Quad { + Vec vertex[4]; + Vec2 texcoord[4]; + Vec normal[4]; +}; + +#endif // T3DCOMMON_H diff --git a/MapTool/t3d/material.cpp b/MapTool/t3d/material.cpp new file mode 100644 index 0000000..c9f3a35 --- /dev/null +++ b/MapTool/t3d/material.cpp @@ -0,0 +1,4 @@ +#include "material.h" + +T3DMaterial::T3DMaterial() { +} diff --git a/MapTool/t3d/material.h b/MapTool/t3d/material.h new file mode 100644 index 0000000..cc4bab3 --- /dev/null +++ b/MapTool/t3d/material.h @@ -0,0 +1,9 @@ +#ifndef T3DMATERIAL_H +#define T3DMATERIAL_H + +class T3DMaterial { +public: + T3DMaterial(); +}; + +#endif // T3DMATERIAL_H diff --git a/MapTool/t3d/mesh.cpp b/MapTool/t3d/mesh.cpp new file mode 100644 index 0000000..3dc10b8 --- /dev/null +++ b/MapTool/t3d/mesh.cpp @@ -0,0 +1,4 @@ +#include "mesh.h" + +T3DMesh::T3DMesh() { +} diff --git a/MapTool/t3d/mesh.h b/MapTool/t3d/mesh.h new file mode 100644 index 0000000..2b9ce89 --- /dev/null +++ b/MapTool/t3d/mesh.h @@ -0,0 +1,18 @@ +#ifndef T3DMESH_H +#define T3DMESH_H + +#include "common.h" +#include "material.h" +#include <QtCore/QVector> + +class T3DMesh { +public: + T3DMesh(); + + QVector<Triangle> triangles; + QVector<Quad> quads; + + T3DMaterial *material; +}; + +#endif // T3DMESH_H diff --git a/MapTool/t3d/model.cpp b/MapTool/t3d/model.cpp new file mode 100644 index 0000000..c2dc6dc --- /dev/null +++ b/MapTool/t3d/model.cpp @@ -0,0 +1,4 @@ +#include "model.h" + +T3DModel::T3DModel() { +} diff --git a/MapTool/t3d/model.h b/MapTool/t3d/model.h new file mode 100644 index 0000000..a6535af --- /dev/null +++ b/MapTool/t3d/model.h @@ -0,0 +1,16 @@ +#ifndef T3DMODEL_H +#define T3DMODEL_H + +#include <QtCore/QList> +#include "mesh.h" + +class T3DModel { +public: + T3DModel(); + ~T3DModel(); + + QList<T3DMesh *> meshes; + +}; + +#endif // T3DMODEL_H diff --git a/MapTool/t3d/objreader.cpp b/MapTool/t3d/objreader.cpp new file mode 100644 index 0000000..3a07323 --- /dev/null +++ b/MapTool/t3d/objreader.cpp @@ -0,0 +1,80 @@ +#include "objreader.h" + +T3DObjReader::T3DObjReader(T3DModel &model) { + m_model = model; +} + +T3DObjReader::parseLine(QString line) { + line = line.trimmed(); + if (line.isEmpty() || line.at(0) == '#') + return; + + QStringList params = line.split(' ', QString::SkipEmptyParts); + QString cmd = params[0]; + + if (cmd == "v") { + float x, y, z; + x = params[1].toFloat(); + y = params[2].toFloat(); + z = params[3].toFloat(); + known_vertices.append(Vec(x, y, z)); + } + + if (cmd == "vt") { + float x, y; + x = params[1].toFloat(); + y = params[2].toFloat(); + known_texcoords.append(Vec2(x, y)); + } + + if (cmd == "vn") { + float x, y, z; + x = params[1].toFloat(); + y = params[2].toFloat(); + z = params[3].toFloat(); + known_normals.append(Vec(x, y, z)); + } + + if (cmd == "f") { + int vtxCount = params.count() - 1; + if (vtxCount < 3 || vtxCount > 4) + return; + + int vtxID[4], tcID[4], nrmID[4]; + + for (int i = 0; i < vtxCount; i++) { + QString face = params[i+1]; + QStringList ids = face.split('/'); + vtxID[i] = ids[0].isEmpty() ? 0 : ids[0].toInt(); + tcID[i] = ids[1].isEmpty() ? 0 : ids[1].toInt(); + nrmID[i] = ids[2].isEmpty() ? 0 : ids[2].toInt(); + } + + if (vtxCount == 3) { + Triangle tri; + for (int i = 0; i < 3; i++) { + tri.vertex[i] = known_vertices[vtxID[i]]; + tri.texcoord[i] = known_texcoords[tcID[i]]; + tri.normal[i] = known_normals[nrmID[i]]; + } + m_currentMesh->triangles.append(tri); + } + + if (vtxCount == 4) { + Quad q; + for (int i = 0; i < 4; i++) { + q.vertex[i] = known_vertices[vtxID[i]]; + q.texcoord[i] = known_texcoords[tcID[i]]; + q.normal[i] = known_normals[nrmID[i]]; + } + m_currentMesh->quads.append(q); + } + } + + if (cmd == "usemtl") { + // treat this as "new shape" + m_currentMesh = new T3DMesh(); + m_model->meshes.append(m_currentMesh); + m_currentMesh->material = materials[params[1]]; + } +} diff --git a/MapTool/t3d/objreader.h b/MapTool/t3d/objreader.h new file mode 100644 index 0000000..6e518e8 --- /dev/null +++ b/MapTool/t3d/objreader.h @@ -0,0 +1,30 @@ +#ifndef T3DOBJREADER_H +#define T3DOBJREADER_H + +#include <QtCore/QList> +#include <QtCore/QVector> +#include <QtCore/QString> +#include <QtCore/QStringList> +#include <QtCore/QHash> +#include "model.h" + +class T3DObjReader { +private: + T3DModel *m_model; + T3DMesh *m_currentMesh; + + QVector<Vec> known_vertices; + QVector<Vec2> known_texcoords; + QVector<Vec> known_normals; + +public: + T3DObjReader(T3DModel &model); + + void parseLine(QString line); + + T3DModel *model() { return m_model; } + + QHash<QString, T3DMaterial *> materials; +}; + +#endif // T3DOBJREADER_H |