From: <vo...@us...> - 2008-11-20 09:46:04
|
Revision: 986 http://opde.svn.sourceforge.net/opde/?rev=986&view=rev Author: volca Date: 2008-11-20 09:46:00 +0000 (Thu, 20 Nov 2008) Log Message: ----------- Dynamic lights now have an additional separate list Modified Paths: -------------- trunk/src/scenemanager/DarkBspNode.cpp trunk/src/scenemanager/DarkBspNode.h Modified: trunk/src/scenemanager/DarkBspNode.cpp =================================================================== --- trunk/src/scenemanager/DarkBspNode.cpp 2008-11-20 09:45:15 UTC (rev 985) +++ trunk/src/scenemanager/DarkBspNode.cpp 2008-11-20 09:46:00 UTC (rev 986) @@ -29,6 +29,7 @@ */ #include "DarkBspNode.h" +#include "DarkLight.h" #include <OgreException.h> #include <OgreLogManager.h> @@ -36,22 +37,22 @@ namespace Ogre { //----------------------------------------------------------------------- - BspNode::BspNode(SceneManager* owner, int id, int leafID, bool isLeaf) : - mID(id), - mLeafID(leafID), + BspNode::BspNode(SceneManager* owner, int id, int leafID, bool isLeaf) : + mID(id), + mLeafID(leafID), mFrameNum(0x0FFFF), mViewRect(PortalRect::EMPTY) { - + mOwner = owner; mIsLeaf = isLeaf; mSceneNode = NULL; - + // update the fragment as wellBspNode mCellFragment.fragmentType = SceneQuery::WFT_CUSTOM_GEOMETRY; mCellFragment.geometry = this; - + mInitialized = false; - + mFront = NULL; mBack = NULL; } @@ -61,11 +62,11 @@ mOwner = NULL; mIsLeaf = false; mSceneNode = NULL; - + // update the fragment as wellBspNode mCellFragment.fragmentType = SceneQuery::WFT_CUSTOM_GEOMETRY; mCellFragment.geometry = this; - + mFront = NULL; mBack = NULL; } @@ -108,7 +109,7 @@ return mSplitPlane.getSide(point); } - + //----------------------------------------------------------------------- BspNode* BspNode::getNextNode(const Vector3& point) const { @@ -119,26 +120,26 @@ "BspNode::getNextNode"); Plane::Side sd = getSide(point); - + if (sd == Plane::NEGATIVE_SIDE) { return getBack(); } else { return getFront(); } } - + //----------------------------------------------------------------------- void BspNode::_addMovable(const MovableObject* mov) { mMovables.insert(mov); } - + //----------------------------------------------------------------------- void BspNode::_removeMovable(const MovableObject* mov) { mMovables.erase(mov); } - + //----------------------------------------------------------------------- Real BspNode::getDistance(const Vector3& pos) const { @@ -150,7 +151,7 @@ return mSplitPlane.getDistance(pos); } - + //----------------------------------------------------------------------- std::ostream& operator<< (std::ostream& o, BspNode& n) { @@ -166,115 +167,115 @@ return o; } - + //----------------------------------------------------------------------- SceneNode* BspNode::getSceneNode() { if (!mIsLeaf) throw Exception(Exception::ERR_INVALIDPARAMS, "This method is not valid on a non-leaf node.", "BspNode::getSceneNode"); - + return mSceneNode; } - + //----------------------------------------------------------------------- void BspNode::setSceneNode(SceneNode *node) { if (!mIsLeaf) throw Exception(Exception::ERR_INVALIDPARAMS, "This method is not valid on a non-leaf node.", "BspNode::setSceneNode"); - + mSceneNode = node; } - + //----------------------------------------------------------------------- void BspNode::setIsLeaf(bool isLeaf) { mIsLeaf = isLeaf; } - + //----------------------------------------------------------------------- void BspNode::setSplitPlane(const Plane& splitPlane) { if (mIsLeaf) throw Exception(Exception::ERR_INVALIDPARAMS, "This method only valid on a non-leaf node.", "BspNode::setSplitPlane"); - + mSplitPlane = splitPlane; } - + //----------------------------------------------------------------------- void BspNode::setFrontChild(BspNode* frontChild) { if (mIsLeaf) throw Exception(Exception::ERR_INVALIDPARAMS, "This method is only valid on a non-leaf node.", "BspNode::setFrontChild"); - + mFront = frontChild; } - + //----------------------------------------------------------------------- void BspNode::setBackChild(BspNode* backChild) { if (mIsLeaf) throw Exception(Exception::ERR_INVALIDPARAMS, "This method is only valid on a non-leaf node.", "BspNode::setBackChild"); - + mBack = backChild; } - + //----------------------------------------------------------------------- void BspNode::setOwner(SceneManager *owner) { mOwner = owner; } - + //------------------------------------------------------------------------- void BspNode::attachOutgoingPortal(Portal *portal) { if (!mIsLeaf) throw Exception(Exception::ERR_INVALIDPARAMS, "This method is not valid on a non-leaf node.", "BspNode::attachOutgoingPortal"); - + mDstPortals.insert(portal); } - + //------------------------------------------------------------------------- void BspNode::attachIncommingPortal(Portal *portal) { if (!mIsLeaf) throw Exception(Exception::ERR_INVALIDPARAMS, "This method is not valid on a non-leaf node.", "BspNode::attachIncommingPortal"); - + mSrcPortals.insert(portal); } - + //------------------------------------------------------------------------- void BspNode::detachPortal(Portal* portal) { mSrcPortals.erase(portal); mDstPortals.erase(portal); } - + //------------------------------------------------------------------------- void BspNode::setCellNum(unsigned int cellNum) { if (!mIsLeaf) throw Exception(Exception::ERR_INVALIDPARAMS, "This method is not valid on a non-leaf node.", "BspNode::getSceneNode"); - + mCellNum = cellNum; } - + //------------------------------------------------------------------------- unsigned int BspNode::getCellNum() const { return mCellNum; } - + //------------------------------------------------------------------------- void BspNode::setPlaneList(BspNode::CellPlaneList& planes, BspNode::PlanePortalMap& portalmap) { mPlaneList = planes; mPortalMap = portalmap; } - + //------------------------------------------------------------------------- void BspNode::refreshScreenRect(const Camera* cam, const Matrix4& toScreen, const PortalFrustum& frust) { mInitialized = true; @@ -289,7 +290,7 @@ out_portal->refreshScreenRect(cam, toScreen, frust); } } - + //------------------------------------------------------------------------- void BspNode::refreshScreenRect(const Camera* cam, const Matrix4& toScreen, const Plane& cutp) { mInitialized = true; @@ -304,14 +305,18 @@ out_portal->refreshScreenRect(cam, toScreen, cutp); } } - + //------------------------------------------------------------------------- void BspNode::addAffectingLight(DarkLight* light) { mAffectingLights.insert(light); + + if (light->isDynamic()) + mDynamicLights.insert(light); } - + //------------------------------------------------------------------------- void BspNode::removeAffectingLight(DarkLight* light) { mAffectingLights.erase(light); + mDynamicLights.erase(light); } } Modified: trunk/src/scenemanager/DarkBspNode.h =================================================================== --- trunk/src/scenemanager/DarkBspNode.h 2008-11-20 09:45:15 UTC (rev 985) +++ trunk/src/scenemanager/DarkBspNode.h 2008-11-20 09:46:00 UTC (rev 986) @@ -208,7 +208,10 @@ LightIterator lightsBegin() { return mAffectingLights.begin(); }; LightIterator lightsEnd() { return mAffectingLights.end(); }; + LightIterator dynamicLightsBegin() { return mDynamicLights.begin(); }; + LightIterator dynamicLightsEnd() { return mDynamicLights.end(); }; + protected: /// ID of the BSP row (order) int mID; @@ -246,9 +249,12 @@ IntersectingObjectSet mMovables; - /// lights affecting this cell + /// all lights affecting this cell AffectingLights mAffectingLights; + /// dynamic lights affecting this cell + AffectingLights mDynamicLights; + // ----------- Portal based rendering stuff - leaf only /** A vector of portals leading into this cell */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |