diff options
Diffstat (limited to 'createcalls.cpp')
-rw-r--r-- | createcalls.cpp | 429 |
1 files changed, 63 insertions, 366 deletions
diff --git a/createcalls.cpp b/createcalls.cpp index 1e96c74..d1f6448 100644 --- a/createcalls.cpp +++ b/createcalls.cpp @@ -413,6 +413,15 @@ Layer_Select(memory *Memory, project_state *State, int32 i) State->RecentSelectionType = selection_type_layer; } +static void +Layer_Select_RecurseUp(memory *Memory, project_state *State, int32 i, int16 RecursionIdx[MAX_PRECOMP_RECURSIONS], uint32 Recursions) +{ + for (int a = 1; a <= Recursions; a++) { + block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, RecursionIdx[a]); + Layer->IsSelected = 2; + } +} + void Layer_DeselectAll(project_data *File, project_state *State, memory *Memory) { int h = 0, c = 0, i = 0; while (Block_Loop(Memory, F_Layers, File->Layer_Count, &h, &c, &i)) { @@ -608,6 +617,59 @@ Layer_GetSortedArray(sorted_layer *LayerArrayStart, sorted_comp_info *SortedComp return LayerArrayStart + LayerOffset; } +static void +Layer_Select_Traverse(uint16 PrincipalCompIndex, memory *Memory, project_state *State, int32 IndexToFind, sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray, + int16 RecursionIdx[MAX_PRECOMP_RECURSIONS], int32 *Recursions) +{ + uint16 CompIndex = 0; + if (RecursionIdx[*Recursions] == -1) { + CompIndex = PrincipalCompIndex; + } else { + block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, RecursionIdx[*Recursions]); + CompIndex = Layer->Block_Source_Index; + } + sorted_layer *SortedLayerInfo = Layer_GetSortedArray(SortedLayerArray, SortedCompArray, CompIndex); + sorted_comp_info SortedCompInfo = SortedCompArray[CompIndex]; + uint32 RecursionsCurrent = *Recursions; + for (int i = SortedCompInfo.LayerCount - 1; i >= 0; i--) + { + sorted_layer SortEntry = SortedLayerInfo[i]; + uint32 Index_Physical = SortEntry.Block_Layer_Index; + block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, Index_Physical); + if (Layer->IsPrecomp && Layer->IsSelected == 2) { + *Recursions = RecursionsCurrent + 1; + RecursionIdx[*Recursions] = Index_Physical; + Layer_Select_Traverse(PrincipalCompIndex, Memory, State, IndexToFind, SortedCompArray, SortedLayerArray, RecursionIdx, Recursions); + } else if (Index_Physical == IndexToFind) { + return; + } + } +} + +static v2 +Layer_TraverseForPoint(project_data *File, project_state *State, memory *Memory, v2 PrincipalCompUV, sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray) +{ + int16 RecursionIdx[MAX_PRECOMP_RECURSIONS] = {}; + RecursionIdx[0] = -1; + int32 Recursions = 0; + sorted_layer *SortedLayerInfo = Layer_GetSortedArray(SortedLayerArray, SortedCompArray, File->PrincipalCompIndex); + sorted_comp_info SortedCompInfo = SortedCompArray[File->PrincipalCompIndex]; + block_composition *Comp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, File->PrincipalCompIndex); + Layer_Select_Traverse(File->PrincipalCompIndex, Memory, State, State->Brush.LayerToPaint_Index, SortedCompArray, SortedLayerArray, RecursionIdx, &Recursions); + v2 PointUV = {0, 0}; + int OuterWidth = Comp->Width, OuterHeight = Comp->Height; + int InnerWidth = 0, InnerHeight = 0; + for (int i = 1; i <= Recursions; i++) { + block_layer *InnerLayer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, RecursionIdx[i]); + layer_transforms T = Layer_GetTransforms(InnerLayer); + Layer_GetDimensions(Memory, InnerLayer, &InnerWidth, &InnerHeight); + PointUV = T_CompUVToLayerUV(T, OuterWidth, OuterHeight, InnerWidth, InnerHeight, State->TempZoomRatio); + OuterWidth = InnerWidth; + OuterHeight = InnerHeight; + } + return PointUV * V2(InnerWidth, InnerHeight); +} + int32 Layer_TestSelection(memory *Memory, project_state *State, ui *UI, sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray, uint16 PrincipalIndex) { block_composition *Comp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, PrincipalIndex); @@ -1452,10 +1514,9 @@ PaintTest_AVX2(brush_info B, void *Buffer, rectangle RenderRegion) #endif static void -Brush_Render(project_state *State, ui *UI, layer_transforms T_Layer, block_composition *MainComp, block_source *Source, void *BitmapAddress, ImVec2 ViewportMin, ImVec2 MousePos) +Brush_Render(project_state *State, ui *UI, layer_transforms T_Layer, block_composition *MainComp, block_source *Source, void *BitmapAddress, ImVec2 ViewportMin, v2 LayerPos) { brush_info B; - v2 LayerPos = Transform_ScreenSpaceToLocal(T_Layer, MainComp->Width, MainComp->Height, Source->Width, Source->Height, UI->CompPos, UI->CompZoom, ViewportMin, MousePos); Brush_Info(&B, &State->Brush, Source, LayerPos, UI->Color); if (State->Brush.Size >= 128) { Render_Main((void *)&B, BitmapAddress, render_type_brush, B.LayerBounds); @@ -1463,367 +1524,3 @@ Brush_Render(project_state *State, ui *UI, layer_transforms T_Layer, block_compo PaintTest(B, BitmapAddress, B.LayerBounds); } } - - -#if 0 -static void -IncrementFrame(project_data *File, int16 Amount) { - if ((File->CurrentFrame <= 0 && Amount < File->StartFrame) || (File->CurrentFrame >= File->EndFrame)) { - File->CurrentFrame = 0; - } else { - File->CurrentFrame += Amount; - } -} - -static void -CreateKeyframeBlock(property_channel *Property, memory *Memory) -{ - int16 a = Property->NumberOfKeyframeBlocks++; - Assert(a < MAX_KEYFRAME_BLOCKS); - - Property->KeyframeBlock[a] = (keyframe_block *)AllocateMemory(Memory, sizeof(keyframe_block), F_Keyframes); -} - -// 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) -{ - uint64 TotalBytes = Bitmap_CalcTotalBytes(Width, Height, BytesPerPixel); - void *Address = AllocateMemory(Memory, TotalBytes, B_LayerBitmaps); - return Address; -} - -static cached_bitmap * -Cache_CheckBitmap(source *Source, layer_bitmap_info *BitmapInfo, memory *Memory, int32 TimelineFrame) -{ - if (!Source || !BitmapInfo) - return 0; - memory_table *Table = &Memory->Slot[B_LoadedBitmaps]; - int32 FrameToSeek = TimelineFrame - BitmapInfo->FrameOffset; - if (FrameToSeek < 0) { - FrameToSeek = 0; - } - // Stills have a frame index of one. - if (Source->SourceType == source_type_image) { - FrameToSeek = 0; - } - for (int i = 0; i < Table->NumberOfPointers; i++) { - cached_bitmap *Bitmap = &Memory->Bitmap[i]; - if (Bitmap->Frame == FrameToSeek && Bitmap->SourceOwner == Source) { - return Bitmap; - } - } - return 0; -} - -static cached_bitmap * -STB_LoadStill(source *Source, layer_bitmap_info *BitmapInfo, memory *Memory) -{ - int n = 0; - int h, w; - void *temp = stbi_load(Source->Path, &w, &h, &n, 4); - Assert(temp); - cached_bitmap *Bitmap = Memory_RollingBitmap(Memory, Source, 0); - // Note the use of Unpacked since we haven't packed the bitmap and don't have any padding. - uint64 Size = Bitmap_CalcUnpackedBytes(Source->Info.Width, Source->Info.Height, Source->Info.BytesPerPixel); - Bitmap_CopyToPointer(temp, Bitmap->Data, Source->Info.BytesPerPixel, Size); - return Bitmap; -} - -static void -Layer_InitSource(project_layer *Layer, source *Source, memory *Memory) -{ - uint16 Width = Source->Info.Width; - uint16 Height = Source->Info.Height; - uint16 BytesPerPixel = Source->Info.BytesPerPixel; - Layer->BitmapInfo.BitmapBuffer = Layer_AllocateBitmap(Memory, Width, Height, BytesPerPixel); -} - -static void -Layer_PositionCenter(project_layer *Layer, uint16 Width, uint16 Height) { - Layer->x.CurrentValue.f = Width/2; - Layer->y.CurrentValue.f = Height/2; -} - -static void -Layer_CreateFromSource(project_data *File, project_state *State, memory *Memory, source *Source) -{ - if (File->NumberOfLayers + 1 > MAX_LAYERS) { - // TODO(fox): Output! - } - project_layer *Layer = Layer_Init(File, Memory); - Layer->Source = Source; - State->UpdateFrame = true; -} - - -static void -Layer_UpdateBitmap(project_data *File, project_layer *Layer, memory *Memory, int32 CurrentFrame) { - source *Source = Layer->Source; - layer_bitmap_info *BitmapInfo = &Layer->BitmapInfo; - - // AVInfo is created here instead of on layer creation so we can save - // having to keep some state in the undo/delete commands. - if (!BitmapInfo->AVInfo) { - BitmapInfo->AVInfo = AllocateMemory(Memory, sizeof(av_info), P_AVInfo); - AV_Init(Source, (av_info *)BitmapInfo->AVInfo, Memory); - Layer_InitSource(Layer, Source, Memory); - Layer_PositionCenter(Layer, File->Width, File->Height); - } - - cached_bitmap *Bitmap = Cache_CheckBitmap(Source, BitmapInfo, Memory, CurrentFrame); - if (!Bitmap) { - if (Source->SourceType == source_type_image) { - Bitmap = STB_LoadStill(Source, BitmapInfo, Memory); - } else { - Bitmap = AV_LoadVideoFrame(Source, BitmapInfo, Memory, CurrentFrame); - } - } - uint16 Width = Source->Info.Width; - uint16 Height = Source->Info.Height; - uint16 BytesPerPixel = Source->Info.BytesPerPixel; - void *DestBuffer = BitmapInfo->BitmapBuffer; - uint64 UnpackedSize = Bitmap_CalcUnpackedBytes(Source->Info.Width, Source->Info.Height, Source->Info.BytesPerPixel); -#if PACKEDRGB - uint64 PackedSize = Bitmap_CalcTotalBytes(Source->Info.Width, Source->Info.Height, Source->Info.BytesPerPixel); - - if (Layer->NumberOfMasks == 0 && Layer->NumberOfEffects == 0) { - Bitmap_ConvertPacking(Bitmap->Data, Memory->Scratch, Width, Height, BytesPerPixel, 0); - Bitmap_CopyToPointer(Memory->Scratch, DestBuffer, BytesPerPixel, PackedSize); - } else { - Bitmap_CopyToPointer(Bitmap->Data, DestBuffer, BytesPerPixel, UnpackedSize); - // GL_InitTexture(&BitmapInfo->Test, DestBuffer, Width, Height); - // GL_MaskTexture(&BitmapInfo->TestM, DestBuffer, Width, Height); - - if (Layer->NumberOfMasks) { - for (int i = 0; i < Layer->NumberOfMasks; i++) { - mask *Mask = &Layer->Mask[i]; - if (Mask->IsClosed) - Mask_TriangulateAndRasterize(Memory, Layer, Mask); - } - } - - for (int i = 0; i < Layer->NumberOfEffects; i++) - { - if (Layer->Effect[i]->IsActive) - Layer->Effect[i]->func(Source, BitmapInfo, Memory, Layer->Effect[i]->Property); - } - Bitmap_ConvertPacking(DestBuffer, Memory->Scratch, Width, Height, BytesPerPixel, 0); - Bitmap_CopyToPointer(Memory->Scratch, DestBuffer, BytesPerPixel, PackedSize); - } -#else - Bitmap_CopyToPointer(Bitmap->Data, DestBuffer, BytesPerPixel, UnpackedSize); - GL_UpdateTexture(&BitmapInfo->Test, DestBuffer, Width, Height, 0); - GL_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); - } - Bitmap_StencilAlpha(Bitmap->Data, DestBuffer, BytesPerPixel, UnpackedSize); - } - - if (Layer->NumberOfEffects) { - for (int i = 0; i < Layer->NumberOfEffects; i++) - { - if (Layer->Effect[i]->IsActive) - Layer->Effect[i]->func(Source, BitmapInfo, Memory, Layer->Effect[i]->Property); - } - } -#endif -} - -static ImVec2 -Layer_LocalToScreenSpace(project_layer *Layer, ui *UI, comp_buffer CompBuffer, v2 Point) -{ - real32 Rad = (Layer->rotation.CurrentValue.f * (PI / 180)); - real32 s = Layer->scale.CurrentValue.f; - real32 AX = Layer->ax.CurrentValue.f; - real32 AY = Layer->ay.CurrentValue.f; - source *Source = Layer->Source; - - v2 XAxis = (Point.x - AX*Source->Info.Width) * s * V2(cos(Rad), sin(Rad)); - v2 YAxis = (Point.y - AY*Source->Info.Height) * -s * V2(sin(Rad), -cos(Rad)); - v2 LocalPoint = XAxis + YAxis; - v2 CompUV = V2((Layer->x.CurrentValue.f + LocalPoint.x) / CompBuffer.Width, - (Layer->y.CurrentValue.f + LocalPoint.y) / CompBuffer.Height); - v2 ScreenPoint = V2(UI->CompPos.x + CompUV.x * UI->CompZoom.x, - UI->CompPos.y + CompUV.y * UI->CompZoom.y); - - return ImVec2(ScreenPoint.x, ScreenPoint.y); -} - -static v2 -Layer_ScreenSpaceToLocal(project_layer *Layer, ImVec2 CompPos, ImVec2 CompZoom, comp_buffer CompBuffer, ImVec2 ViewportMin, ImVec2 Point) -{ - source *Source = Layer->Source; - v2 CompUV = ImGui_ScreenPointToCompUV(ViewportMin, CompPos, CompZoom, Point); - v2 LayerUV = CompUVToLayerUV(Layer, &CompBuffer, CompUV); - return V2(LayerUV.x * Source->Info.Width, LayerUV.y * Source->Info.Height); -} -static void -LoadTestFootage(project_data *File, project_state *State, memory *Memory) -{ - void *SourceString = String_GenerateFromChar(Memory, "../asset/a.jpg"); - Source_Generate(File, State, Memory, SourceString); - SourceString = String_GenerateFromChar(Memory, "../asset/24.mp4"); - Source_Generate(File, State, Memory, SourceString); - SourceString = String_GenerateFromChar(Memory, "../asset/b.jpg"); - Source_Generate(File, State, Memory, SourceString); - SourceString = String_GenerateFromChar(Memory, "../asset/c.jpg"); - Source_Generate(File, State, Memory, SourceString); - SourceString = String_GenerateFromChar(Memory, "../asset/p.mp4"); - Source_Generate(File, State, Memory, SourceString); - - Layer_CreateFromSource(File, State, Memory, &File->Source[0]); - Keyframe_Insert(&File->Layer[0]->x, Memory, 01, -10); - Keyframe_Insert(&File->Layer[0]->x, Memory, 10, -5); - Keyframe_Insert(&File->Layer[0]->x, Memory, 23, 0); - Keyframe_Insert(&File->Layer[0]->x, Memory, 34, 5); - - for (int i = 0; i < 5; i++) { - keyframe *Keyframe = KeyframeLookup(&File->Layer[0]->x, i); - Keyframe->TangentLeft = V2(-3, 0); - Keyframe->TangentRight = V2(1.5, 0); - Keyframe->Type = bezier; - } - - File->Layer[0]->x.IsToggled = true; - SelectLayer(File->Layer[0], State, 0); - // AddEffect(File->Layer[0], Memory, 1); - // property_channel *Property = &File->Layer[0]->x; - // 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, 16, 1600); - // Keyframe_Insert(Property, Memory, 31, 3100); - - // Keyframe_Delete(Property, Memory, 1); - // History_Undo(Memory); - // History_Redo(Memory); - - // Property->IsToggled = true; - - - /* - mask *Mask = &File->Layer[0]->Mask[0]; - File->Layer[0]->NumberOfMasks = 1; - Mask->Point[0].Pos = V2(200, 200); - Mask->Point[1].Pos = V2(210, 400); - Mask->Point[2].Pos = V2(220, 520); - Mask->Point[3].Pos = V2(1380, 520); - Mask->Point[4].Pos = V2(1480, 200); - - Mask->Point[0].TangentLeft = V2(-50, 0); - Mask->Point[1].TangentLeft = V2(-50, 0); - Mask->Point[2].TangentLeft = V2(-50, 0); - Mask->Point[3].TangentLeft = V2(-50, 0); - Mask->Point[4].TangentLeft = V2(-50, 0); - - Mask->Point[0].TangentRight = V2(50, 0); - Mask->Point[1].TangentRight = V2(50, 0); - Mask->Point[2].TangentRight = V2(50, 0); - Mask->Point[3].TangentRight = V2(50, 0); - Mask->Point[4].TangentRight = V2(50, 0); - - Mask->Point[0].HandleBezier = true; - Mask->Point[1].HandleBezier = true; - Mask->Point[2].HandleBezier = true; - Mask->Point[3].HandleBezier = true; - Mask->Point[4].HandleBezier = true; - - Mask->NumberOfPoints = 5; - Mask->IsClosed = true; - */ - - /* - Mask_DeletePoint(Memory, Mask, 1); - - History_Undo(Memory); - // History_Redo(Memory); - - Mask_AddPointToCurve(Memory, Mask, 1, 0.5); - - History_Undo(Memory); - History_Redo(Memory); - */ - - // if (!Source_Generate(File, Memory, "../asset/test.png")) - // PostMsg(State, "File open fail..."); - // if (!Source_Generate(File, Memory, "../asset/debug.png")) - // PostMsg(State, "File open fail..."); - - // property_channel *Property = &File->Layer[0]->x; - // 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; - // Property->GraphYOffset = (Property->GraphWindowHeight - Property->GraphLength)/2; - - // Layer_CreateFromSource(File, State, Memory, Source); - - // if (!Source_Generate(File, Memory, "../asset/p.mp4")) - // PostMsg(State, "File open fail..."); - // source *Source2 = &File->Source[1]; - // project_layer *Layer2 = Layer_Init(File, Memory); - // AV_Init(Source2, &Layer2->BitmapInfo, Memory); - // Layer_InitSource(Layer2, Source2, Memory); - // Layer2->StartFrame = 11; - // Layer2->EndFrame = 23; - - // void *SourceString1 = String_GenerateFromChar(Memory, "../asset/b.jpg"); - // if (!Source_Generate(File, Memory, SourceString1)) - // PostMsg(State, "File open fail..."); - // source *Source1 = &File->Source[1]; - // for (int i = 0; i < 25; i++) - // Layer_CreateFromSource(File, State, Memory, Source1); - // project_layer *Layer2 = Layer_Init(File, Memory); - // Layer_InitSource(Layer2, Source2, Memory); - - // AddEffect(File->Layer[0], Memory, 2); - // project_layer *Layer1 = CreateDebugLayer(&File, &Memory, 9, 14); - // project_layer *Layer1 = CreateSolidLayer(&File, &Memory, 9, 13, V4(1.0, 1.0, 1.0, 1.0)); - // Layer1->x.CurrentValue.f = 7; - // Layer1->y.CurrentValue.f = 4; - // Layer1->StartFrame = 0; - // Layer1->EndFrame = File.EndFrame; -} - -static void -CreateDemoScene(project_data *File, project_state *State, memory *Memory) -{ - Layer_CreateFromSource(File, State, Memory, &File->Source[1]); - project_layer *Layer1 = File->Layer[0]; - Layer1->x.CurrentValue.f = 1920/2; - Layer1->y.CurrentValue.f = 1080/2; - Layer1->StartFrame = 0; - Layer1->EndFrame = File->EndFrame; - Layer_CreateFromSource(File, State, Memory, &File->Source[2]); - project_layer *Layer2 = File->Layer[1]; - Layer2->x.CurrentValue.f = 1920/2; - Layer2->y.CurrentValue.f = 1080/2; - Layer2->StartFrame = 0; - Layer2->EndFrame = File->EndFrame; - Keyframe_Insert(&Layer2->rotation, Memory, 2, 0); - Keyframe_Insert(&Layer2->rotation, Memory, 50, 360); - Layer2->rotation.IsToggled = true; - Layer2->scale.IsToggled = true; - Layer_CreateFromSource(File, State, Memory, &File->Source[3]); - project_layer *Layer3 = File->Layer[2]; - Layer3->x.CurrentValue.f = 1920/4; - Layer3->y.CurrentValue.f = 1080/4; - Layer3->opacity.CurrentValue.f = 0.5f; - Layer3->StartFrame = 0; - Layer3->EndFrame = File->EndFrame; - 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 |