pxmlw6n2f/Gazebo_Distributed_MPI/gazebo/gui/model/EditorMaterialSwitcher.hh

142 lines
5.3 KiB
C++

/*
* Copyright (C) 2015 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 _GAZEBO_EDITOR_MATERIAL_SWITCHER_HH_
#define _GAZEBO_EDITOR_MATERIAL_SWITCHER_HH_
#include <string>
#include "gazebo/rendering/ogre_gazebo.h"
#include "gazebo/util/system.hh"
namespace gazebo
{
namespace gui
{
// forward declarations
class EditorMaterialListener;
class EditorRenderTargetListener;
// typedefs that are used only in this class
using EditorRenderTargetListenerPtr =
std::shared_ptr<EditorRenderTargetListener>;
using EditorMaterialListenerPtr =
std::shared_ptr<EditorMaterialListener>;
/// \class EditorMaterialSwitcher EditorMaterialSwitcher.hh
/// \brief Material switcher for the model editor used to toggle the
/// material of the model.
class GZ_GUI_VISIBLE EditorMaterialSwitcher
{
/// \brief Constructor
/// \param[in] _camera Pointer to the camera whose viewport will be
/// updated to see the effect of the material switch.
public: EditorMaterialSwitcher(const rendering::CameraPtr &_camera);
/// \brief Destructor
public: ~EditorMaterialSwitcher() = default;
/// \brief Set the material scheme that will be applied to the models
/// in the editor
/// \param[in] _scheme Name of material scheme
public: void SetMaterialScheme(const std::string &_scheme);
/// \brief Get the material scheme applied to the models in the editor
/// \return Name of material scheme
public: std::string MaterialScheme() const;
/// \brief Ogre render target listener that adds and removes the
/// material listener on every render event
private: EditorRenderTargetListenerPtr renderTargetListener;
/// \brief Ogre material listener that will handle switching the
/// material scheme
private: EditorMaterialListenerPtr materialListener;
/// \brief Pointer to the camera
private: rendering::CameraPtr camera;
/// \brief Name of the original material scheme
private: std::string originalMaterialScheme;
/// \brief Name of the material scheme being used.
private: std::string materialScheme;
};
/// \class EditorRenderTargetListener EditorMaterialSwitcher.hh
/// \brief Ogre render target listener.
class EditorRenderTargetListener : public Ogre::RenderTargetListener
{
/// \brief Constructor
/// \param[in] _switcher Material listener that will be added to or
/// removed from Ogre material manager's list of listeners.
public: EditorRenderTargetListener(
const EditorMaterialListenerPtr &_switcher);
/// \brief Destructor
public: ~EditorRenderTargetListener() = default;
/// \brief Ogre's pre-render update callback
/// \param[in] _evt Ogre render target event containing information about
/// the source render target.
public: virtual void preRenderTargetUpdate(
const Ogre::RenderTargetEvent &_evt);
/// \brief Ogre's post-render update callback
/// \param[in] _evt Ogre render target event containing information about
/// the source render target.
public: virtual void postRenderTargetUpdate(
const Ogre::RenderTargetEvent &_evt);
/// \brief Pointer to the material listener
private: EditorMaterialListenerPtr materialListener;
};
/// \class EditorMaterialListener EditorMaterialSwitcher.hh
/// \brief Ogre material listener.
class EditorMaterialListener : public Ogre::MaterialManager::Listener
{
/// \brief Constructor
/// \param[in] _camera Pointer to the camera whose viewport will be
/// updated to see the effect of the material switch.
public: EditorMaterialListener(const rendering::CameraPtr &_camera);
/// \brief Destructor
public: ~EditorMaterialListener() = default;
/// \brief Ogre callback that is used to specify the material to use when
/// the requested scheme is not found
/// \param[in] _schemeIndex Index of scheme requested
/// \param[in] _schemeName Name of scheme requested
/// \param[in] _originalMaterial Orignal material that does not contain
/// the requested scheme
/// \param[in] _lodIndex The material level-of-detail
/// \param[in] _rend Pointer to the Ogre::Renderable object requesting
/// the use of the techinique
/// \return The Ogre material technique to use when scheme is not found.
public: virtual Ogre::Technique *handleSchemeNotFound(
uint16_t _schemeIndex, const Ogre::String &_schemeName,
Ogre::Material *_originalMaterial, uint16_t _lodIndex,
const Ogre::Renderable *_rend);
/// \brief Pointer to the camera
private: rendering::CameraPtr camera;
};
}
}
#endif