diff options
| author | Mirrorbot <mirrorbot@cogarr.net> | 2025-12-27 17:53:06 -0600 |
|---|---|---|
| committer | Mirrorbot <mirrorbot@cogarr.net> | 2025-12-27 17:53:06 -0600 |
| commit | 71e94ee161447b84c0eaabf6567f8fa62262cd3e (patch) | |
| tree | 391064cc6173a6fe75069af2fdc1978af12f623e /include/IMaterialRendererServices.h | |
| download | irrlicht-71e94ee161447b84c0eaabf6567f8fa62262cd3e.tar.gz irrlicht-71e94ee161447b84c0eaabf6567f8fa62262cd3e.tar.bz2 irrlicht-71e94ee161447b84c0eaabf6567f8fa62262cd3e.zip | |
Diffstat (limited to 'include/IMaterialRendererServices.h')
| -rw-r--r-- | include/IMaterialRendererServices.h | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/include/IMaterialRendererServices.h b/include/IMaterialRendererServices.h new file mode 100644 index 0000000..9f045b5 --- /dev/null +++ b/include/IMaterialRendererServices.h @@ -0,0 +1,115 @@ +// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef __I_MATERIAL_RENDERER_SERVICES_H_INCLUDED__
+#define __I_MATERIAL_RENDERER_SERVICES_H_INCLUDED__
+
+#include "SMaterial.h"
+#include "S3DVertex.h"
+
+namespace irr
+{
+namespace video
+{
+
+class IVideoDriver;
+
+
+//! Interface providing some methods for changing advanced, internal states of a IVideoDriver.
+class IMaterialRendererServices
+{
+public:
+
+ //! Destructor
+ virtual ~IMaterialRendererServices() {}
+
+ //! Can be called by an IMaterialRenderer to make its work easier.
+ /** Sets all basic renderstates if needed.
+ Basic render states are diffuse, ambient, specular, and emissive color,
+ specular power, bilinear and trilinear filtering, wireframe mode,
+ grouraudshading, lighting, zbuffer, zwriteenable, backfaceculling and
+ fog enabling.
+ \param material The new material to be used.
+ \param lastMaterial The material used until now.
+ \param resetAllRenderstates Set to true if all renderstates should be
+ set, regardless of their current state. */
+ virtual void setBasicRenderStates(const SMaterial& material,
+ const SMaterial& lastMaterial,
+ bool resetAllRenderstates) = 0;
+
+ //! Sets a constant for the vertex shader based on a name.
+ /** This can be used if you used a high level shader language like GLSL
+ or HLSL to create a shader. Example: If you created a shader which has
+ variables named 'mWorldViewProj' (containing the WorldViewProjection
+ matrix) and another one named 'fTime' containing one float, you can set
+ them in your IShaderConstantSetCallBack derived class like this:
+ \code
+ virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
+ {
+ video::IVideoDriver* driver = services->getVideoDriver();
+
+ f32 time = (f32)os::Timer::getTime()/100000.0f;
+ services->setVertexShaderConstant("fTime", &time, 1);
+
+ core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION));
+ worldViewProj *= driver->getTransform(video::ETS_VIEW);
+ worldViewProj *= driver->getTransform(video::ETS_WORLD);
+ services->setVertexShaderConstant("mWorldViewProj", worldViewProj.M, 16);
+ }
+ \endcode
+ \param name Name of the variable
+ \param floats Pointer to array of floats
+ \param count Amount of floats in array.
+ \return True if successful.
+ */
+ virtual bool setVertexShaderConstant(const c8* name, const f32* floats, int count) = 0;
+
+ //! Bool interface for the above.
+ virtual bool setVertexShaderConstant(const c8* name, const bool* bools, int count) = 0;
+
+ //! Int interface for the above.
+ virtual bool setVertexShaderConstant(const c8* name, const s32* ints, int count) = 0;
+
+ //! Sets a vertex shader constant.
+ /** Can be used if you created a shader using pixel/vertex shader
+ assembler or ARB_fragment_program or ARB_vertex_program.
+ \param data: Data to be set in the constants
+ \param startRegister: First register to be set
+ \param constantAmount: Amount of registers to be set. One register consists of 4 floats. */
+ virtual void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) = 0;
+
+ //! Sets a constant for the pixel shader based on a name.
+ /** This can be used if you used a high level shader language like GLSL
+ or HLSL to create a shader. See setVertexShaderConstant() for an
+ example on how to use this.
+ \param name Name of the variable
+ \param floats Pointer to array of floats
+ \param count Amount of floats in array.
+ \return True if successful. */
+ virtual bool setPixelShaderConstant(const c8* name, const f32* floats, int count) = 0;
+
+ //! Bool interface for the above.
+ virtual bool setPixelShaderConstant(const c8* name, const bool* bools, int count) = 0;
+
+ //! Int interface for the above.
+ virtual bool setPixelShaderConstant(const c8* name, const s32* ints, int count) = 0;
+
+ //! Sets a pixel shader constant.
+ /** Can be used if you created a shader using pixel/vertex shader
+ assembler or ARB_fragment_program or ARB_vertex_program.
+ \param data Data to be set in the constants
+ \param startRegister First register to be set.
+ \param constantAmount Amount of registers to be set. One register consists of 4 floats. */
+ virtual void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) = 0;
+
+ //! Get pointer to the IVideoDriver interface
+ /** \return Pointer to the IVideoDriver interface */
+ virtual IVideoDriver* getVideoDriver() = 0;
+};
+
+} // end namespace video
+} // end namespace irr
+
+#endif
+
|
