PixelLightAPI  .
ParameterManager.h
Go to the documentation of this file.
00001 /*********************************************************\
00002  *  File: ParameterManager.h                             *
00003  *
00004  *  Copyright (C) 2002-2012 The PixelLight Team (http://www.pixellight.org/)
00005  *
00006  *  This file is part of PixelLight.
00007  *
00008  *  PixelLight is free software: you can redistribute it and/or modify
00009  *  it under the terms of the GNU Lesser General Public License as published by
00010  *  the Free Software Foundation, either version 3 of the License, or
00011  *  (at your option) any later version.
00012  *
00013  *  PixelLight is distributed in the hope that it will be useful,
00014  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00016  *  GNU Lesser General Public License for more details.
00017  *
00018  *  You should have received a copy of the GNU Lesser General Public License
00019  *  along with PixelLight. If not, see <http://www.gnu.org/licenses/>.
00020 \*********************************************************/
00021 
00022 
00023 #ifndef __PLRENDERER_MATERIAL_PARAMETERMANAGER_H__
00024 #define __PLRENDERER_MATERIAL_PARAMETERMANAGER_H__
00025 #pragma once
00026 
00027 
00028 //[-------------------------------------------------------]
00029 //[ Includes                                              ]
00030 //[-------------------------------------------------------]
00031 #include <PLCore/Base/Event/Event.h>
00032 #include "PLRenderer/Renderer/Parameters.h"
00033 
00034 
00035 //[-------------------------------------------------------]
00036 //[ Forward declarations                                  ]
00037 //[-------------------------------------------------------]
00038 namespace PLCore {
00039     class XmlElement;
00040 }
00041 namespace PLRenderer {
00042     class Parameter;
00043     class RendererContext;
00044 }
00045 
00046 
00047 //[-------------------------------------------------------]
00048 //[ Namespace                                             ]
00049 //[-------------------------------------------------------]
00050 namespace PLRenderer {
00051 
00052 
00053 //[-------------------------------------------------------]
00054 //[ Classes                                               ]
00055 //[-------------------------------------------------------]
00056 /**
00057 *  @brief
00058 *    Parameter manager
00059 *
00060 *  @remarks
00061 *    The implementation of the 'SetParameter()' functions automatically create 'missing' parameters,
00062 *    if you don't want this, use for example 'IsParameter()' before calling 'SetParameter()'.
00063 */
00064 class ParameterManager : public Parameters {
00065 
00066 
00067     //[-------------------------------------------------------]
00068     //[ Friends                                               ]
00069     //[-------------------------------------------------------]
00070     friend class Effect;
00071     friend class Material;
00072     friend class Parameter;
00073 
00074 
00075     //[-------------------------------------------------------]
00076     //[ Events                                                ]
00077     //[-------------------------------------------------------]
00078     public:
00079         PLCore::Event<Parameter&> EventParameterChanged;    /**< Parameter changed (created, destroyed, value changed) event, changed parameter as parameter */
00080 
00081 
00082     //[-------------------------------------------------------]
00083     //[ Public functions                                      ]
00084     //[-------------------------------------------------------]
00085     public:
00086         /**
00087         *  @brief
00088         *    Returns the owner renderer context
00089         *
00090         *  @return
00091         *    Reference to the owner renderer context
00092         */
00093         inline RendererContext &GetRendererContext() const;
00094 
00095         /**
00096         *  @brief
00097         *    Gets the number of parameters
00098         *
00099         *  @return
00100         *    Number of parameters
00101         */
00102         inline PLCore::uint32 GetNumOfParameters() const;
00103 
00104         /**
00105         *  @brief
00106         *    Creates a new parameter
00107         *
00108         *  @param[in] nType
00109         *    Type of the new parameter, NEVER UnknownDataType!
00110         *  @param[in] sName
00111         *    Name of the new parameter, if there's already a parameter with this name this
00112         *    parameter is returned instead creating a new one
00113         *
00114         *  @return
00115         *    The created parameter, a null pointer on error (maybe unknown data type?)
00116         */
00117         PLRENDERER_API Parameter *CreateParameter(EDataType nType, const PLCore::String &sName);
00118 
00119         /**
00120         *  @brief
00121         *    Gets a parameter by index
00122         *
00123         *  @param[in] nIndex
00124         *    Parameter index
00125         *
00126         *  @return
00127         *    The requested parameter, a null pointer on error
00128         */
00129         inline Parameter *GetParameter(PLCore::uint32 nIndex) const;
00130 
00131         /**
00132         *  @brief
00133         *    Gets a parameter by name
00134         *
00135         *  @param[in] sName
00136         *    Parameter name
00137         *
00138         *  @return
00139         *    The requested parameter, a null pointer on error
00140         */
00141         inline Parameter *GetParameter(const PLCore::String &sName) const;
00142 
00143         /**
00144         *  @brief
00145         *    Add all parameters to a given XML element
00146         *
00147         *  @param[out] cElement
00148         *    XML element were the parameters should be added
00149         *
00150         *  @return
00151         *    'true' if all went fine, else 'false' (maybe invalid XML element)
00152         */
00153         PLRENDERER_API bool AddParametersToXMLElement(PLCore::XmlElement &cElement) const;
00154 
00155         /**
00156         *  @brief
00157         *    Adds a parameter from a given XML element
00158         *
00159         *  @param[in] cElement
00160         *    XML element were the parameter should be added from
00161         *
00162         *  @return
00163         *    'true' if all went fine, else 'false'
00164         *    (maybe invalid XML element or it's no known parameter type or no parameter name given)
00165         *
00166         *  @note
00167         *    - If there's already a parameter with this name, this parameter to add is ignored (returns false)
00168         */
00169         PLRENDERER_API bool AddParameterFromXMLElement(const PLCore::XmlElement &cElement);
00170 
00171         /**
00172         *  @brief
00173         *    Removes a parameter by index
00174         *
00175         *  @param[in] nIndex
00176         *    Index of the parameter name to remove
00177         *
00178         *  @return
00179         *    'true' if all went fine and the parameter was removed, else 'false'
00180         *    (maybe unknown parameter?)
00181         */
00182         PLRENDERER_API bool RemoveParameter(PLCore::uint32 nIndex);
00183 
00184         /**
00185         *  @brief
00186         *    Removes a parameter by name
00187         *
00188         *  @param[in] sName
00189         *    Name of the parameter name to remove
00190         *
00191         *  @return
00192         *    'true' if all went fine and the parameter was removed, else 'false'
00193         *    (maybe unknown parameter?)
00194         */
00195         PLRENDERER_API bool RemoveParameter(const PLCore::String &sName);
00196 
00197         /**
00198         *  @brief
00199         *    Removes all parameters
00200         */
00201         PLRENDERER_API void RemoveAllParameters();
00202 
00203 
00204     //[-------------------------------------------------------]
00205     //[ Public virtual ParameterManager functions             ]
00206     //[-------------------------------------------------------]
00207     public:
00208         /**
00209         *  @brief
00210         *    Reloads all textures
00211         *
00212         *  @return
00213         *    'true' if all went fine, else 'false'
00214         */
00215         PLRENDERER_API virtual bool ReloadTextures() const;
00216 
00217         /**
00218         *  @brief
00219         *    Called when a parameter has been changed (created, destroyed, value changed)
00220         *
00221         *  @param[in] cParameter
00222         *    Changed parameter
00223         *
00224         *  @note
00225         *    - The default implementation just emits the "EventParameterChanged"-event
00226         */
00227         PLRENDERER_API virtual void OnParameterChange(Parameter &cParameter) const;
00228 
00229 
00230     //[-------------------------------------------------------]
00231     //[ Private functions                                     ]
00232     //[-------------------------------------------------------]
00233     private:
00234         /**
00235         *  @brief
00236         *    Constructor
00237         *
00238         *  @param[in] cRendererContext
00239         *    Renderer context to use
00240         */
00241         ParameterManager(RendererContext &cRendererContext);
00242 
00243         /**
00244         *  @brief
00245         *    Destructor
00246         */
00247         virtual ~ParameterManager();
00248 
00249 
00250     //[-------------------------------------------------------]
00251     //[ Private data                                          ]
00252     //[-------------------------------------------------------]
00253     private:
00254         RendererContext                             *m_pRendererContext;    /**< Renderer context to use, always valid! */
00255         PLCore::Array<Parameter*>                    m_lstParameters;
00256         PLCore::HashMap<PLCore::String, Parameter*>  m_mapParameters;
00257 
00258 
00259     //[-------------------------------------------------------]
00260     //[ Public virtual Parameters functions                   ]
00261     //[-------------------------------------------------------]
00262     public:
00263         PLRENDERER_API virtual bool IsParameter(const PLCore::String &sName) const override;
00264         PLRENDERER_API virtual PLCore::String GetParameterString(const PLCore::String &sName) const override;
00265         PLRENDERER_API virtual bool SetParameterString(const PLCore::String &sName, const PLCore::String &sValue) override;
00266         // Integer
00267         PLRENDERER_API virtual bool GetParameter1i(const PLCore::String &sName, int &nX) const override;
00268         PLRENDERER_API virtual bool SetParameter1i(const PLCore::String &sName, int nX) override;
00269         // Integer2
00270         PLRENDERER_API virtual bool GetParameter2i(const PLCore::String &sName, int &nX, int &nY) const override;
00271         PLRENDERER_API virtual bool GetParameter2iv(const PLCore::String &sName, int nValue[]) const override;
00272         PLRENDERER_API virtual bool SetParameter2i(const PLCore::String &sName, int nX, int nY) override;
00273         PLRENDERER_API virtual bool SetParameter2iv(const PLCore::String &sName, const int nValue[]) override;
00274         // Integer3
00275         PLRENDERER_API virtual bool GetParameter3i(const PLCore::String &sName, int &nX, int &nY, int &nZ) const override;
00276         PLRENDERER_API virtual bool GetParameter3iv(const PLCore::String &sName, int nValue[]) const override;
00277         PLRENDERER_API virtual bool SetParameter3i(const PLCore::String &sName, int nX, int nY, int nZ) override;
00278         PLRENDERER_API virtual bool SetParameter3iv(const PLCore::String &sName, const int nValue[]) override;
00279         // Integer4
00280         PLRENDERER_API virtual bool GetParameter4i(const PLCore::String &sName, int &nX, int &nY, int &nZ, int &nW) const override;
00281         PLRENDERER_API virtual bool GetParameter4iv(const PLCore::String &sName, int nValue[]) const override;
00282         PLRENDERER_API virtual bool SetParameter4i(const PLCore::String &sName, int nX, int nY, int nZ, int nW) override;
00283         PLRENDERER_API virtual bool SetParameter4iv(const PLCore::String &sName, const int nValue[]) override;
00284         // Float
00285         PLRENDERER_API virtual bool GetParameter1f(const PLCore::String &sName, float &fX) const override;
00286         PLRENDERER_API virtual bool SetParameter1f(const PLCore::String &sName, float fX) override;
00287         // Float2
00288         PLRENDERER_API virtual bool GetParameter2f(const PLCore::String &sName, float &fX, float &fY) const override;
00289         PLRENDERER_API virtual bool GetParameter2fv(const PLCore::String &sName, float fValue[]) const override;
00290         PLRENDERER_API virtual bool SetParameter2f(const PLCore::String &sName, float fX, float fY) override;
00291         PLRENDERER_API virtual bool SetParameter2fv(const PLCore::String &sName, const float fValue[]) override;
00292         // Float3
00293         PLRENDERER_API virtual bool GetParameter3f(const PLCore::String &sName, float &fX, float &fY, float &fZ) const override;
00294         PLRENDERER_API virtual bool GetParameter3fv(const PLCore::String &sName, float fValue[]) const override;
00295         PLRENDERER_API virtual bool SetParameter3f(const PLCore::String &sName, float fX, float fY, float fZ) override;
00296         PLRENDERER_API virtual bool SetParameter3fv(const PLCore::String &sName, const float fValue[]) override;
00297         // Float4
00298         PLRENDERER_API virtual bool GetParameter4f(const PLCore::String &sName, float &fX, float &fY, float &fZ, float &fW) const override;
00299         PLRENDERER_API virtual bool GetParameter4fv(const PLCore::String &sName, float fValue[]) const override;
00300         PLRENDERER_API virtual bool SetParameter4f(const PLCore::String &sName, float fX, float fY, float fZ, float fW) override;
00301         PLRENDERER_API virtual bool SetParameter4fv(const PLCore::String &sName, const float fValue[]) override;
00302         // Double
00303         PLRENDERER_API virtual bool GetParameter1d(const PLCore::String &sName, double &fX) const override;
00304         PLRENDERER_API virtual bool SetParameter1d(const PLCore::String &sName, double fX) override;
00305         // Double2
00306         PLRENDERER_API virtual bool GetParameter2d(const PLCore::String &sName, double &fX, double &fY) const override;
00307         PLRENDERER_API virtual bool GetParameter2dv(const PLCore::String &sName, double fValue[]) const override;
00308         PLRENDERER_API virtual bool SetParameter2d(const PLCore::String &sName, double fX, double fY) override;
00309         PLRENDERER_API virtual bool SetParameter2dv(const PLCore::String &sName, const double fValue[]) override;
00310         // Double3
00311         PLRENDERER_API virtual bool GetParameter3d(const PLCore::String &sName, double &fX, double &fY, double &fZ) const override;
00312         PLRENDERER_API virtual bool GetParameter3dv(const PLCore::String &sName, double fValue[]) const override;
00313         PLRENDERER_API virtual bool SetParameter3d(const PLCore::String &sName, double fX, double fY, double fZ) override;
00314         PLRENDERER_API virtual bool SetParameter3dv(const PLCore::String &sName, const double fValue[]) override;
00315         // Double4
00316         PLRENDERER_API virtual bool GetParameter4d(const PLCore::String &sName, double &fX, double &fY, double &fZ, double &fW) const override;
00317         PLRENDERER_API virtual bool GetParameter4dv(const PLCore::String &sName, double fValue[]) const override;
00318         PLRENDERER_API virtual bool SetParameter4d(const PLCore::String &sName, double fX, double fY, double fZ, double fW) override;
00319         PLRENDERER_API virtual bool SetParameter4dv(const PLCore::String &sName, const double fValue[]) override;
00320         // Float3x3
00321         PLRENDERER_API virtual bool GetParameterFloat3x3(const PLCore::String &sName, float fValue[]) const override;
00322         PLRENDERER_API virtual bool SetParameterFloat3x3(const PLCore::String &sName, const float fValue[]) override;
00323         // Float3x4
00324         PLRENDERER_API virtual bool GetParameterFloat3x4(const PLCore::String &sName, float fValue[]) const override;
00325         PLRENDERER_API virtual bool SetParameterFloat3x4(const PLCore::String &sName, const float fValue[]) override;
00326         // Float4x4
00327         PLRENDERER_API virtual bool GetParameterMatrixfv(const PLCore::String &sName, float fValue[]) const override;
00328         PLRENDERER_API virtual bool SetParameterMatrixfv(const PLCore::String &sName, const float fValue[]) override;
00329         // Double4x4
00330         PLRENDERER_API virtual bool GetParameterMatrixdv(const PLCore::String &sName, double fValue[]) const override;
00331         PLRENDERER_API virtual bool SetParameterMatrixdv(const PLCore::String &sName, const double fValue[]) override;
00332         // Texture buffer
00333         PLRENDERER_API virtual PLRenderer::TextureBuffer *GetParameterTextureBuffer(const PLCore::String &sName) const override;
00334         PLRENDERER_API virtual int SetParameterTextureBuffer(const PLCore::String &sName, PLRenderer::TextureBuffer *pTextureBuffer) override;
00335         PLRENDERER_API virtual PLRenderer::Texture *GetParameterTexture(const PLCore::String &sName) const override;
00336         PLRENDERER_API virtual int SetParameterTexture(const PLCore::String &sName, const PLCore::String &sFilename) override;
00337         PLRENDERER_API virtual int SetParameterTexture(const PLCore::String &sName, PLRenderer::Texture *pTexture) override;
00338 
00339 
00340 };
00341 
00342 
00343 //[-------------------------------------------------------]
00344 //[ Namespace                                             ]
00345 //[-------------------------------------------------------]
00346 } // PLRenderer
00347 
00348 
00349 //[-------------------------------------------------------]
00350 //[ Implementation                                        ]
00351 //[-------------------------------------------------------]
00352 #include "PLRenderer/Material/ParameterManager.inl"
00353 
00354 
00355 #endif // __PLRENDERER_MATERIAL_PARAMETERMANAGER_H__


PixelLight PixelLight 0.9.11-R1
Copyright (C) 2002-2012 by The PixelLight Team
Last modified Thu Feb 23 2012 14:08:57
The content of this PixelLight document is published under the
Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported