diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index de8906e5fa..d3fc7c35f5 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -223,6 +223,20 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo UseOverrideColorInfo = { + "UseOverrideColor", + "Use Override Color", + "Wether or not to render model with a single color.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo OverrideColorInfo = { + "OverrideColor", + "Override Color", + "The single color to use for entire model (RGBA).", + openspace::properties::Property::Visibility::AdvancedUser + }; + struct [[codegen::Dictionary(RenderableModel)]] Parameters { // The file or files that should be loaded in this RenderableModel. The file can // contain filesystem tokens. This specifies the model that is rendered by @@ -353,6 +367,12 @@ namespace { std::optional lightSource; std::optional shadowGroup; + + // [[codegen::verbatim(UseOverrideColorInfo.description)]] + std::optional useOverrideColor; + + // [[codegen::verbatim(OverrideColorInfo.description)]] + std::optional overrideColor; }; #include "renderablemodel_codegen.cpp" } // namespace @@ -396,6 +416,8 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) properties::OptionProperty::DisplayType::Dropdown ) , _lightSourcePropertyOwner({ "LightSources", "Light Sources" }) + , _useOverrideColor(UseOverrideColorInfo, false) + , _overrideColor(OverrideColorInfo, glm::vec4(0, 0, 0, 1)) { const Parameters p = codegen::bake(dictionary); @@ -515,6 +537,8 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) _castShadow = p.castShadow.value_or(_castShadow); _lightSource = p.lightSource.value_or(""); _shadowGroup = p.shadowGroup.value_or(""); + _useOverrideColor = p.useOverrideColor.value_or(_useOverrideColor); + _overrideColor = p.overrideColor.value_or(_overrideColor); addProperty(_enableAnimation); addPropertySubOwner(_lightSourcePropertyOwner); @@ -532,6 +556,8 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) addProperty(_pivot); addProperty(_rotationVec); addProperty(_useCache); + addProperty(_useOverrideColor); + addProperty(_overrideColor); addProperty(_modelScale); _modelScale.setExponent(20.f); @@ -1059,6 +1085,11 @@ void RenderableModel::render(const RenderData& data, RendererTasks&) { } } + _program->setUniform("has_override_color", _useOverrideColor); + if (_useOverrideColor) { + _program->setUniform("override_color", _overrideColor); + } + if (!_shouldRenderTwice) { // Reset manual depth test _program->setUniform( diff --git a/modules/base/rendering/renderablemodel.h b/modules/base/rendering/renderablemodel.h index 8dc052e3ce..bc6a0f54ac 100644 --- a/modules/base/rendering/renderablemodel.h +++ b/modules/base/rendering/renderablemodel.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -124,6 +125,8 @@ private: properties::BoolProperty _castShadow; std::string _lightSource; std::string _shadowGroup; + properties::BoolProperty _useOverrideColor; + properties::Vec4Property _overrideColor; bool _autoSizeFrustum = false; diff --git a/modules/base/shaders/model_fs.glsl b/modules/base/shaders/model_fs.glsl index 0066d1f544..807097e1e8 100644 --- a/modules/base/shaders/model_fs.glsl +++ b/modules/base/shaders/model_fs.glsl @@ -67,6 +67,8 @@ uniform bool has_shadow_depth_map; uniform sampler2D shadow_depth_map; in vec4 lightspace_position; +uniform bool has_override_color; +uniform vec4 override_color; Fragment getFragment() { Fragment frag; @@ -199,5 +201,11 @@ Fragment getFragment() { } frag.color.a = diffuseAlbedo.a * opacity; + + if (has_override_color) { + frag.color = override_color; + } + + // frag.color = frag.color * 0.00000000000000000000001 + override_color ; return frag; }