#ifndef OPENMW_COMPONENTS_SCENEUTIL_LIGHTMANAGER_H #define OPENMW_COMPONENTS_SCENEUTIL_LIGHTMANAGER_H #include #include #include namespace SceneUtil { /// LightSource managed by a LightManager. class LightSource : public osg::Node { osg::ref_ptr mLight; // The activation radius float mRadius; public: META_Node(SceneUtil, SceneUtil::LightSource) LightSource(); LightSource(const LightSource& copy, const osg::CopyOp& copyop) : osg::Node(copy, copyop) , mLight(copy.mLight) , mRadius(copy.mRadius) { } float getRadius() const { return mRadius; } void setRadius(float radius) { mRadius = radius; } osg::Light* getLight() { return mLight; } void setLight(osg::Light* light) { mLight = light; } }; /// All light sources must be a child of the LightManager node. The LightManager can be anywhere in the scene graph, /// but would be typically somewhere near the top. class LightManager : public osg::Group { public: META_Node(SceneUtil, SceneUtil::LightManager) LightManager(); LightManager(const LightManager& copy, const osg::CopyOp& copyop); // Called automatically by the UpdateCallback void update(); // Called automatically by the LightSource's UpdateCallback void addLight(LightSource* lightSource, osg::Matrix worldMat); void prepareForCamera(osg::Camera* cam); void decorateGeodes(); struct LightSourceTransform { LightSource* mLightSource; osg::Matrix mWorldMatrix; osg::BoundingSphere mViewBound; }; const std::vector& getLights() const; // Stores indices into the mLights vector typedef std::vector LightList; osg::ref_ptr getLightListStateSet(const LightList& lightList); /// Set the first light index that should be used by this manager, typically the number of directional lights in the scene. void setStartLight(int start); int getStartLight() const; private: // Lights collected from the scene graph. Only valid during the cull traversal. std::vector mLights; bool mLightsInViewSpace; // < Light list hash , StateSet > typedef std::map > LightStateSetMap; LightStateSetMap mStateSetCache; bool mDecorated; int mStartLight; }; } #endif