works on the Xbox.legacy
@@ -150,7 +150,7 @@ Shader::Shader(char const *vert, char const *frag) | |||||
data->frag_crc = Hash::Crc32(frag); | data->frag_crc = Hash::Crc32(frag); | ||||
#if defined _XBOX | #if defined _XBOX | ||||
hr = D3DXCompileShader(frag, (UINT)strlen(frag), NULL, NULL, "main", | hr = D3DXCompileShader(frag, (UINT)strlen(frag), NULL, NULL, "main", | ||||
"vs_2_0", 0, &shader_code, &error_msg, | |||||
"ps_2_0", 0, &shader_code, &error_msg, | |||||
&data->frag_table); | &data->frag_table); | ||||
if (FAILED(hr)) | if (FAILED(hr)) | ||||
{ | { | ||||
@@ -199,13 +199,8 @@ Shader::Shader(char const *vert, char const *frag) | |||||
int Shader::GetAttribLocation(char const *attr) const | int Shader::GetAttribLocation(char const *attr) const | ||||
{ | { | ||||
#if defined _XBOX | #if defined _XBOX | ||||
D3DXHANDLE hr = data->frag_table->GetConstantByName(NULL, attr); | |||||
if (FAILED(hr)) | |||||
return -1; | |||||
UINT count; | |||||
D3DXCONSTANT_DESC desc; | |||||
data->frag_table->GetConstantDesc(hr, &desc, &count); | |||||
return desc.RegisterIndex; | |||||
/* FIXME: do we have attribs? */ | |||||
return 0; | |||||
#elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
return glGetAttribLocation(data->prog_id, attr); | return glGetAttribLocation(data->prog_id, attr); | ||||
#else | #else | ||||
@@ -217,13 +212,9 @@ int Shader::GetAttribLocation(char const *attr) const | |||||
int Shader::GetUniformLocation(char const *uni) const | int Shader::GetUniformLocation(char const *uni) const | ||||
{ | { | ||||
#if defined _XBOX | #if defined _XBOX | ||||
D3DXHANDLE hr = data->frag_table->GetConstantByName(NULL, uni); | |||||
if (FAILED(hr)) | |||||
return -1; | |||||
UINT count; | |||||
D3DXCONSTANT_DESC desc; | |||||
data->frag_table->GetConstantDesc(hr, &desc, &count); | |||||
return desc.RegisterIndex; | |||||
D3DXHANDLE hr1 = data->frag_table->GetConstantByName(NULL, uni); | |||||
D3DXHANDLE hr2 = data->vert_table->GetConstantByName(NULL, uni); | |||||
return (int)(((uint32_t)hr1 << 16) | (uint32_t)hr2); | |||||
#elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
return glGetUniformLocation(data->prog_id, uni); | return glGetUniformLocation(data->prog_id, uni); | ||||
#else | #else | ||||
@@ -239,9 +230,7 @@ int Shader::GetUniformLocation(char const *uni) const | |||||
void Shader::SetUniform(int uni, float f) | void Shader::SetUniform(int uni, float f) | ||||
{ | { | ||||
#if defined _XBOX | #if defined _XBOX | ||||
extern D3DDevice *g_d3ddevice; | |||||
vec4 tmp(f, 0.0f, 0.0f, 0.0f); | |||||
g_d3ddevice->SetPixelShaderConstantF(uni, &tmp[0], 1); | |||||
SetUniform(uni, vec4(f, 0, 0, 0)); | |||||
#elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
glUniform1f(uni, f); | glUniform1f(uni, f); | ||||
#else | #else | ||||
@@ -252,9 +241,7 @@ void Shader::SetUniform(int uni, float f) | |||||
void Shader::SetUniform(int uni, vec2 const &v) | void Shader::SetUniform(int uni, vec2 const &v) | ||||
{ | { | ||||
#if defined _XBOX | #if defined _XBOX | ||||
extern D3DDevice *g_d3ddevice; | |||||
vec4 tmp(v, 0.0f, 0.0f); | |||||
g_d3ddevice->SetPixelShaderConstantF(uni, &tmp[0], 1); | |||||
SetUniform(uni, vec4(v, 0, 0)); | |||||
#elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
glUniform2f(uni, v.x, v.y); | glUniform2f(uni, v.x, v.y); | ||||
#else | #else | ||||
@@ -265,9 +252,7 @@ void Shader::SetUniform(int uni, vec2 const &v) | |||||
void Shader::SetUniform(int uni, vec3 const &v) | void Shader::SetUniform(int uni, vec3 const &v) | ||||
{ | { | ||||
#if defined _XBOX | #if defined _XBOX | ||||
extern D3DDevice *g_d3ddevice; | |||||
vec4 tmp(v, 0.0f); | |||||
g_d3ddevice->SetPixelShaderConstantF(uni, &tmp[0], 1); | |||||
SetUniform(uni, vec4(v, 0)); | |||||
#elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
glUniform3f(uni, v.x, v.y, v.z); | glUniform3f(uni, v.x, v.y, v.z); | ||||
#else | #else | ||||
@@ -280,7 +265,10 @@ void Shader::SetUniform(int uni, vec4 const &v) | |||||
/* FIXME: use the array versions of these functions */ | /* FIXME: use the array versions of these functions */ | ||||
#if defined _XBOX | #if defined _XBOX | ||||
extern D3DDevice *g_d3ddevice; | extern D3DDevice *g_d3ddevice; | ||||
g_d3ddevice->SetPixelShaderConstantF(uni, &v[0], 1); | |||||
D3DXHANDLE hr1 = (uint32_t)uni >> 16; | |||||
D3DXHANDLE hr2 = (uint32_t)(uint16_t)uni; | |||||
g_d3ddevice->SetPixelShaderConstantF(hr1, &v[0], 1); | |||||
g_d3ddevice->SetVertexShaderConstantF(hr2, &v[0], 1); | |||||
#elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
glUniform4f(uni, v.x, v.y, v.z, v.w); | glUniform4f(uni, v.x, v.y, v.z, v.w); | ||||
#else | #else | ||||
@@ -292,7 +280,10 @@ void Shader::SetUniform(int uni, mat4 const &m) | |||||
{ | { | ||||
#if defined _XBOX | #if defined _XBOX | ||||
extern D3DDevice *g_d3ddevice; | extern D3DDevice *g_d3ddevice; | ||||
g_d3ddevice->SetPixelShaderConstantF(uni, &m[0][0], 4); | |||||
D3DXHANDLE hr1 = (uint32_t)uni >> 16; | |||||
D3DXHANDLE hr2 = (uint32_t)(uint16_t)uni; | |||||
g_d3ddevice->SetPixelShaderConstantF(hr1, &m[0][0], 4); | |||||
g_d3ddevice->SetVertexShaderConstantF(hr2, &m[0][0], 4); | |||||
#elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
glUniformMatrix4fv(uni, 1, GL_FALSE, &m[0][0]); | glUniformMatrix4fv(uni, 1, GL_FALSE, &m[0][0]); | ||||
#else | #else | ||||
@@ -44,6 +44,8 @@ XboxApp::XboxApp(char const *title, ivec2 res, float fps) : | |||||
data(new XboxAppData()) | data(new XboxAppData()) | ||||
{ | { | ||||
#if defined _XBOX | #if defined _XBOX | ||||
Ticker::Setup(fps); | |||||
Video::Setup(res); | |||||
#endif | #endif | ||||
} | } | ||||
@@ -143,6 +143,7 @@ void Scene::Reset() | |||||
void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o) | void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o) | ||||
{ | { | ||||
#if !defined _XBOX /* No WPOS on Xbox */ | |||||
if ((data->ntiles % 1024) == 0) | if ((data->ntiles % 1024) == 0) | ||||
data->tiles = (Tile *)realloc(data->tiles, | data->tiles = (Tile *)realloc(data->tiles, | ||||
(data->ntiles + 1024) * sizeof(Tile)); | (data->ntiles + 1024) * sizeof(Tile)); | ||||
@@ -153,10 +154,12 @@ void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o) | |||||
data->tiles[data->ntiles].pos = pos; | data->tiles[data->ntiles].pos = pos; | ||||
data->tiles[data->ntiles].o = o; | data->tiles[data->ntiles].o = o; | ||||
data->ntiles++; | data->ntiles++; | ||||
#endif | |||||
} | } | ||||
void Scene::Render() // XXX: rename to Blit() | void Scene::Render() // XXX: rename to Blit() | ||||
{ | { | ||||
#if !defined _XBOX /* No WPOS on Xbox */ | |||||
if (!stdshader) | if (!stdshader) | ||||
{ | { | ||||
#if !defined _XBOX && !defined __CELLOS_LV2__ | #if !defined _XBOX && !defined __CELLOS_LV2__ | ||||
@@ -483,6 +486,7 @@ void Scene::Render() // XXX: rename to Blit() | |||||
#endif | #endif | ||||
glDisable(GL_BLEND); | glDisable(GL_BLEND); | ||||
#endif | #endif | ||||
#endif /* _XBOX */ | |||||
} | } | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
@@ -94,9 +94,9 @@ void Video::Setup(ivec2 size) | |||||
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; | d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; | ||||
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; | d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; | ||||
if (!VideoData::d3d_ctx->CreateDevice(0, D3DDEVTYPE_HAL, NULL, | |||||
D3DCREATE_HARDWARE_VERTEXPROCESSING, | |||||
&d3dpp, &VideoData::d3d_dev)) | |||||
if (FAILED(VideoData::d3d_ctx->CreateDevice(0, D3DDEVTYPE_HAL, NULL, | |||||
D3DCREATE_HARDWARE_VERTEXPROCESSING, | |||||
&d3dpp, &VideoData::d3d_dev))) | |||||
{ | { | ||||
Log::Error("cannot create D3D device\n"); | Log::Error("cannot create D3D device\n"); | ||||
exit(EXIT_FAILURE); | exit(EXIT_FAILURE); | ||||
@@ -38,8 +38,13 @@ public: | |||||
Triangle() | Triangle() | ||||
{ | { | ||||
m_vertices[0] = vec2( 0.0, 0.8); | m_vertices[0] = vec2( 0.0, 0.8); | ||||
#if defined _XBOX | |||||
m_vertices[2] = vec2(-0.8, -0.8); | |||||
m_vertices[1] = vec2( 0.8, -0.8); | |||||
#else | |||||
m_vertices[1] = vec2(-0.8, -0.8); | m_vertices[1] = vec2(-0.8, -0.8); | ||||
m_vertices[2] = vec2( 0.8, -0.8); | m_vertices[2] = vec2( 0.8, -0.8); | ||||
#endif | |||||
m_ready = false; | m_ready = false; | ||||
} | } | ||||
@@ -59,9 +64,10 @@ public: | |||||
"#version 120\n" | "#version 120\n" | ||||
"void main(void) {" | "void main(void) {" | ||||
" gl_FragColor[0] = 0.0;" | |||||
" gl_FragColor[1] = 0.0;" | |||||
" gl_FragColor[2] = 1.0;" | |||||
" gl_FragColor.r = 1.0;" | |||||
" gl_FragColor.g = 1.0;" | |||||
" gl_FragColor.b = 0.0;" | |||||
" gl_FragColor.a = 1.0;" | |||||
"}" | "}" | ||||
#else | #else | ||||
"void main(float2 coord2d : POSITION," | "void main(float2 coord2d : POSITION," | ||||
@@ -70,9 +76,10 @@ public: | |||||
"}", | "}", | ||||
"void main(out float4 out_FragColor : COLOR) {" | "void main(out float4 out_FragColor : COLOR) {" | ||||
" out_FragColor[0] = 0.0;" | |||||
" out_FragColor[0] = 0.0;" | |||||
" out_FragColor[0] = 1.0;" | |||||
" out_FragColor.r = 1.0;" | |||||
" out_FragColor.g = 1.0;" | |||||
" out_FragColor.b = 0.0;" | |||||
" out_FragColor.a = 0.0;" | |||||
"}" | "}" | ||||
#endif | #endif | ||||
); | ); | ||||
@@ -89,16 +96,18 @@ public: | |||||
/* Method 2: upload vertex information at each frame */ | /* Method 2: upload vertex information at each frame */ | ||||
#elif defined _XBOX | #elif defined _XBOX | ||||
extern D3DDevice *g_d3ddevice; | extern D3DDevice *g_d3ddevice; | ||||
D3DVERTEXELEMENT9 const elements[3] = | |||||
D3DVERTEXELEMENT9 const elements[2] = | |||||
{ | { | ||||
{ 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, | { 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, | ||||
D3DDECL_END() | D3DDECL_END() | ||||
}; | }; | ||||
g_d3ddevice->CreateVertexDeclaration(elements, &m_vdecl); | g_d3ddevice->CreateVertexDeclaration(elements, &m_vdecl); | ||||
g_d3ddevice->CreateVertexBuffer(sizeof(m_vertices), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_vbo, NULL); | |||||
if (FAILED(g_d3ddevice->CreateVertexBuffer(sizeof(m_vertices), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_vbo, NULL))) | |||||
exit(0); | |||||
vec2 *vertices; | vec2 *vertices; | ||||
m_vbo->Lock(0, 0, (void **)&vertices, 0); | |||||
if (FAILED(m_vbo->Lock(0, 0, (void **)&vertices, 0))) | |||||
exit(0); | |||||
memcpy(vertices, m_vertices, sizeof(m_vertices)); | memcpy(vertices, m_vertices, sizeof(m_vertices)); | ||||
m_vbo->Unlock(); | m_vbo->Unlock(); | ||||
#else | #else | ||||