diff --git a/.github/workflows/windows.yaml b/.github/workflows/windows.yaml new file mode 100644 index 000000000..e3ed647a9 --- /dev/null +++ b/.github/workflows/windows.yaml @@ -0,0 +1,48 @@ +name: Windows +on: + pull_request: + +jobs: + build: + name: Window CI + env: + PACKAGE: gz-rendering9 + runs-on: windows-latest + steps: + - name: setup-pixi + uses: prefix-dev/setup-pixi@v0.8.1 + with: + run-install: false + + - name: Install build tools + run: | + pixi init + pixi add vcstool colcon-common-extensions pkgconfig + - name: Setup pixi env variables + shell: bash + run: | + eval "$(pixi shell-hook)" + echo CMAKE_PREFIX_PATH=$CONDA_PREFIX/Library >> $GITHUB_ENV + - name: Install base dependencies + run: | + # List adapted from https://github.com/gazebo-tooling/release-tools/blob/f89ac8cafc646260598eb8eb6d94be8093bdc9f7/jenkins-scripts/lib/windows_env_vars.bat#L22 + pixi add assimp dlfcn-win32 eigen ffmpeg freeimage gdal gflags ogre ogre-next spdlog tinyxml2 + - name: Clone source dependencies + run: | + mkdir src + cd src + pixi run vcs import --input https://raw.githubusercontent.com/gazebo-tooling/gazebodistro/master/${env:PACKAGE}.yaml + + - uses: actions/checkout@v4 + with: + path: src/gz-rendering + + - name: Build Dependencies + run: | + pixi run colcon build --merge-install --cmake-args -G"Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF --event-handlers console_direct+ --packages-up-to ${env:PACKAGE} + + - name: Build Package + run: pixi run colcon build --merge-install --cmake-args -G"Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DSKIP_ogre=ON --event-handlers console_direct+ --packages-select ${env:PACKAGE} + + - name: Test + run: pixi run colcon test --merge-install --event-handlers console_direct+ --packages-select ${env:PACKAGE} diff --git a/CMakeLists.txt b/CMakeLists.txt index 96ce89131..bf7aa7098 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,6 +154,11 @@ set(GZ_RENDERING_ENGINE_RELATIVE_INSTALL_DIR set(GZ_RENDERING_ENGINE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/${GZ_RENDERING_ENGINE_RELATIVE_INSTALL_DIR}) +#-------------------------------------- +# Find DL if doing relocatable installation +if (GZ_ENABLE_RELOCATABLE_INSTALL) + gz_find_package(DL REQUIRED) +endif() #-------------------------------------- # Find dependencies that we ignore for Visual Studio diff --git a/Changelog.md b/Changelog.md index e6028e429..c83802638 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,7 +2,36 @@ ### Gazebo Rendering 9.X -### Gazebo Rendering 9.0.0 (2024-09-XX) +### Gazebo Rendering 9.0.0 (2024-09-25) + +1. **Baseline:** this includes all changes from 8.2.0 and earlier. + +1. Update code for loading normal and albedo maps from image data + * [Pull request #1068](https://github.com/gazebosim/gz-rendering/pull/1068) + +1. examples/depth_camera: Fixed windows usage + * [Pull request #1060](https://github.com/gazebosim/gz-rendering/pull/1060) + +1. examples/heightmap: Fixed Windows build + * [Pull request #1062](https://github.com/gazebosim/gz-rendering/pull/1062) + +1. Add Github Action for Windows and fix build + * [Pull request #1049](https://github.com/gazebosim/gz-rendering/pull/1049) + +1. Miscellaneous documentation fixes + * [Pull request #1051](https://github.com/gazebosim/gz-rendering/pull/1051) + * [Pull request #1053](https://github.com/gazebosim/gz-rendering/pull/1053) + * [Pull request #1054](https://github.com/gazebosim/gz-rendering/pull/1054) + * [Pull request #1055](https://github.com/gazebosim/gz-rendering/pull/1055) + * [Pull request #1061](https://github.com/gazebosim/gz-rendering/pull/1061) + * [Pull request #1064](https://github.com/gazebosim/gz-rendering/pull/1064) + * [Pull request #1069](https://github.com/gazebosim/gz-rendering/pull/1069) + +1. Update badges to point to gz-rendering9 branch + * [Pull request #1044](https://github.com/gazebosim/gz-rendering/pull/1044) + +1. Ionic Changelog + * [Pull request #1042](https://github.com/gazebosim/gz-rendering/pull/1042) 1. Remove gl preference in cmake * [Pull request #1041](https://github.com/gazebosim/gz-rendering/pull/1041) diff --git a/README.md b/README.md index 92506a21f..fea736f4a 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Build | Status -- | -- -Test coverage | [![codecov](https://codecov.io/gh/gazebosim/gz-rendering/branch/main/graph/badge.svg)](https://codecov.io/gh/gazebosim/gz-rendering/branch/main) +Test coverage | [![codecov](https://codecov.io/gh/gazebosim/gz-rendering/tree/main/graph/badge.svg)](https://codecov.io/gh/gazebosim/gz-rendering/tree/main) Ubuntu Noble | [![Build Status](https://build.osrfoundation.org/buildStatus/icon?job=gz_rendering-ci-main-noble-amd64)](https://build.osrfoundation.org/job/gz_rendering-ci-main-noble-amd64) Homebrew | [![Build Status](https://build.osrfoundation.org/buildStatus/icon?job=gz_rendering-ci-main-homebrew-amd64)](https://build.osrfoundation.org/job/gz_rendering-ci-main-homebrew-amd64) Windows | [![Build Status](https://build.osrfoundation.org/buildStatus/icon?job=gz_rendering-main-win)](https://build.osrfoundation.org/job/gz_rendering-main-win) @@ -31,9 +31,9 @@ of libraries designed to rapidly develop robot applications. [Folder Structure](#folder-structure) -[Code of Conduct](#code-of-conduct) +[Contributing](#contributing) -[Contributing](#code-of-contributing) +[Code of Conduct](#code-of-conduct) [Versioning](#versioning) @@ -80,8 +80,8 @@ Rendering engine plugin implementation code is stored in their own folders # Contributing -Please see -[CONTRIBUTING.md](https://gazebosim.org/docs/all/contributing). +Please see the +[contribution guide](https://gazebosim.org/docs/all/contributing). # Code of Conduct diff --git a/examples/depth_camera/CMakeLists.txt b/examples/depth_camera/CMakeLists.txt index a29651028..79d9a471c 100644 --- a/examples/depth_camera/CMakeLists.txt +++ b/examples/depth_camera/CMakeLists.txt @@ -20,7 +20,9 @@ if (NOT APPLE) link_directories(${GLEW_LIBRARY_DIRS}) endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") +if(NOT WIN32) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") +endif() configure_file (example_config.hh.in ${PROJECT_BINARY_DIR}/example_config.hh) diff --git a/examples/depth_camera/Main.cc b/examples/depth_camera/Main.cc index ac715ce5c..c461b5408 100644 --- a/examples/depth_camera/Main.cc +++ b/examples/depth_camera/Main.cc @@ -38,8 +38,13 @@ using namespace gz; using namespace rendering; +#if not defined(_WIN32) const std::string RESOURCE_PATH = common::joinPaths(std::string(PROJECT_BINARY_PATH), "media"); +#else +const std::string RESOURCE_PATH = + common::joinPaths(std::string(PROJECT_BINARY_PATH), "..", "media"); +#endif void buildScene(ScenePtr _scene) { diff --git a/examples/heightmap/CMakeLists.txt b/examples/heightmap/CMakeLists.txt index c40dd33f8..c20213ff2 100644 --- a/examples/heightmap/CMakeLists.txt +++ b/examples/heightmap/CMakeLists.txt @@ -20,7 +20,9 @@ if (NOT APPLE) link_directories(${GLEW_LIBRARY_DIRS}) endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") +if(NOT MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") +endif() configure_file (example_config.hh.in ${PROJECT_BINARY_DIR}/example_config.hh) diff --git a/examples/heightmap/Main.cc b/examples/heightmap/Main.cc index 82db73326..32ea61ea4 100644 --- a/examples/heightmap/Main.cc +++ b/examples/heightmap/Main.cc @@ -22,6 +22,8 @@ #include #include #include +#else + #include #endif #include @@ -39,8 +41,13 @@ using namespace gz; using namespace rendering; +#if not defined(_WIN32) const std::string RESOURCE_PATH = common::joinPaths(std::string(PROJECT_BINARY_PATH), "media"); +#else +const std::string RESOURCE_PATH = + common::joinPaths(std::string(PROJECT_BINARY_PATH), "..", "media"); +#endif ////////////////////////////////////////////////// void createImageHeightmaps(const ScenePtr _scene, VisualPtr _root) diff --git a/examples/lux_core_engine/CMakeLists.txt b/examples/lux_core_engine/CMakeLists.txt index 007ca5347..2f19c3bb2 100644 --- a/examples/lux_core_engine/CMakeLists.txt +++ b/examples/lux_core_engine/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.22.1 FATAL_ERROR) set(GZ_PLUGIN_VER 2) set(GZ_COMMON_VER 5) -find_package(gz-rendering7 REQUIRED) +find_package(gz-rendering9 REQUIRED) find_package(gz-plugin3 REQUIRED COMPONENTS all) if (NOT DEFINED ENV{LUXCORE_SDK_PATH}) diff --git a/ogre2/src/Ogre2Material.cc b/ogre2/src/Ogre2Material.cc index 70cc66959..f3009d408 100644 --- a/ogre2/src/Ogre2Material.cc +++ b/ogre2/src/Ogre2Material.cc @@ -15,6 +15,8 @@ * */ +#include + // Note this include is placed in the src file because // otherwise ogre produces compile errors #ifdef _MSC_VER @@ -31,6 +33,8 @@ #include #include #include +#include +#include #include #include #ifdef _MSC_VER @@ -130,6 +134,23 @@ class gz::rendering::Ogre2MaterialPrivate return "invalid"; } } + + /// \brief Prepare for normal mapping by converting to two-component + /// normalized signed 8-bit format + /// \param[in] _texture Normal map texture + /// \param[in/out] _image Normal map image data + public: void PrepareForNormalMapping(Ogre::TextureGpu *_texture, + Ogre::Image2 &_image); + + /// \brief Allocate mimaps for the texture. This should be done when the + /// texture's residency status is still OnStorage. + /// \param[in] _texture Input texture to allocate mimaps + public: void AllocateMipmaps(Ogre::TextureGpu *_texture); + + /// \brief Generate mimaps for the texture. This should be done when the + /// texture's residency status is Resident. + /// \param[in] _texture Input texture to generate mimpas + public: void GenerateMipmaps(Ogre::TextureGpu *_texture); }; using namespace gz; @@ -1220,6 +1241,8 @@ void Ogre2Material::SetTextureMapDataImpl(const std::string& _name, root->getRenderSystem()->getTextureGpuManager(); // create the gpu texture + Ogre::uint32 filters = Ogre::TextureFilter::TypeGenerateDefaultMipmaps; + filters |= this->ogreDatablock->suggestFiltersForType(_type); Ogre::uint32 textureFlags = 0; textureFlags |= Ogre::TextureFlags::AutomaticBatching; Ogre::TextureGpu *texture = textureMgr->createOrRetrieveTexture( @@ -1228,7 +1251,7 @@ void Ogre2Material::SetTextureMapDataImpl(const std::string& _name, textureFlags | Ogre::TextureFlags::ManualTexture, Ogre::TextureTypes::Type2D, Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME, - 0u); + filters); // Has to be loaded if (texture->getWidth() == 0) @@ -1241,13 +1264,31 @@ void Ogre2Material::SetTextureMapDataImpl(const std::string& _name, texture->setTextureType(Ogre::TextureTypes::Type2D); texture->setNumMipmaps(1u); texture->setResolution(_img->Width(), _img->Height()); - texture->scheduleTransitionTo(Ogre::GpuResidency::Resident); - texture->waitForData(); - // upload raw color image data to gpu texture Ogre::Image2 img; img.loadDynamicImage(&data[0], false, texture); + + // Replicates the steps that ogre does when it loads a texture map from + // file. For normal maps, it is first converted to a two component signed + // 8 bit format. Albedo and normal maps will have mipmaps generated. + // \todo(iche033) See if there is a way to reuse these functions + // from ogre-next without copying the code here. + + // Normal maps - convert to two component signed 8 bit format: + // Ogre::PFG_RG8_SNORM format + if (_type == Ogre::PBSM_NORMAL) + this->dataPtr->PrepareForNormalMapping(texture, img); + + if (_type == Ogre::PBSM_DIFFUSE || _type == Ogre::PBSM_NORMAL) + this->dataPtr->AllocateMipmaps(texture); + + // Upload raw color image data to gpu texture + texture->scheduleTransitionTo(Ogre::GpuResidency::Resident); + texture->waitForData(); img.uploadTo(texture, 0, 0); + + if (_type == Ogre::PBSM_DIFFUSE || _type == Ogre::PBSM_NORMAL) + this->dataPtr->GenerateMipmaps(texture); } // Now assign it to the material @@ -1563,3 +1604,89 @@ ShaderParamsPtr Ogre2Material::FragmentShaderParams() { return this->dataPtr->fragmentShaderParams; } + +////////////////////////////////////////////////// +void Ogre2MaterialPrivate::PrepareForNormalMapping(Ogre::TextureGpu *_texture, + Ogre::Image2 &_image) +{ + // code adpated from PrepareForNormalMapping::_executeStreaming function in + // OgreMain/src/OgreTextureFilters.cpp (v2-3) + const Ogre::uint8 numMipmaps = _image.getNumMipmaps(); + const Ogre::PixelFormatGpu dstFormat = Ogre::PFG_RG8_SNORM; + const Ogre::uint32 rowAlignment = 4u; + const size_t dstSizeBytes = Ogre::PixelFormatGpuUtils::calculateSizeBytes( + _image.getWidth(), + _image.getHeight(), + _image.getDepth(), + _image.getNumSlices(), + dstFormat, numMipmaps, + rowAlignment ); + void *imgData = OGRE_MALLOC_SIMD( dstSizeBytes, Ogre::MEMCATEGORY_RESOURCE); + for (Ogre::uint8 mip = 0; mip < numMipmaps; ++mip) + { + Ogre::TextureBox srcBox = _image.getData( mip ); + const Ogre::uint32 width = srcBox.width; + const Ogre::uint32 height = srcBox.height; + + Ogre::TextureBox dstBox = srcBox; + dstBox.bytesPerPixel = + Ogre::PixelFormatGpuUtils::getBytesPerPixel(dstFormat); + dstBox.bytesPerRow = + Ogre::PixelFormatGpuUtils::getSizeBytes( + width, 1u, 1u, 1u, dstFormat, 4u); + dstBox.bytesPerImage = + Ogre::PixelFormatGpuUtils::getSizeBytes(width, height, 1u, 1u, + dstFormat, 4u); + dstBox.data = Ogre::PixelFormatGpuUtils::advancePointerToMip( + imgData, width, height, srcBox.depth, srcBox.numSlices, mip, dstFormat); + + Ogre::PixelFormatGpuUtils::convertForNormalMapping( + srcBox, _image.getPixelFormat(), + dstBox, dstFormat); + } + _image.loadDynamicImage(imgData, _image.getWidth(), _image.getHeight(), + _image.getDepthOrSlices(), _image.getTextureType(), dstFormat, false, + numMipmaps); + _texture->setPixelFormat(dstFormat); +} + +////////////////////////////////////////////////// +void Ogre2MaterialPrivate::AllocateMipmaps(Ogre::TextureGpu *_texture) +{ + // code adpated from GenerateHwMipmaps::_executeStreaming function in + // OgreMain/src/OgreTextureFilters.cpp (v2-3) + Ogre::uint8 maxMipmaps = Ogre::PixelFormatGpuUtils::getMaxMipmapCount( + _texture->getWidth(), + _texture->getHeight(), + _texture->getDepth() ); + _texture->setNumMipmaps(maxMipmaps); +} + +////////////////////////////////////////////////// +void Ogre2MaterialPrivate::GenerateMipmaps(Ogre::TextureGpu *_texture) +{ + // code adpated from GenerateHwMipmaps::_executeSerial function in + // OgreMain/src/OgreTextureFilters.cpp (v2-3) + Ogre::TextureGpuManager *textureManager = _texture->getTextureManager(); + Ogre::TextureGpu *tempTexture = textureManager->createTexture( + "___tempMipmapTexture", + Ogre::GpuPageOutStrategy::Discard, + Ogre::TextureFlags::RenderToTexture | + Ogre::TextureFlags::AllowAutomipmaps | + Ogre::TextureFlags::DiscardableContent, + _texture->getTextureType()); + tempTexture->copyParametersFrom(_texture); + tempTexture->unsafeScheduleTransitionTo(Ogre::GpuResidency::Resident); + Ogre::TextureBox box = _texture->getEmptyBox(0); + _texture->copyTo(tempTexture, box, 0, box, 0); + tempTexture->_autogenerateMipmaps(); + + Ogre::uint8 mipmaps = _texture->getNumMipmaps(); + for (size_t i = 1u; i < mipmaps; ++i) + { + box = _texture->getEmptyBox( i ); + tempTexture->copyTo(_texture, box, i, box, i); + } + textureManager->destroyTexture(tempTexture); + tempTexture = 0; +} diff --git a/ogre2/src/Ogre2Scene.cc b/ogre2/src/Ogre2Scene.cc index d7bc1ff91..2d164e235 100644 --- a/ogre2/src/Ogre2Scene.cc +++ b/ogre2/src/Ogre2Scene.cc @@ -20,10 +20,14 @@ #include #include #else -#ifndef _WIN32 + #ifdef _WIN32 + // windows.h has to be included *before* GL/gl.h + // to avoid redefinition errors. + #include + #endif + #include #endif -#endif #include diff --git a/tutorials/02_install.md b/tutorials/02_install.md index cd8ffed3e..a23046e4d 100644 --- a/tutorials/02_install.md +++ b/tutorials/02_install.md @@ -135,11 +135,9 @@ sdk 4.0.2, comment out lines 167-206). # Windows -On Windows, only OGRE 1 is currently supported. +## Install Prerequisites -## Prerequisites - -First, follow the [gz-cmake](https://github.com/gazebosim/gz-cmake) tutorial for installing Conda, Visual Studio, CMake, and other prerequisites, and also for creating a Conda environment. +First, follow the [source installation](https://gazebosim.org/docs/ionic/install_windows_src/) tutorial until step 5 included for installing Conda, Visual Studio, CMake, etc., prerequisites, and creating a Conda environment. Navigate to ``condabin`` if necessary to use the ``conda`` command (i.e., if Conda is not in your `PATH` environment variable. You can find the location of ``condabin`` in Anaconda Prompt, ``where conda``). @@ -160,14 +158,9 @@ which version you need. ## Source Installation -This assumes you have created and activated a Conda environment while installing the Prerequisites. +This assumes you have created and activated a Conda environment while [installing the Prerequisites](#install-prerequisites). -1. Install dependencies: - ``` - conda install ogre --channel conda-forge - ``` - -2. Install Gazebo dependencies: +1. Install Gazebo dependencies: You can view available versions and their dependencies: ``` @@ -179,13 +172,13 @@ This assumes you have created and activated a Conda environment while installing conda install libgz-cmake<#> libgz-common<#> libgz-math<#> libgz-plugin<#> --channel conda-forge ``` -3. Navigate to where you would like to build the library, and clone the repository. +2. Navigate to where you would like to build the library, and clone the repository. ``` # Optionally, append `-b gz-rendering#` (replace # with a number) to check out a specific version git clone https://github.com/gazebosim/gz-rendering.git ``` -4. Configure and build +3. Configure and build ``` cd gz-rendering mkdir build @@ -194,7 +187,7 @@ This assumes you have created and activated a Conda environment while installing cmake --build . --config Release ``` -5. Optionally, install +4. Optionally, install ``` cmake --install . --config Release ``` @@ -203,9 +196,11 @@ This assumes you have created and activated a Conda environment while installing ## Binary Installation -On macOS, add OSRF packages: +Install [Homebrew](https://brew.sh/). + +Add OSRF packages: + ``` - ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew tap osrf/simulation ``` @@ -214,7 +209,7 @@ Install Gazebo Rendering: brew install gz-rendering<#> ``` -Be sure to replace `<#>` with a number value, such as 7 or 8, depending on +Be sure to replace `<#>` with a number value, such as 8 or 9, depending on which version you need. ## Source Installation diff --git a/tutorials/03_rendering_plugins.md b/tutorials/03_rendering_plugins.md index bc0527fed..16246e5eb 100644 --- a/tutorials/03_rendering_plugins.md +++ b/tutorials/03_rendering_plugins.md @@ -11,18 +11,18 @@ It is also possible to integrate your own selected rendering engine by writing a #### How to Write Your Own Rendering Engine Plugin -A mocked example of a custom rendering engine plugin can be found [here](https://github.com/gazebosim/gz-rendering/tree/gz-rendering7/examples/hello_world_plugin). In order +A mocked example of a custom rendering engine plugin can be found [here](https://github.com/gazebosim/gz-rendering/tree/gz-rendering9/examples/hello_world_plugin). In order to make your own custom rendering engine, this example is a good starting point. There are a few key things which will need to be done in order for a custom rendering engine to function: - * A singleton Render Engine class which implements the pure virtual functions in [`gz::rendering::BaseRenderEngine`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering7/include/gz/rendering/base/BaseRenderEngine.hh). - * A plugin class which implements the pure virtual functions in [`gz::rendering::RenderEnginePlugin`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering7/include/gz/rendering/RenderEnginePlugin.hh) - * Registering the plugin, this line can be seen at the bottom of the [`HelloWorldPlugin`](https://github.com/gazebosim/gz-rendering/tree/gz-rendering7/examples/hello_world_plugin/HelloWorldPlugin.cc) example + * A singleton Render Engine class which implements the pure virtual functions in [`gz::rendering::BaseRenderEngine`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering9/include/gz/rendering/base/BaseRenderEngine.hh). + * A plugin class which implements the pure virtual functions in [`gz::rendering::RenderEnginePlugin`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering9/include/gz/rendering/RenderEnginePlugin.hh) + * Registering the plugin, this line can be seen at the bottom of the [`HelloWorldPlugin`](https://github.com/gazebosim/gz-rendering/tree/gz-rendering9/examples/hello_world_plugin/HelloWorldPlugin.cc) example -Finally, for your custom rendering engine to actually have any functionality and at minimum, display something in a window, you will need to implement your own `Scene` and `Camera` classes, which inherit from and implement the pure virtual functions of [`gz::rendering::Scene`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering7/include/gz/rendering/Scene.hh) and [`gz::rendering::Camera`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering7/include/gz/rendering/Camera.hh), respectively. The mocked example simply returns `nullptr` for its `CreateSceneImpl(...)` function, so it may be useful to look at the current `Scene` implementations for the other rendering engines within `gz::rendering` such as [`OGRE`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering7/ogre/src/OgreScene.cc) or [`OGRE2`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering7/ogre2/src/Ogre2Scene.cc). Likewise, it may be helpful to look at the `Camera` implementations from [`OGRE`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering7/ogre/src/OgreCamera.cc) and [`OGRE2`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering7/ogre2/src/Ogre2Camera.cc) +Finally, for your custom rendering engine to actually have any functionality and at minimum, display something in a window, you will need to implement your own `Scene` and `Camera` classes, which inherit from and implement the pure virtual functions of [`gz::rendering::Scene`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering9/include/gz/rendering/Scene.hh) and [`gz::rendering::Camera`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering9/include/gz/rendering/Camera.hh), respectively. The mocked example simply returns `nullptr` for its `CreateSceneImpl(...)` function, so it may be useful to look at the current `Scene` implementations for the other rendering engines within `gz::rendering` such as [`OGRE`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering9/ogre/src/OgreScene.cc) or [`OGRE2`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering9/ogre2/src/Ogre2Scene.cc). Likewise, it may be helpful to look at the `Camera` implementations from [`OGRE`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering9/ogre/src/OgreCamera.cc) and [`OGRE2`](https://github.com/gazebosim/gz-rendering/blob/gz-rendering9/ogre2/src/Ogre2Camera.cc) #### Building and Running Your Rendering Engine Plugin with Gazebo -Once you have your own rendering plugin written, you can build it similarly to how the example is built. It may be helpful to look at the [`CMakeLists.txt`](https://github.com/gazebosim/gz-rendering/tree/gz-rendering7/examples/hello_world_plugin) from the example as it contains the boilerplate code needed to get a custom rendering engine plugin built. +Once you have your own rendering plugin written, you can build it similarly to how the example is built. It may be helpful to look at the [`CMakeLists.txt`](https://github.com/gazebosim/gz-rendering/tree/gz-rendering9/examples/hello_world_plugin) from the example as it contains the boilerplate code needed to get a custom rendering engine plugin built. After you have your plugin built, you will need to set the `GZ_SIM_RENDER_ENGINE_PATH` environment variable to the path in which your built shared library resides. Note that you will need to do this for every command line instance unless you add the line to your startup shell script (`.bashrc`, `.zshrc`, etc.). diff --git a/tutorials/18_simple_demo_tutorial.md b/tutorials/18_simple_demo_tutorial.md index cf212cd8a..7fb573503 100644 --- a/tutorials/18_simple_demo_tutorial.md +++ b/tutorials/18_simple_demo_tutorial.md @@ -12,12 +12,19 @@ cd gz-rendering/examples/simple_demo mkdir build cd build cmake .. -make +# Linux +cmake --build . +# Windows +cmake --build . --config Release ``` Execute the example: ```{.sh} +# Linux ./simple_demo + +# Windows +.\Release\simple_demo ``` You'll see: diff --git a/tutorials/21_heightmap.md b/tutorials/21_heightmap.md index 93b24fd5f..894ed4d49 100644 --- a/tutorials/21_heightmap.md +++ b/tutorials/21_heightmap.md @@ -6,7 +6,7 @@ It loads 2 different heightmaps (image and Digital Elevation Model (DEM)) with d ## Compile and run the example -Clone the source code, create a build directory and use `cmake` and `make` to compile the code: +Clone the source code, create a build directory and use `cmake` to compile the code: ```{.sh} git clone https://github.com/gazebosim/gz-rendering @@ -14,12 +14,19 @@ cd gz-rendering/examples/heightmap mkdir build cd build cmake .. -make +# Linux +cmake --build . +# Windows +cmake --build . --config Release ``` Example 1 (image heightmap): ```{.sh} +# Linux ./heightmap + +# Windows +.\Release\heightmap.exe ``` You'll see: diff --git a/tutorials/21_render_order.md b/tutorials/21_render_order.md index 334204ef5..d082303e0 100644 --- a/tutorials/21_render_order.md +++ b/tutorials/21_render_order.md @@ -48,5 +48,9 @@ make Execute the example: ```{.sh} +# Linux (defaults to using ogre1) ./simple_demo + +# macOS (ogre1 is not supported on macOS, but ogre2 is) +./simple_demo ogre2 ``` diff --git a/tutorials/23_depth_camera_tutorial.md b/tutorials/23_depth_camera_tutorial.md index a1204ec9b..f4c7cb379 100644 --- a/tutorials/23_depth_camera_tutorial.md +++ b/tutorials/23_depth_camera_tutorial.md @@ -2,6 +2,18 @@ This example shows how to use the depth camera. +## Install prerequisites + +In order to compile this tutorial, you need to install some prerequisites : + +```bash +# Linux +sudo apt-get install build-essential freeglut3-dev libglew-dev + +# Windows (via conda) +conda install glew --channel conda-forge +``` + ## Compile and run the example Clone the source code, create a build directory and use `cmake` and `make` to compile the code: @@ -12,13 +24,20 @@ cd gz-rendering/examples/depth_camera mkdir build cd build cmake .. -make +# On Linux +cmake --build . +# On Windows +cmake --build . --config Release ``` Execute the example: ```{.sh} +# Linux ./depth_camera ogre + +# Windows +.\Release\depth_camera.exe ogre ``` You'll see: