Walls And Holes  1
m2mpartialmesh.h
Go to the documentation of this file.
1 #ifndef M2MPARTIALMESH_H
2 #define M2MPARTIALMESH_H
3 
4 #include <QVector>
5 #include <QVector3D>
6 #include <QSharedPointer>
7 #include <QMap>
8 
9 #include "imageandsource.h"
10 #include "simpletexturedobject.h"
11 #include "tilematerial.h"
12 
13 namespace M2M {
14 
15 
17 class ImageInfo {
18 public:
19  ImageInfo() : mImage(nullptr) {}
20  ImageInfo(const ImageInfo &other) = default;
21  ImageInfo(SharedImageAndSource img) : mImage(img) {}
22  ImageInfo(const TileMaterial *material)
23  : mImage(material->texture()) {}
24 
25  SharedImageAndSource image() const { return mImage; }
26 
27  bool operator ==(const ImageInfo &other) const
28  {
29  return mImage.data() == other.mImage.data();
30  }
31 
32  bool operator !=(const ImageInfo &other) const
33  {
34  return !(*this == other);
35  }
36 
37 private:
38  SharedImageAndSource mImage;
39 };
40 
42 struct PhongInfo {
43  PhongInfo(const TileMaterial *material)
44  : ambient(material->ambient())
45  , diffuse(material->diffuse())
46  , specular(material->specular())
47  , shininess(material->shininess()) {}
48 
49  float ambient;
50  float diffuse;
51  float specular;
52  float shininess;
53 
54  bool operator ==(const PhongInfo &other) const
55  {
56  return ambient == other.ambient
57  && diffuse == other.diffuse
58  && specular == other.specular
59  && shininess == other.shininess;
60  }
61 
62  bool operator !=(const PhongInfo &other) const
63  {
64  return !(*this == other);
65  }
66 };
67 
68 
72 class Quad
73 {
74 public:
79  Quad(QVector3D normal,
80  ImageInfo texture,
81  PhongInfo material,
82  QVector3D v1, QVector2D t1,
83  QVector3D v2, QVector2D t2,
84  QVector3D v3, QVector2D t3,
85  QVector3D v4, QVector2D t4);
86 
87  QVector3D vertex(int idx) const;
88  QVector2D texCoord(int idx) const;
89 
90  QVector3D normal() const;
91 
92  ImageInfo imageInfo() const;
93  PhongInfo phongInfo() const;
94 
95 
113  static Quad makeVerticalQuad(QVector3D center,
114  QVector2D xzDirection,
115  float width,
116  float height,
117  ImageInfo texture,
118  PhongInfo material,
119  bool upsideDown = false);
120 
121 
122 private:
123  QVector3D mV1, mV2, mV3, mV4;
124  QVector2D mT1, mT2, mT3, mT4;
125 
126  QVector3D mNormal;
127 
128  ImageInfo mTexture;
129  PhongInfo mMaterial;
130 };
131 
132 
133 class Trig
134 {
135 public:
136  Trig(ImageInfo texture,
137  PhongInfo material,
138  QVector3D v1, QVector2D t1,
139  QVector3D v2, QVector2D t2,
140  QVector3D v3, QVector2D t3);
141 
142  QVector<QVector3D> verts() const { return {mV1, mV2, mV3}; }
143  QVector<QVector2D> textureCoords() const { return {mT1, mT2, mT3}; }
144 
145  QVector3D normal() const { return mNormal; }
146 
147  ImageInfo imageInfo() const { return mTexture; }
148  PhongInfo phongInfo() const { return mMaterial; }
149 
150 private:
151  QVector3D mV1, mV2, mV3;
152  QVector2D mT1, mT2, mT3;
153 
154  ImageInfo mTexture;
155  PhongInfo mMaterial;
156 
157  QVector3D mNormal;
158 };
159 
160 
164 {
165 public:
167  PreObject(ImageInfo img);
168 
170  void addQuad(const Quad &q);
171 
172  void addTrig(const Trig &t);
173 
174  void addPreObject(const PreObject &o);
175 
177  QSharedPointer<SimpleTexturedObject> toObject() const;
178 
179  ImageInfo imageInfo() const { return mImage; }
180 
181 private:
182  // Face information.
183  QVector<QVector3D> mVertexPositions;
184  QVector<QVector3D> mTriangleNormals;
185  QVector<SimpleTexturedObject::Triangle> mTriangles;
186 
187  // Material information.
188  QVector<float> mReflAmbient;
189  QVector<float> mReflDiffuse;
190  QVector<float> mReflSpecular;
191  QVector<float> mShininess;
192 
193  // Texture information.
194  QVector<SimpleTexturedObject::TriangleTexCoords> mTriangleTextureCoordinates;
195  SharedImageAndSource mImage;
196 };
197 
202 {
203 public:
204 
209  QVector<QSharedPointer<SimpleTexturedObject>> constructObjects();
210 
215  void addQuad(const Quad &q);
216 
217  void addTrig(const Trig &t);
218 
219  void addPartialMesh(const PartialMeshData &p);
220 
222  {
223  addPartialMesh(other);
224  return *this;
225  }
226 
228  {
229  PartialMeshData p = *this;
230  return p += other;
231  }
232 
233 private:
235  QMap<const QImage *, PreObject> mTexturesToObjects;
236 };
237 
238 
239 }
240 
241 #endif // M2MPARTIALMESH_H
QVector< QVector2D > textureCoords() const
Definition: m2mpartialmesh.h:143
float diffuse
Definition: m2mpartialmesh.h:50
PreObject(ImageInfo img)
Creates the PreObject with the given texture image.
Definition: m2mpartialmesh.cpp:158
bool operator!=(const PhongInfo &other) const
Definition: m2mpartialmesh.h:62
bool operator==(const ImageInfo &other) const
Definition: m2mpartialmesh.h:27
QVector3D vertex(int idx) const
Definition: m2mpartialmesh.cpp:23
Represents and helps construct a quadrilateral with one texture and a Phong material.
Definition: m2mpartialmesh.h:72
void addQuad(const Quad &q)
Adds the quad to this object, but does not change this object&#39;s texture image.
Definition: m2mpartialmesh.cpp:162
QSharedPointer< ImageAndSource > SharedImageAndSource
Definition: imageandsource.h:8
Trig(ImageInfo texture, PhongInfo material, QVector3D v1, QVector2D t1, QVector3D v2, QVector2D t2, QVector3D v3, QVector2D t3)
Definition: m2mpartialmesh.cpp:243
Class to allow piece-by-piece mesh construction.
Definition: m2mpartialmesh.h:201
ImageInfo()
Definition: m2mpartialmesh.h:19
QVector< QVector3D > verts() const
Definition: m2mpartialmesh.h:142
ImageInfo(SharedImageAndSource img)
Definition: m2mpartialmesh.h:21
void addPartialMesh(const PartialMeshData &p)
Definition: m2mpartialmesh.cpp:133
Definition: abstractpolygontilemesher.h:8
bool operator!=(const ImageInfo &other) const
Definition: m2mpartialmesh.h:32
Quad(QVector3D normal, ImageInfo texture, PhongInfo material, QVector3D v1, QVector2D t1, QVector3D v2, QVector2D t2, QVector3D v3, QVector2D t3, QVector3D v4, QVector2D t4)
Creates a quad with the given vertices. Vertices must be specified in counterclockwise order...
Definition: m2mpartialmesh.cpp:8
QVector2D texCoord(int idx) const
Definition: m2mpartialmesh.cpp:29
static Quad makeVerticalQuad(QVector3D center, QVector2D xzDirection, float width, float height, ImageInfo texture, PhongInfo material, bool upsideDown=false)
makeVerticalQuad Creates a vertical quad.
Definition: m2mpartialmesh.cpp:51
void addTrig(const Trig &t)
Definition: m2mpartialmesh.cpp:114
PartialMeshData & operator+=(const PartialMeshData &other)
Definition: m2mpartialmesh.h:221
QVector< QSharedPointer< SimpleTexturedObject > > constructObjects()
Constructs a list of meshes out of the data stored in this class.
Definition: m2mpartialmesh.cpp:145
bool operator==(const PhongInfo &other) const
Definition: m2mpartialmesh.h:54
void addQuad(const Quad &q)
addQuad Adds a quad to the mesh.
Definition: m2mpartialmesh.cpp:95
void addPreObject(const PreObject &o)
Definition: m2mpartialmesh.cpp:207
Class to wrap Phong reflection info.
Definition: m2mpartialmesh.h:42
float shininess
Definition: m2mpartialmesh.h:52
PhongInfo phongInfo() const
Definition: m2mpartialmesh.h:148
ImageInfo imageInfo() const
Definition: m2mpartialmesh.h:147
ImageInfo imageInfo() const
Definition: m2mpartialmesh.cpp:40
SharedImageAndSource image() const
Definition: m2mpartialmesh.h:25
float ambient
Definition: m2mpartialmesh.h:49
Definition: m2mpartialmesh.h:163
PhongInfo(const TileMaterial *material)
Definition: m2mpartialmesh.h:43
Definition: m2mpartialmesh.h:133
float specular
Definition: m2mpartialmesh.h:51
PartialMeshData & operator+(const PartialMeshData &other)
Definition: m2mpartialmesh.h:227
PhongInfo phongInfo() const
Definition: m2mpartialmesh.cpp:45
QVector3D normal() const
Definition: m2mpartialmesh.cpp:35
ImageInfo imageInfo() const
Definition: m2mpartialmesh.h:179
ImageInfo(const TileMaterial *material)
Definition: m2mpartialmesh.h:22
Definition: tilematerial.h:8
QVector3D normal() const
Definition: m2mpartialmesh.h:145
QSharedPointer< SimpleTexturedObject > toObject() const
Compiles this PreObject into a SimpleTexturedObject.
Definition: m2mpartialmesh.cpp:229
Class to wrap image info. This will be changed to use SharedImageAndSource when possible.
Definition: m2mpartialmesh.h:17
void addTrig(const Trig &t)
Definition: m2mpartialmesh.cpp:189