Files
Webcam/include/engine/scene3d/scene_render.cpp

106 lines
2.6 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#include "scene3d/scene.h"
#include "scene3d/mobject.h"
#include "scene3d/memitter.h"
#include "scene3d/mterrain.h"
#include "scene3d/mitem_event_interface.h"
#include "ui/ui.h"
#include "core/renderer.h"
#include "core/camera.h"
using namespace GS;
using namespace GS::S3D;
//------------------------------------------------------------------------------
void Scene::PushRenderable(Renderer &renderer)
{
ScopedSystemProfile(profiler.push_to_render);
{
ScopedSystemProfile(profiler.push_active_list);
ArrayListForeachPtr(MItem *, ci, active_list)
if (Core::Item *b = ci->GetBaseItem())
{
// Check exclusion.
if (b->item_flags.IsSet(ItemFlagInvisible))
continue;
if (ci->mitem_flags.IsSet(MItem::Flag_EditorHidden))
continue;
// Render objects and emitters.
switch (ci->GetItemType())
{
case Type_Emitter:
renderer.PushRenderable((Core::Emitter *)b);
break;
case Type_Terrain:
renderer.PushRenderable((Core::Terrain *)b);
break;
default: break;
}
}
}
// Push culling systems.
{
ScopedSystemProfile(profiler.push_simple_culling);
renderer.PushRenderable(&simple_culling_system);
}
{
ScopedSystemProfile(profiler.push_octree_culling);
renderer.PushRenderable(&octree_culling_system);
}
}
void Scene::Render(Renderer &renderer)
{
renderer.SetEnvironmentInterface(irenderer_environment);
scene_event->OnRender(this);
if (!flags.IsSet(FlagRenderless))
{
PushRenderable(renderer);
renderer.BeginDrawList();
renderer.RenderList();
renderer.EndDrawList();
renderer.DeleteRenderableList();
}
renderer.SetEnvironmentInterface(NULL);
scene_event->OnRenderDone(this);
}
void Scene::RenderUI(Renderer &renderer, GPU::TriangleBatch *batch)
{
if (renderer.ideal_render_system_vr_resolution.x != -1)
{
uint w, h;
renderer.GetOutputWindow()->GetSize(w, h);
renderer.dimensions.Set(w, h);
renderer.SetViewport(fRect(0, 0, w, h));
}
ui->Render(renderer, batch);
scene_event->OnRenderUIDone(this);
ui->RenderGlobalFade(renderer);
if(renderer.ideal_render_system_vr_resolution.x != -1)
{
renderer.dimensions.Set(renderer.ideal_render_system_vr_resolution.x, renderer.ideal_render_system_vr_resolution.y);
renderer.ideal_render_system_vr_resolution.x = -1;
}
}
//------------------------------------------------------------------------------