Skip to content

Commit

Permalink
Add Ogre2Heightmap functionality (#386)
Browse files Browse the repository at this point in the history
* Ogre2.2

Signed-off-by: ahcorde <[email protected]>

* Added media files

Signed-off-by: ahcorde <[email protected]>

* Added Headless mode

Signed-off-by: ahcorde <[email protected]>

* Added feedback

Signed-off-by: ahcorde <[email protected]>

* Added feedback

Signed-off-by: ahcorde <[email protected]>

* Add OGRE2.2 to dependencies

Signed-off-by: Michael Carroll <[email protected]>

* Fixed GPUray and depthCamera test

Co-authored-by: Michael Carroll <[email protected]>

Signed-off-by: ahcorde <[email protected]>

* cast based on pf

Signed-off-by: Ian Chen <[email protected]>

* Fix cleanup with packaged debs

Signed-off-by: Michael Carroll <[email protected]>

* fix copy raw data

Signed-off-by: Ian Chen <[email protected]>

* fix material test

Signed-off-by: Ian Chen <[email protected]>

* Lint and compiler warning

Signed-off-by: Michael Carroll <[email protected]>

* Trim whitespace

Signed-off-by: Michael Carroll <[email protected]>

* Apply gamma correction to sky

Signed-off-by: ahcorde <[email protected]>

* Test fixes to Ogre2.2 branch (#279)

Signed-off-by: Michael Carroll <[email protected]>

* Revert gamma correction in the sky

Signed-off-by: ahcorde <[email protected]>

* enable grayscale albedo map to fix red color highlights and disable hardware gamma to fix dark sky color

Signed-off-by: Ian Chen <[email protected]>

* Local updates for Ogre2.2 against main branch (#317)

* Local updates for Ogre2.2 against main branch

Signed-off-by: Ian Chen <[email protected]>
Co-authored-by: Ian Chen <[email protected]>

* Fix merge

Signed-off-by: ahcorde <[email protected]>

* fix shadows in ogre 2.2

Signed-off-by: Ian Chen <[email protected]>

* Lint

Signed-off-by: Michael Carroll <[email protected]>

* fix toggling sky

Signed-off-by: Ian Chen <[email protected]>

* fix camera test

Signed-off-by: Ian Chen <[email protected]>

* make linters happy

Signed-off-by: ahcorde <[email protected]>

* make linters happy

Signed-off-by: ahcorde <[email protected]>

* Fix small regression from merge

Signed-off-by: Michael Carroll <[email protected]>

* Remove problematic leftover files from 2.1

The mere presence of these files can cause incorrect shader generation
or unknown visual bugs.

IMPORTANT: The installation folder (i.e. CMAKE_INSTALL_PREFIX) must
remove them as well.

`make install` won't be enough because it won't remove files, only add
new ones or update existing ones.

This folder is usually installed in
ign/install/share/ignition/ignition-rendering6/ogre2/media/Hlms

Signed-off-by: Matias N. Goldberg <[email protected]>

* Do not crash on shutdown

- ogreRoot may be nullptr
- Do not destroy textures already scheduled for destruction

Signed-off-by: Matias N. Goldberg <[email protected]>

* Remove problematic leftover files from 2.1 (#354)

The mere presence of these files can cause incorrect shader generation
or unknown visual bugs.

IMPORTANT: The installation folder (i.e. CMAKE_INSTALL_PREFIX) must
remove them as well.

`make install` won't be enough because it won't remove files, only add
new ones or update existing ones.

This folder is usually installed in
ign/install/share/ignition/ignition-rendering6/ogre2/media/Hlms

Signed-off-by: Matias N. Goldberg <[email protected]>

* Do not crash on shutdown (#355)

- ogreRoot may be nullptr
- Do not destroy textures already scheduled for destruction

Signed-off-by: Matias N. Goldberg <[email protected]>

* Removed unused variable

Signed-off-by: ahcorde <[email protected]>

* Restore FSAA support in 2.2 branch

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix changing background color not always taking immediate effect

Changed pass_clear in favour of LoadAction::Clear which is more
efficient on very modern GPUs and specially TBDR ones.

Signed-off-by: Matias N. Goldberg <[email protected]>

* Changed pass_clear in favour of LoadAction::Clear

which is more efficient on very modern GPUs and specially TBDR ones.

Signed-off-by: Matias N. Goldberg <[email protected]>

* Missing public keyword

Signed-off-by: Matias N. Goldberg <[email protected]>

* Save VRAM when FSAA is used and no postprocessing

There's an unused texture when these conditions are met (which are
fairly common)
This memory optimization could not be performed in Ogre 2.1, it needs
Ogre 2.2+

Signed-off-by: Matias N. Goldberg <[email protected]>

* Remove code deprecated in ign-rendering5

Syntax cosmetic changes for consistency

Signed-off-by: Matias N. Goldberg <[email protected]>

* Remove code deprecated in ign-rendering5

Signed-off-by: Matias N. Goldberg <[email protected]>

* Code style fixes

Signed-off-by: Matias N. Goldberg <[email protected]>

* Undo VRAM saving optimization: It cannot be applied

The "Final Composition" node requires both textures to be resident.
Thus 2nd texture must always be resident.

The optimization could still be applied if we create two Final
Composition nodes (one for when 2 textures are needed, another for when
only MSAA + 1 texture is needed) but this would:

  1. Hurt code readability too much (i.e. what is going on?)
  2. Increase debuggability difficulty too much because codepaths taken
would differ depending on whether optimization was applied. Also certain
bugs could remain hidden until compositors are toggled.

This was causing ogre2_demo to fail.

Signed-off-by: Matias N. Goldberg <[email protected]>

* Merge main branch into Ogre 2.2 and fixes (#359)

* Fix floating point precision bug handling alpha channel (#332) (#333)

Fixes #332
Fixes #108

Signed-off-by: Matias N. Goldberg <[email protected]>

* Test re-enabling depth camera integration test on mac (#335)

* Fix floating point precision bug handling alpha channel (#332)

Fixes #332
Fixes #108

Signed-off-by: Matias N. Goldberg <[email protected]>

* test reenabling depth camera test on mac

Signed-off-by: Ian Chen <[email protected]>

Co-authored-by: Matias N. Goldberg <[email protected]>

* Fix new [] / delete mismatch (#338)

Using a custom deallocator to avoid breaking ABI

Alternatively C++17 supports the following syntax, which was not used:

`typedef std::shared_ptr<unsigned char[]> DataPtr;`

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix heap overflow when reading (#337)

PF_RGB is 3 bytes. But later on Ogre2SelectionBuffer::OnSelectionClick
will try to read 4 bytes from it.

Fixed by ensuring it's always at least 4 bytes and zero-initializing
those 4 bytes.

Signed-off-by: Matias N. Goldberg <[email protected]>

Co-authored-by: Ian Chen <[email protected]>

* Fix floating point precision bug handling alpha channel (#332) (#333)

Fixes #332
Fixes #108

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix depth alpha (#316)

* update test

Signed-off-by: Ian Chen <[email protected]>

* reenable macos test

Signed-off-by: Ian Chen <[email protected]>

* fix typo

Signed-off-by: Ian Chen <[email protected]>

* cherry pick f9f1820 and fix conflicts

Signed-off-by: Ian Chen <[email protected]>

* Fix FSAA in UI and lower VRAM consumption (#313)

* Fix FSAA in UI and lower VRAM consumption

FSAA was being requested however due to how the compositor was setup,
this effect was not taking effect.

Additionally, the Compositor setup was improved to lower memory
consumption. Originally the setup was taken from Ogre samples which
assume they will ultimately be rendering to a window.

However this is not the case and thus IGN was creating 3 render targets
(two for ping-ponging between postprocess FXs + one for storing the
final result)
This was optimized so that we only create 2 render targets: two for
ping-ponging between postprocess FXs and we pick at runtime which one is
storing the final result via the new variable renderTargetResultsIdx

Further performance optimizations could be made in Ogre 2.2 to improve
unnecessary MSAA resolving when doing postprocess, though considering
there's currently only one postprocessing effect (the Gaussian filter) I
doubt this optimization would make much of a difference

Signed-off-by: Matias N. Goldberg <[email protected]>

* Add Ogre2RenderTarget::RenderTarget back

Signed-off-by: Matias N. Goldberg <[email protected]>

* Rewrote the compositor changes to support RenderWindows

As a bonus this new method breaks ABI far less.
Fix leak: DestroyCompositor would often not be called

Signed-off-by: Matias N. Goldberg <[email protected]>

* Mantain ABI compatibility #Ogre2IsRenderWindowABI

When merging to newer branches that can break the ABI,
revert this commit

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix ABI problems

I gave up on commit undoing

It's clear that on the next release, Ogre2RenderTarget and
Ogre2RenderTexture need to be merged together.

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix camel case convention

Signed-off-by: Matias N. Goldberg <[email protected]>

* Make Ogre2RenderTarget::RenderTarget pure virtual again

Hopefully this will prevent ABI breakage

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix deprecation warnings during build

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix invalid write of size 8

This was causing heap corruption. At best it would crash. At worst it
would manifeset in subtle weird behaviors

Signed-off-by: Matias N. Goldberg <[email protected]>

Co-authored-by: Ian Chen <[email protected]>

* Backport memory fixes found by ASAN (#340)

* Fix heap overflow when reading (#337)

PF_RGB is 3 bytes. But later on Ogre2SelectionBuffer::OnSelectionClick
will try to read 4 bytes from it.

Fixed by ensuring it's always at least 4 bytes and zero-initializing
those 4 bytes.

Signed-off-by: Matias N. Goldberg <[email protected]>

Co-authored-by: Ian Chen <[email protected]>

* Fix new [] / delete mismatch (#338)

Using a custom deallocator to avoid breaking ABI

Alternatively C++17 supports the following syntax, which was not used:

`typedef std::shared_ptr<unsigned char[]> DataPtr;`

Signed-off-by: Matias N. Goldberg <[email protected]>

Co-authored-by: darksylinc <[email protected]>

* recreate node only when needed (#342)

Signed-off-by: Ian Chen <[email protected]>

* Fix custom shaders uniforms ign version number (#343)

Signed-off-by: Ian Chen <[email protected]>

* relax gaussian test tolerance (#344)

Signed-off-by: Ian Chen <[email protected]>

* Update light map tutorial (#346)

* apply changes

Signed-off-by: Ian Chen <[email protected]>

* remove line

Signed-off-by: Ian Chen <[email protected]>

* add ifdef for apple in integration test

Signed-off-by: Ian Chen <[email protected]>

* 🎈 4.8.0 (#348)

Signed-off-by: Louise Poubel <[email protected]>

* update ign-rendering version in custom shaders uniform sample

Signed-off-by: Ian Chen <[email protected]>

* Remove problematic leftover files from 2.1

The mere presence of these files can cause incorrect shader generation
or unknown visual bugs.

IMPORTANT: The installation folder (i.e. CMAKE_INSTALL_PREFIX) must
remove them as well.

`make install` won't be enough because it won't remove files, only add
new ones or update existing ones.

This folder is usually installed in
ign/install/share/ignition/ignition-rendering6/ogre2/media/Hlms

Signed-off-by: Matias N. Goldberg <[email protected]>

* Do not crash on shutdown

- ogreRoot may be nullptr
- Do not destroy textures already scheduled for destruction

Signed-off-by: Matias N. Goldberg <[email protected]>

* Restore FSAA support in 2.2 branch

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix changing background color not always taking immediate effect

Changed pass_clear in favour of LoadAction::Clear which is more
efficient on very modern GPUs and specially TBDR ones.

Signed-off-by: Matias N. Goldberg <[email protected]>

* Changed pass_clear in favour of LoadAction::Clear

which is more efficient on very modern GPUs and specially TBDR ones.

Signed-off-by: Matias N. Goldberg <[email protected]>

* Missing public keyword

Signed-off-by: Matias N. Goldberg <[email protected]>

* Save VRAM when FSAA is used and no postprocessing

There's an unused texture when these conditions are met (which are
fairly common)
This memory optimization could not be performed in Ogre 2.1, it needs
Ogre 2.2+

Signed-off-by: Matias N. Goldberg <[email protected]>

* Remove code deprecated in ign-rendering5

Syntax cosmetic changes for consistency

Signed-off-by: Matias N. Goldberg <[email protected]>

* Remove code deprecated in ign-rendering5

Signed-off-by: Matias N. Goldberg <[email protected]>

* Code style fixes

Signed-off-by: Matias N. Goldberg <[email protected]>

* Undo VRAM saving optimization: It cannot be applied

The "Final Composition" node requires both textures to be resident.
Thus 2nd texture must always be resident.

The optimization could still be applied if we create two Final
Composition nodes (one for when 2 textures are needed, another for when
only MSAA + 1 texture is needed) but this would:

  1. Hurt code readability too much (i.e. what is going on?)
  2. Increase debuggability difficulty too much because codepaths taken
would differ depending on whether optimization was applied. Also certain
bugs could remain hidden until compositors are toggled.

This was causing ogre2_demo to fail.

Signed-off-by: Matias N. Goldberg <[email protected]>

Co-authored-by: Ian Chen <[email protected]>
Co-authored-by: Louise Poubel <[email protected]>

* Began work on Heightmaps with Ogre2. Very WIP

Hardcoded some paths in CMakeLists to get Terra compiling

Signed-off-by: Matias N. Goldberg <[email protected]>

* Register HlmsTerra

Add its Hlms data files

Signed-off-by: Matias N. Goldberg <[email protected]>

* Update all Terras and show them on screen (WIP)

Signed-off-by: Matias N. Goldberg <[email protected]>

* Update to latest Terra to get Z-up support

Signed-off-by: Matias N. Goldberg <[email protected]>

* Better calculation of heightmap size (WIP)

Fix crash when heightmap is deleted
Update to latest Terra for setCustomSkirtMinHeight

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix shader compiler error

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix alignment issues in terrain

Signed-off-by: Matias N. Goldberg <[email protected]>

* Move Terra to its own folder and project

Signed-off-by: Matias N. Goldberg <[email protected]>

* Enable assert that was accidentally disabled

Signed-off-by: Matias N. Goldberg <[email protected]>

* Customize Terra for Ignition's requirements

Fix barrier assert

Signed-off-by: Matias N. Goldberg <[email protected]>

* Use custom blending modes to adjust to ign

Signed-off-by: Matias N. Goldberg <[email protected]>

* HeightmapTexture::Size is in meters, it's not a scale

Now it looks close to the reference in ogre1
No longer normalize weights, it's not needed anymore
Also fix bug when 5 texture maps could not be supported

Signed-off-by: Matias N. Goldberg <[email protected]>

* Use same blending algorithm for roughness & metalness

Signed-off-by: Matias N. Goldberg <[email protected]>

* Deal with edge case where terrain skirts could be above ground

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix wrong indentation

Remove dead code

Signed-off-by: Matias N. Goldberg <[email protected]>

* Forgot to push this change

Signed-off-by: Matias N. Goldberg <[email protected]>

* Disable alpha blending of detail maps for Terrain

Signed-off-by: Matias N. Goldberg <[email protected]>

* Add terrain shadows to normal objects

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix copyright year

Signed-off-by: Matias N. Goldberg <[email protected]>

* Re-enable ImageHeightmap

It shouldn't have been disabled

Signed-off-by: Matias N. Goldberg <[email protected]>

* Cosmetic changes

Signed-off-by: Matias N. Goldberg <[email protected]>

* Move Terra's source code into ogre2/src

It is ogre2 specific

Signed-off-by: Matias N. Goldberg <[email protected]>

* Support ogre1 heightmaps via cropping and warn about it

Signed-off-by: Matias N. Goldberg <[email protected]>

* Support both ogre2 & ogre engines in heightmap sample

Default to ogre2

Signed-off-by: Matias N. Goldberg <[email protected]>

* Force-disable JSON parts of Terra

It's not used by ignition.
This avoids detecting rapidjson during ign build
Fix Windows build

Signed-off-by: Matias N. Goldberg <[email protected]>

* Add license to Terra files

Signed-off-by: Matias N. Goldberg <[email protected]>

* Update to latest version of Terra

Adds spotlight & point shadow map support (not working/set yet)

Signed-off-by: Matias N. Goldberg <[email protected]>

* Add terrain shadows from spot & point lights

Use unique_ptr instead of raw ptrs when possible

Signed-off-by: Matias N. Goldberg <[email protected]>

* Skip Terra headers in cppcheck

They should be treated as external code

Signed-off-by: Matias N. Goldberg <[email protected]>

* fixing tests

Signed-off-by: Ian Chen <[email protected]>

* add ifdef

Signed-off-by: Ian Chen <[email protected]>

* suppress warnings

Signed-off-by: Ian Chen <[email protected]>

* update syntax

Signed-off-by: Ian Chen <[email protected]>

* update syntax

Signed-off-by: Ian Chen <[email protected]>

* Fix crash on shutdown due to ptr destroyed too late

It should be destroyed before Ogre Root

Signed-off-by: Matias N. Goldberg <[email protected]>

* Update to latest Terra to fix bug from upstream

Upstream
OGRECave/ogre-next@d0a01d2

Signed-off-by: Matias N. Goldberg <[email protected]>

* Update to latest Hlms from upstream

This fixes some compiler bugs with Terra
Also adds supports for HlmsPbs::setShadowReceiversInPixelShader which
was written specifically for Gazebo

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix compiler warning

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix Terra shadows on Spot and Point lights

Update Terra to latest from upstream

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix Terra's point light shadows

Terra's workspace listener was being executed before the camera is
rotated for cubemap rendering

Signed-off-by: Matias N. Goldberg <[email protected]>

* Fix documentation

Silence warnings from external code to pass build checks

Signed-off-by: Matias N. Goldberg <[email protected]>

* fixing CI

Signed-off-by: Ian Chen <[email protected]>

* add include path

Signed-off-by: Ian Chen <[email protected]>

* windows warning

Signed-off-by: Ian Chen <[email protected]>

* fix

Signed-off-by: Ian Chen <[email protected]>

Co-authored-by: ahcorde <[email protected]>
Co-authored-by: Michael Carroll <[email protected]>
Co-authored-by: Ian Chen <[email protected]>
Co-authored-by: Louise Poubel <[email protected]>
  • Loading branch information
5 people authored Sep 20, 2021
1 parent 4bff736 commit b2da7e1
Show file tree
Hide file tree
Showing 66 changed files with 8,306 additions and 57 deletions.
10 changes: 10 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ ign_configure_project(VERSION_SUFFIX pre1)
# Set project-specific options
#============================================================================

set(CMAKE_CXX_STANDARD 14)
option(USE_UNOFFICAL_OGRE_VERSIONS "Accept unsupported Ogre versions in the build" OFF)

#============================================================================
Expand Down Expand Up @@ -153,9 +154,18 @@ if (HAVE_OGRE2)
list(APPEND RENDERING_COMPONENTS ogre2)
endif()

configure_file("${PROJECT_SOURCE_DIR}/cppcheck.suppress.in"
${PROJECT_BINARY_DIR}/cppcheck.suppress)

ign_configure_build(QUIT_IF_BUILD_ERRORS
COMPONENTS ${RENDERING_COMPONENTS})

if (HAVE_OGRE2)
# Must be done after ign_configure_build or else Terra
# won't see IGN_ADD_fPIC_TO_LIBRARIES
add_subdirectory(ogre2/src/terrain/Terra)
endif()

#============================================================================
# Create package information
#============================================================================
Expand Down
1 change: 1 addition & 0 deletions cppcheck.suppress.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*:*/Terra/*.h
14 changes: 11 additions & 3 deletions examples/heightmap/Main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,8 @@ void buildScene(ScenePtr _scene)
CameraPtr camera = _scene->CreateCamera("camera");
camera->SetLocalPosition(1.441, 25.787, 17.801);
camera->SetLocalRotation(0.0, 0.588, -1.125);
camera->SetImageWidth(800);
camera->SetImageHeight(600);
camera->SetImageWidth(1600);
camera->SetImageHeight(900);
camera->SetAntiAliasing(2);
camera->SetAspectRatio(1.333);
camera->SetHFOV(IGN_PI / 2);
Expand Down Expand Up @@ -207,7 +207,15 @@ int main(int _argc, char** _argv)
std::vector<std::string> engineNames;
std::vector<CameraPtr> cameras;

engineNames.push_back("ogre");
// Expose engine name to command line because we can't instantiate both
// ogre and ogre2 at the same time
std::string ogreEngineName("ogre2");
if (_argc > 1)
{
ogreEngineName = _argv[1];
}

engineNames.push_back(ogreEngineName);

for (auto engineName : engineNames)
{
Expand Down
111 changes: 111 additions & 0 deletions ogre2/include/ignition/rendering/ogre2/Ogre2Heightmap.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*
* Copyright (C) 2021 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

#ifndef IGNITION_RENDERING_OGRE2_OGRE2HEIGHTMAP_HH_
#define IGNITION_RENDERING_OGRE2_OGRE2HEIGHTMAP_HH_

#include <memory>

#include "ignition/rendering/base/BaseHeightmap.hh"
#include "ignition/rendering/ogre2/Ogre2Geometry.hh"

// Ignoring warning: "non dll-interface class
// 'ignition::rendering::v5::Heightmap' used as base for dll-interface class"
// because `Heightmap` and `BaseHeightmap` are header-only
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4275)
#endif

namespace Ogre
{
class Camera;
class Terra;
}

namespace ignition
{
namespace rendering
{
inline namespace IGNITION_RENDERING_VERSION_NAMESPACE {
//
// Forward declaration
class Ogre2HeightmapPrivate;

/// \brief Ogre implementation of a heightmap geometry.
class IGNITION_RENDERING_OGRE2_VISIBLE Ogre2Heightmap
: public BaseHeightmap<Ogre2Geometry>
{
/// \brief Constructor
/// \param[in] _desc Parameters describing how a
/// heightmap should be loaded
public: explicit Ogre2Heightmap(const HeightmapDescriptor &_desc);

/// \brief Destructor
public: virtual ~Ogre2Heightmap() override;

// Documentation inherited.
public: virtual void Init() override;

// Documentation inherited.
public: virtual void PreRender() override;

/// \brief Returns the Terra pointer as it is a movable object that
/// must be attached to a regular SceneNode
/// \remarks This behavior is different from ogre1
/// \return Terra pointer
public: virtual Ogre::MovableObject *OgreObject() const override;

/// \brief Returns NULL, heightmap materials don't inherit from
/// MaterialPtr.
/// \return Null pointer.
public: virtual MaterialPtr Material() const override;

/// \brief Has no effect for heightmaps. The material is set through a
/// HeightmapDescriptor.
/// \param[in] _material Not used.
/// \param[in] _unique Not used.
public: virtual void SetMaterial(MaterialPtr _material, bool _unique)
override;

/// \internal
/// \brief Retrieves the internal Terra pointer
/// \return internal Terra pointer
public: Ogre::Terra* Terra();

/// \internal
/// \brief Must be called before rendering with the camera
/// that will perform rendering.
///
/// May update shadows if light direction changed
/// \param[in] _camera Camera about to be used for rendering
public: void UpdateForRender(Ogre::Camera *_activeCamera);

/// \brief Heightmap should only be created by scene.
private: friend class OgreScene;

/// \brief Private data class
private: std::unique_ptr<Ogre2HeightmapPrivate> dataPtr;
};
}
}
}
#ifdef _MSC_VER
#pragma warning(pop)
#endif

#endif
22 changes: 22 additions & 0 deletions ogre2/include/ignition/rendering/ogre2/Ogre2RenderEngine.hh
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ namespace Ogre
{
class OverlaySystem;
}

class HlmsPbsTerraShadows;
class CompositorWorkspaceListener;
}

namespace ignition
Expand Down Expand Up @@ -175,6 +178,25 @@ namespace ignition
/// \return Pointer to the ogre overlay system.
public: Ogre::v1::OverlaySystem *OverlaySystem() const;

/// \internal
/// \brief Get a pointer to the Pbs listener that adds terra shadows.
/// Do NOT assume HlmsPbs::getListener() == HlmsPbsTerraShadows()
/// as there may be more than one listener in the future with
/// a master listener coordinating them
/// \return Pointer to the Pbs listener that adds terra shadows.
public: Ogre::HlmsPbsTerraShadows *HlmsPbsTerraShadows() const;

/// \internal
/// \brief Get a pointer to the workspace listener that adds terra
/// casting shadows from spot and point lights.
///
/// This listener needs to be added to each workspace that wants
/// terrain shadows from spot/point lights. If no terrains are in scene
/// then the workspace's overhead is negligible / almost 0.
/// \return Pointer to the CompositorWorkspaceListener
public: Ogre::CompositorWorkspaceListener
*TerraWorkspaceListener() const;

/// \brief Pointer to the ogre's overlay system
private: Ogre::v1::OverlaySystem *ogreOverlaySystem = nullptr;

Expand Down
2 changes: 2 additions & 0 deletions ogre2/include/ignition/rendering/ogre2/Ogre2RenderTypes.hh
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ namespace ignition
class Ogre2GizmoVisual;
class Ogre2GpuRays;
class Ogre2Grid;
class Ogre2Heightmap;
class Ogre2InertiaVisual;
class Ogre2JointVisual;
class Ogre2Light;
Expand Down Expand Up @@ -87,6 +88,7 @@ namespace ignition
typedef shared_ptr<Ogre2GizmoVisual> Ogre2GizmoVisualPtr;
typedef shared_ptr<Ogre2GpuRays> Ogre2GpuRaysPtr;
typedef shared_ptr<Ogre2Grid> Ogre2GridPtr;
typedef shared_ptr<Ogre2Heightmap> Ogre2HeightmapPtr;
typedef shared_ptr<Ogre2InertiaVisual> Ogre2InertiaVisualPtr;
typedef shared_ptr<Ogre2JointVisual> Ogre2JointVisualPtr;
typedef shared_ptr<Ogre2Light> Ogre2LightPtr;
Expand Down
17 changes: 16 additions & 1 deletion ogre2/include/ignition/rendering/ogre2/Ogre2Scene.hh
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include <memory>
#include <string>
#include <vector>

#include "ignition/rendering/Storage.hh"
#include "ignition/rendering/base/BaseScene.hh"
Expand Down Expand Up @@ -135,7 +136,12 @@ namespace ignition
/// \brief When LegacyAutoGpuFlush(), this function mimics
/// legacy behavior.
/// When not, it verifies PreRender has been called
public: void StartRendering();
/// It also performs necessary updates for all heightmaps
///
/// \param _camera camera that is about to render, used
/// by heightmaps (Terra). See Ogre2Scene::UpdateAllHeightmaps
/// Can be null
public: void StartRendering(Ogre::Camera *_camera);

/// \internal
/// \brief Every Render() function calls this function with
Expand Down Expand Up @@ -334,6 +340,12 @@ namespace ignition
protected: virtual bool InitObject(Ogre2ObjectPtr _object,
unsigned int _id, const std::string &_name);

/// \internal
/// \brief Iterates through all Heightmaps and calls
/// Ogre2Heightmap::UpdateForRender on each of them
/// \param[in] _camera Camera about to be used for rendering
public: void UpdateAllHeightmaps(Ogre::Camera *_camera);

/// \brief Create a compositor shadow node with the same number of shadow
/// textures as the number of shadow casting lights
protected: void UpdateShadowNode();
Expand Down Expand Up @@ -405,6 +417,9 @@ namespace ignition
/// \brief A list of ogre materials
protected: Ogre2MaterialMapPtr materials;

/// \brief A list of ogre heightmaps
protected: std::vector<std::weak_ptr<Ogre2Heightmap>> heightmaps;

/// \brief Pointer to the ogre scene manager
protected: Ogre::SceneManager *ogreSceneManager = nullptr;

Expand Down
1 change: 1 addition & 0 deletions ogre2/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ target_link_libraries(${ogre2_target}
PRIVATE
ignition-plugin${IGN_PLUGIN_VER}::register
${OPENGL_LIBRARIES}
terra
IgnOGRE2::IgnOGRE2)

set (versioned ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME_LOWER}-${engine_name}${CMAKE_SHARED_LIBRARY_SUFFIX})
Expand Down
5 changes: 4 additions & 1 deletion ogre2/src/Ogre2DepthCamera.cc
Original file line number Diff line number Diff line change
Expand Up @@ -929,6 +929,9 @@ void Ogre2DepthCamera::CreateWorkspaceInstance()
this->dataPtr->ogreCompositorWorkspaceDef,
false);

this->dataPtr->ogreCompositorWorkspace->addListener(
engine->TerraWorkspaceListener());

// add the listener
Ogre::CompositorNode *node =
this->dataPtr->ogreCompositorWorkspace->getNodeSequence()[0];
Expand Down Expand Up @@ -959,7 +962,7 @@ void Ogre2DepthCamera::Render()
glEnable(GL_DEPTH_CLAMP);
#endif

this->scene->StartRendering();
this->scene->StartRendering(this->ogreCamera);

// update the compositors
this->dataPtr->ogreCompositorWorkspace->_validateFinalTarget();
Expand Down
3 changes: 2 additions & 1 deletion ogre2/src/Ogre2GpuRays.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1213,6 +1213,7 @@ void Ogre2GpuRays::UpdateRenderTarget1stPass()
// update the compositors
for (auto i : this->dataPtr->cubeFaceIdx)
{
this->scene->UpdateAllHeightmaps(this->dataPtr->cubeCam[i]);
this->dataPtr->ogreCompositorWorkspace1st[i]->setEnabled(true);

this->dataPtr->ogreCompositorWorkspace1st[i]->_validateFinalTarget();
Expand Down Expand Up @@ -1244,7 +1245,7 @@ void Ogre2GpuRays::UpdateRenderTarget2ndPass()
//////////////////////////////////////////////////
void Ogre2GpuRays::Render()
{
this->scene->StartRendering();
this->scene->StartRendering(nullptr);

this->UpdateRenderTarget1stPass();
this->UpdateRenderTarget2ndPass();
Expand Down
Loading

0 comments on commit b2da7e1

Please sign in to comment.