Hi All
New Update for "Core" to be create volume!!!!
file: ShadowVolumes.bb
Type ETE_Mesh
Field ent
Field cnt_tris, tri.ETE_Triangle[ETE_MaxTriang]
End Type
Type ETE_Triangle
Field v1.Point3D, v2.Point3D, v3.Point3D, nx#, ny#, nz#
Field tri, ta, tb, tc
End Type
Type Point3D
Field x#, y#, z#
End Type
Const ETE_MaxTriang = 65000
Global VolumeMesh, VolumeSurf
Dim TriangleClone.ETE_Triangle(ETE_MaxTriang)
Function InitVolumes()
For i = 0 To ETE_MaxTriang
TriangleClone.ETE_Triangle(i) = New ETE_Triangle
TriangleClone(i)\v1 = New Point3D
TriangleClone(i)\v2 = New Point3D
TriangleClone(i)\v3 = New Point3D
Next
VolumeMesh = CreateMesh()
VolumeSurf = CreateSurface(VolumeMesh)
EntityColor VolumeMesh, 255, 0, 0
EntityAlpha VolumeMesh, .5
EntityFX VolumeMesh, 17
End Function
Function FreeVolumes()
Delete Each ETE_Mesh
Delete Each ETE_Triangle
Delete Each Point3D
If VolumeMesh Then FreeEntity VolumeMesh
End Function
Function InitVolumeCaster(ent, file = -1)
Local ad1[ETE_MaxTriang], ad2[ETE_MaxTriang], ad3[ETE_MaxTriang]
copy = SingleSurfaceMesh(ent)
etem.ETE_Mesh = New ETE_Mesh
etem\ent = ent
surf = GetSurface(copy, 1)
cnt_tris = CountTriangles(surf) - 1
etem\cnt_tris = cnt_tris
For v = 0 To cnt_tris
etem\tri[v] = New ETE_Triangle
etet.ETE_Triangle = etem\tri[v]
etet\v1 = New Point3D
etet\v2 = New Point3D
etet\v3 = New Point3D
v1.Point3D = etet\v1
v2.Point3D = etet\v2
v3.Point3D = etet\v3
vert0 = TriangleVertex(surf, v, 0)
vert1 = TriangleVertex(surf, v, 1)
vert2 = TriangleVertex(surf, v, 2)
v1\x# = VertexX(surf, vert0)
v1\y# = VertexY(surf, vert0)
v1\z# = VertexZ(surf, vert0)
v2\x# = VertexX(surf, vert1)
v2\y# = VertexY(surf, vert1)
v2\z# = VertexZ(surf, vert1)
v3\x# = VertexX(surf, vert2)
v3\y# = VertexY(surf, vert2)
v3\z# = VertexZ(surf, vert2)
e0x# = v3\x# - v2\x#
e0y# = v3\y# - v2\y#
e0z# = v3\z# - v2\z#
e1x# = v2\x# - v1\x#
e1y# = v2\y# - v1\y#
e1z# = v2\z# - v1\z#
etet\nx# = e0y# * e1z# - e0z# * e1y#
etet\ny# = e0z# * e1x# - e0x# * e1z#
etet\nz# = e0x# * e1y# - e0y# * e1x#
etet\tri = v
etet\ta = -1
etet\tb = -1
etet\tc = -1
ad1[v] = True
ad2[v] = True
ad3[v] = True
Next
For a = 0 To cnt_tris
ATriang.ETE_Triangle = etem\tri[a]
v1 = ATriang\v1
v2 = ATriang\v2
v3 = ATriang\v3
For b = a + 1 To cnt_tris
state1 = ad1[b]
state2 = ad2[b]
state3 = ad3[b]
If a <> b And (state1 Or state2 Or state3) Then
BTriang.ETE_Triangle = etem\tri[b]
v2A.Point3D = BTriang\v1
v2B.Point3D = BTriang\v2
v2C.Point3D = BTriang\v3
If state1 Then
If CheckLine(v1, v2A, v2, v2B) Then
ATriang\ta = b
BTriang\ta = a
ad1[b] = False
Goto SIDEA
EndIf
EndIf
If state2 Then
If CheckLine(v1, v2B, v2, v2C) Then
ATriang\ta = b
BTriang\tb = a
ad2[b] = False
Goto SIDEA
EndIf
EndIf
If state3 Then
If CheckLine(v1, v2C, v2, v2A) Then
ATriang\ta = b
BTriang\tc = a
ad3[b] = False
EndIf
EndIf
.SIDEA
If state1 Then
If CheckLine(v2, v2A, v3, v2B) Then
ATriang\tb = b
BTriang\ta = a
ad1[b] = False
Goto SIDEB
EndIf
EndIf
If state2 Then
If CheckLine(v2, v2B, v3, v2C) Then
ATriang\tb = b
BTriang\tb = a
ad2[b] = False
Goto SIDEB
EndIf
EndIf
If state3 Then
If CheckLine(v2, v2C, v3, v2A) Then
ATriang\tb = b
BTriang\tc = a
ad3[b] = False
EndIf
EndIf
.SIDEB
If state1 Then
If CheckLine(v3, v2A, v1, v2B) Then
ATriang\tc = b
BTriang\ta = a
ad1[b] = False
Goto SIDEC
EndIf
EndIf
If state2 Then
If CheckLine(v3, v2B, v1, v2C) Then
ATriang\tc = b
BTriang\tb = a
ad2[b] = False
Goto SIDEC
EndIf
EndIf
If state3 Then
If CheckLine(v3, v2C, v1, v2A) Then
ATriang\tc = b
BTriang\tc = a
ad3[b] = False
EndIf
EndIf
.SIDEC
EndIf
Next
Next
FreeEntity copy
End Function
Function LoadVolumeCaster(ent, path$, file = -1)
If file = -1 Then file = ReadFile(path$)
sm.ShadowMesh = New ShadowMesh
sm\ent = ent
sm\casting = True
etem.ETE_Mesh = New ETE_Mesh
etem\ent = sm\ent
etem\cnt_tris = ReadInt(file)
For v = 0 To etem\cnt_tris
etem\tri[v] = New ETE_Triangle
etet.ETE_Triangle = etem\tri[v]
tri.ETE_Triangle = etem\tri[v]
tri\v1 = New Point3D
tri\v2 = New Point3D
tri\v3 = New Point3D
v1.Point3D = tri\v1
v2.Point3D = tri\v2
v3.Point3D = tri\v3
v1\x# = ReadFloat(file)
v1\y# = ReadFloat(file)
v1\z# = ReadFloat(file)
v2\x# = ReadFloat(file)
v2\y# = ReadFloat(file)
v2\z# = ReadFloat(file)
v3\x# = ReadFloat(file)
v3\y# = ReadFloat(file)
v3\z# = ReadFloat(file)
tri\nx# = ReadFloat(file)
tri\ny# = ReadFloat(file)
tri\nz# = ReadFloat(file)
tri\tri = ReadInt(file)
tri\ta = ReadInt(file)
tri\tb = ReadInt(file)
tri\tc = ReadInt(file)
Next
cnt_children = CountChildren(ent)
For i = 1 To cnt_children
LoadVolumeCaster(GetChild(ent, i), "", file)
Next
End Function
Function CreateVolume_orig(light, parallel = False)
;===>
RangeLight# = 10 ; is a range light, all object over range is jump
;===>
light_x# = EntityX(light, True) * (1 + parallel * 1000000)
light_y# = EntityY(light, True) * (1 + parallel * 1000000)
light_z# = EntityZ(light, True) * (1 + parallel * 1000000)
volume_lenght = RangeLight
;===>
For etem.ETE_Mesh = Each ETE_Mesh
;===>
cnt_tris = etem\cnt_tris
For v = 0 To cnt_tris
;===>
etet.ETE_Triangle = TriangleClone(v)
CloneTriangle(etet, etem\tri[v])
;===>
v1.Point3D = etet\v1
TFormPoint v1\x#, v1\y#, v1\z#, etem\ent, 0
v1\x# = TFormedX()
v1\y# = TFormedY()
v1\z# = TFormedZ()
;===>
TFormNormal etet\nx#, etet\ny#, etet\nz#, etem\ent, 0
;===>
Dot# = ((v1\x# - light_x#) * TFormedX()) + ((v1\y# - light_y#) * TFormedY()) + ((v1\z# - light_z#) * TFormedZ())
;===>
If Dot# < 0.0 Then
;===>
etet\tri = -1
;===>
Else
;===>
v2.Point3D = etet\v2
TFormPoint v2\x#, v2\y#, v2\z#, etem\ent, 0
v2\x# = TFormedX()
v2\y# = TFormedY()
v2\z# = TFormedZ()
;===>
v3.Point3D = etet\v3
TFormPoint v3\x#, v3\y#, v3\z#, etem\ent, 0
v3\x# = TFormedX()
v3\y# = TFormedY()
v3\z# = TFormedZ()
;===>
EndIf
;===>
Next
;===>
;Return
;===>
For v = 0 To cnt_tris
etet = TriangleClone(v)
If etet\tri => 0 Then
ta = etet\ta
tb = etet\tb
tc = etet\tc
If ta > -1 Then check1 = TriangleClone(ta)\tri Else check1 = -1
If tb > -1 Then check2 = TriangleClone(tb)\tri Else check2 = -1
If tc > -1 Then check3 = TriangleClone(tc)\tri Else check3 = -1
If check1 < 0 Or check2 < 0 Or check3 < 0 Then
v1 = etet\v1
v2 = etet\v2
v3 = etet\v3
If check1 < 0 Then
rax# = v1\x# + (v1\x# - light_x#) * volume_lenght
ray# = v1\y# + (v1\y# - light_y#) * volume_lenght
raz# = v1\z# + (v1\z# - light_z#) * volume_lenght
rbx# = v2\x# + (v2\x# - light_x#) * volume_lenght
rby# = v2\y# + (v2\y# - light_y#) * volume_lenght
rbz# = v2\z# + (v2\z# - light_z#) * volume_lenght
vert1 = AddVertex(VolumeSurf, v1\x#, v1\y#, v1\z#)
vert2 = AddVertex(VolumeSurf, rax#, ray#, raz#)
vert3 = AddVertex(VolumeSurf, rbx#, rby#, rbz#)
vert4 = AddVertex(VolumeSurf, v2\x#, v2\y#, v2\z#)
AddTriangle(VolumeSurf, vert1, vert2, vert3)
AddTriangle(VolumeSurf, vert1, vert3, vert4)
EndIf
If check2 < 0 Then
rbx# = v2\x# + (v2\x# - light_x#) * volume_lenght
rby# = v2\y# + (v2\y# - light_y#) * volume_lenght
rbz# = v2\z# + (v2\z# - light_z#) * volume_lenght
rcx# = v3\x# + (v3\x# - light_x#) * volume_lenght
rcy# = v3\y# + (v3\y# - light_y#) * volume_lenght
rcz# = v3\z# + (v3\z# - light_z#) * volume_lenght
vert1 = AddVertex(VolumeSurf, v2\x#, v2\y#, v2\z#)
vert2 = AddVertex(VolumeSurf, rbx#, rby#, rbz#)
vert3 = AddVertex(VolumeSurf, rcx#, rcy#, rcz#)
vert4 = AddVertex(VolumeSurf, v3\x#, v3\y#, v3\z#)
AddTriangle(VolumeSurf, vert1, vert2, vert3)
AddTriangle(VolumeSurf, vert1, vert3, vert4)
EndIf
If check3 < 0 Then
rax# = v1\x# + (v1\x# - light_x#) * volume_lenght
ray# = v1\y# + (v1\y# - light_y#) * volume_lenght
raz# = v1\z# + (v1\z# - light_z#) * volume_lenght
rcx# = v3\x# + (v3\x# - light_x#) * volume_lenght
rcy# = v3\y# + (v3\y# - light_y#) * volume_lenght
rcz# = v3\z# + (v3\z# - light_z#) * volume_lenght
vert1 = AddVertex(VolumeSurf, v1\x#, v1\y#, v1\z#)
vert2 = AddVertex(VolumeSurf, rax#, ray#, raz#)
vert3 = AddVertex(VolumeSurf, rcx#, rcy#, rcz#)
vert4 = AddVertex(VolumeSurf, v3\x#, v3\y#, v3\z#)
AddTriangle(VolumeSurf, vert1, vert3, vert2)
AddTriangle(VolumeSurf, vert1, vert4, vert3)
EndIf
EndIf
EndIf
Next
Next
End Function
Function CreateVolume(light, parallel = False); New Version
;===>
RangeLight# = 10 ; is a range light, all object over range is jump
;===>
light_x# = EntityX(light, True) * (1 + parallel * 1000000)
light_y# = EntityY(light, True) * (1 + parallel * 1000000)
light_z# = EntityZ(light, True) * (1 + parallel * 1000000)
volume_lenght = RangeLight
;===>
v1x# = 0 : v1y# = 0 : v1z# = 0
v2x# = 0 : v2y# = 0 : v2z# = 0
v3x# = 0 : v3y# = 0 : v3z# = 0
;===>
For etem.ETE_Mesh = Each ETE_Mesh
;===>
cnt_tris = etem\cnt_tris
For v = 0 To cnt_tris
etet.ETE_Triangle = TriangleClone(v)
CloneTrianglePart1(etet, etem\tri[v])
;===>
v1.Point3D = etet\v1
TFormPoint v1\x#, v1\y#, v1\z#, etem\ent, 0
v1\x# = TFormedX()
v1\y# = TFormedY()
v1\z# = TFormedZ()
;===>
TFormNormal etet\nx#, etet\ny#, etet\nz#, etem\ent, 0
;===>
Dot# = ((v1\x# - light_x#) * TFormedX()) + ((v1\y# - light_y#) * TFormedY()) + ((v1\z# - light_z#) * TFormedZ())
;===>
If Dot# < 0.0 Then
;===>
etet\tri = -1
;===>
Else
;===>
CloneTrianglePart2(etet, etem\tri[v])
;===>
v2.Point3D = etet\v2
TFormPoint v2\x#, v2\y#, v2\z#, etem\ent, 0
v2\x# = TFormedX()
v2\y# = TFormedY()
v2\z# = TFormedZ()
;===>
v3.Point3D = etet\v3
TFormPoint v3\x#, v3\y#, v3\z#, etem\ent, 0
v3\x# = TFormedX()
v3\y# = TFormedY()
v3\z# = TFormedZ()
;===>
EndIf
;===>
Next
;===>
;Goto Pippo
;===>
For v = 0 To cnt_tris
;===>
etet = TriangleClone(v)
;===>
If etet\tri => 0 Then
;===>
ta = etet\ta
If ta > -1 Then check1 = TriangleClone(ta)\tri Else check1 = -1
tb = etet\tb
If tb > -1 Then check2 = TriangleClone(tb)\tri Else check2 = -1
tc = etet\tc
If tc > -1 Then check3 = TriangleClone(tc)\tri Else check3 = -1
;===>
If check1 < 0 Or check2 < 0 Or check3 < 0 Then
;===>
If check1 < 0 Then
;===>
v1x# = etet\v1\x# : v1y# = etet\v1\y# : v1z# = etet\v1\z#
v2x# = etet\v2\x# : v2y# = etet\v2\y# : v2z# = etet\v2\z#
;===>
rax# = v1x# + (v1x# - light_x#) * volume_lenght
ray# = v1y# + (v1y# - light_y#) * volume_lenght
raz# = v1z# + (v1z# - light_z#) * volume_lenght
rbx# = v2x# + (v2x# - light_x#) * volume_lenght
rby# = v2y# + (v2y# - light_y#) * volume_lenght
rbz# = v2z# + (v2z# - light_z#) * volume_lenght
vert1 = AddVertex(VolumeSurf, v1x#, v1y#, v1z#)
vert2 = AddVertex(VolumeSurf, rax#, ray#, raz#)
vert3 = AddVertex(VolumeSurf, rbx#, rby#, rbz#)
vert4 = AddVertex(VolumeSurf, v2x#, v2y#, v2z#)
AddTriangle(VolumeSurf, vert1, vert2, vert3)
AddTriangle(VolumeSurf, vert1, vert3, vert4)
;===>
EndIf
If check2 < 0 Then
;===>
v2x# = etet\v2\x# : v2y# = etet\v2\y# : v2z# = etet\v2\z#
v3x# = etet\v3\x# : v3y# = etet\v3\y# : v3z# = etet\v3\z#
;===>
rbx# = v2x# + (v2x# - light_x#) * volume_lenght
rby# = v2y# + (v2y# - light_y#) * volume_lenght
rbz# = v2z# + (v2z# - light_z#) * volume_lenght
rcx# = v3x# + (v3x# - light_x#) * volume_lenght
rcy# = v3y# + (v3y# - light_y#) * volume_lenght
rcz# = v3z# + (v3z# - light_z#) * volume_lenght
vert1 = AddVertex(VolumeSurf, v2x#, v2y#, v2z#)
vert2 = AddVertex(VolumeSurf, rbx#, rby#, rbz#)
vert3 = AddVertex(VolumeSurf, rcx#, rcy#, rcz#)
vert4 = AddVertex(VolumeSurf, v3x#, v3y#, v3z#)
AddTriangle(VolumeSurf, vert1, vert2, vert3)
AddTriangle(VolumeSurf, vert1, vert3, vert4)
;===>
EndIf
If check3 < 0 Then
;===>
v1x# = etet\v1\x# : v1y# = etet\v1\y# : v1z# = etet\v1\z#
v3x# = etet\v3\x# : v3y# = etet\v3\y# : v3z# = etet\v3\z#
;===>
rax# = v1x# + (v1x# - light_x#) * volume_lenght
ray# = v1y# + (v1y# - light_y#) * volume_lenght
raz# = v1z# + (v1z# - light_z#) * volume_lenght
rcx# = v3x# + (v3x# - light_x#) * volume_lenght
rcy# = v3y# + (v3y# - light_y#) * volume_lenght
rcz# = v3z# + (v3z# - light_z#) * volume_lenght
vert1 = AddVertex(VolumeSurf, v1x#, v1y#, v1z#)
vert2 = AddVertex(VolumeSurf, rax#, ray#, raz#)
vert3 = AddVertex(VolumeSurf, rcx#, rcy#, rcz#)
vert4 = AddVertex(VolumeSurf, v3x#, v3y#, v3z#)
AddTriangle(VolumeSurf, vert1, vert3, vert2)
AddTriangle(VolumeSurf, vert1, vert4, vert3)
;===>
EndIf
EndIf
EndIf
Next
;.Pippo
Next
End Function
Function SingleSurfaceMesh(ent)
ret = CopyMesh(ent)
If CountSurfaces(ret) = 1 Then
Return ret
Else
FreeEntity ret
ret = CreateMesh()
new_surf = CreateSurface(ret)
For s = 1 To CountSurfaces(ent)
surf = GetSurface(ent, s)
For t = 0 To CountTriangles(surf) - 1
v0 = TriangleVertex(surf, t, 0)
v1 = TriangleVertex(surf, t, 1)
v2 = TriangleVertex(surf, t, 2)
new_v1 = AddVertex(new_surf, VertexX(surf, v0), VertexY(surf, v0), VertexZ(surf, v0))
new_v2 = AddVertex(new_surf, VertexX(surf, v1), VertexY(surf, v1), VertexZ(surf, v1))
new_v3 = AddVertex(new_surf, VertexX(surf, v2), VertexY(surf, v2), VertexZ(surf, v2))
AddTriangle new_surf, new_v1, new_v2, new_v3
Next
Next
Return ret
EndIf
End Function
Function CloneTrianglePart1(dst.ETE_Triangle, src.ETE_Triangle); New Version
dst\v1\x# = src\v1\x#
dst\v1\y# = src\v1\y#
dst\v1\z# = src\v1\z#
dst\nx# = src\nx#
dst\ny# = src\ny#
dst\nz# = src\nz#
dst\tri = src\tri
End Function
Function CloneTrianglePart2(dst.ETE_Triangle, src.ETE_Triangle); New Version
dst\v2\x# = src\v2\x#
dst\v2\y# = src\v2\y#
dst\v2\z# = src\v2\z#
dst\v3\x# = src\v3\x#
dst\v3\y# = src\v3\y#
dst\v3\z# = src\v3\z#
dst\ta = src\ta
dst\tb = src\tb
dst\tc = src\tc
End Function
Function CloneTriangle(dst.ETE_Triangle, src.ETE_Triangle)
dst\v1\x# = src\v1\x#
dst\v1\y# = src\v1\y#
dst\v1\z# = src\v1\z#
dst\v2\x# = src\v2\x#
dst\v2\y# = src\v2\y#
dst\v2\z# = src\v2\z#
dst\v3\x# = src\v3\x#
dst\v3\y# = src\v3\y#
dst\v3\z# = src\v3\z#
dst\nx# = src\nx#
dst\ny# = src\ny#
dst\nz# = src\nz#
dst\tri = src\tri
dst\ta = src\ta
dst\tb = src\tb
dst\tc = src\tc
End Function
Function CheckLine(a1.Point3D, b1.Point3D, a2.Point3D, b2.Point3D)
c1 = (a1\x# = a2\x# And a1\y# = a2\y# And a1\z# = a2\z#)
c2 = (b1\x# = b2\x# And b1\y# = b2\y# And b1\z# = b2\z#)
c3 = (a1\x# = b2\x# And a1\y# = b2\y# And a1\z# = b2\z#)
c4 = (b1\x# = a2\x# And b1\y# = a2\y# And b1\z# = a2\z#)
If (c1 And c2) Or (c3 And c4) Then Return True Else Return False
End Function
1 modify statistic time for "Volume time"
file: SampleFunctions.bb
Include "Includes\DevilShadowSystem.bb"
Global font_height = FontHeight() + 3
Global timer = CreateTimer(60)
Global render_mode = 1
;===> New Version
Const Mid_Const = 20
Dim Mid_Time#(Mid_Const)
Global Mid_Time_Cnt%
;===> New Version
Function InitGraphics()
Graphics3D 1024, 768, 16, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
End Function
Function StartProgram(center_mouse = False)
If center_mouse Then MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
FlushMouse()
FlushKeys()
End Function
Function UpdateProgram(Cam, freelook_speed# = 0);===> New Version
;Freelook
If freelook_speed# > 0 Then
MoveEntity Cam, (KeyDown(32) - KeyDown(30)) * freelook_speed#, 0, (KeyDown(17) - KeyDown(31)) * freelook_speed#
RotateEntity Cam, EntityPitch(Cam) + MouseYSpeed(), EntityYaw(Cam) - MouseXSpeed(), 0
MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
HidePointer
Else
ShowPointer
EndIf
;Render
ms = MilliSecs()
If KeyHit(2) Then render_mode = 0 ElseIf KeyHit(3) Then render_mode = 1 ElseIf KeyHit(4) Then render_mode = 2
Render(render_mode)
;Debug
Color 255, 255, 255
;===>
; Midle time
Mid_Time#(Mid_Time_Cnt) = Debug_TimeVolumesBuilt
If Mid_Time_Cnt<Mid_Const Then Mid_Time_Cnt=Mid_Time_Cnt+1 Else Mid_Time_Cnt = 0
Tim_Volume=0
For a=0 To Mid_Const-1
Tim_Volume = Tim_Volume+Mid_Time#(a)
Next
Tim_Volume=Tim_Volume/Mid_Const
;===>
UpdateDebugBar(10, 10, 10, "FPS: " + FPS(), "Render time: " + Debug_TimeRender, "InitVolume time: " + Debug_TimeInitVolumes, "Volume time statistic: " + Tim_Volume, "Shadow Polys: " + Debug_ShadowPolys)
;UpdateDebugBar(10, 10, 10, "FPS: " + FPS(), "Render time: " + Debug_TimeRender, "InitVolume time: " + Debug_TimeInitVolumes, "Volume time: " + Debug_TimeVolumesBuilt, "Shadow Polys: " + Debug_ShadowPolys)
gw = GraphicsWidth()
gh = GraphicsHeight()
txt1$ = "Press keys 1-3 to toggle the render modes."
txt2$ = "Use A,S,W,D and the mouse to look arround."
If freelook_speed# > 0 Then
UpdateDebugBar(240, 10, 5, txt1$, txt2$)
Else
UpdateDebugBar(240, 10, 5, txt1$)
EndIf
WaitTimer(timer)
Flip
End Function
Function UpdateDebugBar(x, y, d, p1$, p2$ = "***", p3$ = "***", p4$ = "***", p5$ = "***")
max_params = 4
Local p$[4]
p[0] = p1$
p[1] = p2$
p[2] = p3$
p[3] = p4$
p[4] = p5$
width = 20
For i = 0 To max_params
If p[i] <> "***" Then
cnt_params = i
sw = StringWidth(p[i])
If sw > width Then width = sw
EndIf
Next
fh = FontHeight() + 2
Color 0, 0, 0
w = width + d * 2
h = fh * (cnt_params + 1) + d * 2
Rect x, y, w, h
Color 255, 255, 255
Rect x, y, w, h, False
For i = 0 To cnt_params
Text x + d, y + d + fh * i, p[i]
Next
End Function
Global FPS, FPS_temp, FPS_time
Function FPS()
ctime = MilliSecs()
FPS_temp = FPS_temp + 1
If ctime - FPS_time > 500 Then
FPS = FPS_temp * 2
FPS_temp = 0
FPS_time = ctime
EndIf
Return FPS
End Function
Bye