summaryrefslogtreecommitdiff
path: root/gl_calls.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gl_calls.cpp')
-rw-r--r--gl_calls.cpp111
1 files changed, 105 insertions, 6 deletions
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);
+}