2015-10-18 15:26:19 +00:00
|
|
|
#include "VegetationRasterizer.h"
|
|
|
|
|
|
|
|
#include <cassert>
|
2015-12-14 21:20:28 +00:00
|
|
|
#include "Scenery.h"
|
2015-10-18 15:26:19 +00:00
|
|
|
#include "CanvasFragment.h"
|
|
|
|
#include "Color.h"
|
|
|
|
#include "SpaceSegment.h"
|
|
|
|
#include "SoftwareRenderer.h"
|
2015-12-14 21:20:28 +00:00
|
|
|
#include "VegetationDefinition.h"
|
2015-10-18 15:26:19 +00:00
|
|
|
#include "VegetationRenderer.h"
|
|
|
|
#include "RayCastingResult.h"
|
|
|
|
|
2015-12-16 00:33:02 +00:00
|
|
|
VegetationRasterizer::VegetationRasterizer(SoftwareRenderer *renderer, RenderProgress *progress,
|
|
|
|
unsigned short client_id)
|
2015-11-09 21:38:00 +00:00
|
|
|
: TerrainRasterizer(renderer, progress, client_id) {
|
2015-10-18 15:26:19 +00:00
|
|
|
setYOffset(0.5);
|
2015-12-14 21:20:28 +00:00
|
|
|
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);
|
|
|
|
}
|
2015-10-18 15:26:19 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:38:00 +00:00
|
|
|
Color VegetationRasterizer::shadeFragment(const CanvasFragment &fragment, const CanvasFragment *previous) const {
|
2015-10-18 15:26:19 +00:00
|
|
|
assert(previous != NULL);
|
|
|
|
|
2015-11-09 21:38:00 +00:00
|
|
|
if (not fragment.isFrontFacing() or previous->getClient() == RASTERIZER_CLIENT_SKY) {
|
2015-10-18 15:26:19 +00:00
|
|
|
// This is an exit fragment, or the last before sky
|
|
|
|
return COLOR_TRANSPARENT;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Even if we assert, this may happen in rare circumstances (no opaque background fragment), so don't crash
|
2015-11-09 21:38:00 +00:00
|
|
|
if (previous == NULL) {
|
2015-10-18 15:26:19 +00:00
|
|
|
return COLOR_TRANSPARENT;
|
|
|
|
}
|
|
|
|
|
|
|
|
SoftwareRenderer *renderer = getRenderer();
|
|
|
|
SpaceSegment segment(renderer->unprojectPoint(fragment.getPixel()), renderer->unprojectPoint(previous->getPixel()));
|
|
|
|
RayCastingResult result = renderer->getVegetationRenderer()->getResult(segment);
|
2015-11-09 21:38:00 +00:00
|
|
|
if (result.hit) {
|
2015-10-18 15:26:19 +00:00
|
|
|
return result.hit_color;
|
2015-11-09 21:38:00 +00:00
|
|
|
} else {
|
2015-10-18 15:26:19 +00:00
|
|
|
return COLOR_TRANSPARENT;
|
|
|
|
}
|
|
|
|
}
|