// // Lol Engine // // Copyright: (c) 2010-2013 Sam Hocevar // 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://www.wtfpl.net/ for more details. // #include LOLFX_RESOURCE_DECLARE(gradient); namespace lol { /* * Gradient implementation class */ class GradientData { friend class Gradient; private: Shader *shader; VertexDeclaration *m_vdecl; VertexBuffer *m_vbo, *m_cbo; }; /* * Public Gradient class */ Gradient::Gradient(vec3 aa, vec3 bb) : data(new GradientData()) { /* FIXME: this should not be hardcoded */ m_position = aa; m_aabb.aa = aa; m_aabb.bb = bb; data->shader = nullptr; } void Gradient::TickGame(float seconds) { Entity::TickGame(seconds); } void Gradient::TickDraw(float seconds, Scene &scene) { Entity::TickDraw(seconds, scene); float const vertex[] = { m_aabb.aa.x, m_aabb.aa.y, 0.0f, m_aabb.bb.x, m_aabb.aa.y, 0.0f, m_aabb.aa.x, m_aabb.bb.y, 0.0f, m_aabb.bb.x, m_aabb.bb.y, 0.0f, m_aabb.aa.x, m_aabb.bb.y, 0.0f, m_aabb.bb.x, m_aabb.aa.y, 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) { data->shader = Shader::Create(LOLFX_RESOURCE_NAME(gradient)); data->m_vbo = new VertexBuffer(sizeof(vertex)); data->m_cbo = new VertexBuffer(sizeof(color)); data->m_vdecl = new VertexDeclaration(VertexStream(VertexUsage::Position), VertexStream(VertexUsage::Color)); } mat4 model_matrix = mat4(1.0f); ShaderUniform uni_mat; ShaderAttrib attr_pos, attr_col; attr_pos = data->shader->GetAttribLocation(VertexUsage::Position, 0); attr_col = data->shader->GetAttribLocation(VertexUsage::Color, 0); data->shader->Bind(); uni_mat = data->shader->GetUniformLocation("u_projection"); uni_mat = data->shader->GetUniformLocation("u_view"); uni_mat = data->shader->GetUniformLocation("u_model"); data->shader->SetUniform(uni_mat, scene.GetCamera()->GetProjection()); data->shader->SetUniform(uni_mat, scene.GetCamera()->GetView()); data->shader->SetUniform(uni_mat, model_matrix); data->shader->Bind(); data->m_vdecl->Bind(); void *tmp = data->m_vbo->Lock(0, 0); memcpy(tmp, vertex, sizeof(vertex)); data->m_vbo->Unlock(); 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 */ data->m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6); } Gradient::~Gradient() { /* FIXME: destroy shader */ delete data; } } /* namespace lol */