175 lines
4.8 KiB
C++
175 lines
4.8 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "ui/ui.h"
|
|
#include "ui/ui_camera.h"
|
|
#include "ui/ui_sprite.h"
|
|
#include "ui/ui_ace_manager.h"
|
|
#include "ui/ui_scene_script_event.h"
|
|
#include "ui/ui_scene_scripted_object.h"
|
|
#include "ui/ui_item_script_event.h"
|
|
#include "ui/ui_item_scripted_object.h"
|
|
#include "script/script_engine_types.h"
|
|
#include "log/log.h"
|
|
|
|
using namespace GS;
|
|
using namespace GS::S2D;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Scene::SetClock(Core::Clock *c)
|
|
{ clock = c ? c : new Core::Clock; }
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Scene::SetCurrentCamera(Camera *camera)
|
|
{ current_camera = camera ? camera : default_camera.c_ptr(); }
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
Item *Scene::ItemFromName(const char *name, Item *parent) const
|
|
{
|
|
if (parent)
|
|
{
|
|
ListForeachPtr(Item *, i, parent->GetChildren())
|
|
if (i->name == name)
|
|
return i;
|
|
}
|
|
else
|
|
{
|
|
ListForeachPtr(Item *, i, item_list)
|
|
if (i->name == name)
|
|
return i;
|
|
}
|
|
return NULL;
|
|
}
|
|
Item *Scene::ItemFromUid(uint uid) const
|
|
{
|
|
ListForeachPtr(Item *, i, item_list)
|
|
if (i->GetUid() == uid)
|
|
return i;
|
|
return NULL;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
float Scene::GetGlobalFadeEffect() const
|
|
{ return global_fade_color.w; }
|
|
void Scene::SetGlobalFadeEffect(float o)
|
|
{ global_fade_color.w = Types::Clamp(o); }
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Scene::SetupItemComponents(Item *i)
|
|
{
|
|
i->scripted_object = new ItemScriptedObject(i, vm);
|
|
if (vm)
|
|
i->item_event = new ItemScriptEvent;
|
|
}
|
|
void Scene::AddItem(Item *i, bool setup_components)
|
|
{
|
|
i->uid = current_item_uid++;
|
|
|
|
if (setup_components)
|
|
SetupItemComponents(i);
|
|
|
|
g_ui_messenger.BroadcastMessage(UIMsg_AddingItem, this, (void *)i);
|
|
item_list.Add(i);
|
|
g_ui_messenger.BroadcastMessage(UIMsg_ItemAdded, this, (void *)i);
|
|
}
|
|
bool Scene::RemoveItem(Item *i)
|
|
{
|
|
g_ui_messenger.BroadcastMessage(UIMsg_DeletingItem, this, (void *)i);
|
|
|
|
if (lock == i)
|
|
lock = NULL;
|
|
item_list.Remove(i);
|
|
|
|
g_ui_messenger.BroadcastMessage(UIMsg_ItemDeleted, this, (void *)i);
|
|
return true;
|
|
}
|
|
void Scene::DeleteAllItems()
|
|
{
|
|
while (List <Item *> ::Item *i = item_list.GetRoot())
|
|
RemoveItem(i->Object());
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool Scene::ExecCommand(ACE::Command *cmd, float dt)
|
|
{
|
|
float k = dt / cmd->duration_left;
|
|
|
|
switch (cmd->code)
|
|
{
|
|
case ACE_globalfade:
|
|
global_fade_color.w = Types::Clamp(global_fade_color.w + (cmd->parm[0] - global_fade_color.w) * k);
|
|
return true;
|
|
}
|
|
return ACE::Unit::ExecCommand(cmd, dt);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Scene::RenderSetup(Core::ResourceFactories *f)
|
|
{
|
|
ListForeachPtr(Item *, item, item_list)
|
|
item->RenderSetup(f);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Scene::Setup()
|
|
{
|
|
scene_event->OnSetup(this);
|
|
|
|
// Setup items.
|
|
ListForeachPtr(Item *, i, item_list)
|
|
i->Setup();
|
|
}
|
|
void Scene::Reset()
|
|
{
|
|
scene_event->OnReset(this);
|
|
}
|
|
void Scene::Clear()
|
|
{
|
|
scene_event->OnDelete(this);
|
|
|
|
window_skin = NULL;
|
|
global_fade_color.Set(0, 0, 0, 0);
|
|
|
|
item_list.Clear();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
Scene::Scene(Script::IVM *script_vm)
|
|
{
|
|
vm = script_vm;
|
|
lock = NULL;
|
|
|
|
current_item_uid = 0;
|
|
|
|
clock = new Core::Clock;
|
|
|
|
default_camera = new Camera;
|
|
default_camera->resolution.Set(1280, 960);
|
|
|
|
current_camera = default_camera;
|
|
|
|
scene_event = vm ? new SceneScriptEvent : new ISceneEvent;
|
|
scripted_object = new SceneScriptedObject(vm, this);
|
|
|
|
global_fade_color.Set(0, 0, 0, 0);
|
|
}
|
|
Scene::~Scene()
|
|
{
|
|
Clear();
|
|
if (vm)
|
|
vm->InvalidateNativeReference((void *)this);
|
|
}
|
|
//------------------------------------------------------------------------------
|