Code archives/File Utilities/Merge .cfx Animations
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| It's a little bit shoddy - but it seems to work and someone might be able to turn it into something more versatile! Simply drag and drop .cfx files containing animations with identical skeletons and it will append the animation from the second file onto the first. Essentially it does what you wished the CharacterFX “Merge” command did! It’s written in BlitzPlus and requires bless (www.mintysoftware.com), but it could probably be converted to Blitz3D without too much trouble… | |||||
Include "bless\bless.bb" ; Required
Global g_hwnd, g_window;
Global g_file1, g_file2, g_file3, g_merge, g_suggest;
; Initialize window and stuff
InitGui()
CreateTimer(60) ; To force message pump to keep reading events, even when out of focus
; For Drag-and-drop (see MSDN)
Bless_DragAcceptFiles(g_hwnd, True)
; Register the Windows events and windows we want to pay attention to
Bless_RegisterEvent(BLESS+7, WM_DROPFILES, g_hwnd, g_hwnd)
Repeat
Select WaitEvent()
Case $803 ; End
Bless_UnregisterEvent(0) ; Highly recommended to unregister all BLESS events
End
Case $103
If EventData() >= BLESS And EventData() <= BLESSMAX Then HandleBlessEvent(EventData())
; else handle standard keychar event
Case $401
file1$ = GadgetText( g_file1 );
file2$ = GadgetText( g_file2 );
file3$ = GadgetText( g_file3 );
exists1 = FileType( file1$ );
exists2 = FileType( file2$ );
If( EventSource() = g_merge )
If( exists1 = 1 And exists2 = 1 )
If( file3$ = "" )
file3$ = SuggestFile$( file1$, file2$ )
SetGadgetText( g_file3, file3$ );
End If
extn1$ = Left( FileExtn( file1$ ), 3 );
extn2$ = Left( FileExtn( file2$ ), 3 );
extn3$ = Left( FileExtn( file3$ ), 3 );
If( extn1$ = "cfx" And extn2$ = "cfx" And extn3$ = "cfx" )
exists3 = FileType( file3$ );
If( exists3 = 1 )
If( Confirm( "Output file exists - overwrite: " + FileName( file1$ ) + " ?" ) = 1 )
exists3 = 0;
DeleteFile( file3$ )
End If
End If
If( exists3 = 0 )
If ( MergeFiles( file1$, file2$, file3$ ) = True )
Notify( "Files merged successfully" );
Else
Notify( "Error merging files!", True );
End If
End If
Else
If( extn1$ <> "cfx" ) Then Notify( "Input 1 is not a .cfx file!", True );
If( extn2$ <> "cfx" ) Then Notify( "Input 2 is not a .cfx file!", True );
If( extn3$ <> "cfx" ) Then Notify( "Output is Not a .cfx file!", True );
End If
Else
If( exists1 = 0 ) Then Notify( "Input 1: " + file1$ + " not found!", True );
If( exists2 = 0 ) Then Notify( "Input 2: " + file2$ + " not found!", True );
End If
End If
If( EventSource() = g_suggest )
If( exists1 = 1 And exists2 = 1 )
SetGadgetText( g_file3, SuggestFile$( file1$, file2$ ) );
Else
Notify( "Please select valid input files", True );
End If
End If
End Select
Forever
Function HandleBlessEvent(id)
Bless_EventData(id, Bless_EventData)
Select EventData()
Case BLESS+7 ; WM_DROPFILES
fname$=String(" ", 256)
Bless_DragQueryFile(Bless_EventData\wparam, 0, fname, Len(fname))
Bless_DragFinish(Bless_EventData\wparam)
FlushMouse();
y# = MouseY() - GadgetY( g_window );
If( y < 60 )
SetGadgetText( g_file1, fname );
Else If( y > 90 )
SetGadgetText( g_file3, fname );
Else
SetGadgetText( g_file2, fname );
End If
Default
End Select
End Function
Function InitGui()
; window gadgets
g_window = CreateWindow( "Animation Merger Utility",100, 200, 415, 140, 0, 35 )
CreateLabel( "Input 1:", 10, 15, 45, 24, g_window );
g_file1 = CreateTextField( 55, 10, 350, 24, g_window );
CreateLabel( "Input 2:", 10, 45, 45, 24, g_window );
g_file2 = CreateTextField( 55, 40, 350, 24, g_window );
CreateLabel( "Output:", 10, 75, 45, 24, g_window );
g_file3 = CreateTextField( 55, 70, 300, 24, g_window );
g_merge = CreateButton( "Merge!", 55, 105, 350, 24, g_window );
g_suggest = CreateButton( "Auto", 360, 70, 45, 24, g_window );
; main window handle
g_hwnd = QueryObject(g_window ,1)
End Function
Function FileName$( file$ )
name$ = TrimPath$( file$ )
Return name$;
End Function
Function FileExtn$( file$ )
extn$ = TrimPath$( file$ )
ext = Instr( extn$, "." );
If( ext > 0 )
extn$ = Right( extn$, Len( extn$ ) - ext );
Else
extn$ = "";
End If
Return extn$;
End Function
Function FileRoot$( file$ )
root$ = TrimPath$( file$ )
ext = Instr( root$, "." );
If( ext > 0 )
root$ = Left( root$, ext - 1 );
End If
Return root$;
End Function
Function FilePath$( file$ )
name$ = TrimPath$( file$ )
path$ = Left( file$, Len( file$ ) - Len( name$ ));
Return path$;
End Function
Function TrimPath$( file$ )
length = Len( file$ );
slashPos = Instr( file$, "\" );
If( slashPos > 0 ) Then Return TrimPath( Right( file$, length - slashPos ) );
Return file$;
End Function
Function MergeFiles( file1$, file2$, output$ )
fin1 = ReadFile( file1$ );
fin2 = ReadFile( file2$ );
fout = WriteFile( output$ );
If( fin1 = 0 Or fin2 = 0 Or fout = 0 ) Then Return False;
frames1 = 0;
While( frames1 = 0 )
lin$ = ReadLine( fin1 );
If( Instr( lin$, "SetTotalFrames" ) > 0 )
start = Instr( lin$, "(" ) + 1;
finish = Instr( lin$, ")" ) - 1;
frames1 = Mid$( lin$, start, (finish - start) + 1 );
Else
WriteLine( fout, lin$ )
End If
Wend
frames2 = 0;
While( frames2 = 0 )
lin$ = ReadLine( fin2 );
If( Instr( lin$, "SetTotalFrames" ) > 0 )
start = Instr( lin$, "(" ) + 1;
finish = Instr( lin$, ")" ) - 1;
frames2 = Mid$( lin$, start, (finish - start) + 1 );
End If
Wend
WriteLine( fout, "SetTotalFrames(" + (frames1+frames2) + ")" );
While( Not Eof( fin1 ) )
matrices = False
While( matrices = False )
lin$ = ReadLine( fin1 );
WriteLine( fout, lin$ )
If( Instr( lin$, "bone:SetZConstraints" ) > 0 )
matrices = True;
End If
Wend
matrices = False
While( matrices = False )
lin$ = ReadLine( fin2 );
If( Instr( lin$, "bone:SetZConstraints" ) > 0 )
matrices = True;
End If
Wend
matrices = True;
While( matrices = True )
lin$ = ReadLine( fin1 );
If( Instr( lin$, "bone:SetId" ) > 0 )
matrices = False;
Else
WriteLine( fout, lin$ )
End If
Wend
matrices = True;
While( matrices = True )
lin$ = ReadLine( fin2 );
If( Instr( lin$, "bone:SetId" ) > 0 )
matrices = False;
WriteLine( fout, lin$ )
Else
If( Instr( lin$, "bone:SetKey" ) > 0 )
start = Instr( lin$, "(" ) + 1;
finish = Instr( lin$, "," ) - 1;
key = Mid$( lin$, start, (finish - start) + 1 );
WriteLine( fout, "bone:SetKey(" + (key+frames1) + Right$( lin$, Len(lin$) - finish ) );
Else
WriteLine( fout, lin$ )
End If
End If
Wend
lin$ = ReadLine( fin1 );
WriteLine( fout, lin$ )
lin$ = ReadLine( fin1 );
WriteLine( fout, lin$ )
Wend
CloseFile( fin1 );
CloseFile( fin2 );
CloseFile( fout );
Return True;
End Function
Function SuggestFile$( file1$, file2$ )
path$ = FilePath( file1$ );
root1$ = FileRoot( file1$ );
root2$ = FileRoot( file2$ );
common$ = Common$( root1$, root2$ );
comlen = Len( common$ );
root1$ = Mid( root1$, comlen + 1, 5 );
root2$ = Mid( root2$, comlen + 1, 5 );
Return path$ + common$ + root1$ + "_" + root2$ + ".cfx";
End Function
Function Common$( file1$, file2$ )
len1 = Len( file1$ );
len2 = Len( file2$ );
If( len1 > len2 )
For c = 1 To len2
If( Left( file1$, c ) <> Left( file2$, c ) ) Then Return Left( file1$, c - 1);
Next
Return file2$
Else
For c = 1 To len1
If( Left( file1$, c ) <> Left( file2$, c ) ) Then Return Left( file1$, c - 1);
Next
Return file1$
End If
End Function |
Comments
None.
Code Archives Forum