From 26cba26847a654536f4c9fda9ed2f4337d773089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Mon, 14 Dec 2015 22:20:28 +0100 Subject: [PATCH] Do not rasterize vegetation when there is no layer --- src/interface/commandline/tests.cpp | 6 +++++ src/render/software/Rasterizer.cpp | 4 ++-- src/render/software/Rasterizer.h | 2 +- src/render/software/SkyRasterizer.cpp | 4 ++-- src/render/software/SkyRasterizer.h | 2 +- src/render/software/TerrainRasterizer.cpp | 4 ++-- src/render/software/TerrainRasterizer.h | 2 +- src/render/software/VegetationRasterizer.cpp | 25 +++++++++++++++++--- src/render/software/VegetationRasterizer.h | 9 ++++++- src/render/software/WaterRasterizer.cpp | 4 ++-- src/render/software/WaterRasterizer.h | 2 +- src/render/software/software_global.h | 1 + src/tests/VegetationRasterizer_Test.cpp | 22 +++++++++++++++++ 13 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 src/tests/VegetationRasterizer_Test.cpp diff --git a/src/interface/commandline/tests.cpp b/src/interface/commandline/tests.cpp index e26d635..453a51b 100644 --- a/src/interface/commandline/tests.cpp +++ b/src/interface/commandline/tests.cpp @@ -203,9 +203,15 @@ static void testNearFrustum() { SoftwareCanvasRenderer renderer(&scenery); renderer.setSize(400, 300); renderer.setQuality(0.1); + renderer.enablePostprocess(false); + startTestRender(&renderer, "near_frustum_good_raw"); + renderer.enablePostprocess(true); startTestRender(&renderer, "near_frustum_good"); renderer.getWaterRasterizer()->setAutoCutLimit(1000.0); + renderer.enablePostprocess(false); + startTestRender(&renderer, "near_frustum_bad_raw"); + renderer.enablePostprocess(true); startTestRender(&renderer, "near_frustum_bad"); } diff --git a/src/render/software/Rasterizer.cpp b/src/render/software/Rasterizer.cpp index 5210a7c..d5627ce 100644 --- a/src/render/software/Rasterizer.cpp +++ b/src/render/software/Rasterizer.cpp @@ -21,7 +21,7 @@ struct paysages::software::ScanPoint { double y; double z; } location; - int client; + unsigned short client; bool front_facing; }; @@ -32,7 +32,7 @@ struct paysages::software::RenderScanlines { int right; }; -Rasterizer::Rasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id, const Color &color) +Rasterizer::Rasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id, const Color &color) : renderer(renderer), progress(progress), client_id(client_id) { this->color = new Color(color); diff --git a/src/render/software/Rasterizer.h b/src/render/software/Rasterizer.h index f899388..0eec737 100644 --- a/src/render/software/Rasterizer.h +++ b/src/render/software/Rasterizer.h @@ -19,7 +19,7 @@ typedef struct RenderScanlines RenderScanlines; */ class SOFTWARESHARED_EXPORT Rasterizer { public: - Rasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id, const Color &color); + Rasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id, const Color &color); virtual ~Rasterizer(); inline SoftwareRenderer *getRenderer() const { diff --git a/src/render/software/SkyRasterizer.cpp b/src/render/software/SkyRasterizer.cpp index 7bfc79e..98854a8 100644 --- a/src/render/software/SkyRasterizer.cpp +++ b/src/render/software/SkyRasterizer.cpp @@ -14,8 +14,8 @@ #define SPHERE_SIZE 20000.0 -SkyRasterizer::SkyRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id) - : Rasterizer(renderer, progress, client_id, Color(0.9, 0.9, 1.0)) { +SkyRasterizer::SkyRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id) + : Rasterizer(renderer, progress, client_id, Color(0.7, 0.7, 1.0)) { } int SkyRasterizer::prepareRasterization() { diff --git a/src/render/software/SkyRasterizer.h b/src/render/software/SkyRasterizer.h index f674de5..4c31298 100644 --- a/src/render/software/SkyRasterizer.h +++ b/src/render/software/SkyRasterizer.h @@ -10,7 +10,7 @@ namespace software { class SOFTWARESHARED_EXPORT SkyRasterizer : public Rasterizer { public: - SkyRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id); + SkyRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id); virtual int prepareRasterization() override; virtual void rasterizeToCanvas(CanvasPortion *canvas) override; diff --git a/src/render/software/TerrainRasterizer.cpp b/src/render/software/TerrainRasterizer.cpp index 103dbe4..7257ce1 100644 --- a/src/render/software/TerrainRasterizer.cpp +++ b/src/render/software/TerrainRasterizer.cpp @@ -12,8 +12,8 @@ #include "CanvasFragment.h" #include "RenderProgress.h" -TerrainRasterizer::TerrainRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id) - : Rasterizer(renderer, progress, client_id, Color(1.0, 0.9, 0.9)) { +TerrainRasterizer::TerrainRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id) + : Rasterizer(renderer, progress, client_id, Color(1.0, 0.7, 0.7)) { setBackFaceCulling(true); yoffset = 0.0; } diff --git a/src/render/software/TerrainRasterizer.h b/src/render/software/TerrainRasterizer.h index 738b606..863a0aa 100644 --- a/src/render/software/TerrainRasterizer.h +++ b/src/render/software/TerrainRasterizer.h @@ -20,7 +20,7 @@ class SOFTWARESHARED_EXPORT TerrainRasterizer : public Rasterizer { } TerrainChunkInfo; public: - TerrainRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id); + TerrainRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id); /** * Set the rasterization quality. diff --git a/src/render/software/VegetationRasterizer.cpp b/src/render/software/VegetationRasterizer.cpp index 5a6266c..778f2ce 100644 --- a/src/render/software/VegetationRasterizer.cpp +++ b/src/render/software/VegetationRasterizer.cpp @@ -1,18 +1,37 @@ #include "VegetationRasterizer.h" #include - +#include "Scenery.h" #include "CanvasFragment.h" #include "Color.h" #include "SpaceSegment.h" #include "SoftwareRenderer.h" +#include "VegetationDefinition.h" #include "VegetationRenderer.h" #include "RayCastingResult.h" -VegetationRasterizer::VegetationRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id) +VegetationRasterizer::VegetationRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id) : TerrainRasterizer(renderer, progress, client_id) { setYOffset(0.5); - setColor(Color(0.8, 1.0, 0.8, 0.5)); + setColor(Color(0.7, 1.0, 0.7, 0.5)); +} + +bool VegetationRasterizer::isUseful() const { + return renderer->getScenery()->getVegetation()->getMaxHeight() > 0.0; +} + +int VegetationRasterizer::prepareRasterization() { + if (isUseful()) { + return TerrainRasterizer::prepareRasterization(); + } else { + return 0; + } +} + +void VegetationRasterizer::rasterizeToCanvas(CanvasPortion *canvas) { + if (isUseful()) { + TerrainRasterizer::rasterizeToCanvas(canvas); + } } Color VegetationRasterizer::shadeFragment(const CanvasFragment &fragment, const CanvasFragment *previous) const { diff --git a/src/render/software/VegetationRasterizer.h b/src/render/software/VegetationRasterizer.h index 7ce57b7..8912d41 100644 --- a/src/render/software/VegetationRasterizer.h +++ b/src/render/software/VegetationRasterizer.h @@ -10,8 +10,15 @@ namespace software { class SOFTWARESHARED_EXPORT VegetationRasterizer : public TerrainRasterizer { public: - VegetationRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id); + VegetationRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id); + /** + * Returns true if the rasterization process is useful. + */ + bool isUseful() const; + + virtual int prepareRasterization() override; + virtual void rasterizeToCanvas(CanvasPortion *canvas) override; virtual Color shadeFragment(const CanvasFragment &fragment, const CanvasFragment *previous) const override; }; } diff --git a/src/render/software/WaterRasterizer.cpp b/src/render/software/WaterRasterizer.cpp index f5042c1..00b55f3 100644 --- a/src/render/software/WaterRasterizer.cpp +++ b/src/render/software/WaterRasterizer.cpp @@ -6,8 +6,8 @@ #include "CanvasFragment.h" #include "RenderProgress.h" -WaterRasterizer::WaterRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id) - : Rasterizer(renderer, progress, client_id, Color(0.9, 0.95, 1.0)) { +WaterRasterizer::WaterRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id) + : Rasterizer(renderer, progress, client_id, Color(0.7, 0.85, 1.0)) { } static inline Vector3 _getFirstPassVertex(SoftwareRenderer *renderer, double x, double z) { diff --git a/src/render/software/WaterRasterizer.h b/src/render/software/WaterRasterizer.h index acbf3bf..2b2ff4c 100644 --- a/src/render/software/WaterRasterizer.h +++ b/src/render/software/WaterRasterizer.h @@ -10,7 +10,7 @@ namespace software { class WaterRasterizer : public Rasterizer { public: - WaterRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, int client_id); + WaterRasterizer(SoftwareRenderer *renderer, RenderProgress *progress, unsigned short client_id); void rasterizeQuad(CanvasPortion *canvas, double x, double z, double size); diff --git a/src/render/software/software_global.h b/src/render/software/software_global.h index f889707..8a647cb 100644 --- a/src/render/software/software_global.h +++ b/src/render/software/software_global.h @@ -37,6 +37,7 @@ class Rasterizer; class OverlayRasterizer; class SkyRasterizer; class TerrainRasterizer; +class VegetationRasterizer; class LightingManager; class LightStatus; diff --git a/src/tests/VegetationRasterizer_Test.cpp b/src/tests/VegetationRasterizer_Test.cpp new file mode 100644 index 0000000..f0d2188 --- /dev/null +++ b/src/tests/VegetationRasterizer_Test.cpp @@ -0,0 +1,22 @@ +#include "BaseTestCase.h" +#include "VegetationRasterizer.h" + +#include "SoftwareCanvasRenderer.h" +#include "Scenery.h" +#include "VegetationDefinition.h" +#include "VegetationLayerDefinition.h" + +TEST(VegetationRasterizer, isUseful) { + Scenery scenery; + SoftwareCanvasRenderer renderer(&scenery); + VegetationRasterizer rast(&renderer, renderer.getProgressHelper(), 0); + + EXPECT_FALSE(rast.isUseful()); + + VegetationLayerDefinition layer(NULL, "test"); + layer.applyPreset(VegetationLayerDefinition::VEGETATION_BASIC_TREES); + scenery.getVegetation()->addLayer(layer); + + EXPECT_TRUE(rast.isUseful()); +} +