From 10d2b755e023b58257a10e7ea176b91081eef3fc Mon Sep 17 00:00:00 2001 From: Michael Lemaire Date: Fri, 29 Jul 2016 13:57:55 +0200 Subject: [PATCH] broken wip --- src/interface/modeler/RenderProcess.cpp | 8 +++++-- src/interface/modeler/qml/main.qml | 7 ++++++ src/render/software/SoftwareRayRenderer.cpp | 2 ++ src/render/software/WaterIntersector.cpp | 22 ++++++++++++++++++ src/render/software/WaterIntersector.h | 25 +++++++++++++++++++++ src/render/software/software_global.h | 1 + 6 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/render/software/WaterIntersector.cpp create mode 100644 src/render/software/WaterIntersector.h diff --git a/src/interface/modeler/RenderProcess.cpp b/src/interface/modeler/RenderProcess.cpp index ba8d02f..ad158e1 100644 --- a/src/interface/modeler/RenderProcess.cpp +++ b/src/interface/modeler/RenderProcess.cpp @@ -99,8 +99,12 @@ void RenderProcess::startRender(Scenery *scenery, const RenderConfig &config) { delete renderer; } - // renderer = new SoftwareCanvasRenderer(scenery); - renderer = new SoftwareRayRenderer(scenery); + auto raytracing = window->findQmlObject("tool_render_raytracing"); + if (raytracing->property("checked").toBool()) { + renderer = new SoftwareRayRenderer(scenery); + } else { + renderer = new SoftwareCanvasRenderer(scenery); + } renderer->setConfig(config); destination->setCanvas(renderer->getCanvas()); diff --git a/src/interface/modeler/qml/main.qml b/src/interface/modeler/qml/main.qml index b998fa9..bf61953 100644 --- a/src/interface/modeler/qml/main.qml +++ b/src/interface/modeler/qml/main.qml @@ -112,6 +112,13 @@ OpenGLView { hovertext: qsTr("Show last rendered image") shortcut: "F6" } + + ToolbarButton { + id: tool_render_raytracing + toggle: true + objectName: "tool_render_raytracing" + hovertext: qsTr("Use raytracing instead of rasterization") + } } BaseSecondaryToolbar { diff --git a/src/render/software/SoftwareRayRenderer.cpp b/src/render/software/SoftwareRayRenderer.cpp index 2f0b289..249c287 100644 --- a/src/render/software/SoftwareRayRenderer.cpp +++ b/src/render/software/SoftwareRayRenderer.cpp @@ -9,6 +9,7 @@ #include "SkyIntersector.h" #include "TerrainIntersector.h" #include "Vector3.h" +#include "WaterIntersector.h" class SoftwareRayRenderer::pimpl { public: @@ -30,6 +31,7 @@ void SoftwareRayRenderer::registerStandardIntersectors() { impl->manager.registerIntersector(make_shared(getAtmosphereRenderer())); impl->manager.registerIntersector(make_shared(getTerrainRenderer())); + impl->manager.registerIntersector(make_shared(getWaterRenderer())); } void SoftwareRayRenderer::renderPortion(CanvasPortion *portion, RenderProgress *progress, bool *interrupt) { diff --git a/src/render/software/WaterIntersector.cpp b/src/render/software/WaterIntersector.cpp new file mode 100644 index 0000000..3d7002b --- /dev/null +++ b/src/render/software/WaterIntersector.cpp @@ -0,0 +1,22 @@ +#include "WaterIntersector.h" + +#include "InfinitePlane.h" +#include "InfiniteRay.h" +#include "WaterRenderer.h" + +WaterIntersector::WaterIntersector(WaterRenderer *renderer): renderer(renderer) { +} + +int WaterIntersector::getPriority() const { + return 10; +} + +bool WaterIntersector::findIntersection(const Vector3 &eye, const Vector3 &direction, double, Vector3 *out_hit) const { + InfinitePlane water(Vector3(0.0, renderer->getHeightInfo().base_height, 0.0), VECTOR_UP); + int intersect = water.checkRayIntersection(InfiniteRay(eye, direction), out_hit); + return intersect == 1 && direction.dotProduct(out_hit->sub(eye)) > 0.0; +} + +Color WaterIntersector::getColorAtHit(const Vector3 &, const Vector3 &location) const { + return renderer->getResult(location.x, location.z).final; +} diff --git a/src/render/software/WaterIntersector.h b/src/render/software/WaterIntersector.h new file mode 100644 index 0000000..d4b05bf --- /dev/null +++ b/src/render/software/WaterIntersector.h @@ -0,0 +1,25 @@ +#pragma once + +#include "software_global.h" + +#include "RayIntersector.h" + +namespace paysages { +namespace software { + +/** + * Ray intersector with water. + */ +class SOFTWARESHARED_EXPORT WaterIntersector : public RayIntersector { + public: + WaterIntersector(WaterRenderer *renderer); + virtual int getPriority() const override; + virtual bool findIntersection(const Vector3 &eye, const Vector3 &direction, double limit, + Vector3 *out_hit) const override; + virtual Color getColorAtHit(const Vector3 &eye, const Vector3 &location) const override; + + private: + WaterRenderer *renderer; +}; +} +} diff --git a/src/render/software/software_global.h b/src/render/software/software_global.h index dc8dfad..783f449 100644 --- a/src/render/software/software_global.h +++ b/src/render/software/software_global.h @@ -49,6 +49,7 @@ class RayCastingManager; class RayCastingResult; class RayIntersector; class SkyIntersector; +class WaterIntersector; class NightSky; class MoonRenderer;