From 38bf0102300c97335d8e78b4683cb9b9476dcde0 Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Thu, 10 Nov 2022 22:34:17 -0500 Subject: graph implementation --- prenderer.cpp | 149 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 128 insertions(+), 21 deletions(-) (limited to 'prenderer.cpp') diff --git a/prenderer.cpp b/prenderer.cpp index dcb4577..58e1b22 100644 --- a/prenderer.cpp +++ b/prenderer.cpp @@ -63,13 +63,13 @@ Transform_ApplyInteractive(interact_transform Interact, real32 *OutputX, real32 } static void -Transform_IterateOuterBounds(block_layer *Layer, block_source *Source, real32 *MinX, real32 *MinY, real32 *MaxX, real32 *MaxY) +Transform_IterateOuterBounds(block_layer *Layer, uint32 Width, uint32 Height, real32 *MinX, real32 *MinY, real32 *MaxX, real32 *MaxY) { real32 Rad = (Layer->rotation.CurrentValue * (PI / 180)); real32 s = Layer->scale.CurrentValue; - v2 XAxis = (Source->Width * s)*V2(cos(Rad), sin(Rad)); - v2 YAxis = (Source->Height * -s)*V2(sin(Rad), -cos(Rad)); + v2 XAxis = (Width * s)*V2(cos(Rad), sin(Rad)); + v2 YAxis = (Height * -s)*V2(sin(Rad), -cos(Rad)); real32 AnchorX = Layer->ax.CurrentValue; real32 AnchorY = Layer->ay.CurrentValue; @@ -89,23 +89,109 @@ Transform_IterateOuterBounds(block_layer *Layer, block_source *Source, real32 *M } } +static void +Transform_Recurse(project_state *State, memory *Memory, block_composition *MainComp, uint32 CompIndex, block_layer *ParentLayer[4], uint32 Recursions, + sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray, + real32 *MinX, real32 *MinY, real32 *MaxX, real32 *MaxY) +{ + sorted_comp_info *SortedCompInfo = &SortedCompArray[CompIndex]; + sorted_layer *SortedLayerInfo = Layer_GetSortedArray(SortedLayerArray, SortedCompArray, CompIndex); + for (int i = 0; i < SortedCompInfo->LayerCount; 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) { + ParentLayer[Recursions] = Layer; + Transform_Recurse(State, Memory, MainComp, Layer->Block_Source_Index, ParentLayer, Recursions + 1, SortedCompArray, SortedLayerArray, + MinX, MinY, MaxX, MaxY); + } + if (Layer->IsSelected) { + uint32 Width = 0, Height = 0; + if (!Layer->IsPrecomp) { + block_source *Source = (block_source *)Memory_Block_AddressAtIndex(Memory, F_Sources, Layer->Block_Source_Index); + Width = Source->Width; + Height = Source->Height; + } else { + block_composition *Comp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, Layer->Block_Source_Index); + Width = Comp->Width; + Height = Comp->Height; + } + + v2 Point[5] = { V2(Width*Layer->ax.CurrentValue, Height*Layer->ay.CurrentValue), V2(0, 0), V2(Width, 0), V2(0, Height), V2(Width, Height) }; + + layer_transforms T = Layer_GetTransforms(Layer); + + v2 NewPos[5]; + for (int i = 0; i < 5; i++) { + NewPos[i] = TransformPoint(T, Width, Height, Point[i]); + } + + int i = 0; + while (i < Recursions) { + T = Layer_GetTransforms(ParentLayer[i]); + block_composition *Comp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, ParentLayer[i]->Block_Source_Index); + Width = Comp->Width; + Height = Comp->Height; + for (int i = 0; i < 5; i++) { + NewPos[i] = TransformPoint(T, Width, Height, NewPos[i]); + } + i++; + } + + for (int i = 0; i < 4; i++) { + if (NewPos[i+1].x < *MinX) { *MinX = NewPos[i+1].x; } + if (NewPos[i+1].y < *MinY) { *MinY = NewPos[i+1].y; } + if (NewPos[i+1].x > *MaxX) { *MaxX = NewPos[i+1].x; } + if (NewPos[i+1].y > *MaxY) { *MaxY = NewPos[i+1].y; } + } + } + } +} + // IMPORTANT(fox): The selection state and ordering of layers cannot change // until this action is exited/committed! static void -Interact_Transform_Begin(project_data *File, memory *Memory, project_state *State, ImVec2 OGPos) +Interact_Transform_Begin(project_data *File, memory *Memory, project_state *State, ImVec2 OGPos, + sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray) { real32 MinX = 100000; real32 MinY = 100000; real32 MaxX = -100000; real32 MaxY = -100000; + block_composition *MainComp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, File->PrincipalCompIndex); + block_layer *ParentLayer[4]; + Transform_Recurse(State, Memory, MainComp, File->PrincipalCompIndex, ParentLayer, 0, + SortedCompArray, SortedLayerArray, + &MinX, &MinY, &MaxX, &MaxY); + if (MinX != 100000) { + State->Interact_Active = interact_type_viewport_transform; + interact_transform *Interact = (interact_transform *)&State->Interact_Offset[0]; + Interact->Min = V2(MinX, MinY); + Interact->Max = V2(MaxX, MaxY); + Interact->Position = V2(0); + Interact->Radians = 0; + Interact->Scale = 1.0f; + Interact->OGPos = OGPos; + } + /* bool32 Activate = false; // Find the max dimensions of all the selected layers. for (int i = 0; i < File->Layer_Count; i++) { block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, i); if (!Layer->IsSelected) continue; - block_source *Source = (block_source *)Memory_Block_AddressAtIndex(Memory, F_Sources, Layer->Block_Source_Index); - Transform_IterateOuterBounds(Layer, Source, &MinX, &MinY, &MaxX, &MaxY); + uint32 Width = 0, Height = 0; + if (!Layer->IsPrecomp) { + block_source *Source = (block_source *)Memory_Block_AddressAtIndex(Memory, F_Sources, Layer->Block_Source_Index); + Width = Source->Width; + Height = Source->Height; + } else { + block_composition *Comp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, Layer->Block_Source_Index); + Width = Comp->Width; + Height = Comp->Height; + } + Transform_IterateOuterBounds(Layer, Width, Height, &MinX, &MinY, &MaxX, &MaxY); Activate = true; } if (Activate) { @@ -118,30 +204,51 @@ Interact_Transform_Begin(project_data *File, memory *Memory, project_state *Stat Interact->Scale = 1.0f; Interact->OGPos = OGPos; } + */ +} + +static v2 +TransformPoint(layer_transforms T, real32 Width, real32 Height, v2 Point) +{ + real32 Rad = (T.rotation * (PI / 180)); + v2 XAxis = (Point.x - T.ax*Width) * T.scale * V2(cos(Rad), sin(Rad)); + v2 YAxis = (Point.y - T.ay*Height) * -T.scale * V2(sin(Rad), -cos(Rad)); + v2 LocalPoint = XAxis + YAxis; + return V2(T.x + LocalPoint.x, T.y + LocalPoint.y); } + static ImVec2 -Layer_LocalToScreenSpace(project_state *State, block_layer *Layer, ui *UI, - real32 SourceWidth, real32 SourceHeight, real32 CompWidth, real32 CompHeight, v2 Point) +Layer_LocalToScreenSpace(project_state *State, memory *Memory, block_layer *Layer, ui *UI, uint32 PrincipalCompIndex, v2 Point) { - real32 Rotation = Layer->rotation.CurrentValue; - real32 s = Layer->scale.CurrentValue; - real32 X = Layer->x.CurrentValue; - real32 Y = Layer->y.CurrentValue; + block_composition *MainComp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, PrincipalCompIndex); + + uint32 Width = 0, Height = 0; + if (!Layer->IsPrecomp) { + block_source *Source = (block_source *)Memory_Block_AddressAtIndex(Memory, F_Sources, Layer->Block_Source_Index); + Width = Source->Width; + Height = Source->Height; + } else { + block_composition *Comp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, Layer->Block_Source_Index); + Width = Comp->Width; + Height = Comp->Height; + } + + layer_transforms T = Layer_GetTransforms(Layer); if (State->Interact_Active == interact_type_viewport_transform && Layer->IsSelected) { - Transform_ApplyInteractive(*(interact_transform *)&State->Interact_Offset[0], &X, &Y, &Rotation, &s); + Transform_ApplyInteractive(*(interact_transform *)&State->Interact_Offset[0], &T.x, &T.y, &T.rotation, &T.scale); } - real32 Rad = (Rotation * (PI / 180)); - real32 AX = Layer->ax.CurrentValue; - real32 AY = Layer->ay.CurrentValue; + v2 NewPos = TransformPoint(T, Width, Height, Point); + + if (Layer->Block_Composition_Index != PrincipalCompIndex) { + layer_transforms T = Layer_GetTransforms(Layer); + NewPos = TransformPoint(T, Width, Height, NewPos); + } + + v2 CompUV = NewPos / V2(MainComp->Width, MainComp->Height); - v2 XAxis = (Point.x - AX*SourceWidth) * s * V2(cos(Rad), sin(Rad)); - v2 YAxis = (Point.y - AY*SourceHeight) * -s * V2(sin(Rad), -cos(Rad)); - v2 LocalPoint = XAxis + YAxis; - v2 CompUV = V2((X + LocalPoint.x) / CompWidth, - (Y + LocalPoint.y) / CompHeight); v2 ScreenPoint = V2(UI->CompPos.x + CompUV.x * UI->CompZoom.x, UI->CompPos.y + CompUV.y * UI->CompZoom.y); -- cgit v1.2.3