90 lines
3.0 KiB
C++
90 lines
3.0 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 "core/renderer.h"
|
|
#include "gpu/gpu_triangle_batch.h"
|
|
|
|
using namespace GS;
|
|
using namespace S2D;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
static float ItemCompareDrawOrder(const S2D::Item *c, const S2D::Item *n)
|
|
{ return -(c->GetZOrder() - n->GetZOrder()); }
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Scene::SetRenderMatrices(Renderer &renderer)
|
|
{
|
|
const Vector2 &resolution = current_camera->resolution;
|
|
float k_ar = (renderer.GetOutputAspectRatio() * renderer.GetGlobalAspectRatio()) / (resolution.y / resolution.x);
|
|
|
|
// UI to normalized screen and back.
|
|
ui_to_screen = Matrix3::TranslationMatrix(Vector2(0.5f, 0.5f)) *
|
|
(
|
|
(offset_matrix * Matrix3::ScaleMatrix(Vector2(k_ar / resolution.x, 1.f / resolution.y))) *
|
|
(Matrix3::TranslationMatrix(Vector2(-resolution.x * 0.5f, -resolution.y * 0.5f)) * current_camera->GetInverseMatrix())
|
|
);
|
|
ui_to_screen.Inverse(screen_to_ui);
|
|
|
|
// Render matrices.
|
|
Matrix4 identity(Matrix4::IdentityMatrix());
|
|
renderer.SetViewMatrix(identity, &identity);
|
|
renderer.SetWorldMatrix(identity, &identity);
|
|
|
|
Matrix3 projection(2.f * k_ar / resolution.x, 0, 0, 0, -2.f / resolution.y, 0, -1.f * k_ar, 1.f, 0.0f); // z = 0.0f
|
|
projection = offset_matrix * (projection * current_camera->GetInverseMatrix());
|
|
renderer.SetProjectionMatrix(Matrix4::FromMatrix3(projection));
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Scene::Render(Renderer &renderer, GPU::TriangleBatch *batch)
|
|
{
|
|
// Enforce window positioning.
|
|
item_list.MergeSort(ItemCompareDrawOrder);
|
|
|
|
// Render items.
|
|
SetRenderMatrices(renderer);
|
|
ListForeachPtr(Item *, i, item_list)
|
|
if (i->item_flags.IsSet(Item::Flag_ItemActive))
|
|
switch (i->GetItemType())
|
|
{
|
|
case Item::Type_Sprite:
|
|
case Item::Type_Window:
|
|
((Sprite *)i)->Render(renderer, batch);
|
|
break;
|
|
}
|
|
|
|
if (batch)
|
|
batch->Flush();
|
|
}
|
|
void Scene::RenderGlobalFade(Renderer &renderer)
|
|
{
|
|
if (global_fade_color.w < 0.01f)
|
|
return;
|
|
|
|
renderer.SetProjectionMatrix(Matrix4::IdentityMatrix());
|
|
|
|
// Setup attributes.
|
|
Vector4 vtx_attr[4];
|
|
vtx_attr[0].Set(-1, -1, 1);
|
|
vtx_attr[1].Set(1, -1, 1);
|
|
vtx_attr[2].Set(1, 1, 1);
|
|
vtx_attr[3].Set(-1, 1, 1);
|
|
|
|
Color color_attr[4];
|
|
for (uint n = 0; n < 4; ++n)
|
|
color_attr[n] = global_fade_color;
|
|
|
|
ushort idx[6] = { 2, 1, 0, 3, 2, 0 };
|
|
renderer.DrawTriangle(2, vtx_attr, idx, color_attr, NULL, NULL, Core::Material::Blend_Alpha, Core::Material::Render_NoZTest);
|
|
}
|
|
//------------------------------------------------------------------------------
|