REM Project: Stick figures
REM Created: 4/23/2006 12:26:00 PM
REM By Coding Fodder
REM ***** Main Source File *****
REM
sync on: sync rate 0
set display mode 1024,768,32
 
type AnimationKeyFrame
   scale as float
   Xangle as float
   Yangle as float
   Zangle as float
   explicitScale as boolean
   explicitX as boolean
   explicitY as boolean
   explicitZ as boolean
EndType
 
#constant pi=3.1415926535898
#constant totalKeyFrames = 30
global dim KeyFrame(totalKeyFrames,21) as AnimationKeyFrame
 
MakeStickMan()
 
do
   animationFrame#=animationFrame#+0.04
   if animationFrame#>=21 then animationFrame#=0
   angle#=wrapvalue(angle#+0.05)
   animate(int(AnimationFrame#)+10)
   yRotate_Limb(FigureCG,angle#)
   RenderMan()
   sync
   cls
   Select inkey$()
      case "a","A": animationEditor():endcase
   EndSelect
loop
 
Function animationEditor()
   number#=0
   ActiveLimb=1
   do
      cls
      Text 868,60,"X Angle"
      Text 888,40,"Y Angle"
      Text 908,20,"Z Angle"
      text 10,0, "ViewX"
      text 190,0, "ViewY"
      text 390,0, "ViewZ"
 
 
 
      WorldAngleX# = sliderBar(20,20,120,WorldAngleX#,-360,360,12,0)
      WorldAngleY# = sliderBar(200,20,120,WorldAngleY#,-360,360,12,0)
      WorldAngleZ# = sliderBar(400,20,120,WorldAngleZ#,-360,360,12,0)
 
      Xangle#=sliderBar(920,80,628,Xangle#,-360,360,1,1)
      Yangle#=sliderBar(940,60,628,Yangle#,-360,360,1,1)
      Zangle#=sliderBar(960,40,628,Zangle#,-360,360,1,1)
 
      frame=sliderBar(40,720,800,frame,0,totalKeyFrames,1,0)
 
      animate(int(Frame))
      xRotate_Limb(FigureCG,WorldAngleX#)
      yRotate_Limb(FigureCG,WorldAngleY#)
      zRotate_Limb(FigureCG,WorldAngleZ#)
 
      xRotate_Limb(ActiveLimb,Xangle#)
      yRotate_Limb(ActiveLimb,Yangle#)
      zRotate_Limb(ActiveLimb,Zangle#)
 
      RenderMan()
      ActiveLimb=ActivateLimb(ActiveLimb)
 
      if inkey$() = "k" or inkey$() = "K"
         setKeyFrame(frame,ActiveLimb,400,Xangle#,Yangle#,Zangle#)
         Xangle=0
         Yangle=0
         Zangle=0
      endif
 
      sync
 
   loop
 
 
EndFunction
 
Function ActivateLimb(ActiveLimb)
   if inkey$() = "l" or inkey$() = "L"
      repeat
         box 512-100,384-50,512+100,384+50
         ink 0,0
         box 512-99,384-49,512+99,384+49
         ink rgb(255,255,255),0
         set cursor 512-80,380
         input "Limb Number ", limbNum$
         if val(limbNum$)>=0 and val(limbnum$)<=20
            ActiveLimb=val(limbnum$)
            validoutput=1
         endif
      until validoutput=1
   endif
 
   select ActiveLimb
      Case 1:Limb$="Global":endcase
      Case 2:Limb$="FigureCG":endcase
      Case 3:Limb$="Upper Torso":endcase
      Case 4:Limb$="Neck":endcase
      Case 5:Limb$="Head":endcase
      Case 6:Limb$="Left Shoulder":endcase
      Case 7:Limb$="Left Arm":endcase
      Case 8:Limb$="Left ForeArm":endcase
      Case 9:Limb$="Left Hand":endcase
      Case 10:Limb$="Right Shoulder":endcase
      Case 11:Limb$="Right Arm":endcase
      Case 12:Limb$="Right ForeArm":endcase
      Case 13:Limb$="Right Hand":endcase
      Case 14:Limb$="Lower Back":endcase
      Case 15:Limb$="Left Leg":endcase
      Case 16:Limb$="Left shin":endcase
      Case 17:Limb$="Left Foot":endcase
      Case 18:Limb$="Right Leg":endcase
      Case 19:Limb$="Right shin":endcase
      Case 20:Limb$="Right Foot":endcase
   endselect
 
   text 560,0,Limb$
EndFunction ActiveLimb
 
Function sliderBar(X,Y,Length#,OldValue#,Minval#,Maxval#,Increment#,Orientation)
   if OldValue#<MinVal# then OldValue#=MinVal#
   if OldValue#>MaxVal# then OldValue#=MaxVal#
   Offset#=0-Minval#
   pixelsPERunit#=Length#/(MaxVal#-MinVal#)
   if Orientation = 0
      line X,Y,X+Length#,Y
      box  X-5+(Oldvalue#+Offset#)*pixelsPERunit#, Y-5, X+5+(Oldvalue#+Offset#)*pixelsPERunit#, Y+5
      if mouseclick() = 1
         if mousex() < X+5+(Oldvalue#+Offset#)*pixelsPERunit# and mousex() > X-5+(Oldvalue#+Offset#)*pixelsPERunit# and mousey() < y+5 and mousey() > y-5
            OldValue#=OldValue#+mousemovex()*Increment#
            if OldValue#<MinVal# then OldValue#=MinVal#
            if OldValue#>MaxVal# then OldValue#=MaxVal#
            position mouse X+(Oldvalue#+Offset#)*pixelsPERunit#,Y
         endif
      else
         junk=mousemovex()
      endif
      text x,y+20,TruncateFloat(OldValue#,2)
   else
      line X,Y,X,Y+Length#
      box X-5, Y-5+(Oldvalue#+Offset#)*pixelsPERunit#, X+5, Y+5+(Oldvalue#+Offset#)*pixelsPERunit#
      if mouseclick() = 1
         if mousex() < X+5 and mousex() > X-5 and mousey() < y+5+(Oldvalue#+Offset#)*pixelsPERunit# and mousey() > y-5+(Oldvalue#+Offset#)*pixelsPERunit#
            OldValue#=OldValue#+mousemovey()*Increment#
            if OldValue#<MinVal# then OldValue#=MinVal#
            if OldValue#>MaxVal# then OldValue#=MaxVal#
            position mouse X,Y+(Oldvalue#+Offset#)*pixelsPERunit#
         endif
      else
         junk = mousemovey()
      endif
      OldValue#=int(OldValue#/Increment#)*Increment#
      text x,y+length#+10,TruncateFloat(OldValue#,2)
   endif
 
Endfunction OldValue#
 
function TruncateFloat(number#,decimalPlaces)
   whole=int(number#)
   fraction$=right$(left$(str$(number#-whole),4),2)
   out$=str$(whole)+"."+fraction$
endfunction out$
 
 
Function animate(frame)
   for i = 1 to 20
      Scale_Limb(i,KeyFrame(frame,i).scale)
      zRotate_Limb(i,KeyFrame(frame,i).Zangle)
      yRotate_Limb(i,KeyFrame(frame,i).Yangle)
      xRotate_Limb(i,KeyFrame(frame,i).Xangle)
   next i
EndFunction
 
Function Setkeyframe(frame as integer, Limb as integer, scale as float, Xangle as float, Yangle as float, Zangle as float)
   text 1,1,str$(KeyFrame(frame,Limb).explicitX)
 
   If scale <= 360
      KeyFrame(frame,Limb).scale=scale
      KeyFrame(frame,Limb).explicitScale=1
   endif
   If Xangle <= 360
      KeyFrame(frame,Limb).Xangle=Xangle
      KeyFrame(frame,Limb).explicitX=1
   endif
   If Yangle <= 360
      KeyFrame(frame,Limb).Yangle=Yangle
      KeyFrame(frame,Limb).explicitY=1
   endif
   If Zangle <= 360
      KeyFrame(frame,Limb).Zangle=Zangle
      KeyFrame(frame,Limb).explicitZ=1
   endif
   text 50,1,str$(KeyFrame(frame,Limb).Xangle)
   `Interpolate scale key frames
   i=1
   while i <= totalKeyFrames
      j = i
      explicitFound=0
      while j <= totalKeyFrames and explicitFound=0
         inc j
         if KeyFrame(j,Limb).explicitScale=1 then explicitFound=1
      endwhile
      for value = i to j
         KeyFrame(value,Limb).scale = KeyFrame(i,Limb).scale/(j-i)*(j-value) + KeyFrame(j,Limb).scale/(j-i)*(value-i)
      next value
      i=j
   endwhile
   `Interpolate Xrotation keyframes
   i=1
   while i <= totalKeyFrames
      j = i
      explicitFound=0
      while j <= totalKeyFrames and explicitFound=0
         inc j
         if KeyFrame(j,Limb).explicitX=1 then explicitFound=1
      endwhile
      for value = i to j
         KeyFrame(value,Limb).Xangle = KeyFrame(i,Limb).Xangle/(j-i)*(j-value) + KeyFrame(j,Limb).Xangle/(j-i)*(value-i)
      next value
      i=j
   endwhile
   `Interpolate Yrotation keyframes
   i=1
   while i <= totalKeyFrames
      j = i
      explicitFound=0
      while j <= totalKeyFrames and explicitFound=0
         inc j
         if KeyFrame(j,Limb).explicitY=1 then explicitFound=1
      endwhile
      for value = i to j
         KeyFrame(value,Limb).Yangle = KeyFrame(i,Limb).Yangle/(j-i)*(j-value) + KeyFrame(j,Limb).Yangle/(j-i)*(value-i)
      next value
      i=j
   endwhile
   `Interpolate Zrotation keyframes
   i=1
   while i <= totalKeyFrames
      j = i
      explicitFound=0
      while j <= totalKeyFrames and explicitFound=0
         inc j
         if KeyFrame(j,Limb).explicitZ=1 then explicitFound=1
      endwhile
      for value = i to j
         KeyFrame(value,Limb).Zangle = KeyFrame(i,Limb).Zangle/(j-i)*(j-value) + KeyFrame(j,Limb).Zangle/(j-i)*(value-i)
      next value
      i=j
   endwhile
EndFunction
 
Function RenderMan()
   Set Vector4 101,x Vector4(1),y Vector4(1),z Vector4(1),w Vector4(1)
   for i = 2 to 20
      Multiply matrix4 200+i,200+i,200+connections(i)
      Transform Vector4 100+i,i,200+i
      Add Vector4 100+i,100+i,100+connections(i)
      if i<>head and i<>RightHand and i<> lefthand and i <> FigureCG
         line x Vector4(100+connections(i)),768-y Vector4(100+connections(i)),x Vector4(100+i),768-y Vector4(100+i)
      Endif
   next i
   circle x Vector4(100+Head),768-y Vector4(100+Head),10
   circle x Vector4(100+LeftHand),768-y Vector4(100+LeftHand),5
   circle x Vector4(100+RightHand),768-y Vector4(100+RightHand),5
   for i = 1 to 20
      Set Identity Matrix4 200+i
   next i
EndFunction
 
Function Scale_Limb(limb as integer,amount as float)
   `scale matrix4 Ident,amount,amount,amount
   `Multiply matrix4 200+limb,200+limb,Ident
   `Set Identity matrix4 Ident
EndFunction
 
Function xRotate_Limb(limb as integer,angle as float)
   Rotate X Matrix4 Ident,angle*pi/180.0
   Multiply matrix4 200+limb,200+limb,Ident
   Set Identity matrix4 Ident
EndFunction
 
Function yRotate_Limb(limb as integer,angle as float)
   Rotate Y Matrix4 Ident,angle*pi/180.0
   Multiply matrix4 200+limb,200+limb,Ident
   Set Identity matrix4 Ident
EndFunction
 
Function zRotate_Limb(limb as integer,angle as float)
   Rotate Z Matrix4 Ident,angle*pi/180.0
   Multiply matrix4 200+limb,200+limb,Ident
   Set Identity matrix4 Ident
EndFunction
 
Function MakeStickMan()
   #constant FigurePosition = 1
   #constant FigureCG = 2
   #constant UpperTorso = 3
   #constant Neck = 4
   #constant Head = 5
   #constant LeftShoulder = 6
   #constant LeftHumurous = 7
   #constant LeftForeArm = 8
   #constant LeftHand=9
   #constant RightShoulder=10
   #constant RightHumurous = 11
   #constant RightForeArm = 12
   #constant RightHand = 13
   #constant LowerBack = 14
   #constant LeftThigh = 15
   #constant leftShin = 16
   #constant leftFoot = 17
   #constant RightThigh = 18
   #constant RightShin = 19
   #constant RightFoot = 20
   #constant Ident = 199
 
   nothing = Make Matrix4(Ident)
   Set Identity Matrix4 Ident
   for i = 1 to 20
      nothing = Make Vector4(i)
      nothing = Make Vector4(100+i)
      nothing = Make Matrix4(200+i)
      Set Identity Matrix4 200+i
   next i
 
   Set Vector4 FigurePosition,200,200,0,0
   Set Vector4 FigureCG,0,135,0,0
   Set Vector4 UpperTorso,-2,30,0,0
   Set Vector4 Neck,1,12,0,0
   Set Vector4 Head,3,10,0,0
   Set Vector4 LeftShoulder,0,-5,20,0
   Set Vector4 LeftHumurous,0,-40,10,0
   Set Vector4 LeftForeArm,10,-35,10,0
   Set Vector4 LeftHand,2,-5,3,0
   Set Vector4 RightShoulder,0,-5,-20,0
   Set Vector4 RightHumurous,0,-40,-10,0
   Set Vector4 RightForeArm,10,-35,-10,0
   Set Vector4 RightHand,2,-5,-3,0
   Set Vector4 LowerBack,-2,-40,0,0
   Set Vector4 LeftThigh,0,-50,20,0
   Set Vector4 leftShin,0,-45,15,0
   Set Vector4 leftFoot,15,0,2,0
   Set Vector4 RightThigh,0,-50,-20,0
   Set Vector4 RightShin,0,-45,-15,0
   Set Vector4 RightFoot,15,0,-2,0
 
 
   dim connections(20) as integer
 
   connections(FigurePosition)=0
   connections(FigureCG)=FigurePosition
   connections(UpperTorso)=FigureCG
   connections(Neck)=UpperTorso
   connections(Head)=Neck
   connections(LeftShoulder)=UpperTorso
   connections(LeftHumurous)=LeftShoulder
   connections(LeftForeArm)=LeftHumurous
   connections(LeftHand)=LeftForeArm
   connections(RightShoulder)=UpperTorso
   connections(RightHumurous)=RightShoulder
   connections(RightForeArm)=RightHumurous
   connections(RightHand)=RightForeArm
   connections(LowerBack)=FigureCG
   connections(LeftThigh)=LowerBack
   connections(LeftShin)=LeftThigh
   connections(LeftFoot)=LeftShin
   connections(RightThigh)=LowerBack
   connections(RightShin)=RightThigh
   connections(RightFoot)=RightShin
 
   `Values over 360 are ingnored set to whatever interpolation value the program sees fit depending on
   `other keyframes
 
    SetKeyFrame(10,RightThigh,400,-20,10,50)
    SetKeyFrame(10,RightShin,400,400,400,-80)
    SetKeyFrame(5,RightFoot,400,400,400,10)
    SetKeyFrame(10,RightFoot,400,400,400,-15)
    SetKeyFrame(10,LeftThigh,400,20,10,-10)
    SetKeyFrame(10,LeftShin,400,400,400,-20)
    SetKeyFrame(10,UpperTorso,400,400,400,-10)
    SetKeyFrame(10,LeftHumurous,400,400,400,10)
    SetKeyFrame(10,RightHumurous,400,400,400,-10)
 
    SetKeyFrame(20,LeftThigh,400,20,10,50)
    SetKeyFrame(20,LeftShin,400,400,400,-80)
    SetKeyFrame(15,LeftFoot,400,400,400,10)
    SetKeyFrame(20,LeftFoot,400,400,400,-15)
    SetKeyFrame(20,RightThigh,400,-20,10,-10)
    SetKeyFrame(20,RightShin,400,400,400,-20)
    SetKeyFrame(20,UpperTorso,400,400,400,-10)
    SetKeyFrame(20,RightHumurous,400,400,400,10)
    SetKeyFrame(20,LeftHumurous,400,400,400,-10)
 
    SetKeyFrame(30,RightThigh,400,-20,10,50)
    SetKeyFrame(30,RightShin,400,400,400,-80)
    SetKeyFrame(25,RightFoot,400,400,400,10)
    SetKeyFrame(30,RightFoot,400,400,400,-15)
    SetKeyFrame(30,LeftThigh,400,20,10,-10)
    SetKeyFrame(30,LeftShin,400,400,400,-20)
    SetKeyFrame(30,UpperTorso,400,400,400,-10)
    SetKeyFrame(30,LeftHumurous,400,400,400,10)
    SetKeyFrame(30,RightHumurous,400,400,400,-10)
    `SetKeyFrame(20,,400,400,400,400)
    `SetKeyFrame(,,400,400,400,400)
 
 
 
Endfunction