Creating a Slower Animtex Frame Timer within RenderTween Loop?Help

Blitz3D Forums/Blitz3D Programming/Creating a Slower Animtex Frame Timer within RenderTween Loop?Help

Stickman(Posted 2003) [#1]
Im working on my own Anim texturing function that will animate only the UV coords of the vertices.

I need a way to be able to controll the Frame Rate for the animations so as they wont animate as fast as the Program will run.

I also want it inside of Marks RenderTweening code so as the animations will still update smoothly regardles of how fast Program execution is going.

Here is some code to show kind of what Im after,
Youll Notice that the way I have a frame Limiter set up ( as Bogus as it is ) that there is a funny flicker between frames animating.Not Good !

There is a manual Frame counter Included ( keyhit(57) )so you can see that a smooth transfer between frames is possible just need a good way to set it up automaticly.

Im really stuck here with somthing that could be really cool.

Thanks for any Help you may Have to Offer.

P.S I created this code for working on in the forums only so it may be a little sloppy but the concept is still there.


Graphics3D 800,600,32,1

Const FPS=50
Global Cam,Cube,Tex,Piv1,Piv2
Global af#,atx#
Dim atxarr(1,3,3) ;Animate Texture
Dim UVarr#(15,1) ;U,V coords
Setup()

init=MilliSecs()
period=1000/FPS
time=MilliSecs()-period

While Not KeyHit(1)

Cls

	Repeat
		elapsed=MilliSecs()-time
	Until elapsed
	
	ticks=elapsed/period
	tween#=Float(elapsed Mod period)/Float(period)
	
	For k=1 To ticks
		time=time+period
		If k=ticks Then CaptureWorld  
		
	     Update( )

             ; {EDITED} ;
             AnimTex( time )
             ; {EDITED} ;

	     UpdateWorld : tf#=tf#+1

    Next

         
    RenderWorld tween#

 Ffps = ff#/(MilliSecs()-init)*1000
 Tfps = tf#/(MilliSecs()-init)*1000
 Afps = af#/(MilliSecs()-init)*1000

 Text 5,10," FLIP  fps : "+Ffps
 Text 5,30," Tween fps : "+Tfps
 Text 5,50," Anim  fps : "+Afps

Flip : ff#=ff#+1

Wend
End

; Setup......................\
Function setup( )

Piv1=CreatePivot()
Piv2=CreatePivot(Piv1)
Cam=CreateCamera(Piv2)
PositionEntity Cam,0,0,-10

Cube=CreateCube()

Tex=CreateTexture(256,256)
 SetBuffer TextureBuffer( Tex )


   For X=0 To 192 Step 64
    B=B+50 Y=0
    Color 0,0,50+B
    Rect X,Y,64,64,1
   Next

   For X=0 To 192 Step 64
    R=R+50 Y=64
    Color 50+R,0,0
    Rect X,Y,64,64,1
   Next

   For X=0 To 192 Step 64
    G=G+50 Y=128
    Color 0,50+G,0
    Rect X,Y,64,64,1
   Next

   For X=0 To 192 Step 64
    G=G+50 R=R+50 Y=192
    Color 50+R,50+G,0
    Rect X,Y,64,64,1
   Next

 
 SetBuffer BackBuffer()

 S=GetSurface(cube,1)

 For Tri=0 To CountTriangles( S )-1 Step 2
     vi=TriangleVertex( S,tri,0 )
     
      VertexTexCoords( S,vi+0 ,.75 ,.75 )
      VertexTexCoords( S,vi+1 ,.75 , 1  )
      VertexTexCoords( S,vi+2 , 1  ,.75 )
      VertexTexCoords( S,vi+3 , 1  , 1  )

 Next 

EntityTexture Cube,Tex

;Load Arrays____
   ;UV Array..................
   For au#=0 To .75 Step .25
    For av#=0 To .75 Step .25 
       count=1+count
        UVarr( count-1,0 )=av#
        UVarr( count-1,1 )=au#
    Next 
   Next 

   ;ATX Array
 
   ;ARRAY LIST......HARDCODED for Testing

   ; ?,?, startFrame
   ; ?,?, end frame
   ; ?,?, Vertexes current Frame
   ; ?,?, Vertex to animate UV coords 

   ;Sequence # 1
   atxarr(0,0,0)=1
   atxarr(0,0,1)=4
   atxarr(0,0,2)=2
   atxarr(0,0,3)=0

   atxarr(0,1,0)=5
   atxarr(0,1,1)=8
   atxarr(0,1,2)=7
   atxarr(0,1,3)=8

   ;Sequence # 2 
   atxarr(1,0,0)=9
   atxarr(1,0,1)=12
   atxarr(1,0,2)=12
   atxarr(1,0,3)=12

   atxarr(1,1,0)=13
   atxarr(1,1,1)=16
   atxarr(1,1,2)=13
   atxarr(1,1,3)=16
   

End Function 
;.........................../


; Update....................\\
Function UpDate( )

If KeyDown(200) MX=+2
If KeyDown(208) MX=-2
If KeyDown(203) MY=+2
If KeyDown(205) MY=-2

 TurnEntity Piv2,MX,0,0
 TurnEntity Piv1,0,MY,0


End Function 
;...........................//


;Animate Texture UVs........\\\
Function AnimTex( Time )

atx =  time / 100  Mod 3

;If KeyHit(57)=True atx=1   ; FOR MANUAL TESTING ONLY

 If atx=0 ; set atx to =1 for Manual Test
    af#=af#+1

    For seq=0 To 1
     For vi=0 To 1

         sf=atxarr(seq,vi,0)    ;Start Frame
         ef=atxarr(seq,vi,1)    ;End Frame
         cf=atxarr(seq,vi,2)    ;Current Frame
          c=atxarr(seq,vi,3)    ;Veretex

         cf=cf+1

         If cf>ef 
             cf=sf
         End If 

         U0#=UVarr(cf-1,0)
         V0#=UVarr(cf-1,1)
         U1#=U0#+.25
         V1#=V0#+.25

         S=GetSurface( Cube,1 )

         VertexTexCoords(s,c+0,U1,V0 )
         VertexTexCoords(s,c+1,U1,V1 )
         VertexTexCoords(s,c+2,U0,V1 )
         VertexTexCoords(s,c+3,U0,V0 )
         
         atxarr(seq,vi,2)=cf

     Next
    Next

  ;atx=0 ;Reset atx for Manual Testing Only
 End If 

End Function 
;...........................///
;End Program..................///






Stickman(Posted 2003) [#2]
Well I got somthing a little smoother working.
Setting the animframes is like a gessing game with this.

Any Improvments would be great.

Changes.....

( in while loop )


While Not KeyHit(1)

Cls

	Repeat
		elapsed=MilliSecs()-time
	Until elapsed

	
	ticks=elapsed/period

	
	tween#=Float(elapsed Mod period)/Float(period)

         
	For k=1 To ticks
		time=time+period
		If k=ticks Then CaptureWorld  
		
	     Update( )
	
             ; Changed this to ;
	      atx=time/50 Mod 3
	      If Not atx AnimTex( )
          
          

	     UpdateWorld : tf#=tf#+1

    Next

         
    RenderWorld tween#


and in AnimTex Function()

;Animate Texture UVs........\\\

Function AnimTex(  )

    af#=af#+1

    For seq=0 To 1
     For vi=0 To 1

         sf=atxarr(seq,vi,0)    ;Start Frame
         ef=atxarr(seq,vi,1)    ;End Frame
         cf=atxarr(seq,vi,2)    ;Current Frame
          c=atxarr(seq,vi,3)    ;Veretex

         cf=cf+1

         If cf>ef 
             cf=sf
         End If 

         U0#=UVarr(cf-1,0)
         V0#=UVarr(cf-1,1)
         U1#=U0#+.25
         V1#=V0#+.25

         S=GetSurface( Cube,1 )

         VertexTexCoords(s,c+0,U1,V0 )
         VertexTexCoords(s,c+1,U1,V1 )
         VertexTexCoords(s,c+2,U0,V1 )
         VertexTexCoords(s,c+3,U0,V0 )
         
         atxarr(seq,vi,2)=cf

     Next
    Next
 

End Function


Any Better Ideas Are welcome.