diff --git a/ext/ghoul b/ext/ghoul index 63cbcbd949..a7804e09d8 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 63cbcbd949e2a234abad2e1a98279af3585f8483 +Subproject commit a7804e09d888b17fe81ba92e5eb4b309b112144f diff --git a/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp b/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp index 083bd06bc4..2ec61f0222 100644 --- a/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp @@ -24,7 +24,6 @@ #include -#include #include #include #include @@ -35,6 +34,8 @@ #include #include #include +#include +#include #include #include #include @@ -45,7 +46,7 @@ namespace { constexpr const char* _loggerCat = "RenderableModelProjection"; - constexpr const char* keyGeometry = "Geometry"; + constexpr const char* KeyGeomModelFile = "GeometryFile"; constexpr const char* keyProjection = "Projection"; constexpr const char* keyBoundingSphereRadius = "BoundingSphereRadius"; @@ -89,10 +90,10 @@ documentation::Documentation RenderableModelProjection::Documentation() { Optional::No }, { - keyGeometry, - new ReferencingVerifier("base_geometry_model"), + KeyGeomModelFile, + new OrVerifier({ new StringVerifier, new StringListVerifier }), Optional::No, - "The geometry that is used for rendering this model." + "The file or files that that is used for rendering this model" }, { keyProjection, @@ -128,9 +129,56 @@ RenderableModelProjection::RenderableModelProjection(const ghoul::Dictionary& di dictionary, "RenderableModelProjection" ); - using ghoul::Dictionary; - Dictionary geometryDictionary = dictionary.value(keyGeometry); - _geometry = modelgeometry::ModelGeometry::createFromDictionary(geometryDictionary); + + if (dictionary.hasKey(KeyGeomModelFile)) { + std::string file; + + if (dictionary.hasKeyAndValue(KeyGeomModelFile)) { + // Handle single file + file = absPath(dictionary.value(KeyGeomModelFile)); + _geometry = ghoul::io::ModelReader::ref().loadModel(file, false, true); + } + else if (dictionary.hasKeyAndValue(KeyGeomModelFile)) { + ghoul::Dictionary fileDictionary = dictionary.value( + KeyGeomModelFile + ); + std::vector> geometries; + + for (std::string k : fileDictionary.keys()) { + // Handle each file + file = absPath(fileDictionary.value(k)); + geometries.push_back(ghoul::io::ModelReader::ref().loadModel( + file, + false, + true + )); + } + + if (geometries.size() > 0) { + ghoul::modelgeometry::ModelGeometry combinedGeometry = + std::move(*geometries[0].release()); + + // Combine all models into one ModelGeometry + for (unsigned int i = 1; i < geometries.size(); ++i) { + for (unsigned int m = 0; m < geometries[i]->meshes().size(); ++m) { + combinedGeometry.meshes().push_back( + std::move(geometries[i]->meshes()[m]) + ); + } + + for (unsigned int t = 0; t < geometries[i]->textureStorage().size(); ++t) { + combinedGeometry.textureStorage().push_back( + std::move(geometries[i]->textureStorage()[t]) + ); + } + } + _geometry = std::make_unique( + std::move(combinedGeometry) + ); + _geometry->calculateBoundingRadius(); + } + } + } addPropertySubOwner(_projectionComponent); @@ -200,7 +248,8 @@ void RenderableModelProjection::initializeGL() { _projectionComponent.initializeGL(); float bs = boundingSphere(); - _geometry->initialize(this); + float temp = 0.f; + _geometry->initialize(temp); setBoundingSphere(bs); // ignore bounding sphere set by geometry. } @@ -272,11 +321,8 @@ void RenderableModelProjection::render(const RenderData& data, RendererTasks&) { _projectionComponent.projectionFading() ); - _geometry->setUniforms(*_programObject); - ghoul::opengl::TextureUnit baseUnit; baseUnit.activate(); - _geometry->bindTexture(); _programObject->setUniform(_mainUniformCache.baseTexture, baseUnit); ghoul::opengl::TextureUnit projectionUnit; @@ -284,7 +330,7 @@ void RenderableModelProjection::render(const RenderData& data, RendererTasks&) { _projectionComponent.projectionTexture().bind(); _programObject->setUniform(_mainUniformCache.projectionTexture, projectionUnit); - _geometry->render(); + _geometry->render(*_programObject, false); _programObject->deactivate(); } @@ -369,9 +415,8 @@ void RenderableModelProjection::imageProjectGPU( _depthFboUniformCache.ModelTransform, _transform ); - _geometry->setUniforms(*_fboProgramObject); - _geometry->render(); + _geometry->render(*_fboProgramObject, false); _depthFboProgramObject->deactivate(); _projectionComponent.depthMapRenderEnd(); @@ -401,8 +446,7 @@ void RenderableModelProjection::imageProjectGPU( _fboProgramObject->setUniform(_fboUniformCache.ModelTransform, _transform); _fboProgramObject->setUniform(_fboUniformCache.boresight, _boresight); - _geometry->setUniforms(*_fboProgramObject); - _geometry->render(); + _geometry->render(*_fboProgramObject, false); _fboProgramObject->deactivate(); diff --git a/modules/spacecraftinstruments/rendering/renderablemodelprojection.h b/modules/spacecraftinstruments/rendering/renderablemodelprojection.h index 45d5ccf252..86f1ae98ce 100644 --- a/modules/spacecraftinstruments/rendering/renderablemodelprojection.h +++ b/modules/spacecraftinstruments/rendering/renderablemodelprojection.h @@ -39,6 +39,8 @@ namespace ghoul::opengl { class Texture; } // namespace ghoul::opengl +namespace ghoul::modelgeometry { class ModelGeometry; } + namespace openspace { namespace documentation { struct Documentation; } @@ -46,8 +48,6 @@ namespace documentation { struct Documentation; } struct RenderData; struct UpdateData; -namespace modelgeometry { class ModelGeometry; } - class RenderableModelProjection : public Renderable { public: RenderableModelProjection(const ghoul::Dictionary& dictionary); @@ -84,7 +84,7 @@ private: std::unique_ptr _depthFboProgramObject; UniformCache(ProjectorMatrix, ModelTransform) _depthFboUniformCache; - ghoul::mm_unique_ptr _geometry; + std::unique_ptr _geometry; glm::dmat3 _instrumentMatrix = glm::dmat3(1.0);