@@ -428,6 +428,22 @@ void Shader::Bind() const | |||||
#endif | #endif | ||||
} | } | ||||
void Shader::Unbind() const | |||||
{ | |||||
#if defined USE_D3D9 || defined _XBOX | |||||
HRESULT hr; | |||||
hr = g_d3ddevice->SetVertexShader(NULL); | |||||
hr = g_d3ddevice->SetPixelShader(NULL); | |||||
#elif !defined __CELLOS_LV2__ | |||||
/* FIXME: untested */ | |||||
glUseProgram(0); | |||||
#else | |||||
/* FIXME: untested */ | |||||
cgGLDisableProfile(cgGLGetLatestProfile(CG_GL_VERTEX)); | |||||
cgGLDisableProfile(cgGLGetLatestProfile(CG_GL_FRAGMENT)); | |||||
#endif | |||||
} | |||||
Shader::~Shader() | Shader::~Shader() | ||||
{ | { | ||||
#if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
@@ -69,6 +69,7 @@ public: | |||||
void SetUniform(ShaderUniform const &uni, mat4 const &m); | void SetUniform(ShaderUniform const &uni, mat4 const &m); | ||||
void Bind() const; | void Bind() const; | ||||
void Unbind() const; | |||||
protected: | protected: | ||||
Shader(char const *vert, char const *frag); | Shader(char const *vert, char const *frag); | ||||
@@ -145,7 +145,16 @@ void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) | |||||
void VertexDeclaration::Unbind() | void VertexDeclaration::Unbind() | ||||
{ | { | ||||
#if defined _XBOX || defined USE_D3D9 | #if defined _XBOX || defined USE_D3D9 | ||||
/* FIXME: Nothing to do? */ | |||||
int stream = -1; | |||||
for (int i = 0; i < m_count; i++) | |||||
if (m_streams[i].index != stream) | |||||
{ | |||||
stream = m_streams[i].index; | |||||
if (FAILED(g_d3ddevice->SetStreamSource(stream, 0, 0, 0))) | |||||
Abort(); | |||||
} | |||||
if (FAILED(g_d3ddevice->SetVertexDeclaration(NULL))) | |||||
Abort(); | |||||
#else | #else | ||||
/* FIXME: we need to unbind what we bound */ | /* FIXME: we need to unbind what we bound */ | ||||
//glDisableVertexAttribArray(m_attrib); | //glDisableVertexAttribArray(m_attrib); | ||||
@@ -297,7 +306,11 @@ void VertexDeclaration::Initialize() | |||||
D3DDECLUSAGE_TANGENT, | D3DDECLUSAGE_TANGENT, | ||||
D3DDECLUSAGE_BINORMAL, | D3DDECLUSAGE_BINORMAL, | ||||
D3DDECLUSAGE_TESSFACTOR, | D3DDECLUSAGE_TESSFACTOR, | ||||
#if defined _XBOX | |||||
D3DDECLUSAGE_TEXCOORD, /* FIXME: nonexistent */ | |||||
#else | |||||
D3DDECLUSAGE_POSITIONT, | D3DDECLUSAGE_POSITIONT, | ||||
#endif | |||||
D3DDECLUSAGE_COLOR, | D3DDECLUSAGE_COLOR, | ||||
D3DDECLUSAGE_FOG, | D3DDECLUSAGE_FOG, | ||||
D3DDECLUSAGE_DEPTH, | D3DDECLUSAGE_DEPTH, | ||||
@@ -102,16 +102,20 @@ void SdlApp::Run() | |||||
while (!Ticker::Finished()) | while (!Ticker::Finished()) | ||||
{ | { | ||||
#if defined USE_SDL && defined USE_D3D9 | #if defined USE_SDL && defined USE_D3D9 | ||||
if (FAILED(g_d3ddevice->BeginScene())) | |||||
HRESULT hr; | |||||
hr = g_d3ddevice->BeginScene(); | |||||
if (FAILED(hr)) | |||||
Abort(); | Abort(); | ||||
#endif | #endif | ||||
/* Tick the renderer, show the frame and clamp to desired framerate. */ | /* Tick the renderer, show the frame and clamp to desired framerate. */ | ||||
Ticker::TickDraw(); | Ticker::TickDraw(); | ||||
#if defined USE_SDL | #if defined USE_SDL | ||||
# if defined USE_D3D9 | # if defined USE_D3D9 | ||||
if (FAILED(g_d3ddevice->EndScene())) | |||||
hr = g_d3ddevice->EndScene(); | |||||
if (FAILED(hr)) | |||||
Abort(); | Abort(); | ||||
if (FAILED(g_d3ddevice->Present(NULL, NULL, NULL, NULL))) | |||||
hr = g_d3ddevice->Present(NULL, NULL, NULL, NULL); | |||||
if (FAILED(hr)) | |||||
Abort(); | Abort(); | ||||
# else | # else | ||||
SDL_GL_SwapBuffers(); | SDL_GL_SwapBuffers(); | ||||
@@ -385,6 +385,8 @@ void Scene::Render() // XXX: rename to Blit() | |||||
data->tiles = 0; | data->tiles = 0; | ||||
data->ntiles = 0; | data->ntiles = 0; | ||||
stdshader->Unbind(); | |||||
#if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
/* TODO */ | /* TODO */ | ||||
#else | #else | ||||
@@ -142,7 +142,7 @@ void TileSet::TickDraw(float deltams) | |||||
#if defined USE_D3D9 | #if defined USE_D3D9 | ||||
format = D3DFMT_R8G8B8; | format = D3DFMT_R8G8B8; | ||||
#elif defined _XBOX | #elif defined _XBOX | ||||
format = D3DFMT_LIN_R8G8B8; /* FIXME */ | |||||
format = D3DFMT_LIN_A8R8G8B8; /* FIXME */ | |||||
#else | #else | ||||
format = GL_RGB; | format = GL_RGB; | ||||
#endif | #endif | ||||
@@ -153,6 +153,7 @@ void TileSet::TickDraw(float deltams) | |||||
#if defined USE_D3D9 | #if defined USE_D3D9 | ||||
format = D3DFMT_A8R8G8B8; | format = D3DFMT_A8R8G8B8; | ||||
#elif defined _XBOX | #elif defined _XBOX | ||||
/* By default the X360 will swizzle the texture. Ask for linear. */ | |||||
format = D3DFMT_LIN_A8R8G8B8; | format = D3DFMT_LIN_A8R8G8B8; | ||||
#else | #else | ||||
format = GL_RGBA; | format = GL_RGBA; | ||||
@@ -177,19 +178,28 @@ void TileSet::TickDraw(float deltams) | |||||
#if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
D3DLOCKED_RECT rect; | D3DLOCKED_RECT rect; | ||||
HRESULT hr; | |||||
# if defined USE_D3D9 | # if defined USE_D3D9 | ||||
g_d3ddevice->CreateTexture(w, h, 1, D3DUSAGE_DYNAMIC, format, | |||||
D3DPOOL_SYSTEMMEM, &data->m_tex, NULL); | |||||
data->m_tex->LockRect(0, &rect, NULL, D3DLOCK_DISCARD | D3DLOCK_NOOVERWRITE); | |||||
hr = g_d3ddevice->CreateTexture(w, h, 1, D3DUSAGE_DYNAMIC, format, | |||||
D3DPOOL_DEFAULT, &data->m_tex, NULL); | |||||
# elif defined _XBOX | # elif defined _XBOX | ||||
/* By default the X360 will swizzle the texture. Ask for linear. */ | |||||
g_d3ddevice->CreateTexture(w, h, 1, D3DUSAGE_WRITEONLY, format, | |||||
D3DPOOL_DEFAULT, &data->m_tex, NULL); | |||||
data->m_tex->LockRect(0, &rect, NULL, D3DLOCK_NOOVERWRITE); | |||||
hr = g_d3ddevice->CreateTexture(w, h, 1, D3DUSAGE_WRITEONLY, format, | |||||
D3DPOOL_DEFAULT, &data->m_tex, NULL); | |||||
# endif | # endif | ||||
if (FAILED(hr)) | |||||
Abort(); | |||||
# if defined USE_D3D9 | |||||
hr = data->m_tex->LockRect(0, &rect, NULL, D3DLOCK_DISCARD); | |||||
# else | |||||
hr = data->m_tex->LockRect(0, &rect, NULL, 0); | |||||
# endif | |||||
if (FAILED(hr)) | |||||
Abort(); | |||||
for (int j = 0; j < h; j++) | for (int j = 0; j < h; j++) | ||||
memcpy((uint8_t *)rect.pBits + j * rect.Pitch, pixels + w * j * 4, w * 4); | memcpy((uint8_t *)rect.pBits + j * rect.Pitch, pixels + w * j * 4, w * 4); | ||||
data->m_tex->UnlockRect(0); | |||||
hr = data->m_tex->UnlockRect(0); | |||||
if (FAILED(hr)) | |||||
Abort(); | |||||
#else | #else | ||||
glGenTextures(1, &data->m_tex); | glGenTextures(1, &data->m_tex); | ||||
glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
@@ -229,7 +239,9 @@ void TileSet::Bind() | |||||
if (!data->img && data->m_tex) | if (!data->img && data->m_tex) | ||||
{ | { | ||||
#if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
g_d3ddevice->SetTexture(0, data->m_tex); | |||||
HRESULT hr = g_d3ddevice->SetTexture(0, data->m_tex); | |||||
if (FAILED(hr)) | |||||
Abort(); | |||||
#else | #else | ||||
glActiveTexture(GL_TEXTURE0); | glActiveTexture(GL_TEXTURE0); | ||||
glBindTexture(GL_TEXTURE_2D, data->m_tex); | glBindTexture(GL_TEXTURE_2D, data->m_tex); | ||||
@@ -239,12 +251,17 @@ void TileSet::Bind() | |||||
void TileSet::Unbind() | void TileSet::Unbind() | ||||
{ | { | ||||
if (!data->img && data->m_tex) | |||||
{ | |||||
#if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
g_d3ddevice->SetTexture(0, NULL); | |||||
HRESULT hr = g_d3ddevice->SetTexture(0, NULL); | |||||
if (FAILED(hr)) | |||||
Abort(); | |||||
#else | #else | ||||
glActiveTexture(GL_TEXTURE0); | |||||
glBindTexture(GL_TEXTURE_2D, 0); | |||||
glActiveTexture(GL_TEXTURE0); | |||||
glBindTexture(GL_TEXTURE_2D, 0); | |||||
#endif | #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, | ||||
@@ -178,7 +178,7 @@ public: | |||||
Abort(); | Abort(); | ||||
if (FAILED(g_d3ddevice->SetIndices(m_ibo))) | if (FAILED(g_d3ddevice->SetIndices(m_ibo))) | ||||
Abort(); | Abort(); | ||||
if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 0, 0, sizeof(m_indices) / sizeof(*m_indices)))) | |||||
if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, sizeof(m_indices) / sizeof(*m_indices)))) | |||||
Abort(); | Abort(); | ||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | ||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); | glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); | ||||