Scene rendering logic is now betterundefined
| @@ -99,7 +99,8 @@ void BtPhysTest::InitApp() | |||
| vec3(0, 1, 0)); | |||
| m_camera->SetProjection(45.f, .1f, 1000.f, (float)Video::GetSize().x, (float)Video::GetSize().y / (float)Video::GetSize().x); | |||
| #endif | |||
| Scene::PushCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.PushCamera(m_camera); | |||
| m_ready = false; | |||
| @@ -332,8 +333,9 @@ void BtPhysTest::TickGame(float seconds) | |||
| vec3 cam_center(0.f); | |||
| float cam_factor = .0f; | |||
| vec2 screen_min_max[2] = { vec2(FLT_MAX), vec2(-FLT_MAX) }; | |||
| mat4 world_cam = Scene::GetCamera()->GetView(); | |||
| mat4 cam_screen = Scene::GetCamera()->GetProjection(); | |||
| Scene& scene = Scene::GetScene(); | |||
| mat4 world_cam = scene.GetCamera()->GetView(); | |||
| mat4 cam_screen = scene.GetCamera()->GetProjection(); | |||
| m_target_timer -= seconds; | |||
| if (m_target_timer < .0f) | |||
| @@ -619,7 +621,8 @@ void BtPhysTest::TickDraw(float seconds, Scene &scene) | |||
| BtPhysTest::~BtPhysTest() | |||
| { | |||
| Scene::PopCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.PopCamera(m_camera); | |||
| Ticker::Unref(m_light1); | |||
| Ticker::Unref(m_light2); | |||
| @@ -700,8 +703,9 @@ void CatShaderData::SetupDefaultData() | |||
| //----------------------------------------------------------------------------- | |||
| void CatShaderData::SetupShaderDatas(mat4 const &model) | |||
| { | |||
| mat4 proj = Scene::GetCamera()->GetProjection(); | |||
| mat4 view = Scene::GetCamera()->GetView(); | |||
| Scene& scene = Scene::GetScene(); | |||
| mat4 proj = scene.GetCamera()->GetProjection(); | |||
| mat4 view = scene.GetCamera()->GetView(); | |||
| mat4 modelview = view * model; | |||
| mat3 normalmat = transpose(inverse(mat3(view))); | |||
| @@ -173,7 +173,8 @@ void MeshViewer::Start() | |||
| m_camera->SetProjection(40.f, .0001f, 2000.f); | |||
| //m_camera->SetProjection(90.f, .0001f, 2000.f, WIDTH * SCREEN_W, RATIO_HW); | |||
| //m_camera->UseShift(true); | |||
| Scene::PushCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.PushCamera(m_camera); | |||
| #if HAS_INPUT | |||
| InputProfile& ip = m_profile; | |||
| @@ -199,7 +200,8 @@ void MeshViewer::Stop() | |||
| UpdateSceneSetup(true); | |||
| //Destroy core stuff | |||
| if (m_camera) Scene::PopCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| if (m_camera) scene.PopCamera(m_camera); | |||
| m_file_check->UnregisterFile(m_file_status); | |||
| @@ -505,7 +507,8 @@ void MeshViewer::Prepare() | |||
| m_camera->SetView(vec3(0.f, 0.f, 10.f), vec3::zero, vec3::axis_y); | |||
| m_camera->SetProjection(0.f, .0001f, 2000.f, WIDTH * SCREEN_W, RATIO_HW); | |||
| m_camera->UseShift(true); | |||
| Scene::PushCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.PushCamera(m_camera); | |||
| //Lights setup | |||
| m_ssetup = new SceneSetup(); | |||
| @@ -544,7 +547,8 @@ void MeshViewer::Prepare() | |||
| void MeshViewer::Unprepare() | |||
| { | |||
| if (m_camera) Scene::PopCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| if (m_camera) scene.PopCamera(m_camera); | |||
| if (m_ssetup) delete m_ssetup; | |||
| MessageService::Destroy(); | |||
| @@ -62,7 +62,8 @@ public: | |||
| m_camera->SetView(mat4::lookat(vec3(-15.f, 5.f, 0.f), | |||
| vec3(0.f, -1.f, 0.f), | |||
| vec3(0.f, 1.f, 0.f))); | |||
| Scene::PushCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.PushCamera(m_camera); | |||
| /* Add a white directional light */ | |||
| m_light1 = new Light(); | |||
| @@ -83,7 +84,8 @@ public: | |||
| ~EasyMeshTutorial() | |||
| { | |||
| Scene::PopCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.PopCamera(m_camera); | |||
| Ticker::Unref(m_light1); | |||
| Ticker::Unref(m_light2); | |||
| } | |||
| @@ -25,7 +25,8 @@ public: | |||
| m_camera = new Camera(); | |||
| m_camera->SetView(mat4(1.f)); | |||
| m_camera->SetProjection(mat4::ortho(0.f, 640.f, 0.f, 480.f, -100.f, 100.f)); | |||
| Scene::PushCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.PushCamera(m_camera); | |||
| Ticker::Ref(m_camera); | |||
| m_tileset = Tiler::Register("06_sprite.png"); | |||
| @@ -45,7 +46,8 @@ public: | |||
| { | |||
| Tiler::Deregister(m_tileset); | |||
| Scene::PopCamera(m_camera); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.PopCamera(m_camera); | |||
| Ticker::Unref(m_camera); | |||
| } | |||
| @@ -16,31 +16,36 @@ namespace lol | |||
| //Resets draw infos | |||
| void Debug::DrawSetupReset() | |||
| { | |||
| Scene::SetLineTime(); | |||
| Scene::SetLineMask(); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.SetLineTime(); | |||
| scene.SetLineMask(); | |||
| } | |||
| //Sets draw infos | |||
| void Debug::DrawSetupTime(float new_time) | |||
| { | |||
| Scene::SetLineTime(new_time); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.SetLineTime(new_time); | |||
| } | |||
| //-- | |||
| void Debug::DrawSetupMask(int new_mask) | |||
| { | |||
| Scene::SetLineMask(new_mask); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.SetLineMask(new_mask); | |||
| } | |||
| //-- | |||
| void Debug::DrawSetupSegment(float new_segment_size) | |||
| { | |||
| Scene::SetLineSegmentSize(new_segment_size); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.SetLineSegmentSize(new_segment_size); | |||
| } | |||
| //-- | |||
| void Debug::DrawSetupColor(vec4 color) | |||
| { | |||
| Scene::SetLineColor(color); | |||
| Scene& scene = Scene::GetScene(); | |||
| scene.SetLineColor(color); | |||
| } | |||
| //-- | |||
| @@ -63,9 +68,10 @@ vec3 Debug::WorldToScreen(vec3 pos, mat4 view_proj) | |||
| } | |||
| vec3 Debug::WorldToScreen(vec4 pos) | |||
| { | |||
| if (!Scene::GetCamera()) | |||
| Scene& scene = Scene::GetScene(); | |||
| if (!scene.GetCamera()) | |||
| return vec3::zero; | |||
| mat4 const view_proj = Scene::GetCamera()->GetProjection() * Scene::GetCamera()->GetView(); | |||
| mat4 const view_proj = scene.GetCamera()->GetProjection() * scene.GetCamera()->GetView(); | |||
| return Debug::WorldToScreen(pos, view_proj); | |||
| } | |||
| vec3 Debug::WorldToScreen(vec4 pos, mat4 view_proj) | |||
| @@ -79,9 +85,10 @@ vec3 Debug::ScreenToWorld(vec2 pos, float z) | |||
| { return Debug::ScreenToWorld(vec3(pos, z)); } | |||
| vec3 Debug::ScreenToWorld(vec3 pos) | |||
| { | |||
| if (!Scene::GetCamera()) | |||
| Scene& scene = Scene::GetScene(); | |||
| if (!scene.GetCamera()) | |||
| return vec3::zero; | |||
| mat4 const inv_view_proj = inverse(Scene::GetCamera()->GetProjection() * Scene::GetCamera()->GetView()); | |||
| mat4 const inv_view_proj = inverse(scene.GetCamera()->GetProjection() * scene.GetCamera()->GetView()); | |||
| return Debug::ScreenToWorld(pos, inv_view_proj); | |||
| } | |||
| vec3 Debug::ScreenToWorld(vec2 pos, mat4 inv_view_proj, float z) | |||
| @@ -100,12 +107,12 @@ vec3 Debug::ScreenToWorld(vec3 pos, mat4 view, mat4 proj) | |||
| //Draw stuff in World | |||
| //-- LINE: 3D -2D - 3D_to_2D -------------------------------------------------- | |||
| void Debug::DrawLine(vec3 a, vec3 b) { Debug::DrawLine(a, b, Scene::GetLineColor()); } | |||
| void Debug::DrawLine(vec2 a, vec3 b, float az) { Debug::DrawLine(a, b, Scene::GetLineColor(), az); } | |||
| void Debug::DrawLine(vec2 a, vec2 b, float az, float bz) { Debug::DrawLine(a, b, Scene::GetLineColor(), az, bz); } | |||
| void Debug::DrawLine(vec3 a, vec3 b, vec4 color) { Scene::AddLine(a, b, color); } | |||
| void Debug::DrawLine(vec2 a, vec3 b, vec4 color, float az) { Scene::AddLine(vec3(a, az), b, color); } | |||
| void Debug::DrawLine(vec2 a, vec2 b, vec4 color, float az, float bz){ Scene::AddLine(vec3(a, az), vec3(b, bz), color); } | |||
| void Debug::DrawLine(vec3 a, vec3 b) { Scene& scene = Scene::GetScene(); Debug::DrawLine(a, b, scene.GetLineColor()); } | |||
| void Debug::DrawLine(vec2 a, vec3 b, float az) { Scene& scene = Scene::GetScene(); Debug::DrawLine(a, b, scene.GetLineColor(), az); } | |||
| void Debug::DrawLine(vec2 a, vec2 b, float az, float bz) { Scene& scene = Scene::GetScene(); Debug::DrawLine(a, b, scene.GetLineColor(), az, bz); } | |||
| void Debug::DrawLine(vec3 a, vec3 b, vec4 color) { Scene& scene = Scene::GetScene(); scene.AddLine(a, b, color); } | |||
| void Debug::DrawLine(vec2 a, vec3 b, vec4 color, float az) { Scene& scene = Scene::GetScene(); scene.AddLine(vec3(a, az), b, color); } | |||
| void Debug::DrawLine(vec2 a, vec2 b, vec4 color, float az, float bz){ Scene& scene = Scene::GetScene(); scene.AddLine(vec3(a, az), vec3(b, bz), color); } | |||
| //-- GIZMO -------------------------------------------------------------------- | |||
| void Debug::DrawGizmo(vec3 pos, vec3 x, vec3 y, vec3 z, float size) | |||
| @@ -124,7 +131,8 @@ void Debug::DrawGizmo(vec2 pos, vec3 x, vec3 y, vec3 z, float size, float posz) | |||
| //-- GRID --------------------------------------------------------------------- | |||
| void Debug::DrawGrid(vec3 pos, vec3 x, vec3 y, vec3 z, float size, bool draw_3d) | |||
| { | |||
| float seg_sz = Scene::GetLineSegmentSize(); | |||
| Scene& scene = Scene::GetScene(); | |||
| float seg_sz = scene.GetLineSegmentSize(); | |||
| int seg_nb = lol::max((int)(size / seg_sz), 1); | |||
| seg_sz = size / (float)seg_nb; | |||
| @@ -160,9 +168,9 @@ void Debug::DrawGrid(vec3 pos, vec3 x, vec3 y, vec3 z, float size, bool draw_3d) | |||
| void Debug::DrawArrow(vec3 a, vec3 b, vec2 s) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y)); } | |||
| void Debug::DrawArrow(vec2 a, vec3 b, vec2 s, float az) { Debug::DrawArrow(a, b.xy, vec3(s.x, s.y, s.y), az, b.z); } | |||
| void Debug::DrawArrow(vec2 a, vec2 b, vec2 s, float az, float bz) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), az, bz); } | |||
| void Debug::DrawArrow(vec3 a, vec3 b, vec3 s) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), Scene::GetLineColor()); } | |||
| void Debug::DrawArrow(vec2 a, vec3 b, vec3 s, float az) { Debug::DrawArrow(a, b.xy, vec3(s.x, s.y, s.y), Scene::GetLineColor(), az, b.z); } | |||
| void Debug::DrawArrow(vec2 a, vec2 b, vec3 s, float az, float bz) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), Scene::GetLineColor(), az, bz); } | |||
| void Debug::DrawArrow(vec3 a, vec3 b, vec3 s) { Scene& scene = Scene::GetScene(); Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), scene.GetLineColor()); } | |||
| void Debug::DrawArrow(vec2 a, vec3 b, vec3 s, float az) { Scene& scene = Scene::GetScene(); Debug::DrawArrow(a, b.xy, vec3(s.x, s.y, s.y), scene.GetLineColor(), az, b.z); } | |||
| void Debug::DrawArrow(vec2 a, vec2 b, vec3 s, float az, float bz) { Scene& scene = Scene::GetScene(); Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), scene.GetLineColor(), az, bz); } | |||
| void Debug::DrawArrow(vec3 a, vec3 b, vec3 s, vec4 color) | |||
| { | |||
| vec3 z = s.x * normalize(b - a); | |||
| @@ -212,23 +220,23 @@ void Debug::DrawArrow(vec2 a, vec2 b, vec3 s, vec4 color, float az, float bz) | |||
| } | |||
| //-- BOX: 3D -2D - 3D_to_2D --------------------------------------------------- | |||
| void Debug::DrawBox(box3 a) { Debug::DrawBox(a.aa, a.bb, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(box2 a) { Debug::DrawBox(a.aa, a.bb, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(box3 a, vec4 color) { Debug::DrawBox(a.aa, a.bb, color); } | |||
| void Debug::DrawBox(box2 a, vec4 color) { Debug::DrawBox(a.aa, a.bb, color); } | |||
| void Debug::DrawBox(vec3 a, vec3 b) { Debug::DrawBox(a, b, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(vec2 a, vec2 b) { Debug::DrawBox(a, b, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(vec2 a, float s) { Debug::DrawBox(a, s, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(vec3 a, vec3 b, vec4 color) { Debug::DrawBox(a, b, mat4::identity, color); } | |||
| void Debug::DrawBox(vec2 a, vec2 b, vec4 color) { Debug::DrawBox(a, b, mat2::identity, color); } | |||
| void Debug::DrawBox(vec2 a, float s, vec4 color) { Debug::DrawBox(a, s, mat2::identity, color); } | |||
| void Debug::DrawBox(box3 a, mat4 transform) { Debug::DrawBox(a.aa, a.bb, transform, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(box2 a, mat2 transform) { Debug::DrawBox(a.aa, a.bb, transform, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(box3 a, mat4 transform, vec4 color) { Debug::DrawBox(a.aa, a.bb, transform, color); } | |||
| void Debug::DrawBox(box2 a, mat2 transform, vec4 color) { Debug::DrawBox(a.aa, a.bb, transform, color); } | |||
| void Debug::DrawBox(vec3 a, vec3 b, mat4 transform) { Debug::DrawBox(a, b, transform, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(vec2 a, vec2 b, mat2 transform) { Debug::DrawBox(a, b, transform, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(vec2 a, float s, mat2 transform) { Debug::DrawBox(a, s, transform, Scene::GetLineColor()); } | |||
| void Debug::DrawBox(box3 a) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a.aa, a.bb, scene.GetLineColor()); } | |||
| void Debug::DrawBox(box2 a) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a.aa, a.bb, scene.GetLineColor()); } | |||
| void Debug::DrawBox(box3 a, vec4 color) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a.aa, a.bb, color); } | |||
| void Debug::DrawBox(box2 a, vec4 color) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a.aa, a.bb, color); } | |||
| void Debug::DrawBox(vec3 a, vec3 b) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, b, scene.GetLineColor()); } | |||
| void Debug::DrawBox(vec2 a, vec2 b) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, b, scene.GetLineColor()); } | |||
| void Debug::DrawBox(vec2 a, float s) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, s, scene.GetLineColor()); } | |||
| void Debug::DrawBox(vec3 a, vec3 b, vec4 color) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, b, mat4::identity, color); } | |||
| void Debug::DrawBox(vec2 a, vec2 b, vec4 color) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, b, mat2::identity, color); } | |||
| void Debug::DrawBox(vec2 a, float s, vec4 color) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, s, mat2::identity, color); } | |||
| void Debug::DrawBox(box3 a, mat4 transform) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a.aa, a.bb, transform, scene.GetLineColor()); } | |||
| void Debug::DrawBox(box2 a, mat2 transform) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a.aa, a.bb, transform, scene.GetLineColor()); } | |||
| void Debug::DrawBox(box3 a, mat4 transform, vec4 color) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a.aa, a.bb, transform, color); } | |||
| void Debug::DrawBox(box2 a, mat2 transform, vec4 color) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a.aa, a.bb, transform, color); } | |||
| void Debug::DrawBox(vec3 a, vec3 b, mat4 transform) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, b, transform, scene.GetLineColor()); } | |||
| void Debug::DrawBox(vec2 a, vec2 b, mat2 transform) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, b, transform, scene.GetLineColor()); } | |||
| void Debug::DrawBox(vec2 a, float s, mat2 transform) { Scene& scene = Scene::GetScene(); Debug::DrawBox(a, s, transform, scene.GetLineColor()); } | |||
| void Debug::DrawBox(vec3 a, vec3 b, mat4 transform, vec4 color) | |||
| { | |||
| vec4 v[8]; | |||
| @@ -270,11 +278,11 @@ void Debug::DrawBox(vec2 a, float s, mat2 transform, vec4 color) | |||
| } | |||
| //-- CIRCLE ------------------------------------------------------------------- | |||
| void Debug::DrawCircle(vec2 a, float s) { Debug::DrawCircle(a, s * vec2(1.f, g_renderer->GetXYRatio()), Scene::GetLineColor()); } | |||
| void Debug::DrawCircle(vec3 a, vec3 n) { Debug::DrawCircle(a, n, Scene::GetLineColor()); } | |||
| void Debug::DrawCircle(vec2 a, vec2 s) { Debug::DrawCircle(a, s * vec2(1.f, g_renderer->GetXYRatio()), Scene::GetLineColor()); } | |||
| void Debug::DrawCircle(vec3 a, vec3 x, vec3 y) { Debug::DrawCircle(a, x, y, Scene::GetLineColor()); } | |||
| void Debug::DrawCircle(vec2 a, vec2 x, vec2 y) { Debug::DrawCircle(a, x, y, Scene::GetLineColor()); } | |||
| void Debug::DrawCircle(vec2 a, float s) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, s * vec2(1.f, g_renderer->GetXYRatio()), scene.GetLineColor()); } | |||
| void Debug::DrawCircle(vec3 a, vec3 n) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, n, scene.GetLineColor()); } | |||
| void Debug::DrawCircle(vec2 a, vec2 s) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, s * vec2(1.f, g_renderer->GetXYRatio()), scene.GetLineColor()); } | |||
| void Debug::DrawCircle(vec3 a, vec3 x, vec3 y) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, x, y, scene.GetLineColor()); } | |||
| void Debug::DrawCircle(vec2 a, vec2 x, vec2 y) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, x, y, scene.GetLineColor()); } | |||
| void Debug::DrawCircle(vec3 a, vec3 n, vec4 color) | |||
| { | |||
| vec3 x = orthogonal(n); | |||
| @@ -290,8 +298,9 @@ void Debug::DrawCircle(vec2 a, vec2 s, vec4 color) | |||
| //-- | |||
| void Debug::DrawCircle(vec3 a, vec3 x, vec3 y, vec4 color) | |||
| { | |||
| Scene& scene = Scene::GetScene(); | |||
| float size = F_PI * 2.f * lol::max(length(x), length(y)); | |||
| int segment_nb = lol::max(1, (int)((size * .25f) / Scene::GetLineSegmentSize())); | |||
| int segment_nb = lol::max(1, (int)((size * .25f) / scene.GetLineSegmentSize())); | |||
| for (int i = 0; i < segment_nb; i++) | |||
| { | |||
| float a0 = (((float)i) / (float)segment_nb) * F_PI_2; | |||
| @@ -308,8 +317,9 @@ void Debug::DrawCircle(vec3 a, vec3 x, vec3 y, vec4 color) | |||
| //-- | |||
| void Debug::DrawCircle(vec2 a, vec2 x, vec2 y, vec4 color) | |||
| { | |||
| Scene& scene = Scene::GetScene(); | |||
| float size = F_PI * 2.f * lol::max(length(x), length(y)); | |||
| int segment_nb = lol::max(1, (int)((size * .25f) / Scene::GetLineSegmentSize())); | |||
| int segment_nb = lol::max(1, (int)((size * .25f) / scene.GetLineSegmentSize())); | |||
| for (int i = 0; i < segment_nb; i++) | |||
| { | |||
| float a0 = (((float)i) / (float)segment_nb) * F_PI_2; | |||
| @@ -325,9 +335,9 @@ void Debug::DrawCircle(vec2 a, vec2 x, vec2 y, vec4 color) | |||
| } | |||
| //-- SPHERE ------------------------------------------------------------------- | |||
| void Debug::DrawSphere(vec3 a, float s) { Debug::DrawSphere(a, s, Scene::GetLineColor()); } | |||
| void Debug::DrawSphere(vec3 a, float s) { Scene& scene = Scene::GetScene(); Debug::DrawSphere(a, s, scene.GetLineColor()); } | |||
| void Debug::DrawSphere(vec3 a, float s, vec4 color) { Debug::DrawSphere(a, vec3::axis_x * s, vec3::axis_y * s, vec3::axis_z * s, color); } | |||
| void Debug::DrawSphere(vec3 a, vec3 x, vec3 y, vec3 z) { Debug::DrawSphere(a, x, y, z, Scene::GetLineColor()); } | |||
| void Debug::DrawSphere(vec3 a, vec3 x, vec3 y, vec3 z) { Scene& scene = Scene::GetScene(); Debug::DrawSphere(a, x, y, z, scene.GetLineColor()); } | |||
| void Debug::DrawSphere(vec3 a, vec3 x, vec3 y, vec3 z, vec4 color) | |||
| { | |||
| Debug::DrawCircle(a, x, y, color); | |||
| @@ -342,8 +352,8 @@ void Debug::DrawSphere(vec3 a, vec3 x, vec3 y, vec3 z, vec4 color) | |||
| } | |||
| //-- CAPSULE ------------------------------------------------------------------ | |||
| void Debug::DrawCapsule(vec3 a, float s, vec3 h) { Debug::DrawCapsule(a, s, h, Scene::GetLineColor()); } | |||
| void Debug::DrawCapsule(vec3 a, vec3 x, vec3 y, vec3 z, vec3 h) { Debug::DrawCapsule(a, x, y, z, h, Scene::GetLineColor()); } | |||
| void Debug::DrawCapsule(vec3 a, float s, vec3 h) { Scene& scene = Scene::GetScene(); Debug::DrawCapsule(a, s, h, scene.GetLineColor()); } | |||
| void Debug::DrawCapsule(vec3 a, vec3 x, vec3 y, vec3 z, vec3 h) { Scene& scene = Scene::GetScene(); Debug::DrawCapsule(a, x, y, z, h, scene.GetLineColor()); } | |||
| void Debug::DrawCapsule(vec3 a, float s, vec3 h, vec4 color) | |||
| { | |||
| vec3 x = orthonormal(h) * s; | |||
| @@ -353,8 +363,9 @@ void Debug::DrawCapsule(vec3 a, float s, vec3 h, vec4 color) | |||
| //-- | |||
| void Debug::DrawCapsule(vec3 a, vec3 x, vec3 y, vec3 z, vec3 h, vec4 color) | |||
| { | |||
| Scene& scene = Scene::GetScene(); | |||
| float size = F_PI * 2.f * lol::max(length(x), length(y)); | |||
| int segment_nb = lol::max(1, (int)((size * .25f) / Scene::GetLineSegmentSize())); | |||
| int segment_nb = lol::max(1, (int)((size * .25f) / scene.GetLineSegmentSize())); | |||
| for (int i = -1; i < 2; i += 2) | |||
| { | |||
| vec3 b = a + h * .5f * (float)i; | |||
| @@ -378,8 +389,8 @@ void Debug::DrawCapsule(vec3 a, vec3 x, vec3 y, vec3 z, vec3 h, vec4 color) | |||
| } | |||
| //-- VIEW PROJ ---------------------------------------------------------------- | |||
| void Debug::DrawViewProj(mat4 view, mat4 proj) { Debug::DrawViewProj(view, proj, Scene::GetLineColor()); } | |||
| void Debug::DrawViewProj(mat4 view_proj) { Debug::DrawViewProj(view_proj, Scene::GetLineColor()); } | |||
| void Debug::DrawViewProj(mat4 view, mat4 proj) { Scene& scene = Scene::GetScene(); Debug::DrawViewProj(view, proj, scene.GetLineColor()); } | |||
| void Debug::DrawViewProj(mat4 view_proj) { Scene& scene = Scene::GetScene(); Debug::DrawViewProj(view_proj, scene.GetLineColor()); } | |||
| void Debug::DrawViewProj(mat4 view, mat4 proj, vec4 color) | |||
| { | |||
| mat4 const view_proj = proj * view; | |||
| @@ -184,12 +184,13 @@ void DefaultShaderData::SetupDefaultData(bool with_UV) | |||
| //----------------------------------------------------------------------------- | |||
| void DefaultShaderData::SetupShaderDatas(mat4 const &model) | |||
| { | |||
| mat4 proj = Scene::GetCamera()->GetProjection(); | |||
| mat4 view = Scene::GetCamera()->GetView(); | |||
| Scene& scene = Scene::GetScene(); | |||
| mat4 proj = scene.GetCamera()->GetProjection(); | |||
| mat4 view = scene.GetCamera()->GetView(); | |||
| mat4 modelview = view * model; | |||
| mat3 normalmat = transpose(inverse(mat3(modelview))); | |||
| /* FIXME: this should be hidden in the shader */ | |||
| array<Light *> const &lights = Scene::GetLights(); | |||
| array<Light *> const &lights = scene.GetLights(); | |||
| array<vec4> light_data; | |||
| //This is not very nice, but necessary for emscripten WebGL generation. | |||
| float f = 0.f; | |||
| @@ -88,10 +88,10 @@ void Gradient::TickDraw(float seconds, Scene &scene) | |||
| data->shader->Bind(); | |||
| uni_mat = data->shader->GetUniformLocation("u_projection"); | |||
| data->shader->SetUniform(uni_mat, Scene::GetCamera()->GetProjection()); | |||
| uni_mat = data->shader->GetUniformLocation("u_view"); | |||
| data->shader->SetUniform(uni_mat, Scene::GetCamera()->GetView()); | |||
| uni_mat = data->shader->GetUniformLocation("u_model"); | |||
| data->shader->SetUniform(uni_mat, scene.GetCamera()->GetProjection()); | |||
| data->shader->SetUniform(uni_mat, scene.GetCamera()->GetView()); | |||
| data->shader->SetUniform(uni_mat, model_matrix); | |||
| data->shader->Bind(); | |||
| @@ -69,7 +69,7 @@ void Light::TickDraw(float seconds, Scene &scene) | |||
| { | |||
| WorldEntity::TickDraw(seconds, scene); | |||
| Scene::AddLight(this); | |||
| scene.AddLight(this); | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -30,7 +30,7 @@ PrimitiveMesh::~PrimitiveMesh() | |||
| { | |||
| } | |||
| void PrimitiveMesh::Render() const | |||
| void PrimitiveMesh::Render(Scene& scene) | |||
| { | |||
| /* TODO: this should be the main entry for rendering of all | |||
| * primitives found in the scene graph. When we have one. */ | |||
| @@ -53,11 +53,11 @@ void PrimitiveMesh::Render() const | |||
| /* Per-scene matrices */ | |||
| ShaderUniform u_mat; | |||
| u_mat = shader->GetUniformLocation("u_projection"); | |||
| shader->SetUniform(u_mat, Scene::GetCamera()->GetProjection()); | |||
| u_mat = shader->GetUniformLocation("u_view"); | |||
| shader->SetUniform(u_mat, Scene::GetCamera()->GetView()); | |||
| u_mat = shader->GetUniformLocation("u_inv_view"); | |||
| shader->SetUniform(u_mat, inverse(Scene::GetCamera()->GetView())); | |||
| shader->SetUniform(u_mat, scene.GetCamera()->GetProjection()); | |||
| shader->SetUniform(u_mat, scene.GetCamera()->GetView()); | |||
| shader->SetUniform(u_mat, inverse(scene.GetCamera()->GetView())); | |||
| /* Per-object matrices, will be set later */ | |||
| u_model = shader->GetUniformLocation("u_model"); | |||
| @@ -65,7 +65,7 @@ void PrimitiveMesh::Render() const | |||
| u_normalmat = shader->GetUniformLocation("u_normalmat"); | |||
| /* Per-scene environment */ | |||
| array<Light *> const &lights = Scene::GetLights(); | |||
| array<Light *> const &lights = scene.GetLights(); | |||
| array<vec4> light_data; | |||
| /* FIXME: the 4th component of the position can be used for other things */ | |||
| @@ -80,7 +80,7 @@ void PrimitiveMesh::Render() const | |||
| } | |||
| shader->SetUniform(u_model, m_matrix); | |||
| mat4 modelview = Scene::GetCamera()->GetView() * m_matrix; | |||
| mat4 modelview = scene.GetCamera()->GetView() * m_matrix; | |||
| shader->SetUniform(u_modelview, modelview); | |||
| shader->SetUniform(u_normalmat, transpose(inverse(mat3(modelview)))); | |||
| @@ -25,7 +25,7 @@ class PrimitiveMesh : public Primitive | |||
| public: | |||
| PrimitiveMesh(SubMesh *submesh, mat4 const &matrix); | |||
| virtual ~PrimitiveMesh(); | |||
| virtual void Render() const; | |||
| virtual void Render(Scene& scene); | |||
| private: | |||
| SubMesh *m_submesh; | |||
| @@ -253,7 +253,7 @@ void NaClInputData::Tick(float seconds) | |||
| //---- | |||
| void NaClInputData::InitViewportSize() | |||
| { | |||
| if (g_scenes.count()) | |||
| if (Scene::GetCount()) | |||
| { | |||
| m_app = vec2(Video::GetSize()); | |||
| //Dunno if its the good idea. | |||
| @@ -110,7 +110,7 @@ Scene::Scene(ivec2 size) | |||
| data->m_default_cam = new Camera(); | |||
| mat4 proj = mat4::ortho(0.f, (float)size.x, 0.f, (float)size.y, -1000.f, 1000.f); | |||
| data->m_default_cam->SetProjection(proj); | |||
| Scene::PushCamera(this, data->m_default_cam); | |||
| PushCamera(data->m_default_cam); | |||
| data->m_tile_cam = -1; | |||
| data->m_tile_shader = 0; | |||
| @@ -123,16 +123,16 @@ Scene::Scene(ivec2 size) | |||
| data->m_debug_mask = 1; | |||
| SetLineTime(this); | |||
| SetLineMask(this); | |||
| SetLineSegmentSize(this); | |||
| SetLineColor(this); | |||
| SetLineTime(); | |||
| SetLineMask(); | |||
| SetLineSegmentSize(); | |||
| SetLineColor(); | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| Scene::~Scene() | |||
| { | |||
| Scene::PopCamera(this, data->m_default_cam); | |||
| PopCamera(data->m_default_cam); | |||
| /* FIXME: this must be done while the GL context is still active. | |||
| * Change the code architecture to make sure of that. */ | |||
| @@ -146,10 +146,9 @@ Scene::~Scene() | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| Scene* Scene::AddNew(ivec2 size) | |||
| void Scene::AddNew(ivec2 size) | |||
| { | |||
| Scene::g_scenes << new Scene(size); | |||
| return Scene::g_scenes.last(); | |||
| } | |||
| void Scene::DestroyScene(Scene* scene) | |||
| { | |||
| @@ -167,34 +166,20 @@ ptrdiff_t Scene::GetCount() | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| Scene* Scene::GetScene(ptrdiff_t index) | |||
| bool Scene::IsReady(ptrdiff_t index) | |||
| { | |||
| ASSERT(0 <= index && index < g_scenes.count(), "Trying to get a non-existent scene"); | |||
| return g_scenes[index]; | |||
| return 0 <= index && index < g_scenes.count() && !!g_scenes[index]; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| bool Scene::GetScene(Scene*& scene) | |||
| Scene& Scene::GetScene(ptrdiff_t index) | |||
| { | |||
| ASSERT(!!g_scenes.count(), "Trying to access a non-ready scene"); | |||
| return (scene = g_scenes[0]) != nullptr; | |||
| ASSERT(0 <= index && index < g_scenes.count() && !!g_scenes[index], "Trying to get a non-existent scene"); | |||
| return *g_scenes[index]; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| bool Scene::GetSceneData(SceneData*& data) | |||
| { | |||
| ASSERT(!!g_scenes.count(), "Trying to access a non-ready scene"); | |||
| return (data = g_scenes[0]->data) != nullptr; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| bool Scene::IsReady() | |||
| { | |||
| return !!g_scenes[0]; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::Apply(Entity* entity) | |||
| void Scene::Link(Entity* entity) | |||
| { | |||
| entity->m_scene_mask |= data->m_mask_id; | |||
| } | |||
| @@ -206,10 +191,9 @@ bool Scene::IsRelevant(Entity* entity) | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| Camera *Scene::GetCamera(int cam_idx) | |||
| Camera* Scene::GetCamera(int cam_idx) | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| return (0 <= cam_idx && cam_idx < data->m_camera_stack.Count()) ? | |||
| data->m_camera_stack[cam_idx] : | |||
| @@ -217,30 +201,28 @@ Camera *Scene::GetCamera(int cam_idx) | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| int Scene::PushCamera(Scene* scene, Camera *cam) | |||
| int Scene::PushCamera(Camera *cam) | |||
| { | |||
| ASSERT(!!scene, "Trying to access a non-ready scene"); | |||
| ASSERT(!!scene->data, "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| Ticker::Ref(cam); | |||
| scene->data->m_camera_stack.Push(cam); | |||
| return (int)scene->data->m_camera_stack.Count() - 1; | |||
| data->m_camera_stack.Push(cam); | |||
| return (int)data->m_camera_stack.Count() - 1; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::PopCamera(Scene* scene, Camera *cam) | |||
| void Scene::PopCamera(Camera *cam) | |||
| { | |||
| ASSERT(!!scene, "Trying to access a non-ready scene"); | |||
| ASSERT(!!scene->data, "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| /* Parse from the end because that’s probably where we’ll find | |||
| * our camera first. */ | |||
| for (ptrdiff_t i = scene->data->m_camera_stack.Count(); i--;) | |||
| for (ptrdiff_t i = data->m_camera_stack.Count(); i--;) | |||
| { | |||
| if (scene->data->m_camera_stack[i] == cam) | |||
| if (data->m_camera_stack[i] == cam) | |||
| { | |||
| Ticker::Unref(cam); | |||
| scene->data->m_camera_stack.Remove(i); | |||
| data->m_camera_stack.Remove(i); | |||
| return; | |||
| } | |||
| } | |||
| @@ -248,29 +230,10 @@ void Scene::PopCamera(Scene* scene, Camera *cam) | |||
| ASSERT(false, "trying to pop a nonexistent camera from the scene"); | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| int Scene::PushCamera(Camera *cam) | |||
| { | |||
| Scene* scene; | |||
| ASSERT(GetScene(scene), "Trying to access a non-ready scene"); | |||
| return PushCamera(scene, cam); | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::PopCamera(Camera *cam) | |||
| { | |||
| Scene* scene; | |||
| ASSERT(GetScene(scene), "Trying to access a non-ready scene"); | |||
| PopCamera(scene, cam); | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::SetTileCam(int cam_idx) | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| data->m_tile_cam = cam_idx; | |||
| } | |||
| @@ -278,8 +241,7 @@ void Scene::SetTileCam(int cam_idx) | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::Reset() | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| for (int i = 0; i < data->m_tile_bufs.Count(); i++) | |||
| delete data->m_tile_bufs[i]; | |||
| @@ -336,78 +298,42 @@ void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale, float | |||
| data->m_tiles.Push(t); | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::SetLineTime(Scene* scene, float new_time) | |||
| { | |||
| ASSERT(!!scene, "Trying to access a non-ready scene"); | |||
| ASSERT(!!scene->data, "Trying to access a non-ready scene"); | |||
| scene->data->m_new_line_time = new_time; | |||
| } | |||
| void Scene::SetLineMask(Scene* scene, int new_mask) | |||
| { | |||
| ASSERT(!!scene, "Trying to access a non-ready scene"); | |||
| ASSERT(!!scene->data, "Trying to access a non-ready scene"); | |||
| scene->data->m_new_line_mask = new_mask; | |||
| } | |||
| void Scene::SetLineSegmentSize(Scene* scene, float new_segment_size) | |||
| { | |||
| ASSERT(!!scene, "Trying to access a non-ready scene"); | |||
| ASSERT(!!scene->data, "Trying to access a non-ready scene"); | |||
| scene->data->m_new_line_segment_size = new_segment_size; | |||
| } | |||
| void Scene::SetLineColor(Scene* scene, vec4 new_color) | |||
| { | |||
| ASSERT(!!scene, "Trying to access a non-ready scene"); | |||
| ASSERT(!!scene->data, "Trying to access a non-ready scene"); | |||
| scene->data->m_new_line_color = new_color; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::SetLineTime(float new_time) | |||
| { | |||
| Scene* scene; | |||
| ASSERT(GetScene(scene), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| SetLineTime(scene, new_time); | |||
| data->m_new_line_time = new_time; | |||
| } | |||
| void Scene::SetLineMask(int new_mask) | |||
| { | |||
| Scene* scene; | |||
| ASSERT(GetScene(scene), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| SetLineMask(scene, new_mask); | |||
| data->m_new_line_mask = new_mask; | |||
| } | |||
| void Scene::SetLineSegmentSize(float new_segment_size) | |||
| { | |||
| Scene* scene; | |||
| ASSERT(GetScene(scene), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| SetLineSegmentSize(scene, new_segment_size); | |||
| data->m_new_line_segment_size = new_segment_size; | |||
| } | |||
| void Scene::SetLineColor(vec4 new_color) | |||
| { | |||
| Scene* scene; | |||
| ASSERT(GetScene(scene), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| SetLineColor(scene, new_color); | |||
| data->m_new_line_color = new_color; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| float Scene::GetLineSegmentSize() | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| return data->m_new_line_segment_size; | |||
| } | |||
| vec4 Scene::GetLineColor() | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| return data->m_new_line_color; | |||
| } | |||
| @@ -415,18 +341,16 @@ vec4 Scene::GetLineColor() | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::AddLine(vec3 a, vec3 b, vec4 color) | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| data->m_lines.Push(a, b, color, data->m_new_line_time, | |||
| data->m_new_line_mask, false, false); | |||
| data->m_lines.Push(a, b, color, | |||
| data->m_new_line_time, data->m_new_line_mask, false, false); | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::AddLight(Light *l) | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| data->m_lights.Push(l); | |||
| } | |||
| @@ -434,8 +358,7 @@ void Scene::AddLight(Light *l) | |||
| //----------------------------------------------------------------------------- | |||
| array<Light *> const &Scene::GetLights() | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| return data->m_lights; | |||
| } | |||
| @@ -443,23 +366,20 @@ array<Light *> const &Scene::GetLights() | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::RenderPrimitives() | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| /* TODO: this should be the main entry for rendering of all | |||
| * primitives found in the scene graph. When we have one. */ | |||
| for (Primitive* p : data->m_primitives) | |||
| { | |||
| p->Render(); | |||
| p->Render(*this); | |||
| } | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::RenderTiles() // XXX: rename to Blit() | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| RenderContext rc; | |||
| @@ -581,8 +501,7 @@ void Scene::RenderTiles() // XXX: rename to Blit() | |||
| //----------------------------------------------------------------------------- | |||
| void Scene::RenderLines(float seconds) // XXX: rename to Blit() | |||
| { | |||
| SceneData* data; | |||
| ASSERT(GetSceneData(data), "Trying to access a non-ready scene"); | |||
| ASSERT(!!data, "Trying to access a non-ready scene"); | |||
| RenderContext rc; | |||
| @@ -602,7 +521,7 @@ void Scene::RenderLines(float seconds) // XXX: rename to Blit() | |||
| array<vec4, vec4, vec4, vec4> buff; | |||
| buff.Resize(linecount); | |||
| int real_linecount = 0; | |||
| mat4 const inv_view_proj = inverse(Scene::GetCamera()->GetProjection() * Scene::GetCamera()->GetView()); | |||
| mat4 const inv_view_proj = inverse(GetCamera()->GetProjection() * GetCamera()->GetView()); | |||
| for (int i = 0; i < linecount; i++) | |||
| { | |||
| if (data->m_lines[i].m5 & data->m_debug_mask) | |||
| @@ -37,7 +37,7 @@ class Primitive | |||
| public: | |||
| Primitive() { } | |||
| virtual ~Primitive() { } | |||
| virtual void Render() const { } | |||
| virtual void Render(Scene& scene) { } | |||
| private: | |||
| }; | |||
| @@ -66,34 +66,31 @@ private: | |||
| Scene(ivec2 size); | |||
| ~Scene(); | |||
| public: | |||
| static Scene* AddNew(ivec2 size); | |||
| static void AddNew(ivec2 size); | |||
| private: | |||
| //Private because I don't know if we should have it | |||
| static void DestroyScene(Scene* scene); | |||
| private: | |||
| static void DestroyAll(); | |||
| public: | |||
| static ptrdiff_t GetCount(); | |||
| static Scene* GetScene(ptrdiff_t index); | |||
| private: | |||
| static bool GetScene(Scene*& scene); | |||
| static bool GetSceneData(SceneData*& data); | |||
| static bool IsReady(ptrdiff_t index = 0); | |||
| static Scene& GetScene(ptrdiff_t index = 0); | |||
| public: | |||
| static bool IsReady(); | |||
| //TODO: don't like the name | |||
| void Apply(Entity* entity); | |||
| void Link(Entity* entity); | |||
| bool IsRelevant(Entity* entity); | |||
| public: | |||
| static Camera *GetCamera(int cam_idx = -1); | |||
| private: | |||
| static int PushCamera(Scene* scene, Camera *cam); | |||
| static void PopCamera(Scene* scene, Camera *cam); | |||
| public: | |||
| static int PushCamera(Camera *cam); | |||
| static void PopCamera(Camera *cam); | |||
| static void SetTileCam(int cam_idx); | |||
| Camera* GetCamera(int cam_idx = -1); | |||
| int PushCamera(Camera *cam); | |||
| void PopCamera(Camera *cam); | |||
| void SetTileCam(int cam_idx); | |||
| static void Reset(); | |||
| void Reset(); | |||
| /* New scenegraph */ | |||
| void AddPrimitive(Mesh const &mesh, mat4 const &matrix); | |||
| @@ -104,27 +101,22 @@ public: | |||
| * the architecture we want to build */ | |||
| void AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale, float angle); | |||
| private: | |||
| static void SetLineTime(Scene* scene, float new_time = -1.f); | |||
| static void SetLineMask(Scene* scene, int new_mask = 0xFFFFFFFF); | |||
| static void SetLineSegmentSize(Scene* scene, float new_segment_size = 100000.f); | |||
| static void SetLineColor(Scene* scene, vec4 new_color = vec4(1.f)); | |||
| public: | |||
| static void SetLineTime(float new_time = -1.f); | |||
| static void SetLineMask(int new_mask = 0xFFFFFFFF); | |||
| static void SetLineSegmentSize(float new_segment_size = 100000.f); | |||
| static void SetLineColor(vec4 new_color = vec4(1.f)); | |||
| void SetLineTime(float new_time = -1.f); | |||
| void SetLineMask(int new_mask = 0xFFFFFFFF); | |||
| void SetLineSegmentSize(float new_segment_size = 100000.f); | |||
| void SetLineColor(vec4 new_color = vec4(1.f)); | |||
| static float GetLineSegmentSize(); | |||
| static vec4 GetLineColor(); | |||
| static void AddLine(vec3 a, vec3 b, vec4 color); | |||
| float GetLineSegmentSize(); | |||
| vec4 GetLineColor(); | |||
| void AddLine(vec3 a, vec3 b, vec4 color); | |||
| static void AddLight(Light *light); | |||
| static array<Light *> const &GetLights(); | |||
| void AddLight(Light *light); | |||
| array<Light *> const &GetLights(); | |||
| static void RenderPrimitives(); | |||
| static void RenderTiles(); | |||
| static void RenderLines(float seconds); | |||
| void RenderPrimitives(); | |||
| void RenderTiles(); | |||
| void RenderLines(float seconds); | |||
| private: | |||
| SceneData *data; | |||
| @@ -325,7 +325,7 @@ void TickerData::GameThreadTick() | |||
| for (ptrdiff_t i = 0; i < Scene::GetCount(); i++) | |||
| { | |||
| //If entity is concerned by this scene, add it in the list | |||
| if (Scene::GetScene(i)->IsRelevant(e)) | |||
| if (Scene::GetScene(i).IsRelevant(e)) | |||
| removal_count++; | |||
| //Update scene index | |||
| data->m_scenes[e->m_drawgroup][i] -= removal_count; | |||
| @@ -359,7 +359,7 @@ void TickerData::GameThreadTick() | |||
| //If the entity has no mask, default it | |||
| if (e->m_scene_mask == 0) | |||
| { | |||
| Scene::GetScene(0)->Apply(e); | |||
| Scene::GetScene().Link(e); | |||
| } | |||
| data->m_todolist.remove(-1); | |||
| @@ -373,7 +373,7 @@ void TickerData::GameThreadTick() | |||
| for (ptrdiff_t i = 0; i < Scene::GetCount(); i++) | |||
| { | |||
| //If entity is concerned by this scene, add it in the list | |||
| if (Scene::GetScene(i)->IsRelevant(e)) | |||
| if (Scene::GetScene(i).IsRelevant(e)) | |||
| { | |||
| data->m_list[e->m_drawgroup].insert(e, data->m_scenes[e->m_drawgroup][i]); | |||
| added_count++; | |||
| @@ -423,27 +423,23 @@ void TickerData::DrawThreadTick() | |||
| /* Tick objects for the draw loop */ | |||
| for (int g = Entity::DRAWGROUP_BEGIN; g < Entity::DRAWGROUP_END && !data->quit /* Stop as soon as required */; ++g) | |||
| { | |||
| ptrdiff_t scene_idx = 0; | |||
| //Scene::GetScene[scene_idx]->EnableDisplay(); //TODO | |||
| switch (g) | |||
| { | |||
| case Entity::DRAWGROUP_BEGIN: | |||
| Scene::Reset(); | |||
| for (ptrdiff_t i = 0; i < Scene::GetCount(); i++) | |||
| Scene::GetScene(i).Reset(); | |||
| g_renderer->Clear(ClearMask::All); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| ptrdiff_t scene_idx = 0; | |||
| for (int i = 0; i < data->m_list[g].Count() && !data->quit /* Stop as soon as required */; ++i) | |||
| { | |||
| //We're outside of the range of the current scene, on to the next | |||
| if (i >= data->m_scenes[g][scene_idx]) | |||
| { | |||
| //Scene::GetScene[scene_idx]->DisableDisplay(); //TODO | |||
| scene_idx++; | |||
| //Scene::GetScene[scene_idx]->EnableDisplay(); //TODO | |||
| } | |||
| ++scene_idx; | |||
| Entity *e = data->m_list[g][i]; | |||
| @@ -455,7 +451,7 @@ void TickerData::DrawThreadTick() | |||
| e->GetName(), e); | |||
| e->m_tickstate = Entity::STATE_PRETICK_DRAW; | |||
| #endif | |||
| e->TickDraw(data->deltatime, *Scene::GetScene(scene_idx)); | |||
| e->TickDraw(data->deltatime, Scene::GetScene(scene_idx)); | |||
| #if !LOL_BUILD_RELEASE | |||
| if (e->m_tickstate != Entity::STATE_POSTTICK_DRAW) | |||
| Log::Error("entity %s [%p] missed super draw tick\n", | |||
| @@ -465,12 +461,24 @@ void TickerData::DrawThreadTick() | |||
| } | |||
| } | |||
| /* Do this render step */ | |||
| Scene::RenderPrimitives(); | |||
| Scene::RenderTiles(); | |||
| Scene::RenderLines(data->deltatime); | |||
| } | |||
| //Scene::GetScene[scene_idx]->DisableDisplay(); //TODO | |||
| //Do the scene render loop | |||
| for (ptrdiff_t idx = 0; idx < Scene::GetCount(); ++idx) | |||
| { | |||
| Scene& scene = Scene::GetScene(idx); | |||
| /* Enable display */ | |||
| //scene.EnableDisplay(); //TODO | |||
| /* Do the render step */ | |||
| scene.RenderPrimitives(); | |||
| scene.RenderTiles(); | |||
| scene.RenderLines(data->deltatime); | |||
| /* Disable display */ | |||
| //scene.DisableDisplay(); //TODO | |||
| } | |||
| Profiler::Stop(Profiler::STAT_TICK_DRAW); | |||
| } | |||