Browse Source

gpu: add an Unbind() method for textures for clean up. Unfortunately

the Scene code still breaks Direct3D rendering.
legacy
Sam Hocevar sam 13 years ago
parent
commit
f7770f7387
6 changed files with 23 additions and 42 deletions
  1. +1
    -23
      src/gradient.cpp
  2. +6
    -16
      src/scene.cpp
  3. +10
    -0
      src/tileset.cpp
  4. +1
    -0
      src/tileset.h
  5. +4
    -3
      src/video.cpp
  6. +1
    -0
      test/tutorial/tut02.cpp

+ 1
- 23
src/gradient.cpp View File

@@ -14,29 +14,11 @@


#include <cmath> #include <cmath>


#ifdef WIN32
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# if defined USE_D3D9
# include <algorithm>
using std::min;
using std::max;
# include <d3d9.h>
# include <d3dx9shader.h>
# endif
#endif

#include "core.h" #include "core.h"
#include "lolgl.h" #include "lolgl.h"


using namespace std; using namespace std;


#if defined USE_D3D9
extern IDirect3DDevice9 *g_d3ddevice;
#elif defined _XBOX
extern D3DDevice *g_d3ddevice;
#endif

namespace lol namespace lol
{ {


@@ -221,11 +203,7 @@ void Gradient::TickDraw(float deltams)
data->m_vdecl->SetStream(data->m_cbo, attr_col); data->m_vdecl->SetStream(data->m_cbo, attr_col);


/* Draw arrays */ /* Draw arrays */
#if defined _XBOX || defined USE_D3D9
g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
#else
glDrawArrays(GL_TRIANGLES, 0, 6);
#endif
data->m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 2);
} }


Gradient::~Gradient() Gradient::~Gradient()


+ 6
- 16
src/scene.cpp View File

@@ -110,6 +110,7 @@ Scene::~Scene()
delete data->bufs[i]; delete data->bufs[i];
free(data->bufs); free(data->bufs);
#endif #endif
delete data->m_vdecl;
delete data; delete data;
} }


@@ -326,10 +327,7 @@ void Scene::Render() // XXX: rename to Blit()
uni_mat = stdshader->GetUniformLocation("model_matrix"); uni_mat = stdshader->GetUniformLocation("model_matrix");
stdshader->SetUniform(uni_mat, data->model_matrix); stdshader->SetUniform(uni_mat, data->model_matrix);


data->m_vdecl->Bind();
#if defined USE_D3D9 || defined _XBOX #if defined USE_D3D9 || defined _XBOX
//g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
#else #else
uni_tex = stdshader->GetUniformLocation("in_Texture"); uni_tex = stdshader->GetUniformLocation("in_Texture");
stdshader->SetUniform(uni_tex, 0); stdshader->SetUniform(uni_tex, 0);
@@ -389,24 +387,16 @@ void Scene::Render() // XXX: rename to Blit()
data->tiles[i].tileset->Bind(); data->tiles[i].tileset->Bind();


/* Bind vertex and texture coordinate buffers */ /* Bind vertex and texture coordinate buffers */
data->m_vdecl->Bind();
data->m_vdecl->SetStream(data->bufs[buf], attr_pos); data->m_vdecl->SetStream(data->bufs[buf], attr_pos);
data->m_vdecl->SetStream(data->bufs[buf + 1], attr_tex); data->m_vdecl->SetStream(data->bufs[buf + 1], attr_tex);


/* Draw arrays */ /* Draw arrays */
#if defined USE_D3D9 || defined _XBOX
g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, (n - i) * 2);
#else
glDrawArrays(GL_TRIANGLES, 0, (n - i) * 6);

# if defined HAVE_GL_2X && !defined __APPLE__
//glBindVertexArray(0);
# endif
# if !defined __CELLOS_LV2__ // Use cgGLEnableClientState etc.
# else
//glDisableClientState(GL_VERTEX_ARRAY);
//glDisableClientState(GL_TEXTURE_COORD_ARRAY);
# endif
#if 0
data->m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, (n - i) * 2);
#endif #endif
data->m_vdecl->Unbind();
data->tiles[i].tileset->Unbind();
} }


free(data->tiles); free(data->tiles);


+ 10
- 0
src/tileset.cpp View File

@@ -237,6 +237,16 @@ void TileSet::Bind()
} }
} }


void TileSet::Unbind()
{
#if defined USE_D3D9 || defined _XBOX
g_d3ddevice->SetTexture(0, NULL);
#else
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);
#endif
}

void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale,
float *vertex, float *texture) float *vertex, float *texture)
{ {


+ 1
- 0
src/tileset.h View File

@@ -44,6 +44,7 @@ public:
ivec2 GetCount() const; ivec2 GetCount() const;
ivec2 GetSize(int tileid) const; ivec2 GetSize(int tileid) const;
void Bind(); void Bind();
void Unbind();
void BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, void BlitTile(uint32_t id, vec3 pos, int o, vec2 scale,
float *vertex, float *texture); float *vertex, float *texture);




+ 4
- 3
src/video.cpp View File

@@ -14,13 +14,14 @@


#include <cmath> #include <cmath>


#if defined USE_D3D9
# include <d3d9.h>
#elif defined _XBOX
#if defined _XBOX
# include <xtl.h> # include <xtl.h>
# undef near /* Fuck Microsoft */ # undef near /* Fuck Microsoft */
# undef far /* Fuck Microsoft again */ # undef far /* Fuck Microsoft again */
#elif defined _WIN32 #elif defined _WIN32
# if defined USE_D3D9
# include <d3d9.h>
# endif
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
# include <windows.h> # include <windows.h>
# undef near /* Fuck Microsoft */ # undef near /* Fuck Microsoft */


+ 1
- 0
test/tutorial/tut02.cpp View File

@@ -204,6 +204,7 @@ public:
glVertexPointer(3, GL_FLOAT, 0, m_vertices); glVertexPointer(3, GL_FLOAT, 0, m_vertices);
glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_VERTEX_ARRAY);
#endif #endif
m_vdecl->Unbind();
} }


private: private:


Loading…
Cancel
Save