From a9a6134633e606807d010237ff0146ad55de2171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Wed, 25 Dec 2013 19:45:56 +0100 Subject: [PATCH] Fixed material dialog validation and made material hardness to work --- src/definition/SurfaceMaterial.cpp | 62 ++++++++++++------- src/definition/SurfaceMaterial.h | 13 ++-- src/definition/TextureLayerDefinition.cpp | 6 +- src/definition/WaterDefinition.cpp | 12 ++-- .../desktop/lighting/DialogMaterialEditor.cpp | 9 ++- .../AtmosphereColorPreviewRenderer.cpp | 4 +- .../software/CloudBasicLayerRenderer.cpp | 2 +- src/render/software/LightingManager.cpp | 11 ++++ 8 files changed, 76 insertions(+), 43 deletions(-) diff --git a/src/definition/SurfaceMaterial.cpp b/src/definition/SurfaceMaterial.cpp index e980538..04ce97b 100644 --- a/src/definition/SurfaceMaterial.cpp +++ b/src/definition/SurfaceMaterial.cpp @@ -2,35 +2,49 @@ #include "PackStream.h" -void materialSave(PackStream* stream, SurfaceMaterial* material) +SurfaceMaterial::SurfaceMaterial(): + SurfaceMaterial(COLOR_BLACK) { - stream->write(&material->base.h); - stream->write(&material->base.l); - stream->write(&material->base.s); - - stream->write(&material->hardness); - stream->write(&material->reflection); - stream->write(&material->shininess); - - stream->write(&material->receive_shadows); } -void materialLoad(PackStream* stream, SurfaceMaterial* material) +SurfaceMaterial::SurfaceMaterial(const Color &color) { - stream->read(&material->base.h); - stream->read(&material->base.l); - stream->read(&material->base.s); - - stream->read(&material->hardness); - stream->read(&material->reflection); - stream->read(&material->shininess); - - stream->read(&material->receive_shadows); - - materialValidate(material); + base = colorToHSL(color); + hardness = 0.5; + reflection = 0.0; + shininess = 0.0; + receive_shadows = 1.0; } -void materialValidate(SurfaceMaterial* material) +void SurfaceMaterial::save(PackStream* stream) const { - material->_rgb = colorFromHSL(material->base); + stream->write(&base.h); + stream->write(&base.l); + stream->write(&base.s); + + stream->write(&hardness); + stream->write(&reflection); + stream->write(&shininess); + + stream->write(&receive_shadows); +} + +void SurfaceMaterial::load(PackStream* stream) +{ + stream->read(&base.h); + stream->read(&base.l); + stream->read(&base.s); + + stream->read(&hardness); + stream->read(&reflection); + stream->read(&shininess); + + stream->read(&receive_shadows); + + validate(); +} + +void SurfaceMaterial::validate() +{ + _rgb = colorFromHSL(base); } diff --git a/src/definition/SurfaceMaterial.h b/src/definition/SurfaceMaterial.h index 71ea441..5a68266 100644 --- a/src/definition/SurfaceMaterial.h +++ b/src/definition/SurfaceMaterial.h @@ -12,6 +12,15 @@ namespace definition { class DEFINITIONSHARED_EXPORT SurfaceMaterial { +public: + SurfaceMaterial(); + SurfaceMaterial(const Color& color); + + void save(PackStream* stream) const; + void load(PackStream* stream); + + void validate(); + public: ColorHSL base; @@ -27,8 +36,4 @@ public: } } -DEFINITIONSHARED_EXPORT void materialSave(PackStream* stream, SurfaceMaterial* material); -DEFINITIONSHARED_EXPORT void materialLoad(PackStream* stream, SurfaceMaterial* material); -DEFINITIONSHARED_EXPORT void materialValidate(SurfaceMaterial* material); - #endif // SURFACEMATERIAL_H diff --git a/src/definition/TextureLayerDefinition.cpp b/src/definition/TextureLayerDefinition.cpp index 70ae38f..655d4bb 100644 --- a/src/definition/TextureLayerDefinition.cpp +++ b/src/definition/TextureLayerDefinition.cpp @@ -43,7 +43,7 @@ void TextureLayerDefinition::validate() _detail_noise->normalizeAmplitude(-0.008, 0.008, 0); _detail_noise->validate(); - materialValidate(material); + material->validate(); /* Update zone height range */ Scenery* scenery = getScenery(); @@ -80,7 +80,7 @@ void TextureLayerDefinition::save(PackStream* stream) const stream->write(&displacement_scaling); stream->write(&displacement_height); stream->write(&displacement_offset); - materialSave(stream, material); + material->save(stream); _displacement_noise->save(stream); _detail_noise->save(stream); @@ -94,7 +94,7 @@ void TextureLayerDefinition::load(PackStream* stream) stream->read(&displacement_scaling); stream->read(&displacement_height); stream->read(&displacement_offset); - materialLoad(stream, material); + material->load(stream); _displacement_noise->load(stream); _detail_noise->load(stream); diff --git a/src/definition/WaterDefinition.cpp b/src/definition/WaterDefinition.cpp index c0121d1..5986251 100644 --- a/src/definition/WaterDefinition.cpp +++ b/src/definition/WaterDefinition.cpp @@ -36,7 +36,7 @@ void WaterDefinition::save(PackStream* stream) const { BaseDefinition::save(stream); - materialSave(stream, material); + material->save(stream); depth_color->save(stream); stream->write(&transparency_depth); stream->write(&transparency); @@ -49,7 +49,7 @@ void WaterDefinition::save(PackStream* stream) const stream->write(&turbulence); stream->write(&foam_coverage); - materialSave(stream, foam_material); + foam_material->save(stream); _waves_noise->save(stream); } @@ -58,7 +58,7 @@ void WaterDefinition::load(PackStream* stream) { BaseDefinition::load(stream); - materialLoad(stream, material); + material->load(stream); depth_color->load(stream); stream->read(&transparency_depth); stream->read(&transparency); @@ -71,7 +71,7 @@ void WaterDefinition::load(PackStream* stream) stream->read(&turbulence); stream->read(&foam_coverage); - materialLoad(stream, foam_material); + foam_material->load(stream); _waves_noise->load(stream); @@ -116,8 +116,8 @@ void WaterDefinition::validate() _waves_noise->setFunctionParams(NOISE_FUNCTION_SIMPLEX, -turbulence, 0.0); _waves_noise->validate(); - materialValidate(material); - materialValidate(foam_material); + material->validate(); + foam_material->validate(); } void WaterDefinition::applyPreset(WaterPreset preset) diff --git a/src/interface/desktop/lighting/DialogMaterialEditor.cpp b/src/interface/desktop/lighting/DialogMaterialEditor.cpp index a69e7ce..1e7bcec 100644 --- a/src/interface/desktop/lighting/DialogMaterialEditor.cpp +++ b/src/interface/desktop/lighting/DialogMaterialEditor.cpp @@ -46,12 +46,17 @@ DialogMaterialEditor::~DialogMaterialEditor() bool DialogMaterialEditor::getMaterial(QWidget* parent, SurfaceMaterial* material) { DialogMaterialEditor dialog(parent, material); - return dialog.exec() != 0; + bool validated = dialog.exec() != 0; + if (validated) + { + *material = dialog.edited; + } + return validated; } void DialogMaterialEditor::refreshFromLocalData() { - materialValidate(&edited); + edited.validate(); ui->preview_color->update(); } diff --git a/src/render/preview/AtmosphereColorPreviewRenderer.cpp b/src/render/preview/AtmosphereColorPreviewRenderer.cpp index 22c32d1..aa273be 100644 --- a/src/render/preview/AtmosphereColorPreviewRenderer.cpp +++ b/src/render/preview/AtmosphereColorPreviewRenderer.cpp @@ -55,9 +55,7 @@ static Mount MOUNTS[MOUNTS_COUNT] = { }, }; -static SurfaceMaterial MOUNT_MATERIAL = { - {0.4, 0.4, 0.4, 1.0}, 0.0, 0.0, 0.0, 0.0, {0.0, 0.0, 0.0, 0.0} -}; +static SurfaceMaterial MOUNT_MATERIAL(Color(0.4, 0.4, 0.4, 1.0)); static inline int _rayIntersectsTriangle(Vector3 p, Vector3 d, Vector3 v0, Vector3 v1, Vector3 v2, Vector3* hit) { diff --git a/src/render/software/CloudBasicLayerRenderer.cpp b/src/render/software/CloudBasicLayerRenderer.cpp index dbffe41..95c9594 100644 --- a/src/render/software/CloudBasicLayerRenderer.cpp +++ b/src/render/software/CloudBasicLayerRenderer.cpp @@ -181,7 +181,7 @@ Color CloudBasicLayerRenderer::getColor(BaseCloudsModel *model, const Vector3 &e material.hardness = 0.25; material.reflection = 0.0; material.shininess = 0.0; - materialValidate(&material); + material.validate(); col = parent->applyLightingToSurface(segments[i].start, parent->getAtmosphereRenderer()->getSunDirection(), material); diff --git a/src/render/software/LightingManager.cpp b/src/render/software/LightingManager.cpp index 7620a63..2c89eb3 100644 --- a/src/render/software/LightingManager.cpp +++ b/src/render/software/LightingManager.cpp @@ -60,6 +60,17 @@ Color LightingManager::applyFinalComponent(const LightComponent &component, cons /* diffused light */ double diffuse = direction_inv.dotProduct(normal.normalize()); + double sign = (diffuse < 0.0) ? -1.0 : 1.0; + if (material.hardness <= 0.5) + { + double hardness = material.hardness * 2.0; + diffuse = (1.0 - hardness) * (diffuse * diffuse) * sign + hardness * diffuse; + } + else if (diffuse != 0.0) + { + double hardness = (material.hardness - 0.5) * 2.0; + diffuse = (1.0 - hardness) * diffuse + hardness * sign * sqrt(fabs(diffuse)); + } diffuse = (diffuse + (1.0 - normal_norm)) / (1.0 + (1.0 - normal_norm)); if (diffuse > 0.0) {