/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
 *
 * This library is open source and may be redistributed and/or modified under
 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
 * (at your option) any later version.  The full license is in LICENSE file
 * included with this distribution, and on the openscenegraph.org website.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * OpenSceneGraph Public License for more details.
*/

#ifndef OSG_RENDERINFO
#define OSG_RENDERINFO 1

#include <osg/State>
#include <osg/View>
#include <osg/observer_ptr>

namespace osg {

class RenderInfo
{
public:

    RenderInfo():
        _view(0) {}

    RenderInfo(const RenderInfo& rhs):
        _state(rhs._state),
        _view(rhs._view),
        _cameras(rhs._cameras),
        _userData(rhs._userData) {}

    RenderInfo(State* state, View* view):
        _state(state),
        _view(view) {}
        
    RenderInfo& operator = (const RenderInfo& rhs)
    {
        _state = rhs._state;
        _view = rhs._view;
        _cameras = rhs._cameras;
        _userData = rhs._userData;
        return *this;
    }

    unsigned int getContextID() const { return _state.valid() ? _state->getContextID() : 0; }
    
    void setState(State* state) { _state = state; }
    State* getState() { return _state.get(); }
    const State* getState() const { return _state.get(); }
    
    void setView(View* view) { _view = view; }
    View* getView() { return _view.get(); }
    const View* getView() const { return _view.get(); }
    
    void pushCamera(Camera* camera) { _cameras.push_back(camera); }    
    void popCamera() { if (!_cameras.empty()) _cameras.pop_back(); }
    
    Camera* getCurrentCamera() { return _cameras.empty() ? 0 : _cameras.back(); }

    void setUserData(Referenced* userData) { _userData = userData; }
    Referenced* getUserData() { return _userData.get(); }
    const Referenced* getUserData() const { return _userData.get(); }

protected:

    typedef std::vector<Camera*> Cameras;

    ref_ptr<State>          _state;
    observer_ptr<View>      _view;
    Cameras                 _cameras;
    ref_ptr<Referenced>     _userData;
};

}

#endif
