clouds_walking: Restored cloud previews
This commit is contained in:
parent
1ede3de8d5
commit
b6376deeca
7 changed files with 124 additions and 63 deletions
|
@ -1,5 +1,6 @@
|
||||||
#include "formclouds.h"
|
#include "formclouds.h"
|
||||||
|
|
||||||
|
#include "rendering/clouds/clo_preview.h"
|
||||||
#include "rendering/tools/color.h"
|
#include "rendering/tools/color.h"
|
||||||
#include "rendering/tools/euclid.h"
|
#include "rendering/tools/euclid.h"
|
||||||
#include "rendering/scenery.h"
|
#include "rendering/scenery.h"
|
||||||
|
@ -12,24 +13,22 @@ class PreviewCloudsCoverage:public BasePreview
|
||||||
public:
|
public:
|
||||||
PreviewCloudsCoverage(QWidget* parent, CloudsLayerDefinition* layer):BasePreview(parent)
|
PreviewCloudsCoverage(QWidget* parent, CloudsLayerDefinition* layer):BasePreview(parent)
|
||||||
{
|
{
|
||||||
_renderer = cloudsCreatePreviewCoverageRenderer();
|
_renderer = cloudsPreviewCoverageCreateRenderer();
|
||||||
_3d = true;
|
_3d = true;
|
||||||
|
|
||||||
_original_layer = layer;
|
_original_layer = layer;
|
||||||
_preview_definition = (CloudsDefinition*)CloudsDefinitionClass.create();
|
|
||||||
|
|
||||||
addToggle("3d", tr("Perspective"), true);
|
addToggle("3d", tr("Perspective"), true);
|
||||||
configScaling(100.0, 1000.0, 20.0, 200.0);
|
configScaling(100.0, 1000.0, 20.0, 200.0);
|
||||||
}
|
}
|
||||||
~PreviewCloudsCoverage()
|
~PreviewCloudsCoverage()
|
||||||
{
|
{
|
||||||
CloudsDefinitionClass.destroy(_preview_definition);
|
|
||||||
rendererDelete(_renderer);
|
rendererDelete(_renderer);
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
Color getColor(double x, double y)
|
Color getColor(double x, double y)
|
||||||
{
|
{
|
||||||
return cloudsGetPreviewCoverage(_renderer, x, y, scaling, _3d);
|
return cloudsPreviewCoverageGetPixel(_renderer, x, y, scaling, _3d);
|
||||||
}
|
}
|
||||||
virtual void toggleChangeEvent(QString key, bool value)
|
virtual void toggleChangeEvent(QString key, bool value)
|
||||||
{
|
{
|
||||||
|
@ -41,15 +40,12 @@ protected:
|
||||||
}
|
}
|
||||||
void updateData()
|
void updateData()
|
||||||
{
|
{
|
||||||
layersDeleteLayer(_preview_definition->layers, 0);
|
cloudsPreviewCoverageBindLayer(_renderer, _original_layer);
|
||||||
layersAddLayer(_preview_definition->layers, _original_layer);
|
|
||||||
CloudsRendererClass.bind(_renderer, _preview_definition);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Renderer* _renderer;
|
Renderer* _renderer;
|
||||||
CloudsLayerDefinition* _original_layer;
|
CloudsLayerDefinition* _original_layer;
|
||||||
CloudsDefinition* _preview_definition;
|
|
||||||
bool _3d;
|
bool _3d;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -59,27 +55,28 @@ public:
|
||||||
PreviewCloudsColor(QWidget* parent, CloudsLayerDefinition* layer):BasePreview(parent)
|
PreviewCloudsColor(QWidget* parent, CloudsLayerDefinition* layer):BasePreview(parent)
|
||||||
{
|
{
|
||||||
_original_layer = layer;
|
_original_layer = layer;
|
||||||
_preview_definition = (CloudsDefinition*)CloudsDefinitionClass.create();
|
|
||||||
|
|
||||||
_renderer = cloudsCreatePreviewColorRenderer();
|
_renderer = cloudsPreviewMaterialCreateRenderer();
|
||||||
|
|
||||||
configScaling(0.5, 2.0, 0.1, 2.0);
|
configScaling(0.5, 2.0, 0.1, 2.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~PreviewCloudsColor()
|
||||||
|
{
|
||||||
|
rendererDelete(_renderer);
|
||||||
|
}
|
||||||
protected:
|
protected:
|
||||||
Color getColor(double x, double y)
|
Color getColor(double x, double y)
|
||||||
{
|
{
|
||||||
return cloudsGetPreviewColor(_renderer, x, y);
|
return cloudsPreviewMaterialGetPixel(_renderer, x, y);
|
||||||
}
|
}
|
||||||
void updateData()
|
void updateData()
|
||||||
{
|
{
|
||||||
layersDeleteLayer(_preview_definition->layers, 0);
|
cloudsPreviewMaterialBindLayer(_renderer, _original_layer);
|
||||||
layersAddLayer(_preview_definition->layers, _original_layer);
|
|
||||||
CloudsRendererClass.bind(_renderer, _preview_definition);
|
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Renderer* _renderer;
|
Renderer* _renderer;
|
||||||
CloudsLayerDefinition* _original_layer;
|
CloudsLayerDefinition* _original_layer;
|
||||||
CloudsDefinition* _preview_definition;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**************** Form ****************/
|
/**************** Form ****************/
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
#include "clo_lighting.h"
|
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
#ifndef _PAYSAGES_CLOUDS_LIGHTING_H_
|
|
||||||
#define _PAYSAGES_CLOUDS_LIGHTING_H_
|
|
||||||
|
|
||||||
#include "public.h"
|
|
||||||
#include "../tools/euclid.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cloud lighting helpers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bind fake lighting functions to a renderer.
|
|
||||||
*/
|
|
||||||
void cloudsBindFakeLightingToRenderer(CloudsRenderer* renderer);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bind real lighting functions to a renderer.
|
|
||||||
*/
|
|
||||||
void cloudsBindRealLightingToRenderer(CloudsRenderer* renderer);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -18,7 +18,7 @@ Color _fakeApplyLightingToSurface(Renderer* renderer, Vector3 location, Vector3
|
||||||
return COLOR_WHITE;
|
return COLOR_WHITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer* cloudsCreatePreviewCoverageRenderer()
|
Renderer* cloudsPreviewCoverageCreateRenderer()
|
||||||
{
|
{
|
||||||
Renderer* result = rendererCreate();
|
Renderer* result = rendererCreate();
|
||||||
result->render_quality = 5;
|
result->render_quality = 5;
|
||||||
|
@ -26,7 +26,15 @@ Renderer* cloudsCreatePreviewCoverageRenderer()
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Color cloudsGetPreviewCoverage(Renderer* renderer, double x, double y, double scaling, int perspective)
|
void cloudsPreviewCoverageBindLayer(Renderer* renderer, CloudsLayerDefinition* layer)
|
||||||
|
{
|
||||||
|
CloudsDefinition* definition = (CloudsDefinition*)CloudsDefinitionClass.create();
|
||||||
|
layersAddLayer(definition->layers, layer);
|
||||||
|
CloudsRendererClass.bind(renderer, definition);
|
||||||
|
CloudsDefinitionClass.destroy(definition);
|
||||||
|
}
|
||||||
|
|
||||||
|
Color cloudsPreviewCoverageGetPixel(Renderer* renderer, double x, double y, double scaling, int perspective)
|
||||||
{
|
{
|
||||||
if (perspective)
|
if (perspective)
|
||||||
{
|
{
|
||||||
|
@ -55,25 +63,91 @@ Color cloudsGetPreviewCoverage(Renderer* renderer, double x, double y, double sc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer* cloudsCreatePreviewColorRenderer()
|
static void _getLightingStatus(Renderer* renderer, LightStatus* status, Vector3 normal, int opaque)
|
||||||
|
{
|
||||||
|
LightDefinition light;
|
||||||
|
|
||||||
|
UNUSED(renderer);
|
||||||
|
UNUSED(normal);
|
||||||
|
UNUSED(opaque);
|
||||||
|
|
||||||
|
light.color.r = 1.0;
|
||||||
|
light.color.g = 1.0;
|
||||||
|
light.color.b = 1.0;
|
||||||
|
light.direction.x = -1.0;
|
||||||
|
light.direction.y = -0.5;
|
||||||
|
light.direction.z = 1.0;
|
||||||
|
light.direction = v3Normalize(light.direction);
|
||||||
|
light.altered = 1;
|
||||||
|
light.reflection = 0.0;
|
||||||
|
lightingPushLight(status, &light);
|
||||||
|
|
||||||
|
light.color.r = 0.2;
|
||||||
|
light.color.g = 0.2;
|
||||||
|
light.color.b = 0.2;
|
||||||
|
light.direction.x = 1.0;
|
||||||
|
light.direction.y = -0.5;
|
||||||
|
light.direction.z = -1.0;
|
||||||
|
light.direction = v3Normalize(light.direction);
|
||||||
|
light.altered = 0;
|
||||||
|
light.reflection = 0.0;
|
||||||
|
lightingPushLight(status, &light);
|
||||||
|
}
|
||||||
|
|
||||||
|
Renderer* cloudsPreviewMaterialCreateRenderer()
|
||||||
{
|
{
|
||||||
Renderer* result = rendererCreate();
|
Renderer* result = rendererCreate();
|
||||||
result->render_quality = 8;
|
result->render_quality = 8;
|
||||||
|
result->atmosphere->getLightingStatus = _getLightingStatus;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Color cloudsGetPreviewColor(Renderer* renderer, double x, double y)
|
static double _getDensity(Renderer* renderer, CloudsLayerDefinition* layer, Vector3 location)
|
||||||
|
{
|
||||||
|
UNUSED(renderer);
|
||||||
|
UNUSED(layer);
|
||||||
|
|
||||||
|
double distance = v3Norm(location);
|
||||||
|
if (distance > 1.0)
|
||||||
|
{
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
else if (distance < 0.8)
|
||||||
|
{
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (1.0 - distance) / 0.2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cloudsPreviewMaterialBindLayer(Renderer* renderer, CloudsLayerDefinition* layer)
|
||||||
|
{
|
||||||
|
CloudsDefinition* definition = (CloudsDefinition*)CloudsDefinitionClass.create();
|
||||||
|
layersAddLayer(definition->layers, layer);
|
||||||
|
CloudsRendererClass.bind(renderer, definition);
|
||||||
|
CloudsDefinitionClass.destroy(definition);
|
||||||
|
|
||||||
|
layer = layersGetLayer(renderer->clouds->definition->layers, 0);
|
||||||
|
layer->lower_altitude = -1.0;
|
||||||
|
layer->thickness = 2.0;
|
||||||
|
|
||||||
|
renderer->clouds->getLayerDensity = _getDensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
Color cloudsPreviewMaterialGetPixel(Renderer* renderer, double x, double y)
|
||||||
{
|
{
|
||||||
Vector3 start, end;
|
Vector3 start, end;
|
||||||
double thickness = 0.5;
|
double thickness = 2.0;
|
||||||
|
|
||||||
start.x = x * thickness * 0.5;
|
start.x = x * thickness * 0.5;
|
||||||
start.y = -y * thickness * 0.5;
|
start.z = y * thickness * 0.5;
|
||||||
start.z = thickness * 0.5;
|
start.y = thickness * 0.5;
|
||||||
|
|
||||||
end.x = start.x;
|
end.x = start.x;
|
||||||
end.y = start.y;
|
end.z = start.z;
|
||||||
end.z = -start.z;
|
end.y = -start.y;
|
||||||
|
|
||||||
return renderer->clouds->getColor(renderer, COLOR_BLUE, start, end);
|
return renderer->clouds->getColor(renderer, COLOR_BLUE, start, end);
|
||||||
}
|
}
|
||||||
|
|
28
src/rendering/clouds/clo_preview.h
Normal file
28
src/rendering/clouds/clo_preview.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef _PAYSAGES_CLOUDS_PREVIEW_H_
|
||||||
|
#define _PAYSAGES_CLOUDS_PREVIEW_H_
|
||||||
|
|
||||||
|
#include "public.h"
|
||||||
|
#include "../tools/euclid.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cloud preview helpers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Renderer* cloudsPreviewCoverageCreateRenderer();
|
||||||
|
void cloudsPreviewCoverageBindLayer(Renderer* renderer, CloudsLayerDefinition* layer);
|
||||||
|
Color cloudsPreviewCoverageGetPixel(Renderer* renderer, double x, double y, double scaling, int perspective);
|
||||||
|
|
||||||
|
Renderer* cloudsPreviewMaterialCreateRenderer();
|
||||||
|
void cloudsPreviewMaterialBindLayer(Renderer* renderer, CloudsLayerDefinition* layer);
|
||||||
|
Color cloudsPreviewMaterialGetPixel(Renderer* renderer, double x, double y);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -185,7 +185,7 @@ static Color _getColor(Renderer* renderer, Color base, Vector3 start, Vector3 en
|
||||||
|
|
||||||
/* Apply aerial perspective approximation */
|
/* Apply aerial perspective approximation */
|
||||||
/* TODO This should be done at cloud entry */
|
/* TODO This should be done at cloud entry */
|
||||||
base = renderer->applyMediumTraversal(renderer, ostart, base);
|
base = renderer->atmosphere->applyAerialPerspective(renderer, ostart, base).final;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,12 +80,6 @@ LayerType cloudsGetLayerType();
|
||||||
void cloudsAutoPreset(CloudsDefinition* definition, CloudsPreset preset);
|
void cloudsAutoPreset(CloudsDefinition* definition, CloudsPreset preset);
|
||||||
void cloudsLayerAutoPreset(CloudsLayerDefinition* definition, CloudsLayerPreset preset);
|
void cloudsLayerAutoPreset(CloudsLayerDefinition* definition, CloudsLayerPreset preset);
|
||||||
|
|
||||||
Renderer* cloudsCreatePreviewCoverageRenderer();
|
|
||||||
Color cloudsGetPreviewCoverage(Renderer* renderer, double x, double y, double scaling, int perspective);
|
|
||||||
|
|
||||||
Renderer* cloudsCreatePreviewColorRenderer();
|
|
||||||
Color cloudsGetPreviewColor(Renderer* renderer, double x, double y);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue