mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 08:26:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			179 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "viewdata.hpp"
 | 
						|
 | 
						|
namespace Terrain
 | 
						|
{
 | 
						|
 | 
						|
ViewData::ViewData()
 | 
						|
    : mNumEntries(0)
 | 
						|
    , mFrameLastUsed(0)
 | 
						|
    , mChanged(false)
 | 
						|
    , mHasEyePoint(false)
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
ViewData::~ViewData()
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
void ViewData::add(QuadTreeNode *node, bool visible)
 | 
						|
{
 | 
						|
    unsigned int index = mNumEntries++;
 | 
						|
 | 
						|
    if (index+1 > mEntries.size())
 | 
						|
        mEntries.resize(index+1);
 | 
						|
 | 
						|
    Entry& entry = mEntries[index];
 | 
						|
    if (entry.set(node, visible))
 | 
						|
        mChanged = true;
 | 
						|
}
 | 
						|
 | 
						|
unsigned int ViewData::getNumEntries() const
 | 
						|
{
 | 
						|
    return mNumEntries;
 | 
						|
}
 | 
						|
 | 
						|
ViewData::Entry &ViewData::getEntry(unsigned int i)
 | 
						|
{
 | 
						|
    return mEntries[i];
 | 
						|
}
 | 
						|
 | 
						|
bool ViewData::hasChanged() const
 | 
						|
{
 | 
						|
    return mChanged;
 | 
						|
}
 | 
						|
 | 
						|
bool ViewData::hasEyePoint() const
 | 
						|
{
 | 
						|
    return mHasEyePoint;
 | 
						|
}
 | 
						|
 | 
						|
void ViewData::setEyePoint(const osg::Vec3f &eye)
 | 
						|
{
 | 
						|
    mEyePoint = eye;
 | 
						|
    mHasEyePoint = true;
 | 
						|
}
 | 
						|
 | 
						|
const osg::Vec3f& ViewData::getEyePoint() const
 | 
						|
{
 | 
						|
    return mEyePoint;
 | 
						|
}
 | 
						|
 | 
						|
void ViewData::reset(unsigned int frame)
 | 
						|
{
 | 
						|
    // clear any unused entries
 | 
						|
    for (unsigned int i=mNumEntries; i<mEntries.size(); ++i)
 | 
						|
        mEntries[i].set(NULL, false);
 | 
						|
 | 
						|
    // reset index for next frame
 | 
						|
    mNumEntries = 0;
 | 
						|
    mChanged = false;
 | 
						|
 | 
						|
    mFrameLastUsed = frame;
 | 
						|
}
 | 
						|
 | 
						|
void ViewData::clear()
 | 
						|
{
 | 
						|
    for (unsigned int i=0; i<mEntries.size(); ++i)
 | 
						|
        mEntries[i].set(NULL, false);
 | 
						|
    mNumEntries = 0;
 | 
						|
    mFrameLastUsed = 0;
 | 
						|
    mChanged = false;
 | 
						|
}
 | 
						|
 | 
						|
bool ViewData::contains(QuadTreeNode *node)
 | 
						|
{
 | 
						|
    for (unsigned int i=0; i<mNumEntries; ++i)
 | 
						|
        if (mEntries[i].mNode == node)
 | 
						|
            return true;
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
ViewData::Entry::Entry()
 | 
						|
    : mNode(NULL)
 | 
						|
    , mVisible(true)
 | 
						|
    , mLodFlags(0)
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
bool ViewData::Entry::set(QuadTreeNode *node, bool visible)
 | 
						|
{
 | 
						|
    mVisible = visible;
 | 
						|
    if (node == mNode)
 | 
						|
        return false;
 | 
						|
    else
 | 
						|
    {
 | 
						|
        mNode = node;
 | 
						|
        // clear cached data
 | 
						|
        mRenderingNode = NULL;
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
ViewData *ViewDataMap::getViewData(osg::Object *viewer)
 | 
						|
{
 | 
						|
    Map::const_iterator found = mViews.find(viewer);
 | 
						|
    if (found == mViews.end())
 | 
						|
    {
 | 
						|
        ViewData* vd = createOrReuseView();
 | 
						|
        vd->setViewer(viewer);
 | 
						|
        mViews[viewer] = vd;
 | 
						|
        return vd;
 | 
						|
    }
 | 
						|
    else
 | 
						|
        return found->second;
 | 
						|
}
 | 
						|
 | 
						|
ViewData *ViewDataMap::createOrReuseView()
 | 
						|
{
 | 
						|
    if (mUnusedViews.size())
 | 
						|
    {
 | 
						|
        ViewData* vd = mUnusedViews.front();
 | 
						|
        mUnusedViews.pop_front();
 | 
						|
        return vd;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        mViewVector.push_back(ViewData());
 | 
						|
        return &mViewVector.back();
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void ViewDataMap::clearUnusedViews(unsigned int frame)
 | 
						|
{
 | 
						|
    for (Map::iterator it = mViews.begin(); it != mViews.end(); )
 | 
						|
    {
 | 
						|
        ViewData* vd = it->second;
 | 
						|
        if (vd->getFrameLastUsed() + 2 < frame)
 | 
						|
        {
 | 
						|
            vd->setViewer(NULL);
 | 
						|
            vd->clear();
 | 
						|
            mUnusedViews.push_back(vd);
 | 
						|
            mViews.erase(it++);
 | 
						|
        }
 | 
						|
        else
 | 
						|
            ++it;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void ViewDataMap::clear()
 | 
						|
{
 | 
						|
    mViews.clear();
 | 
						|
    mUnusedViews.clear();
 | 
						|
    mViewVector.clear();
 | 
						|
}
 | 
						|
 | 
						|
void ViewDataMap::setDefaultViewer(osg::Object *viewer)
 | 
						|
{
 | 
						|
    mDefaultViewer = viewer;
 | 
						|
}
 | 
						|
 | 
						|
ViewData* ViewDataMap::getDefaultView()
 | 
						|
{
 | 
						|
    return getViewData(mDefaultViewer);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
}
 |