summaryrefslogtreecommitdiff
path: root/src/include/main.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/main.h')
-rw-r--r--src/include/main.h686
1 files changed, 686 insertions, 0 deletions
diff --git a/src/include/main.h b/src/include/main.h
new file mode 100644
index 0000000..3c7ff83
--- /dev/null
+++ b/src/include/main.h
@@ -0,0 +1,686 @@
+enum instruction_mode {
+ instruction_mode_scalar,
+#if ARM
+ instruction_mode_neon,
+#else
+ instruction_mode_sse,
+ instruction_mode_avx
+#endif
+};
+
+static char* BlendmodeNames[] = {
+ "Normal",
+ "Multiply",
+ "Color Burn",
+ "Linear Burn",
+ "Add",
+ "Screen",
+ "Overlay",
+ "Soft Light",
+ "Hard Light",
+ "Subtract",
+ "Divide",
+ "Difference"
+};
+
+enum blend_mode
+{
+ blend_normal,
+ blend_multiply,
+ blend_colorburn,
+ blend_linearburn,
+ blend_add,
+ blend_screen,
+ blend_overlay,
+ blend_softlight,
+ blend_hardlight,
+ blend_subtract,
+ blend_divide,
+ blend_difference
+};
+
+#define STRING_SIZE (1024 - sizeof(uint8)) // TODO(fox): Paths above STRING_SIZE length aren't handled properly.
+struct block_string {
+ uint8 Occupied;
+ char Char[STRING_SIZE];
+};
+
+struct bitmap_cache_status
+{
+ uint32 Block_End;
+};
+
+enum cache_entry_type
+{
+ cache_entry_type_assert,
+ cache_entry_type_comp,
+ cache_entry_type_source
+};
+
+struct cache_entry
+{
+ uint8 IsOccupied;
+ uint8 IsCached;
+ uint64 CycleTime;
+ uint32 Block_StartIndex;
+ enum cache_entry_type Type;
+ uint32 TypeInfo;
+ uint32 TypeInfo_Sub;
+};
+
+enum interpolation_type
+{
+ interpolation_type_linear,
+ interpolation_type_bezier,
+ interpolation_type_hold
+};
+
+struct bezier_point {
+ uint8 Occupied;
+ v2 Pos[3];
+ interpolation_type Type;
+ bool32 IsSelected;
+ uint8 PointSelect[3];
+ uint8 Color;
+};
+
+struct block_bezier {
+ uint8 Occupied;
+ bezier_point Point[MAX_KEYFRAMES_PER_BLOCK];
+};
+
+enum selection_type
+{
+ selection_type_none,
+ selection_type_layer,
+ selection_type_keyframe
+};
+
+struct clipboard_channel {
+ void *Name;
+ uint16 LayerOffset;
+ uint16 KeyframeCount;
+};
+
+struct clipboard_contents {
+ selection_type Type;
+ clipboard_channel Channel[16];
+ uint16 ChannelCount;
+};
+
+struct layer_bitmap_state {
+ // Image and video
+ bool32 ToUpdate = 1;
+
+ // GL state
+ // gl_effect_layer Test;
+ // gl_effect_layer TestM;
+
+ // Video state
+ int32 CurrentFrame = -1; // The last frame number rendered to the bitmap. -1 gurantees a load upon layer creation.
+ void *AVInfo; // Internal data containing current frame info
+};
+
+struct render_state
+{
+ struct layer_bitmap_state Bitmap[MAX_LAYERS];
+ cache_entry Entry[2048];
+};
+
+struct render_queue_item
+{
+ bool32 Type;
+ v2 Pos;
+};
+
+struct render_queue
+{
+ uint16 Playhead;
+ uint16 CurrentIdx;
+ render_queue_item Item[512];
+};
+
+enum focused_window
+{
+ focus_viewport,
+ focus_properties,
+ focus_timeline
+};
+
+struct sorted_property_array
+{
+ uint32 MinYIndex;
+ uint32 MaxYIndex;
+};
+
+struct sorted_comp_array
+{
+ uint32 LayerCount;
+ uint32 CurrentSortIndex; // Used intermediately in the sorting algorithm
+};
+
+struct sorted_layer_array
+{
+ uint16 Block_Layer_Index;
+ real32 SortedOffset;
+ uint16 Sorted_Effect_Index[MAX_EFFECTS];
+ uint16 SortedPropertyStart;
+ uint16 SortedKeyframeStart;
+};
+
+struct sorted_file
+{
+ sorted_comp_array *CompArray;
+ sorted_layer_array *LayerArray;
+ sorted_property_array *PropertyStart;
+ uint16 *PropertyArray;
+ uint16 *SourceArray; // sorted by 'recency,' wip for stablediffusion stuff
+ uint16 TempSourceCount;
+ uint64 Layer_SortSize;
+ uint64 Property_SortSize;
+ uint64 Source_SortSize;
+};
+
+enum timeline_mode
+{
+ timeline_mode_default,
+ timeline_mode_graph
+};
+
+struct pen_state {
+ bool32 IsActive;
+};
+
+struct brush_state
+{
+ ImVec2 UIPos; // Initial position when ctrl is held
+ real32 Size = 256; // Maxes at 1024 for now
+ real32 Hardness = 0.55f; // From 1 to 100
+ real32 Spacing = 1.0f;
+ bool32 EraseMode = 0;
+ GLuint GLTexture;
+ v2 PrevPos;
+ void *PaintBuffer;
+ void *TransientBitmap;
+ uint32 LayerToPaint_Index = -1;
+ rectangle CacheBounds = { 99999, 99999, -99999, -99999 };
+};
+
+enum interact_type
+{
+ interact_type_none,
+ interact_type_timeline_scrub,
+ interact_type_slider_scrub,
+ interact_type_layer_move,
+ interact_type_layer_timeadjust,
+ interact_type_viewport_transform,
+ interact_type_keyframe_move,
+ interact_type_keyframe_scale,
+ interact_type_keyframe_rotate,
+ interact_type_brush
+};
+
+char *ToolName[] {
+ "Move",
+ "Crop",
+ "Brush",
+ "Pen"
+};
+
+enum tool {
+ tool_default,
+ tool_crop,
+ tool_brush,
+ tool_pen,
+ tool_count
+};
+
+struct interact_transform
+{
+ v2 Min;
+ v2 Max;
+ real32 Radians;
+ v2 Position;
+ real32 Scale = 1.0f;
+ ImVec2 OGPos;
+ uint32 TransformMode;
+};
+
+enum hotkey_input
+{
+ hotkey_none,
+ hotkey_newpaintlayer,
+ hotkey_newlayerfromsource,
+ hotkey_deletelayer,
+ hotkey_undo,
+ hotkey_redo,
+};
+
+enum property_display_type
+{
+ property_display_type_standard,
+ property_display_type_blendmode,
+ property_display_type_color
+};
+
+struct header_property
+{
+ char *Name;
+ real32 DefaultValue;
+ property_display_type DisplayType;
+ real32 MinVal;
+ real32 MaxVal;
+ bool32 AlwaysInteger;
+
+};
+
+struct gl_effect_layer {
+ bool32 Initialized;
+ GLuint Texture;
+ GLuint FramebufferObject;
+ uint32 Color_Renderbuffer;
+ uint32 Stencil_Renderbuffer;
+};
+
+
+enum effect_display_type
+{
+ effect_display_type_standard,
+ effect_display_type_levels,
+ effect_display_type_curves
+};
+
+struct block_effect
+{
+ uint8 Occupied;
+ char ID[8];
+ bool32 IsToggled;
+ uint32 Block_Property_Index[MAX_PROPERTIES_PER_EFFECT];
+ real32 ExtraData[16];
+};
+
+struct header_effect
+{
+ char *Name;
+ char *ID; // Eight-letter string that's used in the actual file
+ void (*func)(real32 *, int, int, int, void *, uint16);
+ uint16 PropertyStartIndex;
+ uint16 Property_Count;
+ effect_display_type DisplayType;
+ bool32 UseGL;
+ uint32 GLShaderIndex;
+};
+
+enum imgui_popups
+{
+ popup_none,
+ popup_saveas,
+ popup_keybinds
+};
+
+struct project_state
+{
+ bool32 UpdateKeyframes = 0;
+ bool32 UpdateFrame = 1; // only refreshes frame; set UpdateKeyframes to update animation
+ bool32 DebugDisableCache = 1;
+ uint32 CachedFrameCount;
+
+ uint64 HotFramePerf = 0;
+
+ uint32 AVCount;
+
+ render_state Render;
+ render_queue Queue;
+
+ int32 Frame_Current;
+ tool Tool = tool_default;
+ // GLuint ToolIconTex[(int)tool_count];
+ pen_state Pen = {};
+ brush_state Brush;
+
+#if STABLE
+ int32 CurlActive = 0;
+ char JSONPayload[1024*1024*4];
+ real32 SDPercentDone;
+ real32 SDTimeEstimate;
+ real64 SDTimer;
+#endif
+
+ header_effect Effect[128];
+ header_property Property[512];
+ uint16 Playhead_Effect;
+ uint16 Playhead_Property;
+
+ int32 PreviewLayer = -1;
+ int32 PreviewSource = -1;
+
+ hotkey_input HotkeyInput;
+
+ void *Dump1;
+ void *Dump2;
+
+ char DummyName[512];
+ char DummyName2[512];
+
+ bool32 IsRunning = 1;
+ bool32 IsPlaying;
+ bool32 PlayAudio;
+ int32 FramePlayingCount;
+ bool32 FirstFrame = 1;
+ int32 AudioLayerIndex = -1;
+
+ void *ClipboardBuffer;
+ uint64 ClipboardSize;
+
+ int16 MostRecentlySelectedLayer = -1;
+
+ // NOTE(fox): Try to use this only where you actually need it (the
+ // ambiguous case of copying keyframes versus layers), since this state
+ // transfer will get buggy if you expand it to everything.
+ selection_type RecentSelectionType = selection_type_none;
+
+ interact_type Interact_Active;
+ int32 Interact_Modifier;
+ real32 Interact_Offset[12];
+ void *Interact_Address;
+
+ int32 Initializing = 3;
+
+ int32 MsgTime; // currently in "frames"
+ char *Msg;
+
+ imgui_popups ImGuiPopups;
+ char Filename[512];
+
+ ImGuiTextFilter filter; // This filter API is pretty ballin'.
+ bool32 RerouteEffects; // Allows shift+space hotkey to gain focus on the effects panel.
+
+ ImDrawListSplitter Test;
+ ImDrawListSplitter Split_KeybindUI;
+
+ int32 Warp_X = 0;
+ int32 Warp_Y = 0;
+ bool32 Warp_WantSetPos = false;
+ ImVec2 Warp_PositionToSet;
+ real32 Warp_PositionInitial;
+ int32 Warp_Direction;
+
+ uint32 InteractTransformMode; // Whether a drag on the Shift+T UI is scale (1), rotation (2), or position (3).
+
+ timeline_mode TimelineMode;
+
+ bool32 BoxSelect;
+
+ focused_window FocusedWindow; // Convenience for adding window-specific hotkeys.
+ bool32 SetFocus;
+ v2 TempZoomRatio = V2(1, 1);
+};
+
+// UI info that's saved to the file and is not part of the history tree
+struct ui
+{
+ ImVec2 CompZoom; // In screen pixels, not percentage.
+ ImVec2 CompPos;
+
+ // Under 1 is zoomed in!
+ ImVec2 TimelinePercentZoomed;
+ ImVec2 TimelinePercentOffset;
+
+ ImVec2 GraphZoomSize;
+ ImVec2 GraphMoveSize;
+
+ v4 Color = {1, 1, 1, 1};
+ v4 AltColor = {0, 0, 0, 1};
+ bool32 IsPrimary;
+
+#if STABLE
+ sd_state SD;
+ bool32 StableEnabled = 0;
+#endif
+
+ ImU32 LayerColors[16] = {
+ 0xff8b1f1f,
+ 0xffc25909,
+ 0xff57c20a,
+ 0xff8ee6da,
+ 0xffa48fb7,
+ 0xffd14061,
+ 0xff38b683,
+ 0xff3fdbe5,
+ 0xffc9c9c9,
+ 0xff978489,
+ 0xfffaf5ab,
+ 0xff101010,
+ 0xffa024ca,
+ 0xfffae920,
+ 0xff208dfa,
+ 0xfffa2051
+ };
+};
+
+
+struct project_data
+{
+ uint8 Occupied;
+ uint16 Layer_Count;
+ uint16 Source_Count;
+ uint16 Comp_Count;
+ uint16 PrincipalCompIndex;
+ ui UI;
+};
+
+struct block_composition
+{
+ uint8 Occupied;
+
+ uint16 Name_String_Index;
+
+ uint16 Width;
+ uint16 Height;
+ uint16 BytesPerPixel;
+ uint16 FPS;
+
+ uint32 Frame_Count;
+ int32 Frame_Start;
+ int32 Frame_End;
+};
+
+struct layer_transforms
+{
+ real32 x;
+ real32 y;
+ real32 ax;
+ real32 ay;
+ real32 rotation;
+ real32 scale;
+};
+
+enum source_type {
+ source_type_none,
+ source_type_principal,
+ source_type_principal_temp,
+ source_type_file
+};
+
+struct block_source
+{
+ uint8 Occupied;
+
+ bool32 IsSelected;
+
+ uint16 Path_String_Index;
+ uint16 Name_String_Index;
+
+ // Only used for type_principal
+ uint16 Bitmap_Index;
+
+ uint16 Width;
+ uint16 Height;
+ uint16 BytesPerPixel;
+
+ // LibAV specific
+ real32 FPS;
+ bool32 HasAudio;
+ bool32 HasVideo;
+
+ uint32 RelativeTimestamp;
+ GLuint ThumbnailTex;
+
+ source_type Type;
+};
+
+struct property_channel {
+ uint8 Occupied;
+ uint16 Block_Bezier_Index[MAX_KEYFRAME_BLOCKS];
+ uint16 Block_Bezier_Count;
+ uint16 Keyframe_Count;
+
+ int32 Identifier;
+
+ real32 CurrentValue;
+ real32 MaxVal;
+ real32 MinVal;
+ bool32 AlwaysInteger;
+ real32 ScrubVal; // increment when dragging on sliders, etc.
+
+ bool32 IsToggled;
+};
+
+char *DefaultChannel[] = { "X Position", "Y Position", "Anchor X", "Anchor Y",
+ "Rotation", "Scale", "Opacity", "Frame Number" };
+
+struct block_layer {
+ uint8 Occupied;
+
+ bool32 IsPrecomp;
+ bool32 Precomp_Toggled;
+ uint16 Block_Source_Index; // also used for precomp
+ uint16 Block_String_Index;
+ uint16 Block_Composition_Index;
+
+ uint16 Block_Mask_Index[MAX_MASKS];
+ uint16 Block_Mask_Count;
+
+ uint16 Block_Effect_Index[MAX_EFFECTS];
+ uint16 Block_Effect_Count;
+
+ blend_mode BlendMode;
+
+ union
+ {
+ property_channel Property[8];
+ struct
+ {
+ property_channel x;
+ property_channel y;
+ property_channel ax;
+ property_channel ay;
+ property_channel rotation;
+ property_channel scale;
+ property_channel opacity;
+ property_channel time;
+ };
+ };
+
+ bool32 IsSelected;
+ bool32 IsVisible;
+ bool32 IsAdjustment;
+
+ int32 Frame_Start;
+ int32 Frame_End;
+
+ real32 Vertical_Offset;
+ real32 Vertical_Height = 1;
+
+ uint16 ColIndex;
+};
+
+struct render_byte_info {
+ uint32 MaskPixel;
+ uint32 ByteOffset;
+ uint32 Bits;
+ real32 Normalized;
+};
+
+struct transform_info {
+ real32 XAxisPX;
+ real32 XAxisPY;
+ real32 YAxisPX;
+ real32 YAxisPY;
+
+ real32 LayerWidth;
+ real32 LayerHeight;
+ real32 LayerBytesPerPixel;
+ real32 LayerPitch;
+ render_byte_info LayerBits;
+
+ real32 BufferWidth;
+ real32 BufferHeight;
+ real32 BufferBytesPerPixel;
+ real32 BufferPitch;
+ render_byte_info BufferBits;
+
+ real32 LayerOpacity;
+ real32 OriginX;
+ real32 OriginY;
+ blend_mode BlendMode;
+
+ bool32 IsAdjustment;
+
+ rectangle ClipRect;
+ void *SourceBuffer;
+};
+
+struct direct_info {
+ real32 BufferWidth;
+ real32 BufferHeight;
+ real32 BufferBytesPerPixel;
+ real32 BufferPitch;
+ render_byte_info BufferBits;
+
+ real32 Opacity;
+
+ blend_mode BlendMode;
+ rectangle ClipRect;
+ void *SourceBuffer;
+
+ bool32 SwapActive;
+ bool32 OnlyBlendAlpha;
+};
+
+struct brush_info {
+ uint32 BrushLength;
+ rectangle LayerBounds;
+ uint32 LayerPitch;
+ uint32 BrushPitch;
+ int32 ExtraX;
+ int32 ExtraY;
+ render_byte_info LayerBits;
+ render_byte_info BrushBits;
+ int BytesPerPixel;
+ int SourceWidth;
+ int SourceBytesPerPixel;
+ void *SourceBuffer;
+ void *BrushBuffer;
+ real32 R_Brush;
+ real32 G_Brush;
+ real32 B_Brush;
+ real32 A_Brush;
+ bool32 EraseMode;
+ uint8 *BrushRow;
+};
+
+enum render_type {
+ render_type_main,
+ render_type_notransform,
+ render_type_notransform_swap,
+ render_type_brush
+};
+
+struct render_entry {
+ void *RenderData;
+ void *OutputBuffer;
+ render_type RenderType;
+ rectangle RenderRegion;
+};
+