From 54ad5bfdd513ebbb2bb0a7f43425d702f144fd3f Mon Sep 17 00:00:00 2001 From: Malin E Date: Wed, 9 Aug 2023 16:04:20 +0200 Subject: [PATCH] Add pivot property for Models to move model origin --- modules/base/rendering/renderablemodel.cpp | 33 ++++++++++++++-------- modules/base/rendering/renderablemodel.h | 1 + 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index e8eb35b013..5b7f5db8aa 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -143,6 +143,13 @@ namespace { openspace::properties::Property::Visibility::Developer }; + constexpr openspace::properties::Property::PropertyInfo PivotInfo = { + "Pivot", + "Pivot", + "A vector that moves the place of origin for the model", + openspace::properties::Property::Visibility::AdvancedUser + }; + constexpr openspace::properties::Property::PropertyInfo ModelScaleInfo = { "ModelScale", "Model Scale", @@ -278,6 +285,9 @@ namespace { // [[codegen::verbatim(ModelTransformInfo.description)]] std::optional modelTransform; + // [[codegen::verbatim(PivotInfo.description)]] + std::optional pivot; + // [[codegen::verbatim(RotationVecInfo.description)]] std::optional rotationVector; @@ -322,6 +332,12 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) glm::dmat4(-1.0), glm::dmat4(1.0) ) + , _pivot( + PivotInfo, + glm::vec3(0.f), + glm::vec3(-std::numeric_limits::max()), + glm::vec3(std::numeric_limits::max()) + ) , _modelScale(ModelScaleInfo, 1.0, std::numeric_limits::epsilon(), 4e+27) , _rotationVec(RotationVecInfo, glm::dvec3(0.0), glm::dvec3(0.0), glm::dvec3(360.0)) , _enableDepthTest(EnableDepthTestInfo, true) @@ -371,17 +387,10 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) } } - if (p.modelTransform.has_value()) { - _modelTransform = *p.modelTransform; - } - - if (p.animationStartTime.has_value()) { - _animationStart = *p.animationStartTime; - } - - if (p.enableAnimation.has_value()) { - _enableAnimation = *p.enableAnimation; - } + _modelTransform = p.modelTransform.value_or(_modelTransform); + _pivot = p.pivot.value_or(_pivot); + _animationStart = p.animationStartTime.value_or(_animationStart); + _enableAnimation = p.enableAnimation.value_or(_enableAnimation); if (p.animationTimeScale.has_value()) { if (std::holds_alternative(*p.animationTimeScale)) { @@ -460,6 +469,7 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) addProperty(_enableFaceCulling); addProperty(_enableDepthTest); addProperty(_modelTransform); + addProperty(_pivot); addProperty(_rotationVec); addProperty(_modelScale); @@ -781,6 +791,7 @@ void RenderableModel::render(const RenderData& data, RendererTasks&) { // Model transform and view transform needs to be in double precision const glm::dmat4 modelTransform = + glm::translate(glm::dmat4(1.0), glm::dvec3(_pivot.value())) * glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * glm::dmat4(data.modelTransform.rotation) * glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)) * diff --git a/modules/base/rendering/renderablemodel.h b/modules/base/rendering/renderablemodel.h index 25c6f7f919..fd963a7a0d 100644 --- a/modules/base/rendering/renderablemodel.h +++ b/modules/base/rendering/renderablemodel.h @@ -97,6 +97,7 @@ private: properties::BoolProperty _performShading; properties::BoolProperty _enableFaceCulling; properties::DMat4Property _modelTransform; + properties::Vec3Property _pivot; properties::Vec3Property _rotationVec; properties::BoolProperty _enableDepthTest;