Page 1 of 1

Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 30 Sep 2024, 23:21
by kelanhordos
Hello, here are a couple of custom panels I've developed and explanation of what they do/how to use them.

PLEASE NOTE: These were made for TVPAINT 12, and while I've tested them on the demo version of 11.7.3, and they function fine there I have not tested them as thoroughly. Also, I am new to scripting, and only after trying one final time did I make some headway with GEORGE. I've tried to debug these panels/scripts as much as I can testing it out myself. They should work fine, but they do use a loop, and it's possible I missed some variable that might cause it to misfire. If after installing them, you end up having an issue where it seems like TVPAINT is frozen, please hold the ESCAPE key for a second or two, if there is some issue with the code being stuck in a loop or executing it will cancel the script out.

Flip Keyboard Toggle v1.0.tvpx
(437 KiB) Downloaded 199 times
Flips Toggle v1.0.tvpx
(241 KiB) Downloaded 202 times

(I had posted an earlier version in another thread in the George scripting subforum, this version gets rid of some bugs I discovered, changed the way some of the code was built, more features etc. etc. I will call this version v1.0 as the other thread was mostly to show Sven what I had been thinking of and had gotten to work somewhat)



Flip Keyboard Toggle
The idea behind this panel is some similar functionality to Harmony as discussed in this thread: https://forum.tvpaint.com/viewtopic.php ... 17#p124917
Basically, I want to have two buttons on my keyboard set as shortcuts to move backward/forward along the timeline, with the ability to toggle on/off options for which images those shortcuts go to, and that's in short what this panel does.

**note These panels makes use of writing/reading to the config file under the head [kcustom]. It shouldn't cause any problems in the config, but If you want remove the panel and any remove traces of it, go into the config.ini file in the AppData\Roaming\TVPaint\Confignamehere and open it in a text editor and delete the portion underneath [kcustom].


FlipKeyboardToggle3.jpg
FlipKeyboardToggle3.jpg (85.09 KiB) Viewed 4372 times

Parts of the Custom Panel

1. Backward/Forward Keys > First thing is you will need to set up a shortcut key for going backward and forward along the timeline. I use F and G respectively. Once you have set these shortcuts, you can close the horizontal divider in the custom panel to hide those buttons to make it smaller.

**I would also highly suggest setting a modifier key such as shift or ctrl + the above two buttons to either layer > Go LEFT/RIGHT or layer > Prev/Next IMAGE. This will be explained more later, but because the script only moves between instance heads, these added shortcuts will give you the ability to move through individual exposures to break them etc. I use shift F + G myself.

2. K B E I Buttons > These four buttons make up the main portion of the functionality.
Keys, Breakdowns, Extremes and Inbetweens respectively, they will use the first 3 built in Image Marks for Keys, Breakdowns, and Extremes. For Inbetweens, the script does not use an Image Mark, but rather the lack of a Mark to determine which instances should be considered an inbetween.

The way these buttons work is pressing them once will turn that respective flag on, and pressing it again will turn the flag off.

FlipKeyboardToggle4.jpg

(Just a quick explanation: I don't use extremes in my own workflow, but having an extra flag to work with is useful for a number of reasons. I've put extremes after breakdowns in the "hierarchy order" though technically they would come before in importance: see the discussion in the above linked thread for more discussion about Keys/Extremes etc if you are so inclined. If this is annoying to you, you can just simply swap the icons and use what is the current Breakdown button and MARK 2 for Extremes and vice versa, BUT just be aware in the code underneath the flags are labelled as Mark 2 = BD, Mark 3 = EX and so only change the ICON of the buttons, not the button order or it may break things).

The buttons are color agnostic in the script as the code only checks for the built in number of Mark 1, Mark 2, and Mark 3(labelled A, B, C respectively by default in v12.0.1) So please feel free to recolor and change the icons accordingly, I use different colors myself but thought for demonstration this would be simpler.
FlipKeyboardToggle2.jpg
FlipKeyboardToggle2.jpg (57.69 KiB) Viewed 4372 times
(If you are inclined, the code *I think* should be simple enough to add any number of flags/marks you want. If you look at each button and the george scripts that are produced by installing the script, they are documented to explain whats happening. I haven't tried this but it should be not to difficult the way I have it set up)


3. Check Button > The check button is super important and should get it's own shortcut. (I use CTRL + F) As TVPaint has no way to tell you if a custom panel button is turned on/off, this is the workaround I am using. Pressing the check button will bring up a menu at your mouse position with the following options.

FlipKeyboardToggle6.jpg
FlipKeyboardToggle6.jpg (48.25 KiB) Viewed 4372 times

The numbers show the relationship of the Custom Panel buttons to their respective options in the Menu.

The top row(highlighted in white) is your "Check" portion, which will be how you can quickly reference which Flags are on/off. (note**Choosing this option, cancelling out, or clicking outside the menu will not do anything)
From left to right they correspond with the K, B, E, I, WRAP buttons. An O will mean that flag/button is ON and an X will mean that button/flag is OFF.

The other portions of the drop down menu give you another option of setting flags on/off as if you were clicking the custom panel buttons. WRAP and ALL open sub menu's with ON/OFF and will be explained below.

4.Wrap Menu > This will allow you to set wrap ON/OFF which will cause the script to wrap around and start at the beginning/end of the layer looking for the next image to go to. This acts like the "Loop" function available in the built in Image Mark menu when you use the built in prev/next mark shortcuts, but also works for inbetweens. Wrap will work as soon as you are at the image in a layer where there are no more flags in that direction to continue to.

5.ALL Menu > This will set all flags On/Off.

The Function of the Script

Setting the script flags for K, B, E, I will cause your shortcut keys(F, G in this example) to skip all images aside from those flagged with their respective Image Mark, or lack thereof for Inbetweens.

These flags operate irrespective of each other, so you can have any combination set on/off and those that are OFF will be skipped.

For a first and simplest example is if you have only K turned on, then F/G will only go between your Red Image Mark(Key) frames.
Another example if you have K & B set, then using F/G will only go backward/forward to images Marked with Red(Keys)/Orange(Breadkdowns).
If you have only I(inbetweens on) all frames that have an Image Mark will be skipped as the script looks then for non-marked frames(this includes ANY marks not just the first 3 in the list).

Some important functionality notes:

-By default the flags are all off and if you try and use F/G with all flags off, the Inbetweens flag will automatically turn on. This is to prevent everything being turned off and the user coming back between sessions and forgetting why nothing is happening. Also, if there are any marks outside the first 3 added to an image, that image will be skipped by the IB flag, so this is one way to have all your flags ON when going through every instance but skip certain frames/images.

-If wrap is set to OFF, you can proceed outside the start or end of a layer's current images so that adding more instances is easier(this is an improvement over the original script). This is better as it functions like the default behaviour of next/previous instance shortcut to allow easily adding new frames.

-When wrap is on, having shift + F/G which we set up to earlier as layer:next/prev image or layer:go left/right will be the quickest way to move outside the current images to add new frames(You can use mouse or other keyboard shortcuts as well). Wrap will only function WITHIN a layer's images, so if you use your mouse or another shortcut to go outside the current set of images(to an empty frame) and try and press F/G, wrap is automatically turned off and you will proceed frame by frame as normal. If you use the shift F/G key to get outside, then add a new image, Wrap will continue to stay ON.

-As mentioned earlier the main script only moves between instance heads, these added shortcuts of shift F/G(in this example) will serve another use, which is to move through individual exposures to break them etc. HOWEVER, if any image marks are set to an individual exposure the script will go to them if the respective flag is enabled.

-If wrap is ON and there is no other flagged images on a layer for the script to go to(such as a layer with a single image), it will give you a warning (both to prevent an infinite loop, and remind you wrap is on and that's why you aren't moving).

-The script functions on each type of layer(anim, bg, ctg) except Puppet, Folder layers and the Camera layer. Note it functions fine on the layers inside a folder, but not on the folder layer itself. (Puppet layers are a bit buggy, and function a bit differently, so I have it disabled for now)

I think that's pretty much it for that custom panel, I've tried to be exhaustive especially for the aspects that might not be readily apparent, and if I realize I left anything out I will edit this.

The second panel:



Flips Toggle
This functions very similarly and is meant to compliment the above Panel. It looks about the same so I won't go over every button again, but note that the WRAP/ALL buttons do not exist. I'll explain that below.

The main idea behind this panel is to have one single shortcut(in my case I use W) for a FLIP that can have its behaviour changed without having to go into the FLIP MENU to do so. The added bonus of the CHECK menu means you can also do this at your mouse cursor very easily.
FlipsToggle2.jpg
FlipsToggle2.jpg (35.83 KiB) Viewed 4372 times
First thing, we need to create a MANUAL FLIP in the built in Flip menu, and call it "FlipsToggle" no quotes or spaces between words, case should not matter. Set a shortcut, I am going to use "W" for this example. You can
Next go to your shortcut menu and set a shortcut for the CHECK menu as we did for the previous panel. This functions the same albeit with some differences outlined below. I am using "SHIFT + W" for this shortcut as its ergonomic for me.

If you try and use the script it will always check there is a flip named FlipsToggle, if there is not it will prompt you to create it and exit. Please make sure FlipsToggle is a MANUAL flip, it will not function as intended for other flip types.

Note**The rest of the settings in the flip panels, such as limits, return to origin OOP etc. as far as I have tested shouldn't cause any bugs as this script is using the built in FLIPS functionality, and simply changing the CHECKPOINT flags. However, be aware I use the settings in the panel shown and haven't exhaustively tested those other options.

The 3 main buttons function the same as before. If you flag K, B, or E, it is going to change the settings for "FlipsToggle" CHECKPOINTS to Mark1, Mark2, Mark3 as checked respectively. These can be combined and toggled on/off irrespective of each other to skip certain marked frames and not others.

Important to note, anytime you flag one of the Marks, it will automatically turn the IB flag off. If you want to include IBs, you need to turn that one on separately, there is more info below in the IB section regarding how to go through all your instances.

So with all 3 Marks on it will look like this
FlipsToggle3.jpg
FlipsToggle3.jpg (47.14 KiB) Viewed 4372 times
Now, the major difference between the two panels is how the "I" or Inbetween flag works.

With this panel, flagging the IB ON will change the CHECKPOINTS to INSTANCES (irrespective of if you have any or all marks flagged OFF). This functionality will also allow you to keep your MARK flags set to on, but then while IB is flagged you will go through all instances, and then when you flag off IB's again you will have your Marks still flagged as previously.
FlipsToggle4.jpg
FlipsToggle4.jpg (35.98 KiB) Viewed 4372 times
The other differences between the panels are:
There is already a WRAP option built into the Flips Panel, which is "Loop between limits," but there is no shortcut for turning that on/off that in the custom panel (maybe on my to do list for later).

Also the way the ALL button functions is different. It will still toggle all Flags ON/OFF, but with all flags set to OFF, the Checkpoint will instead change to ALL IMAGES, this is some added functionality so you have an option to go through exposures as well to break them etc. with just this custom panel.
FlipsToggle5.jpg
FlipsToggle5.jpg (30.42 KiB) Viewed 4372 times
One last tiny note: the way FLIPS function is that if you are on a frame not flagged when you start to use the FLIP, it will include that frame as you cycle through your "roll". This is a feature not a bug I believe, and so if for example you have only KEYS on, and start using a FLIP while on a Breakdown, it will include that Breakdown as you "roll." When you stop on a KEY, and start again, that Breakdown that was included before will now not be included in the "roll" because it is not part of the Checkpoints flag.

Hopefully you find these panels useful if you were looking for this kind of function, if it existed as a custom panel elsewhere on the forum and I somehow missed it then please ignore(haha, *cry*)
Please report any bugs you run into and I will do my best to fix them. Also let me know if you think it can be improved or if it is useful to you at all.

Special thanks to Svengali for pointing me in the direction of using tv_writeuserstring and tv_readuserstring for toggleable buttons and encouraging me that once you get around some syntax stuff, George is not too bad.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 02 Oct 2024, 08:55
by NathanOtano
Really cool panel thanks for sharing :)

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 08 Oct 2024, 09:39
by Jeremy Richard
This is a very nice addition.

kelanhordos wrote: 30 Sep 2024, 23:21 the script only moves between instance heads
Lately I've been experimenting with the markers' buttons from Lukas Sketch Panel which mark all frames of the instance and not just the head. And so in that case, the forward and backward button of your panel move through all frames and not just on the instance's head, which doesn't seem to be intended. Unless I missed something. I'm using TVPaint 11.7.3.
kelanhordos wrote: 30 Sep 2024, 23:21 If you are inclined, the code *I think* should be simple enough to add any number of flags/marks you want.
Regarding changing the colours of the marks, maybe you can add a button so one can do it from the panel and not having to go into the code.

To that effect, at the moment, for my panel, I'm using the following script in combination with some of Lucas' panel buttons:
Set_colour_button.png
Set_colour_button.png (29.34 KiB) Viewed 4142 times

Code: Select all

// Set_mark_colour.grg
// Set colours for each type of mark

// Ask for type of mark
tv_listrequest "Keyframe|Breakdown|Extreme|Inbetween|Other"
PARSE RESULT number key_type

// Ask for the colour of the selected type of mark
tv_listrequest "None|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z"
PARSE RESULT id letter

// Save variables
tv_WriteUserString "LukasSketchPanel" key_type id
tv_WriteUserString "GroupLetter" key_type letter

// Gather id variables
tv_ReadUserString "LukasSketchPanel" Keyframe
keyframe_mark_id = RESULT
tv_ReadUserString "LukasSketchPanel" Breakdown
breakdown_mark_id = RESULT
tv_ReadUserString "LukasSketchPanel" Extreme
extreme_mark_id = RESULT
tv_ReadUserString "LukasSketchPanel" Inbetween
inbetween_mark_id = RESULT
tv_ReadUserString "LukasSketchPanel" Other
other_mark_id = RESULT

// Gather group letters
tv_ReadUserString "GroupLetter" Keyframe
keyframe_mark_colour = RESULT
tv_ReadUserString "GroupLetter" Breakdown
breakdown_mark_colour = RESULT
tv_ReadUserString "GroupLetter" Extreme
extreme_mark_colour = RESULT
tv_ReadUserString "GroupLetter" Inbetween
inbetween_mark_colour = RESULT
tv_ReadUserString "GroupLetter" Other
other_mark_colour = RESULT

// Display the colour scheme
tv_warn "Keyframe: " keyframe_mark_colour '\n' "Breakdown: " breakdown_mark_colour '\n' "Extreme: " extreme_mark_colour '\n' "Inbetween: " inbetween_mark_colour '\n' "Other: " other_mark_colour
Then for each marker button I have something like this:
Markers.png
Markers.png (34.52 KiB) Viewed 4142 times
first with a code to "catch" the variable with the set colour

Code: Select all

tv_ReadUserString "LukasSketchPanel" Keyframe
keyframe_mark_id = RESULT
tv_WriteUserString "LukasSketchPanel" "Color" keyframe_mark_id
(With the corresponding "id" variable for each button)

Then secondly, a version of Lukas' color_marker.grg script from his Sketch Panel marker buttons.

Feel free to use any of this if you think it can be of any use to you.
I myself will definitively look at the way you did your "Check" button to improve my "Set colour" button. The O and X references at the top of the menu is a nice touch.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 08 Oct 2024, 14:04
by kelanhordos
Hi Jeremy, thanks for the feedback, it's hard to know what would be best with all the options available and people's workflows, so I really appreciate it.

I took a look at Lukas's panel, you are right that coloring all the images breaks the functionality. I didn't realize it did that, and testing it out in my work flow I feel it would adds extra steps, as I often add exposures and then break/clear them to get new frames and doing that this way leaves the Mark on them after breaking/clearing, which I would then need to clear. It does look a lot nicer and quicker to see at a glance though, so I can see its usefulness.

I've uploaded a version here with the added a condition to where the code checks for the Mark flag to also check the instance is a head, can you see if this works for you? (This would break it being able to go to Marks on an exposure, as it will only go to heads now in this version, but I'm not sure how useful that is anyhow) I would still need adjust which marks are used to be more compatible with Lukas panel, but that's a good idea you have about setting which marks are used in a button. Looking at how you have a menu for it makes sense, and that would make it a lot more flexible. I think I can add a similar button with a menu/submenu to set each mark as a flag similar to what you have and reference the variable in the code instead of the built in numbers.
Flip Keyboard Toggle v1.0 for JR.tvpx
(437.5 KiB) Downloaded 182 times
However, I'm not sure about adding more flags without adjusting the code because of the way read/write flags are scripted, I'll have to think about that.

Thanks for sharing your stuff as well, I think that looks really nice! Just curious, do you run into any issues if the name of the Mark is changed? I always end up changing the name of my color groups for projects, so that was one reason while I was testing this I ended up having to use the built in mark numbers 0-25 (for A through Z respectively) for the color groups/marks. It seems to be the way to reference them regardless of color/name change.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 09 Oct 2024, 09:09
by Jeremy Richard
kelanhordos wrote: 08 Oct 2024, 14:04 with the added a condition to where the code checks for the Mark flag to also check the instance is a head
This is working great, thanks Kelan. Now the backward/forward button go straight to the previous or next head of the marked instances.

Now, I think, this action looks pretty much like you've intended originally, where one can always add shortcuts with a modifier key for layer > Go LEFT/RIGHT or layer > Prev/Next IMAGE, as you have suggested in your original post. Or eventually you could simply add two more buttons for these two additional shortcuts.

-------------------------------------------------------------------------------

WRAP

I noticed something regarding the wrap option. It seems to only work when activated within a layer and not after the last frame of a layer.

In the timeline, if I place the player head/indicator after the last frame of the selected layer then I select 'wrap on', it won't actually wrap. It works again if I place the player head within the layer and then I select 'wrap on'.

Wrap option.jpg
Wrap option.jpg (88.86 KiB) Viewed 3930 times

-------------------------------------------------------------------------------

Regarding the marks being on all frames of an instance:
kelanhordos wrote: 08 Oct 2024, 14:04 It does look a lot nicer and quicker to see at a glance though
Yes, I think I prefer that way but then we do indeed have the problem you described of having to clear the mark after breaking the instance.

That made me think and I came up with this button, where the action is as follow (still using the markers' code from Lucas Sketch Panel):
Break_instance_and_clear_mark.png
Break_instance_and_clear_mark.png (37.7 KiB) Viewed 3930 times
  1. breaks the instance using 'Set Keystroke' > Layer > Exposure > Break
  2. sets the colour variable of the mark to 0 (meaning transparent) using

    Code: Select all

    tv_WriteUserString "LukasSketchPanel" "Color" 0
    
  3. finally uses Lucas' script 'color_marker.grg' which would mark the new instance with the transparent colour

kelanhordos wrote: 08 Oct 2024, 14:04 do you run into any issues if the name of the Mark is changed?
I have no issue after changing the groups' colour name. I guess, like you said, numbers are the way to reference colour groups.


kelanhordos wrote: 08 Oct 2024, 14:04 I think I can add a similar button with a menu/submenu to set each mark as a flag similar to what you have and reference the variable in the code instead of the built in numbers.
For me, that kind of button would make the panel, in theory, compatible with any other panel that creates marks because the user would simply set the corresponding colour in your panel to fit its original choice of colour for markers.


kelanhordos wrote: 08 Oct 2024, 14:04 I'm not sure about adding more flags
I added a "other" flag because sometimes I want a temporary mark, but the standard of keyframe, breakdown, extreme and inbetween is maybe sufficient for most people.

Or maybe you can do a "deluxe version" with the added "other" flag. :wink:

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 09 Oct 2024, 13:38
by kelanhordos
Regarding the wrap, I have it set to function that way, from the documentation
Wrap will only function WITHIN a layer's images, so if you use your mouse or another shortcut to go outside the current set of images(to an empty frame) and try and press F/G, wrap is automatically turned off and you will proceed frame by frame as normal. If you use the shift F/G key to get outside, then add a new image, Wrap will continue to stay ON.
And honestly, the doc is in part to help me remember, because I originally had it functioning the way you are asking for which is it would wrap no matter where you are. I don't remember exactly why I changed it. I've put a quick fix here in this version for that kind of functionality, it just comments out that part of the script and now on the forward/backward buttons it will wrap to the first/last frame when outside the layer. You will need to push forward/backward again after that to get to the next flagged frame, but I think this may have been part of the reason why I changed it as its a bit different compared to the function of the wrap when it's from inside the layer and I didn't figure out a better way yet.
Flip Keyboard Toggle v1.0 for JRv2.tvpx
(437 KiB) Downloaded 174 times
Adding another button would be pretty simple I think, but I can write something up when I have some time on how to do it so its clearer without having to decipher my code lol. Hopefully I can get that other button made soon as well.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 10 Oct 2024, 11:31
by Jeremy Richard
kelanhordos wrote: 09 Oct 2024, 13:38 Regarding the wrap, I have it set to function that way, from the documentation
I see. Well I guess maybe is best to stick to TVPaint's default behaviour. I only noticed it because I did a quick test of your panel on a very small timeline which is maybe less likely to be the case on actual projects.

Also, the change seems to break the previous change of going straight to the previous/next head of each marked instance you did to the "Flip Keyboard Toggle v1.0 for JR" version. Now it reverts back to to go to each marked frame. Eventually I'll have a look too on how we can have both: going from head to head and being able to wrap outside the layer, and I'll share my findings in case I do find anything.

In any case, I was hoping to replicate this kind of tool in TVPaint from Harmony, so I want to thank you with coming up with this panel and taking the time to make it.

--------------------------------------------------------------------------

I allowed myself to experiment with a "set the colour" button to work with your panel. It is more or less copied from your 'Check' menu :oops:.

For some reason it only works with the keyframes and breakdowns for now. I wonder if I need to reset the config file. Anyway, in case you are interested, here is the script so far for a 'Set the colour' button (It is very much hot off the press), which in essence creates a new variable for the id of the colour selected for each type of marks:

Set the colour button experiment.png
Set the colour button experiment.png (32 KiB) Viewed 3730 times

Code: Select all

// Set_mark_colour_flip_keyboard.grg
// SET COLOURS FOR EACH TYPE OF MARK

// Set variables containing the colour for each type of markers. 
// To be then shown at the top of the menu.
tv_readuserstring [kcolour] Kflag 
cflagK = RESULT
If cflagK == -1
	keyframe_colour = "X"
ELSE
	keyframe_colour = equivalent_letter(cflagK)
END

tv_readuserstring [kcolour] BDflag 
cflagBD = RESULT
If cflagBD == -1
	breakdown_colour = "X"
ELSE
	breakdown_colour = equivalent_letter(cflagBD)
END

tv_readuserstring [kcolour] EXflag 
cflagEX = RESULT
If cflagEX == -1
	extreme_colour = "X"
ELSE
	extreme_colour = equivalent_letter(cflagEX)
END

tv_readuserstring [kcolour] IBflag 
cflagIB = RESULT
If cflagIB == -1
	inbetween_colour = "X"
ELSE
	inbetween_colour = equivalent_letter(cflagIB)
END

tv_readuserstring [kcolour] OTflag 
cflagOT = RESULT
If cflagOT == -1
	other_colour = "X"
ELSE
	other_colour = equivalent_letter(cflagOT)
END

// Sets the lists with submenus
colour_choice = 0
tv_listrequest "COLOURS: "keyframe_colour breakdown_colour extreme_colour inbetween_colour other_colour submenu("Keyframe") submenu("Breakdown") submenu("Extreme") submenu("Inbetween") submenu("Other")
PARSE RESULT colour_choice submenu

IF colour_choice == 0 || colour_choice == -1			
	EXIT
END

// Set Keyframe colour
IF colour_choice == 1 || colour_choice == 2 || colour_choice == 3 || colour_choice == 4 || colour_choice == 5 || colour_choice == 6 || colour_choice == 7 || colour_choice == 8 || colour_choice == 9 || colour_choice == 10 || colour_choice == 11 || colour_choice == 12 || colour_choice == 13 || colour_choice == 14 || colour_choice == 15 || colour_choice == 16 || colour_choice == 17 || colour_choice == 18 || colour_choice == 19 || colour_choice == 20 || colour_choice == 21 || colour_choice == 22 || colour_choice == 23 || colour_choice == 24 || colour_choice == 25 || colour_choice == 26 || colour_choice == 27
	colour_choice = colour_choice - 1
	key_type = Kflag
END

// Set Breakdown colour
IF colour_choice == 28 || colour_choice == 29 || colour_choice == 30 || colour_choice == 31 || colour_choice == 32 || colour_choice == 33 || colour_choice == 34 || colour_choice == 35 || colour_choice == 36 || colour_choice == 37 || colour_choice == 38 || colour_choice == 39 || colour_choice == 40 || colour_choice == 41 || colour_choice == 42 || colour_choice == 43 || colour_choice == 44 || colour_choice == 45 || colour_choice == 46 || colour_choice == 47 || colour_choice == 48 || colour_choice == 49 || colour_choice == 50 || colour_choice == 51 || colour_choice == 52 || colour_choice == 53 || colour_choice == 54
	colour_choice = colour_choice - 28
	key_type = BDflag
END

// Set Extreme colour
IF colour_choice == 55 || colour_choice == 56 || colour_choice == 57 || colour_choice == 58 || colour_choice == 59 || colour_choice == 60 || colour_choice == 61 || colour_choice == 62 || colour_choice == 63 || colour_choice == 64 || colour_choice == 65 || colour_choice == 66 || colour_choice == 67 || colour_choice == 68 || colour_choice == 69 || colour_choice == 70 || colour_choice == 71 || colour_choice == 72 || colour_choice == 73 || colour_choice == 74 || colour_choice == 75 || colour_choice == 76 || colour_choice == 77 || colour_choice == 78 || colour_choice == 79 || colour_choice == 80 || colour_choice == 81
	colour_choice = colour_choice - 55
	key_type = EXflag
END

// Set Inbetween colour
IF colour_choice == 82 || colour_choice == 83 || colour_choice == 84 || colour_choice == 85 || colour_choice == 86 || colour_choice == 87 || colour_choice == 88 || colour_choice == 89 || colour_choice == 90 || colour_choice == 91 || colour_choice == 92 || colour_choice == 93 || colour_choice == 94 || colour_choice == 95 || colour_choice == 96 || colour_choice == 97 || colour_choice == 98 || colour_choice == 99 || colour_choice == 100 || colour_choice == 101 || colour_choice == 102 || colour_choice == 103 || colour_choice == 104 || colour_choice == 105 || colour_choice == 106 || colour_choice == 107 || colour_choice == 108
	colour_choice = colour_choice - 82
	key_type = IBflag
END

// Set Other colour
IF colour_choice == 109 || colour_choice == 110 || colour_choice == 111 || colour_choice == 112 || colour_choice == 113 || colour_choice == 114 || colour_choice == 115 || colour_choice == 116 || colour_choice == 117 || colour_choice == 118 || colour_choice == 119 || colour_choice == 120 || colour_choice == 121 || colour_choice == 122 || colour_choice == 123 || colour_choice == 124 || colour_choice == 125 || colour_choice == 126 || colour_choice == 127 || colour_choice == 128 || colour_choice == 129 || colour_choice == 130 || colour_choice == 131 || colour_choice == 132 || colour_choice == 133 || colour_choice == 134 || colour_choice == 135
	colour_choice = colour_choice - 109
	key_type = OTflag
END

// Save the mark's colour
tv_WriteUserString [kcolour] key_type colour_choice

// Gather id variables
tv_readuserstring [kcolour] Kflag
cflagK = RESULT
tv_readuserstring [kcolour] BDflag 
cflagBD = RESULT
tv_readuserstring [kcolour] EXflag
cflagEX = RESULT
tv_readuserstring [kcolour] IBflag
cflagIB = RESULT
tv_readuserstring [kcolour] OTflag
cflagOT = RESULT

// Display the colour scheme
//tv_warn "Keyframe: " equivalent_letter(cflagK) '\n' "Breakdown: " equivalent_letter(cflagBD) '\n' "Extreme: " equivalent_letter(cflagEX) '\n' "Inbetween: " equivalent_letter(cflagIB) '\n' "Other: " equivalent_letter(cflagOT)

// Generates string for tv_listrequest
FUNCTION submenu(key_type)
	colour_None = key_type"/None"
	colour_A = key_type"/A"
	colour_B = key_type"/B"
	colour_C = key_type"/C"
	colour_D = key_type"/D"
	colour_E = key_type"/E"
	colour_F = key_type"/F"
	colour_G = key_type"/G"
	colour_H = key_type"/H"
	colour_I = key_type"/I"
	colour_J = key_type"/J"
	colour_K = key_type"/K"
	colour_L = key_type"/L"
	colour_M = key_type"/M"
	colour_N = key_type"/N"
	colour_O = key_type"/O"
	colour_P = key_type"/P"
	colour_Q = key_type"/Q"
	colour_R = key_type"/R"
	colour_S = key_type"/S"
	colour_T = key_type"/T"
	colour_U = key_type"/U"
	colour_V = key_type"/V"
	colour_W = key_type"/W"
	colour_X = key_type"/X"
	colour_Y = key_type"/Y"
	colour_Z = key_type"/Z"
	
	RETURN  "|"colour_None"|"colour_A"|"colour_B"|"colour_C"|"colour_D"|"colour_E"|"colour_F"|"colour_G"|"colour_H"|"colour_I"|"colour_J"|"colour_K"|"colour_L"|"colour_M"|"colour_N"|"colour_O"|"colour_P"|"colour_Q"|"colour_R"|"colour_S"|"colour_T"|"colour_U"|"colour_V"|"colour_W"|"colour_X"|"colour_Y"|"colour_Z
END

// Translates mark ids into their respective group letters
FUNCTION equivalent_letter(mark_id)
	IF mark_id == 0
		mark_letter = "None"
	END
	IF mark_id == 1
		mark_letter = "A" 
	END
	IF mark_id == 2
		mark_letter = "B"
	END
	IF mark_id == 3
		mark_letter = "C" 
	END
	IF mark_id == 4
		mark_letter = "D" 
	END
	IF mark_id == 5
		mark_letter = "E" 
	END
	IF mark_id == 6
		mark_letter = "F" 
	END
	IF mark_id == 7
		mark_letter = "G" 
	END
	IF mark_id == 8
		mark_letter = "H" 
	END
	IF mark_id == 9
		mark_letter = "I" 
	END
	IF mark_id == 10
		mark_letter = "J" 
	END
	IF mark_id == 11
		mark_letter = "K" 
	END
	IF mark_id == 12
		mark_letter = "L" 
	END
	IF mark_id == 13
		mark_letter = "M" 
	END
	IF mark_id == 14
		mark_letter = "N"
	END
	IF mark_id == 15
		mark_letter = "O"
	END
	IF mark_id == 16
		mark_letter = "P"
	END
	IF mark_id == 17
		mark_letter = "Q"
	END
	IF mark_id == 18
		mark_letter = "R" 
	END
	IF mark_id == 19
		mark_letter = "S" 
	END
	IF mark_id == 20
		mark_letter = "T" 
	END
	IF mark_id == 21
		mark_letter = "U" 
	END
	IF mark_id == 22
		mark_letter = "V" 
	END
	IF mark_id == 23
		mark_letter = "W"
	END
	IF mark_id == 24
		mark_letter = "X" 
	END
	IF mark_id == 25
		mark_letter = "Y" 
	END
	IF mark_id == 26
		mark_letter = "Z" 
	END
	RETURN mark_letter
END
And here are the changes to 'FlipKeyboardBackward.grg' and 'FlipKeyboardForward.grg' I had to make in order for the new button to work.

First I added those lines at the start (after the check for if the layer is a camera, folder, or puppet layer):

Code: Select all

tv_readuserstring [kcolour] Kflag 0
cflagK = result
tv_readuserstring [kcolour] BDflag 0	
cflagBD = result
tv_readuserstring [kcolour] EXflag 0	
cflagEX = result
* 'tv_readuserstring [kcolour] Kflag 0', refers to the 'tv_WriteUserString [kcolour] key_type colour_choice' from the 'Set the colour' button

Then where you check for mark's exposure and if the flag is on, I changed
  • from

    Code: Select all

    IF Mark == 1 &&	mflagK == 1 && CMP(state, head) == 1
    
  • to

    Code: Select all

    IF Mark == cflagK &&	mflagK == 1 && CMP(state, head) == 1
    
* 'cflagK' being the new variable set in the 'Set the colour' button

So it gives something like this:

Code: Select all

IF Mark == cflagK &&	mflagK == 1 && CMP(state, head) == 1
	tv_layerimage i
	EXIT
END	

IF Mark == cflagBD && mflagBD == 1 && CMP(state, head) == 1
	tv_layerimage i 
	EXIT
END

IF Mark == cflagEX && mflagEX == 1 && CMP(state, head) == 1
	tv_layerimage i 
	EXIT
END

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 10 Oct 2024, 14:38
by kelanhordos
Hi Jeremy, that looks great and is pretty much what I am doing to update it as well. Sorry, I realize I adjusted the wrong file when I fixed the wrap issue, so I will not hastily upload another version especially since you have made modifications.

But, to fix the wrap this is the change to the wrap code around line 56/57 to this code in FlipkeyboardBackward and Forward respectively. It's just turning off what was there and jumping to the last/frame instead when wrap is ON.

for backward

Code: Select all

IF wrapflag == 0   								//If wrapping if off, will move to prev exposure
		tv_exposureprev
	ELSE 		
		//tv_writeuserstring [kcustom] wflag 0		//If wrapping is ON, will turn it off, and proceed with rest of script
		//wrapflag = 0
		//tv_exposureprev
		tv_layerimage LAST
	END
and forward

Code: Select all

IF wrapflag == 0								//If wrapping if off, will move to prev exposure
		tv_exposurenext
	ELSE 	
		//tv_writeuserstring [kcustom] wflag 0		//If wrapping is ON, will turn it off, and proceed with rest of script
		//wrapflag = 0
		//tv_exposurenext
		tv_layerimage FIRST
	END
And just fyi the code that made it skip the instances and only go to the heads is the bold part here, added to each mark check (i cant make it bold in code format) Since there is already a check at the beginning of the loop with tv_exposure to find out when it is "out of bounds" of the layer for the wrap code, this is an easy way to add it.

IF Mark == 1 && mflagK == 1 && CMP(state, head) == 1 //checks if exposure has Mark 1(Key) and if Key flag is on, goes to that frame
tv_layerimage i
EXIT
END

I think when I rewrite it and update I will see if I can add another toggle in the wrap menu that would give either option. It's interesting to see what is useful to other people.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 14 Oct 2024, 18:37
by Jeremy Richard
Thank you for indicating the fix,
kelanhordos wrote: 10 Oct 2024, 14:38 IF Mark == 1 && mflagK == 1 && CMP(state, head) == 1 //checks if exposure has Mark 1(Key) and if Key flag is on, goes to that frame
tv_layerimage i
EXIT
END
and for pointing this out, I managed to get my head around it (no pun intended).

-------------------------------------------------------------------------------------------------------------

Just in case, I found out that this line (in the forward and backward buttons)

Code: Select all

Mark = char(Cmark, 1)	
means that when it compares

Code: Select all

IF Mark == cflagK && mflagK == 1 && CMP(state, head) == 1
it only compares the first digit of the 'cglagK' variable (in this case).

So if the ID of the colour chosen for the keyframe flags is 24 (for example), in effect its comparison is

Code: Select all

IF Mark == 2
and not

Code: Select all

IF Mark == 24
I would not be able to tell you why though. I would have thought that char() would be applied to 'Cmark' only but it seems to affect the 'cglagK' variable too for some reason.

-------------------------------------------------------------------------------------------------------------

Another option for your panel you could maybe consider (if not already) is to be able to choose either from:
  • keeping the marked frame we jump into inside the view of the timeline (like the 'Go to Next/Previous Instance' shortcut does)
  • or having the view of the timeline not changing while jumping from marked frames to marked frames that are located outside the timeline view (like it is now)
if that makes sense.

The first option might be useful when working on a very zoomed-in timeline and/or on a small screen, but the second option could still be the default option, as we may use this kind of tool to work on a specific instance we want to 'visually lock' at a specific point in the timeline.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 16 Oct 2024, 17:47
by kelanhordos
Hi Jeremy, other issues have kept me from getting to update this, hopefully I can look into it soon. I can see there is likely some other issues now that you mention that with the code in general I will have to fix to make it more adaptable from the initial working. The reason the 24 is being cut off is that line

Code: Select all

Mark = char(Cmark, 1)	
It takes the mark which returns the mark returned with tv_layermarkget and truncates it to only the first character of the string. When only using the first 3 marks(and 0 for no mark) this works fine, but as I didn't use any marks with double digits it wont work with that. I think at the time when I started writing the code I didn't understand as well how to parse the number of the mark but get rid of the RGB value that is also returned, but that would be the solution. I'm not sure right now how much code would need to be rewritten, but I think instead of it using CHAR() you would just parse the result of this code.

Code: Select all

	tv_layermarkget 0 i					//gets current image's mark
		Cmark = result
		Mark = char(Cmark, 1)
INTO

Code: Select all

	tv_layermarkget 0 i					//gets current image's mark
		parse result Mark r g b
I haven't been able to test it out and double check everything works, but just looking quickly at it that would be the solution I think. I think ultimately a bunch of the code can be improved upon, as I am learning a lot as I'm going(finally got my head around functions a couple weeks ago). So thanks for the interest and feedback!

Also the timeline focus suggestions are really good idea. I often hate having to adjust my timeline on the fly, Peter Wassink made good suggestions in another thread about a timeline "focus" option. I guess I don't even know about what part of GEORGE does that kind of stuff, so I will take a look at it.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 22 Oct 2024, 14:30
by Jeremy Richard
kelanhordos wrote: 16 Oct 2024, 17:47 I think ultimately a bunch of the code can be improved upon, as I am learning a lot as I'm going(finally got my head around functions a couple weeks ago). So thanks for the interest and feedback!
My pleasure, I'm learning a lot too indeed.

--------------------------------------------------------

Regarding

Code: Select all

Cmark = result
Mark = char(Cmark, 1)
as Hironori Takagi remarked here, what "tv_layermarkget" returns has been changed between TVPaint 11 and 12, from 1 (mark_number) to 4 (mark_number r g b).

I am using TVPaint 11 so I simply removed the 'Mark = char(Cmark, 1)' line but to make it compatible between both versions you could possibly do something like this, using "tv_version":

Code: Select all

// Gets details of local installation
tv_version
PARSE RESULT softwareName softwareVersion language

// Sets version number
numberVersion = CUT(softwareVersion,1,2)

// Gets current image's mark
tv_layermarkget 0 i

IF numberVersion == 12 //If TVPaint 12
	parse result Mark r g b
ELSE
	Mark = result
END

//tv_warn Mark
* As a side note, we can't set variables which start with the word 'version' because it is reserved for the instruction 'VERSION'. It'll throw an error if you name a variable like 'version_number' for example.

The VERSION instruction returns the "version number of George program", which I'm not sure what it means. Accidentaly it returns the same number in TVPaint 11 and 12.

--------------------------------------------------------
Forward and Backward buttons

If it can be of use, I had a go at merging both the backward and forward scripts. Being virtually the same code for both codes, except for these lines

Code: Select all

IF CMP(inlayer, none) == 1 && curimage != First-1 

...

For i = image+1 to Last+1

...

IF CMP(state, none) == 1 && wrapflag == 0 && i == Last+1

...

IF i == Last +1 && wrapflag == 1			
	i = First -1
END

I ended up doing something like this, where first I set variables for both the backward and forward buttons, as an embedded script in each buttons:

Code: Select all

tv_writeuserstring [kcustom] KButton "backwardDirection"
and

Code: Select all

tv_writeuserstring [kcustom] KButton "forwardDirection"
and then set the variables making the difference between the forward and backward buttons:

Code: Select all

// Checks config file for button direction
tv_readuserstring [kcustom] KButton  	
bDirection = RESULT

Code: Select all

// Sets the difference of direction
IF CMP(bDirection,"backwardDirection")
	bounded = Last + 1
	checkedImage = image - 1
	checkedFirstOrLast = First - 1
	checkedStep = -1
	stated = First - 1
	wrappedCondition = First - 1
	wrappedInstruction = Last + 1
ELSE // If "forwardDirection"
	bounded = First - 1
	checkedImage = image + 1
	checkedFirstOrLast = Last + 1
	checkedStep = 1
	stated = Last + 1
	wrappedCondition = Last + 1
	wrappedInstruction = First - 1
END
This is how the script looks like:

Code: Select all

// FlipKeyboardDirection.grg
// SETS THE FORWARD AND BACKWARD BUTTONS

// Checks config file for button direction
tv_readuserstring [kcustom] KButton  	
bDirection = RESULT
//tv_warn bDirection

tv_layerinfo
PARSE result _ _ _ LayerID TYPE First Last _ _ _ _ _ //get layerID first/last frame

IF CMP(TYPE, CAMERA) == 1 || CMP(TYPE, FOLDER) || CMP(TYPE, RIGGING) //if layer is a camera, folder, or puppet layer, exits
	EXIT
END

tv_readuserstring [kcustom] Kflag 0 	//checks config file for marker flag
mflagK = result
tv_readuserstring [kcustom] BDflag 0	//checks config file for marker flag
mflagBD = result
tv_readuserstring [kcustom] EXflag 0	//checks config file for marker flag
mflagEX = result
tv_readuserstring [kcustom] IBflag 0	//checks config file for marker flag
mflagIB = result
tv_readuserstring [kcustom] wflag 0 	//checks for wrap on/off
wrapflag = result

IF mflagK == 0 && mflagBD == 0 && mflagEX == 0 && mflagIB == 0 //if all frane flags are off sets IB flag on to prevent nothing from happening	
	tv_writeuserstring [kcustom] IBFLAG 1	
	mflagIB = 1		
END

tv_layergetimage					 //current image in layer
curimage = result
image = curimage

tv_exposureinfo curimage
inlayer = result


////////////////////////////////////////////////

// Sets the difference of direction
IF CMP(bDirection,"backwardDirection")
	bounded = Last + 1
	checkedImage = image - 1
	checkedFirstOrLast = First - 1
	checkedStep = -1
	stated = First - 1
	wrappedCondition = First - 1
	wrappedInstruction = Last + 1
ELSE // If "forwardDirection"
	bounded = First - 1
	checkedImage = image + 1
	checkedFirstOrLast = Last + 1
	checkedStep = 1
	stated = Last + 1
	wrappedCondition = Last + 1
	wrappedInstruction = First - 1
END
//tv_warn bounded checkedImage checkedFirstOrLast stated wrappedCondition wrappedInstruction

////////////////////////////////////////////////


IF CMP(inlayer, none) == 1 && curimage != bounded 	//Out of Bounds(OOB) Check to see if current frame is outside current layer length, if so will execute special rules, otherwise continue normal function of script

	IF wrapflag == 0   								//If wrapping if off, will move to prev exposure
		tv_exposureprev
	ELSE 		
		tv_writeuserstring [kcustom] wflag 0		//If wrapping is ON, will turn it off, and proceed with rest of script
		wrapflag = 0
		tv_exposureprev
	END

ELSE

	FOR i = checkedImage to checkedFirstOrLast STEP checkedStep	//Main purpose of script, checks each frame BEFORE current frame for MARKS/No Mark, and moves accordingly (will wrap back around to the END if WRAP IS ON)
				
			tv_exposureinfo i
			parse result state a a	
					
			IF CMP(state, none) == 1 && wrapflag == 0 && i == stated	//This will fire only if used on the first frame of layer, otherwise the Line 54 takes care of OOB 				
				tv_layerimage i
				EXIT
			END
			
			IF i == curimage					 //prevent infinite loop if loop ends up back at current frame due to WRAP on
				If wrapflag == 1
					tv_warn "No other instances with current flag(s), WRAP IS ON"
					EXIT
				ELSE
					tv_warn "No other frames with current flag(s)" //this part shouldn't happen **for debugging how it got into a loop without wrap on
					EXIT
				END
			END
			
			// Gets details of local installation
			tv_version
			PARSE RESULT softwareName softwareVersion language

			// Sets version number
			numberVersion = CUT(softwareVersion,1,2)

			// Gets current image's mark
			tv_layermarkget 0 i

			IF numberVersion == 12
				parse result Mark r g b
			ELSE
				Mark = result
			END
				
			tv_readuserstring [kcustom] wflag 0 //if wrap flag is on when loop reaches first frame outside beginning of layer this wraps back around to end frame
			wrapflag = result
				IF i == wrappedCondition && wrapflag == 1
					i = wrappedInstruction
				END
		
			IF Mark == 1 &&	mflagK == 1 && CMP(state, head) == 1		//checks if exposure has Mark 1(Key) and if Key flag is on, goes to that frame
					tv_layerimage i
					EXIT
			END	
			
			IF Mark == 2 && mflagBD == 1 && CMP(state, head) == 1		//checks if exposure has Mark 2(BD) and if BD flag is on, goes to that frame
					tv_layerimage i 
					EXIT
			END
			
			IF Mark == 3 && mflagEX == 1 && CMP(state, head) == 1		//checks if exposure has Mark 3(EX) and if BD flag is on, goes to that frame
					tv_layerimage i 
					EXIT
			END
			
			IF Mark == 0 && mflagIB == 1		//checks if exposure has no Mark, and if it is an Instance Head
			
					tv_exposureinfo i
					parse result state a a	
								
					IF CMP(state, head) == 1    //if checked frame is instance head, moves to it
						tv_layerimage i 
						EXIT				
					END
					
			END
			
	END
END

--------------------------------------------------------
kelanhordos wrote: 16 Oct 2024, 17:47 Also the timeline focus suggestions are really good idea. I often hate having to adjust my timeline on the fly, Peter Wassink made good suggestions in another thread about a timeline "focus" option. I guess I don't even know about what part of GEORGE does that kind of stuff, so I will take a look at it.
Looking at it a bit more closely, maybe something can be done using the config.ini file, as mentionned here: https://forum.tvpaint.com/viewtopic.php ... 11#p136811

I can't find the coordinates for the timeline by just searching the term 'timeline' (there are coordinates for a 'layerpanel' which is maybe the 'layer stack' on the left of the timeline).

But, if there are such coordinates, by comparing those of the timeline and the play head there is maybe a way to create a "focus" option.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 13 Nov 2024, 15:58
by kelanhordos
Hey Jeremy, thanks for the interest and work on this. I thought I replied but apparently saved a draft instead and it seems to have been discarded.

That is a great idea to make changes to the code easier with the variables, nice job. I'm still working on a new version, but life has gotten hectic and my time has been limited. Please feel free to share your version if you like, as I'm sure people would find it useful if they use other scripts as you do.

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 16 Nov 2024, 11:17
by Jeremy Richard
kelanhordos wrote: 13 Nov 2024, 15:58 That is a great idea to make changes to the code easier with the variables, nice job.
Thanks. I'm just not sure how manageable it is in the long run to have so many variables, but I guess it still better than having to go back and forth between what it is essentially two same codes.

Anyway here is my version of your panel:

Flipping_Keys_Panels.png
Flipping_Keys_Panels.png (27.82 KiB) Viewed 1473 times
Flipping Keys.tvpx
(673 KiB) Downloaded 80 times

It has the changes you made for me which made it go from marked heads to marked heads and it has the 'Other' flag.

Sharing the panel, I though I'll have a go at trying to translate it in French, stuff that can be translated anyway.

I'm using it in TVPaint 11.7.3 but it seems to be working in TVPaint 12.

Here are the George scripts used in the panel:

Flipping_Keys-Scripts.zip
(24.37 KiB) Downloaded 80 times

I ended up transferring the embedded scripts into separate script files and used the #INCLUDE instruction; I found it easier to update the panel this way, and I'm less likely to lose portions of code if the panel didn't save properly for whatever reasons. And it is more practical when sharing the panel I think.

The pictograms for the icons are from the Webdings and Wingdings fonts and the colour wheel is from Wikipedia, https://commons.wikimedia.org/wiki/File ... _wheel.png

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 17 Nov 2024, 19:53
by Peter Wassink
btw... a colorwheel is very easy to create in TVPaint using the preset "spectrum" gradient
in a filled circle with a "Radial Gradient"
.
gradient.jpg
gradient.jpg (53.67 KiB) Viewed 1392 times

Re: Custom Panels for flipping between Keys, Breakdowns, Inbetweens etc.

Posted: 18 Nov 2024, 06:53
by Svengali
Hi guys... Kudos for a very worthwhile thread demonstrating the power of custom GEORGE scripts.

Here is a link that includes a discussion on "String Packing" techniques using ReadUserString and WriteUserString in George that might prove helpful.


sven