
I rebuilt my S3DR_RotateAndZoom routine. I made it in ASM because my programs are usually speed-critical.
Here it is, it could be useful

Code: Select all
InitSprite()
InitSprite3D()
InitKeyboard()
#PI=3.14159265
OpenScreen(1024,768,32,"Example 3")
S3DR_CreateZBuffer();must be called before Start3D() and S3DR_BeginReal3D()
LoadSprite(1,"yourspritehere.BMP",#PB_Sprite_Texture)
!extrn PB_S3DR_SelectTexture
!extrn PB_S3DR_Draw3D
x.f:y.f:mx.f:my.f
!macro S3DR_RotateAndZoom SpriteID,rad,z{
!fld dword[v_#rad]
!fchs; -radians
!fldpi; PI
!fld1 ; 1
!fadd st0,st0; 2
!fmul st0,st0; 4
!fdivp st1,st0; PI/4
!fsubp st1,st0; -radians-PI/4
!fsincos; cos(-radians-PI/4) and sin(-radians-PI/4)
!fst dword[v_x]
!fchs
!fstp dword[v_mx]
!fst dword[v_y]
!fchs
!fstp dword[v_my]
!mov eax,SpriteID
!call PB_S3DR_SelectTexture
!push dword[v_#z] dword[v_mx] dword[v_y] dword[v_#z] dword[v_my] dword[v_mx] dword[v_#z] dword[v_y] dword[v_x] dword[v_#z] dword[v_x]
!fld dword[v_my]
!call PB_S3DR_Draw3D
!}
zoom.f=5
Repeat
Start3D()
S3DR_BeginReal3D()
S3DR_ClearScreenAndZBuffer(#black)
S3DR_UseTransparency(#S3DR_TRUE)
radians.f+0.01:If radians>=2*#PI:radians=0:EndIf
If zoom>=50:zi.b=0:ElseIf zoom<=1:zi.b=1:EndIf
If zi.b:zoom+0.1:Else:zoom-0.1:EndIf
!S3DR_RotateAndZoom 1,radians,zoom
S3DR_EndReal3D()
Stop3D()
FlipBuffers():Delay(16)
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
