in the scene where we can push and pop cameras.legacy
| @@ -26,111 +26,70 @@ | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| Camera::Camera(vec3 const &position, vec3 const &target, vec3 const &up) | |||||
| : m_target(target), | |||||
| m_up(up) | |||||
| Camera::Camera() | |||||
| { | { | ||||
| m_gamegroup = GAMEGROUP_BEFORE; | m_gamegroup = GAMEGROUP_BEFORE; | ||||
| m_drawgroup = DRAWGROUP_CAMERA; | m_drawgroup = DRAWGROUP_CAMERA; | ||||
| /* Create a default perspective */ | /* Create a default perspective */ | ||||
| SetPerspective(45.f, 800.f, 600.f, -1000.f, 1000.f); | |||||
| SetPosition(position); | |||||
| SetProjection(mat4::perspective(45.f, 800.f, 600.f, -1000.f, 1000.f)); | |||||
| SetView(mat4::lookat(vec3(0.f, 50.f, 50.f), | |||||
| vec3(0.f), | |||||
| vec3(0.f, 1.f, 0.f))); | |||||
| } | } | ||||
| Camera::~Camera() | Camera::~Camera() | ||||
| { | { | ||||
| } | } | ||||
| void Camera::SetPosition(vec3 const &pos) | |||||
| void Camera::SetView(mat4 const &view) | |||||
| { | { | ||||
| m_position = pos; | |||||
| m_view_matrix = view; | |||||
| m_position = inverse(view)[3].xyz; | |||||
| } | } | ||||
| void Camera::SetRotation(quat const &rot) | |||||
| void Camera::SetView(vec3 eye, vec3 target, vec3 up) | |||||
| { | { | ||||
| m_rotation = rot; | |||||
| m_view_matrix = mat4::lookat(eye, target, up); | |||||
| m_position = eye; | |||||
| } | } | ||||
| void Camera::SetOrtho(float width, float height, float near, float far) | |||||
| void Camera::SetView(vec3 pos, quat rot) | |||||
| { | { | ||||
| m_proj_matrix = mat4::ortho(width, height, near, far); | |||||
| } | |||||
| void Camera::SetPerspective(float fov, float width, float height, | |||||
| float near, float far) | |||||
| { | |||||
| m_proj_matrix = mat4::perspective(fov, width, height, near, far); | |||||
| } | |||||
| void Camera::SetTarget(vec3 const &pos) | |||||
| { | |||||
| m_target = pos; | |||||
| m_view_matrix = mat4::lookat(pos, | |||||
| pos + rot.transform(vec3(0.f, 0.f, -1.f)), | |||||
| rot.transform(vec3(0.f, 1.f, 0.f))); | |||||
| m_position = pos; | |||||
| } | } | ||||
| vec3 Camera::GetTarget() | |||||
| { | |||||
| return m_target; | |||||
| } | |||||
| vec3 Camera::GetPosition() | |||||
| void Camera::SetProjection(mat4 const &proj) | |||||
| { | { | ||||
| return m_position; | |||||
| m_proj_matrix = proj; | |||||
| } | } | ||||
| mat4 const &Camera::GetViewMatrix() | |||||
| mat4 Camera::GetView() | |||||
| { | { | ||||
| return m_view_matrix; | return m_view_matrix; | ||||
| } | } | ||||
| mat4 const &Camera::GetProjMatrix() | |||||
| mat4 Camera::GetProjection() | |||||
| { | { | ||||
| return m_proj_matrix; | return m_proj_matrix; | ||||
| } | } | ||||
| void Camera::ForceSceneUpdate() | |||||
| vec3 Camera::GetPosition() | |||||
| { | { | ||||
| Scene::GetDefault()->SetViewMatrix(m_view_matrix); | |||||
| Scene::GetDefault()->SetProjMatrix(m_proj_matrix); | |||||
| return m_position; | |||||
| } | } | ||||
| void Camera::TickGame(float seconds) | void Camera::TickGame(float seconds) | ||||
| { | { | ||||
| WorldEntity::TickGame(seconds); | WorldEntity::TickGame(seconds); | ||||
| #if 0 | |||||
| /* Hackish keyboard support */ | |||||
| float updown = 2.f * (Input::GetButtonState('w') | |||||
| + Input::GetButtonState('z') | |||||
| - Input::GetButtonState('s')); | |||||
| float rightleft = 2.f * (Input::GetButtonState('d') | |||||
| - Input::GetButtonState('q') | |||||
| - Input::GetButtonState('a')); | |||||
| float pgupdown = 2.f * (Input::GetButtonState('r') | |||||
| - Input::GetButtonState('f')); | |||||
| /* Hackish stick support */ | |||||
| static Stick *stick = NULL; | |||||
| if (!stick) | |||||
| stick = Input::TrackStick(); | |||||
| if (stick && stick->GetAxisCount() >= 2) | |||||
| { | |||||
| rightleft += 2.f * stick->GetAxis(0) * std::abs(stick->GetAxis(0)); | |||||
| updown += -2.f * stick->GetAxis(1) * std::abs(stick->GetAxis(1)); | |||||
| } | |||||
| m_position += vec3(rightleft, pgupdown, -updown) * 200.f * seconds; | |||||
| m_target += vec3(rightleft, 0, -updown) * 200.f * seconds; | |||||
| #endif | |||||
| m_view_matrix = mat4::lookat(m_position, m_target, m_up) | |||||
| * mat4(m_rotation); | |||||
| } | } | ||||
| void Camera::TickDraw(float seconds) | void Camera::TickDraw(float seconds) | ||||
| { | { | ||||
| WorldEntity::TickDraw(seconds); | WorldEntity::TickDraw(seconds); | ||||
| ForceSceneUpdate(); | |||||
| } | } | ||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -24,23 +24,21 @@ namespace lol | |||||
| class Camera : public WorldEntity | class Camera : public WorldEntity | ||||
| { | { | ||||
| public: | public: | ||||
| Camera(vec3 const &position, vec3 const &target, vec3 const &up); | |||||
| Camera(); | |||||
| ~Camera(); | ~Camera(); | ||||
| char const *GetName() { return "<camera>"; } | char const *GetName() { return "<camera>"; } | ||||
| void SetPosition(vec3 const &pos); | |||||
| void SetRotation(quat const &rot); | |||||
| void SetOrtho(float width, float height, float near, float far); | |||||
| void SetPerspective(float fov, float width, float height, | |||||
| float near, float far); | |||||
| void SetTarget(vec3 const &pos); | |||||
| vec3 GetTarget(); | |||||
| vec3 GetPosition(); | |||||
| void SetView(mat4 const &view); | |||||
| void SetView(vec3 eye, vec3 target, vec3 up); | |||||
| void SetView(vec3 pos, quat rot); | |||||
| void SetProjection(mat4 const &proj); | |||||
| mat4 const &GetViewMatrix(); | |||||
| mat4 const &GetProjMatrix(); | |||||
| void ForceSceneUpdate(); | |||||
| mat4 GetView(); | |||||
| mat4 GetProjection(); | |||||
| vec3 GetPosition(); | |||||
| protected: | protected: | ||||
| virtual void TickGame(float seconds); | virtual void TickGame(float seconds); | ||||
| @@ -48,7 +46,6 @@ protected: | |||||
| private: | private: | ||||
| mat4 m_view_matrix, m_proj_matrix; | mat4 m_view_matrix, m_proj_matrix; | ||||
| vec3 m_target, m_up; | |||||
| }; | }; | ||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -151,7 +151,9 @@ void DefaultShaderData::SetupDefaultData(bool with_UV) | |||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| void DefaultShaderData::SetupShaderDatas(mat4 const &model) | void DefaultShaderData::SetupShaderDatas(mat4 const &model) | ||||
| { | { | ||||
| mat4 modelview = Scene::GetDefault()->GetViewMatrix() * model; | |||||
| mat4 proj = Scene::GetDefault()->GetCamera()->GetProjection(); | |||||
| mat4 view = Scene::GetDefault()->GetCamera()->GetView(); | |||||
| 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 */ | ||||
| @@ -167,9 +169,9 @@ void DefaultShaderData::SetupShaderDatas(mat4 const &model) | |||||
| m_shader->SetUniform(*GetUniform("in_ModelView"), modelview); | m_shader->SetUniform(*GetUniform("in_ModelView"), modelview); | ||||
| m_shader->SetUniform(*GetUniform("in_Inv_ModelView"), inverse(modelview)); | m_shader->SetUniform(*GetUniform("in_Inv_ModelView"), inverse(modelview)); | ||||
| m_shader->SetUniform(*GetUniform("in_View"), Scene::GetDefault()->GetViewMatrix()); | |||||
| m_shader->SetUniform(*GetUniform("in_Inv_View"), inverse(Scene::GetDefault()->GetViewMatrix())); | |||||
| m_shader->SetUniform(*GetUniform("in_Proj"), Scene::GetDefault()->GetProjMatrix()); | |||||
| m_shader->SetUniform(*GetUniform("in_View"), view); | |||||
| m_shader->SetUniform(*GetUniform("in_Inv_View"), inverse(view)); | |||||
| m_shader->SetUniform(*GetUniform("in_Proj"), proj); | |||||
| m_shader->SetUniform(*GetUniform("in_NormalMat"), normalmat); | m_shader->SetUniform(*GetUniform("in_NormalMat"), normalmat); | ||||
| m_shader->SetUniform(*GetUniform("in_Damage"), 0); | m_shader->SetUniform(*GetUniform("in_Damage"), 0); | ||||
| } | } | ||||
| @@ -95,9 +95,9 @@ void Gradient::TickDraw(float seconds) | |||||
| data->shader->Bind(); | data->shader->Bind(); | ||||
| uni_mat = data->shader->GetUniformLocation("proj_matrix"); | uni_mat = data->shader->GetUniformLocation("proj_matrix"); | ||||
| data->shader->SetUniform(uni_mat, Scene::GetDefault()->GetProjMatrix()); | |||||
| data->shader->SetUniform(uni_mat, Scene::GetDefault()->GetCamera()->GetProjection()); | |||||
| uni_mat = data->shader->GetUniformLocation("view_matrix"); | uni_mat = data->shader->GetUniformLocation("view_matrix"); | ||||
| data->shader->SetUniform(uni_mat, Scene::GetDefault()->GetViewMatrix()); | |||||
| data->shader->SetUniform(uni_mat, Scene::GetDefault()->GetCamera()->GetView()); | |||||
| uni_mat = data->shader->GetUniformLocation("model_matrix"); | uni_mat = data->shader->GetUniformLocation("model_matrix"); | ||||
| data->shader->SetUniform(uni_mat, model_matrix); | data->shader->SetUniform(uni_mat, model_matrix); | ||||
| @@ -57,10 +57,6 @@ private: | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| mat4 m_model_matrix; | |||||
| mat4 m_view_matrix; | |||||
| mat4 m_proj_matrix; | |||||
| Array<Tile> m_tiles; | Array<Tile> m_tiles; | ||||
| Array<Light *> m_lights; | Array<Light *> m_lights; | ||||
| @@ -68,6 +64,9 @@ private: | |||||
| VertexDeclaration *m_vdecl; | VertexDeclaration *m_vdecl; | ||||
| Array<VertexBuffer *> bufs; | Array<VertexBuffer *> bufs; | ||||
| Camera *m_default_cam; | |||||
| Array<Camera *> m_camera_stack; | |||||
| static Scene *scene; | static Scene *scene; | ||||
| }; | }; | ||||
| @@ -80,10 +79,12 @@ Scene *SceneData::scene = NULL; | |||||
| Scene::Scene() | Scene::Scene() | ||||
| : data(new SceneData()) | : data(new SceneData()) | ||||
| { | { | ||||
| data->m_model_matrix = mat4(1.f); | |||||
| data->m_view_matrix = mat4(1.f); | |||||
| data->m_proj_matrix = mat4::ortho(0, Video::GetSize().x, | |||||
| 0, Video::GetSize().y, -1000.f, 1000.f); | |||||
| /* 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); | |||||
| data->m_default_cam->SetProjection(proj); | |||||
| PushCamera(data->m_default_cam); | |||||
| data->m_shader = 0; | data->m_shader = 0; | ||||
| data->m_vdecl = new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | data->m_vdecl = new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | ||||
| @@ -92,6 +93,8 @@ Scene::Scene() | |||||
| Scene::~Scene() | Scene::~Scene() | ||||
| { | { | ||||
| 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. */ | ||||
| /* FIXME: also, make sure we do not add code to Reset() that will | /* FIXME: also, make sure we do not add code to Reset() that will | ||||
| @@ -109,32 +112,40 @@ Scene *Scene::GetDefault() | |||||
| return SceneData::scene; | return SceneData::scene; | ||||
| } | } | ||||
| void Scene::Reset() | |||||
| void Scene::PushCamera(Camera *cam) | |||||
| { | { | ||||
| for (int i = 0; i < data->bufs.Count(); i++) | |||||
| delete data->bufs[i]; | |||||
| data->bufs.Empty(); | |||||
| data->m_lights.Empty(); | |||||
| Ticker::Ref(cam); | |||||
| data->m_camera_stack.Push(cam); | |||||
| } | } | ||||
| void Scene::SetViewMatrix(mat4 const &m) | |||||
| void Scene::PopCamera(Camera *cam) | |||||
| { | { | ||||
| data->m_view_matrix = m; | |||||
| } | |||||
| /* Parse from the end because that’s probably where we’ll find | |||||
| * our camera first. */ | |||||
| for (int i = data->m_camera_stack.Count(); i--; ) | |||||
| { | |||||
| if (data->m_camera_stack[i] == cam) | |||||
| { | |||||
| Ticker::Unref(cam); | |||||
| data->m_camera_stack.Remove(i); | |||||
| return; | |||||
| } | |||||
| } | |||||
| void Scene::SetProjMatrix(mat4 const &m) | |||||
| { | |||||
| data->m_proj_matrix = m; | |||||
| ASSERT(false, "trying to pop a nonexistent camera from the scene"); | |||||
| } | } | ||||
| mat4 const &Scene::GetViewMatrix(void) | |||||
| Camera *Scene::GetCamera() | |||||
| { | { | ||||
| return data->m_view_matrix; | |||||
| return data->m_camera_stack.Last(); | |||||
| } | } | ||||
| mat4 const &Scene::GetProjMatrix(void) | |||||
| void Scene::Reset() | |||||
| { | { | ||||
| return data->m_proj_matrix; | |||||
| for (int i = 0; i < data->bufs.Count(); i++) | |||||
| delete data->bufs[i]; | |||||
| data->bufs.Empty(); | |||||
| data->m_lights.Empty(); | |||||
| } | } | ||||
| void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale) | void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale) | ||||
| @@ -183,22 +194,6 @@ void Scene::Render() // XXX: rename to Blit() | |||||
| qsort(&data->m_tiles[0], data->m_tiles.Count(), | qsort(&data->m_tiles[0], data->m_tiles.Count(), | ||||
| sizeof(Tile), SceneData::Compare); | sizeof(Tile), SceneData::Compare); | ||||
| // XXX: debug stuff | |||||
| data->m_model_matrix = mat4::translate(320.0f, 240.0f, 0.0f); | |||||
| #if 0 | |||||
| static float f = 0.0f; | |||||
| f += 0.01f; | |||||
| data->m_model_matrix *= mat4::rotate(6.0f * sinf(f), 1.0f, 0.0f, 0.0f); | |||||
| data->m_model_matrix *= mat4::rotate(17.0f * cosf(f), 0.0f, 0.0f, 1.0f); | |||||
| #endif | |||||
| data->m_model_matrix *= mat4::translate(-320.0f, -240.0f, 0.0f); | |||||
| #if __ANDROID__ | |||||
| data->m_model_matrix = mat4::scale(1280.0f / 640, | |||||
| 736.0f / 480, | |||||
| 1.0f) * data->m_model_matrix; | |||||
| #endif | |||||
| // XXX: end of debug stuff | |||||
| ShaderUniform uni_mat, uni_tex; | ShaderUniform uni_mat, uni_tex; | ||||
| ShaderAttrib attr_pos, attr_tex; | ShaderAttrib attr_pos, attr_tex; | ||||
| attr_pos = data->m_shader->GetAttribLocation("in_Position", VertexUsage::Position, 0); | attr_pos = data->m_shader->GetAttribLocation("in_Position", VertexUsage::Position, 0); | ||||
| @@ -207,11 +202,11 @@ void Scene::Render() // XXX: rename to Blit() | |||||
| data->m_shader->Bind(); | data->m_shader->Bind(); | ||||
| uni_mat = data->m_shader->GetUniformLocation("proj_matrix"); | uni_mat = data->m_shader->GetUniformLocation("proj_matrix"); | ||||
| data->m_shader->SetUniform(uni_mat, data->m_proj_matrix); | |||||
| data->m_shader->SetUniform(uni_mat, GetCamera()->GetProjection()); | |||||
| uni_mat = data->m_shader->GetUniformLocation("view_matrix"); | uni_mat = data->m_shader->GetUniformLocation("view_matrix"); | ||||
| data->m_shader->SetUniform(uni_mat, data->m_view_matrix); | |||||
| data->m_shader->SetUniform(uni_mat, GetCamera()->GetView()); | |||||
| uni_mat = data->m_shader->GetUniformLocation("model_matrix"); | uni_mat = data->m_shader->GetUniformLocation("model_matrix"); | ||||
| data->m_shader->SetUniform(uni_mat, data->m_model_matrix); | |||||
| data->m_shader->SetUniform(uni_mat, mat4(1.f)); | |||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| #else | #else | ||||
| @@ -20,6 +20,7 @@ | |||||
| #include "tileset.h" | #include "tileset.h" | ||||
| #include "light.h" | #include "light.h" | ||||
| #include "camera.h" | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -34,10 +35,9 @@ public: | |||||
| static Scene *GetDefault(); | static Scene *GetDefault(); | ||||
| void SetViewMatrix(mat4 const &m); | |||||
| void SetProjMatrix(mat4 const &m); | |||||
| mat4 const &GetViewMatrix(void); | |||||
| mat4 const &GetProjMatrix(void); | |||||
| Camera *GetCamera(); | |||||
| void PushCamera(Camera *cam); | |||||
| void PopCamera(Camera *cam); | |||||
| void Reset(); | void Reset(); | ||||
| void Render(); | void Render(); | ||||
| @@ -66,13 +66,12 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
| m_loop_value = .0f; | m_loop_value = .0f; | ||||
| /* Create a camera that matches the settings of XNA BtPhysTest */ | /* Create a camera that matches the settings of XNA BtPhysTest */ | ||||
| m_camera = new Camera(vec3(0.f, 600.f, 0.f), | |||||
| vec3(0.f, 0.f, 0.f), | |||||
| vec3(0, 1, 0)); | |||||
| m_camera->SetRotation(quat::fromeuler_xyz(0.f, 0.f, 0.f)); | |||||
| m_camera->SetPerspective(45.f, 1280.f, 960.f, .1f, 1000.f); | |||||
| //m_camera->SetOrtho(1280.f / 6, 960.f / 6, -1000.f, 1000.f); | |||||
| Ticker::Ref(m_camera); | |||||
| m_camera = new Camera(); | |||||
| m_camera->SetView(vec3(0.f, 600.f, 0.f), | |||||
| 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); | |||||
| m_ready = false; | m_ready = false; | ||||
| @@ -304,7 +303,7 @@ void BtPhysTest::TickGame(float seconds) | |||||
| mat4 GroundMat = PhysObj->GetTransform(); | mat4 GroundMat = PhysObj->GetTransform(); | ||||
| vec3 CenterToGround = GroundMat.v3.xyz - GroundBarycenter; | vec3 CenterToGround = GroundMat.v3.xyz - GroundBarycenter; | ||||
| vec3 CenterToCam = m_camera->m_position - GroundBarycenter; | |||||
| vec3 CenterToCam = m_camera->GetPosition() - GroundBarycenter; | |||||
| if (dot(normalize(CenterToCam - CenterToGround), | if (dot(normalize(CenterToCam - CenterToGround), | ||||
| normalize(CenterToGround)) > 0.f) | normalize(CenterToGround)) > 0.f) | ||||
| @@ -393,9 +392,11 @@ void BtPhysTest::TickGame(float seconds) | |||||
| PhysObjBarycenter /= factor; | PhysObjBarycenter /= factor; | ||||
| #if 0 | |||||
| m_camera->SetTarget(m_camera->GetTarget() + (seconds / (seconds + 0.18f)) * (PhysObjBarycenter - m_camera->GetTarget())); | m_camera->SetTarget(m_camera->GetTarget() + (seconds / (seconds + 0.18f)) * (PhysObjBarycenter - m_camera->GetTarget())); | ||||
| vec3 CamPosCenter = m_camera->GetTarget() + vec3(.0f, 5.0f, .0f); | vec3 CamPosCenter = m_camera->GetTarget() + vec3(.0f, 5.0f, .0f); | ||||
| m_camera->SetPosition(CamPosCenter + normalize(m_camera->GetPosition() - CamPosCenter) * 20.0f); | m_camera->SetPosition(CamPosCenter + normalize(m_camera->GetPosition() - CamPosCenter) * 20.0f); | ||||
| #endif | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -411,8 +412,10 @@ void BtPhysTest::TickGame(float seconds) | |||||
| PhysObjBarycenter /= factor; | PhysObjBarycenter /= factor; | ||||
| #if 0 | |||||
| m_camera->SetTarget(PhysObjBarycenter); | m_camera->SetTarget(PhysObjBarycenter); | ||||
| m_camera->SetPosition(GroundBarycenter + normalize(GroundBarycenter - PhysObjBarycenter) * 60.0f); | m_camera->SetPosition(GroundBarycenter + normalize(GroundBarycenter - PhysObjBarycenter) * 60.0f); | ||||
| #endif | |||||
| } | } | ||||
| } | } | ||||
| @@ -433,7 +436,7 @@ void BtPhysTest::TickDraw(float seconds) | |||||
| BtPhysTest::~BtPhysTest() | BtPhysTest::~BtPhysTest() | ||||
| { | { | ||||
| Ticker::Unref(m_camera); | |||||
| Scene::GetDefault()->PopCamera(m_camera); | |||||
| Ticker::Unref(m_light1); | Ticker::Unref(m_light1); | ||||
| Ticker::Unref(m_light2); | Ticker::Unref(m_light2); | ||||
| @@ -64,9 +64,9 @@ public: | |||||
| //m_fov_compensation = mat4::translate(-0.5f * video_size.x, -0.5f * video_size.y, -dist); | //m_fov_compensation = mat4::translate(-0.5f * video_size.x, -0.5f * video_size.y, -dist); | ||||
| m_fov_compensation = mat4::translate(vec3(.0f)); | m_fov_compensation = mat4::translate(vec3(.0f)); | ||||
| if (new_fov > 0.1f) | if (new_fov > 0.1f) | ||||
| m_camera->SetPerspective(new_fov, (float)video_size.x, (float)video_size.y, .1f, 1000.f); | |||||
| Scene::GetDefault()->GetCamera()->SetProjection(mat4::perspective(new_fov, (float)video_size.x, (float)video_size.y, .1f, 1000.f)); | |||||
| else | else | ||||
| m_camera->SetOrtho((float)video_size.x, (float)video_size.y, .1f, 1000.f); | |||||
| Scene::GetDefault()->GetCamera()->SetProjection(mat4::ortho((float)video_size.x, (float)video_size.y, .1f, 1000.f)); | |||||
| } | } | ||||
| MeshViewer(char const *file_name = "data/mesh-buffer.txt") | MeshViewer(char const *file_name = "data/mesh-buffer.txt") | ||||
| @@ -98,20 +98,18 @@ public: | |||||
| Input::LinkActionToKey(IPT_MESH_ROT_DOWN, Key::KP5); | Input::LinkActionToKey(IPT_MESH_ROT_DOWN, Key::KP5); | ||||
| m_angle = 0; | m_angle = 0; | ||||
| DefaultTexture = NULL; | |||||
| m_default_texture = NULL; | |||||
| //Camera Setup | //Camera Setup | ||||
| m_fov_zoom_damp = .0f; | m_fov_zoom_damp = .0f; | ||||
| m_fov_damp = 60.0f; | m_fov_damp = 60.0f; | ||||
| m_fov = 60.0f; | m_fov = 60.0f; | ||||
| m_camera = new Camera(vec3(0.f, 600.f, 0.f), | |||||
| vec3(0.f, 0.f, 0.f), | |||||
| vec3(0, 1, 0)); | |||||
| m_camera = new Camera(); | |||||
| SetFov(m_fov_damp); | SetFov(m_fov_damp); | ||||
| m_camera->SetTarget(vec3(0.f, 0.f, 0.f)); | |||||
| m_camera->SetPosition(vec3(0.f, 0.f, 10.f)); | |||||
| m_camera->ForceSceneUpdate(); | |||||
| Ticker::Ref(m_camera); | |||||
| 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); | |||||
| //Lights setup | //Lights setup | ||||
| m_lights << new Light(); | m_lights << new Light(); | ||||
| @@ -148,7 +146,7 @@ public: | |||||
| ~MeshViewer() | ~MeshViewer() | ||||
| { | { | ||||
| Ticker::Unref(m_camera); | |||||
| Scene::GetDefault()->PopCamera(m_camera); | |||||
| for (int i = 0; i < m_lights.Count(); ++i) | for (int i = 0; i < m_lights.Count(); ++i) | ||||
| Ticker::Unref(m_lights[i]); | Ticker::Unref(m_lights[i]); | ||||
| } | } | ||||
| @@ -213,8 +211,8 @@ public: | |||||
| m_fov_damp = damp(m_fov_damp, m_fov, .2f, seconds); | m_fov_damp = damp(m_fov_damp, m_fov, .2f, seconds); | ||||
| SetFov(m_fov_damp); | SetFov(m_fov_damp); | ||||
| m_camera->SetPosition(m_camera->GetPosition() + cam_move); | |||||
| m_camera->SetTarget(m_camera->GetPosition() + vec3(0, 0, -5.0f)); | |||||
| vec3 campos = Scene::GetDefault()->GetCamera()->GetPosition(); | |||||
| Scene::GetDefault()->GetCamera()->SetView(campos + cam_move, quat(1.f)); | |||||
| //-- | //-- | ||||
| //Mesh movement handling | //Mesh movement handling | ||||
| @@ -329,12 +327,12 @@ public: | |||||
| Video::SetDebugRenderMode(DebugRenderMode::UV); | Video::SetDebugRenderMode(DebugRenderMode::UV); | ||||
| } | } | ||||
| if (!DefaultTexture) | |||||
| if (!m_default_texture) | |||||
| { | { | ||||
| m_texture_shader = Shader::Create(LOLFX_RESOURCE_NAME(shinymvtexture)); | m_texture_shader = Shader::Create(LOLFX_RESOURCE_NAME(shinymvtexture)); | ||||
| m_texture_uni = m_texture_shader->GetUniformLocation("u_Texture"); | m_texture_uni = m_texture_shader->GetUniformLocation("u_Texture"); | ||||
| //m_image = new Image("data/test-texture.png"); | //m_image = new Image("data/test-texture.png"); | ||||
| DefaultTexture = Tiler::Register("data/test-texture.png", ivec2(0), ivec2(0,1)); | |||||
| m_default_texture = Tiler::Register("data/test-texture.png", ivec2(0), ivec2(0,1)); | |||||
| //ivec2 size = m_image->GetSize(); | //ivec2 size = m_image->GetSize(); | ||||
| //// m_image->GetFormat() | //// m_image->GetFormat() | ||||
| @@ -342,8 +340,8 @@ public: | |||||
| //m_texture->SetData(m_image->GetData()); | //m_texture->SetData(m_image->GetData()); | ||||
| // PixelFormat::ABGR_8 | // PixelFormat::ABGR_8 | ||||
| } | } | ||||
| else if (m_texture && DefaultTexture) | |||||
| m_texture_shader->SetUniform(m_texture_uni, DefaultTexture->GetTexture(), 0); | |||||
| else if (m_texture && m_default_texture) | |||||
| m_texture_shader->SetUniform(m_texture_uni, m_default_texture->GetTexture(), 0); | |||||
| for (int i = 0; i < m_meshes.Count(); i++) | for (int i = 0; i < m_meshes.Count(); i++) | ||||
| { | { | ||||
| @@ -365,7 +363,7 @@ public: | |||||
| Video::SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | Video::SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | ||||
| mat4 default_proj = Scene::GetDefault()->GetProjMatrix(); | |||||
| mat4 default_proj = Scene::GetDefault()->GetCamera()->GetProjection(); | |||||
| for (int i = 0; i < m_meshes.Count(); i++) | for (int i = 0; i < m_meshes.Count(); i++) | ||||
| { | { | ||||
| float new_scale = max(.0f, 1.0f - (m_mesh_offset_damp.y * (float)(m_meshes.Count() - (i + 1)))); | float new_scale = max(.0f, 1.0f - (m_mesh_offset_damp.y * (float)(m_meshes.Count() - (i + 1)))); | ||||
| @@ -379,11 +377,11 @@ public: | |||||
| new_mesh_offset = new_mesh_offset + vec3(m_meshes[j].m3 * ofs_scale * ofs_scale * m_mesh_offset_damp.x, .0f, .0f); | new_mesh_offset = new_mesh_offset + vec3(m_meshes[j].m3 * ofs_scale * ofs_scale * m_mesh_offset_damp.x, .0f, .0f); | ||||
| } | } | ||||
| m_meshes[i].m4 = damp(m_meshes[i].m4, new_mesh_offset, .35f, seconds); | m_meshes[i].m4 = damp(m_meshes[i].m4, new_mesh_offset, .35f, seconds); | ||||
| Scene::GetDefault()->SetProjMatrix(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)) * | |||||
| default_proj * | |||||
| m_fov_compensation); | |||||
| Scene::GetDefault()->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)) * | |||||
| default_proj * | |||||
| m_fov_compensation); | |||||
| #if WITH_FUR | #if WITH_FUR | ||||
| for (int j=0; j < 40; j++) | for (int j=0; j < 40; j++) | ||||
| m_meshes[i].m1.Render(m_mat, 0.1 * j); | m_meshes[i].m1.Render(m_mat, 0.1 * j); | ||||
| @@ -393,40 +391,40 @@ public: | |||||
| Video::Clear(ClearMask::Depth); | Video::Clear(ClearMask::Depth); | ||||
| } | } | ||||
| } | } | ||||
| Scene::GetDefault()->SetProjMatrix(default_proj); | |||||
| Scene::GetDefault()->GetCamera()->SetProjection(default_proj); | |||||
| } | } | ||||
| private: | private: | ||||
| float m_angle; | |||||
| mat4 m_mat; | |||||
| Camera * m_camera; | |||||
| float m_angle; | |||||
| mat4 m_mat; | |||||
| //Mesh infos | //Mesh infos | ||||
| //Move damping | //Move damping | ||||
| vec2 m_mesh_rotate_damp; | |||||
| vec2 m_mesh_screen_move_damp; | |||||
| vec2 m_mesh_move_damp; | |||||
| vec2 m_mesh_rotate_damp; | |||||
| vec2 m_mesh_screen_move_damp; | |||||
| vec2 m_mesh_move_damp; | |||||
| //Move transform damping | //Move transform damping | ||||
| vec2 m_mesh_rotation_damp; | |||||
| vec2 m_mesh_screen_offset_damp; | |||||
| vec2 m_mesh_offset_damp; | |||||
| vec2 m_mesh_rotation_damp; | |||||
| vec2 m_mesh_screen_offset_damp; | |||||
| vec2 m_mesh_offset_damp; | |||||
| vec2 m_mesh_rotation; //Meshes rotation | |||||
| vec2 m_mesh_screen_offset;//Meshes screen offset | |||||
| vec2 m_mesh_offset; //Mesh Offset after first mesh (x: offset, y: scale) | |||||
| vec2 m_mesh_rotation; //Meshes rotation | |||||
| vec2 m_mesh_screen_offset;//Meshes screen offset | |||||
| vec2 m_mesh_offset; //Mesh Offset after first mesh (x: offset, y: scale) | |||||
| //File data | //File data | ||||
| String m_file_name; | |||||
| Array<String> m_cmdlist; | |||||
| float m_stream_update_time; | |||||
| float m_stream_update_timer; | |||||
| String m_file_name; | |||||
| Array<String> m_cmdlist; | |||||
| float m_stream_update_time; | |||||
| float m_stream_update_timer; | |||||
| //misc datas | //misc datas | ||||
| Array<EasyMesh, bool, float, vec3> m_meshes; | Array<EasyMesh, bool, float, vec3> m_meshes; | ||||
| Array<Light *> m_lights; | Array<Light *> m_lights; | ||||
| Camera * m_camera; | |||||
| Shader * m_texture_shader; | Shader * m_texture_shader; | ||||
| TileSet * DefaultTexture; | |||||
| TileSet * m_default_texture; | |||||
| Texture * m_texture; | Texture * m_texture; | ||||
| ShaderUniform m_texture_uni; | ShaderUniform m_texture_uni; | ||||
| Image * m_image; | Image * m_image; | ||||
| @@ -46,13 +46,12 @@ public: | |||||
| m_angle = 0; | m_angle = 0; | ||||
| m_camera = new Camera(vec3(0.f, 600.f, 0.f), | |||||
| vec3(0.f, 0.f, 0.f), | |||||
| vec3(0, 1, 0)); | |||||
| m_camera->SetPerspective(30.f, 960.f, 600.f, .1f, 1000.f); | |||||
| m_camera->SetTarget(vec3(0.f, -1.f, 0.f)); | |||||
| m_camera->SetPosition(vec3(-15.f, 5.f, 0.f)); | |||||
| Ticker::Ref(m_camera); | |||||
| m_camera = new Camera(); | |||||
| m_camera->SetProjection(mat4::perspective(30.f, 960.f, 600.f, .1f, 1000.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))); | |||||
| Scene::GetDefault()->PushCamera(m_camera); | |||||
| /* Add a white directional light */ | /* Add a white directional light */ | ||||
| m_light1 = new Light(); | m_light1 = new Light(); | ||||
| @@ -71,7 +70,7 @@ public: | |||||
| ~EasyMeshTutorial() | ~EasyMeshTutorial() | ||||
| { | { | ||||
| Ticker::Unref(m_camera); | |||||
| Scene::GetDefault()->PopCamera(m_camera); | |||||
| Ticker::Unref(m_light1); | Ticker::Unref(m_light1); | ||||
| Ticker::Unref(m_light2); | Ticker::Unref(m_light2); | ||||
| } | } | ||||