diff options
author | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-04-13 08:40:18 +0200 |
---|---|---|
committer | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-04-13 18:01:09 +0200 |
commit | bf90df100e120e272c14c7975a22ed01bf3ad215 (patch) | |
tree | 073f4cf268a7f9407e5ad4a313ae76a619ff1dcc /source/Irrlicht/CShadowVolumeSceneNode.h | |
parent | 7a3fc62ada4001d5bb6c97ed26ec19a4e7c9d9ac (diff) | |
download | irrlicht-bf90df100e120e272c14c7975a22ed01bf3ad215.tar.xz |
Add back lighting system
Code is taken from latest irrlicht trunk; this is relevant because there have been fixes to stencil shadows since 1.8.5 (irrlicht SVN revision 5933).
Diffstat (limited to 'source/Irrlicht/CShadowVolumeSceneNode.h')
-rw-r--r-- | source/Irrlicht/CShadowVolumeSceneNode.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/source/Irrlicht/CShadowVolumeSceneNode.h b/source/Irrlicht/CShadowVolumeSceneNode.h new file mode 100644 index 0000000..89f5fa9 --- /dev/null +++ b/source/Irrlicht/CShadowVolumeSceneNode.h @@ -0,0 +1,99 @@ +// 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 IRR_C_SHADOW_VOLUME_SCENE_NODE_H_INCLUDED
+#define IRR_C_SHADOW_VOLUME_SCENE_NODE_H_INCLUDED
+
+#include "IShadowVolumeSceneNode.h"
+
+namespace irr
+{
+namespace scene
+{
+
+ //! Scene node for rendering a shadow volume into a stencil buffer.
+ class CShadowVolumeSceneNode : public IShadowVolumeSceneNode
+ {
+ public:
+
+ //! constructor
+ CShadowVolumeSceneNode(const IMesh* shadowMesh, ISceneNode* parent, ISceneManager* mgr,
+ s32 id, bool zfailmethod=true, f32 infinity=10000.0f);
+
+ //! destructor
+ virtual ~CShadowVolumeSceneNode();
+
+ //! Sets the mesh from which the shadow volume should be generated.
+ /** To optimize shadow rendering, use a simpler mesh for shadows.
+ */
+ virtual void setShadowMesh(const IMesh* mesh) override;
+
+ //! Updates the shadow volumes for current light positions.
+ /** Called each render cycle from Animated Mesh SceneNode render method. */
+ virtual void updateShadowVolumes() override;
+
+ //! Set optimization used to create shadow volumes
+ /** Default is ESV_SILHOUETTE_BY_POS. If the shadow
+ looks bad then give ESV_NONE a try (which will be slower). */
+ virtual void setOptimization(ESHADOWVOLUME_OPTIMIZATION optimization) override;
+
+ //! Get currently active optimization used to create shadow volumes
+ virtual ESHADOWVOLUME_OPTIMIZATION getOptimization() const override
+ {
+ return Optimization;
+ }
+
+ //! pre render method
+ virtual void OnRegisterSceneNode() override;
+
+ //! renders the node.
+ virtual void render() override;
+
+ //! returns the axis aligned bounding box of this node
+ virtual const core::aabbox3d<f32>& getBoundingBox() const override;
+
+ //! Returns type of the scene node
+ virtual ESCENE_NODE_TYPE getType() const override { return ESNT_SHADOW_VOLUME; }
+
+ private:
+
+ typedef core::array<core::vector3df> SShadowVolume;
+
+ void createShadowVolume(const core::vector3df& pos, bool isDirectional);
+ u32 createEdgesAndCaps(const core::vector3df& light, bool isDirectional, SShadowVolume* svp, core::aabbox3d<f32>* bb);
+
+ //! Generates adjacency information based on mesh indices.
+ void calculateAdjacency();
+
+ core::aabbox3d<f32> Box;
+
+ // a shadow volume for every light
+ core::array<SShadowVolume> ShadowVolumes;
+
+ // a back cap bounding box for every light
+ core::array<core::aabbox3d<f32> > ShadowBBox;
+
+ core::array<core::vector3df> Vertices;
+ core::array<u16> Indices;
+ core::array<u16> Adjacency;
+ core::array<u16> Edges;
+ // tells if face is front facing
+ std::vector<bool> FaceData;
+ bool AdjacencyDirtyFlag;
+
+ const scene::IMesh* ShadowMesh;
+
+ u32 IndexCount;
+ u32 VertexCount;
+ u32 ShadowVolumesUsed;
+
+ f32 Infinity;
+ bool UseZFailMethod;
+ ESHADOWVOLUME_OPTIMIZATION Optimization;
+ };
+
+} // end namespace scene
+} // end namespace irr
+
+#endif
|