From d03d7187c1881237b1a98404a125507d33d85a0e Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Sun, 21 Aug 2022 22:05:10 -0400 Subject: a bit of housekeeping --- gl_calls.cpp | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 105 insertions(+), 6 deletions(-) (limited to 'gl_calls.cpp') diff --git a/gl_calls.cpp b/gl_calls.cpp index fcb7fd9..8a7b905 100644 --- a/gl_calls.cpp +++ b/gl_calls.cpp @@ -1,3 +1,6 @@ +#include "gl_calls.h" + + const char *DefaultVertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 aPos;\n" "layout (location = 1) in vec2 aTexCoord;\n" @@ -75,7 +78,7 @@ const char *fragmentShaderSource = "#version 330 core\n" #endif -static void TestGL_InitDefaultShader() { +static void GL_InitDefaultShader() { DefaultVertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(DefaultVertexShader, 1, &DefaultVertexShaderSource, NULL); @@ -121,7 +124,7 @@ static void TestGL_InitDefaultShader() { glDeleteShader(DefaultFragmentShader); } -static void TestGL_InitDefaultVerts() { +static void GL_InitDefaultVerts() { unsigned int GLIndices[] = { 0, 1, 3, @@ -139,7 +142,7 @@ static void TestGL_InitDefaultVerts() { // Our vertices need to be stored in this buffer. glBindBuffer(GL_ARRAY_BUFFER, DefaultVerts.VertexBufferObject); - glBufferData(GL_ARRAY_BUFFER, sizeof(DefaultVertices), DefaultVertices, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(GL_DefaultVertices), GL_DefaultVertices, GL_STATIC_DRAW); // position attribute glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); @@ -150,7 +153,7 @@ static void TestGL_InitDefaultVerts() { } void -TestGL_InitTexture(gl_effect_layer *Test) +GL_InitTexture(gl_effect_layer *Test) { glGenFramebuffers(1, &Test->FramebufferObject); glGenTextures(1, &Test->Texture); @@ -160,12 +163,12 @@ TestGL_InitTexture(gl_effect_layer *Test) } void -TestGL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height, bool32 Multisample) +GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height, bool32 Multisample) { glViewport(0, 0, Width, Height); if (!Test->Initialized) { - TestGL_InitTexture(Test); + GL_InitTexture(Test); } GLenum Target = GL_TEXTURE_2D; @@ -213,3 +216,99 @@ TestGL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Hei glBindFramebuffer(GL_FRAMEBUFFER, 0); } + +static void +GL_RasterizeShape(project_layer *Layer, mask *Mask) +{ + gl_effect_layer Test = Layer->BitmapInfo.TestM; + gl_effect_layer Test2 = Layer->BitmapInfo.Test; + gl_vertex_shader VertData; + + uint32 Width = Layer->Source->Info.Width; + uint32 Height = Layer->Source->Info.Height; + + uint8 *Data = (uint8 *)Layer->BitmapInfo.BitmapBuffer; + glBindFramebuffer(GL_FRAMEBUFFER, Test.FramebufferObject); + + glEnable(GL_STENCIL_TEST); + // glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glStencilFunc(GL_ALWAYS, 0, 0xFF); // always write + glStencilMask(0xff); // allow writing; ANDs any writes to the stencil buffer with this + + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + + glUseProgram(DefaultShaderProgram); + + int VertexMode = glGetUniformLocation(DefaultShaderProgram, "VertexMode"); + int FragmentMode = glGetUniformLocation(DefaultShaderProgram, "FragmentMode"); + glUniform1i(VertexMode, 1); + glUniform1i(FragmentMode, 0); + + // secondary VBO + glGenVertexArrays(1, &VertData.VertexArrayObject); + glGenBuffers(1, &VertData.VertexBufferObject); + glBindVertexArray(VertData.VertexArrayObject); + glBindBuffer(GL_ARRAY_BUFFER, VertData.VertexBufferObject); + glBufferData(GL_ARRAY_BUFFER, Mask->NumberOfVerts*3*sizeof(real32), Mask->TriangulatedPointCache, GL_STREAM_DRAW); + + // position attribute + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + + int Scale = glGetUniformLocation(DefaultShaderProgram, "CompDimensions"); + glUniform3f(Scale, Width, Height, 0); + + + glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR_WRAP); + glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR_WRAP); + + glDisable(GL_CULL_FACE); + + glDrawArrays(GL_TRIANGLE_FAN, 0, Mask->NumberOfVerts); + + // glEnable(GL_CULL_FACE); + + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + glBindVertexArray(0); + + // glBindRenderbuffer(GL_RENDERBUFFER, Test.Color_Renderbuffer); + + VertexMode = glGetUniformLocation(DefaultShaderProgram, "VertexMode"); + FragmentMode = glGetUniformLocation(DefaultShaderProgram, "FragmentMode"); + glUniform1i(VertexMode, 0); + glUniform1i(FragmentMode, 1); + + + // // Switch to main buffer + glBindBuffer(GL_ARRAY_BUFFER, DefaultVerts.VertexBufferObject); + glBufferData(GL_ARRAY_BUFFER, sizeof(GL_DefaultVertices), GL_DefaultVertices, GL_STATIC_DRAW); + // position attribute + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + // texture coordinate (note the last parameter's offset) + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); + glEnableVertexAttribArray(1); + + glStencilFunc(GL_NOTEQUAL, 0, 0xFF); + glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); + glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT, 0); + + glDisable(GL_STENCIL_TEST); + glStencilMask(0xFF); + glStencilFunc(GL_ALWAYS, 0, 0xFF); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, Test.FramebufferObject); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, Test2.FramebufferObject); + glBlitFramebuffer(0, 0, Width, Height, 0, 0, Width, Height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_FRAMEBUFFER, Test2.FramebufferObject); + + glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, &Data[0]); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} -- cgit v1.2.3