From ed51dab429e467fc144f0bfbed70a5291c8a0a27 Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Sun, 21 Aug 2022 10:20:31 -0400 Subject: multisampled gl masks --- createcalls.cpp | 140 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 71 insertions(+), 69 deletions(-) (limited to 'createcalls.cpp') diff --git a/createcalls.cpp b/createcalls.cpp index 2e754af..1d4e2e5 100644 --- a/createcalls.cpp +++ b/createcalls.cpp @@ -19,11 +19,11 @@ Source_Generate(project_data *File, memory *Memory, void *Path) Source->SourceType = source_type_video; else Source->SourceType = source_type_image; - Action_Entry_Commit(Memory, action_entry_default, "Add source"); - Action_Change_Commit(Memory, &Source->Path, &Source->Path, &Path, action_change_ptr); + History_Entry_Commit(Memory, action_entry_default, "Add source"); + History_Action_Change(Memory, &Source->Path, &Source->Path, &Path, action_type_change_ptr); uint32 i = File->NumberOfSources + 1; - Action_Change_Commit(Memory, &File->NumberOfSources, &File->NumberOfSources, &i, action_change_u16); - Action_Entry_End(Memory); + History_Action_Change(Memory, &File->NumberOfSources, &File->NumberOfSources, &i, action_type_change_u16); + History_Entry_End(Memory); return 1; } else { // PostMsg(State, "File open fail..."); @@ -41,7 +41,6 @@ InitFloatProperty(char *Name, real32 Val, real32 ScrubVal, real32 MinVal = PROPE Property.MaxVal.f = MaxVal; Property.ScrubVal.f = ScrubVal; Property.VarType = type_real; - Property.GraphWindowHeight = 300; return Property; } @@ -61,30 +60,6 @@ PostMsg(project_state *State, char *msg) State->Msg = msg; } -/* -static project_layer * -CreateSolidLayer(project_data *File, memory *Memory, uint16 Width, uint16 Height, v4 Col) -{ - project_layer *Layer = CreateLayer(File, Memory); - Layer->RenderInfo = AllocateMemory(Memory, sizeof(source_image), P_SourceData); - source_image *Source = (source_image *)Layer->RenderInfo; - Source->Raster = CreateSolidBitmap(Memory, Width, Height, Col); - Layer->SourceType = source_type_image; - return Layer; -} - -static project_layer * -CreateDebugLayer(project_data *File, memory *Memory, uint16 Width, uint16 Height, int i) -{ - project_layer *Layer = CreateLayer(File, Memory); - Layer->RenderInfo = AllocateMemory(Memory, sizeof(source_image), P_SourceData); - source_image *Source = (source_image *)Layer->RenderInfo; - Source->Raster = CreateDebugBitmap(Memory, Width, Height); - Layer->SourceType = source_type_image; - return Layer; -} -*/ - // Note we use total bytes here so we can use this memory for both packed and unpacked bitmaps. void * Layer_AllocateBitmap(memory *Memory, uint16 Width, uint16 Height, uint16 BytesPerPixel) { @@ -102,16 +77,16 @@ project_layer * Layer_Init(project_data *File, memory *Memory) // from this index in the Action tree since all we need to do to "delete" // the layer is to unset this. The layer that gets made here is always at // the top of the index. - Action_Entry_Commit(Memory, action_entry_layerinit, "Create layer"); - Action_Change_Commit(Memory, &File->NumberOfLayers, &Index, &NextIndex, action_change_u16); + History_Entry_Commit(Memory, action_entry_layerinit, "Create layer"); + History_Action_Change(Memory, &File->NumberOfLayers, &Index, &NextIndex, action_type_change_u16); File->Layer[Index] = (project_layer *)AllocateMemory(Memory, sizeof(project_layer), F_Layers); project_layer *Layer = File->Layer[Index]; - Action_Entry_SetPointer(Memory, &Layer->BitmapInfo.AVInfo); + History_Entry_SetPointer(Memory, &Layer->BitmapInfo.AVInfo); - Action_Entry_End(Memory); + History_Entry_End(Memory); Layer->Name = (char *)AllocateMemory(Memory, STRING_SIZE, F_Strings); sprintf(Layer->Name, "Layer %i", NextIndex); // CSbros... @@ -208,7 +183,13 @@ Mask_TriangulateAndRasterize(memory *Memory, project_layer *Layer, mask *Mask) Mask_RasterizePoints(Mask); gl_vertex_shader VertData; - gl_effect_layer Test = Layer->BitmapInfo.Test; + gl_effect_layer Test = Layer->BitmapInfo.TestM; + gl_effect_layer Test2 = Layer->BitmapInfo.Test; + + uint32 Width = Layer->Source->Info.Width; + uint32 Height = Layer->Source->Info.Height; + + uint8 *Data = (uint8 *)Layer->BitmapInfo.BitmapBuffer; glBindFramebuffer(GL_FRAMEBUFFER, Test.FramebufferObject); @@ -223,7 +204,12 @@ Mask_TriangulateAndRasterize(memory *Memory, project_layer *Layer, mask *Mask) glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - glUseProgram(MaskShaderProgram); + glUseProgram(DefaultShaderProgram); + + int VertexMode = glGetUniformLocation(DefaultShaderProgram, "VertexMode"); + int FragmentMode = glGetUniformLocation(DefaultShaderProgram, "FragmentMode"); + glUniform1i(VertexMode, 1); + glUniform1i(FragmentMode, 0); // secondary VBO glGenVertexArrays(1, &VertData.VertexArrayObject); @@ -235,8 +221,8 @@ Mask_TriangulateAndRasterize(memory *Memory, project_layer *Layer, mask *Mask) glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); - int Scale = glGetUniformLocation(MaskShaderProgram, "CompDimensions"); - glUniform3f(Scale, (real32)Layer->Source->Info.Width, (real32)Layer->Source->Info.Height, 0); + int Scale = glGetUniformLocation(DefaultShaderProgram, "CompDimensions"); + glUniform3f(Scale, Width, Height, 0); glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR_WRAP); @@ -251,11 +237,14 @@ Mask_TriangulateAndRasterize(memory *Memory, project_layer *Layer, mask *Mask) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glBindVertexArray(0); - // glStencilFunc(GL_EQUAL, 1, 0xFF); - // glStencilMask(0x00); // disables stencil writing - glBindRenderbuffer(GL_RENDERBUFFER, Test.Color_Renderbuffer); - glUseProgram(DefaultShaderProgram); + // 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); @@ -267,10 +256,6 @@ Mask_TriangulateAndRasterize(memory *Memory, project_layer *Layer, mask *Mask) glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); - //glStencilFunc(GL_EQUAL, 0, 0xFF); - //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - //glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT, 0); - glStencilFunc(GL_NOTEQUAL, 0, 0xFF); glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT, 0); @@ -279,10 +264,16 @@ Mask_TriangulateAndRasterize(memory *Memory, project_layer *Layer, mask *Mask) glStencilMask(0xFF); glStencilFunc(GL_ALWAYS, 0, 0xFF); - uint8 *Data = (uint8 *)Layer->BitmapInfo.BitmapBuffer; - glReadPixels(0, 0, Layer->Source->Info.Width, Layer->Source->Info.Height, GL_RGBA, GL_UNSIGNED_BYTE, &Data[0]); + 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); + } static void @@ -348,6 +339,7 @@ Layer_UpdateBitmap(project_data *File, project_layer *Layer, memory *Memory, int } else { Bitmap_CopyToPointer(Bitmap->Data, DestBuffer, BytesPerPixel, UnpackedSize); TestGL_InitTexture(&BitmapInfo->Test, DestBuffer, Width, Height); + TestGL_MaskTexture(&BitmapInfo->TestM, DestBuffer, Width, Height); if (Layer->NumberOfMasks) { for (int i = 0; i < Layer->NumberOfMasks; i++) { @@ -367,6 +359,16 @@ Layer_UpdateBitmap(project_data *File, project_layer *Layer, memory *Memory, int } #else Bitmap_CopyToPointer(Bitmap->Data, DestBuffer, BytesPerPixel, UnpackedSize); + TestGL_UpdateTexture(&BitmapInfo->Test, DestBuffer, Width, Height, 0); + TestGL_UpdateTexture(&BitmapInfo->TestM, DestBuffer, Width, Height, 1); + + if (Layer->NumberOfMasks) { + for (int i = 0; i < Layer->NumberOfMasks; i++) { + mask *Mask = &Layer->Mask[i]; + if (Mask->IsClosed) + Mask_TriangulateAndRasterize(Memory, Layer, Mask); + } + } #endif } @@ -404,24 +406,24 @@ LoadTestFootage(project_data *File, project_state *State, memory *Memory) { void *SourceString = String_GenerateFromChar(Memory, "../asset/24.mp4"); Source_Generate(File, Memory, SourceString); + source *Source = &File->Source[0]; Layer_CreateFromSource(File, State, Memory, Source); SelectLayer(File->Layer[0], State, 0); property_channel *Property = &File->Layer[0]->x; - // for (int i = 0; i < 15; i++) - // ManualKeyframeInsertF(Property, Memory, i*2, i*2*100); - ManualKeyframeInsertF(Property, Memory, 1, 100); - ManualKeyframeInsertF(Property, Memory, 3, 300); - ManualKeyframeInsertF(Property, Memory, 23, 2300); - ManualKeyframeInsertF(Property, Memory, 5, 500); + // for (int i = 0; i < 16; i++) + // Keyframe_Insert(Property, Memory, i*2, i*2*100); + // Keyframe_Insert(Property, Memory, 1, 100); + // Keyframe_Insert(Property, Memory, 15, 1500); + // Keyframe_Insert(Property, Memory, 31, 3100); + + // History_Undo(Memory); + // History_Redo(Memory); + Property->IsToggled = true; - Property->IsGraphToggled = true; - Property->GraphLength = 150; - Property->GraphYOffset = (Property->GraphWindowHeight - Property->GraphLength)/2; // AddEffect(File->Layer[0], Memory, 3); - /* mask *Mask = &File->Layer[0]->Mask[0]; File->Layer[0]->NumberOfMasks = 1; Mask->Point[0].Pos = V2(200, 200); @@ -449,7 +451,7 @@ LoadTestFootage(project_data *File, project_state *State, memory *Memory) Mask->Point[4].HandleBezier = true; Mask->NumberOfPoints = 5; - */ + Mask->IsClosed = true; // if (!Source_Generate(File, Memory, "../asset/test.png")) // PostMsg(State, "File open fail..."); @@ -457,10 +459,10 @@ LoadTestFootage(project_data *File, project_state *State, memory *Memory) // PostMsg(State, "File open fail..."); // property_channel *Property = &File->Layer[0]->x; - // ManualKeyframeInsertF(Property, Memory, 1, 500); - // ManualKeyframeInsertF(Property, Memory, 30, 800); - // ManualKeyframeInsertF(Property, Memory, 15, 400); - // ManualKeyframeInsertF(Property, Memory, 20, 100); + // Keyframe_Insert(Property, Memory, 1, 500); + // Keyframe_Insert(Property, Memory, 30, 800); + // Keyframe_Insert(Property, Memory, 15, 400); + // Keyframe_Insert(Property, Memory, 20, 100); // Property->IsToggled = true; // Property->IsGraphToggled = true; // Property->GraphLength = 150; @@ -509,8 +511,8 @@ CreateDemoScene(project_data *File, memory *Memory) Layer2->y.CurrentValue.f = 720/2; Layer2->StartFrame = 0; Layer2->EndFrame = File->EndFrame; - ManualKeyframeInsertF(&Layer2->rotation, Memory, 2, 0); - ManualKeyframeInsertF(&Layer2->rotation, Memory, 50, 360); + Keyframe_Insert(&Layer2->rotation, Memory, 2, 0); + Keyframe_Insert(&Layer2->rotation, Memory, 50, 360); Layer2->rotation.IsToggled = true; Layer2->scale.IsToggled = true; project_layer *Layer3 = CreateSolidLayer(File, Memory, 157, 163, V4(1.0, 0.3, 0.2, 1.0)); @@ -519,9 +521,9 @@ CreateDemoScene(project_data *File, memory *Memory) Layer3->opacity.CurrentValue.f = 0.5f; Layer3->StartFrame = 0; Layer3->EndFrame = File->EndFrame; - ManualKeyframeInsertF(&Layer3->x, Memory, 2, Layer3->x.CurrentValue.f); - ManualKeyframeInsertF(&Layer3->x, Memory, 30, Layer3->x.CurrentValue.f+(1280/2)); - ManualKeyframeInsertF(&Layer3->x, Memory, 60, Layer3->x.CurrentValue.f+(1280/3)); + Keyframe_Insert(&Layer3->x, Memory, 2, Layer3->x.CurrentValue.f); + Keyframe_Insert(&Layer3->x, Memory, 30, Layer3->x.CurrentValue.f+(1280/2)); + Keyframe_Insert(&Layer3->x, Memory, 60, Layer3->x.CurrentValue.f+(1280/3)); Layer3->x.IsToggled = true; Layer3->y.IsToggled = true; #endif @@ -541,8 +543,8 @@ CreateGrid(project_data *File, memory *Memory) { Layer->opacity.CurrentValue.f = 0.25; Layer->StartFrame = 0; Layer->EndFrame = File->EndFrame; - ManualKeyframeInsertF(&Layer->rotation, Memory, i, 0); - ManualKeyframeInsertF(&Layer->rotation, Memory, 40+i, 360); + Keyframe_Insert(&Layer->rotation, Memory, i, 0); + Keyframe_Insert(&Layer->rotation, Memory, 40+i, 360); } } } -- cgit v1.2.3