paysages : Addes texture transparency at borders.

git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@318 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
Michaël Lemaire 2012-05-06 08:49:12 +00:00 committed by ThunderK
parent 3bd7e91659
commit 468b3628e5
4 changed files with 34 additions and 11 deletions

4
TODO
View file

@ -1,5 +1,6 @@
Technology Preview 2 : Technology Preview 2 :
- Interface for textures thickness and slope_range. - Replace zone ranges with curves.
- Interface for textures thickness, slope_range and thickness_transparency.
- Render tab previews should not rerender when changing render options. - Render tab previews should not rerender when changing render options.
- Compute shadows only once for all textures at a same location. - Compute shadows only once for all textures at a same location.
=> Add an intermediary light status (two pass lighting). => Add an intermediary light status (two pass lighting).
@ -36,6 +37,7 @@ Technology Preview 3 :
- Multi threaded first pass. - Multi threaded first pass.
- Fix potential holes in land rendering. - Fix potential holes in land rendering.
- Progressive final render. - Progressive final render.
- If we can't remove clouds artifacts, blur them.
Release Candidate : Release Candidate :
- Polish all features and UI. - Polish all features and UI.

View file

@ -161,6 +161,7 @@ void autoGenRealisticLandscape(int seed)
texture->material.shininess = 3.0; texture->material.shininess = 3.0;
texture->thickness = 0.001; texture->thickness = 0.001;
texture->slope_range = 0.001; texture->slope_range = 0.001;
texture->thickness_transparency = 0.0;
texture = texturesGetLayer(&textures, texturesAddLayer(&textures)); texture = texturesGetLayer(&textures, texturesAddLayer(&textures));
zoneAddHeightRangeQuick(texture->zone, 1.0, -1.0, 0.0, 3.0, 15.0); zoneAddHeightRangeQuick(texture->zone, 1.0, -1.0, 0.0, 3.0, 15.0);
zoneAddSlopeRangeQuick(texture->zone, 1.0, 0.0, 0.0, 0.1, 0.7); zoneAddSlopeRangeQuick(texture->zone, 1.0, 0.0, 0.0, 0.1, 0.7);
@ -176,6 +177,7 @@ void autoGenRealisticLandscape(int seed)
texture->material.shininess = 2.0; texture->material.shininess = 2.0;
texture->thickness = 0.02; texture->thickness = 0.02;
texture->slope_range = 0.03; texture->slope_range = 0.03;
texture->thickness_transparency = 0.005;
texture = texturesGetLayer(&textures, texturesAddLayer(&textures)); texture = texturesGetLayer(&textures, texturesAddLayer(&textures));
zoneAddHeightRangeQuick(texture->zone, 1.0, 4.0, 5.0, 100.0, 100.0); zoneAddHeightRangeQuick(texture->zone, 1.0, 4.0, 5.0, 100.0, 100.0);
zoneAddSlopeRangeQuick(texture->zone, 1.0, 0.0, 0.0, 0.2, 1.0); zoneAddSlopeRangeQuick(texture->zone, 1.0, 0.0, 0.0, 0.2, 1.0);
@ -190,6 +192,7 @@ void autoGenRealisticLandscape(int seed)
texture->material.shininess = 0.6; texture->material.shininess = 0.6;
texture->thickness = 0.05; texture->thickness = 0.05;
texture->slope_range = 0.3; texture->slope_range = 0.3;
texture->thickness_transparency = 0.015;
scenerySetTextures(&textures); scenerySetTextures(&textures);
texturesDeleteDefinition(&textures); texturesDeleteDefinition(&textures);

View file

@ -15,6 +15,15 @@
static TextureLayerDefinition _NULL_LAYER; static TextureLayerDefinition _NULL_LAYER;
typedef struct
{
Vector3 location;
Vector3 normal;
double thickness;
Color color;
double thickness_transparency;
} TextureResult;
void texturesInit() void texturesInit()
{ {
_NULL_LAYER = texturesLayerCreateDefinition(); _NULL_LAYER = texturesLayerCreateDefinition();
@ -39,6 +48,7 @@ void texturesSave(PackStream* stream, TexturesDefinition* definition)
materialSave(stream, &definition->textures[i].material); materialSave(stream, &definition->textures[i].material);
packWriteDouble(stream, &definition->textures[i].thickness); packWriteDouble(stream, &definition->textures[i].thickness);
packWriteDouble(stream, &definition->textures[i].slope_range); packWriteDouble(stream, &definition->textures[i].slope_range);
packWriteDouble(stream, &definition->textures[i].thickness_transparency);
} }
} }
@ -64,6 +74,7 @@ void texturesLoad(PackStream* stream, TexturesDefinition* definition)
materialLoad(stream, &layer->material); materialLoad(stream, &layer->material);
packReadDouble(stream, &definition->textures[i].thickness); packReadDouble(stream, &definition->textures[i].thickness);
packReadDouble(stream, &definition->textures[i].slope_range); packReadDouble(stream, &definition->textures[i].slope_range);
packReadDouble(stream, &definition->textures[i].thickness_transparency);
} }
texturesValidateDefinition(definition); texturesValidateDefinition(definition);
@ -126,6 +137,7 @@ TextureLayerDefinition texturesLayerCreateDefinition()
result.material.shininess = 0.0; result.material.shininess = 0.0;
result.thickness = 0.0; result.thickness = 0.0;
result.slope_range = 0.001; result.slope_range = 0.001;
result.thickness_transparency = 0.0;
return result; return result;
} }
@ -143,6 +155,7 @@ void texturesLayerCopyDefinition(TextureLayerDefinition* source, TextureLayerDef
destination->bump_scaling = source->bump_scaling; destination->bump_scaling = source->bump_scaling;
destination->thickness = source->thickness; destination->thickness = source->thickness;
destination->slope_range = source->slope_range; destination->slope_range = source->slope_range;
destination->thickness_transparency = source->thickness_transparency;
noiseCopy(source->bump_noise, destination->bump_noise); noiseCopy(source->bump_noise, destination->bump_noise);
zoneCopy(source->zone, destination->zone); zoneCopy(source->zone, destination->zone);
} }
@ -293,6 +306,7 @@ static inline TextureResult _getTerrainResult(Renderer* renderer, double x, doub
result.location = center; result.location = center;
result.color = COLOR_GREEN; result.color = COLOR_GREEN;
result.thickness = -100.0; result.thickness = -100.0;
result.thickness_transparency = 0.0;
return result; return result;
} }
@ -339,6 +353,7 @@ static inline TextureResult _getLayerResult(TextureLayerDefinition* definition,
} }
result_center.color = renderer->applyLightingToSurface(renderer, result_center.location, result_center.normal, definition->material); result_center.color = renderer->applyLightingToSurface(renderer, result_center.location, result_center.normal, definition->material);
result_center.thickness_transparency = definition->thickness_transparency;
return result_center; return result_center;
} }
@ -358,6 +373,7 @@ Color texturesGetColor(TexturesDefinition* definition, Renderer* renderer, doubl
{ {
TextureResult results[TEXTURES_MAX_LAYERS + 1]; TextureResult results[TEXTURES_MAX_LAYERS + 1];
Color result; Color result;
double thickness, last_height;
int i; int i;
/* TODO Do not compute layers fully covered */ /* TODO Do not compute layers fully covered */
@ -375,9 +391,18 @@ Color texturesGetColor(TexturesDefinition* definition, Renderer* renderer, doubl
qsort(results, definition->nbtextures + 1, sizeof(TextureResult), _cmpResults); qsort(results, definition->nbtextures + 1, sizeof(TextureResult), _cmpResults);
result = results[0].color; result = results[0].color;
for (i = 0; i < definition->nbtextures; i++) last_height = results[0].thickness;
for (i = 1; i <= definition->nbtextures; i++)
{ {
colorMask(&result, &results[i + 1].color); thickness = results[i].thickness - last_height;
last_height = results[i].thickness;
if (thickness < results[i].thickness_transparency)
{
results[i].color.a = thickness / results[i].thickness_transparency;
}
colorMask(&result, &results[i].color);
} }
return result; return result;

View file

@ -22,6 +22,7 @@ typedef struct
SurfaceMaterial material; SurfaceMaterial material;
double thickness; double thickness;
double slope_range; double slope_range;
double thickness_transparency;
} TextureLayerDefinition; } TextureLayerDefinition;
typedef struct typedef struct
@ -30,14 +31,6 @@ typedef struct
TextureLayerDefinition textures[TEXTURES_MAX_LAYERS]; TextureLayerDefinition textures[TEXTURES_MAX_LAYERS];
} TexturesDefinition; } TexturesDefinition;
typedef struct
{
Vector3 location;
Vector3 normal;
double thickness;
Color color;
} TextureResult;
void texturesInit(); void texturesInit();
void texturesQuit(); void texturesQuit();
void texturesSave(PackStream* stream, TexturesDefinition* definition); void texturesSave(PackStream* stream, TexturesDefinition* definition);