@@ -98,8 +98,8 @@ static inline int isnan(float f) | |||||
#include "map.h" | #include "map.h" | ||||
#include "layer.h" | #include "layer.h" | ||||
#include "gpu/shader.h" | #include "gpu/shader.h" | ||||
#include "gpu/vbo.h" | |||||
#include "gpu/vertexbuffer.h" | #include "gpu/vertexbuffer.h" | ||||
#include "gpu/vbo.h" | |||||
#include "image/image.h" | #include "image/image.h" | ||||
#include "application/application.h" | #include "application/application.h" | ||||
@@ -231,17 +231,19 @@ Shader::Shader(char const *vert, char const *frag) | |||||
#endif | #endif | ||||
} | } | ||||
int Shader::GetAttribLocation(char const *attr) const | |||||
ShaderAttrib Shader::GetAttribLocation(char const *attr, | |||||
VertexUsage usage, int index) const | |||||
{ | { | ||||
ShaderAttrib ret; | |||||
#if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
/* FIXME: do we have attribs on these platforms? */ | |||||
return 0; | |||||
ret.m_flags = (uint32_t)index << 16; | |||||
ret.m_flags |= (uint32_t)usage; | |||||
#elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
return glGetAttribLocation(data->prog_id, attr); | |||||
ret.m_flags = glGetAttribLocation(data->prog_id, attr); | |||||
#else | #else | ||||
/* FIXME: need to differentiate between vertex and fragment program */ | |||||
return 0; | |||||
/* FIXME: can we do this at all? */ | |||||
#endif | #endif | ||||
return ret; | |||||
} | } | ||||
ShaderUniform Shader::GetUniformLocation(char const *uni) const | ShaderUniform Shader::GetUniformLocation(char const *uni) const | ||||
@@ -34,6 +34,18 @@ private: | |||||
uint32_t flags; | uint32_t flags; | ||||
}; | }; | ||||
struct ShaderAttrib | |||||
{ | |||||
friend class Shader; | |||||
friend class VertexDeclaration; | |||||
public: | |||||
ShaderAttrib(int flags = 0xffffffff) : m_flags(flags) {} | |||||
private: | |||||
uint32_t m_flags; | |||||
}; | |||||
class ShaderData; | class ShaderData; | ||||
class Shader | class Shader | ||||
@@ -42,7 +54,8 @@ public: | |||||
static Shader *Create(char const *vert, char const *frag); | static Shader *Create(char const *vert, char const *frag); | ||||
static void Destroy(Shader *shader); | static void Destroy(Shader *shader); | ||||
int GetAttribLocation(char const *attr) const; | |||||
ShaderAttrib GetAttribLocation(char const *attr, struct VertexUsage usage, | |||||
int index) const; | |||||
ShaderUniform GetUniformLocation(char const *uni) const; | ShaderUniform GetUniformLocation(char const *uni) const; | ||||
void SetUniform(ShaderUniform const &uni, int i); | void SetUniform(ShaderUniform const &uni, int i); | ||||
@@ -32,14 +32,145 @@ extern D3DDevice *g_d3ddevice; | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
// | |||||
// The VertexBufferData class | |||||
// -------------------------- | |||||
// | |||||
class VertexBufferData | |||||
{ | |||||
friend class VertexBuffer; | |||||
friend class VertexDeclaration; | |||||
#if defined USE_D3D9 | |||||
IDirect3DVertexBuffer9 *m_vbo; | |||||
#elif defined _XBOX | |||||
D3DVertexBuffer *m_vbo; | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||||
GLuint m_vbo; | |||||
uint8_t *m_memory; | |||||
size_t m_size; | |||||
#endif | |||||
}; | |||||
// | |||||
// The VertexDeclaration class | |||||
// --------------------------- | |||||
// | |||||
VertexStreamBase const VertexStreamBase::Empty; | VertexStreamBase const VertexStreamBase::Empty; | ||||
VertexDeclaration::VertexDeclaration(VertexStreamBase const &s1, | |||||
VertexStreamBase const &s2, | |||||
VertexStreamBase const &s3, | |||||
VertexStreamBase const &s4, | |||||
VertexStreamBase const &s5, | |||||
VertexStreamBase const &s6, | |||||
VertexStreamBase const &s7, | |||||
VertexStreamBase const &s8, | |||||
VertexStreamBase const &s9, | |||||
VertexStreamBase const &s10, | |||||
VertexStreamBase const &s11, | |||||
VertexStreamBase const &s12) : m_count(0) | |||||
{ | |||||
if (&s1 != &VertexStreamBase::Empty) AddStream(s1); | |||||
if (&s2 != &VertexStreamBase::Empty) AddStream(s2); | |||||
if (&s3 != &VertexStreamBase::Empty) AddStream(s3); | |||||
if (&s4 != &VertexStreamBase::Empty) AddStream(s4); | |||||
if (&s5 != &VertexStreamBase::Empty) AddStream(s5); | |||||
if (&s6 != &VertexStreamBase::Empty) AddStream(s6); | |||||
if (&s7 != &VertexStreamBase::Empty) AddStream(s7); | |||||
if (&s8 != &VertexStreamBase::Empty) AddStream(s8); | |||||
if (&s9 != &VertexStreamBase::Empty) AddStream(s9); | |||||
if (&s10 != &VertexStreamBase::Empty) AddStream(s10); | |||||
if (&s11 != &VertexStreamBase::Empty) AddStream(s11); | |||||
if (&s12 != &VertexStreamBase::Empty) AddStream(s12); | |||||
Initialize(); | |||||
} | |||||
VertexDeclaration::~VertexDeclaration() | |||||
{ | |||||
#if defined _XBOX || defined USE_D3D9 | |||||
# if defined USE_D3D9 | |||||
IDirect3DVertexDeclaration9 *vdecl = (IDirect3DVertexDeclaration9 *)m_data; | |||||
# elif defined _XBOX | |||||
D3DVertexDeclaration *vdecl = (D3DVertexDeclaration *)m_data; | |||||
# endif | |||||
vdecl->Release(); | |||||
#else | |||||
#endif | |||||
} | |||||
void VertexDeclaration::Bind() | |||||
{ | |||||
#if defined _XBOX || defined USE_D3D9 | |||||
# if defined USE_D3D9 | |||||
IDirect3DVertexDeclaration9 *vdecl = (IDirect3DVertexDeclaration9 *)m_data; | |||||
# elif defined _XBOX | |||||
D3DVertexDeclaration *vdecl = (D3DVertexDeclaration *)m_data; | |||||
# endif | |||||
g_d3ddevice->SetVertexDeclaration(vdecl); | |||||
#else | |||||
#endif | |||||
} | |||||
void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||||
ShaderAttrib attr2, | |||||
ShaderAttrib attr3, | |||||
ShaderAttrib attr4, | |||||
ShaderAttrib attr5, | |||||
ShaderAttrib attr6, | |||||
ShaderAttrib attr7, | |||||
ShaderAttrib attr8, | |||||
ShaderAttrib attr9, | |||||
ShaderAttrib attr10, | |||||
ShaderAttrib attr11, | |||||
ShaderAttrib attr12) | |||||
{ | |||||
#if defined _XBOX || defined USE_D3D9 | |||||
/* 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 index = attr1.m_flags & 0xffff; | |||||
int usage_index = 0, stream = -1, stride = 0; | |||||
for (int i = 0; i < m_count; i++) | |||||
{ | |||||
if (m_streams[i].usage == usage) | |||||
if (usage_index++ == index) | |||||
stream = m_streams[i].index; | |||||
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); | |||||
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++) | |||||
{ | |||||
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); | |||||
#endif | |||||
} | |||||
void VertexDeclaration::Initialize() | void VertexDeclaration::Initialize() | ||||
{ | { | ||||
#if defined _XBOX || defined USE_D3D9 | #if defined _XBOX || defined USE_D3D9 | ||||
static D3DVERTEXELEMENT9 const end_element[] = { D3DDECL_END() }; | static D3DVERTEXELEMENT9 const end_element[] = { D3DDECL_END() }; | ||||
static D3DECLTYPE const X = D3DDECLTYPE_UNUSED; | |||||
static D3DECLTYPE const tlut[] = | |||||
static D3DDECLTYPE const X = D3DDECLTYPE_UNUSED; | |||||
static D3DDECLTYPE const tlut[] = | |||||
{ | { | ||||
D3DDECLTYPE_UNUSED, | D3DDECLTYPE_UNUSED, | ||||
X, D3DDECLTYPE_FLOAT16_2, X, D3DDECLTYPE_FLOAT16_4, /* half */ | X, D3DDECLTYPE_FLOAT16_2, X, D3DDECLTYPE_FLOAT16_4, /* half */ | ||||
@@ -72,37 +203,34 @@ void VertexDeclaration::Initialize() | |||||
}; | }; | ||||
D3DVERTEXELEMENT9 elements[12 + 1]; | D3DVERTEXELEMENT9 elements[12 + 1]; | ||||
int nstreams = 0; | |||||
while (m_streams[nstreams].size) | |||||
for (int n = 0; n < m_count; n++) | |||||
{ | { | ||||
elements[nstreams].Stream = m_streams[nstreams].index; | |||||
elements[nstreams].Offset = 0; | |||||
for (int i = 0; i < nstreams; i++) | |||||
elements[nstreams].Offset += m_streams[nstreams].size; | |||||
if (m_streams[nstreams].type >= 0 | |||||
&& m_streams[nstreams].type < sizeof(tlut) / sizeof(*tlut)) | |||||
elements[nstreams].Type = tlut[m_streams[nstreams].type]; | |||||
elements[n].Stream = m_streams[n].index; | |||||
elements[n].Offset = 0; | |||||
for (int i = 0; i < n; i++) | |||||
elements[n].Offset += m_streams[n].size; | |||||
if (m_streams[n].stream_type >= 0 | |||||
&& m_streams[n].stream_type < sizeof(tlut) / sizeof(*tlut)) | |||||
elements[n].Type = tlut[m_streams[n].stream_type]; | |||||
else | else | ||||
elements[nstreams].Type = D3DDECLTYPE_UNUSED; | |||||
elements[n].Type = D3DDECLTYPE_UNUSED; | |||||
elements[nstreams].Method = D3DDECLMETHOD_DEFAULT; | |||||
elements[n].Method = D3DDECLMETHOD_DEFAULT; | |||||
if (m_streams[nstreams].usage >= 0 | |||||
&& m_streams[nstreams].usage < sizeof(ulut) / sizeof(*ulut)) | |||||
elements[nstreams].Type = ulut[m_streams[nstreams].usage]; | |||||
if (m_streams[n].usage >= 0 | |||||
&& m_streams[n].usage < sizeof(ulut) / sizeof(*ulut)) | |||||
elements[n].Usage = ulut[m_streams[n].usage]; | |||||
else | else | ||||
elements[nstreams].Type = D3DDECLUSAGE_POSITION; | |||||
elements[n].Usage = D3DDECLUSAGE_POSITION; | |||||
elements[nstreams].UsageIndex = 0; | |||||
for (int i = 0; i < nstreams; i++) | |||||
if (elements[i].Stream == elements[nstreams].Stream | |||||
&& elements[i].Usage == elements[nstreams].Usage) | |||||
elements[nstreams].UsageIndex++; | |||||
nstreams++; | |||||
elements[n].UsageIndex = 0; | |||||
for (int i = 0; i < n; i++) | |||||
if (elements[i].Stream == elements[n].Stream | |||||
&& elements[i].Usage == elements[n].Usage) | |||||
elements[n].UsageIndex++; | |||||
} | } | ||||
elements[nstreams] = end_element[0]; | |||||
elements[m_count] = end_element[0]; | |||||
# if defined USE_D3D9 | # if defined USE_D3D9 | ||||
IDirect3DVertexDeclaration9 *vdecl; | IDirect3DVertexDeclaration9 *vdecl; | ||||
@@ -118,76 +246,70 @@ void VertexDeclaration::Initialize() | |||||
#endif | #endif | ||||
} | } | ||||
VertexDeclaration::~VertexDeclaration() | |||||
void VertexDeclaration::AddStream(VertexStreamBase const &s) | |||||
{ | { | ||||
#if defined _XBOX || defined USE_D3D9 | |||||
# if defined USE_D3D9 | |||||
IDirect3DVertexDeclaration9 *vdecl = (IDirect3DVertexDeclaration9 *)m_data; | |||||
# elif defined _XBOX | |||||
D3DVertexDeclaration *vdecl = (D3DVertexDeclaration *)m_data; | |||||
# endif | |||||
int index = m_count ? m_streams[m_count - 1].index + 1 : 0; | |||||
vdecl->Release(); | |||||
#else | |||||
for (int i = 0; s.m_streams[i].size; i++) | |||||
{ | |||||
m_streams[m_count].stream_type = s.m_streams[i].stream_type; | |||||
m_streams[m_count].usage = s.m_streams[i].usage; | |||||
m_streams[m_count].size = s.m_streams[i].size; | |||||
m_streams[m_count].index = index; | |||||
m_count++; | |||||
} | |||||
} | |||||
// | |||||
// The VertexBuffer class | |||||
// ---------------------- | |||||
// | |||||
VertexBuffer::VertexBuffer(size_t size) | |||||
: m_data(new VertexBufferData) | |||||
{ | |||||
#if defined USE_D3D9 || defined _XBOX | |||||
g_d3ddevice->CreateVertexBuffer(size, D3DUSAGE_WRITEONLY, NULL, | |||||
D3DPOOL_MANAGED, &m_data->m_vbo, NULL); | |||||
new uint8_t[size]; | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||||
glGenBuffers(1, &m_data->m_vbo); | |||||
m_data->m_memory = new uint8_t[size]; | |||||
m_data->m_size = size; | |||||
#endif | #endif | ||||
} | } | ||||
void VertexDeclaration::Bind() | |||||
VertexBuffer::~VertexBuffer() | |||||
{ | { | ||||
#if defined _XBOX || defined USE_D3D9 | |||||
# if defined USE_D3D9 | |||||
IDirect3DVertexDeclaration9 *vdecl = (IDirect3DVertexDeclaration9 *)m_data; | |||||
# elif defined _XBOX | |||||
D3DVertexDeclaration *vdecl = (D3DVertexDeclaration *)m_data; | |||||
# endif | |||||
g_d3ddevice->SetVertexDeclaration(vdecl); | |||||
#else | |||||
#if defined USE_D3D9 || defined _XBOX | |||||
m_data->m_vbo->Release(); | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||||
glDeleteBuffers(1, &m_data->m_vbo); | |||||
delete[] m_data->m_memory; | |||||
#endif | #endif | ||||
} | } | ||||
VertexDeclaration::VertexDeclaration(VertexStreamBase const &s1, | |||||
VertexStreamBase const &s2, | |||||
VertexStreamBase const &s3, | |||||
VertexStreamBase const &s4, | |||||
VertexStreamBase const &s5, | |||||
VertexStreamBase const &s6, | |||||
VertexStreamBase const &s7, | |||||
VertexStreamBase const &s8, | |||||
VertexStreamBase const &s9, | |||||
VertexStreamBase const &s10, | |||||
VertexStreamBase const &s11, | |||||
VertexStreamBase const &s12) : m_count(0) | |||||
void *VertexBuffer::Lock(size_t offset, size_t size) | |||||
{ | { | ||||
if (&s1 != &VertexStreamBase::Empty) AddStream(s1); | |||||
if (&s2 != &VertexStreamBase::Empty) AddStream(s2); | |||||
if (&s3 != &VertexStreamBase::Empty) AddStream(s3); | |||||
if (&s4 != &VertexStreamBase::Empty) AddStream(s4); | |||||
if (&s5 != &VertexStreamBase::Empty) AddStream(s5); | |||||
if (&s6 != &VertexStreamBase::Empty) AddStream(s6); | |||||
if (&s7 != &VertexStreamBase::Empty) AddStream(s7); | |||||
if (&s8 != &VertexStreamBase::Empty) AddStream(s8); | |||||
if (&s9 != &VertexStreamBase::Empty) AddStream(s9); | |||||
if (&s10 != &VertexStreamBase::Empty) AddStream(s10); | |||||
if (&s11 != &VertexStreamBase::Empty) AddStream(s11); | |||||
if (&s12 != &VertexStreamBase::Empty) AddStream(s12); | |||||
Initialize(); | |||||
#if defined USE_D3D9 || defined _XBOX | |||||
void *ret; | |||||
if (FAILED(m_data->m_vbo->Lock(offset, size, (void **)&ret, 0))) | |||||
exit(0); | |||||
return ret; | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||||
return m_data->m_memory + offset; | |||||
#endif | |||||
} | } | ||||
void VertexDeclaration::AddStream(VertexStreamBase const &s) | |||||
void VertexBuffer::Unlock() | |||||
{ | { | ||||
int index = m_count ? m_streams[m_count - 1].index + 1 : 0; | |||||
for (int i = 0; s.m_streams[i].size; i++) | |||||
{ | |||||
m_streams[m_count].stream_type = s.m_streams[i].stream_type; | |||||
m_streams[m_count].usage = s.m_streams[i].usage; | |||||
m_streams[m_count].size = s.m_streams[i].size; | |||||
m_streams[m_count].index = index; | |||||
m_count++; | |||||
} | |||||
#if defined USE_D3D9 || defined _XBOX | |||||
m_data->m_vbo->Unlock(); | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||||
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||||
glBufferData(GL_ARRAY_BUFFER, m_data->m_size, m_data->m_memory, | |||||
GL_STATIC_DRAW); | |||||
#endif | |||||
} | } | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
@@ -9,8 +9,8 @@ | |||||
// | // | ||||
// | // | ||||
// The VertexBuffer class | |||||
// ---------------------- | |||||
// The VertexBuffer and VertexDeclaration classes | |||||
// ---------------------------------------------- | |||||
// | // | ||||
#if !defined __LOL_VERTEXBUFFER_H__ | #if !defined __LOL_VERTEXBUFFER_H__ | ||||
@@ -21,6 +21,21 @@ | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
class VertexBuffer | |||||
{ | |||||
friend class VertexDeclaration; | |||||
public: | |||||
VertexBuffer(size_t size); | |||||
~VertexBuffer(); | |||||
void *Lock(size_t offset, size_t size); | |||||
void Unlock(); | |||||
private: | |||||
class VertexBufferData *m_data; | |||||
}; | |||||
struct VertexUsage | struct VertexUsage | ||||
{ | { | ||||
enum Value | enum Value | ||||
@@ -80,7 +95,7 @@ protected: | |||||
LOL_TYPE(int32_t) LOL_TYPE(ivec2) LOL_TYPE(ivec3) LOL_TYPE(ivec4) | LOL_TYPE(int32_t) LOL_TYPE(ivec2) LOL_TYPE(ivec3) LOL_TYPE(ivec4) | ||||
#undef LOL_TYPE | #undef LOL_TYPE | ||||
template<typename T> inline void AddStream(int n, int usage) | |||||
template<typename T> inline void AddStream(int n, VertexUsage usage) | |||||
{ | { | ||||
m_streams[n].stream_type = GetType((T *)NULL); | m_streams[n].stream_type = GetType((T *)NULL); | ||||
m_streams[n].usage = usage; | m_streams[n].usage = usage; | ||||
@@ -96,7 +111,7 @@ private: | |||||
}; | }; | ||||
template<> | template<> | ||||
inline void VertexStreamBase::AddStream<void>(int n, int usage) | |||||
inline void VertexStreamBase::AddStream<void>(int n, VertexUsage usage) | |||||
{ | { | ||||
(void)usage; | (void)usage; | ||||
m_streams[n].size = 0; | m_streams[n].size = 0; | ||||
@@ -149,6 +164,18 @@ public: | |||||
~VertexDeclaration(); | ~VertexDeclaration(); | ||||
void Bind(); | void Bind(); | ||||
void SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||||
ShaderAttrib attr2 = ShaderAttrib(), | |||||
ShaderAttrib attr3 = ShaderAttrib(), | |||||
ShaderAttrib attr4 = ShaderAttrib(), | |||||
ShaderAttrib attr5 = ShaderAttrib(), | |||||
ShaderAttrib attr6 = ShaderAttrib(), | |||||
ShaderAttrib attr7 = ShaderAttrib(), | |||||
ShaderAttrib attr8 = ShaderAttrib(), | |||||
ShaderAttrib attr9 = ShaderAttrib(), | |||||
ShaderAttrib attr10 = ShaderAttrib(), | |||||
ShaderAttrib attr11 = ShaderAttrib(), | |||||
ShaderAttrib attr12 = ShaderAttrib()); | |||||
private: | private: | ||||
void Initialize(); | void Initialize(); | ||||
@@ -99,53 +99,25 @@ public: | |||||
"}" | "}" | ||||
#endif | #endif | ||||
); | ); | ||||
#if !defined _XBOX && !defined USE_D3D9 | |||||
m_attrib = m_shader->GetAttribLocation("in_Position"); | |||||
#endif | |||||
m_ready = true; | |||||
m_coord = m_shader->GetAttribLocation("in_Position", VertexUsage::Position, 0); | |||||
#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_vbo); | |||||
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||||
glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices), m_vertices, | |||||
GL_STATIC_DRAW); | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9 | |||||
/* Method 2: upload vertex information at each frame */ | |||||
#elif defined _XBOX || defined USE_D3D9 | |||||
m_vdecl = | |||||
new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||||
if (FAILED(g_d3ddevice->CreateVertexBuffer(sizeof(m_vertices), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_vbo, NULL))) | |||||
exit(0); | |||||
vec2 *vertices; | |||||
if (FAILED(m_vbo->Lock(0, 0, (void **)&vertices, 0))) | |||||
exit(0); | |||||
m_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||||
m_vbo = new VertexBuffer(sizeof(m_vertices)); | |||||
void *vertices = m_vbo->Lock(0, 0); | |||||
memcpy(vertices, m_vertices, sizeof(m_vertices)); | memcpy(vertices, m_vertices, sizeof(m_vertices)); | ||||
m_vbo->Unlock(); | m_vbo->Unlock(); | ||||
#else | |||||
#endif | |||||
m_ready = true; | |||||
/* FIXME: this object never cleans up */ | /* FIXME: this object never cleans up */ | ||||
} | } | ||||
m_shader->Bind(); | m_shader->Bind(); | ||||
m_vdecl->Bind(); | m_vdecl->Bind(); | ||||
m_vdecl->SetStream(m_vbo, m_coord); | |||||
#if defined _XBOX || defined USE_D3D9 | #if defined _XBOX || defined USE_D3D9 | ||||
g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | ||||
g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*m_vertices)); | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||||
glEnableVertexAttribArray(m_attrib); | |||||
glVertexAttribPointer(m_attrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
/* Never used for now */ | |||||
glEnableVertexAttribArray(m_attrib); | |||||
glVertexAttribPointer(m_attrib, 2, GL_FLOAT, GL_FALSE, 0, m_vertices); | |||||
#else | |||||
glEnableClientState(GL_VERTEX_ARRAY); | |||||
glVertexPointer(3, GL_FLOAT, 0, m_vertices); | |||||
#endif | #endif | ||||
#if defined _XBOX || defined USE_D3D9 | #if defined _XBOX || defined USE_D3D9 | ||||
@@ -171,16 +143,8 @@ private: | |||||
vec2 m_vertices[3]; | vec2 m_vertices[3]; | ||||
Shader *m_shader; | Shader *m_shader; | ||||
VertexDeclaration *m_vdecl; | VertexDeclaration *m_vdecl; | ||||
#if defined USE_D3D9 | |||||
IDirect3DVertexBuffer9 *m_vbo; | |||||
#elif defined _XBOX | |||||
D3DVertexBuffer *m_vbo; | |||||
#else | |||||
int m_attrib; | |||||
# if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
GLuint m_vbo; | |||||
# endif | |||||
#endif | |||||
VertexBuffer *m_vbo; | |||||
ShaderAttrib m_coord; | |||||
bool m_ready; | bool m_ready; | ||||
}; | }; | ||||
@@ -138,49 +138,33 @@ public: | |||||
"}" | "}" | ||||
#endif | #endif | ||||
); | ); | ||||
#if !defined _XBOX && !defined USE_D3D9 | |||||
m_coord = m_shader->GetAttribLocation("in_Vertex"); | |||||
m_color = m_shader->GetAttribLocation("in_Color"); | |||||
#endif | |||||
m_mvp = m_shader->GetUniformLocation("in_Matrix"); | m_mvp = m_shader->GetUniformLocation("in_Matrix"); | ||||
m_ready = true; | |||||
m_coord = m_shader->GetAttribLocation("in_Vertex", | |||||
VertexUsage::Position, 0); | |||||
m_color = m_shader->GetAttribLocation("in_Color", | |||||
VertexUsage::Color, 0); | |||||
m_vdecl = | m_vdecl = | ||||
new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | ||||
VertexStream<vec3>(VertexUsage::Color)); | VertexStream<vec3>(VertexUsage::Color)); | ||||
#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_vbo); | |||||
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||||
glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices), m_vertices, | |||||
GL_STATIC_DRAW); | |||||
glGenBuffers(1, &m_cbo); | |||||
glBindBuffer(GL_ARRAY_BUFFER, m_cbo); | |||||
glBufferData(GL_ARRAY_BUFFER, sizeof(m_colors), m_colors, | |||||
GL_STATIC_DRAW); | |||||
glGenBuffers(1, &m_ibo); | |||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); | |||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(m_indices), m_indices, | |||||
GL_STATIC_DRAW); | |||||
#elif defined _XBOX || defined USE_D3D9 | |||||
if (FAILED(g_d3ddevice->CreateVertexBuffer(sizeof(m_vertices), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_vbo, NULL))) | |||||
exit(0); | |||||
vec3 *vertices; | |||||
if (FAILED(m_vbo->Lock(0, 0, (void **)&vertices, 0))) | |||||
exit(0); | |||||
m_vbo = new VertexBuffer(sizeof(m_vertices)); | |||||
void *vertices = m_vbo->Lock(0, 0); | |||||
memcpy(vertices, m_vertices, sizeof(m_vertices)); | memcpy(vertices, m_vertices, sizeof(m_vertices)); | ||||
m_vbo->Unlock(); | m_vbo->Unlock(); | ||||
if (FAILED(g_d3ddevice->CreateVertexBuffer(sizeof(m_colors), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_cbo, NULL))) | |||||
exit(0); | |||||
vec3 *colors; | |||||
if (FAILED(m_cbo->Lock(0, 0, (void **)&colors, 0))) | |||||
exit(0); | |||||
m_cbo = new VertexBuffer(sizeof(m_colors)); | |||||
void *colors = m_cbo->Lock(0, 0); | |||||
memcpy(colors, m_colors, sizeof(m_colors)); | memcpy(colors, m_colors, sizeof(m_colors)); | ||||
m_cbo->Unlock(); | m_cbo->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, sizeof(m_indices), m_indices, | |||||
GL_STATIC_DRAW); | |||||
#elif defined _XBOX || defined USE_D3D9 | |||||
int16_t *indices; | int16_t *indices; | ||||
if (FAILED(g_d3ddevice->CreateIndexBuffer(sizeof(m_indices), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_ibo, NULL))) | if (FAILED(g_d3ddevice->CreateIndexBuffer(sizeof(m_indices), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_ibo, NULL))) | ||||
exit(0); | exit(0); | ||||
@@ -193,15 +177,17 @@ public: | |||||
#endif | #endif | ||||
/* FIXME: this object never cleans up */ | /* FIXME: this object never cleans up */ | ||||
m_ready = true; | |||||
} | } | ||||
m_shader->Bind(); | m_shader->Bind(); | ||||
m_shader->SetUniform(m_mvp, m_matrix); | m_shader->SetUniform(m_mvp, m_matrix); | ||||
m_vdecl->Bind(); | m_vdecl->Bind(); | ||||
m_vdecl->SetStream(m_vbo, m_coord); | |||||
m_vdecl->SetStream(m_cbo, m_color); | |||||
#if defined _XBOX || defined USE_D3D9 | #if defined _XBOX || defined USE_D3D9 | ||||
g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | ||||
g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*m_vertices)); | |||||
g_d3ddevice->SetStreamSource(1, m_cbo, 0, sizeof(*m_colors)); | |||||
g_d3ddevice->SetIndices(m_ibo); | g_d3ddevice->SetIndices(m_ibo); | ||||
g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 0, 0, sizeof(m_indices) / sizeof(*m_indices)); | g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 0, 0, sizeof(m_indices) / sizeof(*m_indices)); | ||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | ||||
@@ -237,20 +223,19 @@ private: | |||||
vec3 m_colors[8]; | vec3 m_colors[8]; | ||||
i16vec3 m_indices[12]; | i16vec3 m_indices[12]; | ||||
Shader *m_shader; | Shader *m_shader; | ||||
ShaderAttrib m_coord, m_color; | |||||
ShaderUniform m_mvp; | |||||
VertexDeclaration *m_vdecl; | VertexDeclaration *m_vdecl; | ||||
VertexBuffer *m_vbo, *m_cbo; | |||||
#if defined USE_D3D9 | #if defined USE_D3D9 | ||||
IDirect3DVertexBuffer9 *m_vbo, *m_cbo; | |||||
IDirect3DIndexBuffer9 *m_ibo; | IDirect3DIndexBuffer9 *m_ibo; | ||||
#elif defined _XBOX | #elif defined _XBOX | ||||
D3DVertexBuffer *m_vbo, *m_cbo; | |||||
D3DIndexBuffer *m_ibo; | D3DIndexBuffer *m_ibo; | ||||
#else | #else | ||||
int m_coord, m_color; | |||||
#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | ||||
GLuint m_vbo, m_cbo, m_ibo; | |||||
GLuint m_ibo; | |||||
#endif | #endif | ||||
#endif | #endif | ||||
ShaderUniform m_mvp; | |||||
bool m_ready; | bool m_ready; | ||||
}; | }; | ||||