From dc0d4a23fdbddef51d5e026f2eefef1731c4e338 Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Tue, 29 Nov 2022 21:04:09 -0500 Subject: effects integration halfway --- my_imgui_widgets.cpp | 350 +++++++++++++++++++++++++++++---------------------- 1 file changed, 203 insertions(+), 147 deletions(-) (limited to 'my_imgui_widgets.cpp') diff --git a/my_imgui_widgets.cpp b/my_imgui_widgets.cpp index 4bdedea..dbadd11 100644 --- a/my_imgui_widgets.cpp +++ b/my_imgui_widgets.cpp @@ -36,12 +36,18 @@ ImGui_PropertyInteract_Slider(project_state *State, memory *Memory, property_cha } static void -ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory *Memory, ImGuiIO io, uint16 *SortedPropertyArray) +ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory *Memory, ImGuiIO io, + sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray, + sorted_property_info *SortedPropertyInfo, uint16 *SortedPropertyArray) { bool32 Display = 1; block_layer *Layer = NULL; + sorted_layer *SortedLayer = NULL; if (State->MostRecentlySelectedLayer > -1) { Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, State->MostRecentlySelectedLayer, 0); + sorted_comp_info SortedCompInfo = SortedCompArray[Layer->Block_Composition_Index]; + sorted_layer *SortedLayerInfo = Layer_GetSortedArray(SortedLayerArray, &SortedCompInfo, Layer->Block_Composition_Index); + SortedLayer = &SortedLayerInfo[State->MostRecentlySelectedLayer]; if (!Layer->Occupied) Display = 0; } else { @@ -58,22 +64,49 @@ ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory * ImVec2 WindowMinAbs = ImGui::GetWindowPos(); ImVec2 WindowMaxAbs = WindowMinAbs + WindowSize; ImGui::Text("Transform"); - for (int h = 0; h < AmountOf(Layer->Property); h++) { - property_channel *Property = &Layer->Property[h]; + + sorted_property_info *InfoLocation = SortedPropertyInfo + SortedLayer->SortedPropertyStart; + uint16 *ArrayLocation = SortedPropertyArray + SortedLayer->SortedKeyframeStart; + int h = 0, c = 0, p = 0; + property_channel *Property = NULL; + block_effect *Effect = NULL; + while (Layer_LoopChannels(State, Memory, &InfoLocation, &ArrayLocation, Layer, &Property, &Effect, &h, &c, &p)) + { ImGui::PushID(Property); - if (ImGui::Button("K")) { - History_Entry_Commit(Memory, "Add keyframe"); - bezier_point Point = { 1, {(real32)State->Frame_Current, Property->CurrentValue, -1, 0, 1, 0}, interpolation_type_linear, 0, {0, 0, 0}, 0 }; - uint16 *ArrayLocation = Property_GetSortedArray(SortedPropertyArray, State->MostRecentlySelectedLayer, h); - Bezier_Add(Memory, Property, Point, ArrayLocation); - History_Entry_End(Memory); + if ((h - 1) < AmountOf(Layer->Property)) { + if (ImGui::Button("K")) { + uint16 *ArrayLocation = Property_GetSortedArray(SortedPropertyArray, State->MostRecentlySelectedLayer, h-1); + Property_AddKeyframe(Memory, Property, State->Frame_Current, ArrayLocation); + } + ImGui::SameLine(); + char *Name = DefaultChannel[h-1]; + ImGui::DragScalar(Name, ImGuiDataType_Float, &Property->CurrentValue, Property->ScrubVal, &Property->MinVal, &Property->MaxVal, "%f"); + ImGui_PropertyInteract_Slider(State, Memory, Property, io, WindowMinAbs, WindowMaxAbs, F_Layers); + } else { + Assert(Effect); + header_effect *EffectHeader = Effect_EntryFromID(State, Effect->ID); + header_property ChannelHeader = State->Property[EffectHeader->PropertyStartIndex + c - 1]; + Assert(EffectHeader->DisplayType == effect_display_type_standard); + if ((c - 1) == 0) { + ImGui::PushID(Effect->Index); + ImGui::Text(EffectHeader->Name); + ImGui::PopID(); + } + if (ChannelHeader.DisplayType == property_display_type_standard) { + if (ImGui::Button("K")) { + // uint16 *ArrayLocation = Property_GetSortedArray(SortedPropertyArray, State->MostRecentlySelectedLayer, h); + // Property_AddKeyframe(Memory, Property, State->Frame_Current, ArrayLocation); + } + ImGui::SameLine(); + ImGui::DragScalar(ChannelHeader.Name, ImGuiDataType_Float, &Property->CurrentValue, Property->ScrubVal, &Property->MinVal, &Property->MaxVal, "%f"); + ImGui_PropertyInteract_Slider(State, Memory, Property, io, WindowMinAbs, WindowMaxAbs, F_Properties); + } else { + Assert(0); + } } - ImGui::SameLine(); - char *Name = DefaultChannel[h]; - ImGui::DragScalar(Name, ImGuiDataType_Float, &Property->CurrentValue, Property->ScrubVal, &Property->MinVal, &Property->MaxVal, "%f"); - ImGui_PropertyInteract_Slider(State, Memory, Property, io, WindowMinAbs, WindowMaxAbs, F_Layers); ImGui::PopID(); } +#if 0 for (int i = 0; i < Layer->Block_Effect_Count; i++) { block_effect Effect = *(block_effect *)Memory_Block_AddressAtIndex(Memory, F_Effects, Layer->Block_Effect_Index[i]); @@ -81,12 +114,19 @@ ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory * ImGui::PushID(Effect.Index); ImGui::Text(EffectHeader->Name); ImGui::PopID(); - if (EffectHeader->DisplayType == effect_display_type_standard) { for (int c = 0; c < EffectHeader->Property_Count; c++) { header_property ChannelHeader = State->Property[EffectHeader->PropertyStartIndex + c]; property_channel *Property = (property_channel *)Memory_Block_AddressAtIndex(Memory, F_Properties, Effect.Block_Property_Index[c]); ImGui::PushID(Property); + // NOTE(fox): We might have to make a system for processing create/delete + // calls after the UI if things like the Count get incremented and invalid + // data is read. if (ChannelHeader.DisplayType == property_display_type_standard) { + if (ImGui::Button("K")) { + uint16 *ArrayLocation = Property_GetSortedArray(SortedPropertyArray, State->MostRecentlySelectedLayer, h); + Property_AddKeyframe(Memory, Property, State->Frame_Current, ArrayLocation); + } + ImGui::SameLine(); ImGui::DragScalar(ChannelHeader.Name, ImGuiDataType_Float, &Property->CurrentValue, Property->ScrubVal, &Property->MinVal, &Property->MaxVal, "%f"); ImGui_PropertyInteract_Slider(State, Memory, Property, io, WindowMinAbs, WindowMaxAbs, F_Properties); } else if (ChannelHeader.DisplayType == property_display_type_color) { @@ -155,6 +195,7 @@ ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory * Assert(0); } } +#endif if (Layer->IsPrecomp) { block_composition *Comp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, Layer->Block_Source_Index); ImGui::DragScalar("Width", ImGuiDataType_U16, &Comp->Width); @@ -1503,165 +1544,178 @@ ImGui_Timeline_DrawKeySheet(project_data *File, project_state *State, memory *Me static void ImGui_Timeline_DrawGraph(project_data *File, project_state *State, memory *Memory, ui *UI, ImGuiIO io, ImDrawList *draw_list, ImVec2 Increment, ImVec2 TimelineAbsolutePos, ImVec2 TimelineMoveSize, ImVec2 TimelineZoomSize, - ImVec2 TimelineSize, ImVec2 TimelineSizeWithBorder, real32 LayerIncrement, sorted_property_info *SortedPropertyInfo, uint16 *SortedPropertyArray) + ImVec2 TimelineSize, ImVec2 TimelineSizeWithBorder, real32 LayerIncrement, + sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray, + sorted_property_info *SortedPropertyInfo, uint16 *SortedPropertyArray) { // I'm using the draw splitter here to be able to draw the dots on top of the graph lines. State->Test.Split(draw_list, 2); - int h = 0, c = 0, i = 0; - while (Block_Loop(Memory, F_Layers, File->Layer_Count, &h, &c, &i)) - { - block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, i); - if (!Layer->IsSelected) - continue; - - int32 Frame_Start = Layer->Frame_Start; + for (int c = 0; c < File->Comp_Count; c++) { + sorted_comp_info SortedCompInfo = SortedCompArray[c]; + sorted_layer *SortedLayerInfo = Layer_GetSortedArray(SortedLayerArray, &SortedCompInfo, c); + for (int i = 0; i < SortedCompInfo.LayerCount; i++) { + sorted_layer *SortedLayer = &SortedLayerInfo[i]; + block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, SortedLayer->Block_Layer_Index); + if (!Layer->IsSelected) + continue; - ImGui::PushID(i); + int32 Frame_Start = Layer->Frame_Start; - if ((State->Interact_Active == interact_type_keyframe_move || - State->Interact_Active == interact_type_keyframe_rotate || - State->Interact_Active == interact_type_keyframe_scale)) - { - ImGui_WarpMouse(State, io.MousePos, TimelineAbsolutePos, TimelineAbsolutePos + TimelineSizeWithBorder); - ImVec2 DragDelta = io.MousePos - ImVec2(State->Interact_Offset[2], State->Interact_Offset[3]); - DragDelta = DragDelta + (ImVec2(State->Warp_X, State->Warp_Y) * TimelineSize); - if (io.MouseDelta.x || io.MouseDelta.y) { - State->UpdateFrame = true; - } - if (State->Interact_Active == interact_type_keyframe_move) { - // The Y increment varies between graphs, so we have to do it in the Bezier_EvaluateValue call. - State->Interact_Offset[0] = (DragDelta.x / TimelineZoomSize.x) / Increment.x; - State->Interact_Offset[1] = DragDelta.y; - } else if (State->Interact_Active == interact_type_keyframe_scale) { - State->Interact_Offset[0] = (DragDelta.x / TimelineSizeWithBorder.x * UI->TimelinePercentZoomed.x) / Increment.x; - } else if (State->Interact_Active == interact_type_keyframe_rotate) { - State->Interact_Offset[0] = (DragDelta.x / TimelineZoomSize.x); - /* - real32 Slope_Old = (Keyframe_ScreenPos.y - State->Interact_Offset[3]) / (Keyframe_ScreenPos.x - State->Interact_Offset[2]); - real32 Slope_New = (Keyframe_ScreenPos.y - io.MousePos.y) / (Keyframe_ScreenPos.x - io.MousePos.x); - State->Interact_Offset[0] = atan((Slope_Old - Slope_New) / (1 + Slope_Old * Slope_New)); - */ - } - ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeAll); - } + ImGui::PushID(i); - for (int h = 0; h < AmountOf(Layer->Property); h++) { - property_channel *Property = &Layer->Property[h]; - sorted_property_info *InfoLocation = Property_GetSortedInfo(SortedPropertyInfo, i, h); - uint16 *ArrayLocation = Property_GetSortedArray(SortedPropertyArray, i, h); - ImGui::PushID(Property); - if (Property->Block_Bezier_Count) { - real32 MinY, MaxY; - Property_MinMax_Y(Memory, State, Property, InfoLocation, &MinY, &MaxY, 0); - real32 Y_Increment = 1 / (MaxY - MinY); - - real32 GraphScale = 0; - real32 GraphPos = 0; - if ((1 / Y_Increment) < 5) { - GraphScale = 0.2; - GraphPos = 0.3; - } else if ((1 / Y_Increment) > 700) { - GraphScale = 0.6; - GraphPos = 0.06; - } else { - GraphScale = 0.4; - GraphPos = 0.2; + if ((State->Interact_Active == interact_type_keyframe_move || + State->Interact_Active == interact_type_keyframe_rotate || + State->Interact_Active == interact_type_keyframe_scale)) + { + ImGui_WarpMouse(State, io.MousePos, TimelineAbsolutePos, TimelineAbsolutePos + TimelineSizeWithBorder); + ImVec2 DragDelta = io.MousePos - ImVec2(State->Interact_Offset[2], State->Interact_Offset[3]); + DragDelta = DragDelta + (ImVec2(State->Warp_X, State->Warp_Y) * TimelineSize); + if (io.MouseDelta.x || io.MouseDelta.y) { + State->UpdateFrame = true; } + if (State->Interact_Active == interact_type_keyframe_move) { + // The Y increment varies between graphs, so we have to do it in the Bezier_EvaluateValue call. + State->Interact_Offset[0] = (DragDelta.x / TimelineZoomSize.x) / Increment.x; + State->Interact_Offset[1] = DragDelta.y; + } else if (State->Interact_Active == interact_type_keyframe_scale) { + State->Interact_Offset[0] = (DragDelta.x / TimelineSizeWithBorder.x * UI->TimelinePercentZoomed.x) / Increment.x; + } else if (State->Interact_Active == interact_type_keyframe_rotate) { + State->Interact_Offset[0] = (DragDelta.x / TimelineZoomSize.x); + /* + real32 Slope_Old = (Keyframe_ScreenPos.y - State->Interact_Offset[3]) / (Keyframe_ScreenPos.x - State->Interact_Offset[2]); + real32 Slope_New = (Keyframe_ScreenPos.y - io.MousePos.y) / (Keyframe_ScreenPos.x - io.MousePos.x); + State->Interact_Offset[0] = atan((Slope_Old - Slope_New) / (1 + Slope_Old * Slope_New)); + */ + } + ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeAll); + } + sorted_property_info *InfoLocation = SortedPropertyInfo + SortedLayer->SortedPropertyStart; + uint16 *ArrayLocation = SortedPropertyArray + SortedLayer->SortedKeyframeStart; + int h1 = 0, c1 = 0, p = 0; + property_channel *Property = NULL; + while (Layer_LoopChannels(State, Memory, &InfoLocation, &ArrayLocation, Layer, &Property, NULL, &h1, &c1, &p)) + { + ImGui::PushID(Property); + if (Property->Block_Bezier_Count) { + real32 MinY, MaxY; + Property_MinMax_Y(Memory, State, Property, InfoLocation, &MinY, &MaxY, 0); + Assert(InfoLocation->MinYIndex < Property->Keyframe_Count); + Assert(InfoLocation->MaxYIndex < Property->Keyframe_Count); + Assert(MaxY >= MinY); + if (MaxY <= MinY) + int p = 0; + real32 Y_Increment = (MaxY - MinY) ? (1 / (MaxY - MinY)) : 0.5; + + real32 GraphScale = 0; + real32 GraphPos = 0; + if ((1 / Y_Increment) < 5) { + GraphScale = 0.2; + GraphPos = 0.3; + } else if ((1 / Y_Increment) > 700) { + GraphScale = 0.6; + GraphPos = 0.06; + } else { + GraphScale = 0.4; + GraphPos = 0.2; + } - real32 GraphMoveHeight = TimelineMoveSize.y + (TimelineZoomSize.y * GraphPos); - real32 GraphZoomHeight = TimelineZoomSize.y * GraphScale; - - uint32 GraphCol = InfoLocation->IsGraphSelected ? IM_COL32(255, 180, 150, 255) : IM_COL32(255, 255, 255, 70); - - bezier_point *PointAddress[2] = {}; - ImVec2 Keyframe_ScreenPos[6] = {}; - for (int p = 0; p < Property->Keyframe_Count; p++) { - int k = ArrayLocation[p]; - int Idx = (p % 2); - int NewIdx = Idx * 3; - int OldIdx = (NewIdx == 3) ? 0 : 3; - PointAddress[Idx] = Bezier_LookupAddress(Memory, Property, k); - - v2 PointPos[3]; - Bezier_EvaluateValue(State, PointAddress[Idx], PointPos, GraphZoomHeight, Y_Increment); - - ImVec2 Keyframe_LocalPos[3] = { V2(PointPos[0]), V2(PointPos[0] + PointPos[1]), V2(PointPos[0] + PointPos[2]) }; - ImVec2 Keyframe_LocalPos_Ratio[3]; - for (int b = 0; b < 3; b++) { - Keyframe_LocalPos_Ratio[b] = (Keyframe_LocalPos[b] - ImVec2(0, MinY)) * ImVec2(Increment.x, Y_Increment); - Keyframe_ScreenPos[NewIdx + b] = TimelineAbsolutePos + ImVec2(TimelineMoveSize.x, GraphMoveHeight) + ((ImVec2(1, -1) * Keyframe_LocalPos_Ratio[b] + ImVec2(0, 1)) * ImVec2(TimelineZoomSize.x, GraphZoomHeight)); - } + real32 GraphMoveHeight = TimelineMoveSize.y + (TimelineZoomSize.y * GraphPos); + real32 GraphZoomHeight = TimelineZoomSize.y * GraphScale; - if (State->BoxSelect) { - if (ImGui_TestBoxSelection_Point(Keyframe_ScreenPos[NewIdx], io, &PointAddress[Idx]->IsSelected)) - State->RecentSelectionType = selection_type_keyframe; - } + uint32 GraphCol = InfoLocation->IsGraphSelected ? IM_COL32(255, 180, 150, 255) : IM_COL32(255, 255, 255, 70); - State->Test.SetCurrentChannel(draw_list, 1); - - ImVec2 ButtonSize(16, 16); - - ImGui::PushID(k); - int Max = PointAddress[Idx]->IsSelected ? 2 : 0; - for (int b = Max; b >= 0; b--) { - ImU32 PointCol = ((PointAddress[Idx]->IsSelected - 1) == b) ? ImColor(0.8f, 0.5f, 0.0f, 1.0f) : ImColor(0.1f, 0.1f, 0.1f, 1.0f); - ImU32 LineCol = ((PointAddress[Idx]->IsSelected - 1) == b) ? ImColor(0.8f, 0.5f, 0.5f, 1.0f) : ImColor(0.4f, 0.4f, 0.4f, 1.0f); - ImGui::PushID(b); - ImGui::SetCursorScreenPos(Keyframe_ScreenPos[NewIdx + b] - (ButtonSize * 0.5)); - ImGui::InvisibleButton("##keyframemover", ButtonSize, ImGuiMouseButton_Left); - bool32 IsHovered = ImGui::IsItemHovered(); - bool32 IsItemActive = ImGui::IsItemActive(); - bool32 IsItemActivated = ImGui::IsItemActivated(); - bool32 IsItemDeactivated = ImGui::IsItemDeactivated(); - bool32 LeftClick = ImGui::IsMouseDown(ImGuiMouseButton_Left); - bool32 RightClick = ImGui::IsMouseDown(ImGuiMouseButton_Right); - - if (IsHovered) { - PointCol = ImColor(1.0f, 0.8f, 0.8f, 1.0f); - ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); + bezier_point *PointAddress[2] = {}; + ImVec2 Keyframe_ScreenPos[6] = {}; + for (int p = 0; p < Property->Keyframe_Count; p++) { + int k = ArrayLocation[p]; + if (Property->Keyframe_Count == 1) + int b = 0; + int Idx = (p % 2); + int NewIdx = Idx * 3; + int OldIdx = (NewIdx == 3) ? 0 : 3; + PointAddress[Idx] = Bezier_LookupAddress(Memory, Property, k); + + v2 PointPos[3]; + Bezier_EvaluateValue(State, PointAddress[Idx], PointPos, GraphZoomHeight, Y_Increment); + + ImVec2 Keyframe_LocalPos[3] = { V2(PointPos[0]), V2(PointPos[0] + PointPos[1]), V2(PointPos[0] + PointPos[2]) }; + + ImVec2 Keyframe_LocalPos_Ratio[3]; + for (int b = 0; b < 3; b++) { + Keyframe_LocalPos_Ratio[b] = (Keyframe_LocalPos[b] - ImVec2(0, MinY)) * ImVec2(Increment.x, Y_Increment); + Keyframe_ScreenPos[NewIdx + b] = TimelineAbsolutePos + ImVec2(TimelineMoveSize.x, GraphMoveHeight) + ((ImVec2(1, -1) * Keyframe_LocalPos_Ratio[b] + ImVec2(0, 1)) * ImVec2(TimelineZoomSize.x, GraphZoomHeight)); } - if (IsItemActivated) { - PointAddress[Idx]->IsSelected = b+1; + if (State->BoxSelect) { + if (ImGui_TestBoxSelection_Point(Keyframe_ScreenPos[NewIdx], io, &PointAddress[Idx]->IsSelected)) + State->RecentSelectionType = selection_type_keyframe; } - if (b != 0 && PointAddress[Idx]->IsSelected) - draw_list->AddLine(Keyframe_ScreenPos[NewIdx], Keyframe_ScreenPos[NewIdx + b], LineCol, 2.0f); + State->Test.SetCurrentChannel(draw_list, 1); + + ImVec2 ButtonSize(16, 16); + + ImGui::PushID(k); + int Max = PointAddress[Idx]->IsSelected ? 2 : 0; + for (int b = Max; b >= 0; b--) { + ImU32 PointCol = ((PointAddress[Idx]->IsSelected - 1) == b) ? ImColor(0.8f, 0.5f, 0.0f, 1.0f) : ImColor(0.1f, 0.1f, 0.1f, 1.0f); + ImU32 LineCol = ((PointAddress[Idx]->IsSelected - 1) == b) ? ImColor(0.8f, 0.5f, 0.5f, 1.0f) : ImColor(0.4f, 0.4f, 0.4f, 1.0f); + ImGui::PushID(b); + ImGui::SetCursorScreenPos(Keyframe_ScreenPos[NewIdx + b] - (ButtonSize * 0.5)); + ImGui::InvisibleButton("##keyframemover", ButtonSize, ImGuiMouseButton_Left); + bool32 IsHovered = ImGui::IsItemHovered(); + bool32 IsItemActive = ImGui::IsItemActive(); + bool32 IsItemActivated = ImGui::IsItemActivated(); + bool32 IsItemDeactivated = ImGui::IsItemDeactivated(); + bool32 LeftClick = ImGui::IsMouseDown(ImGuiMouseButton_Left); + bool32 RightClick = ImGui::IsMouseDown(ImGuiMouseButton_Right); + + if (IsHovered) { + PointCol = ImColor(1.0f, 0.8f, 0.8f, 1.0f); + ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); + } - if (b == 0) { - draw_list->AddCircleFilled(Keyframe_ScreenPos[NewIdx + b], 4, PointCol); - if (InfoLocation->IsGraphSelected) { - char buf[8]; - sprintf(buf, "%.2f", Keyframe_LocalPos[0].y); - draw_list->AddText(Keyframe_ScreenPos[NewIdx + b], 0xFFFFFFFF, buf); + if (IsItemActivated) { + PointAddress[Idx]->IsSelected = b+1; + } + + if (b != 0 && PointAddress[Idx]->IsSelected) + draw_list->AddLine(Keyframe_ScreenPos[NewIdx], Keyframe_ScreenPos[NewIdx + b], LineCol, 2.0f); + + if (b == 0) { + draw_list->AddCircleFilled(Keyframe_ScreenPos[NewIdx + b], 4, PointCol); + if (InfoLocation->IsGraphSelected) { + char buf[8]; + sprintf(buf, "%.2f", Keyframe_LocalPos[0].y); + draw_list->AddText(Keyframe_ScreenPos[NewIdx + b], 0xFFFFFFFF, buf); + } + } else { + draw_list->AddCircle(Keyframe_ScreenPos[NewIdx + b], 6, PointCol, 0, 2); } - } else { - draw_list->AddCircle(Keyframe_ScreenPos[NewIdx + b], 6, PointCol, 0, 2); - } + ImGui::PopID(); + } ImGui::PopID(); - } - ImGui::PopID(); - State->Test.SetCurrentChannel(draw_list, 0); + State->Test.SetCurrentChannel(draw_list, 0); - if (p != 0) { - if (PointAddress[0]->Type == interpolation_type_bezier && PointAddress[1]->Type == interpolation_type_bezier) { - draw_list->AddBezierCubic(Keyframe_ScreenPos[OldIdx], Keyframe_ScreenPos[OldIdx + 2], - Keyframe_ScreenPos[NewIdx + 1], Keyframe_ScreenPos[NewIdx], GraphCol, 1.0f, 0); - } else { - draw_list->AddLine(Keyframe_ScreenPos[0], Keyframe_ScreenPos[3], GraphCol, 1.0f); + if (p != 0) { + if (PointAddress[0]->Type == interpolation_type_bezier && PointAddress[1]->Type == interpolation_type_bezier) { + draw_list->AddBezierCubic(Keyframe_ScreenPos[OldIdx], Keyframe_ScreenPos[OldIdx + 2], + Keyframe_ScreenPos[NewIdx + 1], Keyframe_ScreenPos[NewIdx], GraphCol, 1.0f, 0); + } else { + draw_list->AddLine(Keyframe_ScreenPos[0], Keyframe_ScreenPos[3], GraphCol, 1.0f); + } } } } + ImGui::PopID(); } ImGui::PopID(); } - - ImGui::PopID(); } State->Test.Merge(draw_list); } @@ -2025,8 +2079,8 @@ ImGui_Timeline(project_data *File, project_state *State, memory *Memory, ui *UI, State->FocusedWindow = focus_timeline; } - if (State->TimelineMode == timeline_mode_graph) - ImGui_GraphInfo(File, State, Memory, UI, io, SortedPropertyInfo, SortedPropertyArray); + // if (State->TimelineMode == timeline_mode_graph) + // ImGui_GraphInfo(File, State, Memory, UI, io, SortedPropertyInfo, SortedPropertyArray); real32 FontHeight = ImGui::GetFontSize(); @@ -2123,7 +2177,9 @@ ImGui_Timeline(project_data *File, project_state *State, memory *Memory, ui *UI, IM_COL32(50, 50, 50, 230)); ImGui_Timeline_DrawGraph(File, State, Memory, UI, io, draw_list, Increment, TimelineAbsolutePos, GraphMoveSize, GraphZoomSize, - TimelineSize, TimelineSizeWithBorder, LayerIncrement, SortedPropertyInfo, SortedPropertyArray); + TimelineSize, TimelineSizeWithBorder, LayerIncrement, + SortedCompArray, SortedLayerArray, + SortedPropertyInfo, SortedPropertyArray); } ImGui_Timeline_HorizontalIncrementDraw(State, UI, draw_list, TimelineSizeWithBorder, TimelineAbsolutePos, *MainComp, TimelineZoomSize, TimelineMoveSize); -- cgit v1.2.3