00001
00002
00003 #ifndef MESHFACTORY_H
00004 #define MESHFACTORY_H
00005
00006
00007 #include "Mesh.h"
00008 #include "SingleTexturedMesh.h"
00009 #include "TextureDatabase.h"
00010 #include "Texture.h"
00011 #include "Triangle.h"
00012 #include "Vector2f.h"
00013 #include "Vector3f.h"
00014
00015
00016 namespace pge {
00017 namespace meshfactory {
00018
00019
00020
00021
00022 static Triangle createTriangle(Texture *texture, Vector3f a, Vector3f b, Vector3f c, Vector2f aUV, Vector2f bUV, Vector2f cUV) {
00023 Triangle triangle;
00024
00025 triangle.m_vertices[0] = a;
00026 triangle.m_vertices[1] = b;
00027 triangle.m_vertices[2] = c;
00028
00029
00030 triangle.m_texCoords[0] = aUV;
00031 triangle.m_texCoords[1] = bUV;
00032 triangle.m_texCoords[2] = cUV;
00033
00034 triangle.m_plane = new Plane(a, b, c);
00035 if(texture != NULL) {
00036 triangle.m_texture = texture;
00037 } else {
00038 triangle.m_texture = TextureDatabase::getInstance()->getDefaultTexture();
00039 }
00040
00041 return triangle;
00042 }
00043
00044
00045
00046
00047 static Triangle createTriangle(Vector3f a, Vector3f b, Vector3f c, Vector2f aUV, Vector2f bUV, Vector2f cUV) {
00048 Triangle triangle;
00049
00050 triangle.m_vertices[0] = a;
00051 triangle.m_vertices[1] = b;
00052 triangle.m_vertices[2] = c;
00053
00054
00055 triangle.m_texCoords[0] = aUV;
00056 triangle.m_texCoords[1] = bUV;
00057 triangle.m_texCoords[2] = cUV;
00058
00059 triangle.m_plane = new Plane(a, b, c);
00060 triangle.m_texture = TextureDatabase::getInstance()->getDefaultTexture();
00061
00062 return triangle;
00063 }
00064
00065
00066
00067
00068
00069 static Mesh* createCuboid(Vector3f minCorner, Vector3f maxCorner) {
00070 SingleTexturedMesh *mesh = new SingleTexturedMesh();
00071 Vector3f points[8];
00072
00073
00074 points[0] = Vector3f(minCorner.m_v[0], minCorner.m_v[1], minCorner.m_v[2]);
00075 points[1] = Vector3f(maxCorner.m_v[0], minCorner.m_v[1], minCorner.m_v[2]);
00076 points[2] = Vector3f(maxCorner.m_v[0], maxCorner.m_v[1], minCorner.m_v[2]);
00077 points[3] = Vector3f(minCorner.m_v[0], maxCorner.m_v[1], minCorner.m_v[2]);
00078
00079 points[4] = Vector3f(minCorner.m_v[0], minCorner.m_v[1], maxCorner.m_v[2]);
00080 points[5] = Vector3f(maxCorner.m_v[0], minCorner.m_v[1], maxCorner.m_v[2]);
00081 points[6] = Vector3f(maxCorner.m_v[0], maxCorner.m_v[1], maxCorner.m_v[2]);
00082 points[7] = Vector3f(minCorner.m_v[0], maxCorner.m_v[1], maxCorner.m_v[2]);
00083
00084
00085 mesh->addTriangle(createTriangle(points[0], points[1], points[2], Vector2f(0.0f,
00086 0.0f), Vector2f(0.0f, 1.0f), Vector2f(1.0f, 1.0f)));
00087 mesh->addTriangle(createTriangle(points[0], points[2], points[3], Vector2f(0.0f,
00088 0.0f), Vector2f(1.0f, 1.0f), Vector2f(1.0f, 0.0f)));
00089 mesh->addTriangle(createTriangle(points[4], points[5], points[6], Vector2f(0.0f,
00090 0.0f), Vector2f(0.0f, 1.0f), Vector2f(1.0f, 1.0f)));
00091 mesh->addTriangle(createTriangle(points[4], points[6], points[7], Vector2f(0.0f,
00092 0.0f), Vector2f(1.0f, 1.0f), Vector2f(1.0f, 0.0f)));
00093
00094
00095 mesh->addTriangle(createTriangle(points[0], points[4], points[7], Vector2f(0.0f,
00096 0.0f), Vector2f(0.0f, 1.0f), Vector2f(1.0f, 1.0f)));
00097 mesh->addTriangle(createTriangle(points[0], points[7], points[3], Vector2f(0.0f,
00098 0.0f), Vector2f(1.0f, 1.0f), Vector2f(1.0f, 0.0f)));
00099 mesh->addTriangle(createTriangle(points[5], points[1], points[2], Vector2f(0.0f,
00100 0.0f), Vector2f(0.0f, 1.0f), Vector2f(1.0f, 1.0f)));
00101 mesh->addTriangle(createTriangle(points[5], points[2], points[6], Vector2f(0.0f,
00102 0.0f), Vector2f(1.0f, 1.0f), Vector2f(1.0f, 0.0f)));
00103
00104
00105 mesh->addTriangle(createTriangle(points[7], points[6], points[2], Vector2f(0.0f,
00106 0.0f), Vector2f(0.0f, 1.0f), Vector2f(1.0f, 1.0f)));
00107 mesh->addTriangle(createTriangle(points[7], points[2], points[3], Vector2f(0.0f,
00108 0.0f), Vector2f(1.0f, 1.0f), Vector2f(1.0f, 0.0f)));
00109 mesh->addTriangle(createTriangle(points[4], points[5], points[1], Vector2f(0.0f,
00110 0.0f), Vector2f(0.0f, 1.0f), Vector2f(1.0f, 1.0f)));
00111 mesh->addTriangle(createTriangle(points[4], points[1], points[0], Vector2f(0.0f,
00112 0.0f), Vector2f(1.0f, 1.0f), Vector2f(1.0f, 0.0f)));
00113 return mesh;
00114 }
00115 };
00116 };
00117
00118 #endif