Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose shadow texture size for directional lighting in SDF #633

Merged
merged 12 commits into from
Aug 21, 2024
58 changes: 58 additions & 0 deletions src/plugins/minimal_scene/MinimalScene.cc
Original file line number Diff line number Diff line change
Expand Up @@ -762,6 +762,14 @@ std::string GzRenderer::Initialize(RenderThreadRhi &_rhi)
scene->SetSkyEnabled(true);
}

if (!scene->SetShadowTextureSize(rendering::LightType::DIRECTIONAL,
this->directionalLightTextureSize))
{
gzerr << "Unable to set <texture_size> to '"
<< this->directionalLightTextureSize
<< "' using default texture size" << std::endl;
athenaz2 marked this conversation as resolved.
Show resolved Hide resolved
}

auto root = scene->RootVisual();

// Camera
Expand Down Expand Up @@ -1321,6 +1329,20 @@ void RenderWindowItem::SetSkyEnabled(const bool &_sky)
this->dataPtr->renderThread->gzRenderer.skyEnable = _sky;
}

/////////////////////////////////////////////////
bool RenderWindowItem::SetShadowTextureSize(rendering::LightType _lightType,
unsigned int _textureSize)
{
if (_lightType == rendering::LightType::DIRECTIONAL)
{
this->dataPtr->renderThread->gzRenderer.directionalLightTextureSize =
_textureSize;
return true;
}

return false;
}

/////////////////////////////////////////////////
void RenderWindowItem::SetGraphicsAPI(
const rendering::GraphicsAPI &_graphicsAPI)
Expand Down Expand Up @@ -1464,6 +1486,42 @@ void MinimalScene::LoadConfig(const tinyxml2::XMLElement *_pluginElem)
<< std::endl;
}

elem = _pluginElem->FirstChildElement("shadows");
if (nullptr != elem && !elem->NoChildren())
{
auto textureSizeElem = elem->FirstChildElement("texture_size");
if (nullptr != elem && nullptr != textureSizeElem->GetText())
{
unsigned int texSize;
std::stringstream texSizeStr;
texSizeStr << std::string(textureSizeElem->GetText());
texSizeStr >> texSize;
if (texSizeStr.fail())
{
gzerr << "Unable to set <texture_size> to '" << texSizeStr.str()
athenaz2 marked this conversation as resolved.
Show resolved Hide resolved
<< "' using default texture size" << std::endl;
}
else
{
std::string lightType = textureSizeElem->Attribute("light_type");
if (lightType == "directional")
{
if (!renderWindow->SetShadowTextureSize(
rendering::LightType::DIRECTIONAL, texSize))
{
gzerr << "Unable to set <texture_size> to '" << texSizeStr.str()
athenaz2 marked this conversation as resolved.
Show resolved Hide resolved
<< "' using default texture size" << std::endl;
}
}
else
{
gzerr << "Light type [" << lightType << "] is not supported."
<< std::endl;
athenaz2 marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
}

const std::string backendApiName = gz::gui::renderEngineBackendApiName();
if (backendApiName == "vulkan")
{
Expand Down
9 changes: 9 additions & 0 deletions src/plugins/minimal_scene/MinimalScene.hh
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <gz/math/Vector2.hh>
#include <gz/utils/ImplPtr.hh>
#include <gz/rendering/GraphicsAPI.hh>
#include <gz/rendering/Light.hh>

#include "gz/gui/Plugin.hh"

Expand Down Expand Up @@ -238,6 +239,8 @@ namespace gz::gui::plugins
/// \brief True if sky is enabled;
public: bool skyEnable = false;

public: unsigned int directionalLightTextureSize = 2048u;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add doxygen comment

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops. Added here 0bc87f8


/// \brief Horizontal FOV of the camera;
public: math::Angle cameraHFOV = math::Angle(M_PI * 0.5);

Expand Down Expand Up @@ -368,6 +371,12 @@ namespace gz::gui::plugins
/// \param[in] _sky True to enable the sky, false otherwise.
public: void SetSkyEnabled(const bool &_sky);

/// @brief \brief Set the shadow texture size for the given light type.
athenaz2 marked this conversation as resolved.
Show resolved Hide resolved
/// @param _lightType Light type that creates the shadow
/// @param _textureSize Shadow texture size
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: replace @ with \ for consistency

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

public: bool SetShadowTextureSize(rendering::LightType _lightType,
unsigned int _textureSize);

/// \brief Set the Horizontal FOV of the camera
/// \param[in] _fov FOV of the camera in degree
public: void SetCameraHFOV(const math::Angle &_fov);
Expand Down
8 changes: 8 additions & 0 deletions test/integration/minimal_scene.cc
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ TEST(MinimalSceneTest, GZ_UTILS_TEST_ENABLED_ONLY_ON_LINUX(Config))
" <near>0.1</near>"
" <far>5000</far>"
"</camera_clip>"
"<shadows>"
" <texture_size light_type=\"directional\">8192</texture_size>"
"</shadows>"
"<horizontal_fov>60</horizontal_fov>"
"<view_controller>ortho</view_controller>"
"</plugin>";
Expand Down Expand Up @@ -131,6 +134,11 @@ TEST(MinimalSceneTest, GZ_UTILS_TEST_ENABLED_ONLY_ON_LINUX(Config))
EXPECT_DOUBLE_EQ(0.1, camera->NearClipPlane());
EXPECT_DOUBLE_EQ(5000.0, camera->FarClipPlane());

EXPECT_EQ(8192u, scene->ShadowTextureSize(
rendering::LightType::DIRECTIONAL));
EXPECT_EQ(2048u, scene->ShadowTextureSize(rendering::LightType::SPOT));
EXPECT_EQ(2048u, scene->ShadowTextureSize(rendering::LightType::POINT));

EXPECT_NEAR(60, camera->HFOV().Degree(), 1e-4);

EXPECT_EQ(rendering::CameraProjectionType::CPT_ORTHOGRAPHIC,
Expand Down