// // Lol Engine // // Copyright © 2010—2019 Sam Hocevar // // Lol Engine is free software. It comes without any warranty, to // the extent permitted by applicable law. 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 the WTFPL Task Force. // See http://www.wtfpl.net/ for more details. // #include #include LOLFX_RESOURCE_DECLARE(gradient); namespace lol { /* * Gradient implementation class */ class GradientData { friend class Gradient; private: std::shared_ptr shader; std::shared_ptr m_vdecl; std::shared_ptr m_vbo, m_cbo; }; /* * Public Gradient class */ Gradient::Gradient(vec3 aa, vec3 bb) : data(std::make_unique()) { /* FIXME: this should not be hardcoded */ m_position = aa; m_aabb.aa = aa; m_aabb.bb = bb; } void Gradient::tick_game(float seconds) { entity::tick_game(seconds); } void Gradient::tick_draw(float seconds, Scene &scene) { entity::tick_draw(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 = std::make_shared(sizeof(vertex)); data->m_cbo = std::make_shared(sizeof(color)); data->m_vdecl = std::make_shared (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() { } } /* namespace lol */