From 2e0e12140e95be18abf3cf7e54230ef22f410fbd Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Tue, 23 Aug 2022 14:40:02 -0400 Subject: effects can use gl state --- effects_gl.cpp | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 effects_gl.cpp (limited to 'effects_gl.cpp') diff --git a/effects_gl.cpp b/effects_gl.cpp new file mode 100644 index 0000000..2c1435b --- /dev/null +++ b/effects_gl.cpp @@ -0,0 +1,101 @@ +static uint16 Effect_GL_InitShader(int EffectIndex); +static uint16 GL_EffectShaderProgram[512]; +static void GL_BindDefaultVertexArrays(); +static void GL_InitTexture(gl_effect_layer *Test); + +void Effect_GL_Levels(source *Source, layer_bitmap_info *BitmapInfo, memory *Memory, property_channel Property[]) +{ + real32 All_Start = Property[0].CurrentValue.f; + real32 All_Mid = Property[1].CurrentValue.f; + real32 All_End = Property[2].CurrentValue.f; + v4 Start = Property[3].CurrentValue.col; + v4 Mid = Property[4].CurrentValue.col; + v4 End = Property[5].CurrentValue.col; + + if (!BitmapInfo->Test.Initialized) { + GL_InitTexture(&BitmapInfo->Test); + } + + gl_effect_layer Test = BitmapInfo->Test; + uint8 *Data = (uint8 *)BitmapInfo->BitmapBuffer; + uint16 Width = Source->Info.Width; + uint16 Height = Source->Info.Height; + + glBindTexture(GL_TEXTURE_2D, Test.Texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, + GL_UNSIGNED_BYTE, Data); + + glBindFramebuffer(GL_FRAMEBUFFER, Test.FramebufferObject); + glBindRenderbuffer(GL_RENDERBUFFER, Test.Color_Renderbuffer); + + uint16 ShaderProgram = Effect_GL_InitShader(1); + + GL_BindDefaultVertexArrays(); + + int vertexColorLocation = glGetUniformLocation(ShaderProgram, "Start"); + glUniform1f(vertexColorLocation, All_Start); + vertexColorLocation = glGetUniformLocation(ShaderProgram, "Mid"); + glUniform1f(vertexColorLocation, All_Mid); + vertexColorLocation = glGetUniformLocation(ShaderProgram, "End"); + glUniform1f(vertexColorLocation, All_End); + vertexColorLocation = glGetUniformLocation(ShaderProgram, "StartCol"); + glUniform4f(vertexColorLocation, Start.r, Start.g, Start.b, Start.a); + vertexColorLocation = glGetUniformLocation(ShaderProgram, "MidCol"); + glUniform4f(vertexColorLocation, Mid.r, Mid.g, Mid.b, Mid.a); + vertexColorLocation = glGetUniformLocation(ShaderProgram, "EndCol"); + glUniform4f(vertexColorLocation, End.r, End.g, End.b, End.a); + + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + + glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, &Data[0]); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + +} + +void Effect_GL_GaussianBlur(source *Source, layer_bitmap_info *BitmapInfo, memory *Memory, property_channel Property[]) +{ + real32 Radius = Property[0].CurrentValue.f; + + if (!BitmapInfo->Test.Initialized) { + GL_InitTexture(&BitmapInfo->Test); + } + + gl_effect_layer Test = BitmapInfo->Test; + uint8 *Data = (uint8 *)BitmapInfo->BitmapBuffer; + uint16 Width = Source->Info.Width; + uint16 Height = Source->Info.Height; + + glBindTexture(GL_TEXTURE_2D, Test.Texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, + GL_UNSIGNED_BYTE, Data); + + glBindFramebuffer(GL_FRAMEBUFFER, Test.FramebufferObject); + glBindRenderbuffer(GL_RENDERBUFFER, Test.Color_Renderbuffer); + + uint16 ShaderProgram = Effect_GL_InitShader(2); + + GL_BindDefaultVertexArrays(); + + int vertexColorLocation = glGetUniformLocation(ShaderProgram, "Radius"); + glUniform1f(vertexColorLocation, Radius + 1.60f); + vertexColorLocation = glGetUniformLocation(ShaderProgram, "Direction"); + glUniform2f(vertexColorLocation, 1.0f, 0.0f); + + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, &Data[0]); + + // This blur works in two passes. + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, + GL_UNSIGNED_BYTE, Data); + + vertexColorLocation = glGetUniformLocation(ShaderProgram, "Direction"); + glUniform2f(vertexColorLocation, 0.0f, 1.0f); + + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, &Data[0]); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + +} -- cgit v1.2.3