summaryrefslogtreecommitdiffstats
path: root/Renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Renderer.cpp')
-rw-r--r--Renderer.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/Renderer.cpp b/Renderer.cpp
new file mode 100644
index 0000000..9365589
--- /dev/null
+++ b/Renderer.cpp
@@ -0,0 +1,148 @@
+#include "Renderer.h"
+#include <GL/gl.h>
+
+
+void Renderer::drawGrid(const Rectangle &rect, float scale) {
+ float depth = log10f(scale)-0.75f;
+ float depth2 = floorf(depth);
+ float step = powf(0.1f, depth2);
+ float f;
+ int i;
+ //gchar *string;
+ float x1 = rect.getVertex1().getX(), y1 = rect.getVertex1().getY();
+ float x2 = rect.getVertex2().getX(), y2 = rect.getVertex2().getY();
+
+
+ glBegin(GL_LINES);
+ //cairo_set_font_size(cr, 10.0/scale);
+
+ for(i = 0; 0.4f*(depth-depth2+i-1) < 0.5f; i++) {
+ f = fminf(0.4f*(depth-depth2+i), 0.5f);
+ glColor3f(f, f, f);
+
+ for(f = x1 - fmodf(x1, step) - step; f <= x2; f+=step) {
+ glVertex2f(f, y1);
+ glVertex2f(f, y2);
+
+ /*if(step > 0.005) {
+ if(step > 0.5)
+ string = g_strdup_printf("%i", (int)rint(d));
+ else
+ string = g_strdup_printf("%.*f", -(int)floor(log10(step*1.1)), d+step/10);
+
+ cairo_move_to(cr, d+1/scale, y1+11/scale);
+ cairo_show_text(cr, string);
+
+ g_free(string);
+ }*/
+ }
+
+ for(f = y1 - fmodf(y1, step) - step; f <= y2; f+=step) {
+ glVertex2f(x1, f);
+ glVertex2f(x2, f);
+
+ /*if(step > 0.005) {
+ if(step > 0.5)
+ string = g_strdup_printf("%i", (int)rint(d));
+ else
+ string = g_strdup_printf("%.*f", -(int)floor(log10(step*1.1)), d+step/10);
+
+ cairo_move_to(cr, x1+3/scale, d+11/scale);
+ cairo_show_text(cr, string);
+
+ g_free(string);
+ }*/
+ }
+
+ step *= 10;
+ }
+
+ glEnd();
+}
+
+void Renderer::fillPolygon(const Polygon &polygon) {
+ std::vector<Triangle> triangles;
+
+ polygon.triangulate(triangles);
+
+ glBegin(GL_TRIANGLES);
+
+ for(std::vector<Triangle>::iterator t = triangles.begin(); t != triangles.end(); t++) {
+ glVertex2f(t->getVertexA().getX(), t->getVertexA().getY());
+ glVertex2f(t->getVertexB().getX(), t->getVertexB().getY());
+ glVertex2f(t->getVertexC().getX(), t->getVertexC().getY());
+ }
+
+ glEnd();
+}
+
+void Renderer::drawPolygon(const Polygon &polygon, bool close) {
+ glBegin(GL_LINE_STRIP);
+
+ for(Polygon::const_iterator vertex = polygon.begin(); vertex != polygon.end(); vertex++)
+ glVertex2d(vertex->getX(), vertex->getY());
+
+ if(close)
+ glVertex2d(polygon.front().getX(), polygon.front().getY());
+
+ glEnd();
+}
+
+void Renderer::render(const Level &level, const Rectangle &rect, float scale) {
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glLineWidth(1.0f);
+
+ drawGrid(rect, scale);
+
+ for(Level::const_iterator room = level.begin(); room != level.end(); room++) {
+ if(&*room == editManager->getActiveRoom() && editManager->getMode() == EditManager::ADD) continue;
+
+ if(&*room == editManager->getActiveRoom())
+ glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
+ else
+ glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
+
+ fillPolygon(*room);
+
+ if(&*room == editManager->getActiveRoom()) {
+ glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
+ glLineWidth(2.0f);
+ }
+ else if(&*room == editManager->getHoveredRoom() && editManager->getMode() == EditManager::VIEW) {
+ glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
+ glLineWidth(2.0f);
+ }
+ else {
+ glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
+ glLineWidth(1.0f);
+ }
+
+ drawPolygon(*room, true);
+ }
+
+ if(editManager->getMode() == EditManager::ADD) {
+ if(editManager->polygonOk(*editManager->getActiveRoom()))
+ glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
+ else
+ glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
+
+ fillPolygon(*editManager->getActiveRoom());
+
+ glLineWidth(2.0f);
+ glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
+ drawPolygon(*editManager->getActiveRoom(), false);
+
+ if(!editManager->getActiveRoom()->empty() && editManager->getHoveredVertex()) {
+ if(!editManager->vertexOk(*editManager->getHoveredVertex()))
+ glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
+
+ glBegin(GL_LINES);
+
+ glVertex2d(editManager->getActiveRoom()->back().getX(), editManager->getActiveRoom()->back().getY());
+ glVertex2d(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY());
+
+ glEnd();
+ }
+ }
+}