needs to know about Direct3D headers etc.legacy
| @@ -29,7 +29,7 @@ liblol_a_SOURCES = \ | |||
| math/vector.cpp math/real.cpp math/half.cpp math/trig.cpp math/trig.h \ | |||
| \ | |||
| gpu/shader.cpp gpu/shader.h \ | |||
| gpu/vbo.cpp gpu/vbo.h \ | |||
| gpu/indexbuffer.cpp gpu/indexbuffer.h \ | |||
| gpu/vertexbuffer.cpp gpu/vertexbuffer.h \ | |||
| \ | |||
| image/image.cpp image/image.h image/image-private.h \ | |||
| @@ -100,8 +100,8 @@ static inline int isnan(float f) | |||
| #include "map.h" | |||
| #include "layer.h" | |||
| #include "gpu/shader.h" | |||
| #include "gpu/indexbuffer.h" | |||
| #include "gpu/vertexbuffer.h" | |||
| #include "gpu/vbo.h" | |||
| #include "image/image.h" | |||
| #include "application/application.h" | |||
| @@ -0,0 +1,134 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #include "core.h" | |||
| #include "lolgl.h" | |||
| #if defined _WIN32 && defined USE_D3D9 | |||
| # define FAR | |||
| # define NEAR | |||
| # include <d3d9.h> | |||
| #endif | |||
| using namespace std; | |||
| #if defined USE_D3D9 | |||
| extern IDirect3DDevice9 *g_d3ddevice; | |||
| #elif defined _XBOX | |||
| extern D3DDevice *g_d3ddevice; | |||
| #endif | |||
| namespace lol | |||
| { | |||
| // | |||
| // The IndexBufferData class | |||
| // -------------------------- | |||
| // | |||
| class IndexBufferData | |||
| { | |||
| friend class IndexBuffer; | |||
| #if defined USE_D3D9 | |||
| IDirect3DIndexBuffer9 *m_ibo; | |||
| #elif defined _XBOX | |||
| D3DIndexBuffer *m_ibo; | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| GLuint m_ibo; | |||
| uint8_t *m_memory; | |||
| size_t m_size; | |||
| #endif | |||
| }; | |||
| // | |||
| // The IndexBuffer class | |||
| // ---------------------- | |||
| // | |||
| IndexBuffer::IndexBuffer(size_t size) | |||
| : m_data(new IndexBufferData) | |||
| { | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| if (FAILED(g_d3ddevice->CreateIndexBuffer(size, D3DUSAGE_WRITEONLY, | |||
| D3DFMT_INDEX16, D3DPOOL_MANAGED, | |||
| &m_data->m_ibo, NULL))) | |||
| Abort(); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| glGenBuffers(1, &m_data->m_ibo); | |||
| m_data->m_memory = new uint8_t[size]; | |||
| m_data->m_size = size; | |||
| #endif | |||
| } | |||
| IndexBuffer::~IndexBuffer() | |||
| { | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| if (FAILED(m_data->m_ibo->Release())) | |||
| Abort(); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| glDeleteBuffers(1, &m_data->m_ibo); | |||
| delete[] m_data->m_memory; | |||
| #endif | |||
| } | |||
| void *IndexBuffer::Lock(size_t offset, size_t size) | |||
| { | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| void *ret; | |||
| if (FAILED(m_data->m_ibo->Lock(offset, size, (void **)&ret, 0))) | |||
| Abort(); | |||
| return ret; | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| return m_data->m_memory + offset; | |||
| #endif | |||
| } | |||
| void IndexBuffer::Unlock() | |||
| { | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| if (FAILED(m_data->m_ibo->Unlock())) | |||
| Abort(); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_data->m_ibo); | |||
| glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_data->m_size, m_data->m_memory, | |||
| GL_STATIC_DRAW); | |||
| #endif | |||
| } | |||
| void IndexBuffer::Bind() | |||
| { | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| if (FAILED(g_d3ddevice->SetIndices(m_data->m_ibo))) | |||
| Abort(); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_data->m_ibo); | |||
| /* XXX: not necessary because we kept track of the size */ | |||
| //int size; | |||
| //glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); | |||
| #endif | |||
| } | |||
| void IndexBuffer::Unbind() | |||
| { | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| if (FAILED(g_d3ddevice->SetIndices(NULL))) | |||
| Abort(); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); | |||
| #endif | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -1,7 +1,7 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
| // Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| @@ -9,37 +9,35 @@ | |||
| // | |||
| // | |||
| // The GpuVbo class | |||
| // ---------------- | |||
| // The IndexBuffer class | |||
| // --------------------- | |||
| // | |||
| #if !defined __LOL_VBO_H__ | |||
| #define __LOL_VBO_H__ | |||
| #if !defined __LOL_INDEXBUFFER_H__ | |||
| #define __LOL_INDEXBUFFER_H__ | |||
| #include <cstring> | |||
| namespace lol | |||
| { | |||
| class GpuVboData; | |||
| class GpuVbo | |||
| class IndexBuffer | |||
| { | |||
| public: | |||
| GpuVbo(); | |||
| ~GpuVbo(); | |||
| IndexBuffer(size_t size); | |||
| ~IndexBuffer(); | |||
| void SetSize(size_t elemsize, size_t elemcount); | |||
| size_t GetSize(); | |||
| uint8_t *GetData(); | |||
| uint8_t const *GetData() const; | |||
| void *Lock(size_t offset, size_t size); | |||
| void Unlock(); | |||
| void Bind(); | |||
| void Unbind(); | |||
| private: | |||
| GpuVboData *data; | |||
| class IndexBufferData *m_data; | |||
| }; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_VBO_H__ | |||
| #endif // __LOL_INDEXBUFFER_H__ | |||
| @@ -1,100 +0,0 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #include "core.h" | |||
| #include "lolgl.h" | |||
| #include "gpu/vbo.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| /* | |||
| * GpuVbo implementation class | |||
| */ | |||
| class GpuVboData | |||
| { | |||
| friend class GpuVbo; | |||
| size_t elemsize, elemcount; | |||
| uint8_t *alloc_buffer; | |||
| static size_t const GPU_ALIGN = 128; | |||
| }; | |||
| /* | |||
| * Public GpuVbo class | |||
| */ | |||
| GpuVbo::GpuVbo() | |||
| : data(new GpuVboData()) | |||
| { | |||
| data->elemsize = 0; | |||
| data->elemcount = 0; | |||
| data->alloc_buffer = 0; | |||
| } | |||
| void GpuVbo::SetSize(size_t elemsize, size_t elemcount) | |||
| { | |||
| size_t oldsize = data->elemsize * data->elemcount; | |||
| size_t newsize = elemsize * elemcount; | |||
| if (newsize == oldsize) | |||
| return; | |||
| if (oldsize) | |||
| delete[] data->alloc_buffer; | |||
| data->alloc_buffer = NULL; | |||
| if (newsize) | |||
| data->alloc_buffer = new uint8_t[newsize + GpuVboData::GPU_ALIGN - 1]; | |||
| data->elemsize = elemsize; | |||
| data->elemcount = elemcount; | |||
| } | |||
| size_t GpuVbo::GetSize() | |||
| { | |||
| return data->elemsize * data->elemcount; | |||
| } | |||
| uint8_t *GpuVbo::GetData() | |||
| { | |||
| return (uint8_t *)(((uintptr_t)data->alloc_buffer) | |||
| & ~((uintptr_t)GpuVboData::GPU_ALIGN - 1)); | |||
| } | |||
| uint8_t const *GpuVbo::GetData() const | |||
| { | |||
| return (uint8_t const *)(((uintptr_t)data->alloc_buffer) | |||
| & ~((uintptr_t)GpuVboData::GPU_ALIGN - 1)); | |||
| } | |||
| void GpuVbo::Bind() | |||
| { | |||
| } | |||
| void GpuVbo::Unbind() | |||
| { | |||
| } | |||
| GpuVbo::~GpuVbo() | |||
| { | |||
| delete[] data->alloc_buffer; | |||
| delete data; | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -142,6 +142,31 @@ void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) | |||
| #endif | |||
| } | |||
| void VertexDeclaration::DrawIndexedElements(MeshPrimitive type, int vbase, | |||
| int vskip, int vcount, | |||
| int skip, int count) | |||
| { | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| if (FAILED(g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW))) | |||
| Abort(); | |||
| switch (type) | |||
| { | |||
| case MeshPrimitive::Triangles: | |||
| if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, vbase, vskip, vcount, skip, count))) | |||
| Abort(); | |||
| break; | |||
| } | |||
| #else | |||
| switch (type) | |||
| { | |||
| case MeshPrimitive::Triangles: | |||
| /* FIXME: ignores most of the arguments! */ | |||
| glDrawElements(GL_TRIANGLES, count * 3, GL_UNSIGNED_SHORT, 0); | |||
| break; | |||
| } | |||
| #endif | |||
| } | |||
| void VertexDeclaration::Unbind() | |||
| { | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| @@ -177,6 +177,8 @@ public: | |||
| void Bind(); | |||
| void DrawElements(MeshPrimitive type, int skip, int count); | |||
| void DrawIndexedElements(MeshPrimitive type, int vbase, int vskip, | |||
| int vcount, int skip, int count); | |||
| void Unbind(); | |||
| void SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||
| ShaderAttrib attr2 = ShaderAttrib(), | |||
| @@ -13,18 +13,11 @@ | |||
| #endif | |||
| #include "core.h" | |||
| #include "lolgl.h" | |||
| #include "loldebug.h" | |||
| using namespace std; | |||
| using namespace lol; | |||
| #if defined _WIN32 && defined USE_D3D9 | |||
| # define FAR | |||
| # define NEAR | |||
| # include <d3d9.h> | |||
| #endif | |||
| #if USE_SDL && defined __APPLE__ | |||
| # include <SDL_main.h> | |||
| #endif | |||
| @@ -34,12 +27,6 @@ using namespace lol; | |||
| # include <direct.h> | |||
| #endif | |||
| #if defined USE_D3D9 | |||
| extern IDirect3DDevice9 *g_d3ddevice; | |||
| #elif defined _XBOX | |||
| extern D3DDevice *g_d3ddevice; | |||
| #endif | |||
| class Cube : public WorldEntity | |||
| { | |||
| public: | |||
| @@ -144,23 +131,10 @@ public: | |||
| memcpy(mesh, &m_mesh[0], m_mesh.Bytes()); | |||
| m_vbo->Unlock(); | |||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9 | |||
| /* Method 1: store vertex buffer on the GPU memory */ | |||
| glGenBuffers(1, &m_ibo); | |||
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); | |||
| glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.Bytes(), | |||
| &m_indices[0], GL_STATIC_DRAW); | |||
| #elif defined _XBOX || defined USE_D3D9 | |||
| int16_t *indices; | |||
| if (FAILED(g_d3ddevice->CreateIndexBuffer(m_indices.Bytes(), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_ibo, NULL))) | |||
| Abort(); | |||
| if (FAILED(m_ibo->Lock(0, 0, (void **)&indices, 0))) | |||
| Abort(); | |||
| m_ibo = new IndexBuffer(m_indices.Bytes()); | |||
| void *indices = m_ibo->Lock(0, 0); | |||
| memcpy(indices, &m_indices[0], m_indices.Bytes()); | |||
| m_ibo->Unlock(); | |||
| #else | |||
| /* TODO */ | |||
| #endif | |||
| /* FIXME: this object never cleans up */ | |||
| m_ready = true; | |||
| @@ -172,29 +146,10 @@ public: | |||
| m_shader->SetUniform(m_mvp, m_matrix); | |||
| m_vdecl->SetStream(m_vbo, m_coord, m_color); | |||
| m_vdecl->Bind(); | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| if (FAILED(g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW))) | |||
| Abort(); | |||
| if (FAILED(g_d3ddevice->SetIndices(m_ibo))) | |||
| Abort(); | |||
| if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, m_indices.Count()))) | |||
| Abort(); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); | |||
| int size; | |||
| glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); | |||
| glDrawElements(GL_TRIANGLES, size / sizeof(uint16_t), GL_UNSIGNED_SHORT, 0); | |||
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| #else | |||
| /* FIXME */ | |||
| glEnableClientState(GL_VERTEX_ARRAY); | |||
| glVertexPointer(3, GL_FLOAT, 0, m_vertices); | |||
| glDisableClientState(GL_VERTEX_ARRAY); | |||
| #endif | |||
| m_ibo->Bind(); | |||
| m_vdecl->DrawIndexedElements(MeshPrimitive::Triangles, 0, 0, 8, 0, | |||
| m_indices.Count()); | |||
| m_ibo->Unbind(); | |||
| m_vdecl->Unbind(); | |||
| } | |||
| @@ -208,15 +163,7 @@ private: | |||
| ShaderUniform m_mvp; | |||
| VertexDeclaration *m_vdecl; | |||
| VertexBuffer *m_vbo; | |||
| #if defined USE_D3D9 | |||
| IDirect3DIndexBuffer9 *m_ibo; | |||
| #elif defined _XBOX | |||
| D3DIndexBuffer *m_ibo; | |||
| #else | |||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||
| GLuint m_ibo; | |||
| #endif | |||
| #endif | |||
| IndexBuffer *m_ibo; | |||
| bool m_ready; | |||
| }; | |||
| @@ -86,7 +86,6 @@ | |||
| <ClCompile Include="..\src\font.cpp" /> | |||
| <ClCompile Include="..\src\forge.cpp" /> | |||
| <ClCompile Include="..\src\gpu\shader.cpp" /> | |||
| <ClCompile Include="..\src\gpu\vbo.cpp" /> | |||
| <ClCompile Include="..\src\gpu\vertexbuffer.cpp" /> | |||
| <ClCompile Include="..\src\gradient.cpp" /> | |||
| <ClCompile Include="..\src\hash.cpp" /> | |||
| @@ -140,7 +139,6 @@ | |||
| <ClInclude Include="..\src\font.h" /> | |||
| <ClInclude Include="..\src\forge.h" /> | |||
| <ClInclude Include="..\src\gpu\shader.h" /> | |||
| <ClInclude Include="..\src\gpu\vbo.h" /> | |||
| <ClInclude Include="..\src\gpu\vertexbuffer.h" /> | |||
| <ClInclude Include="..\src\gradient.h" /> | |||
| <ClInclude Include="..\src\hash.h" /> | |||
| @@ -160,10 +160,10 @@ | |||
| <ClCompile Include="..\src\worldentity.cpp"> | |||
| <Filter>src</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\src\gpu\shader.cpp"> | |||
| <ClCompile Include="..\src\gpu\indexbuffer.cpp"> | |||
| <Filter>src\gpu</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\src\gpu\vbo.cpp"> | |||
| <ClCompile Include="..\src\gpu\shader.cpp"> | |||
| <Filter>src\gpu</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\src\gpu\vertexbuffer.cpp"> | |||
| @@ -336,10 +336,10 @@ | |||
| <ClInclude Include="..\src\lol\unit.h"> | |||
| <Filter>src\lol</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\src\gpu\shader.h"> | |||
| <ClInclude Include="..\src\gpu\indexbuffer.h"> | |||
| <Filter>src\gpu</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\src\gpu\vbo.h"> | |||
| <ClInclude Include="..\src\gpu\shader.h"> | |||
| <Filter>src\gpu</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\src\gpu\vertexbuffer.h"> | |||