Code archives/Graphics/3D Clock
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Full 3D Clock in 2D, Variable clock point amount, variable radius of clock, variable depth and width of clock dimensions...it could be used to benchmark B2D on different computers ? Lightsourcing, flatshaded triangle filler(very easy to use), Radix MidZ sorting, back-face removal...displays your computers clock | |||||
AppTitle "3D Clock" ;Kevin Cockburn (guybrushnivek@aol.com) ;Move mouse, moves light-source. ;Click mouse, end program. ;Numbers 1 - 3, rotate X , Y , Z angles ;Numbers 4 - 5, zoom in and out ;Number 6, reset angles and zoom to preset ;Change GWIDTH , GHEIGHT , GDEPTH , GMODE Const GWIDTH = 640 , GHEIGHT = 480 , GDEPTH = 16 , GMODE = 1 Const MINX = 0 , MINY = 0 , MAXX = GWIDTH - 1 , MAXY = GHEIGHT - 1 Const GHALFX = GWIDTH / 2 , GHALFY = GHEIGHT / 2 Graphics GWIDTH , GHEIGHT , GDEPTH , GMODE ClsColor(16 , 16 , 16) SetBuffer BackBuffer() ;CLOCK_POINT_AMOUNT : 3 - 1200 Const CLOCK_POINT_AMOUNT = 100 ;Amount of Points in the circle we will allow to describe the face Const CLOCK_SIZE = 235 ;Radius of Clock Circle(DON'T CHANGE.) Const CLOCK_RIM_SIZE = 30 ;Thickness of Clock rim Const CLOCK_WIDTH = 50 ;Thickness of Clock side-on. Const NUM_TRIANGLES_ON_CLOCK = CLOCK_POINT_AMOUNT Shl 3 + 144 + 14 + 14 + 14 Const CLOCK_FRAME_POINTS = CLOCK_POINT_AMOUNT Shl 2 Const ALL_CLOCK_VERTICES = CLOCK_FRAME_POINTS + 95 + 9 + 9 + 9 Const ONEOVER3# = Float 1 / 3 Const CURRENT1 = CLOCK_FRAME_POINTS + 96 Const CURRENT2 = CLOCK_POINT_AMOUNT Shl 3 + 144 Const CURRENT3 = CLOCK_FRAME_POINTS + 105 Const CURRENT4 = CLOCK_POINT_AMOUNT Shl 3 + 158 Const CURRENT5 = CLOCK_FRAME_POINTS + 114 Const CURRENT6 = CLOCK_POINT_AMOUNT Shl 3 + 172 Const LIGHTSOURCE_RATIO_X# = Float 2000 / (GWIDTH - 1) , LIGHTSOURCE_RATIO_Y# = Float 2000 / (GHEIGHT - 1) Const MULTIPLANT = 768 Dim ksin#(2047) , kcos#(2047) Dim Clock_Points#(ALL_CLOCK_VERTICES , 2) Dim Clock_Points_PROJ#(ALL_CLOCK_VERTICES , 2) Dim Clock_Triangles(NUM_TRIANGLES_ON_CLOCK - 1 , 2) Dim Clock_Triangles_NORMAL#(NUM_TRIANGLES_ON_CLOCK - 1 , 2) Dim Clock_Triangles_NORMAL_PROJ#(NUM_TRIANGLES_ON_CLOCK - 1 , 2) Dim Seconds_Hand_Points#(8 , 2) Dim Seconds_Hand_NORMALS#(13 , 2) Dim Minutes_Hand_Points#(8 , 2) Dim Minutes_Hand_NORMALS#(13 , 2) Dim Hours_Hand_Points#(8 , 2) Dim Hours_Hand_NORMALS#(13 , 2) Dim LightSource(2) , LightSourceRGB#(2) Dim Triangles_Color(NUM_TRIANGLES_ON_CLOCK - 1 , 2) Dim MatrixMAIN#(3 , 3) Dim MatrixTEMP1#(3 , 3) Dim MatrixTEMP2#(3 , 3) Dim MatrixROTATE#(3 , 3) Dim Triangles_2_Render(NUM_TRIANGLES_ON_CLOCK - 1 , 1) , Triangle_Brightness#(NUM_TRIANGLES_ON_CLOCK - 1) , Triangles_Mid_ZPoints#(NUM_TRIANGLES_ON_CLOCK - 1) Dim RadixArray(15 , NUM_TRIANGLES_ON_CLOCK - 1) , NumArray(15) Dim RadixArray2(15 , NUM_TRIANGLES_ON_CLOCK - 1) Local cnt , R , G , B Global Ang_X = 0 , Ang_Y = 1024 , Ang_Z = 0 Global Cam_X# = 1000 , Cam_Y# = 1000 , Cam_Z# = 600 , LightSourceARGB , ClockColorARGB LightSource(0) = MouseX() LightSource(1) = MouseY() LightSource(2) = 600 For cnt = 0 To CLOCK_POINT_AMOUNT Shl 3 + 143 Triangles_Color(cnt , 0) = 64 Triangles_Color(cnt , 1) = 255 Triangles_Color(cnt , 2) = 0 Next For cnt = CLOCK_POINT_AMOUNT Shl 3 + 144 To CLOCK_POINT_AMOUNT Shl 3 + 144 + 13 Triangles_Color(cnt , 0) = 64 Triangles_Color(cnt , 1) = 64 Triangles_Color(cnt , 2) = 255 Next For cnt = CLOCK_POINT_AMOUNT Shl 3 + 144 + 14 To CLOCK_POINT_AMOUNT Shl 3 + 144 + 14 + 13 Triangles_Color(cnt , 0) = 255 Triangles_Color(cnt , 1) = 64 Triangles_Color(cnt , 2) = 64 Next For cnt = CLOCK_POINT_AMOUNT Shl 3 + 144 + 14 + 14 To CLOCK_POINT_AMOUNT Shl 3 + 144 + 14 + 14 + 13 Triangles_Color(cnt , 0) = 255 Triangles_Color(cnt , 1) = 64 Triangles_Color(cnt , 2) = 255 Next LightSourceRGB(0) = Float 255 / 255 LightSourceRGB(1) = Float 255 / 255 LightSourceRGB(2) = Float 255 / 255 LightSourceARGB = Float ((Float LightSourceRGB(0) * 255) * 65536) + ((Float LightSourceRGB(1) * 255) * 256) + (Float LightSourceRGB(2) * 255) If CLOCK_POINT_AMOUNT < 3 Then End GenerateSinCosTable() BuildClockFace3D() time$ = CurrentTime$() hours_str$ = Mid$(time$ , 1 , 2) minutes_str$ = Mid$(time$ , 4 , 2) seconds_str$ = Mid$(time$ , 7 , 2) hours = Val(hours_str$) minutes = Val(minutes_str$) seconds = Val(seconds_str$) RotateClockHandsToArray(seconds , minutes , hours) timedelay = 10 timer = CreateTimer(30) Repeat d = MilliSecs() If timedelay = 10 timedelay = 0 time$ = CurrentTime$() hours_str$ = Mid$(time$ , 1 , 2) minutes_str$ = Mid$(time$ , 4 , 2) seconds_str$ = Mid$(time$ , 7 , 2) hours = Val(hours_str$) minutes = Val(minutes_str$) seconds = Val(seconds_str$) RotateClockHandsToArray(seconds , minutes , hours) End If KSX# = ksin(Ang_X) KCX# = kcos(Ang_X) KSY# = ksin(Ang_Y) KCY# = kcos(Ang_Y) KSZ# = ksin(Ang_Z) KCZ# = kcos(Ang_Z) RotateVertices(KSX# , KCX# , KSY# , KCY# , KSZ# , KCZ#) Triangle_2_Draw_Amount = CullandLightSourceTriangles(KSX# , KCX# , KSY# , KCY# , KSZ# , KCZ#) ProjectVertices() RadixSort(Triangle_2_Draw_Amount) RemoveObsoleteTriangles(Triangle_2_Draw_Amount) Triangles_Drawn = 0 LockBuffer() For cnt = 1 To Triangle_2_Draw_Amount If Triangles_2_Render(cnt , 1) = 1 Triangles_Drawn = Triangles_Drawn + 1 R = Int(Float (Triangles_Color(Triangles_2_Render(cnt , 0) , 0) * LightSourceRGB(0)) * Triangle_Brightness(Triangles_2_Render(cnt , 0))) G = Int(Float (Triangles_Color(Triangles_2_Render(cnt , 0) , 1) * LightSourceRGB(1)) * Triangle_Brightness(Triangles_2_Render(cnt , 0))) B = Int(Float (Triangles_Color(Triangles_2_Render(cnt , 0) , 2) * LightSourceRGB(2)) * Triangle_Brightness(Triangles_2_Render(cnt , 0))) DrawClockTriangleFlatShaded(Triangles_2_Render(cnt , 0) , (R Shl 16) + (G Shl 8) + B) End If Next UnlockBuffer() If KeyDown(2) Then Ang_X = Ang_X + 2 If Ang_X = 2048 Then Ang_X = 0 If KeyDown(3) Then Ang_Y = Ang_Y + 2 If Ang_Y = 2048 Then Ang_Y = 0 If KeyDown(4) Then Ang_Z = Ang_Z + 2 If Ang_Z = 2048 Then Ang_Z = 0 If KeyDown(5) Then Cam_Z = Cam_Z + 2 If KeyDown(6) Then Cam_Z = Cam_Z - 2 If KeyDown(7) Ang_X = 0 Ang_Y = 1024 Ang_Z = 0 Cam_X# = 1000 Cam_Y# = 1000 Cam_Z# = 600 End If Mx = MouseX() My = MouseY() Lightsource(0) = Float (Mx * LIGHTSOURCE_RATIO_X) Lightsource(1) = Float (My * LIGHTSOURCE_RATIO_Y) WritePixel Mx , My , LightSourceARGB Text 0 , 0 , MilliSecs() - d Text 0 , 16 , Triangles_Drawn ;WaitTimer(timer) Flip Cls timedelay = timedelay + 1 Until MouseDown(1) End Function BuildClockFace3D() Local Dist_between_points# , X# , Y# , Nx# , Ny# , Cx1# , Cy1# , Cx2# , Cy2# Local Current_Point , Current_Value# , cnt , cnt2 , Scale# = Float CLOCK_SIZE / 235 Local Num_Triangles = 0 Dist_between_points# = Float 360 / CLOCK_POINT_AMOUNT X# = 0 Y# = - CLOCK_SIZE Current_Point = 0 Current_Value# = 0 Repeat Nx# = Y# * Sin(Current_Value#) ;Rotation is going clock-wise Ny# = Float Y# * Cos(Current_Value#) Clock_Points#(Current_Point , 0) = Float Nx# Clock_Points#(Current_Point , 1) = Float Ny# Clock_Points#(Current_Point , 2) = Float CLOCK_WIDTH / 2 Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT * 2 , 0) = Float Nx# Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT * 2 , 1) = Float Ny# Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT * 2 , 2) = Float - (CLOCK_WIDTH / 2) Nx# = Float (Y# + CLOCK_RIM_SIZE) * Sin(Current_Value#) ;Rotation is going clock-wise Ny# = Float (Float Y# + CLOCK_RIM_SIZE) * Cos(Current_Value#) Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT , 0) = Float Nx# Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT , 1) = Float Ny# Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT , 2) = Float CLOCK_WIDTH / 2 Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT * 3 , 0) = Float Nx# Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT * 3 , 1) = Float Ny# Clock_Points#(Current_Point + CLOCK_POINT_AMOUNT * 3 , 2) = Float - (CLOCK_WIDTH / 2) Current_Point = Current_Point + 1 Current_Value# = Current_Value# + Dist_between_points# Until Current_Point = CLOCK_POINT_AMOUNT For cnt = 0 To CLOCK_POINT_AMOUNT - 2 ;Faces facing front Clock_Triangles(Num_Triangles , 0) = cnt ;1st Triangle Clock_Triangles(Num_Triangles , 1) = cnt + 1 + CLOCK_POINT_AMOUNT Clock_Triangles(Num_Triangles , 2) = cnt + 1 Num_Triangles = Num_Triangles + 1 ;2nd Triangle Clock_Triangles(Num_Triangles , 0) = cnt Clock_Triangles(Num_Triangles , 1) = cnt + CLOCK_POINT_AMOUNT Clock_Triangles(Num_Triangles , 2) = cnt + 1 + CLOCK_POINT_AMOUNT Num_Triangles = Num_Triangles + 1 Next Clock_Triangles(Num_Triangles , 0) = cnt ;1st Triangle Clock_Triangles(Num_Triangles , 1) = cnt + 1 Clock_Triangles(Num_Triangles , 2) = 0 Num_Triangles = Num_Triangles + 1 ;2nd Triangle Clock_Triangles(Num_Triangles , 0) = cnt Clock_Triangles(Num_Triangles , 1) = cnt + CLOCK_POINT_AMOUNT Clock_Triangles(Num_Triangles , 2) = cnt + 1 ;End Facing front Num_Triangles = Num_Triangles + 1 For cnt = 0 To CLOCK_POINT_AMOUNT - 2 ;Faces facing away Clock_Triangles(Num_Triangles , 0) = cnt + 1 + CLOCK_POINT_AMOUNT * 2 ;1st Triangle Clock_Triangles(Num_Triangles , 1) = cnt + CLOCK_POINT_AMOUNT * 3 Clock_Triangles(Num_Triangles , 2) = cnt + CLOCK_POINT_AMOUNT * 2 Num_Triangles = Num_Triangles + 1 ;2nd Triangle Clock_Triangles(Num_Triangles , 0) = cnt + 1 + CLOCK_POINT_AMOUNT * 2 Clock_Triangles(Num_Triangles , 1) = cnt + 1 + CLOCK_POINT_AMOUNT * 3 Clock_Triangles(Num_Triangles , 2) = cnt + CLOCK_POINT_AMOUNT * 3 Num_Triangles = Num_Triangles + 1 Next Clock_Triangles(Num_Triangles , 0) = CLOCK_POINT_AMOUNT * 2 ;1st Triangle Clock_Triangles(Num_Triangles , 1) = cnt + CLOCK_POINT_AMOUNT * 3 Clock_Triangles(Num_Triangles , 2) = cnt + CLOCK_POINT_AMOUNT * 2 Num_Triangles = Num_Triangles + 1 ;2nd Triangle Clock_Triangles(Num_Triangles , 0) = CLOCK_POINT_AMOUNT * 2 Clock_Triangles(Num_Triangles , 1) = cnt + 1 + CLOCK_POINT_AMOUNT * 2 Clock_Triangles(Num_Triangles , 2) = cnt + CLOCK_POINT_AMOUNT * 3 Num_Triangles = Num_Triangles + 1 ;End Faces facing away For cnt = 0 To CLOCK_POINT_AMOUNT - 2 ;Faces on outside rim Clock_Triangles(Num_Triangles , 0) = cnt ;1st Triangle Clock_Triangles(Num_Triangles , 1) = cnt + 1 Clock_Triangles(Num_Triangles , 2) = cnt + 1 + CLOCK_POINT_AMOUNT * 2 Num_Triangles = Num_Triangles + 1 ;2nd Triangle Clock_Triangles(Num_Triangles , 0) = cnt Clock_Triangles(Num_Triangles , 1) = cnt + 1 + CLOCK_POINT_AMOUNT * 2 Clock_Triangles(Num_Triangles , 2) = cnt + CLOCK_POINT_AMOUNT * 2 Num_Triangles = Num_Triangles + 1 Next Clock_Triangles(Num_Triangles , 0) = cnt ;1st Triangle Clock_Triangles(Num_Triangles , 1) = 0 Clock_Triangles(Num_Triangles , 2) = CLOCK_POINT_AMOUNT * 2 Num_Triangles = Num_Triangles + 1 ;2nd Triangle Clock_Triangles(Num_Triangles , 0) = cnt Clock_Triangles(Num_Triangles , 1) = CLOCK_POINT_AMOUNT * 2 Clock_Triangles(Num_Triangles , 2) = cnt + CLOCK_POINT_AMOUNT * 2 Num_Triangles = Num_Triangles + 1 ;End Faces on outside rim For cnt = 0 To CLOCK_POINT_AMOUNT - 2 ;Faces facing inside rim Clock_Triangles(Num_Triangles , 0) = cnt + CLOCK_POINT_AMOUNT ;1st Triangle Clock_Triangles(Num_Triangles , 1) = cnt + 1 + CLOCK_POINT_AMOUNT * 3 Clock_Triangles(Num_Triangles , 2) = cnt + 1 + CLOCK_POINT_AMOUNT Num_Triangles = Num_Triangles + 1 ;2nd Triangle Clock_Triangles(Num_Triangles , 0) = cnt + CLOCK_POINT_AMOUNT Clock_Triangles(Num_Triangles , 1) = cnt + CLOCK_POINT_AMOUNT * 3 Clock_Triangles(Num_Triangles , 2) = cnt + 1 + CLOCK_POINT_AMOUNT * 3 Num_Triangles = Num_Triangles + 1 Next Clock_Triangles(Num_Triangles , 0) = CLOCK_POINT_AMOUNT ;1st Triangle Clock_Triangles(Num_Triangles , 1) = cnt + CLOCK_POINT_AMOUNT * 3 Clock_Triangles(Num_Triangles , 2) = CLOCK_POINT_AMOUNT * 3 Num_Triangles = Num_Triangles + 1 ;2nd Triangle Clock_Triangles(Num_Triangles , 0) = CLOCK_POINT_AMOUNT Clock_Triangles(Num_Triangles , 1) = cnt + CLOCK_POINT_AMOUNT Clock_Triangles(Num_Triangles , 2) = cnt + CLOCK_POINT_AMOUNT * 3 ;End Faces facing inside rim ;BUILD HOURSQUARE VERTICES For cnt = 0 To 11 Y# = -140 Cx# = Float (X# * Cos(cnt * 30) + Y# * Sin(cnt * 30)) * Scale# Cy# = Float (Y# * Cos(cnt * 30) - X# * Sin(cnt * 30)) * Scale# Y# = -15 For cnt2 = 0 To 3 Clock_Points#(cnt * 4 + cnt2 + CLOCK_FRAME_POINTS , 0) = Float (X# * Cos(cnt2 * 90) + Y# * Sin(cnt2 * 90)) + Cx# Clock_Points#(cnt * 4 + cnt2 + CLOCK_FRAME_POINTS , 1) = Float (Y# * Cos(cnt2 * 90) - X# * Sin(cnt2 * 90)) + Cy# Clock_Points#(cnt * 4 + cnt2 + CLOCK_FRAME_POINTS , 2) = Float (CLOCK_WIDTH / 2) / 4 Clock_Points#(cnt * 4 + cnt2 + CLOCK_FRAME_POINTS + 48 , 0) = Float (X# * Cos(cnt2 * 90) + Y# * Sin(cnt2 * 90)) + Cx# Clock_Points#(cnt * 4 + cnt2 + CLOCK_FRAME_POINTS + 48 , 1) = Float (Y# * Cos(cnt2 * 90) - X# * Sin(cnt2 * 90)) + Cy# Clock_Points#(cnt * 4 + cnt2 + CLOCK_FRAME_POINTS + 48 , 2) = Float -(CLOCK_WIDTH / 2) / 4 Next Next For cnt = 0 To 11 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 0 ;FRONT FACE Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 2 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 1 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 0 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 3 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 2 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 0 + 48 ;BACK FACE Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 1 + 48 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 2 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 0 + 48 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 2 + 48 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 3 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 0 ;SIDE FACE 1 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 1 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 1 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 0 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 1 + 48 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 0 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 1 ;SIDE FACE 2 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 2 + 48 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 1 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 1 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 2 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 2 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 2 ;SIDE FACE 3 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 3 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 3 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 2 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 3 + 48 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 2 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 3 ;SIDE FACE 4 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 0 + 48 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 3 + 48 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = cnt * 4 + CLOCK_FRAME_POINTS + 3 Clock_Triangles(Num_Triangles , 1) = cnt * 4 + CLOCK_FRAME_POINTS + 0 Clock_Triangles(Num_Triangles , 2) = cnt * 4 + CLOCK_FRAME_POINTS + 0 + 48 Next ; SECONDS HAND POINTS Seconds_Hand_Points#(0 , 0) = 0 Seconds_Hand_Points#(0 , 1) = -125 Seconds_Hand_Points#(0 , 2) = (CLOCK_WIDTH / 2) / 2 + 17 Seconds_Hand_Points#(1 , 0) = -2.5 Seconds_Hand_Points#(1 , 1) = -57.5 Seconds_Hand_Points#(1 , 2) = (CLOCK_WIDTH / 2) / 2 + 17 Seconds_Hand_Points#(2 , 0) = -5 Seconds_Hand_Points#(2 , 1) = -10 Seconds_Hand_Points#(2 , 2) = (CLOCK_WIDTH / 2) / 2 + 17 Seconds_Hand_Points#(3 , 0) = -2.5 Seconds_Hand_Points#(3 , 1) = -5 Seconds_Hand_Points#(3 , 2) = (CLOCK_WIDTH / 2) / 2 + 17 Seconds_Hand_Points#(4 , 0) = 0 Seconds_Hand_Points#(4 , 1) = 0 Seconds_Hand_Points#(4 , 2) = (CLOCK_WIDTH / 2) / 2 + 17 Seconds_Hand_Points#(5 , 0) = 2.5 Seconds_Hand_Points#(5 , 1) = -5 Seconds_Hand_Points#(5 , 2) = (CLOCK_WIDTH / 2) / 2 + 17 Seconds_Hand_Points#(6 , 0) = 5 Seconds_Hand_Points#(6 , 1) = -10 Seconds_Hand_Points#(6 , 2) = (CLOCK_WIDTH / 2) / 2 + 17 Seconds_Hand_Points#(7 , 0) = 2.5 Seconds_Hand_Points#(7 , 1) = -57.5 Seconds_Hand_Points#(7 , 2) = (CLOCK_WIDTH / 2) / 2 + 17 Seconds_Hand_Points#(8 , 0) = 0 Seconds_Hand_Points#(8 , 1) = -10 Seconds_Hand_Points#(8 , 2) = (CLOCK_WIDTH / 2) / 2 + 20 ;SECONDS HAND POINTS Clock_Points#(CLOCK_FRAME_POINTS + 96 , 0) = Seconds_Hand_Points#(0 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 96 , 1) = Seconds_Hand_Points#(0 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 96 , 2) = Seconds_Hand_Points#(0 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 97 , 0) = Seconds_Hand_Points#(1 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 97 , 1) = Seconds_Hand_Points#(1 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 97 , 2) = Seconds_Hand_Points#(1 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 98 , 0) = Seconds_Hand_Points#(2 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 98 , 1) = Seconds_Hand_Points#(2 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 98 , 2) = Seconds_Hand_Points#(2 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 99 , 0) = Seconds_Hand_Points#(3 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 99 , 1) = Seconds_Hand_Points#(3 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 99 , 2) = Seconds_Hand_Points#(3 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 100 , 0) = Seconds_Hand_Points#(4 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 100 , 1) = Seconds_Hand_Points#(4 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 100 , 2) = Seconds_Hand_Points#(4 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 101 , 0) = Seconds_Hand_Points#(5 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 101 , 1) = Seconds_Hand_Points#(5 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 101 , 2) = Seconds_Hand_Points#(5 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 102 , 0) = Seconds_Hand_Points#(6 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 102 , 1) = Seconds_Hand_Points#(6 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 102 , 2) = Seconds_Hand_Points#(6 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 103 , 0) = Seconds_Hand_Points#(7 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 103 , 1) = Seconds_Hand_Points#(7 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 103 , 2) = Seconds_Hand_Points#(7 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 104 , 0) = Seconds_Hand_Points#(8 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 104 , 1) = Seconds_Hand_Points#(8 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 104 , 2) = Seconds_Hand_Points#(8 , 2) ; SECOND HAND TRIANGLES ;FRONT Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 97 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 96 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 104 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 97 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 104 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 98 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 104 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 99 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 98 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 104 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 100 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 99 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 104 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 101 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 100 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 104 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 102 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 101 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 103 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 102 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 104 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 103 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 104 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 96 ; SECONDS HAND TRIANGLES ;BACK Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 96 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 97 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 103 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 101 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 99 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 100 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 103 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 97 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 98 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 103 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 98 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 102 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 102 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 98 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 99 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 102 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 99 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 101 ; MINUTES HAND POINTS Minutes_Hand_Points#(0 , 0) = 0 Minutes_Hand_Points#(0 , 1) = -100 Minutes_Hand_Points#(0 , 2) = (CLOCK_WIDTH / 2) / 2 Minutes_Hand_Points#(1 , 0) = -5 Minutes_Hand_Points#(1 , 1) = -45 Minutes_Hand_Points#(1 , 2) = (CLOCK_WIDTH / 2) / 2 Minutes_Hand_Points#(2 , 0) = -10 Minutes_Hand_Points#(2 , 1) = -10 Minutes_Hand_Points#(2 , 2) = (CLOCK_WIDTH / 2) / 2 Minutes_Hand_Points#(3 , 0) = -5 Minutes_Hand_Points#(3 , 1) = -5 Minutes_Hand_Points#(3 , 2) = (CLOCK_WIDTH / 2) / 2 Minutes_Hand_Points#(4 , 0) = 0 Minutes_Hand_Points#(4 , 1) = 0 Minutes_Hand_Points#(4 , 2) = (CLOCK_WIDTH / 2) / 2 Minutes_Hand_Points#(5 , 0) = 5 Minutes_Hand_Points#(5 , 1) = -5 Minutes_Hand_Points#(5 , 2) = (CLOCK_WIDTH / 2) / 2 Minutes_Hand_Points#(6 , 0) = 10 Minutes_Hand_Points#(6 , 1) = -10 Minutes_Hand_Points#(6 , 2) = (CLOCK_WIDTH / 2) / 2 Minutes_Hand_Points#(7 , 0) = 5 Minutes_Hand_Points#(7 , 1) = -45 Minutes_Hand_Points#(7 , 2) = (CLOCK_WIDTH / 2) / 2 Minutes_Hand_Points#(8 , 0) = 0 Minutes_Hand_Points#(8 , 1) = -10 Minutes_Hand_Points#(8 , 2) = (CLOCK_WIDTH / 2) / 2 + 3 ;Minutes HAND POINTS Clock_Points#(CLOCK_FRAME_POINTS + 105 , 0) = Minutes_Hand_Points#(0 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 105 , 1) = Minutes_Hand_Points#(0 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 105 , 2) = Minutes_Hand_Points#(0 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 106 , 0) = Minutes_Hand_Points#(1 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 106 , 1) = Minutes_Hand_Points#(1 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 106 , 2) = Minutes_Hand_Points#(1 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 107 , 0) = Minutes_Hand_Points#(2 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 107 , 1) = Minutes_Hand_Points#(2 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 107 , 2) = Minutes_Hand_Points#(2 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 108 , 0) = Minutes_Hand_Points#(3 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 108 , 1) = Minutes_Hand_Points#(3 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 108 , 2) = Minutes_Hand_Points#(3 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 109 , 0) = Minutes_Hand_Points#(4 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 109 , 1) = Minutes_Hand_Points#(4 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 109 , 2) = Minutes_Hand_Points#(4 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 110 , 0) = Minutes_Hand_Points#(5 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 110 , 1) = Minutes_Hand_Points#(5 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 110 , 2) = Minutes_Hand_Points#(5 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 111 , 0) = Minutes_Hand_Points#(6 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 111 , 1) = Minutes_Hand_Points#(6 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 111 , 2) = Minutes_Hand_Points#(6 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 112 , 0) = Minutes_Hand_Points#(7 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 112 , 1) = Minutes_Hand_Points#(7 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 112 , 2) = Minutes_Hand_Points#(7 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 113 , 0) = Minutes_Hand_Points#(8 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 113 , 1) = Minutes_Hand_Points#(8 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 113 , 2) = Minutes_Hand_Points#(8 , 2) ; Minute HAND TRIANGLES ;FRONT Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 106 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 105 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 113 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 106 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 113 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 107 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 113 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 108 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 107 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 113 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 109 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 108 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 113 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 110 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 109 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 113 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 111 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 110 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 112 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 111 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 113 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 112 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 113 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 105 ; MinuteS HAND TRIANGLES ;BACK Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 105 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 106 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 112 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 110 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 108 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 109 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 112 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 106 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 107 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 112 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 107 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 111 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 111 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 107 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 108 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 111 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 108 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 110 ; HOURS HAND POINTS Hours_Hand_Points#(0 , 0) = 0 Hours_Hand_Points#(0 , 1) = -80 Hours_Hand_Points#(0 , 2) = (CLOCK_WIDTH / 2) / 2 + 10 Hours_Hand_Points#(1 , 0) = -5 Hours_Hand_Points#(1 , 1) = -35 Hours_Hand_Points#(1 , 2) = (CLOCK_WIDTH / 2) / 2 + 10 Hours_Hand_Points#(2 , 0) = -10 Hours_Hand_Points#(2 , 1) = -10 Hours_Hand_Points#(2 , 2) = (CLOCK_WIDTH / 2) / 2 + 10 Hours_Hand_Points#(3 , 0) = -5 Hours_Hand_Points#(3 , 1) = -5 Hours_Hand_Points#(3 , 2) = (CLOCK_WIDTH / 2) / 2 + 10 Hours_Hand_Points#(4 , 0) = 0 Hours_Hand_Points#(4 , 1) = 0 Hours_Hand_Points#(4 , 2) = (CLOCK_WIDTH / 2) / 2 + 10 Hours_Hand_Points#(5 , 0) = 5 Hours_Hand_Points#(5 , 1) = -5 Hours_Hand_Points#(5 , 2) = (CLOCK_WIDTH / 2) / 2 + 10 Hours_Hand_Points#(6 , 0) = 10 Hours_Hand_Points#(6 , 1) = -10 Hours_Hand_Points#(6 , 2) = (CLOCK_WIDTH / 2) / 2 + 10 Hours_Hand_Points#(7 , 0) = 5 Hours_Hand_Points#(7 , 1) = -35 Hours_Hand_Points#(7 , 2) = (CLOCK_WIDTH / 2) / 2 + 10 Hours_Hand_Points#(8 , 0) = 0 Hours_Hand_Points#(8 , 1) = -10 Hours_Hand_Points#(8 , 2) = (CLOCK_WIDTH / 2) / 2 + 13 ;Hours HAND POINTS Clock_Points#(CLOCK_FRAME_POINTS + 114 , 0) = Hours_Hand_Points#(0 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 114 , 1) = Hours_Hand_Points#(0 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 114 , 2) = Hours_Hand_Points#(0 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 115 , 0) = Hours_Hand_Points#(1 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 115 , 1) = Hours_Hand_Points#(1 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 115 , 2) = Hours_Hand_Points#(1 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 116 , 0) = Hours_Hand_Points#(2 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 116 , 1) = Hours_Hand_Points#(2 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 116 , 2) = Hours_Hand_Points#(2 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 117 , 0) = Hours_Hand_Points#(3 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 117 , 1) = Hours_Hand_Points#(3 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 117 , 2) = Hours_Hand_Points#(3 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 118 , 0) = Hours_Hand_Points#(4 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 118 , 1) = Hours_Hand_Points#(4 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 118 , 2) = Hours_Hand_Points#(4 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 119 , 0) = Hours_Hand_Points#(5 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 119 , 1) = Hours_Hand_Points#(5 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 119 , 2) = Hours_Hand_Points#(5 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 120 , 0) = Hours_Hand_Points#(6 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 120 , 1) = Hours_Hand_Points#(6 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 120 , 2) = Hours_Hand_Points#(6 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 121 , 0) = Hours_Hand_Points#(7 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 121 , 1) = Hours_Hand_Points#(7 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 121 , 2) = Hours_Hand_Points#(7 , 2) Clock_Points#(CLOCK_FRAME_POINTS + 122 , 0) = Hours_Hand_Points#(8 , 0) Clock_Points#(CLOCK_FRAME_POINTS + 122 , 1) = Hours_Hand_Points#(8 , 1) Clock_Points#(CLOCK_FRAME_POINTS + 122 , 2) = Hours_Hand_Points#(8 , 2) ; Minute HAND TRIANGLES ;FRONT Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 115 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 114 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 122 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 115 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 122 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 116 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 122 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 117 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 116 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 122 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 118 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 117 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 122 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 119 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 118 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 122 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 120 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 119 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 121 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 120 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 122 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 121 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 122 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 114 ; Hours HAND TRIANGLES ;BACK Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 114 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 115 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 121 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 119 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 117 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 118 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 121 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 115 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 116 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 121 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 116 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 120 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 120 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 116 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 117 Num_Triangles = Num_Triangles + 1 Clock_Triangles(Num_Triangles , 0) = CLOCK_FRAME_POINTS + 120 Clock_Triangles(Num_Triangles , 1) = CLOCK_FRAME_POINTS + 117 Clock_Triangles(Num_Triangles , 2) = CLOCK_FRAME_POINTS + 119 CalculateClockNormals() End Function Function GenerateSinCosTable() ;FUNCTION TO GENERATE A SIN/COS LUT FOR 3D GFX ;REQUIRES GLOBAL FLOAT ARRAYS KSIN(rotation_amount) , KCOS(rotation_amount) Local cnt# , cnt2 For cnt=0 To 359.82421875 Step 0.17578125 ; 2048 rotations within 360 degrees (0 - 2047) ksin(cnt2)=Sin(cnt) kcos(cnt2)=Cos(cnt) cnt2 = cnt2 + 1 Next End Function Function RotateVertices(KSX# , KCX# , KSY# , KCY# , KSZ# , KCZ#) For cnt = 0 To ALL_CLOCK_VERTICES A# = Clock_Points(cnt , 0) B# = Clock_Points(cnt , 1) C# = Clock_Points(cnt , 2) ;XROT D# = B# * KCX# - C# * KSX# E# = C# * KCX# + B# * KSX# ;YROT F# = A# * KCY# - E# * KSY# Clock_Points_PROJ(cnt , 2) = 1500 + (E# * KCY# + A# * KSY#) ;ZROT Clock_Points_PROJ(cnt , 0) = 1000 + (D# * KSZ# - F# * KCZ#) Clock_Points_PROJ(cnt , 1) = 1000 + (D# * KCZ# + F# * KSZ#) Next End Function Function ProjectVertices() For cnt = 0 To ALL_CLOCK_VERTICES A# = Float 1 / (Clock_Points_PROJ(cnt , 2) - Cam_Z) Clock_Points_PROJ#(cnt , 0) = ((Cam_X - Clock_Points_PROJ#(cnt , 0)) * MULTIPLANT) * A# + GHALFX Clock_Points_PROJ#(cnt , 1) = ((Clock_Points_PROJ#(cnt , 1) - Cam_Y) * MULTIPLANT) * A# + GHALFY Next End Function Function CullandLightSourceTriangles(KSX# , KCX# , KSY# , KCY# , KSZ# , KCZ#) Local Triangles_to_draw_amount = 0 For cnt = 0 To NUM_TRIANGLES_ON_CLOCK - 1 Step 2 ;XROT Clock_Triangles_NORMAL_PROJ(cnt , 1) = Clock_Triangles_NORMAL(cnt , 1) * KCX# - Clock_Triangles_NORMAL(cnt , 2) * KSX# Clock_Triangles_NORMAL_PROJ(cnt , 2) = Clock_Triangles_NORMAL(cnt , 2) * KCX# + Clock_Triangles_NORMAL(cnt , 1) * KSX# ;YROT Clock_Triangles_NORMAL_PROJ(cnt , 0) = Clock_Triangles_NORMAL(cnt , 0) * KCY# - Clock_Triangles_NORMAL_PROJ(cnt , 2) * KSY# Clock_Triangles_NORMAL_PROJ(cnt , 2) = Clock_Triangles_NORMAL_PROJ(cnt , 2) * KCY# + Clock_Triangles_NORMAL(cnt , 0) * KSY# ;ZROT Temp# = Clock_Triangles_NORMAL_PROJ(cnt , 0) Clock_Triangles_NORMAL_PROJ(cnt , 0) = Clock_Triangles_NORMAL_PROJ(cnt , 1) * KSZ# - Temp * KCZ# Clock_Triangles_NORMAL_PROJ(cnt , 1) = Clock_Triangles_NORMAL_PROJ(cnt , 1) * KCZ# + Temp * KSZ# VX# = Clock_Points_PROJ(Clock_Triangles(cnt , 0) , 0) - Cam_X VY# = Clock_Points_PROJ(Clock_Triangles(cnt , 0) , 1) - Cam_Y ;Get Vector from Camera to Polygon VZ# = Clock_Points_PROJ(Clock_Triangles(cnt , 0) , 2) - Cam_Z If (Clock_Triangles_NORMAL_PROJ(cnt , 0) * VX#) + (Clock_Triangles_NORMAL_PROJ(cnt , 1) * VY#) + (Clock_Triangles_NORMAL_PROJ(cnt , 2) * VZ#) < 0 VX# = Float LightSource(0) - Clock_Points_PROJ(Clock_Triangles(cnt , 0) , 0) VY# = Float Clock_Points_PROJ(Clock_Triangles(cnt , 0) , 1) - LightSource(1) VZ# = Float Clock_Points_PROJ(Clock_Triangles(cnt , 0) , 2) - LightSource(2) Mag# = 1 / Sqr(VX# * VX# + VY# * VY# + VZ# * VZ#) VX# = Float VX# * Mag VY# = Float VY# * Mag VZ# = Float VZ# * Mag Result# = Float (Clock_Triangles_NORMAL_PROJ(cnt , 0) * VX#) + (Clock_Triangles_NORMAL_PROJ(cnt , 1) * VY#) + (Clock_Triangles_NORMAL_PROJ(cnt , 2) * VZ#) cnt2 = cnt + 1 If Result# > 0 Triangle_Brightness(cnt) = 0.15 Triangle_Brightness(cnt2) = 0.15 Else If Result# > - 0.15 Result# = - 0.15 End If Triangle_Brightness(cnt) = - Result Triangle_Brightness(cnt2) = - Result End If Triangles_to_draw_amount = Triangles_to_draw_amount + 1 Triangles_2_Render(Triangles_to_draw_amount , 0) = cnt Triangles_Mid_Zpoints(Triangles_to_draw_amount) = Float 1000000 * ((Clock_Points_PROJ(Clock_Triangles(cnt , 0) , 2) + Clock_Points_PROJ(Clock_Triangles(cnt , 1) , 2) + Clock_Points_PROJ(Clock_Triangles(cnt , 2) , 2)) * OneOver3) Triangles_to_draw_amount = Triangles_to_draw_amount + 1 Triangles_2_Render(Triangles_to_draw_amount , 0) = cnt2 Triangles_Mid_Zpoints(Triangles_to_draw_amount) = Float 1000000 * ((Clock_Points_PROJ(Clock_Triangles(cnt , 0) , 2) + Clock_Points_PROJ(Clock_Triangles(cnt , 1) , 2) + Clock_Points_PROJ(Clock_Triangles(cnt , 2) , 2)) * OneOver3) End If Next Return Triangles_to_draw_amount End Function Function RadixSort(Triangle_Amount) Local Mask = 24 For Cntr = 0 To 6 ;Every 1 of these sorts a 4-bit radix from LSB(0) to MSB(n) (0 - 3 = 2 Bytes) For Index = 0 To 15 NumArray(Index) = 0 Next For Index = 1 To Triangle_Amount Var = (Triangles_Mid_ZPoints(Index) Shl Mask) Shr 28 NumArray(Var) = NumArray(Var) + 1 RadixArray(Var , NumArray(Var)) = Triangles_Mid_ZPoints(Index) RadixArray2(Var , NumArray(Var)) = Triangles_2_Render(Index , 0) Next Index = 0 For Cntr2 = 15 To 0 Step -1 For Cntr3 = 1 To NumArray(Cntr2) Index = Index + 1 Triangles_Mid_ZPoints(Index) = RadixArray(Cntr2 , Cntr3) Triangles_2_Render(Index , 0) = RadixArray2(Cntr2 , Cntr3) Next Next Mask = Mask - 4 Next End Function Function DrawClockTriangleFlatShaded(Triangle_No , col) EdgeAmount = 3 Top = 0 If Clock_Points_PROJ(Clock_Triangles(Triangle_No , 1) , 1) < Clock_Points_PROJ(Clock_Triangles(Triangle_No , Top) , 1) Then Top = 1 If Clock_Points_PROJ(Clock_Triangles(Triangle_No , 2) , 1) < Clock_Points_PROJ(Clock_Triangles(Triangle_No , Top) , 1) Then Top = 2 RightPos = Top LeftPos = RightPos While EdgeAmount > 0 If LEdgeHeight <= 0 ;(RE)Initialse LeftSegment Data NewLeftPos = LeftPos + 1 If NewLeftPos > 2 Then NewLeftPos = 0 y1 = Floor(Clock_Points_PROJ(Clock_Triangles(Triangle_No , LeftPos) , 1)) x2# = Clock_Points_PROJ(Clock_Triangles(Triangle_No , NewLeftPos) , 0) y2 = Floor(Clock_Points_PROJ(Clock_Triangles(Triangle_No , NewLeftPos) , 1)) LEdgeHeight = y2 - y1 If LEdgeHeight > 0 x1# = Clock_Points_PROJ(Clock_Triangles(Triangle_No , LeftPos) , 0) LStepX# = (x2# - x1#) / LEdgeHeight If y1 < MINY ;CLIP to the MINY if it needs it y = MINY StepY = MINY - y1 Lx# = x1# + StepY * LStepX# LEdgeHeight = LEdgeHeight - StepY Else y = y1 Lx# = x1# End If End If LeftPos = NewLeftPos EdgeAmount = EdgeAmount - 1 End If If REdgeHeight <= 0 ;(RE)Initialise RightSegment Data NewRightPos = RightPos - 1 If NewRightPos < 0 Then NewRightPos = 2 y1 = Floor(Clock_Points_PROJ(Clock_Triangles(Triangle_No , RightPos) , 1)) x2# = Clock_Points_PROJ(Clock_Triangles(Triangle_No , NewRightPos) , 0) y2 = Floor(Clock_Points_PROJ(Clock_Triangles(Triangle_No , NewRightPos) , 1)) REdgeHeight = y2 - y1 If REdgeHeight > 0 x1# = Clock_Points_PROJ(Clock_Triangles(Triangle_No , RightPos) , 0) RStepX# = Float (x2# - x1#) / REdgeHeight If y1 < MINY ;Clip to the MINY if it needs it y = MINY StepY = MINY - y1 Rx# = x1# + StepY * RStepX# REdgeHeight = REdgeHeight - StepY Else y = y1 Rx# = x1# End If End If RightPos = NewRightPos EdgeAmount = EdgeAmount - 1 End If If LEdgeHeight < REdgeHeight Height = LEdgeHeight - 1 If y + Height > MAXY Height = MAXY - y EdgeAmount = -1 End If Else Height = REdgeHeight - 1 If y + Height > MAXY Height = MAXY - y EdgeAmount = -1 End If End If For cntr = y To y + Height ;RASTER SCANLINE If Lx# < Rx# PixL = Floor(Lx#) PixR = Floor(Rx#) - 1 Else PixL = Floor(Rx#) PixR = Floor(Lx#) - 1 End If If PixL < MINX PixL = MINX Else If PixL > MAXX Then PixL = MAXX + 1 End If If PixR < MINX PixR = MINX - 1 Else If PixR > MAXX Then PixR = MAXX End If For pix = PixL To PixR WritePixelFast pix , cntr , col Next Lx# = Lx# + LStepX# Rx# = Rx# + RStepX# LEdgeHeight = LEdgeHeight - 1 REdgeHeight = REdgeHeight - 1 Next ;END RASTER SCANLINE Wend End Function Function val(txt$) ; String to Integer function (Decimal). Local T$ = Upper$(txt$) , L = Len(t$) , Power = 1 Local Pos , V , Value For Pos = L To 1 Step -1 V = Asc(Mid$(T$ , Pos , 1)) - 48 If (V > -1) And (V < 10) ; Ensure a Zero for letters Value = Value + (V * Power) Power = Power * 10 End If Next Return Value End Function Function CalculateClockNormals() Local Vector1X# , Vector1Y# , Vector1Z# , Result1X# , Result2X# , Result1Y# , Result2Y# , Result1Z# , Result2Z# Local Vector2X# , Vector2Y# , Vector2Z# Local Mag1# , Mag2# For cnt = 0 To CLOCK_POINT_AMOUNT Shl 3 + 144 - 1 Step 2 Vector1X = Float Clock_Points(Clock_Triangles(cnt , 0) , 0) - Clock_Points(Clock_Triangles(cnt , 1) , 0); Vector from Vector1Y = Float Clock_Points(Clock_Triangles(cnt , 0) , 1) - Clock_Points(Clock_Triangles(cnt , 1) , 1); point 1 to 0 Vector1Z = Float Clock_Points(Clock_Triangles(cnt , 0) , 2) - Clock_Points(Clock_Triangles(cnt , 1) , 2) Vector2X = Float Clock_Points(Clock_Triangles(cnt , 1) , 0) - Clock_Points(Clock_Triangles(cnt , 2) , 0); Vector from Vector2Y = Float Clock_Points(Clock_Triangles(cnt , 1) , 1) - Clock_Points(Clock_Triangles(cnt , 2) , 1); point 1 to 0 Vector2Z = Float Clock_Points(Clock_Triangles(cnt , 1) , 2) - Clock_Points(Clock_Triangles(cnt , 2) , 2) Mag1# = Sqr#(Vector1X * Vector1X + Vector1Y * Vector1Y + Vector1Z * Vector1Z);Get Mag2# = Sqr#(Vector2X * Vector2X + Vector2Y * Vector2Y + Vector2Z * Vector2Z);Magnitutes Vector1X = Float Vector1X / Mag1 Vector1Y = Float Vector1Y / Mag1 Vector1Z = Float Vector1Z / Mag1 Vector2X = Float Vector2X / Mag2 Vector2Y = Float Vector2Y / Mag2 Vector2Z = Float Vector2Z / Mag2 Result1X# = Float Vector1Y * Vector2Z - Vector1Z * Vector2Y Result1Y# = Float Vector1Z * Vector2X - Vector1X * Vector2Z Result1Z# = Float Vector1X * Vector2Y - Vector1Y * Vector2X Vector1X = Float Clock_Points(Clock_Triangles(cnt + 1 , 0) , 0) - Clock_Points(Clock_Triangles(cnt + 1 , 1) , 0); Vector from Vector1Y = Float Clock_Points(Clock_Triangles(cnt + 1 , 0) , 1) - Clock_Points(Clock_Triangles(cnt + 1 , 1) , 1); point 1 to 0 Vector1Z = Float Clock_Points(Clock_Triangles(cnt + 1 , 0) , 2) - Clock_Points(Clock_Triangles(cnt + 1 , 1) , 2) Vector2X = Float Clock_Points(Clock_Triangles(cnt + 1 , 1) , 0) - Clock_Points(Clock_Triangles(cnt + 1 , 2) , 0); Vector from Vector2Y = Float Clock_Points(Clock_Triangles(cnt + 1 , 1) , 1) - Clock_Points(Clock_Triangles(cnt + 1 , 2) , 1); point 1 to 0 Vector2Z = Float Clock_Points(Clock_Triangles(cnt + 1 , 1) , 2) - Clock_Points(Clock_Triangles(cnt + 1 , 2) , 2) Mag1# = Sqr#(Vector1X * Vector1X + Vector1Y * Vector1Y + Vector1Z * Vector1Z);Get Mag2# = Sqr#(Vector2X * Vector2X + Vector2Y * Vector2Y + Vector2Z * Vector2Z);Magnitutes Vector1X = Float Vector1X / Mag1 Vector1Y = Float Vector1Y / Mag1 Vector1Z = Float Vector1Z / Mag1 Vector2X = Float Vector2X / Mag2 Vector2Y = Float Vector2Y / Mag2 Vector2Z = Float Vector2Z / Mag2 Result2X# = Float Vector1Y * Vector2Z - Vector1Z * Vector2Y Result2Y# = Float Vector1Z * Vector2X - Vector1X * Vector2Z Result2Z# = Float Vector1X * Vector2Y - Vector1Y * Vector2X If Float Abs(Result1X#) + Abs(Result1Y#) + Abs(Result1Z#) > Float Abs(Result2X#) + Abs(Result2Y#) + Abs(Result2Z#) Clock_Triangles_NORMAL(cnt , 0) = Result1X# Clock_Triangles_NORMAL(cnt , 1) = Result1Y# Clock_Triangles_NORMAL(cnt , 2) = Result1Z# Clock_Triangles_NORMAL(cnt + 1 , 0) = Result1X# Clock_Triangles_NORMAL(cnt + 1 , 1) = Result1Y# Clock_Triangles_NORMAL(cnt + 1 , 2) = Result1Z# Else Clock_Triangles_NORMAL(cnt , 0) = Result2X# Clock_Triangles_NORMAL(cnt , 1) = Result2Y# Clock_Triangles_NORMAL(cnt , 2) = Result2Z# Clock_Triangles_NORMAL(cnt + 1 , 0) = Result2X# Clock_Triangles_NORMAL(cnt + 1 , 1) = Result2Y# Clock_Triangles_NORMAL(cnt + 1 , 2) = Result2Z# End If Next ;CALCULATE NORMAL FOR SECONDS HAND Current = CLOCK_POINT_AMOUNT * 8 + 144 For cnt = 0 To 13 Step 2 Vector1X = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 0) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 0); Vector from Vector1Y = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 1) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 1); point 1 to 0 Vector1Z = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 2) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 2) Vector2X = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 0) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 0); Vector from Vector2Y = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 1) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 1); point 1 to 0 Vector2Z = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 2) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 2) Mag1# = Sqr#(Vector1X * Vector1X + Vector1Y * Vector1Y + Vector1Z * Vector1Z);Get Mag2# = Sqr#(Vector2X * Vector2X + Vector2Y * Vector2Y + Vector2Z * Vector2Z);Magnitutes Vector1X = Float Vector1X / Mag1 Vector1Y = Float Vector1Y / Mag1 Vector1Z = Float Vector1Z / Mag1 Vector2X = Float Vector2X / Mag2 Vector2Y = Float Vector2Y / Mag2 Vector2Z = Float Vector2Z / Mag2 Result1X# = Float Vector1Y * Vector2Z - Vector1Z * Vector2Y Result1Y# = Float Vector1Z * Vector2X - Vector1X * Vector2Z Result1Z# = Float Vector1X * Vector2Y - Vector1Y * Vector2X Vector1X = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 0) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 0); Vector from Vector1Y = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 1) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 1); point 1 to 0 Vector1Z = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 2) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 2) Vector2X = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 0) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 0); Vector from Vector2Y = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 1) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 1); point 1 to 0 Vector2Z = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 2) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 2) Mag1# = Sqr#(Vector1X * Vector1X + Vector1Y * Vector1Y + Vector1Z * Vector1Z);Get Mag2# = Sqr#(Vector2X * Vector2X + Vector2Y * Vector2Y + Vector2Z * Vector2Z);Magnitutes Vector1X = Float Vector1X / Mag1 Vector1Y = Float Vector1Y / Mag1 Vector1Z = Float Vector1Z / Mag1 Vector2X = Float Vector2X / Mag2 Vector2Y = Float Vector2Y / Mag2 Vector2Z = Float Vector2Z / Mag2 Result2X# = Float Vector1Y * Vector2Z - Vector1Z * Vector2Y Result2Y# = Float Vector1Z * Vector2X - Vector1X * Vector2Z Result2Z# = Float Vector1X * Vector2Y - Vector1Y * Vector2X If Float Abs(Result1X#) + Abs(Result1Y#) + Abs(Result1Z#) > Float Abs(Result2X#) + Abs(Result2Y#) + Abs(Result2Z#) Seconds_Hand_NORMALS(cnt , 0) = Result1X# Seconds_Hand_NORMALS(cnt , 1) = Result1Y# Seconds_Hand_NORMALS(cnt , 2) = Result1Z# Seconds_Hand_NORMALS(cnt + 1 , 0) = Result1X# Seconds_Hand_NORMALS(cnt + 1 , 1) = Result1Y# Seconds_Hand_NORMALS(cnt + 1 , 2) = Result1Z# Clock_Triangles_NORMAL(cnt + Current , 0) = Result1X# Clock_Triangles_NORMAL(cnt + Current , 1) = Result1Y# Clock_Triangles_NORMAL(cnt + Current , 2) = Result1Z# Clock_Triangles_NORMAL(cnt + Current + 1 , 0) = Result1X# Clock_Triangles_NORMAL(cnt + Current + 1 , 1) = Result1Y# Clock_Triangles_NORMAL(cnt + Current + 1 , 2) = Result1Z# Else Seconds_Hand_NORMALS(cnt , 0) = Result2X# Seconds_Hand_NORMALS(cnt , 1) = Result2Y# Seconds_Hand_NORMALS(cnt , 2) = Result2Z# Seconds_Hand_NORMALS(cnt + 1 , 0) = Result2X# Seconds_Hand_NORMALS(cnt + 1 , 1) = Result2Y# Seconds_Hand_NORMALS(cnt + 1 , 2) = Result2Z# Clock_Triangles_NORMAL(cnt + Current , 0) = Result2X# Clock_Triangles_NORMAL(cnt + Current , 1) = Result2Y# Clock_Triangles_NORMAL(cnt + Current , 2) = Result2Z# Clock_Triangles_NORMAL(cnt + Current + 1 , 0) = Result2X# Clock_Triangles_NORMAL(cnt + Current + 1 , 1) = Result2Y# Clock_Triangles_NORMAL(cnt + Current + 1 , 2) = Result2Z# End If Next ;CALCULATE NORMAL FOR MINUTES HAND Current = CLOCK_POINT_AMOUNT * 8 + 158 For cnt = 0 To 13 Step 2 Vector1X = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 0) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 0); Vector from Vector1Y = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 1) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 1); point 1 to 0 Vector1Z = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 2) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 2) Vector2X = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 0) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 0); Vector from Vector2Y = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 1) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 1); point 1 to 0 Vector2Z = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 2) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 2) Mag1# = Sqr#(Vector1X * Vector1X + Vector1Y * Vector1Y + Vector1Z * Vector1Z);Get Mag2# = Sqr#(Vector2X * Vector2X + Vector2Y * Vector2Y + Vector2Z * Vector2Z);Magnitutes Vector1X = Float Vector1X / Mag1 Vector1Y = Float Vector1Y / Mag1 Vector1Z = Float Vector1Z / Mag1 Vector2X = Float Vector2X / Mag2 Vector2Y = Float Vector2Y / Mag2 Vector2Z = Float Vector2Z / Mag2 Result1X# = Float Vector1Y * Vector2Z - Vector1Z * Vector2Y Result1Y# = Float Vector1Z * Vector2X - Vector1X * Vector2Z Result1Z# = Float Vector1X * Vector2Y - Vector1Y * Vector2X Vector1X = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 0) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 0); Vector from Vector1Y = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 1) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 1); point 1 to 0 Vector1Z = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 2) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 2) Vector2X = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 0) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 0); Vector from Vector2Y = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 1) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 1); point 1 to 0 Vector2Z = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 2) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 2) Mag1# = Sqr#(Vector1X * Vector1X + Vector1Y * Vector1Y + Vector1Z * Vector1Z);Get Mag2# = Sqr#(Vector2X * Vector2X + Vector2Y * Vector2Y + Vector2Z * Vector2Z);Magnitutes Vector1X = Float Vector1X / Mag1 Vector1Y = Float Vector1Y / Mag1 Vector1Z = Float Vector1Z / Mag1 Vector2X = Float Vector2X / Mag2 Vector2Y = Float Vector2Y / Mag2 Vector2Z = Float Vector2Z / Mag2 Result2X# = Float Vector1Y * Vector2Z - Vector1Z * Vector2Y Result2Y# = Float Vector1Z * Vector2X - Vector1X * Vector2Z Result2Z# = Float Vector1X * Vector2Y - Vector1Y * Vector2X If Float Abs(Result1X#) + Abs(Result1Y#) + Abs(Result1Z#) > Float Abs(Result2X#) + Abs(Result2Y#) + Abs(Result2Z#) Minutes_Hand_NORMALS(cnt , 0) = Result1X# Minutes_Hand_NORMALS(cnt , 1) = Result1Y# Minutes_Hand_NORMALS(cnt , 2) = Result1Z# Minutes_Hand_NORMALS(cnt + 1 , 0) = Result1X# Minutes_Hand_NORMALS(cnt + 1 , 1) = Result1Y# Minutes_Hand_NORMALS(cnt + 1 , 2) = Result1Z# Clock_Triangles_NORMAL(cnt + Current , 0) = Result1X# Clock_Triangles_NORMAL(cnt + Current , 1) = Result1Y# Clock_Triangles_NORMAL(cnt + Current , 2) = Result1Z# Clock_Triangles_NORMAL(cnt + Current + 1 , 0) = Result1X# Clock_Triangles_NORMAL(cnt + Current + 1 , 1) = Result1Y# Clock_Triangles_NORMAL(cnt + Current + 1 , 2) = Result1Z# Else Minutes_Hand_NORMALS(cnt , 0) = Result2X# Minutes_Hand_NORMALS(cnt , 1) = Result2Y# Minutes_Hand_NORMALS(cnt , 2) = Result2Z# Minutes_Hand_NORMALS(cnt + 1 , 0) = Result2X# Minutes_Hand_NORMALS(cnt + 1 , 1) = Result2Y# Minutes_Hand_NORMALS(cnt + 1 , 2) = Result2Z# Clock_Triangles_NORMAL(cnt + Current , 0) = Result2X# Clock_Triangles_NORMAL(cnt + Current , 1) = Result2Y# Clock_Triangles_NORMAL(cnt + Current , 2) = Result2Z# Clock_Triangles_NORMAL(cnt + Current + 1 , 0) = Result2X# Clock_Triangles_NORMAL(cnt + Current + 1 , 1) = Result2Y# Clock_Triangles_NORMAL(cnt + Current + 1 , 2) = Result2Z# End If Next ;CALCULATE NORMAL FOR HOURS HAND Current = CLOCK_POINT_AMOUNT * 8 + 172 For cnt = 0 To 13 Step 2 Vector1X = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 0) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 0); Vector from Vector1Y = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 1) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 1); point 1 to 0 Vector1Z = Float Clock_Points(Clock_Triangles(cnt + Current , 0) , 2) - Clock_Points(Clock_Triangles(cnt + Current , 1) , 2) Vector2X = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 0) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 0); Vector from Vector2Y = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 1) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 1); point 1 to 0 Vector2Z = Float Clock_Points(Clock_Triangles(cnt + Current , 1) , 2) - Clock_Points(Clock_Triangles(cnt + Current , 2) , 2) Mag1# = Sqr#(Vector1X * Vector1X + Vector1Y * Vector1Y + Vector1Z * Vector1Z);Get Mag2# = Sqr#(Vector2X * Vector2X + Vector2Y * Vector2Y + Vector2Z * Vector2Z);Magnitutes Vector1X = Float Vector1X / Mag1 Vector1Y = Float Vector1Y / Mag1 Vector1Z = Float Vector1Z / Mag1 Vector2X = Float Vector2X / Mag2 Vector2Y = Float Vector2Y / Mag2 Vector2Z = Float Vector2Z / Mag2 Result1X# = Float Vector1Y * Vector2Z - Vector1Z * Vector2Y Result1Y# = Float Vector1Z * Vector2X - Vector1X * Vector2Z Result1Z# = Float Vector1X * Vector2Y - Vector1Y * Vector2X Vector1X = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 0) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 0); Vector from Vector1Y = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 1) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 1); point 1 to 0 Vector1Z = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 0) , 2) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 2) Vector2X = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 0) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 0); Vector from Vector2Y = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 1) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 1); point 1 to 0 Vector2Z = Float Clock_Points(Clock_Triangles(cnt + Current + 1 , 1) , 2) - Clock_Points(Clock_Triangles(cnt + Current + 1 , 2) , 2) Mag1# = Sqr#(Vector1X * Vector1X + Vector1Y * Vector1Y + Vector1Z * Vector1Z);Get Mag2# = Sqr#(Vector2X * Vector2X + Vector2Y * Vector2Y + Vector2Z * Vector2Z);Magnitutes Vector1X = Float Vector1X / Mag1 Vector1Y = Float Vector1Y / Mag1 Vector1Z = Float Vector1Z / Mag1 Vector2X = Float Vector2X / Mag2 Vector2Y = Float Vector2Y / Mag2 Vector2Z = Float Vector2Z / Mag2 Result2X# = Float Vector1Y * Vector2Z - Vector1Z * Vector2Y Result2Y# = Float Vector1Z * Vector2X - Vector1X * Vector2Z Result2Z# = Float Vector1X * Vector2Y - Vector1Y * Vector2X If Float Abs(Result1X#) + Abs(Result1Y#) + Abs(Result1Z#) > Float Abs(Result2X#) + Abs(Result2Y#) + Abs(Result2Z#) Hours_Hand_NORMALS(cnt , 0) = Result1X# Hours_Hand_NORMALS(cnt , 1) = Result1Y# Hours_Hand_NORMALS(cnt , 2) = Result1Z# Hours_Hand_NORMALS(cnt + 1 , 0) = Result1X# Hours_Hand_NORMALS(cnt + 1 , 1) = Result1Y# Hours_Hand_NORMALS(cnt + 1 , 2) = Result1Z# Clock_Triangles_NORMAL(cnt + Current , 0) = Result1X# Clock_Triangles_NORMAL(cnt + Current , 1) = Result1Y# Clock_Triangles_NORMAL(cnt + Current , 2) = Result1Z# Clock_Triangles_NORMAL(cnt + Current + 1 , 0) = Result1X# Clock_Triangles_NORMAL(cnt + Current + 1 , 1) = Result1Y# Clock_Triangles_NORMAL(cnt + Current + 1 , 2) = Result1Z# Else Hours_Hand_NORMALS(cnt , 0) = Result2X# Hours_Hand_NORMALS(cnt , 1) = Result2Y# Hours_Hand_NORMALS(cnt , 2) = Result2Z# Hours_Hand_NORMALS(cnt + 1 , 0) = Result2X# Hours_Hand_NORMALS(cnt + 1 , 1) = Result2Y# Hours_Hand_NORMALS(cnt + 1 , 2) = Result2Z# Clock_Triangles_NORMAL(cnt + Current , 0) = Result2X# Clock_Triangles_NORMAL(cnt + Current , 1) = Result2Y# Clock_Triangles_NORMAL(cnt + Current , 2) = Result2Z# Clock_Triangles_NORMAL(cnt + Current + 1 , 0) = Result2X# Clock_Triangles_NORMAL(cnt + Current + 1 , 1) = Result2Y# Clock_Triangles_NORMAL(cnt + Current + 1 , 2) = Result2Z# End If Next End Function Function RotateClockHandsToArray(Seconds , Minutes , Hours) RotateAmount = 6 * Seconds For cnt = 0 To 8 Clock_Points#(cnt + CURRENT1 , 0) = Float Seconds_Hand_Points#(cnt , 0) * Cos(RotateAmount) + Seconds_Hand_Points#(cnt , 1) * Sin(RotateAmount) Clock_Points#(cnt + CURRENT1 , 1) = Float Seconds_Hand_Points#(cnt , 1) * Cos(RotateAmount) - Seconds_Hand_Points#(cnt , 0) * Sin(RotateAmount) Next For cnt = 0 To 13 Clock_Triangles_NORMAL#(cnt + CURRENT2 , 0) = Float Seconds_Hand_NORMALS#(cnt , 0) * Cos(RotateAmount) + Seconds_Hand_NORMALS#(cnt , 1) * Sin(RotateAmount) Clock_Triangles_NORMAL#(cnt + CURRENT2 , 1) = Float Seconds_Hand_NORMALS#(cnt , 1) * Cos(RotateAmount) - Seconds_Hand_NORMALS#(cnt , 0) * Sin(RotateAmount) Next RotateAmount = Float 6 * Minutes + Floor#(Seconds * 0.1) For cnt = 0 To 8 Clock_Points#(cnt + CURRENT3 , 0) = Float Minutes_Hand_Points#(cnt , 0) * Cos(RotateAmount) + Minutes_Hand_Points#(cnt , 1) * Sin(RotateAmount) Clock_Points#(cnt + CURRENT3 , 1) = Float Minutes_Hand_Points#(cnt , 1) * Cos(RotateAmount) - Minutes_Hand_Points#(cnt , 0) * Sin(RotateAmount) Next For cnt = 0 To 13 Clock_Triangles_NORMAL#(cnt + CURRENT4 , 0) = Float Minutes_Hand_NORMALS#(cnt , 0) * Cos(RotateAmount) + Minutes_Hand_NORMALS#(cnt , 1) * Sin(RotateAmount) Clock_Triangles_NORMAL#(cnt + CURRENT4 , 1) = Float Minutes_Hand_NORMALS#(cnt , 1) * Cos(RotateAmount) - Minutes_Hand_NORMALS#(cnt , 0) * Sin(RotateAmount) Next RotateAmount = 30 * Hours + Floor#(Minutes * 0.5) For cnt = 0 To 8 Clock_Points#(cnt + CURRENT5 , 0) = Float Hours_Hand_Points#(cnt , 0) * Cos(RotateAmount) + Hours_Hand_Points#(cnt , 1) * Sin(RotateAmount) Clock_Points#(cnt + CURRENT5 , 1) = Float Hours_Hand_Points#(cnt , 1) * Cos(RotateAmount) - Hours_Hand_Points#(cnt , 0) * Sin(RotateAmount) Next For cnt = 0 To 13 Clock_Triangles_NORMAL#(cnt + CURRENT6 , 0) = Float Hours_Hand_NORMALS#(cnt , 0) * Cos(RotateAmount) + Hours_Hand_NORMALS#(cnt , 1) * Sin(RotateAmount) Clock_Triangles_NORMAL#(cnt + CURRENT6 , 1) = Float Hours_Hand_NORMALS#(cnt , 1) * Cos(RotateAmount) - Hours_Hand_NORMALS#(cnt , 0) * Sin(RotateAmount) Next End Function Function RemoveObsoleteTriangles(All_Triangles_2_Draw) For cnt = 1 To All_Triangles_2_Draw Flag = 0 A# = Clock_Points_PROJ(Clock_Triangles(Triangles_2_Render(cnt , 0) , 1) , 1) B# = Clock_Points_PROJ(Clock_Triangles(Triangles_2_Ren |
Comments
None.
Code Archives Forum