diff --git a/library/phx/rendering/components/mesh_render_settings.cpp b/library/phx/rendering/components/mesh_render_settings.cpp index 23e920fbe5fadbc1eb9ababd2f65ceff381e29b9..0a2907d581bad4d411c712ed357092391673441c 100644 --- a/library/phx/rendering/components/mesh_render_settings.cpp +++ b/library/phx/rendering/components/mesh_render_settings.cpp @@ -24,7 +24,7 @@ namespace phx { -MeshRenderSettings MeshRenderSettings::default_settings_; +const MeshRenderSettings MeshRenderSettings::default_settings_; void MeshRenderSettings::SetWireframeMode(const bool enabled) { wireframe_mode_ = enabled; @@ -32,7 +32,7 @@ void MeshRenderSettings::SetWireframeMode(const bool enabled) { bool MeshRenderSettings::GetWireframeMode() const { return wireframe_mode_; } -MeshRenderSettings* MeshRenderSettings::GetDefault() { +const MeshRenderSettings* MeshRenderSettings::GetDefault() { return &default_settings_; } diff --git a/library/phx/rendering/components/mesh_render_settings.hpp b/library/phx/rendering/components/mesh_render_settings.hpp index bb9fda67138831896974e1280f11af332883736c..b35f1710e2ba330fad793266883a2603bae5d593 100644 --- a/library/phx/rendering/components/mesh_render_settings.hpp +++ b/library/phx/rendering/components/mesh_render_settings.hpp @@ -36,12 +36,12 @@ class PHOENIX_EXPORT MeshRenderSettings final : public Component { void SetWireframeMode(bool enabled); bool GetWireframeMode() const; - static MeshRenderSettings* GetDefault(); + static const MeshRenderSettings* GetDefault(); private: bool wireframe_mode_ = false; - static MeshRenderSettings default_settings_; + static const MeshRenderSettings default_settings_; }; } // namespace phx diff --git a/library/phx/rendering/render_passes/geometry_pass.cpp b/library/phx/rendering/render_passes/geometry_pass.cpp index bd19d5ad84ab006d5371a4fa13a4da883324a7ba..434b0b0a6e91d04957279a1f8b31e21a1ee2bfdb 100644 --- a/library/phx/rendering/render_passes/geometry_pass.cpp +++ b/library/phx/rendering/render_passes/geometry_pass.cpp @@ -223,11 +223,15 @@ void GeometryPass::Draw(const RenderingInstance& rendering_instance) { SetTransformShaderUniforms(model_matrix, view_matrix, projection_matrix); SetMaterialShaderUniforms(rendering_instance.material); + const MeshRenderSettings* render_settings = + rendering_instance.mesh_render_settings; + if (render_settings == nullptr) { + render_settings = MeshRenderSettings::GetDefault(); + } + glEnable(GL_DEPTH_TEST); glPolygonMode(GL_FRONT_AND_BACK, - rendering_instance.mesh_render_settings->GetWireframeMode() - ? GL_LINE - : GL_FILL); + render_settings->GetWireframeMode() ? GL_LINE : GL_FILL); glDrawElements( GL_TRIANGLES, static_cast<GLsizei>(rendering_instance.mesh->GetIndices().size()), @@ -293,7 +297,9 @@ void GeometryPass::SetLightShaderUniforms() { } } -void GeometryPass::SetMaterialShaderUniforms(Material* material) { +void GeometryPass::SetMaterialShaderUniforms(const Material* material) { + if (material == nullptr) material = Material::GetDefault(); + const glm::uvec4 texture_toggle = glm::uvec4(material->GetAmbientTexture() != nullptr ? 1u : 0u, material->GetDiffuseTexture() != nullptr ? 1u : 0u, diff --git a/library/phx/rendering/render_passes/geometry_pass.hpp b/library/phx/rendering/render_passes/geometry_pass.hpp index 6e19b2dced1f36fe07fed6b8ebd9d5e412c233c3..15a0d2389159a0408c8f60b5381b30cdf28c1a8c 100644 --- a/library/phx/rendering/render_passes/geometry_pass.hpp +++ b/library/phx/rendering/render_passes/geometry_pass.hpp @@ -65,7 +65,7 @@ class PHOENIX_EXPORT GeometryPass : public RenderPass { Mesh* mesh = nullptr; Material* material = nullptr; Transform* transform = nullptr; - MeshRenderSettings* mesh_render_settings = MeshRenderSettings::GetDefault(); + MeshRenderSettings* mesh_render_settings = nullptr; }; struct RenderOffset { std::size_t vertex_offset; @@ -124,7 +124,7 @@ class PHOENIX_EXPORT GeometryPass : public RenderPass { const glm::mat4& view_matrix, const glm::mat4& projection_matrix); void SetLightShaderUniforms(); - void SetMaterialShaderUniforms(Material* material); + void SetMaterialShaderUniforms(const Material* material); std::unique_ptr<ShaderProgram> shader_program_; diff --git a/library/phx/rendering/rendering_system.cpp b/library/phx/rendering/rendering_system.cpp index 781dfb22b9e5bd7a8f48db8f538dd2223afe07ee..78362871ef1b8b0e84f38fe4b3e414d0d0c86fe2 100644 --- a/library/phx/rendering/rendering_system.cpp +++ b/library/phx/rendering/rendering_system.cpp @@ -75,18 +75,15 @@ void RenderingSystem::Update(const FrameTimer::TimeInfo&) { auto light = entity->GetFirstComponent<Light>(); auto transform = entity->GetFirstComponent<Transform>(); auto material_handle = entity->GetFirstComponent<MaterialHandle>(); + Material* material = nullptr; + if (material_handle != nullptr) + material = material_handle->GetMaterial().Get(); auto mesh_render_settings = entity->GetFirstComponent<MeshRenderSettings>(); if (transform != nullptr) { if (mesh_handle != nullptr) { - rendering_instances.push_back( - {mesh_handle->GetMesh().Get(), - (material_handle != nullptr ? material_handle->GetMaterial().Get() - : Material::GetDefault()), - transform, - (mesh_render_settings != nullptr - ? mesh_render_settings - : MeshRenderSettings::GetDefault())}); + rendering_instances.push_back({mesh_handle->GetMesh().Get(), material, + transform, mesh_render_settings}); } else if (light != nullptr) { light_transform_pairs.push_back( std::pair<Light*, Transform*>(light, transform)); diff --git a/library/phx/resources/types/material.cpp b/library/phx/resources/types/material.cpp index d8ab57d8337430dc32cff13da0723b9f2891d552..cf0b925a2b12089a464e9910b295ad9bf89fcf69 100644 --- a/library/phx/resources/types/material.cpp +++ b/library/phx/resources/types/material.cpp @@ -32,7 +32,7 @@ namespace phx { const char Material::UNNAMED[] = "UnnamedMaterial"; -Material Material::default_material_; +const Material Material::default_material_; glm::vec3 Material::GetDiffuseColor() const { return diffuse_color_; } void Material::SetDiffuseColor(glm::vec3 color) { diffuse_color_ = color; } @@ -42,11 +42,10 @@ ResourcePointer<Image> Material::GetDiffuseImage() const { } void Material::SetDiffuseImage(ResourcePointer<Image> image) { diffuse_image_ = image; + SetTexture(diffuse_image_, &diffuse_texture_); } -gl::texture_2d* Material::GetDiffuseTexture() { - if (diffuse_image_ && !diffuse_texture_) - SetTexture(diffuse_image_, &diffuse_texture_); +gl::texture_2d* Material::GetDiffuseTexture() const { return diffuse_texture_.get(); } @@ -58,11 +57,10 @@ ResourcePointer<Image> Material::GetAmbientImage() const { } void Material::SetAmbientImage(ResourcePointer<Image> image) { ambient_image_ = image; + SetTexture(ambient_image_, &ambient_texture_); } -gl::texture_2d* Material::GetAmbientTexture() { - if (ambient_image_ && !ambient_texture_) - SetTexture(ambient_image_, &ambient_texture_); +gl::texture_2d* Material::GetAmbientTexture() const { return ambient_texture_.get(); } @@ -74,11 +72,10 @@ ResourcePointer<Image> Material::GetSpecularImage() const { } void Material::SetSpecularImage(ResourcePointer<Image> image) { specular_image_ = image; + SetTexture(specular_image_, &specular_texture_); } -gl::texture_2d* Material::GetSpecularTexture() { - if (specular_image_ && !specular_texture_) - SetTexture(specular_image_, &specular_texture_); +gl::texture_2d* Material::GetSpecularTexture() const { return specular_texture_.get(); } @@ -94,7 +91,7 @@ void Material::SetShininess(float shininess) { } } -Material* Material::GetDefault() { return &default_material_; } +const Material* Material::GetDefault() { return &default_material_; } void Material::SetTexture(ResourcePointer<Image> image, std::shared_ptr<gl::texture_2d>* texture) { diff --git a/library/phx/resources/types/material.hpp b/library/phx/resources/types/material.hpp index 19565287ba3d72ec6240292708ba3fa43af00df4..ae74ee21dba19043c2478ae9a31cc2237e009b3b 100644 --- a/library/phx/resources/types/material.hpp +++ b/library/phx/resources/types/material.hpp @@ -62,29 +62,26 @@ class PHOENIX_EXPORT Material : public Resource, public Nameable { ResourcePointer<Image> GetDiffuseImage() const; void SetDiffuseImage(ResourcePointer<Image> image); - - gl::texture_2d* GetDiffuseTexture(); + gl::texture_2d* GetDiffuseTexture() const; glm::vec3 GetAmbientColor() const; void SetAmbientColor(glm::vec3 color); ResourcePointer<Image> GetAmbientImage() const; void SetAmbientImage(ResourcePointer<Image> image); - - gl::texture_2d* GetAmbientTexture(); + gl::texture_2d* GetAmbientTexture() const; glm::vec3 GetSpecularColor() const; void SetSpecularColor(glm::vec3 color); ResourcePointer<Image> GetSpecularImage() const; void SetSpecularImage(ResourcePointer<Image> image); - - gl::texture_2d* GetSpecularTexture(); + gl::texture_2d* GetSpecularTexture() const; float GetShininess() const; void SetShininess(float shininess); - static Material* GetDefault(); + static const Material* GetDefault(); private: void SetTexture(ResourcePointer<Image> image, @@ -101,7 +98,7 @@ class PHOENIX_EXPORT Material : public Resource, public Nameable { glm::vec3 specular_color_ = glm::vec3(1, 1, 1); float shininess_ = 64.0f; - static Material default_material_; + static const Material default_material_; }; } // namespace phx diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7a9d51630e5abc3d55fc600d163802bf5d3266ed..6ac65f1e982407444b995f656237e82cf2edbdab 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -228,6 +228,9 @@ add_mocked_test(test_display_system MOCK_SDL) add_mocked_test(test_engine MOCK_SDL MOCK_OPENVR MOCK_GLEW) add_mocked_test(test_tracking_system MOCK_SDL MOCK_OPENVR) add_mocked_test(test_openvr_controller_system MOCK_SDL MOCK_OPENVR MOCK_GLEW) +add_mocked_test(test_assimp_loader MOCK_GLEW) +add_mocked_test(test_model MOCK_GLEW) +add_mocked_test(test_scene_loader MOCK_GLEW) add_mocked_test(integration_test_model_rendering MOCK_OPENVR) add_mocked_test(integration_test_opengl_buffer_data_download MOCK_OPENVR) diff --git a/tests/src/test_assimp_loader.cpp b/tests/src/test_assimp_loader.cpp index 16626f0aa7b5c5dc8cf2f39d99cee75eea8f4fc9..a185d9a13ff1ec129b0e2309b6f575e4a416978a 100644 --- a/tests/src/test_assimp_loader.cpp +++ b/tests/src/test_assimp_loader.cpp @@ -26,14 +26,18 @@ #include "catch/catch.hpp" +#include "opengl_mock.hpp" + #include "phx/core/logger.hpp" -#include "phx/resources/types/mesh.hpp" #include "phx/resources/loaders/assimp_model_loader.hpp" #include "phx/resources/resource_utils.hpp" +#include "phx/resources/types/mesh.hpp" #include "phx/utility/aspects/nameable.hpp" #include "test_utilities/log_capture.hpp" +extern template struct trompeloeil::reporter<trompeloeil::specialized>; + class TestLogger { public: TestLogger() : log_capture_{std::make_shared<test_utilities::LogCapture>()} { @@ -49,6 +53,7 @@ class TestLogger { SCENARIO("The assimp loader loads models using the Assimp library.", "[phx][phx::AssimpLoader]") { + OPENGL_MOCK_ALLOW_ANY_CALL GIVEN("A plain loader") { phx::CreateDefaultLogger(); TestLogger test_logger; diff --git a/tests/src/test_model.cpp b/tests/src/test_model.cpp index 7098d7ca52f01c7dec6872d7a815ff80aee976b3..09f34849768f9832ed066b3a9b7f726c2e8fe750 100644 --- a/tests/src/test_model.cpp +++ b/tests/src/test_model.cpp @@ -25,12 +25,18 @@ #include "catch/catch.hpp" #include "phx/resources/loaders/assimp_model_loader.hpp" -#include "phx/resources/types/model.hpp" #include "phx/resources/resource_manager.hpp" #include "phx/resources/resource_utils.hpp" +#include "phx/resources/types/model.hpp" + +#include "opengl_mock.hpp" +#include "trompeloeil.hpp" + +extern template struct trompeloeil::reporter<trompeloeil::specialized>; SCENARIO("A Model can be loaded that contains multiple meshes", "[phx][phx::Model]") { + OPENGL_MOCK_ALLOW_ANY_CALL GIVEN("A fresh resource manager...") { GIVEN("A file name of an .obj file...") { std::string model_file_name{"models/2MeshTest/2meshTest.obj"}; diff --git a/tests/src/test_scene_loader.cpp b/tests/src/test_scene_loader.cpp index 1e69d84c692c57071f22d50d69d4df46bfe838d0..780692390eb89ac3b31bcea261771fe7d87d3f46 100644 --- a/tests/src/test_scene_loader.cpp +++ b/tests/src/test_scene_loader.cpp @@ -30,7 +30,13 @@ #include "phx/rendering/components/transform.hpp" #include "phx/resources/loaders/scene_loader.hpp" +#include "opengl_mock.hpp" +#include "trompeloeil.hpp" + +extern template struct trompeloeil::reporter<trompeloeil::specialized>; + SCENARIO("The scene loader can load a model", "[phx][phx::SceneLoader]") { + OPENGL_MOCK_ALLOW_ANY_CALL GIVEN("An empty scene") { phx::Scene scene; WHEN("We load a model into the scene") {