aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/gfx/renderobjectmanager.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2010-07-29 19:53:02 +0000
committerEugene Sandulenko2010-10-12 21:38:20 +0000
commita683a420a9e43705c972b5e74d55e319729e1a81 (patch)
treebde6e4abd417bdfaec120aa951da9a19be36b654 /engines/sword25/gfx/renderobjectmanager.cpp
parent7723d91c957d07205c51be32498d45cd0a78568f (diff)
downloadscummvm-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-xengines/sword25/gfx/renderobjectmanager.cpp163
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;
+}