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