|
|
@@ -92,6 +92,7 @@ public: |
|
|
|
if (!m_ready) |
|
|
|
{ |
|
|
|
m_shader = Shader::Create( |
|
|
|
#if !defined __CELLOS_LV2__ && !defined _XBOX |
|
|
|
"#version 120\n" |
|
|
|
"attribute vec3 in_Vertex;" |
|
|
|
"attribute vec3 in_Color;" |
|
|
@@ -108,13 +109,31 @@ public: |
|
|
|
"" |
|
|
|
"void main(void) {" |
|
|
|
" gl_FragColor = vec4(pass_Color, 1.0);" |
|
|
|
"}"); |
|
|
|
"}" |
|
|
|
#else |
|
|
|
"void main(float3 in_Vertex : POSITION," |
|
|
|
" float3 in_Color : COLOR," |
|
|
|
" uniform float4x4 in_Matrix," |
|
|
|
" out float4 out_Position : POSITION," |
|
|
|
" out float3 pass_Color : COLOR) {" |
|
|
|
" pass_Color = in_Color;" |
|
|
|
" out_Position = mul(in_Matrix, float4(in_Vertex, 1.0));" |
|
|
|
"}", |
|
|
|
|
|
|
|
"void main(float3 pass_Color : COLOR," |
|
|
|
" out float4 out_FragColor : COLOR) {" |
|
|
|
" out_FragColor = float4(pass_Color, 1.0);" |
|
|
|
"}" |
|
|
|
#endif |
|
|
|
); |
|
|
|
#if !defined _XBOX |
|
|
|
m_coord = m_shader->GetAttribLocation("in_Vertex"); |
|
|
|
m_color = m_shader->GetAttribLocation("in_Color"); |
|
|
|
#endif |
|
|
|
m_mvp = m_shader->GetUniformLocation("in_Matrix"); |
|
|
|
m_ready = true; |
|
|
|
|
|
|
|
#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ |
|
|
|
#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX |
|
|
|
/* Method 1: store vertex buffer on the GPU memory */ |
|
|
|
glGenBuffers(1, &m_vbo); |
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); |
|
|
@@ -128,7 +147,43 @@ public: |
|
|
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); |
|
|
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(m_indices), m_indices, |
|
|
|
GL_STATIC_DRAW); |
|
|
|
#elif defined _XBOX |
|
|
|
extern D3DDevice *g_d3ddevice; |
|
|
|
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))) |
|
|
|
exit(0); |
|
|
|
|
|
|
|
vec3 *vertices; |
|
|
|
if (FAILED(m_vbo->Lock(0, 0, (void **)&vertices, 0))) |
|
|
|
exit(0); |
|
|
|
memcpy(vertices, m_vertices, sizeof(m_vertices)); |
|
|
|
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); |
|
|
|
memcpy(colors, m_colors, sizeof(m_colors)); |
|
|
|
m_cbo->Unlock(); |
|
|
|
|
|
|
|
int16_t *indices; |
|
|
|
if (FAILED(g_d3ddevice->CreateIndexBuffer(sizeof(m_indices), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_ibo, NULL))) |
|
|
|
exit(0); |
|
|
|
if (FAILED(m_ibo->Lock(0, 0, (void **)&indices, 0))) |
|
|
|
exit(0); |
|
|
|
memcpy(indices, m_indices, sizeof(m_indices)); |
|
|
|
m_ibo->Unlock(); |
|
|
|
#else |
|
|
|
/* TODO */ |
|
|
|
#endif |
|
|
|
|
|
|
|
/* FIXME: this object never cleans up */ |
|
|
@@ -136,7 +191,15 @@ public: |
|
|
|
|
|
|
|
m_shader->Bind(); |
|
|
|
m_shader->SetUniform(m_mvp, m_matrix); |
|
|
|
#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ |
|
|
|
#if defined _XBOX |
|
|
|
extern D3DDevice *g_d3ddevice; |
|
|
|
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(1, m_cbo, 0, sizeof(*m_colors)); |
|
|
|
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); |
|
|
@@ -169,10 +232,17 @@ private: |
|
|
|
vec3 m_colors[8]; |
|
|
|
i16vec3 m_indices[12]; |
|
|
|
Shader *m_shader; |
|
|
|
#if defined _XBOX |
|
|
|
D3DVertexDeclaration *m_vdecl; |
|
|
|
D3DVertexBuffer *m_vbo, *m_cbo; |
|
|
|
D3DIndexBuffer *m_ibo; |
|
|
|
#else |
|
|
|
int m_coord, m_color; |
|
|
|
#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ |
|
|
|
GLuint m_vbo, m_cbo, m_ibo; |
|
|
|
#endif |
|
|
|
int m_coord, m_color, m_mvp; |
|
|
|
#endif |
|
|
|
int m_mvp; |
|
|
|
bool m_ready; |
|
|
|
}; |
|
|
|
|
|
|
@@ -180,9 +250,9 @@ int main(int argc, char **argv) |
|
|
|
{ |
|
|
|
Application app("Tutorial 2: Cube", ivec2(640, 480), 60.0f); |
|
|
|
|
|
|
|
#if defined _MSC_VER |
|
|
|
#if defined _MSC_VER && !defined _XBOX |
|
|
|
_chdir(".."); |
|
|
|
#elif defined _WIN32 |
|
|
|
#elif defined _WIN32 && !defined _XBOX |
|
|
|
_chdir("../.."); |
|
|
|
#endif |
|
|
|
|
|
|
|