paysages: Clouds parameters.

git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@261 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
Michaël Lemaire 2012-02-07 21:03:58 +00:00 committed by ThunderK
parent 85abc44b56
commit a632974d29
4 changed files with 59 additions and 33 deletions

View file

@ -66,8 +66,12 @@ FormClouds::FormClouds(QWidget *parent):
addInputNoise("Noise", _layer.noise); addInputNoise("Noise", _layer.noise);
addInputDouble("Coverage", &_layer.coverage, 0.0, 1.0, 0.01, 0.1); addInputDouble("Coverage", &_layer.coverage, 0.0, 1.0, 0.01, 0.1);
addInputDouble("Scaling", &_layer.scaling, 1.0, 100.0, 0.5, 5.0); addInputDouble("Scaling", &_layer.scaling, 1.0, 100.0, 0.5, 5.0);
addInputColor("Base color", &_layer.color); addInputColor("Base color", &_layer.material.base);
addInputDouble("Opacity", &_layer.color.a, 0.0, 1.0, 0.01, 0.1); addInputDouble("Light reflection", &_layer.material.reflection, 0.0, 1.0, 0.01, 0.1);
addInputDouble("Light reflection shininess", &_layer.material.shininess, 0.0, 20.0, 0.1, 1.0);
addInputDouble("Transparency depth", &_layer.transparencydepth, 0.0, 100.0, 0.5, 5.0);
addInputDouble("Light traversal depth", &_layer.lighttraversal, 0.0, 100.0, 0.5, 5.0);
addInputDouble("Minimum lighting", &_layer.minimumlight, 0.0, 1.0, 0.01, 0.1);
revertConfig(); revertConfig();
} }

View file

@ -82,10 +82,14 @@ void autoGenRealisticLandscape(int seed)
cloud->ymin = 10.0; cloud->ymin = 10.0;
cloud->ycenter = 40.0; cloud->ycenter = 40.0;
cloud->ymax = 100.0; cloud->ymax = 100.0;
cloud->color.r = 0.7; cloud->material.base.r = 0.7;
cloud->color.g = 0.7; cloud->material.base.g = 0.7;
cloud->color.b = 0.7; cloud->material.base.b = 0.7;
cloud->color.a = 0.05; cloud->material.reflection = 0.1;
cloud->material.shininess = 2.0;
cloud->transparencydepth = 20.0;
cloud->lighttraversal = 50.0;
cloud->minimumlight = 0.8;
cloud->scaling = 50.0; cloud->scaling = 50.0;
cloud->coverage = 0.5; cloud->coverage = 0.5;
noiseGenerateBaseNoise(cloud->noise, 262144); noiseGenerateBaseNoise(cloud->noise, 262144);

View file

@ -38,7 +38,10 @@ void cloudsSave(FILE* f, CloudsDefinition* definition)
toolsSaveDouble(f, &layer->ymin); toolsSaveDouble(f, &layer->ymin);
toolsSaveDouble(f, &layer->ymax); toolsSaveDouble(f, &layer->ymax);
noiseSave(f, layer->noise); noiseSave(f, layer->noise);
colorSave(f, &layer->color); materialSave(f, &layer->material);
toolsSaveDouble(f, &layer->transparencydepth);
toolsSaveDouble(f, &layer->lighttraversal);
toolsSaveDouble(f, &layer->minimumlight);
toolsSaveDouble(f, &layer->scaling); toolsSaveDouble(f, &layer->scaling);
toolsSaveDouble(f, &layer->coverage); toolsSaveDouble(f, &layer->coverage);
} }
@ -63,7 +66,10 @@ void cloudsLoad(FILE* f, CloudsDefinition* definition)
toolsLoadDouble(f, &layer->ymin); toolsLoadDouble(f, &layer->ymin);
toolsLoadDouble(f, &layer->ymax); toolsLoadDouble(f, &layer->ymax);
noiseLoad(f, layer->noise); noiseLoad(f, layer->noise);
colorLoad(f, &layer->color); materialLoad(f, &layer->material);
toolsLoadDouble(f, &layer->transparencydepth);
toolsLoadDouble(f, &layer->lighttraversal);
toolsLoadDouble(f, &layer->minimumlight);
toolsLoadDouble(f, &layer->scaling); toolsLoadDouble(f, &layer->scaling);
toolsLoadDouble(f, &layer->coverage); toolsLoadDouble(f, &layer->coverage);
} }
@ -115,13 +121,18 @@ CloudsLayerDefinition cloudsLayerCreateDefinition()
{ {
CloudsLayerDefinition result; CloudsLayerDefinition result;
result.color = COLOR_BLACK; result.material.base = COLOR_WHITE;
result.coverage = 0.0; result.material.reflection = 0.1;
result.material.shininess = 2.0;
result.transparencydepth = 50.0;
result.lighttraversal = 50.0;
result.minimumlight = 0.8;
result.coverage = 0.5;
result.noise = noiseCreateGenerator(); result.noise = noiseCreateGenerator();
result.scaling = 1.0; result.scaling = 50.0;
result.ymin = 0.0; result.ymin = 50.0;
result.ycenter = 0.5; result.ycenter = 100.0;
result.ymax = 1.0; result.ymax = 200.0;
return result; return result;
} }
@ -410,10 +421,9 @@ static int _findSegments(CloudsLayerDefinition* definition, Renderer* renderer,
return segment_count; return segment_count;
} }
static Color _applyLayerLighting(CloudsLayerDefinition* definition, Renderer* renderer, Vector3 position, Color base, double detail) static Color _applyLayerLighting(CloudsLayerDefinition* definition, Renderer* renderer, Vector3 position, double detail)
{ {
Vector3 normal; Vector3 normal;
SurfaceMaterial material;
normal = v3Scale(_getNormal(definition, position, 1.0), 0.25); normal = v3Scale(_getNormal(definition, position, 1.0), 0.25);
normal = v3Add(normal, v3Scale(_getNormal(definition, position, 0.5), 0.25)); normal = v3Add(normal, v3Scale(_getNormal(definition, position, 0.5), 0.25));
@ -421,11 +431,7 @@ static Color _applyLayerLighting(CloudsLayerDefinition* definition, Renderer* re
normal = v3Add(normal, v3Scale(_getNormal(definition, position, 0.1), 0.25)); normal = v3Add(normal, v3Scale(_getNormal(definition, position, 0.1), 0.25));
normal = v3Scale(v3Normalize(normal), 0.1); normal = v3Scale(v3Normalize(normal), 0.1);
material.base = base; return renderer->applyLightingToSurface(renderer, position, normal, definition->material);
material.reflection = 0.3;
material.shininess = 2.0;
return renderer->applyLightingToSurface(renderer, position, normal, material);
} }
Color cloudsGetLayerColor(CloudsLayerDefinition* definition, Renderer* renderer, Vector3 start, Vector3 end) Color cloudsGetLayerColor(CloudsLayerDefinition* definition, Renderer* renderer, Vector3 start, Vector3 end)
@ -448,11 +454,11 @@ Color cloudsGetLayerColor(CloudsLayerDefinition* definition, Renderer* renderer,
detail = renderer->getPrecision(renderer, start) / definition->scaling; detail = renderer->getPrecision(renderer, start) / definition->scaling;
segment_count = _findSegments(definition, renderer, start, direction, detail, 20, 60.0, max_length, &inside_length, &total_length, segments); segment_count = _findSegments(definition, renderer, start, direction, detail, 20, definition->transparencydepth, max_length, &inside_length, &total_length, segments);
for (i = 0; i < segment_count; i++) for (i = 0; i < segment_count; i++)
{ {
col = _applyLayerLighting(definition, renderer, segments[i].start, definition->color, detail); col = _applyLayerLighting(definition, renderer, segments[i].start, detail);
col.a = (segments[i].length >= 50.0) ? 1.0 : (segments[i].length / 50.0); col.a = (segments[i].length >= definition->transparencydepth) ? 1.0 : (segments[i].length / definition->transparencydepth);
colorMask(&result, &col); colorMask(&result, &col);
} }
@ -487,22 +493,31 @@ Color cloudsGetColor(CloudsDefinition* definition, Renderer* renderer, Vector3 s
Color cloudsLayerFilterLight(CloudsLayerDefinition* definition, Renderer* renderer, Color light, Vector3 location, Vector3 light_location, Vector3 direction_to_light) Color cloudsLayerFilterLight(CloudsLayerDefinition* definition, Renderer* renderer, Color light, Vector3 location, Vector3 light_location, Vector3 direction_to_light)
{ {
double inside_depth, total_depth; double inside_depth, total_depth, factor;
CloudSegment segments[20]; CloudSegment segments[20];
_optimizeSearchLimits(definition, &location, &light_location); _optimizeSearchLimits(definition, &location, &light_location);
_findSegments(definition, renderer, location, direction_to_light, 0.1, 20, 50.0, v3Norm(v3Sub(light_location, location)), &inside_depth, &total_depth, segments); _findSegments(definition, renderer, location, direction_to_light, 0.1, 20, definition->lighttraversal, v3Norm(v3Sub(light_location, location)), &inside_depth, &total_depth, segments);
inside_depth *= 0.02; if (definition->lighttraversal < 0.0001)
if (inside_depth > 1.0)
{ {
inside_depth = 1.0; factor = 0.0;
}
else
{
factor = inside_depth / definition->lighttraversal;
if (factor > 1.0)
{
factor = 1.0;
}
} }
light.r = light.r * (1.0 - 0.2 * inside_depth); factor = 1.0 - (1.0 - definition->minimumlight) * factor;
light.g = light.g * (1.0 - 0.2 * inside_depth);
light.b = light.b * (1.0 - 0.2 * inside_depth); light.r = light.r * factor;
light.g = light.g * factor;
light.b = light.b * factor;
return light; return light;
} }

View file

@ -18,7 +18,10 @@ typedef struct
double ymin; double ymin;
double ymax; double ymax;
NoiseGenerator* noise; NoiseGenerator* noise;
Color color; SurfaceMaterial material;
double transparencydepth;
double lighttraversal;
double minimumlight;
double scaling; double scaling;
double coverage; double coverage;
} CloudsLayerDefinition; } CloudsLayerDefinition;