| @@ -19,7 +19,7 @@ namespace lol | |||
| void Debug::DrawLine(vec3 a, vec3 b, vec4 color) | |||
| { | |||
| Scene::GetDefault()->AddLine(a, b, color); | |||
| g_scene->AddLine(a, b, color); | |||
| } | |||
| void Debug::DrawBox(vec3 a, vec3 b, vec4 color) | |||
| @@ -36,9 +36,9 @@ void Debug::DrawBox(vec3 a, vec3 b, vec4 color) | |||
| { | |||
| int j = ((i & 1) << 1) | ((i >> 1) ^ 1); | |||
| Scene::GetDefault()->AddLine(v[i], v[i + 4], color); | |||
| Scene::GetDefault()->AddLine(v[i], v[j], color); | |||
| Scene::GetDefault()->AddLine(v[i + 4], v[j + 4], color); | |||
| g_scene->AddLine(v[i], v[i + 4], color); | |||
| g_scene->AddLine(v[i], v[j], color); | |||
| g_scene->AddLine(v[i + 4], v[j + 4], color); | |||
| } | |||
| } | |||
| @@ -133,15 +133,15 @@ void DefaultShaderData::SetupDefaultData(bool with_UV) | |||
| //----------------------------------------------------------------------------- | |||
| void DefaultShaderData::SetupShaderDatas(mat4 const &model) | |||
| { | |||
| mat4 proj = Scene::GetDefault()->GetCamera()->GetProjection(); | |||
| mat4 view = Scene::GetDefault()->GetCamera()->GetView(); | |||
| mat4 proj = g_scene->GetCamera()->GetProjection(); | |||
| mat4 view = g_scene->GetCamera()->GetView(); | |||
| mat4 modelview = view * model; | |||
| mat3 normalmat = transpose(inverse(mat3(modelview))); | |||
| /* FIXME: this should be hidden in the shader */ | |||
| /* FIXME: the 4th component of the position can be used for other things */ | |||
| /* FIXME: GetUniform("blabla") is costly */ | |||
| Array<Light *> const lights = Scene::GetDefault()->GetLights(); | |||
| Array<Light *> const lights = g_scene->GetLights(); | |||
| Array<vec4> light_data; | |||
| for (int i = 0; i < lights.Count(); ++i) | |||
| light_data << lights[i]->GetPosition() << lights[i]->GetColor(); | |||
| @@ -73,8 +73,8 @@ void Emitter::TickDraw(float seconds) | |||
| Entity::TickDraw(seconds); | |||
| for (int i = 0; i < data->nparticles; i++) | |||
| Scene::GetDefault()->AddTile(data->tileset, data->particles[i], | |||
| data->positions[i], 0, vec2(1.0f)); | |||
| g_scene->AddTile(data->tileset, data->particles[i], | |||
| data->positions[i], 0, vec2(1.0f)); | |||
| } | |||
| void Emitter::AddParticle(int id, vec3 pos, vec3 vel) | |||
| @@ -69,14 +69,12 @@ char const *Font::GetName() | |||
| void Font::Print(vec3 pos, char const *str, vec2 scale) | |||
| { | |||
| Scene *scene = Scene::GetDefault(); | |||
| while (*str) | |||
| { | |||
| uint32_t ch = (uint8_t)*str++; | |||
| if (ch != ' ') | |||
| scene->AddTile(data->tileset, ch & 255, pos, 0, scale); | |||
| g_scene->AddTile(data->tileset, ch & 255, pos, 0, scale); | |||
| pos.x += data->size.x * scale.x; | |||
| } | |||
| @@ -52,8 +52,6 @@ class RenderContextData | |||
| friend class RenderContext; | |||
| private: | |||
| Scene *m_scene; | |||
| TrackedState<ibox2> m_viewport; | |||
| TrackedState<vec4> m_clear_color; | |||
| TrackedState<float> m_clear_depth; | |||
| @@ -71,7 +69,6 @@ private: | |||
| RenderContext::RenderContext() | |||
| : m_data(new RenderContextData()) | |||
| { | |||
| m_data->m_scene = Scene::GetDefault(); | |||
| } | |||
| RenderContext::~RenderContext() | |||
| @@ -44,11 +44,13 @@ namespace lol | |||
| /* | |||
| * The global g_renderer object, initialised by Video::Init | |||
| */ | |||
| Renderer *g_renderer; | |||
| Renderer *g_renderer = nullptr; | |||
| /* | |||
| * Private RendererData class | |||
| */ | |||
| class RendererData | |||
| { | |||
| friend class Renderer; | |||
| @@ -94,9 +94,9 @@ void Gradient::TickDraw(float seconds) | |||
| data->shader->Bind(); | |||
| uni_mat = data->shader->GetUniformLocation("proj_matrix"); | |||
| data->shader->SetUniform(uni_mat, Scene::GetDefault()->GetCamera()->GetProjection()); | |||
| data->shader->SetUniform(uni_mat, g_scene->GetCamera()->GetProjection()); | |||
| uni_mat = data->shader->GetUniformLocation("view_matrix"); | |||
| data->shader->SetUniform(uni_mat, Scene::GetDefault()->GetCamera()->GetView()); | |||
| data->shader->SetUniform(uni_mat, g_scene->GetCamera()->GetView()); | |||
| uni_mat = data->shader->GetUniformLocation("model_matrix"); | |||
| data->shader->SetUniform(uni_mat, model_matrix); | |||
| @@ -51,15 +51,14 @@ void Layer::Render(int /* x */, int /* y */, int /* z */) | |||
| if (error && !(error = 0)) | |||
| Log::Error("FIXME: Layer::Render no longer works\n"); | |||
| #if 0 | |||
| Scene *scene = Scene::GetDefault(); | |||
| for (int j = 0; j < height; j++) | |||
| for (int i = 0; i < width; i++) | |||
| if (data[j * width + i]) | |||
| scene->AddTile(data[j * width + i], | |||
| vec3(x + i * 32, | |||
| y + j * 32 - altitude, | |||
| altitude + z), | |||
| orientation); | |||
| g_scene->AddTile(data[j * width + i], | |||
| vec3(x + i * 32, | |||
| y + j * 32 - altitude, | |||
| altitude + z), | |||
| orientation); | |||
| #endif | |||
| } | |||
| @@ -64,7 +64,7 @@ void Light::TickDraw(float seconds) | |||
| { | |||
| WorldEntity::TickDraw(seconds); | |||
| Scene::GetDefault()->AddLight(this); | |||
| g_scene->AddLight(this); | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -28,6 +28,16 @@ LOLFX_RESOURCE_DECLARE(line); | |||
| namespace lol | |||
| { | |||
| /* | |||
| * The global g_scene object, initialised by Video::Init | |||
| */ | |||
| Scene *g_scene = nullptr; | |||
| /* | |||
| * A quick and dirty Tile structure for 2D blits | |||
| */ | |||
| struct Tile | |||
| { | |||
| TileSet *tileset; | |||
| @@ -71,23 +81,18 @@ private: | |||
| Camera *m_default_cam; | |||
| Array<Camera *> m_camera_stack; | |||
| static Scene *scene; | |||
| }; | |||
| Scene *SceneData::scene = nullptr; | |||
| /* | |||
| * Public Scene class | |||
| */ | |||
| Scene::Scene() | |||
| Scene::Scene(ivec2 size) | |||
| : data(new SceneData()) | |||
| { | |||
| /* Create a default orthographic camera, in case the user doesn’t. */ | |||
| data->m_default_cam = new Camera(); | |||
| mat4 proj = mat4::ortho(0, Video::GetSize().x, 0, Video::GetSize().y, | |||
| -1000.f, 1000.f); | |||
| mat4 proj = mat4::ortho(0, size.x, 0, size.y, -1000.f, 1000.f); | |||
| data->m_default_cam->SetProjection(proj); | |||
| PushCamera(data->m_default_cam); | |||
| @@ -114,13 +119,6 @@ Scene::~Scene() | |||
| delete data; | |||
| } | |||
| Scene *Scene::GetDefault() | |||
| { | |||
| if (!SceneData::scene) | |||
| SceneData::scene = new Scene(); | |||
| return SceneData::scene; | |||
| } | |||
| void Scene::PushCamera(Camera *cam) | |||
| { | |||
| Ticker::Ref(cam); | |||
| @@ -29,12 +29,13 @@ class SceneData; | |||
| class Scene | |||
| { | |||
| public: | |||
| Scene(); | |||
| ~Scene(); | |||
| friend class Video; | |||
| static Scene *GetDefault(); | |||
| private: | |||
| Scene(ivec2 size); | |||
| ~Scene(); | |||
| public: | |||
| Camera *GetCamera(); | |||
| void PushCamera(Camera *cam); | |||
| void PopCamera(Camera *cam); | |||
| @@ -54,6 +55,8 @@ private: | |||
| SceneData *data; | |||
| }; | |||
| extern Scene *g_scene; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_SCENE_H__ | |||
| @@ -50,8 +50,7 @@ void Sprite::TickDraw(float seconds) | |||
| { | |||
| Entity::TickDraw(seconds); | |||
| Scene::GetDefault()->AddTile(data->tileset, data->id, m_position, | |||
| 0, vec2(1.0f)); | |||
| g_scene->AddTile(data->tileset, data->id, m_position, 0, vec2(1.0f)); | |||
| } | |||
| Sprite::~Sprite() | |||
| @@ -386,7 +386,7 @@ void TickerData::DrawThreadTick() | |||
| switch (i) | |||
| { | |||
| case Entity::DRAWGROUP_BEGIN: | |||
| Scene::GetDefault()->Reset(); | |||
| g_scene->Reset(); | |||
| g_renderer->Clear(ClearMask::All); | |||
| break; | |||
| default: | |||
| @@ -412,7 +412,7 @@ void TickerData::DrawThreadTick() | |||
| } | |||
| /* Do this render step */ | |||
| Scene::GetDefault()->Render(); | |||
| g_scene->Render(); | |||
| } | |||
| Profiler::Stop(Profiler::STAT_TICK_DRAW); | |||
| @@ -51,6 +51,7 @@ DebugRenderMode VideoData::render_mode = DebugRenderMode::Default; | |||
| void Video::Setup(ivec2 size) | |||
| { | |||
| g_renderer = new Renderer(size); | |||
| g_scene = new Scene(size); | |||
| /* Initialise reasonable scene default properties */ | |||
| SetDebugRenderMode(DebugRenderMode::Default); | |||
| @@ -114,6 +115,9 @@ DebugRenderMode Video::GetDebugRenderMode() | |||
| void Video::Destroy() | |||
| { | |||
| delete g_scene; | |||
| g_scene = nullptr; | |||
| delete g_renderer; | |||
| g_renderer = nullptr; | |||
| } | |||
| @@ -56,7 +56,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||
| vec3(0.f, 0.f, 0.f), | |||
| vec3(0, 1, 0)); | |||
| m_camera->SetProjection(mat4::perspective(45.f, 1280.f, 960.f, .1f, 1000.f)); | |||
| Scene::GetDefault()->PushCamera(m_camera); | |||
| g_scene->PushCamera(m_camera); | |||
| m_ready = false; | |||
| @@ -421,7 +421,7 @@ void BtPhysTest::TickDraw(float seconds) | |||
| BtPhysTest::~BtPhysTest() | |||
| { | |||
| Scene::GetDefault()->PopCamera(m_camera); | |||
| g_scene->PopCamera(m_camera); | |||
| Ticker::Unref(m_light1); | |||
| Ticker::Unref(m_light2); | |||
| @@ -61,9 +61,9 @@ public: | |||
| void SetFov(float new_fov=60.0f, vec2 video_size = vec2(Video::GetSize())) | |||
| { | |||
| if (new_fov > MIN_FOV) | |||
| Scene::GetDefault()->GetCamera()->SetProjection(mat4::perspective(new_fov, video_size.x, video_size.y, .1f, 1000.f)); | |||
| g_scene->GetCamera()->SetProjection(mat4::perspective(new_fov, video_size.x, video_size.y, .1f, 1000.f)); | |||
| else | |||
| Scene::GetDefault()->GetCamera()->SetProjection(mat4::ortho(video_size.x, video_size.y, .1f, 1000.f)); | |||
| g_scene->GetCamera()->SetProjection(mat4::ortho(video_size.x, video_size.y, .1f, 1000.f)); | |||
| } | |||
| MeshViewer(char const *file_name = "data/mesh-buffer.txt") | |||
| @@ -107,7 +107,7 @@ public: | |||
| m_camera->SetView(vec3(0.f, 0.f, 10.f), | |||
| vec3(0.f, 0.f, 0.f), | |||
| vec3(0.f, 1.f, 0.f)); | |||
| Scene::GetDefault()->PushCamera(m_camera); | |||
| g_scene->PushCamera(m_camera); | |||
| //Lights setup | |||
| m_lights << new Light(); | |||
| @@ -144,7 +144,7 @@ public: | |||
| ~MeshViewer() | |||
| { | |||
| Scene::GetDefault()->PopCamera(m_camera); | |||
| g_scene->PopCamera(m_camera); | |||
| for (int i = 0; i < m_lights.Count(); ++i) | |||
| Ticker::Unref(m_lights[i]); | |||
| } | |||
| @@ -178,8 +178,8 @@ public: | |||
| if (m_meshes[mesh_id].m2) | |||
| break; | |||
| mat4 world_cam = Scene::GetDefault()->GetCamera()->GetView(); | |||
| mat4 cam_screen = Scene::GetDefault()->GetCamera()->GetProjection(); | |||
| mat4 world_cam = g_scene->GetCamera()->GetView(); | |||
| mat4 cam_screen = g_scene->GetCamera()->GetProjection(); | |||
| if (m_meshes.Count() && mesh_id >= 0) | |||
| { | |||
| @@ -250,13 +250,13 @@ public: | |||
| SetFov(m_fov_damp); | |||
| //Move modification | |||
| vec3 campos = Scene::GetDefault()->GetCamera()->GetPosition(); | |||
| vec3 campos = g_scene->GetCamera()->GetPosition(); | |||
| if (m_fov_damp < MIN_FOV) | |||
| Scene::GetDefault()->GetCamera()->SetView(vec3(campos.xy, 10.f), quat(1.f)); | |||
| g_scene->GetCamera()->SetView(vec3(campos.xy, 10.f), quat(1.f)); | |||
| else if (fov_ratio > .0f) | |||
| Scene::GetDefault()->GetCamera()->SetView(vec3(campos.xy, campos.z * fov_ratio * 1.1f), quat(1.f)); | |||
| g_scene->GetCamera()->SetView(vec3(campos.xy, campos.z * fov_ratio * 1.1f), quat(1.f)); | |||
| #else | |||
| Camera* cur_cam = Scene::GetDefault()->GetCamera(); | |||
| Camera* cur_cam = g_scene->GetCamera(); | |||
| vec3 min_max_diff = (cam_min_max[1] - cam_min_max[0]); | |||
| float screen_size = max(max(lol::abs(min_max_diff.x), lol::abs(min_max_diff.y)), | |||
| max( lol::abs(min_max_diff.x), lol::abs(min_max_diff.y))); | |||
| @@ -442,7 +442,7 @@ public: | |||
| g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | |||
| mat4 default_proj = Scene::GetDefault()->GetCamera()->GetProjection(); | |||
| mat4 default_proj = g_scene->GetCamera()->GetProjection(); | |||
| int max_drawn = m_meshes.Count() - m_mesh_shown; | |||
| for (int i = max_drawn; i < m_meshes.Count(); i++) | |||
| m_meshes[i].m4 = vec3(.0f); | |||
| @@ -461,7 +461,7 @@ public: | |||
| } | |||
| m_meshes[i].m4 = damp(m_meshes[i].m4, new_mesh_offset, .35f, seconds); | |||
| Scene::GetDefault()->GetCamera()->SetProjection( | |||
| g_scene->GetCamera()->SetProjection( | |||
| mat4::translate(m_meshes[i].m4) * | |||
| mat4::translate(vec3(m_mesh_screen_offset_damp, .0f)) * | |||
| mat4::scale(vec3(vec2(m_meshes[i].m3), 1.0f)) * | |||
| @@ -475,7 +475,7 @@ public: | |||
| g_renderer->Clear(ClearMask::Depth); | |||
| } | |||
| } | |||
| Scene::GetDefault()->GetCamera()->SetProjection(default_proj); | |||
| g_scene->GetCamera()->SetProjection(default_proj); | |||
| } | |||
| private: | |||
| @@ -51,7 +51,7 @@ 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::GetDefault()->PushCamera(m_camera); | |||
| g_scene->PushCamera(m_camera); | |||
| /* Add a white directional light */ | |||
| m_light1 = new Light(); | |||
| @@ -70,7 +70,7 @@ public: | |||
| ~EasyMeshTutorial() | |||
| { | |||
| Scene::GetDefault()->PopCamera(m_camera); | |||
| g_scene->PopCamera(m_camera); | |||
| Ticker::Unref(m_light1); | |||
| Ticker::Unref(m_light2); | |||
| } | |||
| @@ -26,7 +26,7 @@ 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::GetDefault()->PushCamera(m_camera); | |||
| g_scene->PushCamera(m_camera); | |||
| Ticker::Ref(m_camera); | |||
| m_tileset = Tiler::Register("06_sprite.png"); | |||
| @@ -46,7 +46,7 @@ public: | |||
| { | |||
| Tiler::Deregister(m_tileset); | |||
| Scene::GetDefault()->PopCamera(m_camera); | |||
| g_scene->PopCamera(m_camera); | |||
| Ticker::Unref(m_camera); | |||
| } | |||
| @@ -77,8 +77,8 @@ public: | |||
| { | |||
| int frame = (int)(m_sprites[i].m2 * FRAME_COUNT); | |||
| // m_sprites[i].m1.z = frame; | |||
| Scene::GetDefault()->AddTile(m_tileset, frame, | |||
| (ivec3)m_sprites[i].m1, 0, vec2(2.f)); | |||
| g_scene->AddTile(m_tileset, frame, | |||
| (ivec3)m_sprites[i].m1, 0, vec2(2.f)); | |||
| } | |||
| } | |||