#pragma once //======================================================================== // File: Scene.h - implements the container class for 3D Graphics scenes // // Part of the GameCode4 Application // // GameCode4 is the sample application that encapsulates much of the source code // discussed in "Game Coding Complete - 4th Edition" by Mike McShaffry and David // "Rez" Graham, published by Charles River Media. // ISBN-10: 1133776574 | ISBN-13: 978-1133776574 // // If this source code has found it's way to you, and you think it has helped you // in any way, do the authors a favor and buy a new copy of the book - there are // detailed explanations in it that compliment this code well. Buy a copy at Amazon.com // by clicking here: // http://www.amazon.com/gp/product/1133776574/ref=olp_product_details?ie=UTF8&me=&seller= // // There's a companion web site at http://www.mcshaffry.com/GameCode/ // // The source code is managed and maintained through Google Code: // http://code.google.com/p/gamecode4/ // // (c) Copyright 2012 Michael L. McShaffry and David Graham // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser GPL v3 // as published by the Free Software Foundation. // // This program 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 // http://www.gnu.org/licenses/lgpl-3.0.txt for more details. // // You should have received a copy of the GNU Lesser GPL v3 // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //======================================================================== #include "Geometry.h" #include "SceneNodes.h" #include "../EventManager/Events.h" #include #include // Forward declarations //////////////////////////////////////////////////// // // SceneActorMap Description - Chapter 16, page Y // // An STL map that allows fast lookup of a scene node given an ActorId. // //////////////////////////////////////////////////// typedef std::map > SceneActorMap; //////////////////////////////////////////////////// // // Scene Description - Chapter 16, page 536 // // A heirarchical container of scene nodes, which // are classes that implemente the ISceneNode interface // //////////////////////////////////////////////////// class CameraNode; class SkyNode; class LightNode; class LightManager; class Scene { protected: std::shared_ptr m_Root; std::shared_ptr m_Camera; std::shared_ptr m_Renderer; std::stack m_MatrixStack; SceneActorMap m_ActorMap; LightManager *m_LightManager; public: Scene(std::shared_ptr renderer); virtual ~Scene(); int OnRender(); int OnRestore(); int OnLostDevice(); int OnUpdate(const int deltaMilliseconds); std::shared_ptr FindActor(ActorId id); bool AddChild(ActorId id, std::shared_ptr kid); bool RemoveChild(ActorId id); // event delegates void NewRenderComponentDelegate(IEventDataPtr pEventData); void ModifiedRenderComponentDelegate(IEventDataPtr pEventData); // added post-press! // void DestroyActorDelegate(IEventDataPtr pEventData); // void MoveActorDelegate(IEventDataPtr pEventData); void SetCamera(std::shared_ptr camera) { m_Camera = camera; } const std::shared_ptr GetCamera() const { return m_Camera; } void PushAndSetMatrix(const glm::mat4 &toWorld) { // Note this code carefully!!!!! It is COMPLETELY different // from some DirectX 9 documentation out there.... // Scene::PushAndSetMatrix - Chapter 16, page 541 m_MatrixStack.push(toWorld * m_MatrixStack.top()); // [munnellg] This isn't necessary for OpenGL, but we'll preserve it from teh book // anyway as GCC4 does something similar with this call for DirectX 11 being a noop glm::mat4 mat = m_MatrixStack.top(); m_Renderer->VSetWorldTransform(mat); } void PopMatrix() { m_MatrixStack.pop(); // [munnellg] This isn't necessary for OpenGL, but we'll preserve it from teh book // anyway as GCC4 does something similar with this call for DirectX 11 being a noop glm::mat4 mat = m_MatrixStack.top(); m_Renderer->VSetWorldTransform(mat); } const glm::mat4 GetTopMatrix() { // Scene::GetTopMatrix - Chapter 16, page 541 return m_MatrixStack.top(); } LightManager *GetLightManager() { return m_LightManager; } std::shared_ptr GetRenderer() { return m_Renderer; } };