2016-12-30 11:36:05 +00:00
|
|
|
#pragma once
|
2017-01-28 15:54:36 +00:00
|
|
|
#include <QOpenGlTexture>
|
2017-02-02 13:44:48 +00:00
|
|
|
#include <QFile>
|
2016-12-30 11:36:05 +00:00
|
|
|
#include <QVector>
|
|
|
|
#include <QVector2D>
|
|
|
|
#include <QMatrix4x4>
|
|
|
|
#include <QQuaternion>
|
2017-01-15 11:26:15 +00:00
|
|
|
#include <QRegExp>
|
2016-12-30 11:36:05 +00:00
|
|
|
|
|
|
|
struct BoundingBox {
|
|
|
|
QQuaternion rotation;
|
|
|
|
QVector3D center;
|
|
|
|
QVector3D extents;
|
|
|
|
};
|
|
|
|
|
2017-01-02 14:07:39 +00:00
|
|
|
struct VertexData
|
|
|
|
{
|
|
|
|
QVector3D position;
|
|
|
|
QVector2D texCoord;
|
2017-01-23 12:49:29 +00:00
|
|
|
QVector3D vertexNormal;
|
2017-02-05 15:39:37 +00:00
|
|
|
QVector3D polygonNormal;
|
|
|
|
QVector3D tangent;
|
|
|
|
QVector3D bitangent;
|
2017-01-02 14:07:39 +00:00
|
|
|
};
|
|
|
|
|
2016-12-30 11:36:05 +00:00
|
|
|
struct Segment {
|
2017-02-02 13:44:48 +00:00
|
|
|
quint32 textureIndex = 0;
|
2016-12-30 11:36:05 +00:00
|
|
|
QVector<VertexData> vertices;
|
|
|
|
QVector<GLuint> indices;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Model {
|
2017-02-02 13:44:48 +00:00
|
|
|
QString name = "";
|
|
|
|
QString parent = "";
|
2016-12-30 11:36:05 +00:00
|
|
|
QMatrix4x4 m4x4Translation;
|
2017-01-02 15:43:38 +00:00
|
|
|
QQuaternion quadRotation;
|
2017-02-02 13:44:48 +00:00
|
|
|
QVector<Segment*> segmList;
|
2016-12-30 11:36:05 +00:00
|
|
|
};
|
|
|
|
|
2017-01-15 11:26:15 +00:00
|
|
|
struct Material {
|
|
|
|
QString name;
|
2017-01-23 11:17:26 +00:00
|
|
|
QString tx0d;
|
|
|
|
QString tx1d;
|
|
|
|
QString tx2d;
|
|
|
|
QString tx3d;
|
|
|
|
QOpenGLTexture* texture0 = Q_NULLPTR;
|
|
|
|
QOpenGLTexture* texture1 = Q_NULLPTR;
|
2017-02-05 14:25:59 +00:00
|
|
|
QVector4D specularColor = { 0.1f, 0.1f, 0.1f, 1.0 };
|
2017-01-20 15:26:58 +00:00
|
|
|
QVector4D diffuseColor = { 1.0, 0.0, 0.0, 1.0 };
|
|
|
|
QVector4D ambientColor = { 1.0, 1.0, 1.0, 1.0 };
|
2017-02-05 14:25:59 +00:00
|
|
|
float shininess = 1;
|
2017-01-20 15:26:58 +00:00
|
|
|
bool flags[8] = { false };
|
2017-01-15 11:26:15 +00:00
|
|
|
bool transparent = false;
|
2017-02-02 13:44:48 +00:00
|
|
|
quint8 rendertype = 0;
|
|
|
|
quint8 dataValues[2] = { 0 };
|
2017-01-15 11:26:15 +00:00
|
|
|
};
|
|
|
|
|
2017-01-29 10:35:43 +00:00
|
|
|
class FileInterface
|
2016-12-30 11:36:05 +00:00
|
|
|
{
|
2017-01-04 13:35:27 +00:00
|
|
|
|
2016-12-30 11:36:05 +00:00
|
|
|
public:
|
2017-01-29 10:35:43 +00:00
|
|
|
explicit FileInterface(QString path)
|
|
|
|
: m_models(new QVector<Model*>)
|
2017-01-15 11:26:15 +00:00
|
|
|
, m_materials(new QVector<Material>)
|
2016-12-30 11:36:05 +00:00
|
|
|
{
|
|
|
|
//open file
|
2017-02-02 13:44:48 +00:00
|
|
|
m_file.setFileName(path);
|
2016-12-30 11:36:05 +00:00
|
|
|
|
2017-02-02 13:44:48 +00:00
|
|
|
if (!m_file.open(QIODevice::ReadOnly))
|
2017-01-07 14:59:16 +00:00
|
|
|
throw std::invalid_argument(std::string("ERROR: file not found: ") += path.toStdString());
|
2017-01-04 13:35:27 +00:00
|
|
|
|
2017-01-15 11:26:15 +00:00
|
|
|
m_filepath = path.left(path.lastIndexOf(QRegExp("/|\\\\")));
|
2017-01-04 13:35:27 +00:00
|
|
|
|
2016-12-30 11:36:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
virtual ~FileInterface()
|
|
|
|
{
|
|
|
|
// close file
|
|
|
|
m_file.close();
|
2016-12-31 12:11:14 +00:00
|
|
|
|
|
|
|
//clean up
|
|
|
|
for (Model* modelIt : *m_models)
|
|
|
|
{
|
|
|
|
for (Segment* segIt : modelIt->segmList)
|
|
|
|
{
|
|
|
|
segIt->indices.clear();
|
|
|
|
segIt->vertices.clear();
|
|
|
|
delete segIt;
|
|
|
|
}
|
|
|
|
modelIt->segmList.clear();
|
|
|
|
|
|
|
|
delete modelIt;
|
|
|
|
}
|
|
|
|
m_models->clear();
|
|
|
|
delete m_models;
|
2016-12-30 11:36:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
protected:
|
|
|
|
QVector<Model*>* m_models;
|
2017-02-02 13:44:48 +00:00
|
|
|
QFile m_file;
|
2017-01-15 11:26:15 +00:00
|
|
|
QVector<Material>* m_materials;
|
2016-12-30 11:36:05 +00:00
|
|
|
BoundingBox m_sceneBbox;
|
2017-01-15 11:26:15 +00:00
|
|
|
QString m_filepath;
|
2016-12-30 11:36:05 +00:00
|
|
|
|
|
|
|
virtual void import() = 0;
|
|
|
|
|
|
|
|
public:
|
|
|
|
virtual QVector<Model*>* getModels() const { return m_models; };
|
2017-01-15 11:26:15 +00:00
|
|
|
virtual QVector<Material>* getMaterials() const { return m_materials; };
|
2016-12-30 11:36:05 +00:00
|
|
|
virtual BoundingBox getBoundingBox() const { return m_sceneBbox; };
|
2017-01-04 13:35:27 +00:00
|
|
|
|
2017-01-20 15:26:58 +00:00
|
|
|
static Material* getDefaultMaterial() {
|
|
|
|
Material* defMaterial = new Material;
|
2017-01-15 11:26:15 +00:00
|
|
|
|
|
|
|
QImage img(1, 1, QImage::Format_RGB32);
|
|
|
|
img.fill(Qt::red);
|
|
|
|
|
|
|
|
QOpenGLTexture* new_texture = new QOpenGLTexture(img.mirrored());
|
|
|
|
|
|
|
|
// Set nearest filtering mode for texture minification
|
|
|
|
new_texture->setMinificationFilter(QOpenGLTexture::Nearest);
|
|
|
|
|
|
|
|
// Set bilinear filtering mode for texture magnification
|
|
|
|
new_texture->setMagnificationFilter(QOpenGLTexture::Linear);
|
|
|
|
|
|
|
|
// Wrap texture coordinates by repeating
|
|
|
|
// f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2)
|
|
|
|
new_texture->setWrapMode(QOpenGLTexture::Repeat);
|
|
|
|
|
2017-01-23 11:17:26 +00:00
|
|
|
defMaterial->texture0 = new_texture;
|
2017-01-20 15:26:58 +00:00
|
|
|
defMaterial->name = "Default Material";
|
2017-01-15 11:26:15 +00:00
|
|
|
|
|
|
|
return defMaterial;
|
|
|
|
};
|
|
|
|
|
2016-12-30 11:36:05 +00:00
|
|
|
};
|