Browse Source

core: move some of the camera view logic from the Video class to the

Scene and Camera classes.
legacy
Sam Hocevar sam 13 years ago
parent
commit
bfada5d920
8 changed files with 85 additions and 63 deletions
  1. +4
    -0
      src/camera.cpp
  2. +1
    -0
      src/entity.h
  3. +2
    -2
      src/gradient.cpp
  4. +59
    -34
      src/scene.cpp
  5. +11
    -3
      src/scene.h
  6. +7
    -8
      src/ticker.cpp
  7. +1
    -14
      src/video.cpp
  8. +0
    -2
      src/video.h

+ 4
- 0
src/camera.cpp View File

@@ -29,6 +29,7 @@ Camera::Camera(vec3 const &position, vec3 const &target, vec3 const &up)
m_up(up) m_up(up)
{ {
m_gamegroup = GAMEGROUP_BEFORE; m_gamegroup = GAMEGROUP_BEFORE;
m_drawgroup = DRAWGROUP_CAMERA;


SetPosition(position); SetPosition(position);
} }
@@ -64,6 +65,9 @@ void Camera::TickGame(float seconds)
void Camera::TickDraw(float seconds) void Camera::TickDraw(float seconds)
{ {
WorldEntity::TickDraw(seconds); WorldEntity::TickDraw(seconds);

Scene::GetDefault()->SetViewMatrix(m_view_matrix);
Scene::GetDefault()->SetProjMatrix(m_proj_matrix);
} }


} /* namespace lol */ } /* namespace lol */


+ 1
- 0
src/entity.h View File

@@ -54,6 +54,7 @@ protected:
enum enum
{ {
DRAWGROUP_BEFORE = GAMEGROUP_END, DRAWGROUP_BEFORE = GAMEGROUP_END,
DRAWGROUP_CAMERA,
DRAWGROUP_DEFAULT, DRAWGROUP_DEFAULT,
DRAWGROUP_HUD, DRAWGROUP_HUD,
DRAWGROUP_CAPTURE, DRAWGROUP_CAPTURE,


+ 2
- 2
src/gradient.cpp View File

@@ -186,9 +186,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, Video::GetProjMatrix());
data->shader->SetUniform(uni_mat, Scene::GetDefault()->GetProjMatrix());
uni_mat = data->shader->GetUniformLocation("view_matrix"); uni_mat = data->shader->GetUniformLocation("view_matrix");
data->shader->SetUniform(uni_mat, Video::GetViewMatrix());
data->shader->SetUniform(uni_mat, Scene::GetDefault()->GetViewMatrix());
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);




+ 59
- 34
src/scene.cpp View File

@@ -35,8 +35,6 @@ struct Tile
int id, o; int id, o;
}; };


static Shader *stdshader = NULL;

/* /*
* Scene implementation class * Scene implementation class
*/ */
@@ -54,12 +52,14 @@ private:
return t2->prio - t1->prio; return t2->prio - t1->prio;
} }


mat4 model_matrix;
mat4 m_model_matrix;
mat4 m_view_matrix;
mat4 m_proj_matrix;


Tile *tiles; Tile *tiles;
int ntiles; int ntiles;
float angle;


Shader *m_shader;
VertexDeclaration *m_vdecl; VertexDeclaration *m_vdecl;
VertexBuffer **bufs; VertexBuffer **bufs;
int nbufs; int nbufs;
@@ -73,13 +73,18 @@ Scene *SceneData::scene = NULL;
* Public Scene class * Public Scene class
*/ */


Scene::Scene(float angle)
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);

data->tiles = 0; data->tiles = 0;
data->ntiles = 0; data->ntiles = 0;
data->angle = angle;


data->m_shader = 0;
data->bufs = 0; data->bufs = 0;
data->nbufs = 0; data->nbufs = 0;


@@ -91,10 +96,9 @@ Scene::~Scene()
{ {
/* 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. */
/* XXX: The test is necessary because of a crash with PSGL. */
for (int i = 0; i < data->nbufs; i++)
delete data->bufs[i];
free(data->bufs);
/* FIXME: also, make sure we do not add code to Reset() that will
* reallocate stuff */
Reset();


delete data->m_vdecl; delete data->m_vdecl;
delete data; delete data;
@@ -103,15 +107,37 @@ Scene::~Scene()
Scene *Scene::GetDefault() Scene *Scene::GetDefault()
{ {
if (!SceneData::scene) if (!SceneData::scene)
SceneData::scene = new Scene(0.0f);
SceneData::scene = new Scene();
return SceneData::scene; return SceneData::scene;
} }


void Scene::Reset() void Scene::Reset()
{ {
if (SceneData::scene)
delete SceneData::scene;
SceneData::scene = NULL;
for (int i = 0; i < data->nbufs; i++)
delete data->bufs[i];
free(data->bufs);
data->bufs = 0;
data->nbufs = 0;
}

void Scene::SetViewMatrix(mat4 const &m)
{
data->m_view_matrix = m;
}

void Scene::SetProjMatrix(mat4 const &m)
{
data->m_proj_matrix = m;
}

mat4 const &Scene::GetViewMatrix(void)
{
return data->m_view_matrix;
}

mat4 const &Scene::GetProjMatrix(void)
{
return data->m_proj_matrix;
} }


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)
@@ -131,10 +157,10 @@ void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale)


void Scene::Render() // XXX: rename to Blit() void Scene::Render() // XXX: rename to Blit()
{ {
if (!stdshader)
if (!data->m_shader)
{ {
#if !defined _XBOX && !defined __CELLOS_LV2__ && !defined USE_D3D9 #if !defined _XBOX && !defined __CELLOS_LV2__ && !defined USE_D3D9
stdshader = Shader::Create(
data->m_shader = Shader::Create(
# if !defined HAVE_GLES_2X # if !defined HAVE_GLES_2X
"#version 130\n" "#version 130\n"
# endif # endif
@@ -216,7 +242,7 @@ void Scene::Render() // XXX: rename to Blit()
" gl_FragColor = col;\n" " gl_FragColor = col;\n"
"}\n"); "}\n");
#else #else
stdshader = Shader::Create(
data->m_shader = Shader::Create(
"void main(float4 in_Position : POSITION," "void main(float4 in_Position : POSITION,"
" float2 in_TexCoord : TEXCOORD0," " float2 in_TexCoord : TEXCOORD0,"
" uniform float4x4 proj_matrix," " uniform float4x4 proj_matrix,"
@@ -288,35 +314,34 @@ void Scene::Render() // XXX: rename to Blit()
qsort(data->tiles, data->ntiles, sizeof(Tile), SceneData::Compare); qsort(data->tiles, data->ntiles, sizeof(Tile), SceneData::Compare);


// XXX: debug stuff // XXX: debug stuff
data->model_matrix = mat4::translate(320.0f, 240.0f, 0.0f);
data->model_matrix *= mat4::rotate(-data->angle, 1.0f, 0.0f, 0.0f);
data->m_model_matrix = mat4::translate(320.0f, 240.0f, 0.0f);
#if 0 #if 0
static float f = 0.0f; static float f = 0.0f;
f += 0.01f; f += 0.01f;
data->model_matrix *= mat4::rotate(6.0f * sinf(f), 1.0f, 0.0f, 0.0f);
data->model_matrix *= mat4::rotate(17.0f * cosf(f), 0.0f, 0.0f, 1.0f);
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 #endif
data->model_matrix *= mat4::translate(-320.0f, -240.0f, 0.0f);
data->m_model_matrix *= mat4::translate(-320.0f, -240.0f, 0.0f);
// XXX: end of debug stuff // 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 = stdshader->GetAttribLocation("in_Position", VertexUsage::Position, 0);
attr_tex = stdshader->GetAttribLocation("in_TexCoord", VertexUsage::TexCoord, 0);
attr_pos = data->m_shader->GetAttribLocation("in_Position", VertexUsage::Position, 0);
attr_tex = data->m_shader->GetAttribLocation("in_TexCoord", VertexUsage::TexCoord, 0);


stdshader->Bind();
data->m_shader->Bind();


uni_mat = stdshader->GetUniformLocation("proj_matrix");
stdshader->SetUniform(uni_mat, Video::GetProjMatrix());
uni_mat = stdshader->GetUniformLocation("view_matrix");
stdshader->SetUniform(uni_mat, Video::GetViewMatrix());
uni_mat = stdshader->GetUniformLocation("model_matrix");
stdshader->SetUniform(uni_mat, data->model_matrix);
uni_mat = data->m_shader->GetUniformLocation("proj_matrix");
data->m_shader->SetUniform(uni_mat, data->m_proj_matrix);
uni_mat = data->m_shader->GetUniformLocation("view_matrix");
data->m_shader->SetUniform(uni_mat, data->m_view_matrix);
uni_mat = data->m_shader->GetUniformLocation("model_matrix");
data->m_shader->SetUniform(uni_mat, data->m_model_matrix);


#if defined USE_D3D9 || defined _XBOX #if defined USE_D3D9 || defined _XBOX
#else #else
uni_tex = stdshader->GetUniformLocation("in_Texture");
stdshader->SetUniform(uni_tex, 0);
uni_tex = data->m_shader->GetUniformLocation("in_Texture");
data->m_shader->SetUniform(uni_tex, 0);


#if !defined HAVE_GLES_2X #if !defined HAVE_GLES_2X
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
@@ -385,7 +410,7 @@ void Scene::Render() // XXX: rename to Blit()
data->tiles = 0; data->tiles = 0;
data->ntiles = 0; data->ntiles = 0;


stdshader->Unbind();
data->m_shader->Unbind();


#if defined USE_D3D9 || defined _XBOX #if defined USE_D3D9 || defined _XBOX
/* TODO */ /* TODO */


+ 11
- 3
src/scene.h View File

@@ -28,15 +28,23 @@ class SceneData;
class Scene class Scene
{ {
public: public:
Scene(float angle);
Scene();
~Scene(); ~Scene();


static Scene *GetDefault(); static Scene *GetDefault();
static void Reset();


void AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale);
void SetViewMatrix(mat4 const &m);
void SetProjMatrix(mat4 const &m);
mat4 const &GetViewMatrix(void);
mat4 const &GetProjMatrix(void);

void Reset();
void Render(); void Render();


/* FIXME: this should be deprecated -- it doesn't really match
* the architecture we want to build */
void AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale);

private: private:
SceneData *data; SceneData *data;
}; };


+ 7
- 8
src/ticker.cpp View File

@@ -342,17 +342,16 @@ void Ticker::TickDraw()


Profiler::Start(Profiler::STAT_TICK_DRAW); Profiler::Start(Profiler::STAT_TICK_DRAW);


Video::Clear();

Scene::GetDefault();

/* Tick objects for the draw loop */ /* Tick objects for the draw loop */
for (int i = Entity::DRAWGROUP_BEGIN; i < Entity::DRAWGROUP_END; i++) for (int i = Entity::DRAWGROUP_BEGIN; i < Entity::DRAWGROUP_END; i++)
{ {
switch (i) switch (i)
{ {
case Entity::DRAWGROUP_BEGIN:
Scene::GetDefault()->Reset();
Video::Clear();
break;
case Entity::DRAWGROUP_HUD: case Entity::DRAWGROUP_HUD:
Scene::GetDefault()->Render();
Video::SetDepth(false); Video::SetDepth(false);
break; break;
default: default:
@@ -375,10 +374,10 @@ void Ticker::TickDraw()
e->m_tickstate = Entity::STATE_IDLE; e->m_tickstate = Entity::STATE_IDLE;
#endif #endif
} }
}


Scene::GetDefault()->Render();
Scene::Reset();
/* Do this render step */
Scene::GetDefault()->Render();
}


Profiler::Stop(Profiler::STAT_TICK_DRAW); Profiler::Stop(Profiler::STAT_TICK_DRAW);
Profiler::Start(Profiler::STAT_TICK_BLIT); Profiler::Start(Profiler::STAT_TICK_BLIT);


+ 1
- 14
src/video.cpp View File

@@ -51,7 +51,7 @@ class VideoData
friend class Video; friend class Video;


private: private:
static mat4 proj_matrix, view_matrix;
static mat4 proj_matrix;
static ivec2 saved_viewport; static ivec2 saved_viewport;
#if defined USE_D3D9 #if defined USE_D3D9
static IDirect3D9 *d3d_ctx; static IDirect3D9 *d3d_ctx;
@@ -65,7 +65,6 @@ private:
}; };


mat4 VideoData::proj_matrix; mat4 VideoData::proj_matrix;
mat4 VideoData::view_matrix;
ivec2 VideoData::saved_viewport(0, 0); ivec2 VideoData::saved_viewport(0, 0);


#if defined USE_D3D9 #if defined USE_D3D9
@@ -194,8 +193,6 @@ void Video::SetFov(float theta)
mat4 trans = mat4::translate(-0.5f * size.x, -0.5f * size.y, -dist); mat4 trans = mat4::translate(-0.5f * size.x, -0.5f * size.y, -dist);
VideoData::proj_matrix = proj * trans; VideoData::proj_matrix = proj * trans;
} }

VideoData::view_matrix = mat4(1.0f);
} }


void Video::SetDepth(bool set) void Video::SetDepth(bool set)
@@ -297,15 +294,5 @@ ivec2 Video::GetSize()
#endif #endif
} }


mat4 const & Video::GetProjMatrix()
{
return VideoData::proj_matrix;
}

mat4 const & Video::GetViewMatrix()
{
return VideoData::view_matrix;
}

} /* namespace lol */ } /* namespace lol */



+ 0
- 2
src/video.h View File

@@ -33,8 +33,6 @@ public:
static void Clear(); static void Clear();
static void Capture(uint32_t *buffer); static void Capture(uint32_t *buffer);
static ivec2 GetSize(); static ivec2 GetSize();
static mat4 const & GetProjMatrix();
static mat4 const & GetViewMatrix();
}; };


} /* namespace lol */ } /* namespace lol */


Loading…
Cancel
Save