summaryrefslogtreecommitdiffstats
path: root/Renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Renderer.cpp')
-rw-r--r--Renderer.cpp110
1 files changed, 76 insertions, 34 deletions
diff --git a/Renderer.cpp b/Renderer.cpp
index 9365589..1463d21 100644
--- a/Renderer.cpp
+++ b/Renderer.cpp
@@ -1,4 +1,5 @@
#include "Renderer.h"
+#include "PlayerStart.h"
#include <GL/gl.h>
@@ -77,70 +78,111 @@ void Renderer::fillPolygon(const Polygon &polygon) {
}
void Renderer::drawPolygon(const Polygon &polygon, bool close) {
- glBegin(GL_LINE_STRIP);
+ glBegin(close ? GL_LINE_LOOP : GL_LINE_STRIP);
for(Polygon::const_iterator vertex = polygon.begin(); vertex != polygon.end(); vertex++)
- glVertex2d(vertex->getX(), vertex->getY());
+ glVertex2f(vertex->getX(), vertex->getY());
- if(close)
- glVertex2d(polygon.front().getX(), polygon.front().getY());
+ glEnd();
+}
+
+void Renderer::drawCircle(const Vertex &m, float r, int n) {
+ glBegin(GL_LINE_LOOP);
+
+ for(int i = 0; i < n; i++)
+ glVertex2f(m.getX()+r*cosf(2*M_PI*i/n), m.getY()+r*sinf(2*M_PI*i/n));
+
+ glEnd();
+}
+
+void Renderer::drawCross(const Vertex &m, float r) {
+ glBegin(GL_LINES);
+
+ glVertex2f(m.getX()-r*M_SQRT1_2, m.getY()-r*M_SQRT1_2);
+ glVertex2f(m.getX()+r*M_SQRT1_2, m.getY()+r*M_SQRT1_2);
+
+ glVertex2f(m.getX()+r*M_SQRT1_2, m.getY()-r*M_SQRT1_2);
+ glVertex2f(m.getX()-r*M_SQRT1_2, m.getY()+r*M_SQRT1_2);
glEnd();
}
+void Renderer::renderObject(const LevelObject &object, bool selected, bool hovered, float scale) {
+ if(object.isOfType("Room"))
+ renderRoom(*(Room*)&object, selected, hovered, scale);
+ else if(object.isOfType("PlayerStart"))
+ renderPlayerStart(*(PlayerStart*)&object, selected, hovered, scale);
+}
+
+void Renderer::renderRoom(const Room &room, bool selected, bool hovered, float scale) {
+ if(selected)
+ glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
+ else
+ glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
+
+ fillPolygon(room);
+
+ if(selected) {
+ glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
+ glLineWidth(2.0f);
+ }
+ else if(hovered && 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);
+}
+
+void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool hovered, float scale) {
+ glLineWidth(1.0f);
+ glColor4f(0.0f, 0.7f, 0.7f, 0.7f);
+ drawCircle(Vertex(start.getX(), start.getZ()), 0.3f, 128);
+
+ glLineWidth(2.0f);
+ glColor4f(1.0f, 1.0f, 1.0f, 0.7f);
+ drawCross(Vertex(start.getX(), start.getZ()), 0.5f/sqrtf(scale));
+}
+
void Renderer::render(const Level &level, const Rectangle &rect, float scale) {
glClear(GL_COLOR_BUFFER_BIT);
glLineWidth(1.0f);
+ glPointSize(10.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);
+ for(Level::const_iterator object = level.begin(); object != level.end(); object++) {
+ renderObject(**object, (&**object == editManager->getSelectedObject()),
+ (&**object == editManager->getHoveredObject()), scale);
}
if(editManager->getMode() == EditManager::ADD) {
- if(editManager->polygonOk(*editManager->getActiveRoom()))
+ Room *activeRoom = (Room*)editManager->getSelectedObject();
+
+ if(editManager->polygonOk(*activeRoom))
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
else
glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
- fillPolygon(*editManager->getActiveRoom());
+ fillPolygon(*activeRoom);
glLineWidth(2.0f);
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
- drawPolygon(*editManager->getActiveRoom(), false);
+ drawPolygon(*activeRoom, false);
- if(!editManager->getActiveRoom()->empty() && editManager->getHoveredVertex()) {
+ if(!activeRoom->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());
+ glVertex2f(activeRoom->back().getX(), activeRoom->back().getY());
+ glVertex2f(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY());
glEnd();
}