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 ModelRenderer::renderSetup(const Setup& setup, const glm::mat4& projectionMat, const glm::mat4& viewMat, const glm::mat4& worldMat) { const AnimationFrame& frame = setup.placementFrames.back(); for(uint32_t i = 0; i < setup.models.size(); i++) { const Location& location = frame.locations[i]; const glm::vec3& scale = setup.scales[i]; glm::mat4 subWorldMat = glm::translate(glm::mat4{}, location.position) * glm::mat4_cast(location.rotation) * glm::scale(glm::mat4(), scale); renderOne(setup.models[i], projectionMat, viewMat, worldMat * subWorldMat); } }
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 Renderer::render(std::vector<RenderablePtr>& renderables) { for (int i = 0; i < renderables.size(); i++) { renderOne(renderables[i]); } }
void ModelRenderer::render(const glm::mat4& projectionMat, const glm::mat4& viewMat) { program_.use(); LandcellManager& landcellManager = Core::get().landcellManager(); ObjectManager& objectManager = Core::get().objectManager(); glm::vec3 cameraPosition = Core::get().camera().position(); glUniform4f(program_.getUniform("cameraPosition"), static_cast<GLfloat>(cameraPosition.x), static_cast<GLfloat>(cameraPosition.y), static_cast<GLfloat>(cameraPosition.z), 1.0f); // first pass, render solid objects and collect objects that need depth sorting depthSortList_.clear(); for(auto& pair : objectManager) { Object& object = *pair.second; if(!object.model()) { continue; } int dx = object.landcellId().x() - landcellManager.center().x(); int dy = object.landcellId().y() - landcellManager.center().y(); glm::vec3 blockPosition{dx * Land::kBlockSize, dy * Land::kBlockSize, 0.0}; glm::mat4 rotateMat = glm::mat4_cast(object.location().rotation); glm::mat4 translateMat = glm::translate(glm::mat4{}, blockPosition + object.location().position); glm::mat4 worldMat = translateMat * rotateMat; renderOne(object.model(), projectionMat, viewMat, worldMat); } for(auto& pair : landcellManager) { int dx = pair.first.x() - landcellManager.center().x(); int dy = pair.first.y() - landcellManager.center().y(); glm::mat4 blockTransform = glm::translate(glm::mat4{}, glm::vec3{dx * Land::kBlockSize, dy * Land::kBlockSize, 0.0}); for(const StaticObject& staticObject : pair.second->staticObjects()) { renderOne(staticObject.resource, projectionMat, viewMat, blockTransform * staticObject.transform); } } // second pass, sort and render objects that need depth sorting sort(depthSortList_.begin(), depthSortList_.end(), CompareByDepth{}); for(const DepthSortedModel& depthSortedModel : depthSortList_) { renderModel(*depthSortedModel.model, projectionMat, viewMat, depthSortedModel.worldMat, /*firstPass*/ false); } }