122 lines
3.4 KiB
C++
122 lines
3.4 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "project/project.h"
|
|
#include "scene3d/scene.h"
|
|
#include "ui/ui.h"
|
|
#include "core/renderer.h"
|
|
#include "script/script_engine_types.h"
|
|
#include "script/script_variant.h"
|
|
|
|
using namespace GS::Core;
|
|
using namespace GS::Script;
|
|
|
|
|
|
static float CompareLayerZOrder(const ProjectLayer *c, const ProjectLayer *n) { return c->zorder - n->zorder; }
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Project::Render(Renderer &renderer, RenderFlag render_flag)
|
|
{
|
|
__PROJECT_ACTION_SAFETY_CHECK_RAW
|
|
|
|
bool send_events = render_flag & FlagDisableScript ? false : true;
|
|
|
|
// Sort the layer list.
|
|
layer_list.Sort(CompareLayerZOrder);
|
|
|
|
// OnRender callback.
|
|
if (script_unit->SetupFunctionCall("OnRender"))
|
|
script_unit->DoFunctionCall();
|
|
|
|
// Render the layer display list.
|
|
int active_layer = 0;
|
|
|
|
ListForeachPtr(ProjectLayer *, layer, layer_list)
|
|
if (layer->inst && IsActive(*layer->inst))
|
|
{
|
|
// OnRenderScene callback.
|
|
if (send_events && script_unit->SetupFunctionCall("OnRenderScene"))
|
|
{
|
|
switch (layer->inst->GetType())
|
|
{
|
|
case ProjectSceneInstance::Type_Scene2d:
|
|
script_unit->PushFunctionCallArgument(Script::Variant(layer->inst->instance, typetag_Scene2d));
|
|
break;
|
|
|
|
case ProjectSceneInstance::Type_Scene3d:
|
|
script_unit->PushFunctionCallArgument(Script::Variant(layer->inst->instance, typetag_Scene3d));
|
|
break;
|
|
}
|
|
script_unit->PushFunctionCallArgument(Script::Variant(layer, typetag_ProjectLayer));
|
|
script_unit->DoFunctionCall();
|
|
}
|
|
|
|
// Specialized rendering.
|
|
prohibit_project_action = true;
|
|
|
|
switch (layer->inst->GetType())
|
|
{
|
|
case ProjectSceneInstance::Type_Scene2d:
|
|
{
|
|
GS::S2D::Scene *scene = layer->inst->instance_2d;
|
|
|
|
if (active_layer == 0)
|
|
renderer.Clear(0, 0, 0);
|
|
scene->Render(renderer);
|
|
}
|
|
break;
|
|
|
|
case ProjectSceneInstance::Type_Scene3d:
|
|
{
|
|
GS::S3D::Scene *scene = layer->inst->instance_3d;
|
|
|
|
scene->flags.Raise(S3D::Scene::FlagDebugPhysics, flags.IsSet(ProjectFlagDebugPhysics)); // synchronize scene flag with project one
|
|
scene->Render(renderer);
|
|
scene->RenderUI(renderer);
|
|
}
|
|
break;
|
|
}
|
|
prohibit_project_action = false;
|
|
|
|
++active_layer;
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Project::Update(uint eval_flag)
|
|
{
|
|
__PROJECT_ACTION_SAFETY_CHECK_RAW
|
|
|
|
// OnUpdate callback.
|
|
if (script_unit->SetupFunctionCall("OnUpdate", script_unit->update_callback))
|
|
script_unit->DoFunctionCall();
|
|
|
|
// Evaluate all instantiated scenes.
|
|
prohibit_project_action = true;
|
|
|
|
ListForeachPtr(ProjectSceneInstance *, inst, instance_list)
|
|
if (IsActive(*inst))
|
|
switch (inst->GetType())
|
|
{
|
|
case ProjectSceneInstance::Type_Scene2d:
|
|
if (inst->instance_2d)
|
|
inst->instance_2d->Update();
|
|
break;
|
|
|
|
case ProjectSceneInstance::Type_Scene3d:
|
|
if (inst->instance_3d)
|
|
{
|
|
inst->instance_3d->SetAsScriptGlobalScene();
|
|
inst->instance_3d->Update(eval_flag);
|
|
}
|
|
break;
|
|
}
|
|
|
|
prohibit_project_action = false;
|
|
}
|
|
//------------------------------------------------------------------------------
|