'' examples/manual/proguide/graphics/regulateLite_animationCode2.bas
''
'' Example extracted from the FreeBASIC Manual
'' from topic 'Lite regulation function to be integrated into user loop for FPS control'
''
'' See Also: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgLiteRegulate
'' --------

'' Graphic animation from dodicat (https://www.freebasic.net/forum/viewtopic.php?p=195122#p195122)

#include "regulateLite.bi"

Sub Thing(ByVal w As Integer=700, _
	ByVal h As Integer=600, _
	ByVal posx As Integer=400, _
	ByVal posy As Integer=300, _
	ByVal morph As Single=24, _
	ByVal aspect As Single=3, _
	ByVal grade As Single=6, _
	ByVal col As UInteger=RGBA(255, 255, 255, 0))

	Dim As Single XStep = 1
	Dim As Single YStep = 1
	Dim As Single b=w*w
	Dim As Single y, m, n
	For x As Single = 0 To w Step XStep
		Dim As Single s=x*x
		Dim As Single p=Sqr(b-s)
		For i As Single = -P To P Step grade*YStep
			Dim As Single r = Sqr(s+i*i)/w
			Dim As Single Q = (R - 1) * Sin(morph*r)
			y=i/aspect+q*h
			If i = -p Then m=y:n=y
			If y > m Then m = y
			If y < n Then n = y
			If m=y OrElse n=y Then
				PSet(x/2+posx, -Y/2+posy), col/i
				PSet(-x/2+posx, -Y/2+posy), col/i
			End If
		Next
	Next
End Sub

'===========================================================

If ScreenRes(800, 640, 32, 2) <> 0 Then
	Print "Could not set the graphics mode"
Else
	Width 800 \ 8, 640 \ 16
	Color, RGB(0, 0, 50)
	ScreenSet 1, 0

	Dim As Single Morph = 0
	Dim As Single k = 1
	Dim As Single aspect
	Dim As Single phase
	Dim As Single pi2 = 8 * Atn(1)
	Dim As Long fps = 80
	Dim As Long rfps
	Dim As Boolean skipping = False
	Dim As Boolean remove = False
	Dim As Boolean skipped
	Dim As Long ist
	Dim As Long mist
	Dim As ULong averageFps
	Dim As Double sumFps
	Dim As Long N

	Do
		phase+=.1
		If phase>=pi2 Then phase=0
		aspect=3+Sin(phase)
		Morph+=.1*k
		If Morph>35 Then k=-k
		If Morph<-35 Then k=-k
		If (remove = False) Or (skipped = False) Then
			Cls
			Thing(800, 500, 400, 300, Morph, aspect)
			Draw String (16, 16), "Requested FPS = " & Right("  " & fps, 3)
			Draw String (16, 32), "Applied FPS   = " & Right("  " & rfps, 3) & "   (average = " & Right("  " & averageFps, 3) & ")"
			Draw String (16, 48), "Status : " & _
				IIf(skipping = True, "Image skipping activation = true, with " & _
				IIf(remove = True, "removing images skipped = " & IIf(mist > 0, Str(mist) & "/" & Str(mist + 1), "0"), _
				"scrolling images skipped = " & IIf(mist > 0, Str(mist) & "/" & Str(mist + 1), "0")), _
				"Image skipping activation = false")
			Draw String (16, 80), "<+> : Increase FPS"
			Draw String (16, 96), "<-> : Decrease FPS"
			Draw String (16, 128), "<t> or <T> : True for image skipping activation"
			If Skipping = True Then
				Draw String (16, 144), "   <s> or <S> : Scroll image skipped"
				Draw String (16, 160), "   <r> or <R> : Remove image skipped"
				Draw String (16, 176), "<f> or <F> : False for image skipping activation"
				Draw String (16, 208), "<escape> : Quit"
			Else
				Draw String (16, 144), "<f> or <F> : False for image skipping activation"
				Draw String (16, 176), "<escape> : Quit"
			End If
			Draw String (544, 608), "Graphic animation from dodicat"
			Flip
		End If
		rfps = regulateLite(fps, skipping, , skipped)
		If skipped = True Then
			ist += 1
		Else
			mist = ist
			ist = 0
		End If
		sumFps += rfps
		N += 1
		If N >= rfps / 2 Then
			averageFps = sumFps / N
			N = 0
			sumFps = 0
		End If
		Dim As String s = UCase(Inkey)
		Select Case s
		Case "+"
			If fps < 600 Then fps += 1
		Case "-"
			If fps > 10 Then fps -= 1
		Case "T"
			skipping = True
		Case "F"
			skipping = False
		Case "S"
			If skipping = True Then remove = False
		Case "R"
			If skipping = True Then remove = True
		Case Chr(27)
			Exit Do
		End Select
	Loop
End If
