diff options
author | Eugene Sandulenko | 2010-07-29 19:53:02 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2010-10-12 21:38:20 +0000 |
commit | a683a420a9e43705c972b5e74d55e319729e1a81 (patch) | |
tree | bde6e4abd417bdfaec120aa951da9a19be36b654 /engines/sword25/gfx/renderobjectmanager.cpp | |
parent | 7723d91c957d07205c51be32498d45cd0a78568f (diff) | |
download | scummvm-rg350-a683a420a9e43705c972b5e74d55e319729e1a81.tar.gz scummvm-rg350-a683a420a9e43705c972b5e74d55e319729e1a81.tar.bz2 scummvm-rg350-a683a420a9e43705c972b5e74d55e319729e1a81.zip |
SWORD25: Importing original sources
svn-id: r53171
Diffstat (limited to 'engines/sword25/gfx/renderobjectmanager.cpp')
-rwxr-xr-x | engines/sword25/gfx/renderobjectmanager.cpp | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/engines/sword25/gfx/renderobjectmanager.cpp b/engines/sword25/gfx/renderobjectmanager.cpp new file mode 100755 index 0000000000..af9e97afb6 --- /dev/null +++ b/engines/sword25/gfx/renderobjectmanager.cpp @@ -0,0 +1,163 @@ +// ----------------------------------------------------------------------------- +// This file is part of Broken Sword 2.5 +// Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdörfer +// +// Broken Sword 2.5 is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// Broken Sword 2.5 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 +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Broken Sword 2.5; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// Includes +// ----------------------------------------------------------------------------- + +#include "renderobjectmanager.h" + +#include "kernel/kernel.h" +#include "kernel/inputpersistenceblock.h" +#include "kernel/outputpersistenceblock.h" +#include "gfx/graphicengine.h" +#include "gfx/animationtemplateregistry.h" +#include "math/rect.h" +#include "renderobject.h" +#include "timedrenderobject.h" +#include "rootrenderobject.h" + +#define BS_LOG_PREFIX "RENDEROBJECTMANAGER" + +// ----------------------------------------------------------------------------- +// Konstruktion / Desktruktion +// ----------------------------------------------------------------------------- + +BS_RenderObjectManager::BS_RenderObjectManager(int Width, int Height, int FramebufferCount) : + m_FrameStarted(false) +{ + // Wurzel des BS_RenderObject-Baumes erzeugen. + m_RootPtr = new BS_RootRenderObject(this, Width, Height); +} + +// ----------------------------------------------------------------------------- + +BS_RenderObjectManager::~BS_RenderObjectManager() +{ + // Die Wurzel des Baumes löschen, damit werden alle BS_RenderObjects mitgelöscht. + m_RootPtr.Erase(); +} + +// ----------------------------------------------------------------------------- +// Interface +// ----------------------------------------------------------------------------- + +void BS_RenderObjectManager::StartFrame() +{ + m_FrameStarted = true; + + // Verstrichene Zeit bestimmen + int TimeElapsed = BS_Kernel::GetInstance()->GetGfx()->GetLastFrameDurationMicro(); + + // Alle BS_TimedRenderObject Objekte über den Framestart und die verstrichene Zeit in Kenntnis setzen + RenderObjectList::iterator Iter = m_TimedRenderObjects.begin(); + for (; Iter != m_TimedRenderObjects.end(); ++Iter) + (*Iter)->FrameNotification(TimeElapsed); +} + +// ----------------------------------------------------------------------------- + +bool BS_RenderObjectManager::Render() +{ + // Den Objekt-Status des Wurzelobjektes aktualisieren. Dadurch werden rekursiv alle Baumelemente aktualisiert. + // Beim aktualisieren des Objekt-Status werden auch die Update-Rects gefunden, so dass feststeht, was neu gezeichnet + // werden muss. + if (!m_RootPtr.IsValid() || !m_RootPtr->UpdateObjectState()) return false; + + m_FrameStarted = false; + + // Die Render-Methode der Wurzel aufrufen. Dadurch wird das rekursive Rendern der Baumelemente angestoßen. + return m_RootPtr->Render(); +} + +// ----------------------------------------------------------------------------- + +void BS_RenderObjectManager::AttatchTimedRenderObject(BS_RenderObjectPtr<BS_TimedRenderObject> RenderObjectPtr) +{ + m_TimedRenderObjects.push_back(RenderObjectPtr); +} + +// ----------------------------------------------------------------------------- + +void BS_RenderObjectManager::DetatchTimedRenderObject(BS_RenderObjectPtr<BS_TimedRenderObject> RenderObjectPtr) +{ + RenderObjectList::iterator Iter = find(m_TimedRenderObjects.begin(), m_TimedRenderObjects.end(), RenderObjectPtr); + if (Iter != m_TimedRenderObjects.end()) m_TimedRenderObjects.erase(Iter); +} + +// ----------------------------------------------------------------------------- +// Persistenz +// ----------------------------------------------------------------------------- + +bool BS_RenderObjectManager::Persist(BS_OutputPersistenceBlock & Writer) +{ + bool Result = true; + + // Alle Kinder des Wurzelknotens speichern. Dadurch werden alle BS_RenderObjects gespeichert rekursiv gespeichert. + Result &= m_RootPtr->PersistChildren(Writer); + + Writer.Write(m_FrameStarted); + + // Referenzen auf die TimedRenderObjects persistieren. + Writer.Write(m_TimedRenderObjects.size()); + RenderObjectList::const_iterator Iter = m_TimedRenderObjects.begin(); + while (Iter != m_TimedRenderObjects.end()) + { + Writer.Write((*Iter)->GetHandle()); + ++Iter; + } + + // Alle BS_AnimationTemplates persistieren. + Result &= BS_AnimationTemplateRegistry::GetInstance().Persist(Writer); + + return Result; +} + +// ----------------------------------------------------------------------------- + +bool BS_RenderObjectManager::Unpersist(BS_InputPersistenceBlock & Reader) +{ + bool Result = true; + + // Alle Kinder des Wurzelknotens löschen. Damit werden alle BS_RenderObjects gelöscht. + m_RootPtr->DeleteAllChildren(); + + // Alle BS_RenderObjects wieder hestellen. + if (!m_RootPtr->UnpersistChildren(Reader)) return false; + + Reader.Read(m_FrameStarted); + + // Momentan gespeicherte Referenzen auf TimedRenderObjects löschen. + m_TimedRenderObjects.resize(0); + + // Referenzen auf die TimedRenderObjects wieder herstellen. + unsigned int TimedObjectCount; + Reader.Read(TimedObjectCount); + for (unsigned int i = 0; i < TimedObjectCount; ++i) + { + unsigned int Handle; + Reader.Read(Handle); + m_TimedRenderObjects.push_back(Handle); + } + + // Alle BS_AnimationTemplates wieder herstellen. + Result &= BS_AnimationTemplateRegistry::GetInstance().Unpersist(Reader); + + return Result; +} |