1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
#pragma once
#include <QString>
#include "../../../SyntopiaCore/Math/Vector3.h"
#include "../../../SyntopiaCore/Math/Matrix4.h"
#include "../../../SyntopiaCore/GLEngine/Object3D.h"
#include "Renderer.h"
namespace StructureSynth {
namespace Model {
namespace Rendering {
using namespace SyntopiaCore::Math;
using namespace SyntopiaCore::GLEngine;
struct VertexNormal {
VertexNormal() {};
VertexNormal(int vID, int nID) : vID(vID), nID(nID) {};
int vID;
int nID;
};
struct ObjGroup {
QString groupName;
QVector<Vector3f> vertices;
QVector<Vector3f> normals;
QVector<QVector<VertexNormal> > faces;
void addGroup(ObjGroup g);
void reduceVertices();
};
/// Obj file renderer
class ObjRenderer : public Renderer {
public:
ObjRenderer(int sphereDT, int sphereDP, bool groupByTagging, bool groupByColor)
: sphereDT(sphereDT), sphereDP(sphereDP), groupByTagging(groupByTagging), groupByColor(groupByColor) {};
virtual ~ObjRenderer() {};
/// Flow
virtual void begin();
virtual void end();
/// This defines the identifier for our renderer.
virtual QString renderClass() { return "ObjRenderer"; }
/// The primitives
virtual void drawBox(Vector3f base,
Vector3f dir1,
Vector3f dir2,
Vector3f dir3,
PrimitiveClass* classID);
virtual void drawMesh( Vector3f startBase,
Vector3f startDir1,
Vector3f startDir2,
Vector3f endBase,
Vector3f endDir1,
Vector3f endDir2,
PrimitiveClass* classID);
virtual void drawGrid(Vector3f base,
Vector3f dir1,
Vector3f dir2,
Vector3f dir3,
PrimitiveClass* classID);
virtual void drawLine(Vector3f from,
Vector3f to,
PrimitiveClass* classID);
virtual void drawDot(Vector3f pos,
PrimitiveClass* classID);
virtual void drawSphere(Vector3f center, float radius,
PrimitiveClass* classID);
virtual void drawTriangle(Vector3f p1,
Vector3f p2,
Vector3f p3,
PrimitiveClass* classID);
virtual void callGeneric(PrimitiveClass* ) {};
// Color
// RGB in [0;1] intervals.
virtual void setColor(Vector3f rgb) { this->rgb = rgb; }
virtual void setBackgroundColor(Vector3f /*rgb*/) {};
virtual void setAlpha(double alpha) { this->alpha = alpha; }
virtual void setPreviousColor(Vector3f /*rgb*/) {};
virtual void setPreviousAlpha(double /*alpha*/) {};
// Camera settings
virtual void setTranslation(Vector3f /*translation*/) {};
virtual void setScale(double /*scale*/) {};
virtual void setRotation(Matrix4f /*rotation*/) {};
virtual void setPivot(Vector3f /*pivot*/) {};
virtual void setPerspectiveAngle(double /*angle*/) {};
// Issues a command for a specific renderclass such as 'template' or 'opengl'
virtual void callCommand(const QString& /*renderClass*/, const QString& /*command*/) {};
void addQuad(ObjGroup& group, Vector3f v1,Vector3f v2,Vector3f v3,Vector3f v4);
void addLineQuad(ObjGroup& group, Vector3f v1,Vector3f v2,Vector3f v3,Vector3f v4);
void setClass(QString classID, Vector3f rgb, double alpha);
void writeToStream(QTextStream& ts);
private:
QMap<QString, ObjGroup> groups;
QString currentGroup;
SyntopiaCore::Math::Vector3f rgb;
double alpha;
int sphereDT;
int sphereDP;
bool groupByTagging;
bool groupByColor;
};
}
}
}
|