paysages : Restored foam on water + disabled light specularity on explorer and previews.

git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@533 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
Michaël Lemaire 2013-03-07 14:07:12 +00:00 committed by ThunderK
parent 970c452d93
commit dbb9e95442
7 changed files with 29 additions and 15 deletions

9
TODO
View file

@ -1,5 +1,4 @@
Technology Preview 2 : Technology Preview 2 :
- Create a StandardPreviewClass (with renderer, updateData, changeView, getColor, choices and toggles).
- Replace terrain canvas editor by full sculpting editor. - Replace terrain canvas editor by full sculpting editor.
=> Add a generation dialog, with fixed resolution. => Add a generation dialog, with fixed resolution.
=> Store local terrain modifications in fully dynamic canvas. => Store local terrain modifications in fully dynamic canvas.
@ -10,11 +9,9 @@ Technology Preview 2 :
=> Fix artifacts on aerial perspective (mostly when sun is near horizon) => Fix artifacts on aerial perspective (mostly when sun is near horizon)
=> Fix blue appearance at night => Fix blue appearance at night
- Finalize lighting refactoring - Finalize lighting refactoring
=> Restore water filtering
=> Restore cloud lighting => Restore cloud lighting
=> Restore and improve skydome lighting
- Hide Preetham's model. - Hide Preetham's model.
- Find a proper model for night sky (maybe Shirley). => Implement weather effect in Bruneton's model.
- Improve textures (current model is greatly incorrect). - Improve textures (current model is greatly incorrect).
=> Separate models (basic texture and covering texture). => Separate models (basic texture and covering texture).
=> Covering texture height should inpact terrain height. => Covering texture height should inpact terrain height.
@ -22,10 +19,11 @@ Technology Preview 2 :
- Clouds should keep distance to ground. - Clouds should keep distance to ground.
- Fix rendering when inside a cloud layer, with other upper or lower layers. - Fix rendering when inside a cloud layer, with other upper or lower layers.
- Improve cloud rendering precision (and beware of precision discontinuity when rendering clouds in front of ground (shorter distance)). - Improve cloud rendering precision (and beware of precision discontinuity when rendering clouds in front of ground (shorter distance)).
- Top-down previews and explorer renderings should be camera independant.
- Translations. - Translations.
Technlogy Preview 3 : Technlogy Preview 3 :
- Find a proper model for night sky (maybe Shirley).
- Create a StandardPreviewClass in C-lib (with renderer, updateData, changeView, getColor, choices and toggles).
- Fully move layer management from BaseForm to BaseFormLayer. - Fully move layer management from BaseForm to BaseFormLayer.
- Start vegetation system. - Start vegetation system.
- Add tone-mapping and exposure control to final image. - Add tone-mapping and exposure control to final image.
@ -64,7 +62,6 @@ Technology Preview 4 :
=> Interrupt chunk rendering when quitting dialog => Interrupt chunk rendering when quitting dialog
=> Don't display the water if it's below all ground => Don't display the water if it's below all ground
=> Try to overcome the near frustum cutting => Try to overcome the near frustum cutting
=> Disable specular lighting (dependant on camera location)
=> Add toggles (for water...) => Add toggles (for water...)
=> Max texture size should depend on GPU memory available => Max texture size should depend on GPU memory available
- Interrupt preview chunk renderings that will be discarded at commit, or that are no more visible. - Interrupt preview chunk renderings that will be discarded at commit, or that are no more visible.

View file

@ -15,6 +15,7 @@ public:
_renderer = rendererCreate(); _renderer = rendererCreate();
_renderer->applyTextures = _applyTextures; _renderer->applyTextures = _applyTextures;
_renderer->getCameraLocation = _getCameraLocation; _renderer->getCameraLocation = _getCameraLocation;
lightingManagerDisableSpecularity(_renderer->lighting);
_textures = texturesCreateDefinition(); _textures = texturesCreateDefinition();

View file

@ -76,6 +76,7 @@ WidgetExplorer::WidgetExplorer(QWidget *parent, CameraDefinition* camera):
_renderer->customData[2] = _base_camera; _renderer->customData[2] = _base_camera;
_renderer->applyTextures = _applyTextures; _renderer->applyTextures = _applyTextures;
_renderer->getCameraLocation = _getCameraLocation; _renderer->getCameraLocation = _getCameraLocation;
lightingManagerDisableSpecularity(_renderer->lighting);
_inited = false; _inited = false;
_updated = false; _updated = false;

View file

@ -34,7 +34,7 @@ static void _getLightingStatus(Renderer* renderer, LightStatus* status, Vector3
light.direction.z = 1.0; light.direction.z = 1.0;
light.direction = v3Normalize(light.direction); light.direction = v3Normalize(light.direction);
light.altered = 1; light.altered = 1;
light.reflection = 1.0; light.reflection = 0.0;
lightingPushLight(status, &light); lightingPushLight(status, &light);
light.color.r = 0.2; light.color.r = 0.2;

View file

@ -16,6 +16,7 @@ typedef struct
struct LightingManager struct LightingManager
{ {
int specularity_enabled;
int callbacks_count; int callbacks_count;
LightFilterCallback callbacks[MAX_CALLBACK_COUNT]; LightFilterCallback callbacks[MAX_CALLBACK_COUNT];
}; };
@ -35,6 +36,7 @@ LightingManager* lightingManagerCreate()
result = malloc(sizeof(LightingManager)); result = malloc(sizeof(LightingManager));
result->callbacks_count = 0; result->callbacks_count = 0;
result->specularity_enabled = 1;
return result; return result;
} }
@ -65,6 +67,11 @@ void lightingManagerRegisterFilter(LightingManager* filter, FuncLightingAlterLig
} }
} }
void lightingManagerDisableSpecularity(LightingManager* manager)
{
manager->specularity_enabled = 0;
}
LightStatus* lightingCreateStatus(LightingManager* manager, Vector3 location, Vector3 eye) LightStatus* lightingCreateStatus(LightingManager* manager, Vector3 location, Vector3 eye)
{ {
LightStatus* result; LightStatus* result;
@ -104,6 +111,11 @@ void lightingPushLight(LightStatus* status, LightDefinition* light)
} }
} }
if (!status->manager->specularity_enabled)
{
final.reflection = 0.0;
}
status->lights[status->light_count++] = final; status->lights[status->light_count++] = final;
} }
} }

View file

@ -32,6 +32,7 @@ typedef struct LightStatus LightStatus;
LightingManager* lightingManagerCreate(); LightingManager* lightingManagerCreate();
void lightingManagerDelete(LightingManager* filter); void lightingManagerDelete(LightingManager* filter);
void lightingManagerRegisterFilter(LightingManager* filter, FuncLightingAlterLight callback, void* data); void lightingManagerRegisterFilter(LightingManager* filter, FuncLightingAlterLight callback, void* data);
void lightingManagerDisableSpecularity(LightingManager* manager);
LightStatus* lightingCreateStatus(LightingManager* manager, Vector3 location, Vector3 eye); LightStatus* lightingCreateStatus(LightingManager* manager, Vector3 location, Vector3 eye);
void lightingDeleteStatus(LightStatus* status); void lightingDeleteStatus(LightStatus* status);

View file

@ -93,9 +93,9 @@ static inline Vector3 _refractRay(Vector3 incoming, Vector3 normal)
} }
} }
static inline void _applyFoam(WaterDefinition* definition, Vector3 location, Vector3 normal, double detail, SurfaceMaterial* material) static inline Color _getFoamMask(Renderer* renderer, WaterDefinition* definition, Vector3 location, Vector3 normal, double detail)
{ {
Color result = definition->foam_material.base; Color result;
double foam_factor, normal_diff, location_offset; double foam_factor, normal_diff, location_offset;
location_offset = 2.0 * detail; location_offset = 2.0 * detail;
@ -135,12 +135,12 @@ static inline void _applyFoam(WaterDefinition* definition, Vector3 location, Vec
if (foam_factor <= 1.0 - definition->foam_coverage) if (foam_factor <= 1.0 - definition->foam_coverage)
{ {
return; return COLOR_TRANSPARENT;
} }
foam_factor = (foam_factor - (1.0 - definition->foam_coverage)) * definition->foam_coverage; foam_factor = (foam_factor - (1.0 - definition->foam_coverage)) * definition->foam_coverage;
material->reflection = foam_factor * definition->foam_material.reflection + (1.0 - foam_factor) * material->reflection; /* TODO Re-use base lighting status */
material->shininess = foam_factor * definition->foam_material.shininess + (1.0 - foam_factor) * material->shininess; result = renderer->applyLightingToSurface(renderer, location, normal, &definition->foam_material);
/* TODO This should be configurable */ /* TODO This should be configurable */
if (foam_factor > 0.2) if (foam_factor > 0.2)
@ -151,7 +151,8 @@ static inline void _applyFoam(WaterDefinition* definition, Vector3 location, Vec
{ {
result.a = 0.8 * (foam_factor / 0.2); result.a = 0.8 * (foam_factor / 0.2);
} }
colorMask(&material->base, &result);
return result;
} }
static int _alterLight(Renderer* renderer, LightDefinition* light, Vector3 at) static int _alterLight(Renderer* renderer, LightDefinition* light, Vector3 at)
@ -215,7 +216,7 @@ static WaterResult _realGetResult(Renderer* renderer, double x, double z)
WaterResult result; WaterResult result;
RayCastingResult refracted; RayCastingResult refracted;
Vector3 location, normal, look_direction; Vector3 location, normal, look_direction;
Color color; Color color, foam;
double detail, depth; double detail, depth;
location.x = x; location.x = x;
@ -273,7 +274,8 @@ static WaterResult _realGetResult(Renderer* renderer, double x, double z)
color.b += result.reflected.b * definition->reflection + result.refracted.b * definition->transparency; color.b += result.reflected.b * definition->reflection + result.refracted.b * definition->transparency;
/* Merge with foam */ /* Merge with foam */
// _applyFoam(definition, location, normal, detail, &material); foam = _getFoamMask(renderer, definition, location, normal, detail);
colorMask(&color, &foam);
/* Bring color to the camera */ /* Bring color to the camera */
color = renderer->applyMediumTraversal(renderer, location, color); color = renderer->applyMediumTraversal(renderer, location, color);