OTANO Storyboard Tools

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

OTANO Storyboard Tools

Post by NathanOtano » 07 Dec 2016, 17:13

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

Image

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 each button (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
You do not have the required permissions to view the files attached to this post.
Storyboard, animation and design work : http://nathanotano.tumblr.com/
As I'm highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios. Please don't hesitate to contact me!

User avatar
Elodie
Site Admin
Posts: 13296
Joined: 06 Jan 2009, 09:53
Location: Metz

Re: OTANO Storyboard Tools

Post by Elodie » 16 Dec 2016, 07:24

I wanted to test the panel... but I realise there is still a bug when using sound tracks in storyboard on Mac... -_-"
Questions or problems regarding the forum ? Please contact me by PM
Question regarding TVPaint or need a quotation ? Please contact me by email

User avatar
NathanOtano
Posts: 852
Joined: 01 Apr 2014, 07:07
Location: Paris, France
Contact:

Re: OTANO Storyboard Tools

Post by NathanOtano » 16 Dec 2016, 08:30

Si tu passes sur pc tu me diras : )
Storyboard, animation and design work : http://nathanotano.tumblr.com/
As I'm highly interested in animation workflows, I'm open to scripting new TVP functions for individuals and studios. Please don't hesitate to contact me!

Post Reply

Who is online

Users browsing this forum: No registered users and 8 guests