paysages3d/src/render/software/SoftwareRenderer.cpp

154 lines
4 KiB
C++
Raw Normal View History

2013-11-09 17:46:34 +00:00
#include "SoftwareRenderer.h"
#include "CameraDefinition.h"
2013-11-10 16:04:38 +00:00
#include "Scenery.h"
#include "FluidMediumManager.h"
#include "AtmosphereRenderer.h"
2013-11-15 23:27:40 +00:00
#include "AtmosphereDefinition.h"
#include "AtmosphereResult.h"
#include "CloudsRenderer.h"
#include "TerrainRenderer.h"
#include "TexturesRenderer.h"
#include "WaterRenderer.h"
#include "SkyRasterizer.h"
2013-12-05 15:44:18 +00:00
#include "TerrainRasterizer.h"
2013-12-08 17:05:18 +00:00
#include "WaterRasterizer.h"
#include "LightStatus.h"
#include "LightingManager.h"
// Legacy compatibility
#include "renderer.h"
static double _getPrecision(Renderer* renderer, Vector3 location)
{
Vector3 projected;
projected = renderer->render_camera->project(location);
projected.x += 1.0;
//projected.y += 1.0;
return v3Norm(v3Sub(renderer->render_camera->unproject(projected), location)); // / (double)render_quality;
}
2013-11-09 17:46:34 +00:00
2013-11-10 16:04:38 +00:00
SoftwareRenderer::SoftwareRenderer(Scenery* scenery)
2013-11-09 17:46:34 +00:00
{
atmosphere_renderer = new BaseAtmosphereRenderer(this);
clouds_renderer = new CloudsRenderer(this);
terrain_renderer = new TerrainRenderer(this);
textures_renderer = new TexturesRenderer(this);
water_renderer = new WaterRenderer(this);
fluid_medium = new FluidMediumManager(this);
2013-11-10 16:04:38 +00:00
if (scenery)
{
this->scenery = scenery;
own_scenery = false;
2013-11-10 16:04:38 +00:00
}
else
{
this->scenery = new Scenery;
own_scenery = true;
2013-11-10 16:04:38 +00:00
}
2013-11-09 17:46:34 +00:00
}
SoftwareRenderer::~SoftwareRenderer()
{
delete atmosphere_renderer;
delete clouds_renderer;
delete terrain_renderer;
delete textures_renderer;
delete water_renderer;
2013-11-09 17:46:34 +00:00
delete fluid_medium;
if (own_scenery)
{
delete scenery;
}
2013-11-09 17:46:34 +00:00
}
2013-11-10 16:04:38 +00:00
void SoftwareRenderer::setScenery(Scenery* scenery)
{
if (!own_scenery)
{
this->scenery = new Scenery;
own_scenery = true;
}
scenery->copy(this->scenery);
}
void SoftwareRenderer::prepare()
2013-11-10 16:04:38 +00:00
{
// Prepare sub renderers
delete atmosphere_renderer;
atmosphere_renderer = new SoftwareBrunetonAtmosphereRenderer(this);
delete clouds_renderer;
clouds_renderer = new CloudsRenderer(this);
clouds_renderer->update();
delete terrain_renderer;
terrain_renderer = new TerrainRenderer(this);
delete textures_renderer;
textures_renderer = new TexturesRenderer(this);
delete water_renderer;
water_renderer = new WaterRenderer(this);
// Setup transitional renderers (for C-legacy subsystems)
getPrecision = _getPrecision;
// Prepare global tools
fluid_medium->clearMedia();
//fluid_medium->registerMedium(water_renderer);
2013-11-10 16:04:38 +00:00
}
void SoftwareRenderer::rasterize()
{
2013-12-05 15:44:18 +00:00
TerrainRasterizer terrain(this);
terrain.renderSurface();
2013-12-08 17:05:18 +00:00
WaterRasterizer water(this);
water.renderSurface();
SkyRasterizer sky(this);
sky.rasterize();
}
Color SoftwareRenderer::applyLightingToSurface(const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material)
{
LightStatus status(lighting, location, getCameraLocation(this, location));
atmosphere_renderer->getLightingStatus(&status, normal, 0);
return status.apply(normal, material);
}
Color SoftwareRenderer::applyMediumTraversal(Vector3 location, Color color)
{
color = atmosphere_renderer->applyAerialPerspective(location, color).final;
color = clouds_renderer->getColor(getCameraLocation(this, location), location, color);
return color;
/*Vector3 eye = cameraGetLocation(scenery->getCamera());
return fluid_medium->applyTraversal(eye, location, color);*/
}
2013-12-08 16:56:59 +00:00
RayCastingResult SoftwareRenderer::rayWalking(const Vector3 &location, const Vector3 &direction, int, int, int, int)
2013-12-08 16:56:59 +00:00
{
RayCastingResult result;
Color sky_color;
result = terrain_renderer->castRay(location, direction);
if (!result.hit)
{
sky_color = atmosphere_renderer->getSkyColor(direction).final;
result.hit = 1;
result.hit_location = v3Add(location, v3Scale(direction, 1000.0));
result.hit_color = clouds_renderer->getColor(location, result.hit_location, sky_color);
}
2013-12-08 16:56:59 +00:00
return result;
}