| @@ -12,7 +12,7 @@ | |||
| # include "config.h" | |||
| #endif | |||
| #if !defined USE_D3D9 && !defined _XBOX /* This file is meaningless on Xbox */ | |||
| #if 0 | |||
| #if defined WIN32 && !_XBOX | |||
| # define _USE_MATH_DEFINES /* for M_PI */ | |||
| @@ -1119,4 +1119,4 @@ void DebugQuad::ResetState() | |||
| } /* namespace lol */ | |||
| #endif /* !defined _XBOX */ | |||
| #endif /* 0 */ | |||
| @@ -235,13 +235,14 @@ ShaderAttrib Shader::GetAttribLocation(char const *attr, | |||
| VertexUsage usage, int index) const | |||
| { | |||
| ShaderAttrib ret; | |||
| ret.m_flags = (uint64_t)(uint16_t)usage << 16; | |||
| ret.m_flags |= (uint64_t)(uint16_t)index; | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| ret.m_flags = (uint32_t)index << 16; | |||
| ret.m_flags |= (uint32_t)usage; | |||
| #elif !defined __CELLOS_LV2__ | |||
| ret.m_flags = glGetAttribLocation(data->prog_id, attr); | |||
| ret.m_flags |= (uint64_t) | |||
| (uint32_t)glGetAttribLocation(data->prog_id, attr) << 32; | |||
| #else | |||
| /* FIXME: can we do this at all? */ | |||
| /* FIXME: can we do this at all on the PS3? */ | |||
| #endif | |||
| return ret; | |||
| } | |||
| @@ -26,7 +26,7 @@ struct ShaderUniform | |||
| friend class Shader; | |||
| public: | |||
| ShaderUniform() : flags(0) {} | |||
| inline ShaderUniform() : flags(0) {} | |||
| private: | |||
| uintptr_t frag, vert; | |||
| @@ -40,10 +40,10 @@ struct ShaderAttrib | |||
| friend class VertexDeclaration; | |||
| public: | |||
| ShaderAttrib(int flags = 0xffffffff) : m_flags(flags) {} | |||
| inline ShaderAttrib() : m_flags((uint64_t)0 - 1) {} | |||
| private: | |||
| uint32_t m_flags; | |||
| uint64_t m_flags; | |||
| }; | |||
| class ShaderData; | |||
| @@ -114,7 +114,19 @@ void VertexDeclaration::Bind() | |||
| g_d3ddevice->SetVertexDeclaration(vdecl); | |||
| #else | |||
| /* FIXME: Nothing to do? */ | |||
| #endif | |||
| } | |||
| void VertexDeclaration::Unbind() | |||
| { | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| /* FIXME: Nothing to do? */ | |||
| #else | |||
| /* FIXME: we need to record what happens */ | |||
| //glDisableVertexAttribArray(m_attrib); | |||
| /* FIXME: only useful for VAOs */ | |||
| //glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| #endif | |||
| } | |||
| @@ -135,33 +147,97 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||
| /* Only the first item is required to know which stream this | |||
| * is about; the rest of the information is stored in the | |||
| * vertex declaration already. */ | |||
| uint32_t usage = attr1.m_flags >> 16; | |||
| uint32_t usage = (attr1.m_flags >> 16) & 0xffff; | |||
| uint32_t index = attr1.m_flags & 0xffff; | |||
| int usage_index = 0, stream = -1, stride = 0; | |||
| /* Find the stream number */ | |||
| int usage_index = 0, stream = -1; | |||
| for (int i = 0; i < m_count; i++) | |||
| { | |||
| if (m_streams[i].usage == usage) | |||
| if (usage_index++ == index) | |||
| { | |||
| stream = m_streams[i].index; | |||
| break; | |||
| } | |||
| /* Compute this stream's stride */ | |||
| int stride = 0; | |||
| for (int i = 0; i < m_count; i++) | |||
| if (stream == m_streams[i].index) | |||
| stride += m_streams[i].size; | |||
| } | |||
| /* Now we know the stream index and the element stride */ | |||
| /* FIXME: precompute most of the crap above! */ | |||
| if (stream >= 0) | |||
| g_d3ddevice->SetStreamSource(stream, vb->m_data->m_vbo, 0, stride); | |||
| #else | |||
| glBindBuffer(GL_ARRAY_BUFFER, vb); | |||
| glBindBuffer(GL_ARRAY_BUFFER, vb->m_data->m_vbo); | |||
| ShaderAttrib l[12] = { attr1, attr2, attr3, attr4, attr5, attr6, | |||
| attr7, attr8, attr9, attr10, attr11, attr12 }; | |||
| for (int i = 0; i < 12 && l[i].m_flags != 0xffffffff; i++) | |||
| for (int n = 0; n < 12 && l[n].m_flags != (uint64_t)0 - 1; n++) | |||
| { | |||
| uint32_t usage = l[i].m_flags >> 16; | |||
| uint32_t index = l[i].m_flags & 0xffff; | |||
| glEnableVertexAttribArray((GLint)attr.flags); | |||
| /* FIXME: Hardcoded!! Where to get that from? */ | |||
| glVertexAttribPointer((GLint)attr.flags, 3, GL_FLOAT, GL_FALSE, 0, 0); | |||
| uint32_t reg = l[n].m_flags >> 32; | |||
| uint32_t usage = (l[n].m_flags >> 16) & 0xffff; | |||
| uint32_t index = l[n].m_flags & 0xffff; | |||
| glEnableVertexAttribArray((GLint)reg); | |||
| /* We need to parse the whole vertex declaration to retrieve | |||
| * the information. It sucks. */ | |||
| int attr_index = 0, usage_index = 0, stream = -1; | |||
| /* First, find the stream index */ | |||
| for (; attr_index < m_count; attr_index++) | |||
| if (m_streams[attr_index].usage == usage) | |||
| if (usage_index++ == index) | |||
| { | |||
| stream = m_streams[attr_index].index; | |||
| break; | |||
| } | |||
| /* Now compute the stride and offset up to this stream index */ | |||
| int stride = 0, offset = 0; | |||
| for (int i = 0; i < m_count; i++) | |||
| if (m_streams[i].index == m_streams[attr_index].index) | |||
| { | |||
| stride += m_streams[i].size; | |||
| if (i < attr_index) | |||
| offset += m_streams[i].size; | |||
| } | |||
| /* Finally, we need to retrieve the type of the data */ | |||
| static struct { GLint size; GLenum type; } const tlut[] = | |||
| { | |||
| { 0, 0 }, | |||
| { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, /* half */ | |||
| { 1, GL_FLOAT }, { 2, GL_FLOAT }, { 3, GL_FLOAT }, | |||
| { 4, GL_FLOAT }, /* float */ | |||
| { 1, GL_DOUBLE }, { 2, GL_DOUBLE }, { 3, GL_DOUBLE }, | |||
| { 4, GL_DOUBLE }, /* double */ | |||
| { 1, GL_BYTE }, { 2, GL_BYTE }, { 3, GL_BYTE }, | |||
| { 4, GL_BYTE }, /* int8_t */ | |||
| { 1, GL_UNSIGNED_BYTE }, { 2, GL_UNSIGNED_BYTE }, | |||
| { 3, GL_UNSIGNED_BYTE }, { 4, GL_UNSIGNED_BYTE }, /* uint8_t */ | |||
| { 1, GL_SHORT }, { 2, GL_SHORT }, { 3, GL_SHORT }, | |||
| { 4, GL_SHORT }, /* int16_t */ | |||
| { 1, GL_UNSIGNED_SHORT }, { 2, GL_UNSIGNED_SHORT }, { 3, | |||
| GL_UNSIGNED_SHORT }, { 4, GL_UNSIGNED_SHORT }, /* uint16_t */ | |||
| { 1, GL_INT }, { 2, GL_INT }, { 3, GL_INT }, | |||
| { 4, GL_INT }, /* int32_t */ | |||
| { 1, GL_UNSIGNED_INT }, { 2, GL_UNSIGNED_INT }, | |||
| { 3, GL_UNSIGNED_INT }, { 4, GL_UNSIGNED_INT }, /* uint32_t */ | |||
| }; | |||
| int type_index = m_streams[attr_index].stream_type; | |||
| if (type_index < 0 || type_index >= sizeof(tlut) / sizeof(*tlut)) | |||
| type_index = 0; | |||
| Log::Error("Size %d Type %d Stride %d offset %d\n", tlut[type_index].size, | |||
| tlut[type_index].type,stride,offset); | |||
| glVertexAttribPointer((GLint)reg, tlut[type_index].size, | |||
| tlut[type_index].type, GL_FALSE, | |||
| stride, (GLvoid const *)(uintptr_t)offset); | |||
| } | |||
| #endif | |||
| } | |||
| @@ -306,7 +382,7 @@ void VertexBuffer::Unlock() | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| m_data->m_vbo->Unlock(); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||
| glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vbo); | |||
| glBufferData(GL_ARRAY_BUFFER, m_data->m_size, m_data->m_memory, | |||
| GL_STATIC_DRAW); | |||
| #endif | |||
| @@ -164,6 +164,7 @@ public: | |||
| ~VertexDeclaration(); | |||
| void Bind(); | |||
| void Unbind(); | |||
| void SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||
| ShaderAttrib attr2 = ShaderAttrib(), | |||
| ShaderAttrib attr3 = ShaderAttrib(), | |||
| @@ -32,13 +32,8 @@ class GradientData | |||
| private: | |||
| Shader *shader; | |||
| #if !defined USE_D3D9 && !defined _XBOX /* This file is meaningless on Xbox */ | |||
| GLuint bufs[2]; | |||
| #if defined HAVE_GL_2X && !defined __APPLE__ | |||
| GLuint vaos[1]; | |||
| #endif | |||
| #endif | |||
| VertexDeclaration *m_vdecl; | |||
| VertexBuffer *m_vbo, *m_cbo; | |||
| }; | |||
| /* | |||
| @@ -65,10 +60,23 @@ void Gradient::TickDraw(float deltams) | |||
| { | |||
| Entity::TickDraw(deltams); | |||
| #if !defined USE_D3D9 && !defined _XBOX /* This file is meaningless on Xbox */ | |||
| float const vertex[] = { 0.0f, 0.0f, 0.0f, | |||
| 640.0f, 0.0f, 0.0f, | |||
| 0.0f, 480.0f, 0.0f, | |||
| 0.0f, 480.0f, 0.0f, | |||
| 640.0f, 480.0f, 0.0f, | |||
| 640.0f, 0.0f, 0.0f, }; | |||
| float const color[] = { 0.73f, 0.85f, 0.85f, 1.0f, | |||
| 0.73f, 0.85f, 0.85f, 1.0f, | |||
| 0.0f, 0.0f, 1.0f, 1.0f, | |||
| 0.0f, 0.0f, 1.0f, 1.0f, | |||
| 0.0f, 0.0f, 1.0f, 1.0f, | |||
| 0.73f, 0.85f, 0.85f, 1.0f, }; | |||
| if (!data->shader) | |||
| { | |||
| #if !defined __CELLOS_LV2__ | |||
| #if !defined __CELLOS_LV2__ && !defined USE_D3D9 && !defined _XBOX | |||
| data->shader = Shader::Create( | |||
| "#version 130\n" | |||
| "\n" | |||
| @@ -156,22 +164,19 @@ void Gradient::TickDraw(float deltams) | |||
| " out_FragColor = col;" | |||
| "}"); | |||
| #endif | |||
| #if !defined __CELLOS_LV2__ | |||
| glGenBuffers(2, data->bufs); | |||
| # if defined HAVE_GL_2X && !defined __APPLE__ | |||
| glGenVertexArrays(1, data->vaos); | |||
| # endif | |||
| #endif | |||
| data->m_vbo = new VertexBuffer(sizeof(vertex)); | |||
| data->m_cbo = new VertexBuffer(sizeof(color)); | |||
| data->m_vdecl = new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | |||
| VertexStream<vec4>(VertexUsage::Color)); | |||
| } | |||
| mat4 model_matrix = mat4(1.0f); | |||
| ShaderUniform uni_mat; | |||
| GLuint attr_pos, attr_col; | |||
| #if !defined __CELLOS_LV2__ | |||
| attr_pos = data->shader->GetAttribLocation("in_Vertex"); | |||
| attr_col = data->shader->GetAttribLocation("in_Color"); | |||
| #endif | |||
| ShaderAttrib attr_pos, attr_col; | |||
| attr_pos = data->shader->GetAttribLocation("in_Vertex", VertexUsage::Position, 0); | |||
| attr_col = data->shader->GetAttribLocation("in_Color", VertexUsage::Color, 0); | |||
| data->shader->Bind(); | |||
| @@ -182,61 +187,23 @@ void Gradient::TickDraw(float deltams) | |||
| uni_mat = data->shader->GetUniformLocation("model_matrix"); | |||
| data->shader->SetUniform(uni_mat, model_matrix); | |||
| float const vertex[] = { 0.0f, 0.0f, 0.0f, | |||
| 640.0f, 0.0f, 0.0f, | |||
| 0.0f, 480.0f, 0.0f, | |||
| 0.0f, 480.0f, 0.0f, | |||
| 640.0f, 480.0f, 0.0f, | |||
| 640.0f, 0.0f, 0.0f, }; | |||
| float const color[] = { 0.73f, 0.85f, 0.85f, 1.0f, | |||
| 0.73f, 0.85f, 0.85f, 1.0f, | |||
| 0.0f, 0.0f, 1.0f, 1.0f, | |||
| 0.0f, 0.0f, 1.0f, 1.0f, | |||
| 0.0f, 0.0f, 1.0f, 1.0f, | |||
| 0.73f, 0.85f, 0.85f, 1.0f, }; | |||
| data->shader->Bind(); | |||
| data->m_vdecl->Bind(); | |||
| /* Bind vertex, color and texture coordinate buffers */ | |||
| #if !defined __CELLOS_LV2__ | |||
| # if defined HAVE_GL_2X && !defined __APPLE__ | |||
| glBindVertexArray(data->vaos[0]); | |||
| # endif | |||
| glEnableVertexAttribArray(attr_pos); | |||
| glEnableVertexAttribArray(attr_col); | |||
| glBindBuffer(GL_ARRAY_BUFFER, data->bufs[0]); | |||
| glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), | |||
| vertex, GL_DYNAMIC_DRAW); | |||
| glVertexAttribPointer(attr_pos, 3, GL_FLOAT, GL_FALSE, 0, 0); | |||
| glBindBuffer(GL_ARRAY_BUFFER, data->bufs[1]); | |||
| glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(GLfloat), | |||
| color, GL_DYNAMIC_DRAW); | |||
| glVertexAttribPointer(attr_col, 4, GL_FLOAT, GL_FALSE, 0, 0); | |||
| #else | |||
| glEnableClientState(GL_VERTEX_ARRAY); | |||
| glEnableClientState(GL_COLOR_ARRAY); | |||
| void *tmp = data->m_vbo->Lock(0, 0); | |||
| memcpy(tmp, vertex, sizeof(vertex)); | |||
| data->m_vbo->Unlock(); | |||
| glVertexPointer(3, GL_FLOAT, 0, vertex); | |||
| glColorPointer(4, GL_FLOAT, 0, color); | |||
| #endif | |||
| tmp = data->m_cbo->Lock(0, 0); | |||
| memcpy(tmp, color, sizeof(color)); | |||
| data->m_cbo->Unlock(); | |||
| /* Bind vertex and color buffers */ | |||
| data->m_vdecl->SetStream(data->m_vbo, attr_pos); | |||
| data->m_vdecl->SetStream(data->m_cbo, attr_col); | |||
| /* Draw arrays */ | |||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||
| #if !defined __CELLOS_LV2__ | |||
| # if defined HAVE_GL_2X && !defined __APPLE__ | |||
| glBindVertexArray(0); | |||
| # endif | |||
| glDisableVertexAttribArray(attr_pos); | |||
| glDisableVertexAttribArray(attr_col); | |||
| #else | |||
| glDisableClientState(GL_VERTEX_ARRAY); | |||
| glDisableClientState(GL_COLOR_ARRAY); | |||
| #endif | |||
| #endif | |||
| } | |||
| Gradient::~Gradient() | |||
| @@ -71,18 +71,8 @@ private: | |||
| int ntiles; | |||
| float angle; | |||
| #if defined USE_D3D9 | |||
| IDirect3DVertexDeclaration9 *m_vdecl; | |||
| IDirect3DVertexBuffer9 **bufs; | |||
| #elif defined _XBOX | |||
| D3DVertexDeclaration *m_vdecl; | |||
| D3DVertexBuffer **bufs; | |||
| #else | |||
| # if defined HAVE_GL_2X && !defined __APPLE__ | |||
| GLuint vao; | |||
| # endif | |||
| GLuint *bufs; | |||
| #endif | |||
| VertexDeclaration *m_vdecl; | |||
| VertexBuffer **bufs; | |||
| int nbufs; | |||
| static Scene *scene; | |||
| @@ -104,19 +94,8 @@ Scene::Scene(float angle) | |||
| data->bufs = 0; | |||
| data->nbufs = 0; | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| D3DVERTEXELEMENT9 const elements[] = | |||
| { | |||
| { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, | |||
| { 1, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, | |||
| D3DDECL_END() | |||
| }; | |||
| g_d3ddevice->CreateVertexDeclaration(elements, &data->m_vdecl); | |||
| #else | |||
| # if defined HAVE_GL_2X && !defined __APPLE__ | |||
| glGenVertexArrays(1, &data->vao); | |||
| # endif | |||
| #endif | |||
| data->m_vdecl = new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | |||
| VertexStream<vec2>(VertexUsage::TexCoord)); | |||
| } | |||
| Scene::~Scene() | |||
| @@ -127,11 +106,8 @@ Scene::~Scene() | |||
| /* FIXME: this must be done while the GL context is still active. | |||
| * Change the code architecture to make sure of that. */ | |||
| /* XXX: The test is necessary because of a crash with PSGL. */ | |||
| if (data->nbufs > 0) | |||
| glDeleteBuffers(data->nbufs, data->bufs); | |||
| # if defined HAVE_GL_2X && !defined __APPLE__ | |||
| glDeleteVertexArrays(1, &data->vao); | |||
| # endif | |||
| for (int i = 0; i < data->nbufs; i++) | |||
| delete data->bufs[i]; | |||
| free(data->bufs); | |||
| #endif | |||
| delete data; | |||
| @@ -337,13 +313,9 @@ void Scene::Render() // XXX: rename to Blit() | |||
| // XXX: end of debug stuff | |||
| ShaderUniform uni_mat, uni_tex; | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| /* Nothing? */ | |||
| #elif !defined __CELLOS_LV2__ | |||
| int attr_pos, attr_tex; | |||
| attr_pos = stdshader->GetAttribLocation("in_Position"); | |||
| attr_tex = stdshader->GetAttribLocation("in_TexCoord"); | |||
| #endif | |||
| ShaderAttrib attr_pos, attr_tex; | |||
| attr_pos = stdshader->GetAttribLocation("in_Position", VertexUsage::Position, 0); | |||
| attr_tex = stdshader->GetAttribLocation("in_TexCoord", VertexUsage::TexCoord, 0); | |||
| stdshader->Bind(); | |||
| @@ -354,10 +326,10 @@ void Scene::Render() // XXX: rename to Blit() | |||
| uni_mat = stdshader->GetUniformLocation("model_matrix"); | |||
| stdshader->SetUniform(uni_mat, data->model_matrix); | |||
| data->m_vdecl->Bind(); | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| //g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | |||
| g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); | |||
| g_d3ddevice->SetVertexDeclaration(data->m_vdecl); | |||
| #else | |||
| uni_tex = stdshader->GetUniformLocation("in_Texture"); | |||
| stdshader->SetUniform(uni_tex, 0); | |||
| @@ -380,23 +352,14 @@ void Scene::Render() // XXX: rename to Blit() | |||
| /* Generate new vertex / texture coord buffers if necessary */ | |||
| if (buf + 2 > data->nbufs) | |||
| { | |||
| #if defined USE_D3D9 | |||
| data->bufs = (IDirect3DVertexBuffer9 **)realloc(data->bufs, (buf + 2) * sizeof(IDirect3DVertexBuffer9 *)); | |||
| #elif defined _XBOX | |||
| data->bufs = (D3DVertexBuffer **)realloc(data->bufs, (buf + 2) * sizeof(D3DVertexBuffer *)); | |||
| #else | |||
| data->bufs = (uint32_t *)realloc(data->bufs, (buf + 2) * sizeof(uint32_t)); | |||
| glGenBuffers(buf + 2 - data->nbufs, data->bufs + data->nbufs); | |||
| #endif | |||
| data->bufs = (VertexBuffer **)realloc(data->bufs, (buf + 2) * sizeof(VertexBuffer *)); | |||
| data->nbufs = buf + 2; | |||
| } | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| else | |||
| { | |||
| data->bufs[buf]->Release(); | |||
| data->bufs[buf + 1]->Release(); | |||
| delete data->bufs[buf]; | |||
| delete data->bufs[buf + 1]; | |||
| } | |||
| #endif | |||
| /* Count how many quads will be needed */ | |||
| for (n = i + 1; n < data->ntiles; n++) | |||
| @@ -404,20 +367,10 @@ void Scene::Render() // XXX: rename to Blit() | |||
| break; | |||
| /* Create a vertex array object */ | |||
| float *vertex, *texture; | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| if (FAILED(g_d3ddevice->CreateVertexBuffer(6 * 3 * (n - i) * sizeof(float), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &data->bufs[buf], NULL))) | |||
| exit(0); | |||
| if (FAILED(data->bufs[buf]->Lock(0, 0, (void **)&vertex, 0))) | |||
| exit(0); | |||
| if (FAILED(g_d3ddevice->CreateVertexBuffer(6 * 2 * (n - i) * sizeof(float), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &data->bufs[buf + 1], NULL))) | |||
| exit(0); | |||
| if (FAILED(data->bufs[buf + 1]->Lock(0, 0, (void **)&texture, 0))) | |||
| exit(0); | |||
| #else | |||
| vertex = (float *)malloc(6 * 3 * (n - i) * sizeof(float)); | |||
| texture = (float *)malloc(6 * 2 * (n - i) * sizeof(float)); | |||
| #endif | |||
| data->bufs[buf] = new VertexBuffer(6 * 3 * (n - i) * sizeof(float)); | |||
| float *vertex = (float *)data->bufs[buf]->Lock(0, 0); | |||
| data->bufs[buf + 1] = new VertexBuffer(6 * 2 * (n - i) * sizeof(float)); | |||
| float *texture = (float *)data->bufs[buf + 1]->Lock(0, 0); | |||
| for (int j = i; j < n; j++) | |||
| { | |||
| @@ -427,62 +380,29 @@ void Scene::Render() // XXX: rename to Blit() | |||
| vertex + 18 * (j - i), texture + 12 * (j - i)); | |||
| } | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| data->bufs[buf]->Unlock(); | |||
| data->bufs[buf + 1]->Unlock(); | |||
| #endif | |||
| stdshader->Bind(); | |||
| /* Bind texture */ | |||
| data->tiles[i].tileset->Bind(); | |||
| /* Bind vertex, color and texture coordinate buffers */ | |||
| /* Bind vertex and texture coordinate buffers */ | |||
| data->m_vdecl->SetStream(data->bufs[buf], attr_pos); | |||
| data->m_vdecl->SetStream(data->bufs[buf + 1], attr_tex); | |||
| /* Draw arrays */ | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| g_d3ddevice->SetStreamSource(0, data->bufs[data->nbufs - 2], 0, 6 * 3 * (n - i) * sizeof(float)); | |||
| g_d3ddevice->SetStreamSource(1, data->bufs[data->nbufs - 1], 0, 6 * 2 * (n - i) * sizeof(float)); | |||
| g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, (n - i) * 6); | |||
| #else | |||
| # if defined HAVE_GL_2X && !defined __APPLE__ | |||
| glBindVertexArray(data->vao); | |||
| # endif | |||
| # if !defined __CELLOS_LV2__ // Use cgGLEnableClientState etc. | |||
| glEnableVertexAttribArray(attr_pos); | |||
| glEnableVertexAttribArray(attr_tex); | |||
| glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf]); | |||
| glBufferData(GL_ARRAY_BUFFER, 18 * (n - i) * sizeof(GLfloat), | |||
| vertex, GL_STATIC_DRAW); | |||
| glVertexAttribPointer(attr_pos, 3, GL_FLOAT, GL_FALSE, 0, 0); | |||
| glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf + 1]); | |||
| glBufferData(GL_ARRAY_BUFFER, 12 * (n - i) * sizeof(GLfloat), | |||
| texture, GL_STATIC_DRAW); | |||
| glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, 0); | |||
| # else | |||
| glEnableClientState(GL_VERTEX_ARRAY); | |||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| glVertexPointer(3, GL_FLOAT, 0, vertex); | |||
| glTexCoordPointer(2, GL_FLOAT, 0, texture); | |||
| # endif | |||
| /* Draw arrays */ | |||
| glDrawArrays(GL_TRIANGLES, 0, (n - i) * 6); | |||
| # if defined HAVE_GL_2X && !defined __APPLE__ | |||
| glBindVertexArray(0); | |||
| # endif | |||
| # if !defined __CELLOS_LV2__ // Use cgGLEnableClientState etc. | |||
| glDisableVertexAttribArray(attr_pos); | |||
| glDisableVertexAttribArray(attr_tex); | |||
| # else | |||
| glDisableClientState(GL_VERTEX_ARRAY); | |||
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| # endif | |||
| free(vertex); | |||
| free(texture); | |||
| #endif | |||
| } | |||
| @@ -33,7 +33,7 @@ int main(int argc, char **argv) | |||
| /* Register some debug stuff */ | |||
| new DebugFps(5, 5); | |||
| new DebugQuad(); | |||
| //new DebugQuad(); | |||
| app.Run(); | |||
| @@ -126,11 +126,12 @@ public: | |||
| glDrawArrays(GL_TRIANGLES, 0, 3); | |||
| #endif | |||
| m_vdecl->Unbind(); | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| /* FIXME: do we need to unset anything here? */ | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||
| glDisableVertexAttribArray(m_attrib); | |||
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| //glDisableVertexAttribArray(m_attrib); | |||
| //glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||
| /* Never used for now */ | |||
| glDisableVertexAttribArray(m_attrib); | |||
| @@ -191,14 +191,6 @@ public: | |||
| g_d3ddevice->SetIndices(m_ibo); | |||
| g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 0, 0, sizeof(m_indices) / sizeof(*m_indices)); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||
| glEnableVertexAttribArray(m_coord); | |||
| glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||
| glVertexAttribPointer(m_coord, 3, GL_FLOAT, GL_FALSE, 0, 0); | |||
| glEnableVertexAttribArray(m_color); | |||
| glBindBuffer(GL_ARRAY_BUFFER, m_cbo); | |||
| glVertexAttribPointer(m_color, 3, GL_FLOAT, GL_FALSE, 0, 0); | |||
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); | |||
| int size; | |||
| glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); | |||
| @@ -206,8 +198,6 @@ public: | |||
| glDrawElements(GL_TRIANGLES, size / sizeof(uint16_t), GL_UNSIGNED_SHORT, 0); | |||
| glDisableVertexAttribArray(m_coord); | |||
| glDisableVertexAttribArray(m_color); | |||
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| #else | |||
| glEnableClientState(GL_VERTEX_ARRAY); | |||
| @@ -427,6 +427,7 @@ public: | |||
| virtual void TickDraw(float deltams) | |||
| { | |||
| Log::Error("Tick Fractal\n"); | |||
| WorldEntity::TickDraw(deltams); | |||
| static float const vertices[] = | |||
| @@ -666,50 +667,28 @@ public: | |||
| "}" | |||
| #endif | |||
| ); | |||
| #if !defined _XBOX && !defined USE_D3D9 | |||
| m_vertexattrib = m_shader->GetAttribLocation("a_Vertex"); | |||
| m_texattrib = m_shader->GetAttribLocation("a_TexCoord"); | |||
| #endif | |||
| m_vertexattrib = m_shader->GetAttribLocation("a_Vertex", VertexUsage::Position, 0); | |||
| m_texattrib = m_shader->GetAttribLocation("a_TexCoord", VertexUsage::TexCoord, 0); | |||
| m_texeluni = m_shader->GetUniformLocation("u_TexelSize"); | |||
| m_screenuni = m_shader->GetUniformLocation("u_ScreenSize"); | |||
| m_zoomuni = m_shader->GetUniformLocation("u_ZoomSettings"); | |||
| m_ready = true; | |||
| m_vdecl = | |||
| new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position), | |||
| VertexStream<vec2>(VertexUsage::TexCoord)); | |||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined _XBOX && !defined USE_D3D9 | |||
| /* Method 1: store vertex buffer on the GPU memory */ | |||
| glGenBuffers(1, &m_vbo); | |||
| glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||
| glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, | |||
| GL_STATIC_DRAW); | |||
| glGenBuffers(1, &m_tbo); | |||
| glBindBuffer(GL_ARRAY_BUFFER, m_tbo); | |||
| glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords, | |||
| GL_STATIC_DRAW); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined _XBOX && !defined USE_D3D9 | |||
| /* Method 2: upload vertex information at each frame */ | |||
| #elif defined _XBOX || defined USE_D3D9 | |||
| if (FAILED(g_d3ddevice->CreateVertexBuffer(sizeof(vertices), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_vbo, NULL))) | |||
| exit(0); | |||
| vec2 *tmp1; | |||
| if (FAILED(m_vbo->Lock(0, 0, (void **)&tmp1, 0))) | |||
| exit(0); | |||
| memcpy(tmp1, vertices, sizeof(vertices)); | |||
| m_vbo = new VertexBuffer(sizeof(vertices)); | |||
| m_tbo = new VertexBuffer(sizeof(texcoords)); | |||
| void *tmp = m_vbo->Lock(0, 0); | |||
| memcpy(tmp, vertices, sizeof(vertices)); | |||
| m_vbo->Unlock(); | |||
| if (FAILED(g_d3ddevice->CreateVertexBuffer(sizeof(texcoords), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_tbo, NULL))) | |||
| exit(0); | |||
| vec2 *tmp2; | |||
| if (FAILED(m_tbo->Lock(0, 0, (void **)&tmp2, 0))) | |||
| exit(0); | |||
| memcpy(tmp2, texcoords, sizeof(texcoords)); | |||
| tmp = m_tbo->Lock(0, 0); | |||
| memcpy(tmp, texcoords, sizeof(texcoords)); | |||
| m_tbo->Unlock(); | |||
| #else | |||
| #endif | |||
| /* FIXME: this object never cleans up */ | |||
| m_ready = true; | |||
| } | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| @@ -762,29 +741,18 @@ public: | |||
| m_shader->SetUniform(m_screenuni, m_screen_settings); | |||
| m_shader->SetUniform(m_zoomuni, m_zoom_settings); | |||
| m_vdecl->Bind(); | |||
| m_vdecl->SetStream(m_vbo, m_vertexattrib); | |||
| m_vdecl->SetStream(m_tbo, m_texattrib); | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| g_d3ddevice->SetTexture(0, m_tex); | |||
| //g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | |||
| g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); | |||
| g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*vertices)); | |||
| g_d3ddevice->SetStreamSource(1, m_tbo, 0, sizeof(*texcoords)); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||
| glEnableVertexAttribArray(m_vertexattrib); | |||
| glVertexAttribPointer(m_vertexattrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | |||
| glBindBuffer(GL_ARRAY_BUFFER, m_tbo); | |||
| glEnableVertexAttribArray(m_texattrib); | |||
| glVertexAttribPointer(m_texattrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| /* Never used for now */ | |||
| //glEnableVertexAttribArray(m_vertexattrib); | |||
| //glVertexAttribPointer(m_vertexattrib, 2, GL_FLOAT, GL_FALSE, 0, vertices); | |||
| #else | |||
| glEnableClientState(GL_VERTEX_ARRAY); | |||
| glVertexPointer(2, GL_FLOAT, 0, vertices); | |||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| glTexCoordPointer(2, GL_FLOAT, 0, texcoords); | |||
| //glEnableClientState(GL_VERTEX_ARRAY); | |||
| //glVertexPointer(2, GL_FLOAT, 0, vertices); | |||
| //glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| //glTexCoordPointer(2, GL_FLOAT, 0, texcoords); | |||
| #endif | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| @@ -796,18 +764,20 @@ public: | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| m_vdecl->Unbind(); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| glDisableVertexAttribArray(m_vertexattrib); | |||
| glDisableVertexAttribArray(m_texattrib); | |||
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| //glDisableVertexAttribArray(m_vertexattrib); | |||
| //glDisableVertexAttribArray(m_texattrib); | |||
| //glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| /* Never used for now */ | |||
| //glDisableVertexAttribArray(m_vertexattrib); | |||
| //glDisableVertexAttribArray(m_texattrib); | |||
| #else | |||
| glDisableClientState(GL_VERTEX_ARRAY); | |||
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| //glDisableClientState(GL_VERTEX_ARRAY); | |||
| //glDisableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| #endif | |||
| Log::Error("~Tick Fractal\n"); | |||
| } | |||
| private: | |||
| @@ -820,23 +790,20 @@ private: | |||
| double m_window2world; | |||
| f64vec2 m_texel2world; | |||
| u8vec4 *m_pixels, *m_tmppixels, *m_palette; | |||
| Shader *m_shader; | |||
| ShaderAttrib m_vertexattrib, m_texattrib; | |||
| ShaderUniform m_texeluni, m_screenuni, m_zoomuni; | |||
| VertexDeclaration *m_vdecl; | |||
| VertexBuffer *m_vbo, *m_tbo; | |||
| #if defined USE_D3D9 | |||
| IDirect3DTexture9 *m_tex; | |||
| IDirect3DVertexBuffer9 *m_vbo, *m_tbo; | |||
| #elif defined _XBOX | |||
| D3DTexture *m_tex; | |||
| D3DVertexBuffer *m_vbo, *m_tbo; | |||
| #else | |||
| GLuint m_texid; | |||
| # if !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| GLuint m_vbo, m_tbo; | |||
| GLuint m_tco; | |||
| # endif | |||
| #endif | |||
| int m_vertexattrib, m_texattrib; | |||
| ShaderUniform m_texeluni, m_screenuni, m_zoomuni; | |||
| int m_frame, m_slices, m_dirty[4]; | |||
| bool m_ready, m_drag; | |||