@@ -15,25 +15,180 @@ | |||||
#include "core.h" | #include "core.h" | ||||
#include "lolgl.h" | #include "lolgl.h" | ||||
#if defined _WIN32 && defined USE_D3D9 | |||||
# define FAR | |||||
# define NEAR | |||||
# include <d3d9.h> | |||||
#endif | |||||
using namespace std; | using namespace std; | ||||
#if defined USE_D3D9 | |||||
extern IDirect3DDevice9 *g_d3ddevice; | |||||
#elif defined _XBOX | |||||
extern D3DDevice *g_d3ddevice; | |||||
#endif | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
/* For some reason defining this in the .h leads to duplicate definitions | |||||
* between the executable and the static library. */ | |||||
template<> void VertexBuffer::AddStream<void>(int n, int index) | |||||
VertexStreamBase const VertexStreamBase::Empty; | |||||
void VertexDeclaration::Initialize() | |||||
{ | { | ||||
(void)index; | |||||
m_streams[n].size = 0; | |||||
#if defined _XBOX || defined USE_D3D9 | |||||
static D3DVERTEXELEMENT9 const end_element[] = { D3DDECL_END() }; | |||||
static D3DECLTYPE const X = D3DDECLTYPE_UNUSED; | |||||
static D3DECLTYPE const tlut[] = | |||||
{ | |||||
D3DDECLTYPE_UNUSED, | |||||
X, D3DDECLTYPE_FLOAT16_2, X, D3DDECLTYPE_FLOAT16_4, /* half */ | |||||
D3DDECLTYPE_FLOAT1, D3DDECLTYPE_FLOAT2, D3DDECLTYPE_FLOAT3, | |||||
D3DDECLTYPE_FLOAT4, /* float */ | |||||
X, X, X, X, /* double */ | |||||
X, X, X, X, /* int8_t */ | |||||
X, X, X, D3DDECLTYPE_UBYTE4, /* uint8_t */ | |||||
X, D3DDECLTYPE_SHORT2N, X, D3DDECLTYPE_SHORT4N, /* int16_t */ | |||||
X, D3DDECLTYPE_USHORT2N, X, D3DDECLTYPE_USHORT4N, /* uint16_t */ | |||||
X, X, X, X, /* int32_t */ | |||||
X, X, X, X, /* int64_t */ | |||||
}; | |||||
static D3DDECLUSAGE const ulut[] = | |||||
{ | |||||
D3DDECLUSAGE_POSITION, | |||||
D3DDECLUSAGE_BLENDWEIGHT, | |||||
D3DDECLUSAGE_BLENDINDICES, | |||||
D3DDECLUSAGE_NORMAL, | |||||
D3DDECLUSAGE_PSIZE, | |||||
D3DDECLUSAGE_TEXCOORD, | |||||
D3DDECLUSAGE_TANGENT, | |||||
D3DDECLUSAGE_BINORMAL, | |||||
D3DDECLUSAGE_TESSFACTOR, | |||||
D3DDECLUSAGE_POSITIONT, | |||||
D3DDECLUSAGE_COLOR, | |||||
D3DDECLUSAGE_FOG, | |||||
D3DDECLUSAGE_DEPTH, | |||||
D3DDECLUSAGE_SAMPLE, | |||||
}; | |||||
D3DVERTEXELEMENT9 elements[12 + 1]; | |||||
int nstreams = 0; | |||||
while (m_streams[nstreams].size) | |||||
{ | |||||
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]; | |||||
else | |||||
elements[nstreams].Type = D3DDECLTYPE_UNUSED; | |||||
elements[nstreams].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]; | |||||
else | |||||
elements[nstreams].Type = 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[nstreams] = end_element[0]; | |||||
# if defined USE_D3D9 | |||||
IDirect3DVertexDeclaration9 *vdecl; | |||||
# elif defined _XBOX | |||||
D3DVertexDeclaration *vdecl; | |||||
# endif | |||||
g_d3ddevice->CreateVertexDeclaration(elements, &vdecl); | |||||
m_data = vdecl; | |||||
#else | |||||
#endif | |||||
} | } | ||||
void VertexBuffer::Initialize() | |||||
VertexDeclaration::~VertexDeclaration() | |||||
{ | { | ||||
#if defined _XBOX || defined USE_D3D9 | #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 | #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) | |||||
{ | |||||
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(); | |||||
} | |||||
void VertexDeclaration::AddStream(VertexStreamBase const &s) | |||||
{ | |||||
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++; | |||||
} | |||||
} | |||||
} /* namespace lol */ | } /* namespace lol */ | ||||
@@ -21,89 +21,143 @@ | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
#if 0 | |||||
VertexBuffer(0, LOL_TYPE_VEC2 | LOL_USAGE_TEXTURE(0), | |||||
LOL_TYPE_FLOAT | LOL_USAGE_POSITION(0), | |||||
1, LOL_TYPE_FLOAT | LOL_USAGE_TEXCOORD(0), | |||||
2, LOL_TYPE_FLOAT | LOL_USAGE_TEXCOORD(1)); | |||||
VertexBuffer(VertexStream<vec2, LOL_USAGE_TEXTURE(0) | |||||
float, Texture( | |||||
#endif | |||||
class VertexBuffer | |||||
struct VertexUsage | |||||
{ | { | ||||
public: | |||||
VertexBuffer(VertexBuffer const& that) | |||||
enum Value | |||||
{ | { | ||||
memcpy(this, &that, sizeof(*this)); | |||||
/* Now call the platform-specific initialisation code */ | |||||
Initialize(); | |||||
Position = 0, | |||||
BlendWeight, | |||||
BlendIndices, | |||||
Normal, | |||||
PSize, | |||||
TexCoord, | |||||
Tangent, | |||||
Binormal, | |||||
TessFactor, | |||||
PositionT, | |||||
Color, | |||||
Fog, | |||||
Depth, | |||||
Sample, | |||||
} | } | ||||
m_value; | |||||
~VertexBuffer() {} | |||||
inline VertexUsage(Value v) { m_value = v; } | |||||
inline operator Value() { return m_value; } | |||||
}; | |||||
protected: | |||||
VertexBuffer() {} | |||||
class VertexStreamBase | |||||
{ | |||||
friend class VertexDeclaration; | |||||
protected: | |||||
enum | enum | ||||
{ | { | ||||
VBO_TYPE_VOID = 0, | |||||
VBO_TYPE_FLOAT, | |||||
VBO_TYPE_VEC2, | |||||
VBO_TYPE_VEC3, | |||||
VBO_TYPE_VEC4, | |||||
VBO_TYPE_I16VEC4, | |||||
VBO_TYPE_U8VEC4, | |||||
Typevoid = 0, | |||||
Typehalf, Typef16vec2, Typef16vec3, Typef16vec4, | |||||
Typefloat, Typevec2, Typevec3, Typevec4, | |||||
Typedouble, Typef64vec2, Typef64vec3, Typef64vec4, | |||||
Typeuint8_t, Typeu8vec2, Typeu8vec3, Typeu8vec4, | |||||
Typeint8_t, Typei8vec2, Typei8vec3, Typei8vec4, | |||||
Typeuint16_t, Typeu16vec2, Typeu16vec3, Typeu16vec4, | |||||
Typeint16_t, Typei16vec2, Typei16vec3, Typei16vec4, | |||||
Typeuint32_t, Typeuvec2, Typeuvec3, Typeuvec4, | |||||
Typeint32_t, Typeivec2, Typeivec3, Typeivec4, | |||||
}; | }; | ||||
static uint8_t GetType(void *x) { (void)x; return VBO_TYPE_VOID; } | |||||
static uint8_t GetType(float *x) { (void)x; return VBO_TYPE_FLOAT; } | |||||
static uint8_t GetType(vec2 *x) { (void)x; return VBO_TYPE_VEC2; } | |||||
static uint8_t GetType(vec3 *x) { (void)x; return VBO_TYPE_VEC3; } | |||||
static uint8_t GetType(vec4 *x) { (void)x; return VBO_TYPE_VEC4; } | |||||
static uint8_t GetType(i16vec4 *x) { (void)x; return VBO_TYPE_I16VEC4; } | |||||
static uint8_t GetType(u8vec4 *x) { (void)x; return VBO_TYPE_U8VEC4; } | |||||
struct { uint8_t stream_type, index, size; } m_streams[12 + 1]; | |||||
template<typename T> void AddStream(int n, int index) | |||||
#define LOL_TYPE(T) \ | |||||
static uint8_t GetType(T *x) { (void)x; return Type##T; } | |||||
LOL_TYPE(void) | |||||
LOL_TYPE(half) LOL_TYPE(f16vec2) LOL_TYPE(f16vec3) LOL_TYPE(f16vec4) | |||||
LOL_TYPE(float) LOL_TYPE(vec2) LOL_TYPE(vec3) LOL_TYPE(vec4) | |||||
LOL_TYPE(double) LOL_TYPE(f64vec2) LOL_TYPE(f64vec3) LOL_TYPE(f64vec4) | |||||
LOL_TYPE(uint8_t) LOL_TYPE(u8vec2) LOL_TYPE(u8vec3) LOL_TYPE(u8vec4) | |||||
LOL_TYPE(int8_t) LOL_TYPE(i8vec2) LOL_TYPE(i8vec3) LOL_TYPE(i8vec4) | |||||
LOL_TYPE(uint16_t) LOL_TYPE(u16vec2) LOL_TYPE(u16vec3) LOL_TYPE(u16vec4) | |||||
LOL_TYPE(int16_t) LOL_TYPE(i16vec2) LOL_TYPE(i16vec3) LOL_TYPE(i16vec4) | |||||
LOL_TYPE(uint32_t) LOL_TYPE(uvec2) LOL_TYPE(uvec3) LOL_TYPE(uvec4) | |||||
LOL_TYPE(int32_t) LOL_TYPE(ivec2) LOL_TYPE(ivec3) LOL_TYPE(ivec4) | |||||
#undef LOL_TYPE | |||||
template<typename T> inline void AddStream(int n, int usage) | |||||
{ | { | ||||
m_streams[n].stream_type = GetType((T *)NULL); | m_streams[n].stream_type = GetType((T *)NULL); | ||||
m_streams[n].index = index; | |||||
m_streams[n].usage = usage; | |||||
m_streams[n].size = sizeof(T); | m_streams[n].size = sizeof(T); | ||||
} | } | ||||
VertexStreamBase() {} | |||||
private: | private: | ||||
void Initialize(); | |||||
struct { uint8_t stream_type, usage, size; } m_streams[12 + 1]; | |||||
static VertexStreamBase const Empty; | |||||
}; | }; | ||||
template<> void VertexBuffer::AddStream<void>(int n, int index); | |||||
template<> | |||||
inline void VertexStreamBase::AddStream<void>(int n, int usage) | |||||
{ | |||||
(void)usage; | |||||
m_streams[n].size = 0; | |||||
} | |||||
template<typename T1 = void, typename T2 = void, typename T3 = void, | template<typename T1 = void, typename T2 = void, typename T3 = void, | ||||
typename T4 = void, typename T5 = void, typename T6 = void, | typename T4 = void, typename T5 = void, typename T6 = void, | ||||
typename T7 = void, typename T8 = void, typename T9 = void, | typename T7 = void, typename T8 = void, typename T9 = void, | ||||
typename T10 = void, typename T11 = void, typename T12 = void> | typename T10 = void, typename T11 = void, typename T12 = void> | ||||
class VertexDeclaration : public VertexBuffer | |||||
class VertexStream : public VertexStreamBase | |||||
{ | { | ||||
public: | public: | ||||
/* Arguments are the stream index; default to zero */ | |||||
VertexDeclaration(int s1 = 0, int s2 = 0, int s3 = 0, | |||||
int s4 = 0, int s5 = 0, int s6 = 0, | |||||
int s7 = 0, int s8 = 0, int s9 = 0, | |||||
int s10 = 0, int s11 = 0, int s12 = 0) | |||||
inline VertexStream(VertexUsage u1, | |||||
VertexUsage u2 = VertexUsage::Position, | |||||
VertexUsage u3 = VertexUsage::Position, | |||||
VertexUsage u4 = VertexUsage::Position, | |||||
VertexUsage u5 = VertexUsage::Position, | |||||
VertexUsage u6 = VertexUsage::Position, | |||||
VertexUsage u7 = VertexUsage::Position, | |||||
VertexUsage u8 = VertexUsage::Position, | |||||
VertexUsage u9 = VertexUsage::Position, | |||||
VertexUsage u10 = VertexUsage::Position, | |||||
VertexUsage u11 = VertexUsage::Position, | |||||
VertexUsage u12 = VertexUsage::Position) | |||||
{ | { | ||||
for (int i = 0; i < 12 + 1; i++) | |||||
m_streams[i].stream_type = VBO_TYPE_VOID; | |||||
AddStream<T1>(0, s1); AddStream<T2>(1, s2); AddStream<T3>(2, s3); | |||||
AddStream<T4>(3, s4); AddStream<T5>(4, s5); AddStream<T6>(5, s6); | |||||
AddStream<T7>(6, s7); AddStream<T8>(7, s8); AddStream<T9>(8, s9); | |||||
AddStream<T10>(9, s10); AddStream<T11>(10, s11); AddStream<T12>(11, s12); | |||||
AddStream<T1>(0, u1); AddStream<T2>(1, u2); | |||||
AddStream<T3>(2, u3); AddStream<T4>(3, u4); | |||||
AddStream<T5>(4, u5); AddStream<T6>(5, u6); | |||||
AddStream<T7>(6, u7); AddStream<T8>(7, u8); | |||||
AddStream<T9>(8, u9); AddStream<T10>(9, u10); | |||||
AddStream<T11>(10, u11); AddStream<T12>(11, u12); | |||||
} | } | ||||
}; | |||||
class VertexDeclaration | |||||
{ | |||||
public: | |||||
VertexDeclaration(VertexStreamBase const &s1, | |||||
VertexStreamBase const &s2 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s3 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s4 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s5 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s6 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s7 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s8 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s9 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s10 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s11 = VertexStreamBase::Empty, | |||||
VertexStreamBase const &s12 = VertexStreamBase::Empty); | |||||
~VertexDeclaration(); | |||||
void Bind(); | |||||
private: | private: | ||||
void Initialize(); | |||||
void AddStream(VertexStreamBase const &); | |||||
struct { uint8_t stream_type, index, usage, size; } m_streams[12 + 1]; | |||||
int m_count; | |||||
void *m_data; | |||||
}; | }; | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
@@ -61,7 +61,6 @@ public: | |||||
if (!m_ready) | if (!m_ready) | ||||
{ | { | ||||
VertexBuffer vb(VertexDeclaration<vec2, float, ivec3>(0, 0, 1)); | |||||
@@ -114,12 +113,9 @@ public: | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9 | #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9 | ||||
/* Method 2: upload vertex information at each frame */ | /* Method 2: upload vertex information at each frame */ | ||||
#elif defined _XBOX || defined USE_D3D9 | #elif defined _XBOX || defined USE_D3D9 | ||||
D3DVERTEXELEMENT9 const elements[2] = | |||||
{ | |||||
{ 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, | |||||
D3DDECL_END() | |||||
}; | |||||
g_d3ddevice->CreateVertexDeclaration(elements, &m_vdecl); | |||||
m_vdecl = | |||||
new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||||
if (FAILED(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); | exit(0); | ||||
@@ -135,9 +131,9 @@ public: | |||||
} | } | ||||
m_shader->Bind(); | m_shader->Bind(); | ||||
m_vdecl->Bind(); | |||||
#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->SetVertexDeclaration(m_vdecl); | |||||
g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*m_vertices)); | g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*m_vertices)); | ||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | ||||
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | ||||
@@ -174,11 +170,10 @@ public: | |||||
private: | private: | ||||
vec2 m_vertices[3]; | vec2 m_vertices[3]; | ||||
Shader *m_shader; | Shader *m_shader; | ||||
VertexDeclaration *m_vdecl; | |||||
#if defined USE_D3D9 | #if defined USE_D3D9 | ||||
IDirect3DVertexDeclaration9 *m_vdecl; | |||||
IDirect3DVertexBuffer9 *m_vbo; | IDirect3DVertexBuffer9 *m_vbo; | ||||
#elif defined _XBOX | #elif defined _XBOX | ||||
D3DVertexDeclaration *m_vdecl; | |||||
D3DVertexBuffer *m_vbo; | D3DVertexBuffer *m_vbo; | ||||
#else | #else | ||||
int m_attrib; | int m_attrib; | ||||
@@ -145,6 +145,9 @@ public: | |||||
m_mvp = m_shader->GetUniformLocation("in_Matrix"); | m_mvp = m_shader->GetUniformLocation("in_Matrix"); | ||||
m_ready = true; | m_ready = true; | ||||
m_vdecl = | |||||
new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | |||||
VertexStream<vec3>(VertexUsage::Color)); | |||||
#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9 | #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9 | ||||
/* Method 1: store vertex buffer on the GPU memory */ | /* Method 1: store vertex buffer on the GPU memory */ | ||||
glGenBuffers(1, &m_vbo); | glGenBuffers(1, &m_vbo); | ||||
@@ -160,14 +163,6 @@ public: | |||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(m_indices), m_indices, | glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(m_indices), m_indices, | ||||
GL_STATIC_DRAW); | GL_STATIC_DRAW); | ||||
#elif defined _XBOX || defined USE_D3D9 | #elif defined _XBOX || defined USE_D3D9 | ||||
D3DVERTEXELEMENT9 const elements[] = | |||||
{ | |||||
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, | |||||
{ 1, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, | |||||
D3DDECL_END() | |||||
}; | |||||
g_d3ddevice->CreateVertexDeclaration(elements, &m_vdecl); | |||||
if (FAILED(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); | exit(0); | ||||
@@ -202,9 +197,9 @@ public: | |||||
m_shader->Bind(); | m_shader->Bind(); | ||||
m_shader->SetUniform(m_mvp, m_matrix); | m_shader->SetUniform(m_mvp, m_matrix); | ||||
m_vdecl->Bind(); | |||||
#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->SetVertexDeclaration(m_vdecl); | |||||
g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*m_vertices)); | g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*m_vertices)); | ||||
g_d3ddevice->SetStreamSource(1, m_cbo, 0, sizeof(*m_colors)); | g_d3ddevice->SetStreamSource(1, m_cbo, 0, sizeof(*m_colors)); | ||||
g_d3ddevice->SetIndices(m_ibo); | g_d3ddevice->SetIndices(m_ibo); | ||||
@@ -242,12 +237,11 @@ private: | |||||
vec3 m_colors[8]; | vec3 m_colors[8]; | ||||
i16vec3 m_indices[12]; | i16vec3 m_indices[12]; | ||||
Shader *m_shader; | Shader *m_shader; | ||||
VertexDeclaration *m_vdecl; | |||||
#if defined USE_D3D9 | #if defined USE_D3D9 | ||||
IDirect3DVertexDeclaration9 *m_vdecl; | |||||
IDirect3DVertexBuffer9 *m_vbo, *m_cbo; | IDirect3DVertexBuffer9 *m_vbo, *m_cbo; | ||||
IDirect3DIndexBuffer9 *m_ibo; | IDirect3DIndexBuffer9 *m_ibo; | ||||
#elif defined _XBOX | #elif defined _XBOX | ||||
D3DVertexDeclaration *m_vdecl; | |||||
D3DVertexBuffer *m_vbo, *m_cbo; | D3DVertexBuffer *m_vbo, *m_cbo; | ||||
D3DIndexBuffer *m_ibo; | D3DIndexBuffer *m_ibo; | ||||
#else | #else | ||||
@@ -675,6 +675,9 @@ public: | |||||
m_zoomuni = m_shader->GetUniformLocation("u_ZoomSettings"); | m_zoomuni = m_shader->GetUniformLocation("u_ZoomSettings"); | ||||
m_ready = true; | 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 | #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined _XBOX && !defined USE_D3D9 | ||||
/* Method 1: store vertex buffer on the GPU memory */ | /* Method 1: store vertex buffer on the GPU memory */ | ||||
glGenBuffers(1, &m_vbo); | glGenBuffers(1, &m_vbo); | ||||
@@ -688,14 +691,6 @@ public: | |||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined _XBOX && !defined USE_D3D9 | #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined _XBOX && !defined USE_D3D9 | ||||
/* Method 2: upload vertex information at each frame */ | /* Method 2: upload vertex information at each frame */ | ||||
#elif defined _XBOX || defined USE_D3D9 | #elif defined _XBOX || defined USE_D3D9 | ||||
D3DVERTEXELEMENT9 const elements[] = | |||||
{ | |||||
{ 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, | |||||
{ 1, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, | |||||
D3DDECL_END() | |||||
}; | |||||
g_d3ddevice->CreateVertexDeclaration(elements, &m_vdecl); | |||||
if (FAILED(g_d3ddevice->CreateVertexBuffer(sizeof(vertices), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_vbo, NULL))) | if (FAILED(g_d3ddevice->CreateVertexBuffer(sizeof(vertices), D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_vbo, NULL))) | ||||
exit(0); | exit(0); | ||||
vec2 *tmp1; | vec2 *tmp1; | ||||
@@ -766,11 +761,11 @@ public: | |||||
m_shader->SetUniform(m_texeluni, m_texel_settings); | m_shader->SetUniform(m_texeluni, m_texel_settings); | ||||
m_shader->SetUniform(m_screenuni, m_screen_settings); | m_shader->SetUniform(m_screenuni, m_screen_settings); | ||||
m_shader->SetUniform(m_zoomuni, m_zoom_settings); | m_shader->SetUniform(m_zoomuni, m_zoom_settings); | ||||
m_vdecl->Bind(); | |||||
#if defined _XBOX || defined USE_D3D9 | #if defined _XBOX || defined USE_D3D9 | ||||
g_d3ddevice->SetTexture(0, m_tex); | g_d3ddevice->SetTexture(0, m_tex); | ||||
//g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | //g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | ||||
g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); | g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); | ||||
g_d3ddevice->SetVertexDeclaration(m_vdecl); | |||||
g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*vertices)); | g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*vertices)); | ||||
g_d3ddevice->SetStreamSource(1, m_tbo, 0, sizeof(*texcoords)); | g_d3ddevice->SetStreamSource(1, m_tbo, 0, sizeof(*texcoords)); | ||||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | ||||
@@ -826,13 +821,12 @@ private: | |||||
f64vec2 m_texel2world; | f64vec2 m_texel2world; | ||||
u8vec4 *m_pixels, *m_tmppixels, *m_palette; | u8vec4 *m_pixels, *m_tmppixels, *m_palette; | ||||
Shader *m_shader; | Shader *m_shader; | ||||
VertexDeclaration *m_vdecl; | |||||
#if defined USE_D3D9 | #if defined USE_D3D9 | ||||
IDirect3DTexture9 *m_tex; | IDirect3DTexture9 *m_tex; | ||||
IDirect3DVertexDeclaration9 *m_vdecl; | |||||
IDirect3DVertexBuffer9 *m_vbo, *m_tbo; | IDirect3DVertexBuffer9 *m_vbo, *m_tbo; | ||||
#elif defined _XBOX | #elif defined _XBOX | ||||
D3DTexture *m_tex; | D3DTexture *m_tex; | ||||
D3DVertexDeclaration *m_vdecl; | |||||
D3DVertexBuffer *m_vbo, *m_tbo; | D3DVertexBuffer *m_vbo, *m_tbo; | ||||
#else | #else | ||||
GLuint m_texid; | GLuint m_texid; | ||||