OTANO Storyboard Tools

Share your custom panels, brushes, papers... (you need to be registered to read posts in this section)
User avatar
NathanOtano
Posts: 1208
Joined: 01 Apr 2014, 07:07
Location: Biarritz, France
Contact:

OTANO Storyboard Tools

Post by NathanOtano »

I'm happy share with you a set of scripts I created related to storyboarding (especially for animatic work with tools for editing and sound)

It was made for Disnosc, my company : https://www.disnosc.fr/

Capture.PNG
Capture.PNG (46.02 KiB) Viewed 12897 times
Capture2.PNG
Capture2.PNG (28.49 KiB) Viewed 12897 times

So they idea behind this was simple : Managing editing in TVPaint can be quiet difficult sometimes because even if you use the timeline view to edit you storyboard you still have some problems syncing sound correctly.
I used Storyboard Pro and missed the drawing and animation features of TVPaint, so before those scripts I was always drawing in tvpaint all the frames and editing it in Premiere or After Effect (sometimes even storyboarding in after effect...). But the back and forth between the softwares annoyed me because I needed to draw on sound directly and TVPaint was almost there with the timeline view... Took some hours to make it work for my own workflow, maybe it can help others so I'm sharing this :wink:

All the scripts in this panels will keep your sound in sync with your clips, you have some of those functions already in TVPaint but I replicated them with George scripts so they also offset sound if they change the timing of your cuts.
For example : if you have a long dialogue in timeline view synced with multiple shots at the end of your storyboard, changing the timing of one of the shots (or creating/hiding/deleting clips) at the beginning of your project with those buttons keeps your dialogue in sync at the other end.
That way you can have sound across multiple shots without having to embed them in the clip with the "split track to clips" option that is not really convenient when you're editing your animatic. I found that sound splitted in different clips that will each change in length can be hard to manage.

A lot of those tools work with mark ins and mark outs so you can change your editing + sound without touching your layers. It will be difficult for your habits but if you want to keep your sound in sync using this panel you have to avoid using tvpaint's interface (like hiding clips, setting mark etc...).
The "Clip Editing" button is your main tool and most advanced script for animatic so use it well! You can avoid using a lot of buttons with this one.

Here is a breakdown of some buttons (you also have some descriptions if you let your mouse over panel's icons) :
Spoiler : :
Image

- Play from current frame : If in project tab, play your storyboard from current clip and then goes back to current clip and image (tvpaint was going back to the first clip instead). Plays your clip as usual if in clip tab.
- Play from clip start : Same than above but begins playback from clip start instead of current image (need it all the time because when selecting a clip TVPaint goes to the last image you were working on in this clip, and when in thumbnail view you lose time going back to the beginning of the clip for playback)

- Clip New : Creates a new clip with same length than your current clip (when it timeline view it's hard to manage clips with a length of 1 frame). Layer is already stretched to the end of the clip so you can draw on it in timeline view without having to go to the first frame (I advise you to deactivate autobreak/create by default to avoid breaking your instances). Also have the same name plus "_b" to avoid having a space in the name (in french version the default clip name has a space). And offsets sound regarding the length of the new clip.
- Clip Hide toggle : Toggles clip hide state and offsets sound (doesn't undo properly for now so be carfeful to use the script again instead). If you use shift when clicking it will also offset the sound right net to the clip, it's usefull if the sound of your clip shifted left when you hid your clip and you want to put it back in sync when you decide to unhide it.
- Clip Delete : Deletes current clip and offsets sound.
- Clip Duplicate : Duplicates current clip and offsets sound. If you use shift when clicking the sound doesn't offset so you keep it in your first clip.
- Clip Next/Prev Skip Hidden : Just a shortcut so you can navigate between clips by skipping hidden clips (useful especially in clip tab when you're cleaning your storyboard).

- Clip Editing : This one is great! Instead of sliding at the right of your clips in timeline view to change the timing of your clips or managing your mark in/out, you just input the new length you want for your clip and it sets your mark out at the right place for you regarding your mark in. Of course it also offsets sound. If you use shift while clicking "ok" it will compensate your change in length in the next clip so your global timing for the two cuts does'nt change. I use it a lot because it's more precise than sliding in the timeline view and faster than setting marks in clip tab. Also it's a great learning tool because choosing your own timing in frames, you know what you do and can begin to spot which shot require which amount of frames <3
- Sound import : Opens a file requester to import a sound file and offsets the sound to your current image (TVP puts it at the beginning of the timeline which is a little annoying for long storyboards). Be aware that it doesn't work if you have unusual characters in your file's path/name.
- Sound offset : Just offsets sounds after current frame by a chosen number of frames.
- Layer Stretch to mark : Usefull script to stretch your layer to your mark in and mark out. I use it especially for camera work because the interpolation time follows the length of your layers and not your marks. Use it also when my layer's post behaviour in on hold and I'm out of the instance but need to draw on it at current frame.
- Marks set to Clip Extremes : Sets your mark In/Out to the first/last image of your clip regarding all your layers. Usefull when changing timings in your clip and you want to keep your marks at the extremes and offset sound.
- Marks set to Layer Extremes : Same than above but sets marks to your current layer extremes instead.
- Markout Inc/Decrement : Just a way to precisely fine tune the length of your clip, it will move your markout one frame left or right. If you use alt and/or ctrl it will offset 5 frames, 10 frames will both shortcuts. If you use shift is will compensate the change in length in your next clip so you keep the global length of your clips. It also offsets sound, of course.
- Markin/Out Clip/Project Set : Sets your mark to current frame (in/out and for clip or project regarding the button you use), and if there is already a mark at current frame it toggles the mark instead. The ones for clips are offseting sound, and the ones for project are nice if you are in Inlay View and you don't see the remote under your canvas to set your project marks (which is what I personally experience).
Important things to know before using the panel:
- Please note that the scripts will not work properly if you have spaces in your clip names (doesn't happen unless you split clips/have another language (like french) in TVP). To fix that I advise you to use this nice script by Mads Juul to batch rename your layers.
- Also note that there is some restrictions using Mark Ins in negative frames, because george script doesn't handle negative frames properly. So please use only positive frames :roll:
- I'll update the panel soon with timing tools that also move markin/out. That way you'll be able to reproduce a workflow like when you work without marks and the length of the clip changes regarding layer length. For now I advise you to add the "Marks Set To Clip Extremes" to your actual buttons and/or shortcuts, will almost do the job 8)
- Importing sound doesn't work with unusual characters for file paths and names (so beware of spicy spaces D:).

I'm open to any suggestion, new tool idea or bug reporting, I can update the scripts quickly so don't hesitate to ask.

Nathan


P.S. Here is a library of functions I created if you want to script clip-related things and don't like some personal choices in my buttons, havn't finished to describe everything yet but function names are clear :
Spoiler : :

Code: Select all

#Function Otano_ClipCurrentPos()
		LOCAL ClipID ClipPos PosID

		tv_clipcurrentid
		ClipID = result
		
		ClipPos = 0
		tv_ClipEnumID -1 ClipPos
		PosID = result
		
		While (CMP(PosID, ClipID)==0)
			ClipPos = ClipPos+1
			tv_ClipEnumID -1 ClipPos
			PosID = result
		END

			result = ClipPos
	#End
	
#Function Otano_ClipPos(ClipID)
		LOCAL ClipPos PosID
		
		ClipPos = 0
		tv_ClipEnumID -1 ClipPos
		PosID = result
		
		While (CMP(PosID, ClipID)==0)
			ClipPos = ClipPos+1
			tv_ClipEnumID -1 ClipPos
			PosID = result
		END

			result = ClipPos
	#End

#Function Otano_ClipCount()
		LOCAL ClipPos PosID
		
		ClipPos = -1
		
		DO
			ClipPos = ClipPos+1
			tv_ClipEnumID -1 ClipPos
			PosID = result
		Until CMP(PosID,"none") == 1
		
		result = ClipPos
		
	#End
	
#Function Otano_ClipIsExtreme(ClipID)
		LOCAL clipPos clipCount clipState
		
		Otano_ClipPos(ClipID)
		clipPos=result
		
		IF ClipPos == 0
			clipState = Start
		Else
			Otano_ClipCount()
			clipCount = result
			
			IF clipCount-1 == clipPos
				clipState = End
			Else
				clipState = none
			End
		End
		
		result=clipState
		
	#End
	
#Function Otano_EditingInfo()
		//Note : A cause d'un bug TVP, FirstFrame = 0 même si layer commence plus tard, de même pour EditStart sans mark in
		LOCAL a FirstFrame LastFrame TotalLength EditStart EditEnd EditLength ClipID ClipPos MarkInFrame MarkInState MarkOutFrame MarkOutState 
		
				//Collecting Clip Infos
		tv_clipinfo
		PARSE result a a a a a a a a a a a FirstFrame a LastFrame a TotalLength a EditStart a EditEnd a
		
		EditLength = EditEnd - EditStart +1
		
		tv_clipcurrentid
		ClipID = result
		
				//Findind Clip Posistion
		Otano_ClipCurrentPos()
		ClipPos = Result
		
				//Findind and Setting Mark In/Out Infos
		tv_MarkIn clip
		parse result MarkInFrame MarkInState
		tv_MarkOut clip
		parse result MarkOutFrame MarkOutState
		
		IF (CMP(MarkInState, "set ")==1)
			MarkInState = 1
		ELSE
			MarkInState = 0
		End
		
		IF (CMP(MarkOutState, "set ")==1)
			MarkOutState = 1
		ELSE
			MarkOutState = 0
		End
		
				//result
		result =  ClipPos" "ClipID" "FirstFrame" "Lastframe" "MarkInState" "MarkOutState" "MarkInFrame" "MarkOutFrame" "TotalLength" "EditStart" "EditEnd" "EditLength
		
	#End
	
#Function Otano_NextClip()
		LOCAL OriginalClipPos OriginalClipID a NextClipPos NextClipID ClipExtremeState
		
		Otano_EditingInfo()
		PARSE result OriginalClipPos OriginalClipID a
		
		Otano_ClipIsExtreme(OriginalClipID)
		Parse result ClipExtremeState
		
		IF CMP(ClipExtremeState,"End")==1
			NextClipPos = 0
			tv_ClipEnumID -1 NextClipPos
			NextClipID = result
		ELSE
			NextClipPos = OriginalClipPos + 1
			tv_ClipEnumID -1 NextClipPos
			NextClipID = result
		END
		
		tv_ClipSelect NextClipID
		
		result = OriginalClipPos" "OriginalClipID" "NextClipPos" "NextClipID
	#End
	
#Function Otano_PreviousClip()
		LOCAL OriginalClipPos OriginalClipID a PreviousClipPos PreviousClipID ClipExtremeState
		
		Otano_EditingInfo()
		PARSE result OriginalClipPos OriginalClipID a

		Otano_ClipIsExtreme(OriginalClipID)
		Parse result ClipExtremeState
		
		IF CMP(ClipExtremeState,"Start")==1
			Otano_ClipCount()
			PreviousClipPos = result - 1
			tv_ClipEnumID -1 PreviousClipPos
			PreviousClipID = result
		ELSE
			PreviousClipPos = OriginalClipPos - 1
			tv_ClipEnumID -1 PreviousClipPos
			PreviousClipID = result
		END
		
		tv_ClipSelect PreviousClipID
		
		result = OriginalClipPos" "OriginalClipID" "PreviousClipPos" "PreviousClipID
	#End
	
#Function Otano_NextClipSkipHidden()
		LOCAL OriginalClipPos OriginalClipID a NextClipPos NextClipID ClipExtremeState
		
		Otano_EditingInfo()
		PARSE result OriginalClipPos OriginalClipID a
		
		NextClipPos = OriginalClipPos
		
		tv_ClipEnumID -1 NextClipPos
		NextClipID = Result
		
		DO 
			Otano_ClipIsExtreme(NextClipID)
			Parse result ClipExtremeState
		
			IF CMP(ClipExtremeState,"End")==1
				NextClipPos = 0
				tv_ClipEnumID -1 NextClipPos
				NextClipID = result
			ELSE
				NextClipPos = NextClipPos + 1
				tv_ClipEnumID -1 NextClipPos
				NextClipID = result
			END
			
			tv_clipHidden NextClipID
			Hidden = result
		Until Hidden == 0
		
		tv_ClipSelect NextClipID
		
		result = OriginalClipPos" "OriginalClipID" "NextClipPos" "NextClipID
	#End
	
#Function Otano_PreviousClipSkipHidden()
		LOCAL OriginalClipPos OriginalClipID a PrevClipPos PrevClipID ClipExtremeState
		
		Otano_EditingInfo()
		PARSE result OriginalClipPos OriginalClipID a
		
		PrevClipPos = OriginalClipPos
		
		tv_ClipEnumID -1 PrevClipPos
		PrevClipID = Result
		
		DO 
			Otano_ClipIsExtreme(PrevClipID)
			Parse result ClipExtremeState
		
			IF CMP(ClipExtremeState,"Start")==1
				Otano_ClipCount()
				PrevClipPos = result - 1
				tv_ClipEnumID -1 PrevClipPos
				PrevClipID = result
			ELSE
				PrevClipPos = PrevClipPos - 1
				tv_ClipEnumID -1 PrevClipPos
				PrevClipID = result
			END
			
			tv_clipHidden PrevClipID
			Hidden = result
		Until Hidden == 0
		
		tv_ClipSelect PrevClipID
		
		result = OriginalClipPos" "OriginalClipID" "PrevClipPos" "PrevClipID
	#End
	
#Function Otano_StretchToMarkIn(LayerID)
		LOCAL a FirstFrame MarkInFrame Displacement LayerStart

		tv_undoopenstack
		
		Otano_EditingInfo()
		PARSE result a a FirstFrame a a a MarkInFrame a a

		tv_LayerInfo LayerID
		PARSE result a a a a a layerStart a a a a
		
		Displacement = (FirstFrame - MarkInFrame)*(-1)-LayerStart
		
		IF (Displacement != 0)
			IF Displacement > 0
				tv_LayerStretch LayerID Start Displacement Cut
			ELSE
				tv_LayerStretch LayerID Start Displacement Last
			END
		END
		
		tv_layerRecomputeExposure
		tv_undoclosestack
		
		result = layerID" "displacement
	#End
	
#Function Otano_StretchToMarkOut(LayerID)
		LOCAL LastFrame MarkOutFrame Displacement LayerEnd
		
		tv_undoopenstack

		Otano_EditingInfo()
		PARSE result a a a LastFrame a a a MarkOutFrame a
		
		tv_LayerInfo LayerID
		PARSE result a a a a a LayerStart LayerEnd a a a

		Displacement = (LayerEnd - MarkOutFrame)*(-1)
		
		IF (Displacement != 0)
			IF Displacement > 0
				tv_LayerStretch LayerID END Displacement Last
			ELSE
				tv_LayerStretch LayerID END Displacement Cut
			END
		END
		
		tv_layerRecomputeExposure
		tv_undoclosestack
		
		result = layerID" "displacement
	#End

#Function Otano_SoundOffset(fromFrame,toFrame,offsetFrames)
		LOCAL framerate soundIndex offset volume mute fadeIn1 fadeIn2 fadeOut1 fadeOut2 soundfilename in out q colorIndex offsetTest

		tv_ProjectInfo
		PARSE result q q q q framerate q
		offsetFrames = offsetFrames/framerate
		soundIndex = 0
		
		Do
			tv_soundprojectinfo 0 soundIndex

			IF CMP(result,"-2")==0	
				PARSE result offset volume mute fadeIn1 fadeIn2 fadeOut1 fadeOut2 q q q colorIndex
				offsetTest = offset*framerate + fadeIn1*framerate
				print fromframe" "offsettest
				IF offsetTest >= fromFrame && offsetTest < toframe
				
					offset = offset + offsetFrames
					tv_SoundProjectAdjust soundIndex mute volume offset fadeIn1 fadeIn2 fadeOut2 fadeOut1 colorIndex
				END
				soundIndex = soundIndex + 1
			END
			
		UNTIL CMP(result,"-2")==1
		
		result = offsetFrames
	#End

	
#Function Otano_MarkInSet(frame,state,compensate,oldsync)
	//note : moving markin in negative values doesn't work due to TVP bug
	//TODO : Compensate
		LOCAL q ClipID firstframe OldState OldFrame EditStart curProjectImage curImage fromframe offset
		
		tv_undoopenstack
		tv_updateundo
		tv_lockdisplay quiet
		
		Otano_EditingInfo()
		PARSE result q ClipID firstframe q OldState q OldFrame q EditStart q
		
		tv_projectcurrentframe
		curProjectImage=result
		tv_layergetimage
		curImage=result
		fromframe = curProjectimage-curimage
		
		IF State == 1                                  //Set mark
			IF OldState == 1                                     //Si mark deja on, decaler offset selon ancienne mark
				tv_clipHidden ClipID
				IF result == 0
					Offset = oldFrame - frame
					
					IF oldsync != 1 && offset > 0
						fromframe = fromframe + offset
					END
					
					Otano_SoundOffset(fromframe,999999,Offset)
				END
				
				tv_markin clip frame set
			Else                                                 //Si mark off, decaler offset selon fin edit
				tv_clipHidden ClipID
				IF result == 0
					Offset = firstframe - frame

					IF oldsync != 1 && offset > 0
						fromframe = fromframe + offset
					END
					
					Otano_SoundOffset(fromframe,999999,Offset)
				END
				
				tv_markin clip frame set
			END
		ELSE
			IF State == 0                              //clear mark
				IF OldState == 1                                 //si mark on, decaler vers fin edit
					tv_clipHidden ClipID
					IF result == 0
						Offset = oldframe - firstframe

					IF oldsync != 1 && offset > 0
						fromframe = fromframe + offset
					END
					
						Otano_SoundOffset(fromframe,999999,Offset)
					END
					
					tv_markin clip frame clear
				Else                                               //si mark deja off, ne rien décaler
					tv_markin clip frame clear
				END 
			END
		END

		tv_undoclosestack
		tv_unlockdisplay
		result = Offset
	#End

#Function Otano_MarkOutSet(frame,state,compensate,oldsync)
	//TODO : Compensate
		LOCAL q ClipID Lastframe OldState OldFrame EditStart EditLength curProjectImage curImage fromframe offset
		
		tv_undoopenstack
		tv_updateundo
		tv_lockdisplay quiet
		
		Otano_EditingInfo()
		PARSE result q ClipID q Lastframe q OldState q OldFrame q EditStart q EditLength
		
		tv_projectcurrentframe
		curProjectImage=result
		tv_layergetimage
		curImage=result
		fromframe = curProjectimage-curimage+editstart+editlength
		
		IF State == 1                                  //Set mark
			IF OldState == 1                                     //Si mark deja on, decaler offset selon ancienne mark
				tv_clipHidden ClipID
				IF result == 0
					Offset = frame - oldFrame
					
					IF oldsync == 1 && offset > 0
						fromframe = fromframe + offset
					END
					
					Otano_SoundOffset(fromframe,999999,Offset)
				END
				
				tv_markout clip frame set
			Else                                                 //Si mark off, decaler offset selon fin edit
				tv_clipHidden ClipID
				IF result == 0
					Offset = frame - lastframe

					IF oldsync == 1 && offset > 0
						fromframe = fromframe + offset
					END
					
					Otano_SoundOffset(fromframe,999999,Offset)
				END
				
				tv_markout clip frame set
			END
		ELSE
			IF State == 0                              //clear mark
				IF OldState == 1                                 //si mark on, decaler vers fin edit
					tv_clipHidden ClipID
					IF result == 0
						Offset = lastframe- oldframe

					IF oldsync == 1 && offset > 0
						fromframe = fromframe + offset
					END
					
						Otano_SoundOffset(fromframe,999999,Offset)
					END
					
					tv_markout clip frame clear
				Else                                               //si mark deja off, ne rien décaler
					tv_markout clip frame clear
				END 
			END
		END

		tv_undoclosestack
		tv_unlockdisplay
		result = Offset
	#End
	
#Function Otano_MarkInMove(Offset,Compensate,InOrOut)
	//note : moving MarkIn in negative values doesn't work due to a TVP bug
		
		LOCAL StartImage ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength NewMarkOutFrame NewMarkInFrame NewNextClipMarkOutFrame Fromframe toframe OffsetChange
		
		tv_undoopenstack
		tv_updateundo
		tv_lockdisplay quiet

		tv_layergetimage
		startImage = result

			//Current Clip Mark In Increment
		Otano_EditingInfo()
		PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength
		IF CMP(MarkInState, "1") == 0	
			tv_markin clip FirstFrame set
			MarkInFrame = FirstFrame
		END

		NewMarkInFrame = MarkInFrame + offset

		tv_markin clip NewMarkInFrame set

			//NextClip compensates exposure if Compensate==1, else offsetting sound
		IF Compensate == 1
	
	//Compensating In Point in negative values doesn't work, because of TVP bug
			IF CMP(InOrOut,"In")==1
				Otano_NextClipSkipHidden()

				Otano_EditingInfo()
				PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength

				IF CMP(MarkInState, "1") == 0	
					tv_markin clip FirstFrame set
					MarkInFrame = FirstFrame
				END

				NewNextClipMarkFrame = MarkInFrame - offset
				tv_markin clip NewNextClipMarkFrame set
				Otano_PreviousClipSkipHidden()
				tv_layerimage startImage
			END
			
			IF CMP(InOrOut,"Out")==1
				Otano_NextClipSkipHidden()

				Otano_EditingInfo()
				PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength

				IF CMP(MarkOutState, "1") == 0	
					tv_markOut clip LastFrame set
					MarkOutFrame = LastFrame
				END

				NewNextClipMarkFrame = MarkOutFrame + offset

				tv_markout clip NewNextClipMarkFrame set
				
				Otano_PreviousClipSkipHidden()
				tv_layerimage startImage
			END
		ELSE
			//offset sound if clip no hidden
			tv_clipHidden ClipID
			IF result == 0
				tv_projectcurrentframe
				fromframe=result
				OffsetChange=-offset
			Otano_SoundOffset(FromFrame,999999,OffsetChange)
			END
			NewNextClipMarkFrame = None
		END

		tv_unlockdisplay
		tv_undoclosestack
		
		result = NewMarkInFrame" "NewNextClipMarkFrame
	#End
	
#Function Otano_MarkOutMove(Offset,Compensate,InOrOut)
		LOCAL StartImage ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength NewMarkOutFrame NewMarkInFrame NewNextClipMarkOutFrame Fromframe toframe OffsetChange
		
		tv_undoopenstack
		tv_updateundo
		tv_lockdisplay quiet

		tv_layergetimage
		startImage = result

			//Current Clip Mark Out Increment
		Otano_EditingInfo()
		PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength

		IF CMP(MarkOutState, "1") == 0	
			tv_markout clip LastFrame set
			MarkOutFrame = LastFrame
		END

		NewMarkOutFrame = MarkOutFrame + offset

		tv_markout clip NewMarkOutFrame set

			//NextClip compensates exposure if Compensate==1, else offsetting sound
		IF Compensate == 1
	
	//Compensating In Point in negative values doesn't work, because of TVP bug
			IF CMP(InOrOut,"In")==1
				Otano_NextClipSkipHidden()

				Otano_EditingInfo()
				PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength

				IF CMP(MarkInState, "1") == 0	
					tv_markin clip FirstFrame set
					MarkInFrame = FirstFrame
				END

				NewNextClipMarkFrame = MarkInFrame + offset
				tv_markin clip NewNextClipMarkFrame set
				Otano_PreviousClipSkipHidden()
				tv_layerimage startImage
			END
			
			IF CMP(InOrOut,"Out")==1
				Otano_NextClipSkipHidden()

				Otano_EditingInfo()
				PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength

				IF CMP(MarkOutState, "1") == 0	
					tv_markOut clip LastFrame set
					MarkOutFrame = LastFrame
				END

				NewNextClipMarkFrame = MarkOutFrame - offset

				tv_markout clip NewNextClipMarkFrame set
				
				Otano_PreviousClipSkipHidden()
				tv_layerimage startImage
			END
		ELSE
			//offset sound if clip not hidden
			tv_clipHidden ClipID
			IF result == 0
				tv_projectcurrentframe
				fromframe=result
				OffsetChange=offset
				Otano_SoundOffset(FromFrame,999999,OffsetChange)
			END
			NewNextClipMarkFrame = None
		END

		tv_unlockdisplay
		tv_undoclosestack
		
		result = NewMarkOutFrame" "NewNextClipMarkFrame
	#End
	
#Function Otano_ClipDelete(ClipID,Compensate)
		LOCAL currentClipID q EditStart EditLength Offset InOrOut
		
		tv_undoopenstack
		tv_updateundo
		tv_lockdisplay quiet

		tv_clipcurrentid
		currentClipID = result
		
		tv_clipselect ClipID
		Otano_EditingInfo()
		PARSE result q q q q q q q q q EditStart q EditLength
		
		IF CMP(currentClipID, ClipID)==1
			Otano_NextClipSkipHidden()
			tv_clipcurrentid
			currentClipID = result
			tv_clipselect ClipID
		End
		
		tv_clipHidden ClipID
		isHidden = result
		
		IF compensate == 1
			IF isHidden == 0
				Offset = -EditLength
				Otano_MarkOutMove(Offset,compensate,Out)
			END
		ELSE
			IF isHidden == 0
				tv_projectcurrentframe
				projCurFrame = result

				tv_layergetimage
				curFrame = result
				
				fromframe = projCurFrame -(curFrame-EditStart)
				OffsetChange = -EditLength

				Otano_SoundOffset(FromFrame,999999,OffsetChange)
			END
		END

		tv_clipclose ClipID
		tv_clipselect currentClipID

		tv_unlockdisplay
		tv_undoclosestack
	#End

#Function Otano_ClipDuplicate(ClipID,compensate,noshift)
//todo compensate
		LOCAL q curClipID EditStart EditLength curProjectImage curImage fromframe

		otano_editinginfo()
		PARSE result q curClipID q
		
		tv_clipselect ClipID
		otano_editinginfo()
		PARSE result q q q q q q q q q EditStart q EditLength
		
		tv_clipHidden ClipID
		IF result == 0
			tv_projectcurrentframe
			curProjectImage=result
			tv_layergetimage
			curImage=result
			fromframe = curProjectImage-curimage+editstart
			IF noshift==1
				fromframe = fromframe+EditLength
			END
			
			Otano_SoundOffset(fromframe,999999,EditLength)
		END
		
		tv_clipduplicate ClipID
		tv_clipselect curClipID
	#End
	
#Function Otano_ClipNew(name,compensate)
//todo compensate
		LOCAL q curProjectImage curImage fromframe EditStart EditLength

		tv_clipnew name
		
		tv_projectcurrentframe
		fromframe=result
			
		Otano_SoundOffset(fromframe,999999,1)
	#End
Todo List (for me and if people who wants to know what's next) :
Spoiler : :
- Two scripts to go to the next/previous image of the clips regarding all layers and automatically go to next/prev clip (I had some nice help from MJ and will do my own script). Will do the same with some basic shortcuts to move in timeline (maybe an option button to choose between looping on the clip or going to next clip and for steps like in the flipping panel)
- Maybe a script to have the frames of the clips following the global frames of the project by moving layers right and settings marks.
- Adding timing tools working with markins and markouts, with the new script you'll be able to have your marks updating even if they are not at the extremes of your script.
- A split clip button that renames splitted clips without space (and check if there is no other case when you end up with a clip name with unusual characters). And that works if your instance is in hold mode and doesn't stretch far enough.

Bugs to fix :
- Make Delete Clip work when there is only one clip in project.
- Make Negative Markins work with a script to normalize the clip to frame 0 by moving everything to the right.
- Undoing clip hide toggle doesn't unhide/hide clips.
- Importing sound doesn't work with unusual paths for files
=> Updated to V3 : 07/08/2021
Attachments
OTANO Storyboard Tools v03.tvpx
(4.35 MiB) Downloaded 693 times
OTANO_Storyboard_Tools_v01.tvpx
(1.55 MiB) Downloaded 723 times
Last edited by NathanOtano on 07 Aug 2021, 11:47, edited 9 times in total.
Working on Windows 10
Creator of Disnosc, providing storyboard, animation and design for 2D realistic pictural animation: https://www.disnosc.fr/ - nathanotano@disnosc.fr
Highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios.
Elodie
Posts: 13912
Joined: 06 Jan 2009, 09:53
Location: Metz

Re: OTANO Storyboard Tools

Post by Elodie »

I wanted to test the panel... but I realise there is still a bug when using sound tracks in storyboard on Mac... -_-"
User avatar
NathanOtano
Posts: 1208
Joined: 01 Apr 2014, 07:07
Location: Biarritz, France
Contact:

Re: OTANO Storyboard Tools

Post by NathanOtano »

Si tu passes sur pc tu me diras : )
Working on Windows 10
Creator of Disnosc, providing storyboard, animation and design for 2D realistic pictural animation: https://www.disnosc.fr/ - nathanotano@disnosc.fr
Highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios.
User avatar
Soom
Posts: 1185
Joined: 25 Jul 2011, 16:25
Location: World
Contact:

Re: OTANO Storyboard Tools

Post by Soom »

This panel is something I was looking for! Found this by mistake while searching for something else. Unfortunately almost none of the actions work on TVP 11.5 - is there any change you could update it? The manual input of clip length and controlling the in-out points is crucial for me! thanks!
at home: Hackintosh Intel Core i9-9900K, GPU AMD RX 6600 8GB, Cintiq 22" + Dell P2415Q 4K displays, MAC OS High Sierra / Windows 10, TVP Pro 11.7.1 + TVP Pro beta
at work: Windows 10, TVP 11.7.1 Std
https://vimeo.com/danas
User avatar
NathanOtano
Posts: 1208
Joined: 01 Apr 2014, 07:07
Location: Biarritz, France
Contact:

Re: OTANO Storyboard Tools

Post by NathanOtano »

Hey Soom ! Yeah I agree controlling in/out point and managing sound is crucial (i still don't understand why tehre is not more people on this thread... :D)

I don't know why the scripts doesn"t work anymore in the new version, on my own computer everything works fine (maybe some script reference I didn't check?)
I updated sooo much more on this one since I posted it but it's a bit of a mess to sort it and export it as a clean sharable version. I'll do my best to do a new panel soon. If I forget this thread, please just sent me a mail as a reminder

In the meantime you can have a look to my library of functions in the post which has everything you need
Working on Windows 10
Creator of Disnosc, providing storyboard, animation and design for 2D realistic pictural animation: https://www.disnosc.fr/ - nathanotano@disnosc.fr
Highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios.
User avatar
NathanOtano
Posts: 1208
Joined: 01 Apr 2014, 07:07
Location: Biarritz, France
Contact:

Re: OTANO Storyboard Tools

Post by NathanOtano »

Well here it is :)

Lot's lot's of new tools since the first version, I don't have much time to create documentation but most of it is self-explenatory
Keep in mind there is weeks-worth of work on this so don't forget to credit me or my studio (Disnosc - https://www.disnosc.fr/) when using it.

Capture.PNG
Capture.PNG (72.9 KiB) Viewed 12931 times

Summary :
- First section is about editing storyboards (adding images, modifying exposures, changing mark ins/outs, playback, sticking a layer to the camera, even a weird "live cut" script to cut where you stop your playback).
- Second section is brand new and actually mandatory for storyboarding in tvpaint, i'm sure you'll like it more than expected... It all about flipping in your storyboard and automatically going from clip to clip without going back to project view. We discussed about it with MadsJuul years ago, I did my own version of those with the behaviour I wanted.
There is also a stopwatch shortcut to kind of time instances heads with a shortcut with the stopwatch, and then a script to conform it to bookmarks created with the stopwatch...
- I added in the third section small tools to help with rendering : quick blur, color switchs and luminosity increments
+ I added a soon to be released script to export a storyboard project as a diaporama, exporting all your visible clips while removing your temp timings for pitching and editing, as png or psd.
It skips empty/duplicate frames but stops to render the image if ANY layer has an instance head at that position, + it can write dialogs on bottom and action on top, and it can export clip names instead of project frames. Used in combination with the "Clip New + ID", you can have a pretty smooth time editing your exports and updating it...

OTANO Storyboard Tools v02.tvpx
(4.24 MiB) Downloaded 597 times

I'm not sure but my sound import scripts may be a bit broken, some other scripts may depend a lot on your personnal settings that I can't predict. Please tell me if you encounter any issue with some buttons so I can fix it.
Working on Windows 10
Creator of Disnosc, providing storyboard, animation and design for 2D realistic pictural animation: https://www.disnosc.fr/ - nathanotano@disnosc.fr
Highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios.
User avatar
D.T. Nethery
Posts: 4225
Joined: 27 Sep 2006, 19:19

Re: OTANO Storyboard Tools

Post by D.T. Nethery »

Thank you , Nathan !

Animator, TVPaint Beta-Tester, Animation Educator and Consultant.
MacOS 12.7.1 Monterey , Mac Mini (2018) , 3.2 GHz 6-Core Intel Core i7,
16 GB RAM , TVPaint PRO 11.7.1 - 64bit , Wacom Cintiq 21UX 2nd Gen.
,Wacom Intuos Pro 5 , Wacom driver version 6.3.39-1
tribute27
Posts: 65
Joined: 28 Aug 2015, 18:57

Re: OTANO Storyboard Tools

Post by tribute27 »

This looks amazing! I look forward to trying it out!
Windows 10 64-bit | AMD Ryzen 9 5950x | TVPaint Animation 11 Pro WIBU (11.7.1-64 bits) | Wacom Cintiq Pro 27
User avatar
Soom
Posts: 1185
Joined: 25 Jul 2011, 16:25
Location: World
Contact:

Re: OTANO Storyboard Tools

Post by Soom »

Oh wow, seems like everything works now! This is amazing - I was actually asking just a few days ago for a way to set custom scene duration on this forum and nobody knew it existed right on this panel. Thanks so much!
at home: Hackintosh Intel Core i9-9900K, GPU AMD RX 6600 8GB, Cintiq 22" + Dell P2415Q 4K displays, MAC OS High Sierra / Windows 10, TVP Pro 11.7.1 + TVP Pro beta
at work: Windows 10, TVP 11.7.1 Std
https://vimeo.com/danas
User avatar
NathanOtano
Posts: 1208
Joined: 01 Apr 2014, 07:07
Location: Biarritz, France
Contact:

Re: OTANO Storyboard Tools

Post by NathanOtano »

Happy those scripts finally get the attention they deserve xD Thank you all
Last edited by NathanOtano on 07 Aug 2021, 11:06, edited 1 time in total.
Working on Windows 10
Creator of Disnosc, providing storyboard, animation and design for 2D realistic pictural animation: https://www.disnosc.fr/ - nathanotano@disnosc.fr
Highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios.
User avatar
NathanOtano
Posts: 1208
Joined: 01 Apr 2014, 07:07
Location: Biarritz, France
Contact:

Re: OTANO Storyboard Tools

Post by NathanOtano »

Well I did an upgrade with some flexibility for my export script and managing clip Names ("IDs")

OTANO Storyboard Tools v03.tvpx
(4.35 MiB) Downloaded 605 times
Capture.PNG
Capture.PNG (46.02 KiB) Viewed 12904 times
Capture2.PNG
Capture2.PNG (28.49 KiB) Viewed 12904 times
  • I added a button to batch rename clips in their current order
  • For the "Export Board Diapos" script I added lots of options, among them :
    • Now you can choose between exporting all individual images and not just the new instances (I added this cause you can't normally export a whole project in psd with layers, only individual clips + you can't export clip names that way too).
    • You can also choose if numbering follows frame number or instance position (so you get consecutive numbering when exporting only heads, or get the actual frame heads appear)
Working on Windows 10
Creator of Disnosc, providing storyboard, animation and design for 2D realistic pictural animation: https://www.disnosc.fr/ - nathanotano@disnosc.fr
Highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios.
User avatar
Peter Wassink
Posts: 4436
Joined: 17 Feb 2006, 15:38
Location: Amsterdam
Contact:

Re: OTANO Storyboard Tools

Post by Peter Wassink »

Thank You Nathan, very generous of you to share this work!
I must have missed this thread the first time round.
Peter Wassink - 2D animator
• PC: Win11/64 Pro - AMD Ryzen 9 5900X 12-Core - 64Gb RAM
• laptop: Win10/64 Pro - i7-4600@2.1 GHz - 16Gb RAM
User avatar
NathanOtano
Posts: 1208
Joined: 01 Apr 2014, 07:07
Location: Biarritz, France
Contact:

Re: OTANO Storyboard Tools

Post by NathanOtano »

Happy it helps! :)
Working on Windows 10
Creator of Disnosc, providing storyboard, animation and design for 2D realistic pictural animation: https://www.disnosc.fr/ - nathanotano@disnosc.fr
Highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios.
User avatar
Soom
Posts: 1185
Joined: 25 Jul 2011, 16:25
Location: World
Contact:

Re: OTANO Storyboard Tools

Post by Soom »

NathanOtano wrote: 26 Sep 2021, 14:53 Happy it helps! :)
Dear Nathan
I am trying to use the Export Board Diapos but nothing happens - maybe I am doing something wrong? It shows "Exporting..." for a couple of seconds, then I check the folder there is nothing there...
at home: Hackintosh Intel Core i9-9900K, GPU AMD RX 6600 8GB, Cintiq 22" + Dell P2415Q 4K displays, MAC OS High Sierra / Windows 10, TVP Pro 11.7.1 + TVP Pro beta
at work: Windows 10, TVP 11.7.1 Std
https://vimeo.com/danas
User avatar
NathanOtano
Posts: 1208
Joined: 01 Apr 2014, 07:07
Location: Biarritz, France
Contact:

Re: OTANO Storyboard Tools

Post by NathanOtano »

It's pretty hard to bugtrack, it could be that you have some spaces or weird characters in your file names like layers, or in your path (can even be your user name). Do you have some cases where it works? Like exporting another file, and from your desktop to your desktop?
If you troubleshoot for me I can make a fix but otherwise I don't have much time to help with support ^^

+ are you on mac or pc? From you signature I guess it's mac, and I didn't test on mac but there may be some differences regarding managing file path :'(
Working on Windows 10
Creator of Disnosc, providing storyboard, animation and design for 2D realistic pictural animation: https://www.disnosc.fr/ - nathanotano@disnosc.fr
Highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios.
Post Reply