#include "GL/gl3w.h" #include "GL/gl.h" #include "basicShader.hpp" #include "basicShaderGLSL.hpp" #include "BehaviourScripts/Renderable.hpp" #include "Color.hpp" #define SHADER_VERTEX_INDEX 0 #define SHADER_COLOR_INDEX 1 #define SHADER_PACKAGE_SIZE sizeof(float) * (3 + 4) TSE::GLFW::BasicShader* TSE::GLFW::BasicShader::instance = nullptr; TSE::GLFW::BasicShader *TSE::GLFW::BasicShader::Instance() { return instance; } void TSE::GLFW::BasicShader::Destroy() { if(instance != nullptr) delete instance; instance = nullptr; } void TSE::GLFW::BasicShader::Init(float width, float height) { std::vector> parts; parts.push_back(ShaderPart::LoadFromString(vert, GL_VERTEX_SHADER)); parts.push_back(ShaderPart::LoadFromString(frag, GL_FRAGMENT_SHADER)); instance = new BasicShader(std::move(parts)); } TSE::GLFW::BasicShader::BasicShader(std::vector> &&parts) : Shader(parts) { PackageSize = SHADER_PACKAGE_SIZE; } void TSE::GLFW::BasicShader::OnEnable() const { glEnableVertexAttribArray(SHADER_VERTEX_INDEX); glVertexAttribPointer(SHADER_VERTEX_INDEX, 3, GL_FLOAT, false, SHADER_PACKAGE_SIZE, (void*)0); glEnableVertexAttribArray(SHADER_COLOR_INDEX); glVertexAttribPointer(SHADER_COLOR_INDEX, 4, GL_FLOAT, false, SHADER_PACKAGE_SIZE, (void*)(sizeof(float) * 3)); } void TSE::GLFW::BasicShader::OnDisable() const { glDisableVertexAttribArray(SHADER_VERTEX_INDEX); glDisableVertexAttribArray(SHADER_COLOR_INDEX); } void TSE::GLFW::BasicShader::OnFlush() { } void TSE::GLFW::BasicShader::OnDrawCall(int indexCount) { glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, NULL); } void TSE::GLFW::BasicShader::OnSubmit(const Transformable &t, float *&target, TransformationStack &stack, void (*restartDrawcall)(IRenderer &), IRenderer &rnd) { auto* r = dynamic_cast(t.GetBehaviourScript(RENDERABLE)); if (!r) return; const Vector3* verts = r->GetVertices(); ushort vCount = r->GetVertexCount(); const Color color = r->GetMaterial()->GetValue("mainColor"); Matrix4x4 matr = t.GetLocalMatrix(); stack.Push(matr); const Matrix4x4& top = stack.Top(); //Todo transformable.lastmatrix hier ergänzen for (ushort i = 0; i < vCount; i++) { Vector3 p = top * verts[i]; *target++ = p.x; *target++ = p.y; *target++ = p.z; *target++ = color.r; *target++ = color.g; *target++ = color.b; *target++ = color.a; } stack.Pop(); }