' Horloge V5...
' Une horloge analogique, mais en 3D.
' Essayons de faire réaliste....

' cadre simple...
color #fff
create sprite 16 as "cadre"
add "cadre" box 1, 1, 1 to 16, 16, 1
move "cadre" to 0, 0, 3
zoom "cadre" to 6, 6, 1


' On va construire 12 "protubérances"
' pour les 12 index des heures
for 1 to 12 as ?heure
	?objet = "index-?heure"
	create sprite 4 as ?objet
	if (mod ?heure, 3) = 0
		' 3, 6, 9, 12 : plus grand
		?l = 4
	else
		?l = 2
	end
	add ?objet line 1, 1, 1 to 1, ?l, 1
	?angle = ?heure * 30
	turn z ?objet to -?angle
	' z=2.85 c'est légèrement devant le cadre (3.0)
	move ?objet to 16 * (sin ?angle), 16 * (cos ?angle), 2.85
next

' Construction des aiguilles :
' 1) Les Heures
color #888
create sprite 16 as "heure"
add "heure" line 1, 1, 1 to 1, 12, 1
' note : un sprite est auto centré mais ici on veut
' le faire pivoter autour de sa base (1,1,1)
' on va tout de même le décaler légèrement pour
' laisser une "queue" derrière son axe
center "heure" to 1, 2, 1
move "heure" to 0, 0, 2
zoom z "heure" to 0.5' un peu plate
paint "heure" to "metal"

' 2) Les minutes
color #999
create sprite 16 as "minute"
add "minute" line 1, 1, 1 to 1, 16, 1
center "minute" to 1, 2, 1
move "minute" to 0, 0, 1.5
zoom z "minute" to 0.5
paint "minute" to "metal"

' 3) Les secondes
color #922
create sprite 16 as "seconde"
add "seconde" line 1, 1, 1 to 1, 16, 1
center "seconde" to 1, 2, 1
zoom "seconde" to .5, 1, .5' plate et fine !
move "seconde" to 0, 0, 1
paint "seconde" to "metal"


' Le plus complexe : lumière et ombre
' Les lumières sont toujours un équilibre délicat à trouver.

' lumière d'ambiance assez forte
power "glow" to 60

' Lumière ombre : classiquement en haut à gauche
create shadow as "ombre"
move "ombre" to -10, 20, -20
target "ombre" to "cadre"' vers le cadre
power "ombre" to 40
color "ombre" to #def
' taille minimale pour une bonne qualité
shadow "ombre" to 20

' on va accompagner d'une lumière classique
' à la même position
power "light" to 15
color "light" to #ffe
move "light" to -30, 20, -30

' Maintenant, animation de l'horloge

' En débutant à 0, l'horloge se règlera au démarrage
?heure_anim = 0
?minute_anim = 0
?seconde_anim = 0

' boucle principale : rien de spécial
' le calcul des angles se fait ensuite...
do
	
	?h = (hours) * 30
	?heure_anim = goto "animation", ?heure_anim, ?h
	turn z "heure" to -?heure_anim
	
	?m = (minutes) * 6
	?minute_anim = goto "animation", ?minute_anim, ?m
	turn z "minute" to -?minute_anim
	
	?s = (seconds) * 6
	?seconde_anim = goto "animation", ?seconde_anim, ?s, 10
	turn z "seconde" to -?seconde_anim
	
	?angle + .2
	move "camera" to 1 * (sin ?angle), -2 * (sin ?angle * 2), -30 + 3 * (sin ?angle)
	
	update
loop


label "animation" local
	' ici l'idée est simplement de déplacer en douceur les aiguilles.
	' simplement si a doit devenir b --> a = a+(b-a)/10
	' mais il y a un hic : l'aiguille ne repart par en arrière
	' entre 59 secondes et 00 !
	' Une distance négative doit être impossible
	param ?position
	param ?future_position
	param ?ralentissement = 30' valeur par défaut
	
	?delta = ?future_position - ?position
	if ?delta < 0
		' Le hic : pour ne pas revenir en arrière...
		' on la place immédiatement 1 tour complet en arrière
		' l'aiguille ira donc de l'avant...
		?position - 360
	end
	
return ?position + (?future_position - ?position) / ?ralentissement

'
x