From bf90df100e120e272c14c7975a22ed01bf3ad215 Mon Sep 17 00:00:00 2001 From: Lizzy Fleckenstein Date: Thu, 13 Apr 2023 08:40:18 +0200 Subject: 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). --- source/Irrlicht/CMeshSceneNode.cpp | 44 +++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'source/Irrlicht/CMeshSceneNode.cpp') diff --git a/source/Irrlicht/CMeshSceneNode.cpp b/source/Irrlicht/CMeshSceneNode.cpp index 1331dda..0bcd850 100644 --- a/source/Irrlicht/CMeshSceneNode.cpp +++ b/source/Irrlicht/CMeshSceneNode.cpp @@ -11,6 +11,11 @@ #include "IAnimatedMesh.h" #include "IMaterialRenderer.h" #include "IFileSystem.h" +#ifdef _IRR_COMPILE_WITH_SHADOW_VOLUME_SCENENODE_ +#include "CShadowVolumeSceneNode.h" +#else +#include "IShadowVolumeSceneNode.h" +#endif // _IRR_COMPILE_WITH_SHADOW_VOLUME_SCENENODE_ namespace irr { @@ -23,7 +28,7 @@ namespace scene CMeshSceneNode::CMeshSceneNode(IMesh* mesh, ISceneNode* parent, ISceneManager* mgr, s32 id, const core::vector3df& position, const core::vector3df& rotation, const core::vector3df& scale) -: IMeshSceneNode(parent, mgr, id, position, rotation, scale), Mesh(0), +: IMeshSceneNode(parent, mgr, id, position, rotation, scale), Mesh(0), Shadow(0), PassCount(0), ReadOnlyMaterials(false) { #ifdef _DEBUG @@ -37,6 +42,8 @@ CMeshSceneNode::CMeshSceneNode(IMesh* mesh, ISceneNode* parent, ISceneManager* m //! destructor CMeshSceneNode::~CMeshSceneNode() { + if (Shadow) + Shadow->drop(); if (Mesh) Mesh->drop(); } @@ -102,6 +109,9 @@ void CMeshSceneNode::render() driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); Box = Mesh->getBoundingBox(); + if (Shadow && PassCount==1) + Shadow->updateShadowVolumes(); + // for debug purposes only: bool renderMeshes = true; @@ -200,6 +210,12 @@ void CMeshSceneNode::render() //! or to remove attached childs. bool CMeshSceneNode::removeChild(ISceneNode* child) { + if (child && Shadow == child) + { + Shadow->drop(); + Shadow = 0; + } + return ISceneNode::removeChild(child); } @@ -256,6 +272,29 @@ void CMeshSceneNode::setMesh(IMesh* mesh) } +//! Creates shadow volume scene node as child of this node +//! and returns a pointer to it. +IShadowVolumeSceneNode* CMeshSceneNode::addShadowVolumeSceneNode( + const IMesh* shadowMesh, s32 id, bool zfailmethod, f32 infinity) +{ +#ifdef _IRR_COMPILE_WITH_SHADOW_VOLUME_SCENENODE_ + if (!SceneManager->getVideoDriver()->queryFeature(video::EVDF_STENCIL_BUFFER)) + return 0; + + if (!shadowMesh) + shadowMesh = Mesh; // if null is given, use the mesh of node + + if (Shadow) + Shadow->drop(); + + Shadow = new CShadowVolumeSceneNode(shadowMesh, this, SceneManager, id, zfailmethod, infinity); + return Shadow; +#else + return 0; +#endif +} + + void CMeshSceneNode::copyMaterials() { Materials.clear(); @@ -306,6 +345,9 @@ ISceneNode* CMeshSceneNode::clone(ISceneNode* newParent, ISceneManager* newManag nb->cloneMembers(this, newManager); nb->ReadOnlyMaterials = ReadOnlyMaterials; nb->Materials = Materials; + nb->Shadow = Shadow; + if ( nb->Shadow ) + nb->Shadow->grab(); if (newParent) nb->drop(); -- cgit v1.2.3