diff options
Diffstat (limited to 'Renderer.cpp')
-rw-r--r-- | Renderer.cpp | 110 |
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(); } |