void RoadGraphRenderer::renderArea(const AbstractArea& area, float height) { std::vector<RenderablePtr> renderables; renderables.push_back(RenderablePtr(new Renderable(GL_LINE_STIPPLE, 3.0f))); renderables.push_back(RenderablePtr(new Renderable(GL_POINTS, 10.0f))); Vertex v; v.color[0] = 0.0f; v.color[1] = 0.0f; v.color[2] = 1.0f; v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; for (int i = 0; i < area.polyline().size(); i++) { v.location[0] = area.polyline()[i].x(); v.location[1] = area.polyline()[i].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); renderables[1]->vertices.push_back(v); } v.location[0] = area.polyline()[0].x(); v.location[1] = area.polyline()[0].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); render(renderables); }
void Renderer::renderPolyline(const Polyline2D& polyline, GLenum lineType, float height) { std::vector<RenderablePtr> renderables; renderables.push_back(RenderablePtr(new Renderable(lineType, 3.0f))); renderables.push_back(RenderablePtr(new Renderable(GL_POINTS, 10.0f))); Vertex v; v.color[0] = 0.0f; v.color[1] = 0.0f; v.color[2] = 1.0f; v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; // add lines for (int i = 0; i < polyline.size(); i++) { v.location[0] = polyline[i].x(); v.location[1] = polyline[i].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); renderables[1]->vertices.push_back(v); } render(renderables); }
/** * 与えられたポリゴンに基づいて、閉じた領域を描画する。 * ただし、ポリゴンデータ自体は、閉じていなくて良い。 */ void Renderer::renderArea(const Polygon2D& area, GLenum lineType, const QColor& color, float height) { std::vector<RenderablePtr> renderables; renderables.push_back(RenderablePtr(new Renderable(lineType, 3.0f))); renderables.push_back(RenderablePtr(new Renderable(GL_POINTS, 10.0f))); Vertex v; v.color[0] = color.redF(); v.color[1] = color.greenF(); v.color[2] = color.blueF(); v.color[3] = color.alphaF(); v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; for (int i = 0; i < area.size(); i++) { v.location[0] = area[i].x(); v.location[1] = area[i].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); renderables[1]->vertices.push_back(v); } v.location[0] = area[0].x(); v.location[1] = area[0].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); render(renderables); }
void RoadGraphRenderer::renderPolyline(std::vector<QVector2D>& polyline, float height) { std::vector<RenderablePtr> renderables; renderables.push_back(RenderablePtr(new Renderable(GL_LINE_STRIP, 3.0f))); renderables.push_back(RenderablePtr(new Renderable(GL_POINTS, 10.0f))); Vertex v; v.color[0] = 0.0f; v.color[1] = 0.0f; v.color[2] = 1.0f; v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; // add lines for (int i = 0; i < polyline.size(); i++) { v.location[0] = polyline[i].x(); v.location[1] = polyline[i].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); renderables[1]->vertices.push_back(v); } render(renderables); }
void RoadGraphRenderer::renderVoronoiDiagram(VoronoiDiagram& vd, float height) { std::vector<RenderablePtr> renderables; renderables.push_back(RenderablePtr(new Renderable(GL_LINES, 3.0f))); renderables.push_back(RenderablePtr(new Renderable(GL_POINTS, 10.0f))); Vertex v; v.color[0] = 0.0f; v.color[1] = 0.7f; v.color[2] = 0.7f; v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; v.location[2] = height; // add voronoi edges RoadEdgeIter ei, eend; for (boost::tie(ei, eend) = boost::edges(vd.edges.graph); ei != eend; ++ei) { if (!(vd.edges.graph[*ei]->valid)) continue; RoadVertexDesc src = boost::source(*ei, vd.edges.graph); RoadVertexDesc tgt = boost::target(*ei, vd.edges.graph); v.location[0] = vd.edges.graph[src]->pt.x(); v.location[1] = vd.edges.graph[tgt]->pt.y(); renderables[0]->vertices.push_back(v); } // add voronoi points for (int i = 0; i < vd.points.size(); i++) { v.location[0] = vd.points[i].x(); v.location[1] = vd.points[i].y(); if (vd.groups[i] == 0) { v.color[0] = 1.0f; v.color[1] = 0.0f; v.color[2] = 0.0f; } else { v.color[0] = 0.0f; v.color[1] = 0.0f; v.color[2] = 1.0f; } renderables[1]->vertices.push_back(v); } render(renderables); }
void SimpleFlatTerrain::generateMesh() { renderables.clear(); renderables.push_back(RenderablePtr(new Renderable(GL_QUADS))); Vertex v; v.color[0] = 233.0f / 255.0f; v.color[1] = 229.0f / 255.0f; v.color[2] = 220.0f / 255.0f; v.color[3] = 1.0f; v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; v.location[0] = -width/2; v.location[1] = -depth/2; v.location[2] = elevation; renderables[0]->vertices.push_back(v); v.location[0] = width/2; v.location[1] = -depth/2; renderables[0]->vertices.push_back(v); v.location[0] = width/2; v.location[1] = depth/2; renderables[0]->vertices.push_back(v); v.location[0] = -width/2; v.location[1] = depth/2; renderables[0]->vertices.push_back(v); modified = false; }
void RoadGraph::generateMesh() { if (!modified) return; renderables.clear(); renderables.push_back(RenderablePtr(new Renderable(GL_TRIANGLES))); renderables.push_back(RenderablePtr(new Renderable(GL_POINTS, 10.0f))); // road edge RoadEdgeIter ei, eend; for (boost::tie(ei, eend) = boost::edges(graph); ei != eend; ++ei) { if (!graph[*ei]->valid) continue; RoadEdgePtr edge = graph[*ei]; float height; switch (edge->type) { case RoadEdge::TYPE_HIGHWAY: height = highwayHeight; break; case RoadEdge::TYPE_BOULEVARD: height = avenueHeight; break; case RoadEdge::TYPE_AVENUE: height = avenueHeight; break; case RoadEdge::TYPE_STREET: height = avenueHeight; break; } QColor color = graph[*ei]->color; QColor bgColor = graph[*ei]->bgColor; // draw the border of the road segment if ((showHighways && edge->type == RoadEdge::TYPE_HIGHWAY) || (showBoulevard && edge->type == RoadEdge::TYPE_BOULEVARD) || (showAvenues && edge->type == RoadEdge::TYPE_AVENUE) || (showLocalStreets && edge->type == RoadEdge::TYPE_STREET)) { addMeshFromEdge(renderables[0], edge, widthBase * (1.0f + curbRatio), bgColor, height * 0.5f); addMeshFromEdge(renderables[0], edge, widthBase, color, height); } } modified = false; }
void RoadGraphRenderer::renderPoint(const QVector2D& pt, float height) { RenderablePtr renderable = RenderablePtr(new Renderable(GL_POINTS, 10.0f)); Vertex v; v.location[0] = pt.x(); v.location[1] = pt.y(); v.location[2] = height; v.color[0] = 0.0f; v.color[1] = 0.0f; v.color[2] = 1.0f; v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; renderable->vertices.push_back(v); renderOne(renderable); }
void Renderer::renderPoint(const QVector2D& pt, const QColor& color, float height) { RenderablePtr renderable = RenderablePtr(new Renderable(GL_POINTS, 10.0f)); Vertex v; v.location[0] = pt.x(); v.location[1] = pt.y(); v.location[2] = height; v.color[0] = color.redF(); v.color[1] = color.greenF(); v.color[2] = color.blueF(); v.color[3] = color.alphaF(); v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; renderable->vertices.push_back(v); renderOne(renderable); }
void Renderer::renderConcave(Polygon2D& polygon, const QColor& color, float height) { std::vector<RenderablePtr> renderables; renderables.push_back(RenderablePtr(new Renderable(GL_TRIANGLES))); if (polygon.size() < 3) return; Vertex v; v.color[0] = color.redF(); v.color[1] = color.greenF(); v.color[2] = color.blueF(); v.color[3] = color.alphaF(); v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; std::vector<Polygon2D> trapezoids = polygon.tessellate(); for (int i = 0; i < trapezoids.size(); ++i) { if (trapezoids[i].size() < 3) continue; for (int j = 1; j < trapezoids[i].size() - 1; ++j) { v.location[0] = trapezoids[i][0].x(); v.location[1] = trapezoids[i][0].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); v.location[0] = trapezoids[i][j].x(); v.location[1] = trapezoids[i][j].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); v.location[0] = trapezoids[i][j+1].x(); v.location[1] = trapezoids[i][j+1].y(); v.location[2] = height; renderables[0]->vertices.push_back(v); } } render(renderables); }
void RoadGraphRenderer::renderDenseArea(const AbstractArea& area, float height) { RenderablePtr renderable = RenderablePtr(new Renderable(GL_POINTS, 10.0f)); Vertex v; v.color[0] = 1.0f; v.color[1] = 0.0f; v.color[2] = 0.0f; v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; for (int y = -10000; y <= 10000; y+=10) { for (int x = -10000; x<= 10000; x+=10) { if (area.contains(QVector2D(x, y))) { v.location[0] = x; v.location[1] = y; v.location[2] = height; renderable->vertices.push_back(v); } } } renderOne(renderable); }
void Entity::addRenderable(Renderable* r) { this->addRenderable(RenderablePtr(r)); }