 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 23.04.2019, 20:55 Titel: Rutt Etra Izer Effect v0.7 |
|
|
Um das Test Bild zu erstellen, bitten den Code hier ExtractTestImage.bas in den vorher gleichen Ordner erstellen, kompilieren und ausführen. Es sollte nun das Test Bild "Panda_800x800.bmp" erstellt worden sein (NUR FÜR WINDOWS!)!
Jetzt Rutt_Etra_Izer_FX.bas starten.
Code: |
'Coded by UEZ v0.7 build 2019-04-24
'Thanks to eukalyptus for the fast ASM sin / cos functions and vdecampo for the DrawAALine function
#Include "fbgfx.bi"
Using FB
Declare Function _ASM_Sin6th(fX As Double) As Double
Declare Function _ASM_Cos6th(fX As Double) As Double
Declare Sub Translate3Dto2D(fXin As Single, fYin As Single, fZin As Single, _
fRotX As Single, fRotY As Single, fRotZ As Single, _
Byref xout As Single, Byref yout As Single, _
fCenterX As Single = 0, fCenterY As Single = 0.0, _
fScale As Single = 1.0, fZDeepCorrection As Single = 1000.0)
Declare Function ipart(x As Single) As Integer
Declare Function round(x As Single) As Integer
Declare Function fpart(x As Single) As Single
Declare Function rfpart(x As Single) As Single
Declare Sub Plot(x As Short, y As Short, baseclr As Ulong, c As Single)
Declare Sub DrawAALine(x0 As Single,y0 As Single,x1 As Single,y1 As Single, clr As Ulong)
#Define _GetPixel(_x, _y) *Cptr(Ulong Ptr, imgData + (_y) * pitch + (_x) Shl 2)
#Define _SetPixel(_x, _y, iCol) *Cptr(Ulong Ptr, imgData + (_y) * pitch + (_x) Shl 2) = (iCol)
#Define _Red(iCol) ((iCol And &hFF0000) Shr 16)
#Define _Green(iCol) ((iCol And &h00FF00) Shr 8)
#Define _Blue(iCol) ((iCol And &h0000FF))
#Define _Max(a, b) (Iif(a > b, a, b))
#Define _Min(a, b) (Iif(a < b, a, b))
Dim As Any Ptr pBitmap, pImage
Dim Shared As Integer pitch, pitch2
Dim Shared As Any Pointer imgData, imgData2
Dim Shared As Ushort sw = 1200, sh = 800, bAA = 0
Dim As UShort iw, ih, wh, hh, swh = sw \ 2, shh = sh \ 2, cx, cy, iStepX = 4, iStepY = 4, x, y
Dim As String sImage = "Panda_800x800.bmp"
iw = 800
ih = 800
Screenres sw, sh, 32, 2
Screenset 1, 0
Windowtitle "Rutt Etra Izer Effect v0.7 by UEZ"
pBitmap = Imagecreate(iw, ih, 0, 32)
Bload sImage, pBitmap
Imageinfo(pBitmap, , , , pitch, imgData)
pImage = Imagecreate(sw, sh, 0, 32)
Imageinfo(pImage, , , , pitch2, imgData2)
cx = (sw - iw) \ 2
cy = (sh - ih) \ 2
Type vec4
As Single x, y, z
As Ulong col
End Type
Dim As Ushort iUBY = ih \ iStepY + 1, iUBX = iw \ iStepX + 1, xx = 0, yy = 0
wh = iw \ 2
hh = ih \ 2
Dim As vec4 aPixels(iUBY, iUBX)
For y = 0 To ih - 1 Step iStepY
For x = 0 To iw - 1 Step iStepX
aPixels(yy, xx).x = x - wh
aPixels(yy, xx).y = y - hh
aPixels(yy, xx).col = _GetPixel(x, y)
aPixels(yy, xx).z = 255 - (_Red(aPixels(yy, xx).col) + _Green(aPixels(yy, xx).col) + _Blue(aPixels(yy, xx).col)) / 6
xx += 1
Next
yy += 1
xx = 0
Next
Dim As Single px1, py1, px2, py2, fPi = Acos(-1), fSpeed = fPi / (8 * 180), fAngle = 0, f2Pi = 2 * fPi, xr, yr, xrot, yrot, dx = cx + wh, dy = cy + hh, fScale = 1.0, s
Dim As Integer mx, my, mb, mw, mc, mwo, mxo, myo
Dim As Ushort iFPS = 0, iFPS_current = 0
Dim As Double fTimer = Timer
Do
Line pImage, (0, 0) - (sw - 1, sh - 1), Rgba(0, 0, 0, 200), BF 'clear image
'helper lines
'Line pImage, (0, shh) - (sw, shh), Rgba(64, 64, 64, 192)
'Line pImage, (swh, 0) - (swh, sh), Rgba(64, 64, 64, 192)
Getmouse mx, my, mw, mb, mc
If mb = 1 And (mx <> mxo Or my <> myo) Then
xrot = -(mx / sw) * f2Pi + fPi
yrot = (my / sh) * f2Pi + fPi
mxo = mx
myo = my
Elseif mb = 2 Then
xrot = 0
yrot = 0
End If
If mc = 0 Then mwo = mw
s = _Min(_Max(fScale + Iif(mc = -1, mwo, mw) / 20, 0.1), 4) 'scale factor
For y = 0 To Ubound(aPixels) - 1
For x = 1 To Ubound(aPixels, 2) - 2
Translate3Dto2D(aPixels(y, x - 1).x, aPixels(y, x - 1).y, aPixels(y, x - 1).z, yrot, -xrot, 0, px1, py1, dx, dy, s)
Translate3Dto2D(aPixels(y, x).x, aPixels(y, x).y, aPixels(y, x).z, yrot, -xrot, 0, px2, py2, dx, dy, s)
If bAA Then
DrawAALine(px1, py1, px2, py2, aPixels(y, x).col)
Else
Line pImage, (px1, py1)-(px2, py2), aPixels(y, x).col
End If
Next
Next
Put (0, 0), pImage, Pset
Draw String(1, 1), iFPS_current & " fps", Rgb(&h00, &hFF, &h00)
Flip
If Timer - fTimer > 0.99 Then
iFPS_current = iFPS
iFPS = 0
fTimer = Timer
Else
iFPS += 1
Endif
Sleep(10, 1)
Loop Until Inkey = Chr(27)
Imagedestroy pBitmap
Imagedestroy pImage
Sub Translate3Dto2D(fXin As Single, fYin As Single, fZin As Single, _
fRotX As Single, fRotY As Single, fRotZ As Single, _
Byref xout As Single, Byref yout As Single, _
fCenterX As Single = 0, fCenterY As Single = 0, _
fScale As Single = 1.0, fZDeepCorrection As Single = 1000.0)
Dim As Single fCosRotX, fSinRotX, fCosRotY, fSinRotY, fCosRotZ, fSinRotZ, f1, f2, f3, f4, f5, f6, fXPos, fYPos, fZPos, fZPerspCorrection
fCosRotX = _ASM_Cos6th(fRotX)
fSinRotX = _ASM_Sin6th(fRotX)
fCosRotY = _ASM_Cos6th(fRotY)
fSinRotY = _ASM_Sin6th(fRotY)
fCosRotZ = _ASM_Cos6th(fRotZ)
fSinRotZ = _ASM_Sin6th(fRotZ)
f1 = fCosRotY * fXin
f2 = fSinRotX * fYin
f3 = fCosRotX * fZin
f4 = fCosRotX * fYin
f5 = fSinRotX * fZin
f6 = f1 - fSinRotY * (f2 + f3)
fXPos = (fCosRotZ * f6 - fSinRotZ * (f4 - f5)) * fScale
fYPos = (fSinRotZ * f6 + fCosRotZ * (f4 - f5)) * fScale
fZPos = (fSinRotY * fXin + fCosRotY * (f2 + f3)) * fScale
fZPerspCorrection = 1 / (fZPos / fZDeepCorrection + 1)
xout = fXPos * fZPerspCorrection + fCenterX
yout = fYPos * fZPerspCorrection + fCenterY
'fZ = fZPos
End Sub
Function _ASM_Sin6th(fX As Double) As Double
'By Eukalyptus
Asm
jmp 0f
1: .Double 683565275.57643158
2: .Double -0.0000000061763971109087229
3: .Double 6755399441055744.0
0:
movq xmm0, [fX]
mulsd xmm0, [1b]
addsd xmm0, [3b]
movd ebx, xmm0
lea eax, [ebx*2+0x80000000]
sar eax, 2
imul eax
sar ebx, 31
lea eax, [edx*2-0x70000000]
lea ecx, [edx*8+edx-0x24000000]
imul edx
Xor ecx, ebx
lea eax, [edx*8+edx+0x44A00000]
imul ecx
cvtsi2sd xmm0, edx
mulsd xmm0, [2b]
movq [Function], xmm0
End Asm
End Function
Function _ASM_Cos6th(fX As Double) As Double
'By Eukalyptus
Asm
jmp 0f
1: .Double 683565275.57643158
2: .Double -0.0000000061763971109087229
3: .Double 6755399441055744.0
0:
movq xmm0, [fX]
mulsd xmm0, [1b]
addsd xmm0, [3b]
movd ebx, xmm0
Add ebx, 0x40000000 'SinToCos
lea eax, [ebx*2+0x80000000]
sar eax, 2
imul eax
sar ebx, 31
lea eax, [edx*2-0x70000000]
lea ecx, [edx*8+edx-0x24000000]
imul edx
Xor ecx, ebx
lea eax, [edx*8+edx+0x44A00000]
imul ecx
cvtsi2sd xmm0, edx
mulsd xmm0, [2b]
movq [Function], xmm0
End Asm
End Function
/'
https://www.freebasic.net/forum/viewtopic.php?t=24443#p216462
Xiaolin Wu's line algorithm
An algorithm for line antialiasing,
which was presented in the article
an efficient antialiasing technique
in the July 1991 issue of Computer
Graphics, as well as in the article
Fast Antialiasing in the June 1992
issue of Dr. Dobb's Journal.
'/
'// Integer part of x
Function ipart(x As Single) As Integer
Return Int(x)
End Function
Function round(x As Single) As Integer
Return ipart(x + 0.5)
End Function
' fractional part of x
Function fpart(x As Single) As Single
If x < 0 Then Return 1 - (x - Fix(x))
Return x - Fix(x)
End Function
Function rfpart(x As Single) As Single
Return 1 - fpart(x)
End Function
Sub Plot(x As Short, y As Short, baseclr As Ulong, c As Single)
baseclr = (_Red(baseclr) * c) Shl 16 Or (_Green(baseclr) * c) Shl 8 Or (_Blue(baseclr) * c) Shl 0
*Cptr(Ulong Ptr, imgData2 + (Iif(y < 0, 0, Iif(y > sh - 1, sh - 1, y))) * pitch2 + (Iif(x < 0, 0, Iif(x > sw - 1, sw - 1, x))) Shl 2) = baseclr
End Sub
Sub DrawAALine(x0 As Single,y0 As Single,x1 As Single,y1 As Single, clr As Ulong)
Dim As Integer steep = Abs(y1 - y0) > Abs(x1 - x0)
Dim As Single dx,dy,gradient,xend,yend,xgap,xpxl1,ypxl1,xpxl2,ypxl2,intery
If steep Then
Swap x0, y0
Swap x1, y1
End If
If x0 > x1 Then
Swap x0, x1
Swap y0, y1
End If
dx = x1 - x0
dy = y1 - y0
gradient = dy / dx
' handle first endpoint
xend = round(x0)
yend = y0 + gradient * (xend - x0)
xgap = rfpart(x0 + 0.5)
xpxl1 = xend ' This will be used in the main Loop
ypxl1 = ipart(yend)
If steep Then
plot(ypxl1, xpxl1, clr, rfpart(yend) * xgap)
plot(ypxl1+1, xpxl1, clr, fpart(yend) * xgap)
Else
plot(xpxl1, ypxl1 , clr, rfpart(yend) * xgap)
plot(xpxl1, ypxl1+1, clr, fpart(yend) * xgap)
End If
intery = yend + gradient ' first y-intersection For the main Loop
' handle Second endpoint
xend = round(x1)
yend = y1 + gradient * (xend - x1)
xgap = fpart(x1 + 0.5)
xpxl2 = xend 'This will be used in the main Loop
ypxl2 = ipart(yend)
If steep Then
plot(ypxl2 , xpxl2, clr, rfpart(yend) * xgap)
plot(ypxl2+1, xpxl2, clr, fpart(yend) * xgap)
Else
plot(xpxl2, ypxl2, clr, rfpart(yend) * xgap)
plot(xpxl2, ypxl2+1, clr, fpart(yend) * xgap)
End If
' Line Loop
For x As Integer = xpxl1 + 1 To xpxl2 - 1
If steep Then
plot(ipart(intery) , x, clr, rfpart(intery))
plot(ipart(intery)+1, x, clr, fpart(intery))
Else
plot(x, ipart(intery), clr, rfpart(intery))
plot(x, ipart(intery)+1, clr, fpart(intery))
End If
intery = intery + gradient
Next
End Sub
|
Die linke Maustaste gedrückt halten und die Maus bewegen, um das Objekt zu drehen. Das Mausrad dient zum Zoomen. _________________ Gruß,
UEZ |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 23.02.2020, 16:19 Titel: Growing plant in the breeze v0.70 |
|
|
Vorschau:
Code: |
'Ported To FreeBasic by UEZ build 2020-02-23
'Original code by civet -> http://wa.zozuar.org/code.php?c=9KQy
#Define Min(a, b) (Iif(a < b, a, b))
#Define Max(a, b) (Iif(a > b, a, b))
#Define _Alpha(iCol) ((iCol And &hFF000000) Shr 24)
#Define _Red(iCol) ((iCol And &h00FF0000) Shr 16)
#Define _Green(iCol) ((iCol And &h0000FF00) Shr 8)
#Define _Blue(iCol) ((iCol And &h000000FF))
#Define Round(x) ((x + 0.5) Shr 0)
#Define fpart(x) (Frac(x))
#Define rfpart(x) (1 - Frac(x))
#Define Floor(x) (((x) * 2.0 - 0.5) Shr 1)
Const fPI = Acos(-1), fRAD = fPI / 180, fPI80 = fPI / 80
Const iW = 800, iH = 600, iW2 = iW \ 2, iH2 = iH \ 2
'https://en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algorithm
Sub DrawLineAAWu(pTarget As Any Ptr = 0, x0 As Short, y0 As Short, x1 As Short, y1 As Short, col As Ulong)
Dim As Boolean steep = Abs(y1 - y0) > Abs(x1 - x0)
If steep Then
Swap x0, y0
Swap x1, y1
End If
If x0 > x1 Then
Swap x0, x1
Swap y0, y1
End If
Dim As Short dx, dy, xend, yend, xgap, xpxl1, ypxl1, xpxl2, ypxl2
Dim As Single gradient, intery, f
Dim As Ulong _rgb = col And &h00FFFFFF
Dim As Ubyte a = _Alpha(col)
dx = x1 - x0
dy = y1 - y0
gradient = dy / dx
If dx = 0 Then gradient = 1
'handle first endpoint
xend = Round(x0)
yend = y0 + gradient * (xend - x0)
xgap = rfpart(x0 + 0.5)
xpxl1 = xend
ypxl1 = Floor(yend)
If steep Then
f = rfpart(yend) * xgap
Pset pTarget, (ypxl1, xpxl1), (a * f) Shl 24 Or _rgb
f = fpart(yend) * xgap
Pset pTarget, (ypxl1 + 1, xpxl1), (a * f) Shl 24 Or _rgb
Else
f = rfpart(yend) * xgap
Pset pTarget, (xpxl1, ypxl1), (a * f) Shl 24 Or _rgb
f = fpart(yend) * xgap
Pset pTarget, (xpxl1, ypxl1 + 1), (a * f) Shl 24 Or _rgb
End If
intery = yend + gradient
'handle second endpoint
xend = Round(x1)
yend = y1 + gradient * (xend - x1)
xgap = rfpart(x1 + 0.5)
xpxl2 = xend
ypxl2 = Floor(yend)
If steep Then
f = rfpart(yend) * xgap
Pset pTarget, (ypxl2, xpxl2), (a * f) Shl 24 Or _rgb
f = fpart(yend) * xgap
Pset pTarget, (ypxl2 + 1, xpxl2), (a * f) Shl 24 Or _rgb
Else
f = rfpart(yend) * xgap
Pset pTarget, (xpxl2, ypxl2), (a * f) Shl 24 Or _rgb
f = fpart(yend) * xgap
Pset pTarget, (xpxl2, ypxl2 + 1), (a * f) Shl 24 Or _rgb
End If
'main line
If steep Then
For x As Short = xpxl1 + 1 to xpxl2 - 1
f = rfpart(intery)
Pset pTarget, (Floor(intery), x), (a * f) Shl 24 Or _rgb
f = fpart(intery)
Pset pTarget, (Floor(intery) + 1, x), (a * f) Shl 24 Or _rgb
intery += gradient
Next
Else
For x As Short = xpxl1 + 1 to xpxl2 - 1
f = rfpart(intery)
Pset pTarget, (x, Floor(intery)), (a * f) Shl 24 Or _rgb
f = fpart(intery)
Pset pTarget, (x, Floor(intery) + 1), (a * f) Shl 24 Or _rgb
intery += gradient
Next
End If
End Sub
'Bresenham algorithm
Sub DrawLineThickAA(pTarget As Any Ptr = 0, x0 As Short, y0 As Short, x1 As Short, y1 As Short, col As Ulong, th As Single)
Dim As Single dx = Abs(x1 - x0), dy = Abs(y1 - y0)
Dim As Byte sx = Iif(x0 < x1, 1, -1), sy = Iif(y0 < y1, 1, -1)
Dim As Single ierr, e2 = Sqr(dx * dx + dy * dy)
If th <= 1 Or e2 = 0 Then
DrawLineAAWu(pTarget, x0, y0, x1, y1, col)
Else
dx *= 255 / e2
dy *= 255 / e2
th = 255 * (th - 1)
If dx < dy Then
x1 = Round((e2 + th / 2) / dy)
ierr = x1 * dy - th / 2
x0 -= x1 * sx
While y0 <> y1
x1 = x0
Pset pTarget, (x1, y0), Rgba(_Red(col), _Green(col), _Blue(col), Max(0, _Alpha(col) - ierr))
e2 = dy - ierr - th
While e2 + dy < 255
x1 += sx
Pset pTarget, (x1, y0), col
e2 += dy
Wend
Pset pTarget, (x1 + sx, y0), Rgba(_Red(col), _Green(col), _Blue(col), Max(0, _Alpha(col) - e2))
ierr += dx
If ierr > 255 Then
ierr -= dy
x0 += sx
End If
y0 += sy
Wend
Else
y1 = Round((e2 + th / 2) / dx)
ierr = y1 * dx - th / 2
y0 -= y1 * sy
While x0 <> x1
y1 = y0
Pset pTarget, (x0, y1), Rgba(_Red(col), _Green(col), _Blue(col), Max(0, _Alpha(col) - ierr))
e2 = dx - ierr - th
While e2 + dx < 255
y1 += sy
Pset pTarget, (x0, y1), col
e2 += dx
Wend
Pset pTarget, (x0, y1 + sy), Rgba(_Red(col), _Green(col), _Blue(col), Max(0, _Alpha(col) - e2))
ierr += dy
If ierr > 255 Then
ierr -= dx
y0 += sy
End If
x0 += sx
Wend
End If
End If
End Sub
Sub CreatePlantRecursive(pTarget As Any Ptr = 0,px As Single, py As Single, angle As Single, fStep As Single, _Len As Integer, fGrowth As Single, n As Integer)
If n > 0 Then
Dim As Single x1, y1, x2, y2, a_l, a_r, t = 0.1 * _len, f0, f1, f2
angle += 3 * Cos(fStep) - 2
f0 = angle * fRAD
f1 = Cos(f0)
f2 = Sin(f0)
x1 = px + t * f1
y1 = py - t * f2
x2 = px + _len * f1
y2 = py - _len * f2
DrawLineThickAA(pTarget, px, py, x2, y2, &hF0437C17, n - 1)
If n > 2 Then Line pTarget, (px, py) - (x2, y2), &h8052D017
If n = 1 Then Circle pTarget, (x2, y2), 2.5 * (1.5 + fGrowth), &hE87F38EC, , , , F
a_l = angle + 30
a_r = angle - 30
_len *= fGrowth
Dim As Integer i = n - 1
CreatePlantRecursive(pTarget, x2, y2, angle - 3 * Sin(fStep), fStep, _len, fGrowth, i)
CreatePlantRecursive(pTarget, x1, y1, a_l, fStep, _len * fGrowth,fGrowth, i)
CreatePlantRecursive(pTarget, x1, y1, a_r, fStep, _len * fGrowth,fGrowth, i)
CreatePlantRecursive(pTarget, x2, y2, a_l, fStep, _len * fGrowth,fGrowth, i)
CreatePlantRecursive(pTarget, x2, y2, a_r, fStep, _len * fGrowth,fGrowth, i)
End If
End Sub
'
' main
'
Randomize , 2
Screenres iW, iH, 32, 2, 100 'GFX_NO_SWITCH Or GFX_ALWAYS_ON_TOP Or GFX_ALPHA_PRIMITIVES
Screenset 1, 0
Windowtitle("Growing plant in the breeze v0.70")
Dim As Single n = 10, m = 10
Dim As Single fGrowth = 1 / 20, fStep
Dim As Integer iFPS = 0, iFPS_current = 0
Dim As Double fTimer = Timer
Do
Line (0, 0) - (iW - 1, iH - 1), &hF0FFFFFF, BF
CreatePlantRecursive(0, iW2, iH, 90, fStep, n, fGrowth, 5)
If n > 110 Then
CreatePlantRecursive(0, iW2, iH, 45, fStep, m, fGrowth, 4)
CreatePlantRecursive(0, iW2, iH, 135, fStep, m, fGrowth, 4)
fStep += fPI80 * Sin(-Cos(-Timer) + Timer) * 2
If fGrowth < 0.67 And n > 110 Then fGrowth += 0.001
End If
If n < 220 Then n += 0.5
If m < 111 And n > 110 Then m += 0.5
Draw String(1, 1), iFPS_current & " fps", Rgba(&h00, &h00, &hFF, &hFF)
If Timer - fTimer > 0.99 Then
iFPS_current = iFPS
iFPS = 0
fTimer = Timer
Else
iFPS += 1
End If
Flip
Sleep(10)
Loop Until Len(Inkey())
|
_________________ Gruß,
UEZ |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Roland Chastain

Anmeldungsdatum: 05.12.2011 Beiträge: 194 Wohnort: Frankreich
|
Verfasst am: 24.02.2020, 00:16 Titel: |
|
|
Sehr schön. Der Brise-Effekt ist sehr erfolgreich! |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 25.02.2020, 17:07 Titel: |
|
|
Wäre direkt etwas für einen elektronischen Bilderrahmen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 04.03.2020, 17:07 Titel: Magnifier build 2020-03-05 [Windows only] ^^ |
|
|
Das nächste Beispiel: Desktop Lupe.
Source Code: Pastebin
Vorschau:
Source Code + kompilierte Exe kann hier heruntergeladen werden: Mediafire.com _________________ Gruß,
UEZ |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 27.03.2020, 15:35 Titel: COVID-19 Ausbreitungssimulation |
|
|
Nicht wissenschaftliche Simulation der COVID-19 Ausbreitung.
Code: |
'Coded by UEZ build 2020-04-02
#include "string.bi"
#Define _Dist(x1, x2, y1, y2) (((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)))
#Define _Round(x) ((x + 0.5) Shr 0)
#Define Ceiling(x) (-((-(x) * 2.0 - 0.5) Shr 1))
#Define Map(a, b, c) (a / b * c)
Const iW = 1024, iH = 768, iPeople = 19999, iPSize = 1, iMaxSickDays = 14, fDaySpeed = 0.0075, iDayInoFound = 60, probDeath = 0.05, infProb = 0.25, gH = 100
Type vZone
Dim As Ushort x1, y1, x2, y2
Dim As Uinteger pp(iPeople + 1) 'index of people
Dim As Ulong c
End Type
Declare Sub Motion()
Declare Function RandomRange(fStart As Single, fEnd As Single) As Single
Declare Sub CreateGridZones(Zones() As vZone, iZones As Ushort, imgw As Ushort, imgh As Ushort)
Const As ULong iBGColor = &hFF000000
ScreenRes iW, iH, 32, 2, 100
ScreenSet 1, 0
Dim Shared As Any Ptr img, img_clr
img = Imagecreate(iW, iH, &hFF404040, 32)
img_clr = Imagecreate(iW, iH - gH, iBGColor, 32)
Randomize , 2
Dim Shared As Uinteger iPSize2, iPrevDaysPassed = 0
iPSize2 = iPSize^2
Dim Shared As Single fDaysPassed = 0
Type vPeople
Dim As Single x, y, vx, vy, sickdays, healthydays
Dim As Ulong c
Dim As Ubyte status, zone 'status: healthy = 0, infected = 1, cured = 2, dead = 3, inoculated = 4
End Type
Dim Shared As Ushort p0, iGridZones = 12^2
Dim Shared As vZone GridZone(iGridZones)
Dim As Uinteger i, j
CreateGridZones(GridZone(), iGridZones, iW, iH - gH)
iGridZones -= 1
For j = 0 To iGridZones 'create color for each grid zone for debugging purpose
GridZone(j).c = &h80000000 Or Culng(Rnd() * &hFFFFFF)
Next
Dim Shared As vPeople People(iPeople)
For i = 0 To iPeople
People(i).x = RandomRange(iPSize + 1, iW - iPSize - 1)
People(i).y = RandomRange(iPSize + 1, iH - iPSize - gH - 1)
People(i).c = &hFFFFFFFF
People(i).vx = 0.15 * Rnd() - 0.075
People(i).vy = 0.15 * Rnd() - 0.075
People(i).status = 0
People(i).sickdays = 0
People(i).healthydays = 0
Next
p0 = Cuint(Rnd * iPeople) 'gunman aka patient zero
People(p0).c = &hFFFF0000
People(p0).status = 1
'People(p0).vx *= 5
'People(p0).vy *= 4
Dim As Ulong iFPS = 0, iFPS_current = 0
Dim As Double fTimer = Timer
Do
Put img, (0, 0), img_clr, Pset
Motion()
Put (0, 0), img, Pset
Draw String(1, 1), iFPS_current & " fps", Rgba(&hF0, &hF0, &h10, &hFF)
Flip
fDaysPassed += fDaySpeed
If Timer - fTimer > 0.99 Then
iFPS_current = iFPS
iFPS = 0
fTimer = Timer
Else
iFPS += 1
End If
Sleep 1, 1
Loop Until Len(InKey())
Imagedestroy(img_clr)
Imagedestroy(img)
Sub Motion()
Dim As Uinteger i, j, k, l, iBucket, index, iHealthy = 0, iInfected = 0, iCured = 0, iDead = 0, iInoculated = 0
Static As Single cr = 0
Dim As Single t1, t2
For j = 0 To iGridZones 'reset amount if people in the bucket
GridZone(j).pp(0) = 0
'Line img, (GridZone(j).x1, GridZone(j).y1)-(GridZone(j).x2, GridZone(j).y2), GridZone(j).c, BF 'display GridZone for debugging
Next
For i = 0 To iPeople
'move each people if not dead
If People(i).status <> 3 Then 'skip dead people
People(i).x += People(i).vx
People(i).y += People(i).vy
End If
'check border collision
If People(i).x < 0 Or People(i).x > iW - iPSize - 1 Then People(i).vx *= -1
If People(i).y < 0 Or People(i).y > iH - iPSize - gh - 1 Then People(i).vy *= -1
'group people into GridZone for more efficient collision check afterwards
For j = 0 To iGridZones
If People(i).x > GridZone(j).x1 And People(i).x < GridZone(j).x2 - iPSize And People(i).y > GridZone(j).y1 And People(i).y < GridZone(j).y2 - iPSize Then
GridZone(j).pp(0) += 1
GridZone(j).pp(GridZone(j).pp(0)) = i
'People(i).c = GridZone(j).c
People(i).zone = j
Exit For
End If
Next
If fDaysPassed > 7 And People(i).status = 0 And Rnd() < 0.000000075 Then
If People(i).status = 0 Then People(i).status = 1 'make random people sick. People came back from infected country
End If
If People(i).status = 0 Then People(i).healthydays += fDaySpeed
If People(i).healthydays > iDayInoFound And People(i).status = 0 Then 'immunisation has been found -> inoculation started
If Rnd() < 0.0015 Then People(i).status = 4 'add a delay as not each people will be incoculated at the same time
End If
If People(i).sickdays > iMaxSickDays Then
People(i).sickdays = 0
If Rnd() < probDeath Then 'probability of death at 5%
People(i).status = 3
People(i).vx = 0
People(i).vy = 0
Else 'cured
People(i).status = 2
End If
End If
Select Case People(i).status
Case 0
iHealthy += 1
Case 1
People(i).sickdays += fDaySpeed
iInfected += 1
If i = p0 Then 'show patient zero with a circle during infection phase and color flash
People(p0).c = &hFF000000 Or (cr Shl 16)
cr += 10
t1 = iPSize / 2
'Circle img, (People(i).x + t1, People(i).y + t1), 2 * iPSize, &hFFC0C000
Else
People(i).c = &hFFF00000
End If
Case 2
iCured += 1
People(i).c = &hFF00F000
Case 3
iDead += 1
People(i).c = &hFFE238EC
Case 4
iInoculated += 1
People(i).c = &hFF2020FF
End Select
Line img, (People(i).x, People(i).y)-(People(i).x + iPSize, People(i).y + iPSize), People(i).c, BF
Next
'collision check of infected peoples
For i = 0 To iPeople
If People(i).status = 1 Then 'don't check dead and healty peoples
iBucket = GridZone(People(i).zone).pp(0)
For j = 1 To iBucket
index = GridZone(People(i).zone).pp(j)
If People(index).status = 0 And index <> i Then
If Int(_Dist(People(i).x, People(index).x, People(i).y, People(index).y)) <= iPSize2 And Rnd() > infProb Then 'infect people by 75% probability
People(index).status = 1
'increase the speed of infection
'People(index).vx *= -1
'People(index).vy *= -1
'decrease the speed of infection -> infected people will move reverse direction on infection
'People(i).vx *= -1
'People(i).vy *= -1
End If
End If
Next
End If
Next
Dim As Ushort iSum = iHealthy + iCured + iInoculated
Windowtitle("Corona Infection Simulation by UEZ / h: " & iSum & ", inf: " & iInfected & Format(iInfected / (iPeople - iDead), " (0.00%)") & _
", c: " & iCured & ", d: " & iDead & Format(iDead / (iPeople + 1), " (0.00%)") & _
", ino: " & iInoculated & ", day: " & Format(fDaysPassed, "#"))
Static As Single posx = 0
If posx <= iW Then
If Cushort(fDaysPassed) Mod 7 = 0 And fDaysPassed > 1 And iPrevDaysPassed < Cushort(fDaysPassed) Then
Line img, (posx, iH - gH)-(posx, iH), &hFF000000
iPrevDaysPassed = fDaysPassed
'posx += 1
Else
t2 = gH / (iPeople + 1)
Line img, (posx, iH)-(posx, iH - (iHealthy * t2)), &h40FFFFFF
Line img, (posx, iH)-(posx, iH - (iInfected * t2)), &h40FF0000
If iDead Then Line img, (posx, iH)-(posx, iH - (iDead * t2)), &hF0E238EC
If iCured Then Line img, (posx, iH - gH)-(posx, iH - gH + (iCured * t2)), &h4000F000
If iInoculated Then Line img, (posx, iH - gH)-(posx, iH - gH + (iInoculated * t2)), &hF02020FF
End If
posx += fDaySpeed * 10
End If
End Sub
'Original code by Neptilo @ https://math.stackexchange.com/questions/466198/algorithm-to-get-the-maximum-size-of-n-squares-that-fit-into-a-rectangle-with-a
'Modified by UEZ
Sub CreateGridZones(Zones() As vZone, iZones As Ushort, imgw As Ushort, imgh As Ushort)
Dim As Single ratio = Iif(Frac(Sqr(iZones)) = 0, 1, Iif(imgw >= imgh, imgw / imgh, imgh / imgw))
Dim As Single ncols_float = Sqr(iZones * ratio), nrows_float = iZones / ncols_float
'Find best option filling the whole height
Dim As Uinteger nrows1 = Ceiling(nrows_float), ncols1 = Ceiling(iZones / nrows1)
While nrows1 * ratio < ncols1
nrows1 += 1
ncols1 = Ceiling(iZones / nrows1)
Wend
Dim As Single cell_size1 = imgh / nrows1
'Find best option filling the whole width
Dim As Uinteger ncols2 = Ceiling(ncols_float), nrows2 = Ceiling(iZones / ncols2)
While ncols2 < nrows2 * ratio
ncols2 += 1
nrows2 = Ceiling(iZones / ncols2)
Wend
Dim As Single cell_size2 = imgw / ncols2
'Find the best values
Dim As Uinteger nrows, ncols
If cell_size1 < cell_size2 Then
nrows = nrows1
ncols = ncols1
Else
nrows = nrows2
ncols = ncols2
End If
Dim As Uinteger i,j, k, x, y
Dim As Integer dz = iZones - (nrows * ncols), bz = Iif(dz <> 0, 1, 0)
Dim As Single dx = imgw / ncols, dy = imgh / nrows
For j = 0 To nrows - 1 - bz
For i = 0 To ncols - 1
x = Cuint(i * dx)
Zones(k).x1 = x
Zones(k).x2 = x + dx
Zones(k).y1 = (j Mod nrows) * dy
Zones(k).y2 = Zones(k).y1 + dy
k += 1
Next
Next
If bz Then
ncols = iZones - k
dx = imgw / ncols
For i = 0 To ncols - 1
x = Cuint(i * dx)
Zones(k).x1 = x
Zones(k).x2 = x + dx
Zones(k).y1 = (j Mod nrows) * dy
Zones(k).y2 = Zones(k).y1 + dy
k += 1
Next
End If
End Sub
Function RandomRange(fStart As Single, fEnd As Single) As Single
Return Rnd() * (fEnd - fStart) + fStart
End Function
|
h: Anzahl gesunder Pixels (weiß + grün + blau)
inf: infizierte Pixels (rot)
c: geheilte Pixels (grün)
d: tote Pixels (lila)
ino: geimpfte Pixels (blau)
Am besten als x64 und -gen gcc -O 3 -s gui kompilieren. _________________ Gruß,
UEZ |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 18.04.2020, 14:17 Titel: Twister Effect build 2020-04-17 |
|
|
Code: | 'Ported to FreeBasic by UEZ build 2020-04-17
'Original code by neur0sys -> 'https://codepen.io/neuro_sys/pen/QpxMvp
#Include "fbgfx.bi"
#include "file.bi"
Using FB
#Define PixelSet(_x, _y, colour) *Cptr(Ulong Ptr, imgData + (_y) * pitch + (_x) Shl 2) = (colour)
#Define PixelGet(_x, _y, iArrayPos) *Cptr(Ulong Ptr, aImageInfoData(iArrayPos) + (_y) * aImageInfoPitch(iArrayPos) + (_x) Shl 2)
#Define LinearInterpolate(a1, a2, m) ((a1 * (1 - m) + a2 * m))
#Define Alpha(colors) ((colors Shr 24) And 255)
#Define Red(colors) ((colors Shr 16) And 255)
#Define Green(colors) ((colors Shr 8) And 255)
#Define Blue(colors) (colors And 255)
'https://en.wikipedia.org/wiki/BMP_file_format
Type tBitmap_Header Field = 1 '54 bytes
As UShort bfType 'for windows bitmap it must be 19778 (&h4D42) aka "BM" in little-endian format
As Long bfSize
As ULong bfReserved
As ULong bfOffBits
As ULong biSize
As Long biWidth = 0
As Long biHeight = 0
As Ushort biPlanes
As Ushort biBitCount
As ULong biCompression
As ULong biSizeImage
As Long biXPelsPerMeter
As Long biYPelsPerMeter
As ULong biClrUsed
As ULong biClrImportant
End Type
Declare Sub drawTextureLineH(x As Ushort, y As Ushort, k As Ushort, p As Ubyte, bf as Single = 0.90)
Declare Function Regulate(Byval MyFps As Long,Byref fps As Long) As Long
Declare Function GetBitmapHeaderInfo(filename As String) As tBitmap_Header
Dim As String sFile = CurDir & "/Test1.bmp" 'read 1st image to get the image dimension.
Dim As tBitmap_Header BmpInfo = GetBitmapHeaderInfo(sFile)
If BmpInfo.biWidth = 0 Or BmpInfo.biHeight = 0 Then
BmpInfo.biWidth = 1200 : BmpInfo.biHeight = 200
End If
Dim Shared As Ushort iW, iH, iW2, iH2, amp, iCenter, iDir, barpos = 0
If BmpInfo.biWidth < BmpInfo.biHeight Then barpos = 1 ' pos = 0 = horizontal, 1 = vertical
iW = Iif(barpos = 1, BmpInfo.biWidth * 1.5, BmpInfo.biWidth) : iH = Iif(barpos = 0, BmpInfo.biHeight * 1.5, BmpInfo.biHeight)
amp = Iif(barpos = 0, BmpInfo.biHeight \ 2, BmpInfo.biWidth \ 2) : iDir = Iif(barpos = 0, iW, iH) : iCenter = Iif(barpos = 0, iH \ 2, iW \ 2)
Const fPI = Acos(-1), fRAD = fPI / 180, surfaces = 4, angle = 360 / surfaces 'surfaces must be greater than 1
Dim As Ushort i, s, j, aSurfaces(surfaces)
Dim As Single t, freq, c, d
Screenres iW, iH, 32, , GFX_WINDOWED Or GFX_NO_SWITCH Or GFX_ALWAYS_ON_TOP Or GFX_ALPHA_PRIMITIVES
Windowtitle("Twister Effect v0.85")
Dim Shared As Integer w, h, pitch, w2, h2
Dim Shared As Any Pointer imgData
Dim Shared As Any Ptr pImage, aImages(0 To surfaces - 1), aImageInfoData(0 To surfaces - 1)
Dim Shared As Integer aImageInfoPitch(0 To surfaces - 1)
pImage = Imagecreate(iW, iH, , 32)
Randomize Timer, 2
For i = 0 To surfaces - 1 'all images must have same dimension!
aImages(i) = Imagecreate(BmpInfo.biWidth, BmpInfo.biHeight, &hFF000000 Or Rnd() * &hFFFFFF, 32)
Bload(CurDir & "/Test" & i + 1 & ".bmp", aImages(i))
Imageinfo(aImages(i), w2, h2, , aImageInfoPitch(i), aImageInfoData(i))
Next
Imageinfo(pImage, w, h, , pitch, imgData)
Dim As Ulong iFPS = 0
Do
Screenlock
Line pImage, (0, 0) - (iW, iH), &hF0404040, BF
t = Cos(d / 50) * iDir
d += 1.5
freq = Sin(d / 125) / 4
For j = 0 To iDir - 1
c = (j + t) * freq
For i = 0 To surfaces - 1
aSurfaces(i) = iCenter + Sin((c + angle * i) * fRAD) * amp
Next
For i = 0 To surfaces - 2
If aSurfaces(i) < aSurfaces(i + 1) Then
Select Case barpos
Case 0
drawTextureLineH(j, aSurfaces(i), aSurfaces(i + 1) - aSurfaces(i), i)
Case 1
drawTextureLineH(aSurfaces(i), j, aSurfaces(i + 1) - aSurfaces(i), i)
End Select
End If
Next
aSurfaces(i) = iCenter + Sin((c + angle * i) * fRAD) * amp
If aSurfaces(i) < aSurfaces(0) Then
Select Case barpos
Case 0
drawTextureLineH(j, aSurfaces(i), aSurfaces(0) - aSurfaces(i), i)
Case 1
drawTextureLineH(aSurfaces(i), j, aSurfaces(0) - aSurfaces(i), i)
End Select
End If
Next
Put (0, 0), pImage, Alpha
Draw String(1, 1), iFPS & " fps", Rgba(&hFF, &h00, &h00, &hFF)
Screenunlock
Sleep (Regulate(30, iFPS), 1)
Loop Until Len(Inkey())
Imagedestroy(pImage)
For i = 0 To surfaces - 1
Imagedestroy(aImages(i))
Next
End
Sub drawTextureLineH(x As Ushort, y As Ushort, k As Ushort, p As Ubyte, bf as Single = 0.90)
Dim As Ushort u, v
Dim As Ulong texel
Dim As Single f, r, g, b
For i As Ushort = 0 To k - 1
Select Case barpos
Case 0
u = LinearInterpolate(0, w2, x / iW)
v = LinearInterpolate(0, h2, i / k)
Case 1
u = LinearInterpolate(0, w2, i / k)
v = LinearInterpolate(0, h2, y / iH)
End Select
texel = PixelGet(u, v, p)
f = k / amp * bf
r = Red(texel) * f
r = Iif(r > 255, 255, r)
g = Green(texel) * f
g = Iif(g > 255, 255, g)
b = Blue(texel) * f
b = Iif(b > 255, 255, b)
Select Case barpos
Case 0
PixelSet(x, y + i, Rgba(r, g, b, &hF8))
Case 1
PixelSet(x + i, y, Rgba(r, g, b, &hF8))
End Select
Next
End Sub
Function Regulate(MyFps As Long, Byref fps As Long) As Long 'by dodicat
Static As Double timervalue, _lastsleeptime, t3, frames
Var t = Timer
frames += 1
If (t - t3) >= 1 Then t3 = t : fps = frames : frames = 0
Var sleeptime =_lastsleeptime + ((1 / myfps) - t + timervalue) * 1000
If sleeptime < 1 Then sleeptime = 1
_lastsleeptime = sleeptime
timervalue = t
Return sleeptime
End Function
Function GetBitmapHeaderInfo(filename As String) As tBitmap_Header
Dim As tBitmap_Header BmpInfo
If FileExists(filename) = 0 Then Return BmpInfo
Dim As Integer f
f = FreeFile
Open filename For Binary As #f
Get #f, , BmpInfo
Close #f
Return BmpInfo
End Function |
Kompilierte Version (Windows) inkl. Souce Code + Bilder kann hier heruntergeladen werden: FB_Twister_Effect.zip
Ohne die Bilder wird jede Oberfläche mit einer zufälligen Farbe dargestellt.
Läuft am schnellsten, wenn man mit -gen gcc -Wc -Ofast -s gui kompiliert. _________________ Gruß,
UEZ |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 24.04.2020, 14:30 Titel: Atomic Cell World |
|
|
Code: |
'Coded by UEZ build 2020-04-22
#Include "fbgfx.bi"
Using FB
Const iW = 800, iH = 600
Dim Shared As Ulong Ptr pScrn
Sub _Circle(x As Short, y As Short, r As Short, c As Ulong)
Dim As Short cy, r2 = r * r
Dim As Ulong cx, cyy, py, px1, px2, xx
For cy = -r to r
cx = Sqr(r2 - cy * cy) + 0.5
cyy = cy + y ': cyy = Iif(cyy > iH - 1, iH - 1, cyy)
py = cyy * iW + x
px1 = py - cx
px2 = py + cx
For xx = px1 To px2 'fill circle
pScrn[xx] = c
Next
Next
End Sub
Screenres iW, iH, 32, 2, GFX_WINDOWED Or GFX_NO_SWITCH Or GFX_ALWAYS_ON_TOP 'Or GFX_ALPHA_PRIMITIVES
ScreenSet 1, 0
Windowtitle("Atomic Cell World v0.50 by UEZ")
pScrn = Screenptr()
Type tPoint
As Single x, y, vx, vy, s
As Ubyte r, g, b
End Type
Dim As Ubyte AmountBalls = 50, BallSize = 100, i
Dim As Single j, c, d, e, cc = 255 / BallSize, fSpeed = 2 'BallSize / 255
Dim As tPoint Points(AmountBalls - 1)
Dim As Ulong iFPS
Randomize Timer, 2
For i = 0 To AmountBalls - 1
Points(i).x = BallSize + Rnd() * (iW - 2 * BallSize - 1)
Points(i).y = BallSize + Rnd() * (iH - 2 * BallSize - 1)
Points(i).vx = Rnd() - 0.5
Points(i).vy = Rnd() - 0.5
Points(i).r = Rnd() * 255 'Iif(Rnd() > 0.50, 1, 0)
Points(i).g = 0 'Iif(Rnd() > 0.50, 1, 0)
Points(i).b = 0 'Iif(Rnd() > 0.50, 1, 0)
Next
Dim As Ushort cfps = 0, currfps = 0
Dim As Single curAvFPS = 0, fTimer = Timer
Do
'Cls
'Line (0, 0)-(iW - 1, iH - 1), &hFF000000, BF
Line (1, 1)-(200, 10), 0, BF
For j = 1 To BallSize Step fSpeed
c = (j * cc) Shl 8
d = (BallSize - j) '- Abs(Sin((j + e) / 100) * 50)
'e += 0.001
For i = 0 To AmountBalls - 1
'Circle(Points(i).x, Points(i).y), d, c, , , , F
'_Circle(Points(i).x, Points(i).y, d, Rgb(Iif(Points(i).r, c, 0), Iif(Points(i).g, c, 0), Iif(Points(i).b, c, 0))) 'different color
_Circle(Points(i).x, Points(i).y, d, c) 'static color
Next
Next
For i = 0 To AmountBalls - 1
Points(i).x += Points(i).vx
Points(i).y += Points(i).vy
If Points(i).x < BallSize Or Points(i).x > (iW - BallSize) Then Points(i).vx = -Points(i).vx
If Points(i).y < BallSize Or Points(i).y > (iH - BallSize) Then Points(i).vy = -Points(i).vy
Next
Draw String(1, 1), iFPS & " fps / average: " & Str(Cushort(curAvFPS) + 1) & " fps", Rgb(&hFF, &hFF, &hFF)
Flip
cfps += 1
currfps += 1
curAvFPS += (iFPS - curAvFPS) / currfps
If Timer - fTimer > 0.99 Then
iFPS = cfps
cfps = 0
fTimer = Timer
End If
Sleep(1)
Loop Until Len(Inkey())
|
_________________ Gruß,
UEZ |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 30.04.2020, 08:58 Titel: Hungry Greedy Worm |
|
|
Code: |
'Ported to FB by UEZ build 2020-06-16
'Original code by EliK -> https://www.openprocessing.org/sketch/875675
'Thanks to dodicat for the Regulate function
#Include "fbgfx.bi"
Using FB
Const iW = 1000, iH = 600, maxLength = 128
Sub DrawCircleAA(xm As Short, ym As Short, r As Short, col As Ulong) 'Alois Zingl -> https://github.com/w8r/bresenham-zingl
Dim As Long x = -r, y = 0, x2, e2, ierr = 2 - 2 * r, a, a1, a2, c
Dim As Ulong iCol
r = 1 - ierr
While x < 0
c = 255 * Abs(ierr - 2 * (x + y) - 2) / r
a1 = c / 255 : a2 = (1 - a1) * 255
iCol = (255 - c) Shl 24 Or (col And &hFFFFFF)
Pset(xm + x, ym - y), icol
Pset(xm + y, ym + x), icol
Pset(xm - x, ym + y), icol
Pset(xm - y, ym - x), icol
e2 = ierr
x2 = x
If (ierr + y > 0) Then
c = 255 * (ierr - 2 * x - 1) / r
If c < 256 Then
a1 = c / 255 : a2 = (1 - a1) * 255
iCol = (255 - c) Shl 24 Or (col And &hFFFFFF)
Pset(xm + x, ym - y - 1), icol
Pset(xm + y + 1, ym + x ), icol
Pset(xm - x, ym + y + 1), icol
Pset(xm - y - 1, ym - x ), icol
End If
x += 1
ierr += x * 2 + 1
End If
If e2 + x2 <= 0 Then
c = 255 * (2 * y + 3 - e2) / r
If c < 256 Then
a1 = c / 255 : a2 = (1 - a1) * 255
iCol = (255 - c) Shl 24 Or (col And &hFFFFFF)
Pset(xm + x2 + 1, ym - y ), icol
Pset(xm + y , ym + x2 + 1), icol
Pset(xm - x2 - 1, ym + y ), icol
Pset(xm - y , ym - x2 - 1), icol
End If
y += 1
ierr += y * 2 + 1
End If
Wend
End Sub
Function Regulate(TargetFPS As Long, Byref fps As Long) As Long 'by dodicat
Static As Double timervalue, _lastsleeptime, t3, frames
Var t = Timer
frames += 1
If (t - t3) >= 1 Then t3 = t : fps = frames : frames = 0
Var sleeptime =_lastsleeptime + ((1 / TargetFPS) - t + timervalue) * 1000
If sleeptime < 1 Then sleeptime = 1
_lastsleeptime = sleeptime
timervalue = t
Return sleeptime
End Function
Type Worm
Public:
Declare Constructor()
Declare Destructor()
Declare Sub Init()
Declare Sub Draw()
Private:
As Ushort up, up2, c, wormSize, dist, speed
As Single x2, y2, tx, ty, t, WormSlices(Any, Any)
End Type
Constructor Worm()
Redim WormSlices(maxLength, 1)
Init()
End Constructor
Destructor Worm()
Redim WormSlices(0, 0)
End Destructor
Sub Worm.Init()
Randomize Timer, 5
x2 = 500 :tx = 510 :y2 = -600 : ty = 0 : t = 0 : up = 0 : up2 = 0 : c = 0 : wormSize = 25 : dist = 60 : speed = 17.5
End Sub
Sub Worm.Draw()
Static As Ulong FPS
Dim As Single tt
'Cls
Line (0, 0)-(iW, iH), &hF0FFFFFF, BF
t += 1
If t < 5 Then
up = Iif(Rnd() > 0.5, 1, 0)
up2 = Iif(Rnd() > 0.5, 1, 0)
End If
tt = t / speed
If up = 0 Then tx -= tt
If up = 1 Then tx += tt
If up2 = 0 Then ty -= tt
If up2 = 1 Then ty += tt
If t > dist Then t = 0
If tx > x2 Then x2 += (tx - x2) / dist
If tx < x2 Then x2 -= (x2 - tx) / dist
If ty > y2 Then y2 += (ty - y2) / dist
If ty < y2 Then y2 -= (y2 - ty) / dist
If c < maxLength + 1 Then 'fill up array first
WormSlices(c, 0) = x2
WormSlices(c, 1) = y2
c += 1
Else
'simulation of the JavaScript slice array function
For i As Ushort = 0 To maxLength - 1 'shift array values from top to down
WormSlices(i, 0) = WormSlices(i + 1, 0)
WormSlices(i, 1) = WormSlices(i + 1, 1)
Next
'add new element to top
WormSlices(maxLength, 0) = x2
WormSlices(maxLength, 1) = y2
End If
Dim as UShort s
Static as Single k = 0
Dim As Single h, p
Static As Single e1 = 0
'draw
For i As Ushort = 0 To c - 1
If WormSlices(i, 0) > iW Then up = 0
If WormSlices(i, 1) > iH Then up2 = 0
If WormSlices(i, 0) < 0 Then up = 1
If WormSlices(i, 1) < 0 Then up2 = 1
s = IIf(i > c - 12, wormSize - 12 + (c - i), iif(i < 17.5, wormSize - 17.5 + i, wormSize))
h = Sin(k / 2500 - (i shl 1)) * 8
If i = c - 1 Then
Circle(WormSlices(i, 0), WormSlices(i, 1)), s, &hF0B07A69, , , , F ''draw head
DrawCircleAA(WormSlices(i, 0), WormSlices(i, 1), s + 0.5, &h6E5326)
Circle(WormSlices(i, 0), WormSlices(i, 1)), Abs((s * 0.25) * Sin(e1)), &h60000000, , , , F 'mouth
e1 += 0.05
Else
p = s + h
Circle(WormSlices(i, 0), WormSlices(i, 1)), p, &h58FA8D1B, , , , F
DrawCircleAA(WormSlices(i, 0), WormSlices(i, 1), p + 0.5, &h6E5326)
end if
k += 1
Next
Dim As Ushort o = wormSize Shr 1
'draw food
Circle(tx, ty), o, &hE0FF0000, , , , F
DrawCircleAA(tx, ty, o, &hFFFF0000)
.Draw String (tx + o + 10, ty), "Yumyum", &hFF20B020
.Draw String (4, 4), Str(FPS) + " fps", &hFF000000
'Screensync
Flip
Sleep(Regulate(60, FPS), 1)
End Sub
'ScreenControl SET_DRIVER_NAME, "GDI"
Screenres iW, iH, 32, 2, GFX_WINDOWED Or GFX_NO_SWITCH Or GFX_ALWAYS_ON_TOP Or GFX_ALPHA_PRIMITIVES Or GFX_HIGH_PRIORITY
ScreenSet 1, 0
Windowtitle("Greedy Worm")
Color , &hFFFFFFFF
Cls
Dim As Worm Worms
Worms.Init
Do
Worms.Draw
Loop Until Len(Inkey())
|
_________________ Gruß,
UEZ
Zuletzt bearbeitet von UEZ am 16.06.2020, 11:17, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 30.04.2020, 13:28 Titel: |
|
|
Da es hier ja naturbedingt immer recht wenig Rückmeldung gibt, will ich mich doch mal rühren: Da sind immer wieder sehr hübsche Sachen dabei, und auch der Wurm gefällt mir wieder sehr gut!  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 30.04.2020, 20:43 Titel: |
|
|
nemored hat Folgendes geschrieben: | Da es hier ja naturbedingt immer recht wenig Rückmeldung gibt, will ich mich doch mal rühren: Da sind immer wieder sehr hübsche Sachen dabei, und auch der Wurm gefällt mir wieder sehr gut!  |
Danke für dein Feedback.
Wenn ich mich anhand der Rückmeldungen richten würde, dürfte ich kaum was posten.
Aber "naturbedingt"? Wie meinst du das? _________________ Gruß,
UEZ |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 01.05.2020, 20:31 Titel: |
|
|
Ich bin schon lange genug im Forum um zu wissen, dass Rückmeldungen zu Programmen allgemein sehr spärlich sind
Liegt natürlich auch sehr stark an der kleinen Community. Solange dich das nicht beunruhigt und du weiter postest, ist ja alles gut. Ich schaue mir die Pogramme jedenfalls immer wieder gerne an.
Ich wünschte, ich käme auch mal wieder zum Programmieren - im Moment komme ich, wenn ich sehr fleißig bin, auf 100 Zeilen im Monat ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 10.07.2020, 08:51 Titel: Einfaches Feuerwerk |
|
|
Fireworks v0.50.bas (ohne Sound):
Code: |
'Fireworks v0.50 build 2020-07-13 beta coded by UEZ
'Credits To:
' D.J.Peters aka Joshy For the SimplexNoise2D() Function
' dodicat For the Regulate() Function
#Include "fbgfx.bi"
#Include "String.bi"
Using FB
Dim As String sTitle = "Simple Fireworks v0.50 build 2020-07-13 beta coded by UEZ"
Declare Function RandomRange(fStart As Single, fEnd As Single) As Single
Declare Function Regulate(Byval MyFps As Long,Byref fps As Long=0) As Long
Dim Shared As Integer iDW, iDH, scrw, scrh
Screencontrol GET_DESKTOP_SIZE, iDW, iDH
scrw = iDW * 0.95
scrh = iDH * 0.85
Const iParticlesTail = 6, fGravity = 0.75, fRad = Acos(-1) / 180
Randomize Timer, 2
'--------------------------------------------------------------------------------------------------
Type float As Single 'Double
Dim Shared As Integer perm(512) = { _
151,160,137, 91, 90, 15,131, 13,201, 95, 96, 53,194,233, 7,225,_
140, 36,103, 30, 69,142, 8, 99, 37,240, 21, 10, 23,190, 6,148, _
247,120,234, 75, 0, 26,197, 62, 94,252,219,203,117, 35, 11, 32, _
57,177, 33, 88,237,149, 56, 87,174, 20,125,136,171,168, 68,175, _
74,165, 71,134,139, 48, 27,166, 77,146,158,231, 83,111,229,122, _
60,211,133,230,220,105, 92, 41, 55, 46,245, 40,244,102,143, 54, _
65, 25, 63,161, 1,216, 80, 73,209, 76,132,187,208, 89, 18,169, _
200,196,135,130,116,188,159, 86,164,100,109,198,173,186, 3, 64, _
52,217,226,250,124,123, 5,202, 38,147,118,126,255, 82, 85,212, _
207,206, 59,227, 47, 16, 58, 17,182,189, 28, 42,223,183,170,213, _
119,248,152, 2, 44,154,163, 70,221,153,101,155,167, 43,172, 9, _
129, 22, 39,253, 19, 98,108,110, 79,113,224,232,178,185,112,104, _
218,246, 97,228,251, 34,242,193,238,210,144, 12,191,179,162,241, _
81, 51,145,235,249, 14,239,107, 49,192,214, 31,181,199,106,157, _
184, 84,204,176,115,121, 50, 45,127, 4,150,254,138,236,205, 93, _
222,114, 67, 29, 24, 72,243,141,128,195, 78, 66,215, 61,156,180, _
151,160,137, 91, 90, 15,131, 13,201, 95, 96, 53,194,233, 7,225,_
140, 36,103, 30, 69,142, 8, 99, 37,240, 21, 10, 23,190, 6,148, _
247,120,234, 75, 0, 26,197, 62, 94,252,219,203,117, 35, 11, 32, _
57,177, 33, 88,237,149, 56, 87,174, 20,125,136,171,168, 68,175, _
74,165, 71,134,139, 48, 27,166, 77,146,158,231, 83,111,229,122, _
60,211,133,230,220,105, 92, 41, 55, 46,245, 40,244,102,143, 54, _
65, 25, 63,161, 1,216, 80, 73,209, 76,132,187,208, 89, 18,169, _
200,196,135,130,116,188,159, 86,164,100,109,198,173,186, 3, 64, _
52,217,226,250,124,123, 5,202, 38,147,118,126,255, 82, 85,212, _
207,206, 59,227, 47, 16, 58, 17,182,189, 28, 42,223,183,170,213, _
119,248,152, 2, 44,154,163, 70,221,153,101,155,167, 43,172, 9, _
129, 22, 39,253, 19, 98,108,110, 79,113,224,232,178,185,112,104, _
218,246, 97,228,251, 34,242,193,238,210,144, 12,191,179,162,241, _
81, 51,145,235,249, 14,239,107, 49,192,214, 31,181,199,106,157, _
184, 84,204,176,115,121, 50, 45,127, 4,150,254,138,236,205, 93, _
222,114, 67, 29, 24, 72,243,141,128,195, 78, 66,215, 61,156,180}
Function SimplexNoise2D(xin As float, yin As float, scale As float = 20.0) As float 'by D.J.Peters aka Joshy
Const As float F2 = 0.5*(Sqr(3.0)-1.0)
Const As float G2 = (3.0-Sqr(3.0))/6.0
Const As float G22 = G2 + G2
Static As Integer grad2(11,1) = {{ 1, 1},{-1, 1},{1,-1},{-1,-1}, _
{ 1, 0},{-1, 0},{1, 0},{-1, 0}, _
{ 0, 1},{ 0,-1},{0, 1},{ 0,-1}}
Dim As float s = (xin+yin)*F2
Dim As Integer i = Int(xin+s)
Dim As Integer j = Int(yin+s)
Dim As float t = (i+j)*G2
Dim As float x = i-t , y = j-t
Dim As float x0 = xin-x, y0 = yin-y
Dim As Integer i1=Any, j1=Any
i And=255
j And=255
If (x0>y0) Then
i1=1: j1=0
Else
i1=0: j1=1
End If
Dim As float x1 = x0 - i1 + G2
Dim As float y1 = y0 - j1 + G2
Dim As float x2 = x0 - 1.0 + G22
Dim As float y2 = y0 - 1.0 + G22
Dim As Integer ii = i 'And 255
Dim As Integer jj = j 'And 255
Dim As Integer ind = Any
Dim As float n=Any
t = 0.5 - x0*x0-y0*y0
If (t<0) Then
n=0
Else
ind = perm(i+perm(j)) Mod 12
n = t*t*t*t * (grad2(ind,0)*x0 + grad2(ind,1)*y0)
End If
t = 0.5 - x1*x1-y1*y1
If (t<0) Then
Else
ind = perm(i+i1+perm(j+j1)) Mod 12
n+= t*t*t*t * (grad2(ind,0)*x1 + grad2(ind,1)*y1)
End If
t = 0.5 - x2*x2-y2*y2
If(t<0) Then
Else
i+=1:j+=1
ind= perm(i+perm(j)) Mod 12
n+= t*t*t*t * (grad2(ind,0)*x2 + grad2(ind,1)*y2)
End If
' scaled in the interval [-1,1].
Return scale * n
End Function
'--------------------------------------------------------------------------------------------------
Type tagBoom
As Single power
As Single x
As Single y
As Single vx
As Single vy
As Ubyte r
As Ubyte g
As Ubyte b
As Ubyte a
As Single size
As Ubyte flag1
End Type
Type Kaboom
Public:
Declare Constructor()
Declare Destructor()
Declare Sub init()
Declare Sub update()
As Boolean detonate, set
As Single rocketx, rockety, rocketvx, rocketvy, radius, life, heigh, power
As tagBoom Boom(5000)
As Ubyte r, g, b, a, rr, gg, bb, aa, c1, c2
As Ulong particles
As Ubyte KType, flimmer
End Type
Constructor Kaboom()
This.Init()
End Constructor
Destructor Kaboom()
End Destructor
Sub Kaboom.init()
This.detonate = False
This.set = False
This.rocketx = scrw / 2 + RandomRange(-scrw / 10, scrw / 10)
This.rockety = scrh
This.rocketvx = RandomRange(-5, 5)
This.rocketvy = -(5 + Rnd() * 5)
This.heigh = scrh * 0.15 + Rnd() * (scrh * 0.30)
This.life = 255
This.power = 0.99 - Rnd() * 0.03
This.r = &hA0
This.g = &hA0
This.b = &hA0
This.a = &hFF
This.rr = &h40 + Rnd() * &h6F
This.gg = &h40 + Rnd() * &h6F
This.bb = &h40 + Rnd() * &h6F
This.c1 = 0
This.flimmer = 0
If Rnd() > 0.75 Then This.flimmer = 1
This.particles = 100 + Rnd() * 600
Dim As Single RndRGBColor = Rnd()
This.ktype = Cubyte(RandomRange(1, 3))
Select Case This.ktype
Case 3
Dim As Single h, g = 360 / (This.particles - 1), r
For i As Ulong = 0 To This.particles - 1
This.Boom(i).power = 0.5 + Rnd() * 7
This.Boom(i).vx = Sin(h * fRad) * This.Boom(i).power
This.Boom(i).vy = Cos(h * fRad) * This.Boom(i).power
If This.Boom(i).power > 6 - Rnd() * 2 Then
This.Boom(i).size = 2
Select Case RndRGBColor
Case 0 To 0.33
This.Boom(i).r = 250
This.Boom(i).g = Rnd() * &h7F
This.Boom(i).b = Rnd() * &h7F
Case 0.34 To 0.66
This.Boom(i).r = Rnd() * &h7F
This.Boom(i).g = 250
This.Boom(i).b = Rnd() * &h7F
Case Else
This.Boom(i).r = Rnd() * &h7F
This.Boom(i).g = Rnd() * &h7F
This.Boom(i).b = 250
End Select
This.Boom(i).a = This.a
Else
This.Boom(i).size = 1.333
This.Boom(i).r = This.rr
This.Boom(i).g = This.gg
This.Boom(i).b = This.bb
This.Boom(i).a = This.aa
End If
h += g
Next
Case 2
For i As Ulong = 0 To This.particles - 1
This.Boom(i).size = 1.333
This.Boom(i).vx = RandomRange(-1.0, 1.0) * (0.5 + Rnd() * 5)
This.Boom(i).vy = RandomRange(-1.0, 1.0) * (0.5 + Rnd() * 5)
This.Boom(i).r = This.r + Rnd() * &h5F
This.Boom(i).g = This.g + Rnd() * &h4F
This.Boom(i).b = This.b + Rnd() * &h4F
This.Boom(i).a = This.a
Next
Case 1
Dim As Single h, g = 360 / (This.particles - 1), r
For i As Ulong = 0 To This.particles - 1
This.Boom(i).power = 0.5 + Rnd() * 7
This.Boom(i).vx = Sin(h * fRad) * This.Boom(i).power
This.Boom(i).vy = Cos(h * fRad) * This.Boom(i).power
If This.Boom(i).power > 6 - Rnd() * 2 Then
This.Boom(i).size = 2
This.Boom(i).r = This.r + Rnd() * &h5F
This.Boom(i).g = This.g + Rnd() * &h5F
This.Boom(i).b = This.b + Rnd() * &h5F
This.Boom(i).a = This.a
Else
This.Boom(i).size = 1.333
This.Boom(i).r = This.rr
This.Boom(i).g = This.gg
This.Boom(i).b = This.bb
This.Boom(i).a = This.aa
End If
h += g
Next
End Select
End Sub
Sub Kaboom.Update()
If This.rockety > This.heigh Then
This.rocketx += This.rocketvx
This.rockety += This.rocketvy
Else
If This.set = False Then
For i As Ulong = 0 To This.particles - 1
This.Boom(i).x = This.rocketx
This.Boom(i).y = This.rockety
This.set = TRUE
Next
This.detonate = TRUE
End If
Dim As Ubyte aGlimmer(0 To 127) '= {255}
aGlimmer(Int(Rnd * Ubound(aGlimmer))) = 255
For i As Ulong = 0 To This.particles - 1
This.Boom(i).x += This.Boom(i).vx
This.Boom(i).y += This.Boom(i).vy + fGravity
This.Boom(i).vx *= This.power
This.Boom(i).vy *= This.power
This.Boom(i).a = This.life
If This.Boom(i).a < &h7F And This.flimmer = 1 Then
This.Boom(i).r = aGlimmer(This.c1)
This.Boom(i).g = aGlimmer(This.c1)
This.Boom(i).b = aGlimmer(This.c1)
This.Boom(i).a = &hFF - This.life
This.c1 += 1
If This.c1 = Ubound(aGlimmer) Then This.c1 = 0
Endif
Next
This.life -= 1
'This.a = This.life * This.power
If This.life = 0 Then This.init()
EndIf
End Sub
'--------------------------------------------------------------------------------------------------
Type tagParticleTail
As Single x
As Single y
As Single vx
As Single vy
As Ubyte r
As Ubyte g
As Ubyte b
As Ubyte a
End Type
Type ParticleTail
Declare Constructor()
Declare Destructor()
Declare Sub Add(x As Single, y As Single, iLife As Ushort = 35, vx As Single = 0, vy As Single = 0)
As tagParticleTail ParticleTail(iParticlesTail - 1)
As Ushort count
As UShort life
End Type
Constructor ParticleTail()
This.count = 0
End Constructor
Destructor ParticleTail()
End Destructor
Sub ParticleTail.Add(x As Single, y As Single, iLife As Ushort = 35, vx As Single = 0, vy As Single = 0)
For i As Ubyte = 0 To iParticlesTail - 1
ParticleTail(i).x = x
ParticleTail(i).y = y
ParticleTail(i).vx = Iif(vx = 0, RandomRange(-0.25, 0.25), vx)
ParticleTail(i).vy = Iif(vy = 0, Rnd() * 1, vy)
ParticleTail(i).r = &hFF
ParticleTail(i).g = &hB0
ParticleTail(i).b = &h60
ParticleTail(i).a = &hB0
Next
This.life = iLife
This.count += 1
End Sub
'--------------------------------------------------------------------------------------------------
Type _Stack
Public:
As ParticleTail aStack(Any)
As UInteger iPos = 1
Declare Constructor()
Declare Destructor()
Declare Sub Push(Byref oPT As ParticleTail)
Declare Function Get(iPos As UInteger) As ParticleTail
End Type
Constructor _Stack()
Redim This.aStack(0 To 10000) As ParticleTail
End Constructor
Destructor _Stack()
Redim This.aStack(0)
End Destructor
Sub _Stack.Push(Byref oPT As ParticleTail)
If This.iPos > Ubound(This.aStack) Then
Redim Preserve This.aStack(0 To This.iPos Shl 1)
End If
This.aStack(iPos) = oPT
This.iPos += 1
End Sub
Function _Stack.Get(iPos As UInteger) As ParticleTail
If iPos > 0 And iPos <= Ubound(This.aStack) Then Return This.aStack(iPos)
End Function
'--------------------------------------------------------------------------------------------------
Dim Shared As _Stack Stack1, Stack2
Type Fireworks
Declare Constructor(iAmountRockets As Ubyte = 1)
Declare Destructor()
Declare Sub Update()
Declare Sub Plot()
Private:
As Ushort AmountRockets
As Kaboom Ptr pBuffer
As ParticleTail Ptr pBuffer2
As Image Ptr Img_Empty, Img_Fireworks, Img_Blur
End Type
Constructor Fireworks(iAmountRockets As Ubyte)
Img_Empty = Imagecreate(scrw, scrh, &h28000000, 32)
Img_Fireworks = Imagecreate(scrw, scrh, , 32)
This.AmountRockets = iAmountRockets
pBuffer = New Kaboom[This.AmountRockets]
pBuffer2 = New ParticleTail[1]
End Constructor
Destructor Fireworks()
Delete[] pBuffer
Delete[] pBuffer2
pBuffer = 0
pBuffer2 = 0
Imagedestroy This.Img_Empty
Imagedestroy This.Img_Fireworks
End Destructor
Sub Fireworks.Plot()
Dim As Uinteger iParticleSum = 0
Put This.Img_Fireworks, (0, 0), This.Img_Empty, Pset
For y As Ushort = 0 To This.AmountRockets - 1
Select Case pBuffer[y].detonate
Case False
If Rnd() > 0.666667 Then
pBuffer[y].rocketx += SimplexNoise2D(pBuffer[y].rocketx, pBuffer[y].rockety, 10) + Sin((pBuffer[y].rocketx - pBuffer[y].rockety) / 10) * 1.25
'pBuffer[y].rockety += SimplexNoise2D(pBuffer[y].rockety, pBuffer[y].rocketx, 15) + Cos(pBuffer[y].rocketx / 17) * 5.5
End If
Circle This.Img_Fireworks, (pBuffer[y].rocketx, pBuffer[y].rockety), 1.5 + SimplexNoise2D(pBuffer[y].rocketx, pBuffer[y].rockety, 150), Rgba(&hFF, &hFF, &hF0, &hE0),,, 1.5,F
pBuffer2[0].Add(pBuffer[y].rocketx, pBuffer[y].rockety, 7.5 + Rnd() * (20 * pBuffer[y].power))
Stack1.Push(pBuffer2[0])
iParticleSum += 1
Case Else
Dim as Single r, r2, cy, cyy, cx
For i As Ulong = 0 To pBuffer[y].particles - 1
r = pBuffer[y].Boom(i).size - 1
r2 = r * r
For cy = -r to r
cx = Sqr(r2 - cy * cy)
cyy = cy + pBuffer[y].Boom(i).y
Line This.Img_Fireworks, (pBuffer[y].Boom(i).x - cx, cyy)-(pBuffer[y].Boom(i).x + cx, cyy), _
Rgba(pBuffer[y].Boom(i).r, pBuffer[y].Boom(i).g, pBuffer[y].Boom(i).b, pBuffer[y].Boom(i).a)
Next
'Circle This.Img_Fireworks, (pBuffer[y].Boom(i).x, pBuffer[y].Boom(i).y), pBuffer[y].Boom(i).size, _
' Rgba(pBuffer[y].Boom(i).r, pBuffer[y].Boom(i).g, pBuffer[y].Boom(i).b, pBuffer[y].Boom(i).a),,,,F
iParticleSum += 1
Next
End Select
pBuffer[y].update
Next
Stack2.iPos = 1
For y As Ulong = 1 To Stack1.iPos - 1
Dim As ParticleTail oPT = Stack1.Get(y)
If oPT.life > 0 Then
For i As Ubyte = 0 To iParticlesTail - 1
Circle This.Img_Fireworks, (oPT.ParticleTail(i).x, oPT.ParticleTail(i).y), 0.1, Rgba(oPT.ParticleTail(i).r, oPT.ParticleTail(i).g, oPT.ParticleTail(i).b, oPT.ParticleTail(i).a),,,,F
oPT.ParticleTail(i).x += oPT.ParticleTail(i).vx
oPT.ParticleTail(i).y += oPT.ParticleTail(i).vy
If oPT.ParticleTail(i).a - 5 > 0 Then oPT.ParticleTail(i).a -= 5
iParticleSum += 1
Next
End If
oPT.life -= 1
If oPt.life > 0 Then Stack2.Push(oPT)
Next
'clean-up stack
For y As ULong = 1 To Stack2.iPos - 1
Stack1.aStack(y) = Stack2.aStack(y)
Next
Stack1.iPos = Stack2.iPos
Draw String (1, scrh - 10), "Particles:" & iParticleSum, Rgb(&hFF, &h00, &h00)
Put (0, 0), This.Img_Fireworks, Alpha
End Sub
'--------------------------------------------------------------------------------------------------
#Ifdef __Fb_win32__
#Include "windows.bi"
Enum PROCESS_DPI_AWARENESS
DPI_AWARENESS_INVALID = -1, PROCESS_DPI_UNAWARE = 0, PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2
End Enum
Function _WinAPI_GetDpiForWindow(hWnd As HWND) As Ubyte 'requires Win10 v1607+ / no server support
Dim As Any Ptr pLib = Dylibload("User32.dll")
If pLib = NULL Then Exit Function
Dim pGetDpiForWindow As Function (Byval hWND As HWND) As UINT
pGetDpiForWindow = Dylibsymbol(pLib, "GetDpiForWindow")
If pGetDpiForWindow Then Function = pGetDpiForWindow(hWnd)
Dylibfree(pLib)
End Function
Function _WinAPI_SetProcessDpiAwareness(DPIAware As Integer) As Ubyte 'requires Windows 8.1+ / no server support
Dim As Any Ptr pLib = Dylibload("Shcore.dll")
If pLib = NULL Then Exit Function
Dim pSetProcessDpiAwareness As Function (Byval DPIAware As Integer) As HRESULT
pSetProcessDpiAwareness = Dylibsymbol(pLib, "SetProcessDpiAwareness")
If pSetProcessDpiAwareness Then Function = pSetProcessDpiAwareness(DPIAware)
Dylibfree(pLib)
End Function
_WinAPI_SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)
Screenres (scrw, scrh, 32, 1, GFX_ALPHA_PRIMITIVES Or GFX_NO_SWITCH Or GFX_ALWAYS_ON_TOP)
Dim tWorkingArea As RECT
SystemParametersInfo(SPI_GETWORKAREA, null, @tWorkingArea, null)
Screencontrol SET_WINDOW_POS, (iDW - scrw) \ 2, ((tWorkingArea.Bottom - scrh) - (iDH - tWorkingArea.Bottom)) \ 2
#Else
Screenres (scrw, scrh, 32, 1, GFX_ALPHA_PRIMITIVES Or GFX_NO_SWITCH Or GFX_ALWAYS_ON_TOP)
#Endif
Windowtitle(sTitle)
Dim As Fireworks Firework = Fireworks(20)
Dim As Ulong i, iFPS = 0, iFPS_current = 0
Dim As Double fTimer = Timer
Do
Screenlock
Firework.Plot()
Draw String(1, 1), iFPS_current & " fps", Rgba(&hFF, &h00, &h00, &hE0)
Screenunlock
If Timer - fTimer > 0.99 Then
iFPS_current = iFPS
iFPS = 0
fTimer = Timer
Else
iFPS += 1
Endif
Sleep(Regulate(60), 1)
Loop Until Inkey = Chr(27)
'--------------------------------------------------------------------------------------------------
Function RandomRange(fStart As Single, fEnd As Single) As Single
Return Rnd() * (fEnd - fStart) + fStart
End Function
'--------------------------------------------------------------------------------------------------
Function Regulate(Byval MyFps As Long,Byref fps As Long=0) As Long
Static As Double timervalue,_lastsleeptime,t3,frames
frames+=1
If (Timer-t3)>=1 Then t3=Timer:fps=frames:frames=0
Var sleeptime=_lastsleeptime+((1/myfps)-Timer+timervalue)*1000
If sleeptime<1 Then sleeptime=1
_lastsleeptime=sleeptime
timervalue=Timer
Return sleeptime
End Function
|
Mit Sound Effekten: FB Fireworks v0.60 build 2020-07-13 beta.zip (Source Code + kompilierte Exe) _________________ Gruß,
UEZ |
|
Nach oben |
|
 |
Roland Chastain

Anmeldungsdatum: 05.12.2011 Beiträge: 194 Wohnort: Frankreich
|
Verfasst am: 25.07.2020, 04:25 Titel: Re: Einfaches Feuerwerk |
|
|
UEZ hat Folgendes geschrieben: | Fireworks v0.50.bas (ohne Sound):
|
Sehr schön!
Kleines Detail. Um unter Linux zu kompilieren, müssen wir "String.bi" durch "string.bi" ersetzen. |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 03.09.2020, 10:37 Titel: Sternenflug zu den Nebula Wolken |
|
|
Code: |
'Coded by UEZ build 2020-09-03
'Additional code (Perling Noise and Nebula) by Tapio Vierros and Regulate by dodicat
#Include "fbgfx.bi"
Using FB
Randomize
Dim Shared As Boolean bFullscreen = False, bRotation = False, bNebula = True, bSpeedControl = False, bStaticNebula = True
If bRotation Then bNebula = False
'Perlin Noise
Declare Sub BuildNoiseTables(seed As Double = -1, num As Byte = 1)
Declare Sub BuildNoiseTable(seed As Double = -1, k As Byte = 0)
Const MAX_PERMS = 10
Dim Shared As UByte perm(512, 1 To MAX_PERMS)
Dim Shared As Double ms_grad4(256, 1 To MAX_PERMS)
Dim Shared As Double kkf(256)
For i As Integer = 0 To 255
kkf(i) = -1.0f + 2.0f * (i / 255.0f)
Next
#Define BlendMul(a, b) (((a) * (b)) Shr 8)
#Define FADE(_t) (_t * _t * _t * (_t * (_t * 6 - 15) + 10))
#Define NLERP(_t, _a, _b) ((_a) + (_t) * ((_b) - (_a)))
'' Inititalize some permutation tables for different noises
Sub BuildNoiseTables(seed As Double = -1, num As Byte = 1)
If seed <> -1 Then Randomize seed
For k As Integer = 1 To num
BuildNoiseTable(-1, k)
Next k
End Sub
'' Buil a permutation table
Sub BuildNoiseTable(seed As Double = -1, k As Byte = 0)
If seed <> -1 Then Randomize seed
If k = 0 Then BuildNoiseTables(seed, MAX_PERMS): Exit Sub
Dim As Integer i, j
For i = 0 To 255
perm(i, k) = i
Next i
For i = 0 To 255
j = Rnd * 256
Swap perm(i, k), perm(j, k)
Next i
For i = 0 To 255
perm(i + 256, k) = perm(i, k)
Next i
For i As Integer = 0 To 255
ms_grad4(i, k) = kkf(perm(i, k)) * 0.507f
Next i
End Sub
'' Perlin noise function
Function Noise(x As Double, y As Double, px As Double, py As Double, noiseId As Byte = 1) As Double
Dim As Integer ix0, iy0, ix1, iy1
Dim As Double fx0, fy0
Dim As Double s, t, nx0, nx1, n0, n1
ix0 = CInt(x - 0.5f)
iy0 = CInt(y - 0.5f)
fx0 = x - ix0
fy0 = y - iy0
If px < 1 Then px = 1
If py < 1 Then py = 1
ix1 = ((ix0 + 1) Mod px) And &hff
iy1 = ((iy0 + 1) Mod py) And &hff
ix0 = (ix0 Mod px) And &hff
iy0 = (iy0 Mod py) And &hff
t = FADE(fy0)
s = FADE(fx0)
nx0 = ms_grad4(perm(ix0 + perm(iy0, noiseId), noiseId), noiseId)
nx1 = ms_grad4(perm(ix0 + perm(iy1, noiseId), noiseId), noiseId)
n0 = NLERP( t, nx0, nx1 )
nx0 = ms_grad4(perm(ix1 + perm(iy0, noiseId), noiseId), noiseId)
nx1 = ms_grad4(perm(ix1 + perm(iy1, noiseId), noiseId), noiseId)
n1 = NLERP(t, nx0, nx1)
Return NLERP(s, n0, n1)
End Function
'' The actual Perlin noise function that sums octaves.
'' Call this.
'' Returns UByte.
Function Perlin(x As Double, y As Double, xsizemax As Double, ysizemax As Double, size As Double, noiseId As Byte = 1) As UByte
' size must be 2 ^ n
Dim As Double value = 0.0, initialSize = size
While(size >= 1)
value += Noise(x / size, y / size, xsizemax / size, ysizemax / size, noiseId) * size
size /= 2.0 '1.5
Wend
Return (128.0 * value / initialSize) + 127
End Function
'' Exponent filter for making clouds
Function ExpFilter(value As UByte, cover As Double, sharpness As Double) As UByte
Dim As Double c = value - (255.0f - cover) '''''255
If c < 0 Then c = 0
value = 255.0f - (CDbl(sharpness^c) * 255.0f)
Return CUByte(value)
End Function
If bStaticNebula Then
BuildNoiseTables(10, 10)
Else
BuildNoiseTables(Rnd() * Timer, 1 + Rnd() * 126)
end if
#Define csize 256 ' Color noise feature size, use power of 2 values
#Define PokePixel(_x, _y, _color) Cptr(Ulong Ptr, imgData + _y * pitch + _x Shl 2)[0] = _color
#Define Map(val, source_start, source_stop, dest_start, dest_stop) ((val - source_start) * (dest_stop - dest_start) / (source_stop - source_start) + dest_start)
Function RandomRange(fStart As Single, fEnd As Single) As Single
Return Rnd() * (fEnd - fStart) + fStart
End Function
Function Regulate(TargetFPS As Long, Byref fps As UShort) As Long 'by dodicat
Static As Double timervalue, _lastsleeptime, t3, frames
Var t = Timer
frames += 1
If (t - t3) >= 1 Then t3 = t : fps = frames : frames = 0
Var sleeptime =_lastsleeptime + ((1 / TargetFPS) - t + timervalue) * 1000
If sleeptime < 1 Then sleeptime = 1
_lastsleeptime = sleeptime
timervalue = t
Return sleeptime
End Function
Dim Shared As Integer iW, iH
Dim As Integer x = 0, y = 0
#Ifdef __FB_WIN32__
#Include "windows.bi"
Dim As RECT tDesktop
Dim As hwnd hHWND_Dt
hHWND_Dt = FindWindow("Progman","Program Manager")
GetWindowRect(hHWND_Dt, @tDesktop)
x = tDesktop.left
y = tDesktop.top
iW = tDesktop.right + Abs(x)
iH = tDesktop.bottom + Abs(y)
#Else
ScreenControl GET_DESKTOP_SIZE, iW, iH 'not dpi aware!
#Endif
Dim As Long flags = GFX_FULLSCREEN Or GFX_ALWAYS_ON_TOP Or GFX_ALPHA_PRIMITIVES Or GFX_NO_FRAME
If bFullscreen = False Then
iW = 1200
iH = 800
flags Xor= GFX_NO_FRAME
flags Or= GFX_WINDOWED Or GFX_NO_SWITCH
End If
Dim Shared As Ushort iW2, iH2
iW2 = iW \ 2 : iH2 = iH \ 2
Screenres iW, iH, 32, 2, flags
Screenset 1, 0
If bFullscreen Then ScreenControl SET_WINDOW_POS, x, y
If bSpeedControl Then SetMouse iW2, iH * 0.95 'Iif(bRotation, iH * 0.95, iH * 0.85)
Type vec4
As Single x, y, z, pz
End Type
Type Starfield
Declare Constructor(quantity As Ulong = 19999)
Declare Destructor()
As Single speed
As Double a
As Ubyte maxRadius
As Ulong n
As vec4 star(Any)
Declare Sub Init(quantity As Ulong)
Declare Sub Anim()
End Type
Constructor Starfield(quantity As Ulong)
This.Init(quantity)
End Constructor
Destructor Starfield()
End Destructor
Sub Starfield.Init(quantity As Ulong)
This.speed = 2.0
This.a = RandomRange(-2 * Acos(1), 2 * Acos(1))
This.n = quantity + 1
This.maxRadius = 2
ReDim This.star(quantity) As vec4
For i As Ulong = 0 To Ubound(This.star)
This.star(i).x = RandomRange(-iW, iW)
This.star(i).y = RandomRange(-iH, iH)
This.star(i).z = Rnd() * (iW + iH) / 2
This.star(i).pz = This.star(i).z
Next
End Sub
Sub Starfield.Anim()
Dim As Single sx, sy, r, px, py, ppx, ppy, t1 = 0, t2 = 0
Dim As Ubyte c
If bSpeedControl Then
Dim As Integer mx, my
Getmouse(mx, my)
This.speed = Map(my, 0, iH, 25, 0.5) 'set speed according to y mouse position -> top fastest, bottom slowest speed
End If
For i As Ulong = 0 To Ubound(This.star)
If bRotation Then
t1 = Sin(This.a / 75) * This.star(i).z
t2 = -Cos(This.a / 200) * This.star(i).z
This.a += 0.00002
End If
sx = Map(This.star(i).x / This.star(i).z, 0, 1, 0, iW) + t1
sy = Map(This.star(i).y / This.star(i).z, 0, 1, 0, iH) + t2
px = Map(This.star(i).x / This.star(i).pz, 0, 1, 0, iW) + t1 'previous x
py = Map(This.star(i).y / This.star(i).pz, 0, 1, 0, iH) + t2 'previous y
r = Map(This.star(i).z, 0, (iW + iH) / 2, This.maxRadius, 0.25) 'radius
c = Map(This.star(i).z, 0, (iW + iH) / 2, &hF8, &h08) 'color value for greyscale
ppx = iW2 + px
ppy = iH2 + py
If ppx > -r And ppx < iW And ppy > -r And ppy < iH Then
Line(ppx, ppy) - (iW2 + sx, iH2 + sy), Rgba(255, 255, 255, c)
'If c > 210 Then Circle(iW2 + sx, iH2 + sy), r, Rgba(255, 255, 255, c),,,, F
Circle(iW2 + sx, iH2 + sy), r, Rgba(255, 255, 255, c),,,, F
End If
This.star(i).pz = This.star(i).z 'previous z
This.star(i).z -= This.speed
If This.star(i).z < 1 Then
This.star(i).x = RandomRange(-iW, iW)
This.star(i).y = RandomRange(-iH, iH)
This.star(i).z = (iW + iH) / 2
This.star(i).pz = This.star(i).z
End If
Next
End Sub
Dim As Any Ptr pImageNebula = Imagecreate(iW, iH, &hFF000000, 32), imgData
Dim As Integer pitch
ImageInfo(pImageNebula, , , , pitch, imgData)
Union Col
As Ulong arbg
Type
As Ubyte b, g, r, a
End Type
End Union
Dim As Col col
Dim As Ubyte ww
If bNebula Then
'Create Nebula
For x = 0 To iW - 1
For y = 0 To iH - 1
ww = Perlin(x, y, iW, iH, 256, 1)
ww = ExpFilter(ww, 128, 0.99)
col.r = BlendMul(Perlin(x, y, iW, iH, csize, 2), ww)
col.g = BlendMul(Perlin(x, y, iW, iH, csize, 3), ww)
col.b = BlendMul(Perlin(x, y, iW, iH, csize, 4), ww)
col.a = &hE8
If Rnd() < 0.50 Then
PSet pImageNebula, (x, y), Col.arbg
If Rnd() < 0.0003 Then
PokePixel(CInt(Rnd() * (iW - 1)), CInt(Rnd() * (iH - 1)), Rgba(255, 255, 255, 255 * (0.50 + Rnd() * 0.33)))
Circle pImageNebula, (Rnd() * (iW - 1), Rnd() * (iH - 1)), 0.50 + Rnd(), Rgba(255, 255, 255, 255 * (0.66 + Rnd() * 0.33)),,,, F
end if
Else
If Rnd() < 0.00025 Then
PokePixel(CInt(Rnd() * (iW - 1)), CInt(Rnd() * (iH - 1)), Rgba(255, 255, 255, &hFF))
End if
PSet pImageNebula, (x, y), Col.arbg
end if
'PokePixel(x, y, Col.arbg)
Next
Next
End If
Dim As Starfield Stars = Starfield()
Dim As Ushort iFps = 0
Windowtitle("3D Starfield v0.75 coded by UEZ / Stars quantity: " & Stars.n)
Dim As Double fTimer = Timer
Do
Put (0, 0), pImageNebula, Pset
Stars.Anim()
Draw String(8, iH - 16), iFps & " fps", RGB(&hE0, &hE0, &hE0)
Flip
Sleep(Regulate(60, iFPS), 1)
Loop Until Len(Inkey())
Imagedestroy(pImageNebula)
|
_________________ Gruß,
UEZ |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 03.09.2020, 21:27 Titel: |
|
|
Ich weiß nicht warum, aber ich liebe vorbeifliegende Sterne.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 17.09.2020, 14:50 Titel: Around the Sphere build 2020-09-22 |
|
|
@Sebastian und nemored: vielen Dank für euer Feedback.
Und weiter geht's...
Around the Sphere
Code: |
'Coded by UEZ build 2020-09-22
'Thanks to dodicat for some funtions I used from his code :-) and Martijn van Iersel for the CreateGradientSphere function.
#include "file.bi"
#Include "fbgfx.bi"
Using FB
Declare Function LZW_Decode Alias "fb_hDecode" (Byval in_buffer As Any Ptr, Byval in_size As Integer, Byval out_buffer As Any Ptr, Byref out_size As Integer) As Integer
#Define Map(Val, source_start, source_stop, dest_start, dest_stop) ((Val - source_start) * (dest_stop - dest_start) / (source_stop - source_start) + dest_start)
#Define Round(x) ((x + 0.5) Shr 0)
Const w = 1200, h = 800, w2w = w Shl 1, w2 = w \ 2, h2 = h \ 2, pi = Acos(-1), pi2 = Acos(-1) / 2, radius = 350
Const phi0 = 0.0, phi1 = pi, theta0 = 0.0, theta1 = 2.0 * pi, radians = pi / 180, deg = 180 / pi, cc1 = -270 * radians, cc2 = 1025 * radians
Union _Color
As Ulong argb
Type
As Ubyte b, g, r, a
End Type
End Union
Type vec3
As Single x, y, z
End Type
Dim Shared As Const vec3 eyepoint = Type(w2, h2, h)
Type vec5
As Single x, y, z
As _Color col
End Type
'Taylor series
'Sum n = 0 to inf (-1)^n * x^(2n) / (2n)! = 1 - x^2 / 2! + x^4 / 4! -x^6 / 6! + ...
Function Cos_(x As Single) As Single
If x < 0 Then x = -x
While x >= 3.141592653589793 'pi
x -= 6.283185307179586 '2 * pi
Wend
Dim As Single xx = x * x
Return 1.0 - (xx / 2) * (1 - (xx / 12) * (1 - (xx / 30) * (1 - xx / 56))) 'approximation of Taylor serie
End Function
Function Sin_(x As Single) As Single
Return Cos_(x - 1.570796326794897) 'pi / 2
End Function
Sub Object3Dto2D(wa() As vec5, result() As vec5, angle As vec3, centre As vec3, rad As Single = 1.0, flag As Boolean = True) 'by dodicat
Dim As Single dx,dy,dz,ww
Dim As Single SinAX=Sin_(angle.x)
Dim As Single SinAY=Sin_(angle.y)
Dim As Single SinAZ=Sin_(angle.z)
Dim As Single CosAX=Cos_(angle.x)
Dim As Single CosAY=Cos_(angle.y)
Dim As Single CosAZ=Cos_(angle.z)
For z As Uinteger=Lbound(wa) To Ubound(wa)
dx=wa(z).x-centre.x
dy=wa(z).y-centre.y
dz=wa(z).z-centre.z
Result(z).x=rad*((Cosay*Cosaz)*dx+(-Cosax*Sinaz+Sinax*Sinay*Cosaz)*dy+(Sinax*Sinaz+Cosax*Sinay*Cosaz)*dz)+centre.x
result(z).y=rad*((Cosay*Sinaz)*dx+(Cosax*Cosaz+Sinax*Sinay*Sinaz)*dy+(-Sinax*Cosaz+Cosax*Sinay*Sinaz)*dz)+centre.y
result(z).z=rad*((-Sinay)*dx+(Sinax*Cosay)*dy+(Cosax*Cosay)*dz)+centre.z
If flag Then
ww = 1 + (result(z).z/eyepoint.z)
result(z).x = (result(z).x-eyepoint.x)/ww+eyepoint.x
result(z).y = (result(z).y-eyepoint.y)/ww+eyepoint.y
result(z).z = (result(z).z-eyepoint.z)/ww+eyepoint.z
Endif
result(z).col=wa(z).col
Next z
result(Ubound(wa)).z = -radius 'center sphere, which is the last entry, always in the middle
End Sub
Sub QsortZ(array() As vec5, begin As Integer, Finish As Uinteger) 'by dodicat
Dim As Integer i = begin, j = finish
Dim As vec5 X = array(((I + J) \ 2))
While I <= J
While array(I).z > X .z : I += 1 : Wend
While array(J).z < X .z : J -= 1 : Wend
If I <= J Then Swap array(I), array(J) : I += 1 : J -= 1
Wend
If J > begin Then QsortZ(array(), begin, J)
If I < Finish Then QsortZ(array(), I, Finish)
End Sub
'CreateGradientSphere function by Martijn van Iersel -> http://www.helixsoft.nl/articles/sphere/sphere.html
Function CreateGradientSphere(centerX As Single, centerY As Single, r As Single, longitude As Single, latitude As Single) As Any Ptr
Dim As Any Ptr pImage, imgData
Dim As Integer pitch, iw, ih
pImage = Imagecreate(r Shl 1, r Shl 1, 0, 32)
Imageinfo(pImage, iw, ih, , pitch, imgData)
Dim As Single x, y, z, lightx, lighty, lightz, q_cos, light, c, lati1, lati2, longi1, longi2
lati1 = Cos_(latitude)
lati2 = Sin_(latitude)
longi1 = Cos_(longitude)
longi2 = Sin_(longitude)
'calculate the light vector
lightx = longi2 * lati1
lighty = Sin_(latitude)
lightz = longi1 * lati1
For y = -r To r
q_cos = Cos_(-Asin(y / r)) * r
For x = -q_cos + 1 To q_cos - 1
z = Sqr(r * r - x * x - y * y)
c = (x / r * lightx + y / r * lighty + z / r * lightz)
light = Iif(c < 0, 0, c) * 255
Pset pImage, (x + centerX, y + centerY), Rgba(light / 6, light / 4, light, 255 - light)
Next
Next
Return pImage
End Function
Function Base128Decode(sString As String, Byref iBase128Len as UInteger) As Ubyte Ptr
If sString = "" Then
Error 1
Return 0
EndIf
Dim As String sB128, sDecoded
sB128 = "!#$%()*,.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎ"
Dim i As UInteger
Dim aChr(0 To Len(sString)) As String
For i = 0 To UBound(aChr)
aChr(i) = Mid(sString, i + 1, 1)
Next
Dim As Long r, rs = 8, ls = 7, nc, r1
For i = 0 To UBound(aChr) - 1
nc = InStr(sB128, aChr(i)) - 1
If rs > 7 Then
rs = 1
ls = 7
r = nc
Continue For
EndIf
r1 = nc
nc = ((nc Shl ls) And &hFF) or r
r = r1 Shr rs
rs += 1
ls -= 1
sDecoded &= Chr(nc)
Next
iBase128Len = Len(sDecoded)
'workaround For multiple embedded file other crash will occure
Static As Ubyte aReturn(0 To iBase128Len - 1)
Redim aReturn(0 To iBase128Len - 1) As Ubyte
For i = 0 to Len(sDecoded) - 1 'convert result string to ascii code values
aReturn(i) = Asc(sDecoded, i + 1)
Next
Return @aReturn(0) 'return pointer to the array
End Function
Screenres w, h, 32, 2, GFX_WINDOWED Or GFX_NO_SWITCH Or GFX_ALWAYS_ON_TOP Or GFX_ALPHA_PRIMITIVES
ScreenSet 1, 0
#Define PixelGet(_x, _y) *Cptr(Ulong Ptr, imgDataTxt + (_y) * pitchTxt + (_x) Shl 2)
Dim As Any Ptr pImageTxt = Imagecreate(500, 39), imgDataTxt, pImageSphere = CreateGradientSphere(radius, radius, radius, -pi / 8, -pi / 4)
Dim as string sFile = CurDir & "/Text_500x39.bmp"
If FileExists(sFile) = 0 Then
Dim As UInteger iLines, iCompression, iFileSize, iCompressedSize
Dim As String sBaseType, sBase128, aB128(1)
Restore __Label0:
Read iLines
Read iCompression
Read iFileSize
Read iCompressedSize
Read sBaseType
For i As Ushort = 0 To iLines - 1
Read aB128(0)
sBase128 &= aB128(0)
Next
Dim As UInteger l
Dim As Ubyte Ptr aBinary = Base128Decode(sBase128, l)
Dim As Boolean bError = False
If iCompression Then
If iCompressedSize <> l Then bError = TRUE
Else
If iFileSize <> l Then bError = TRUE
Endif
If bError <> False Then
'? "Something went wrong"
'Sleep
End -1
End If
Dim As Integer hFile
hFile = Freefile()
Open sFile For Binary Access Write As #hFile
If iCompression Then
Dim As Ubyte Ptr aBinaryC = Allocate(iFileSize)
LZW_Decode(aBinary, iCompressedSize, aBinaryC, iFileSize)
Put #hFile, 0, aBinaryC[0], iFileSize
Deallocate(aBinaryC)
Else
Put #hFile, 0, aBinary[0], iFileSize
Endif
Close #hFile
aBinary = 0
Bload(sFile, pImageTxt)
Else
Bload(sFile, pImageTxt)
end if
Dim As Integer pitchTxt, iw, ih
Imageinfo(pImageTxt, iw, ih, , pitchTxt, imgDataTxt)
Dim As Uinteger particles = 10000, i, ub
Dim As Single x, y, theta, rho, phi, f1, f2, ang, z1, z2, px, py, pz, c1, zoom = 1.0
Dim As Ulong iCol, iCounter = 0
Dim As vec5 aParticles(particles - 1), aResult(particles - 1)
Dim As Boolean b1 = False, b2 = False
Dim As Single dimx = 0, dimy = 0
For xx As Short = 0 To iw - 1
For yy As Short = 0 To ih - 1
If PixelGet(xx, yy) <> &hFF000000 Then
If xx > dimx Then dimx = xx
If yy > dimy Then dimy = yy
End If
Next
Next
'Map string to sphere form
For xx As Short = dimx To 0 Step -1
theta = Map(-cc2 + xx / 4, 0, dimx, theta0, theta1)
For yy As Short = dimy To 0 Step -1
iCol = PixelGet(xx, yy)
If iCol <> &hFF000000 Then
phi = Map(cc2 + yy / 16, 0, dimy, phi0, phi1)
c1 = radius * Sin_(phi)
px = c1 * Cos_(theta)
py = c1 * Sin_(theta)
pz = radius * Cos_(phi)
aParticles(iCounter).x = w2 + px
aParticles(iCounter).y = h2 + py
aParticles(iCounter).z = pz
aParticles(iCounter).col.argb = iCol
iCounter += 1
End If
Next
Next
'blue sphere coordinate
aParticles(iCounter).col.argb = 0
Redim Preserve aParticles(iCounter)
Redim Preserve aResult(iCounter)
ub = Ubound(aParticles)
Dim As String sWintitle = "Around the Sphere coded by UEZ"
Windowtitle(sWintitle & " / " & Str(ub) & " Pixel")
Imagedestroy(pImageTxt)
Dim As Ulong iFPS
Dim As Uinteger cfps = 0, s = 4
Dim As Single fTimer = Timer
Do
Line (0, 0) - (w, h * 0.75), &hFF404040, BF
Line (0, h * 0.75 + 1) - (w, h), &hFF808080, BF
ang += .0033
Object3Dto2D(aParticles(), aResult(), Type<vec3>(cc1, 2 * ang, 0), Type<vec3>(w2, h2, 0), zoom)
Qsortz(aResult(), 0, ub)
For i = 0 To ub
If aResult(i).col.argb <> 0 Then aResult(i).col.a = Map(aResult(i).z, -2500, 600, &hF0, &h02)
Line (aResult(i).x, aResult(i).y) - (aResult(i).x + s, aResult(i).y + s), aResult(i).col.argb, BF
' aResult(i).col.a \= 2
' aResult(i).col.r \= 1
' aResult(i).col.g \= 1
' aResult(i).col.b \= 1
' Line (aResult(i).x, aResult(i).y) - (aResult(i).x + s, aResult(i).y + s), aResult(i).col.argb, B
'Pset (aResult(i).x, aResult(i).y), aResult(i).col.argb
'If aParticles(iCounter).col.r < &hC0 Andalso aParticles(iCounter).col.g < &hC0 Andalso aParticles(iCounter).col.b < &hC0 Then
' Circle (aResult(i).x, aResult(i).y), 2.5, aResult(i).col.argb, , , , F
'Else
' Circle (aResult(i).x, aResult(i).y), 5, aResult(i).col.argb, , , , F
'End If
' If aResult(i).z < -radius Then Circle (aResult(i).x, aResult(i).y), s, Rgba(&h20, &h20, &h20, Map(aResult(i).z, -2500, -radius, &hF0, &h20))
If aResult(i).col.argb = 0 Then Put (w2 - radius, h2 - radius), pImageSphere, Alpha
Next
Draw String(1, 1), iFPS & " fps", Rgb(&hFF, &hFF, &hFF)
Flip
cfps += 1
If Timer - fTimer > 0.99 Then
iFPS = cfps
cfps = 0
fTimer = Timer
End If
Sleep(1)
Loop Until Len(Inkey())
Imagedestroy(pImageSphere)
'Code below was generated by: FB File2Bas Code Generator v1.05 build 2020-08-08 beta
'Text_500x39.bmp
__Label0:
Data 24,8,20578,10151,"Base128"
Data "nJ:7*J#!lJ;.b!#J7|l$mH(!(±0R7D((|J7.V!:J7Pl)¿L³.(LoB8hp!!N!!$¯t!!*!:#!7!S$!R!¦(!¯!h0!¯#7:!!(|P!!0!z!!;lG#!V!j$!¯!$)!|#71!l%d;!l,JS!!7J¡!!L!R#!t!¡$!B#V)!l$³1!J)¯=!!2¿U!!Al¦!!Zl]#!³!·$!|#¤)!Z%d2!!,.A!l5lX!!H¯«!!j!i#!!#Ì$!.$!*!J(33!¯.ZB!!97[!!O!²!!xls#!F#9%!l$T*!7)¯3!l1¦C!l=¯^!!VJ·!!¨!~#!d#Q%!Ç$¢*!!*_4!J3!E!!CZb!!^l¼!!·lª#!¢#h%!Z%Í*!¿*.5!!5RF!lF!e!!f¯Á!!Å!¶#!¿#}%!·%R,!¯,ª5!¯6|G!!J|g!!m!Ç!!(mÀ#!3$µ%!J(~,!|.Z6!l8ÇH!lMJj!!tJÌ!!9#Ë#!R$Ê%!¦(Ë,!l0(7!J:JJ!!Q¿l!!{l$#!Jm*$!p$7(!7)P.!Z1¦7!!=tK!lTlo!!¤¯,#!X#8$!¯$"
Data "O(!t)|.!J2V8!¯@¿L!!X7r!!«!4#!hmE$!Ë$f(!!*É.!73!9!lBBN!l[¯t!!³J9#!v#P$!B%{(!d*N0!!4¢9!JDlO!!aZw!!ºlA#!¦mZ$!_%³(!¿*z0!¿4R:!!F·P!ld!z!!Á¯F#!µ#g$!|%È(!R,Ç0!¯5Ë:!¯G7R!!h||!!È!L#!Ãmq$!»%5)!¯,L1!|6|;!lIdS!lkJ¡!!!KQ#!$$|$!.(M)!B.x1!l7N=!JK¯T!!o¿£!!,mV#!7n¨$!N(d)!|.Å1!Z8Ç=!!M.V!lrl¦!!5°[#!H$´$!l(y)!.0J2!J9x@!¯NZW!!v7©!!=#c#!Vn¾$!ª(±)!l0v2!7:JA!lP¦X!ly¯«!!FKh#!f$É$!Ç(Æ)!Ç0Ã2!!;ÃA!JR!Z!!}Z¯!!Mmm#!tn(%!;)3*!Z1H3!¿;tB!!TR[!l¢!²!!T°r#!¤$6%!Z)K*!·1t3!¯=FC!¯U|]!!¦|´!![#x#!³nC%!x)b*!J2Á3!|@¿C!lWÇ^!l©J·!!dK}#!Á$N%!·)"
Data "w*!¦2F4!lApD!JYJa!!®¿¹!!km¤#!!oX%!(*¯*!73r4!ZBBE!![tb!l±l¼!!r°©#!5%e%!J*Ä*!t3¿4!JC»E!¯]¿c!!µ7¿!!y#°#!Foo%!h*1,!!4D5!7DlF!l_Be!l¸¯Á!!¢Kµ#!T%z%!¦*I,!d4p5!!E;G!Jblf!!¼ZÄ!!©mº#!do¦%!Ã*_,!¿4½5!¿E·G!!d·g!l¿!Ç!!±°¿#!r%²%!7,u,!R5B6!¯FhH!¯e7i!!Ã|É!!¸#Å#!¢o¼%!V,¬,!¯5n6!|G7I!lgdj!lÆJÌ!!¿KÊ#!±%Ç%!t,Â,!B6»6!lH³I!Ji¯k!!Ê¿Î!!Æm!$!¿o$(!³,..!|6@7!ZIdJ!!k.m!lÍl$#!Ͱ)$!Í%4³M¿JGt,Éml|7N(4KNR0]nz7;;)SK1l8J)L!=(*qK]·3Lo¹7E;*À#1°C¯!½|H³,ÌKlR79p*}H;!l#oKcB)7(Lp0aLz·:nn1nͯF3$|t=fqZ}VN2SK(¯9¦4¯%fl,¼L².CTrt78ZHË,l°9]r¨8cÃ4mM"
Data "Mt#R)joÈZ7hKÀRH~sD}p7$C%G±H1t(~m_.=!¢lcJ6;$1l7[N4011%V%ίB;#5SO]uX~6¢!t$«#i·.@9x(;§NBlU¿6toQJ!(OSuT¨s.!PZE¢,6K)¦vµ~i;!·$»mkl1P!¨pAÄO¦.#t(_%¦N@ÈOq0CÉ!ÁnÎJH¦.iS2t%Nl9p!3#Vl$|:¤!@¯!BK)¯)¦$ÁlH|*¦!%!.±!xlE|*B#§SxZ$d!¢NTV#E$,±!·l3l%)!5J1d%µ!9!$.!%!).#!~7;!p!VJ)7zh(#!%x#;Jg±mJlBl(;!Ft!d#·lº°,d#4!39!@l4l)ÇPX!lÁ8f}¼|:°!GJ3t%Ç!Cl$(R¹0aÁm$l5Z*ª!4Tmd!r!G¿f»#KJf$8¢!CJ3=K%J)7%XsH¯)l!X¹.T!j!G|,ª#Slt1¡Dl:|*¿#gJ0d!l|%|(¢#c!1Z|$!.¿$ÇJ,l0¦%X,G¿%tRH.qÁ$½lA!(³.,¯)|!@=5(#_Q)!*!¥ª!4ZU#Kg!j7u(==Ã!!#]!5Ç$hl)!Y8.%¯)7%~£2£]«R"
Data "il4¿#*!3¯*Ã#@º¶f¢½l@!%F*¬mDJn(l;J=B*wl!l%»n±J.;K@lGB2D%¿lF·*R°:t!h7B¯8;*ªmbZ37nAZ!R$kKT¿!ªpnZC¯$,¹p.!¤#»!9ZMfn@!1;%½!E7*Hm;¯$X$z!*7K*¯:R3lnH¯fO1!°_d,J¡0=2d*XK3Z¡9lZ¿=³*xQe.4n$UJi0K$!,Z,t$ª¿CË*²K_R1nm]£J;!{!cZ6¨nm7A|*,xad1!mlqJR#Zm[R(Ë¢0m$V(¥#JǬ1(7|7(*°#Â05$%r|)!N(JZJ4h#:_#¿$Vma¯ht%·7;ª$*w.Á#±m«7F3,©°]R1h#0ZSG!v!Qd3_oÀ7F;*#mr±m1!K79B*¨#cl3¨$a!(Ç%X°8¿8*!:l7B*UVe!5Ç$k¿)¦SLL,l*±$·lEt*j#Nd%.m¢¯6Ë!62mÇ#7nW!$t#*°V.4d%·¯@Z(R!FE81l¥¿I¢,§¯r$%*n¬¿DÇ*~#Yl0@#U¤x´#NKa75Ã¥~¤¢8,©#P.$($»lFBaY¼5²4H%¨JAÇ,¤K©1n5!alGp,"
Data "¼!#R)noÆZ33K(¯7.3Ë%4;§Ì,À°K!#hp(¯2(,vy*n5¨m~|!¼!rneÇ6¨$4¤J7!¦mk!5$@$!,N*¡y*±6¨%ÊZG!%N.$7*ªoÂ|4t.:n*t2Ç%¤!(ÃJ2¯JZ6½%i|¬=!q¯Z·6|©Î¯IV*u!X%n$!:|9l,,½k·6BoQ|WyM¬mpÊ6¬%s¯%7.$J:¿4³%b!t¼Zf°kl4$m$K$l%·mpg6l$v;PÇ,ÊmKǽÍlª!§KcÌ#]Z)T¡7¢!Ã#£°mº6;%S!H£1Bmil½Ëo®¿yy.E!Vd¿Ë%ǯG»,3#pB#Å#AƯy,=#0·z5!]lEFdÆKf¯6JoF¯}y.Ê!j¿4Án_(«i,Ä![±m*!uJ%8*NJ1±!xmÄ¿¯¸,b#5!¶R!tlHÃ,Ã#h.6µ%É|Hª,ÇKj¦6Ç%1;Hx)[!L76Í%Í|¹GIG¾ÈÈ5³%sQIÃ,ÀmGÇ6»%EZ(W!2°jd5Zm7]F.bM·172Á%ÍlEV).°MÇ2@«ÄJ3lQ$J7¦3ÉoÌZCd(F°_¦6ÍoÂ|E¿,Æ#iÉ!ªoÎJA¢c6¼bw5$¤;¿@¿,Ími¯3Vnw¯B³h"
Data "D·eB)¬©ZJ¬}cH$,73Ë%¨Z(ÃJ,JI¦Ã]nÆq.p*˰¸U4±n¢7C·,u4b¿(p|!!%J)Èm*¹6~%®7=¦)©#jÇ6Å%²l*7.*l@!59©ÂJBR)b#c|ˬohZU4!¥JdJ6¹m´q%=#a°kJ6R¨Bm7R,t¼fR3¢n¦¯E·e˰VJ{D!D¶µ4ljl]tν%ºZ@V)u#il![%W¿kÈ.V¯Vl»Ão¹Z@;*Â#]Â6hoZ|c¸0ÆJh¦$¼nt|7V)µmk|6|n»ÅL¢(,Zkd4h$slAV,fXj·,1p,¿6NMÍ#fJ3¤n¨¯EBdU¿Qd$$l#¯,»*D·f·2Pn}JDª,uy]!²l|qJ¶Kd¥#UÇ05o,ÇId,̯{Â8Nl¼PCe%35¡f(Z%(QGª)QmYZ5$°¨¯8@.B!Rd6¦ou73!%±!Cd*~#b¯4l%Â!IÈ)¯l%J,|*Ì#g¯.h#A$Cf8ªJBZ*¤#d¯5Ë$i¯f¯6@nk¤J¿!U°k¿3Él@±FtilzI.6É%§7.|!*J$¿#N$Æ|¸aq7¯QR6Ço©¿*J!5¯.70LF³rH;U}¾k¯2T®*¤FRPiU#Ç,Á%ÎlER%"
Data "LJ|!$N#¯JÈ4,r!0f!jmÅZ¬Ìs¿±Z¿6É$:|%)!¿JiÇ6±n6|W¿)ª{eR,~l2Z$!#¢JX.67©·JJ´!@°#¢6Fogl*»!:!*!%Ëm¿I¯,B°Áf!lmÀ¯Ip,WK6·#Rl3l,J)È6^.%vp8¦HÃ%z4,¨#]Mο43!#!;d5Ë%Í|B_$I¯(Z#¨lf¯D7VÌ#G7=ǯ8_%|)ÌmkR5Ím=¿$|!JJ=¿1ªouAA¿tI·%¦,¿~ÃZ7B#A¯,.)»$É!§À*wl#.!Íl·JªW%El$R!R!T¿DFi¦!T9!TmÅZ§8(R¯%t!b!QÈ!¬,¼!md!]mÀ¿I·,p#8¿#R!3¿)¿%§#°v5½m#!(()°~]t(Vµ.|(R%ª°ª;3!µ6¢8·e¼#N.%Tl,7(¿$q°Îº59#·£J(%D·)v3hF:;(F)ɰj¯3L#3J$»!clJ75ËoË7:¿!ża:5V#7*(W!ÇJg|6pn8e(´!^°kZ3p!8¢*_*ÎmUJ{d#ÿE$Kd!aÇ6RoE¯MÇ!Q#j¿5Ã#[;.³d¨m6¯rF!l7_Í,¿°j;ÌËM5p!·*U7*7!¨lÄÇFJ$"
Data "#T!Ç#¢nοE»#99AR8£®0m%³tomn·mnmkQBJ#1JK!9s%L7gL0d!RZ3Dn7;#¢%ÁKkÇ4Çm:Ç}«$K:ed)(!(¿3B,Á°Id=2p5!@³,ɰI7#p¯¿¯H3(P»p¿!f$4p7J!LJZ|m¬n4¯O[!°!WB3L³1¿W*K3¯FÇ!u%RJiG!aJO.3.n«Ã%Ä#|mk|5¯#o£#B%¡°·¡1Tl.|:ª,ÁKGt)2(ZZ¸S*Y.*¦3¤Jc|jL!ÌRi.*.(AJBË,Æ#TÇGKp2¿2|)Z#:¯!¤#ÄJI¿)aJCE(3%Ì7AlkJ.Ml»¹%g¿v9.=JP¦.8%ifLt!q°¸E3¯µ£eRS%¼mkl3!m»e!¦$©mk¯5¦#Ç;%3)ǰËVIm|1¿93{6#~Êm.!k7IN,¢l.Á(¬oUQFÄ$1ÃZ%n(!TZH¯,G°QM71!Y!Vv)$ÃK°)Wn{¢JB#hm*É5r·ÍÇL@0v°¸g$7!q¿I³,Em9£:x¬½Z*7Y©J5i8§I¿T)ÇJ~l_²3¨!C¿BÃ,ÉmKRY2p(!(¿¦H±0Ç2Í%į5;e(n*R1F®qZ$N!¾JfÇ5¤#}vMx$"
Data "¨mkJ3¨!$¯1Z¡,°MWµJ$³*9d!µ!gÇ6t%L!Y)!;!,·7V!mÉ%)!S!Z¿6·ox!·¬0F¯}G8|m¼¤AZ#XT[^1L%[J#»!xKkl4¯!dÅ#x*ÌKiB((lV7Î0*Çts¦(ÃoÈl~=!¹!²N45maA!x!C!#J$³nS¢3x¨($.d1½o¦7((Kw£k·1_lOO(!*Ë#g|(QpR7GÇ,j#8lw@%YU(£!Q°]M,~½NK6xrÍbm¦X©Uɸ([#§Kk!6Tmƨ%£#s¡RÇPe|(l77¨}!m.ZAR6¢#x%ÈmdB*F¨8J¹e*hlz|1rKR¯}¸$CYry;tR5g!RmÆK6.#ZºÄ7ÄÀJ4!Ç£4±VeÃ@§tH±*Ç21«=¯%#$5¢_J%z#XRA;#¤[Xw,·Ft7;z.(¯@!5Å%©ltµ%¼mg|*d»4J;¯,«°:l!Rm¿¿HRNHtHd!Y$;Jh¬,ͯP(nª¼DA(C!±!f¯6.%.F*[(wXIRek7BJ¨Ä(yÇs2,¿%Ìl53!H#]Ê)fNTJCi$©nW7¸ÅmO·M;$~°kZ27[6m(x)ÆKTdUi|p|Id,µY,D!|#ʯI»("
Data "n1)t1n·X¯!Ã%ÊmiÇ,tÀ6#,h,90FH8h!}lIR,h:mt#nnʯ«HKt!c7½L#»ºMR!bmkÇ47Z6¢$ª)Î#cÇf¶.#E(£!1mj|4LmO´#¦(_Ã9¿B!oίE³#Gt,.7ÀYͦp@^O°t´(¤!¸¯IF¯G·%¿.|F´0·°$»°$*ÄÉ$1Q4Ê._JTW4ÇlnlH·,8#{a²bnίF¯#J·!R(DX°¯)V!$Kh¿5~#5g$N(Âmel*@!S!Fª,3#qÄ8d½ÎJ:|#k#k75N#ohL!±i¿,n!ÃmÎÅ9¢gSR!!17Ea¯,ÊJx¯b^.;»$K0ls6°#dQÎ%I|%0!®¯]¡(µq¸¿I3,t¯.±)¬µÌ§%G#f#jZ1fl7Ã7¿,ÃÇ,D)ÍG¥!%;.cJl_3r³E79)*k_.n!t_˯:VgU$=·5Ço¤!6°!IKO5iy7,J7l,¥bUËm(l_!b1(Q!)¿!Dl)7#F!)JvZ$zo²DZ8®%b¬¹#Z!4|8lnr¯~D!9$xd2l5}°kJ3pÁ0K!d*ÌmY¤k¼«xZ³¨$h¯b·69ois%u!A°kd4JV8¢!hµ}em¦#Å$Í¿C_#"
Data "Ht1lWO%HJ9ËIA#8t(hm[J1!$Ul(·!;!tC(0![JN.,d]t)0¢*˰X|$B!qlHd,·!s)#n²¹r#p$®°i¿.FÃ0À2pd@#5BËj%b7.l$²lA¦(¿l7¿#Z!0!Ef|i7$l%_V)°jd6h$M!0¿$²¯;.(¦!2JbI!yDpl0ÍI_7ÈÁJ{lww,j^H|Æ])9¯CÅ6H(gc4(}89.75Í%À¿2($}lŤ(¹l7!$!¾w.EÇ5Í%u¿e¾Zo#j71¯Q7³7»,e¨,T(foÎ|@¿{L))~,|~)!9·,À°CR|0(0Z87¨º!.n$½Áº¯r92H£Ojnj!QdI¯(É@pl#bdzµIt,¨°Y.19nj!7Ë(É#h·,5¢!gHJ%GR$.,|o¬l,¦%ÈKc·Cº¡n¿u¥[{¯)h2Xb6KA»,je·(xQp#7F¶,¤!3R4Ë%ÀJTv»°§a¦t^9yWsÁ»f#k!55mOÇ(·¤x°4B.5K0sIV,}mP|%½ÇÆb5Z,È#R·#D!u|n@%¬4mJ#B$ÉlEd$,¯:Ç4Ç%¦!=ÂJ©lÃÊ.±!®7ÎudÇKdÇ2Ë#4lJ!±5mtb(¤oÁl,¯%"
Data "J9O¶5H%z¿.·¼(±I¦°8$6z%}#~4NÇ!f7F¯Rj)0lsÌ6(J:¹4»dT5,drOFοHÇ*kKG!IomIu=texZ[l6j$^Ç%4(PhG½mÅÃÎl=ZZ6!eÇ6|o{;!ª#±KkZ3ËÉ7;%J)ÎKc!(l|$|6«,³!Tf#_$ÊltIKc¯cl½omgÊPa)D½_^5;m58¯¹,Ëlu¼#ªnͯC!$°¯id5ª#s*#h(ÎKd·(ttI¸=¢¸GRW|6¿Y,¿Q¨Â)±!t4À%QZ%ǦÁmjI8P!{¿I¦*jHµj)JÂozJ»!0«h..Zg5p)B*!©2Zmsh½¸=xÅQtºvT²%elH¹(ÉKg.*¬U67=³,z°3B!¨fS6gÅJ±!A_.r!À§»oyµ!TÁbÈ%¥|%[!4#}=)pmÃZ¿Â,dmiÆmfm2.AR#DÇ,.½¤n̪J($¿#kR01l¤!§0(G.#!,rgZh¿:¨³JÈv4Ío´JAÎÉ@}QJÈg|l7IFÀ.Ë~º0p}W7Î}(:L$BM¶oÌD(È!kmk!4DÂ5_¥Ì,(#bc#;G4¾(0!ʯwË3Å!Ê4!(!{!²»4¢$«JBJ*yK_J4]%ÁZh±)"
Data "8gTÅ6(%½¾M!$RfZ!%9#Ä|H_(I¦1l2Í%´lFÊ$νSJ{f|§7·AU5!ÊVÃA»²¿Ãa#bH(;2vfV#;tÉMFµb·YNWIÎi*]2,~%Jo7È%³#9=hl*;!4!*B$¥!D¦,Ç$̯I¢(vË.9!b!aJ¨iÄMÁ%ÇE§oWJi4!¹Je¯6n$yO¾¾,L#%Â8µmhË4B!¿!A³3¬l*J(³#xlAÇ*7$]sH¢´¬$]Ê5Ë!AÄ$Z*wY6!%h»ÅZ5J!b^8d)z#k¯@.JL°¿¼mZ!~¿H¦,E°.ÎmX!ª¯PÉ^.¹I!Ȩm#¿2³k©mn,n¸m4ANA!į·Ê2±l*l(³#zJB!,Ln3QFl$#J0Çu«og7M64u#nqÊe7ËvÆÊ.Ƽj.6¢#(#%·¤©m¯5!·!r§BÇÉ[v1Z4Å%¬l¹ÊJr!v52;p1|9¢,¤®01#FnM·R©rSl[¿6$o9J!Z!@¯,Z$¦!E!6J,yÊB4Z{¬{lHy.¦!³¾1nl87¶¼)WËn£)t%ίÄ19~YUB±e7^1Îb!Gj_¿ÈMr|eG_!$J6tΨ%Q¯O}!L°kR4;ËTι®t¨jÍw6_$Sh!3%"
Data "¹°kZ0J!0J:Flwm0.|R!~!QÂ$DB¥1(¦n4¬I¢*xu(Z1Í%Å|2RYH!X|½b#(7¾Î*DRfZ)nLR{ë$j²^BÀD$1«,7q:¸Ys»É%¬¿lÎdTJed7ql.¯8»,Ìm_B¬Pp37:¯,·°CR¹e|1¦m:,ºlc:¡¬lVB#³Í·°PÅ8Bl·¯À*$$¯,7¼½oj¿L9!P¾g¯4%!0VCK({a!d(t«©¿Kd!ÎJ·c3Ã!5³)V*ǰP|¿k|j!It,«¯¨2*]H½!*!0¥¯§:0!§0¿kH,%±,D!¹!¼!I_)jD.v$*¼¶lF¥!:#iZÌ{7A¿BÇ,̰LR¹gÁu|~¥$X1$l,»%Å|3_R#¤*$6Z$yqJZ!$Kɤ,1l#J6¢f¯¯kx$xSů5¢P²¯*c2±f6m=³,Çc%Z%¼%i!¸=!ͯ·Â2N;*¿=Ç,;½n²8B!S!q¤*Ã0¡]ÄcÅVI}²¦¯¯^«#jnË|§µPmJPµ6vn5¿J4!À¼k!§I_$¿(B(s:(»3Tml´$x}¹E.·8(!9¯9¦,ÌKTJ{Á̾7§4*d!X2!*mkyD(¸*lkÊ6¦o^|#Ã.@¯RBHAnl´¼¹J"
Data "ưVÇ$@8Ç@Hle4¯!J%t«Ì¯;F#,T#B*noÍ|B¢#Dd©d0µOÁl4¢!RS!R#j$¸71J.#¯5·3Ã%~!5A!À¯L_3@A%!®XjµlRa!¨lÂÅGl®x±bXv~m%|K(!:;kl6($0O!¦#¦=jJ2D¨6s$¿%·#u£¿k|i¿HÃ,}#9lÃ9!V¯¹Å,1K¾¹SÈ%ÁZ0!ª³!cj0Hº]b,lZJ#¨Y7Vl@IFJ©;¯MJ6r%Y7$Ç0jn{¦!;lÉ«b²$8XfB(x»$K!Z$·°j|0hizirb*³em¯)ÍNu¥Ih*ÅJ7l%¬#Á¯IZ*Tź.|m%dl(Z!9l3Ç1½%Î!Bdp°J·_¢i7~!It,´T%tuÎoÈ¿ef!,¯*·*JÍÉZ4_Q_l]BAqoi7.¦#~lR.ÀHRÉpS§ÉEg¤{·¾%%SG»%M!#.!Nlk!Au*k¯mÉ*¯J1Æ3¦#_JE¯)¾%XJ%ÆJ*l1Z,Ddy,Fl(ua¤6¸¤J¥J0x#gJD·2¿oÍ!DB¸OLUsÇPH´l1t!M$3Ç1¿%Í!;|QrnU¦.ºo~l0p#j¯¡Ë6Bo;|J|!AtmÃ6~oi¿.|#¯l[55@m*m°Íu"
Data "·zE7Fªm¥uGN%Êg,T$ËnÎ¥Hp)®l5B(¦½ÍZ5³nq¢i|6vnAJ$R!N!GÇ:¾oX|G¼!QmÁw6@$Nl*N$)KlªÀ¯Y¾k%N)*Xh·0@#CZ0.{ÊKZd¯«pPZ©mθJ6¦%jm©¿Î´,DmnÎm¿mqÇI_,D°=t%¹lQJ:tj̰YJ{5,A,@|·¬k1t8Yo7yh2$¬Ki|0*¾5N$¿(ǰeZ)1l0Z8x,ɰdR4]zx:Â|*}#Vd)hÌ6Ã!RfÍ#YB$ͧ2|CÇ,§#FYEL~¦¿y¬$r9[¦3ÁIͯF¿NͰgd.bp(¯3(,Ìmf.3v$¤7Dhl½KC7r]mI§8ÉJ~aiR¤D!ÂT%¼,}°S¿0¿$A,ÍUz*J9l~QªÃJEpgD.a¿¡k70¿0drÂ!RJ6³o¤l5l%¶¯7¿»_iÍZCx)C6g·2L$o!=ˤÉK,Y7JllJG·JÇmbt4@«Íl;!ÈIt$l*1oqt¤z){!7UPGeÅ¿D(,v¾k!5|#[;¾Î*Å#V·3PH¾7=J(4°Z¦.woV7G)!YlC£m¨%¹lF³kÄK=!tB!Î|Il*g#]º6¨o»¿OÉÃøq.,$NJuE»*"
Data "¸.jR1V!:Ã.t¸D.j!5x%´QE¿r)±0Z3ÇoÌJC_)K#[ÇWÈo¥Zp¾Zo@n%6Z%¸A§e,mhu·$¿©0sGª*µ°j¿6foX7g9¢4F»;´X±8E:|QJ·G¦Ã9EË¿E.Pt4{:X0pi¿Î£$Ç1$d.ÁoÉZ6¿³%½cR6Tn½w%i!4°h¦5zm(J$N(²¾t¾3Él½{a;*̰hd,Åc¤S¹i,_Is7(¦%Í|:¦X|Jc¦6X$r¿¾SbÍ#aJ)@8Mp@Fl¡4kl3·A$}yÎ,y°2¿mDnÉ!Îb!µah¦Ã|EÉ!8Çɬ®(!0±«%sDǸ[T2R1@o·JD(,ËmjJ5N%·|Bª(k!$|ÄÈ%¨l5ÃÂDthB4a7Æ!2n.dJXd!=©Í¯Eª$DB,]!½l90°y,sKBÇV0p]f±Äov4i|1H«9}£{,*#O.À_¬Äl2¹Jrm±W77l]¯*zbÇ#[JÈ6!ËlI¦)½lB¢»P¹a!¥4![lUd!=EÍ7EN%D¦sB#¬m·JÈSbȰTtVK@r!AKc¹#EÇ6%lflºGd½K7Q79lb7FÃou¼h¦1(b$K*_)tGfÂH¸:7¢5VfÁ#°n½¢om¯º5)"
Data "Ë#id¯y·X!H³,Nm¬G¿j%ÉZ9t±Ft%J.¯oÅ|~v!,°ÇEÁI%K|Êw1=°L»¡k|#lN¶,(°pZ!¬m´Å_y.[JZ¿5@¦aJDËkM¤[¯)hÌ)Ê)Ë(ic]M6·nKl4m#t°kÇ25d5_3F,x#_¨!Ë$Ìl;!(µ£]%6.$**Lp!ÊJÁ²Gy%«J¨}*@¯,]!r#ªz~©)Nl¤¶6zn=Z1Nj¡¼hÇ.hÍ!!)»(¯~*¨6¿$M|¢2K1J=Ç3~EµJ5F¿FR)J1Çoµ!:!*ÁKjp3Ë#7|K´Ê®mhl*zlo!GppD.dB)XN%!1.*:Ìk¦5N$:7Ju[É#K·!V#®¿Î¸h¥mF7q,!8|97,Ì7jd2LmÌW.²#L°d·,«%{¯*R~@!F!4ÉK(ÆEJ%~dx¯)!oÎQ%u,mK#Ä5tÂ0}#|$k°LFÀx%rl(³ºSJLZ5ɰ©AA_,È#PJ{l7f!N¤)3#Äy»·%±J3h!!uO¦6l$:wM³!r#k!3r¸8O.JN9m;5{¿#¬@7l!8JK!k¤$j||;;))H¦,9nY¯ÂÊJ]¯_¿6¿%_¯³Á.J!ft¿j¨.J³6,²ºpl!ÉlW¿)G!"
Data "QJ=·,Í#VJ(h¥¹b8l.±$§|9d$FJÅh!r#|¿1|·)$(|%±!(K!3#rJ.t!·lel:ª)O°G·%jÂE°(t$ÊJJ·)¯lA¯AË,¡#¨Y9*m¬lCª*³#=p½¶{ȯG!)Fl¤¶6dn4l!¦_£mhB6±%±Z3_SGR(J%lmlZ5($DJƾm3!Z¿Exw¾°Ql$Ãb$Z*V%cl%¯#·!QJ1ª#JJ¹yÆk%Ç¿2N!6J9Z1~%Ê%G3)o¯,X9f!L757(¯J3BPKpC!3¢¸%J,¯(Ámn¿2Z#lb!Ç!³!Y!7x%o¯*Çmw|0J*Ç$!°E¿%B¢5(#;#ÆlSl2p$c!*¿³)J,R(¹mo|3³#LJOl0M·8´%J$ÁlJ|)¯!Y®Mb!]lAÇ,ÁmRZ)V$¥#jZ0Ë_7N5FnIm*¦$P#i¯7h%m!©±lam%½W}#¾l4Z]0($¯,¿N;KÆ´m@ldJGÃN:!(¯zw%Z!·*!ÄE¹f*l³º7%ÊJ2!´¤5pY¾6)B,ÊKYÇy¸94¿±z*ocpc)¦%Á¿3t!=¯,¿#N(W{Ip(33vd#l!0|Ê{K*l:¯)4ÀQ|¢wKÈÍcÇ5P#Ia#Ã!"
Data "HJ$|m4¡;Ã!¯g¼°(VpÍ!ae9ǸJ.Fd(k$SV.4!blZv0*¾5N#Z%·KiJ0LQk!H;,¯!tc²xnÀ¸9h¤%g@.6Á%sZUytðhJ.Fg£N%¿)xkÆyuV#ÅlF7Ä3dL{.hjLN!d#s4kB4»l½I)´Ê®Kg¦(_f²¢*G!ÇXgB¬1}IJWr(3»,É*~}{J12L$l2l4»oz¯Âʬµ¯eZ6]n2¯#»%¾#e¿)lh:;]rN®K8ǦllFÆCNi=JU·6loI¯B=.D!Y¿6B%SF:§$»#eJ¹C¿p¬73¬xR%|.F7¬JZ©KÈÍc·57#:ºB#L,!¬²5¦!I;]¨*ÆKMZ#n7b7ÂÌ(~Ç79$LoÊl;¦!tfBR5¿%|!%_!ǯgB5dm~5*)!·Jp23ËÃÇc7ª,aª#|%L%9»ÌEPE¯_z3NÀx³1Z,³#S¶l:ÉnZÇ]LHl¢w5r#yH)´Ê®Kgl(xV²(.G!:°k¯5~!I;]¨*ưLlÅ2(al2Í(~Ç7É#µÊ£¯Q%K.JBR5Á%¡J%_!ÄlgB5_m~H*y!a4kB*¿=#¿,B,³Z)ZmÀoplLÊOF¯¼O3rSJ¶1Z,"
Data "³#S¶l:ÉnZÇ]LR¯GÌ3Ã!YybQKÈÍc·57#:ºB#L.!´¬5FkDN!.$¥mil.hj5;4¿nIm;Hpd!©7It)1jnP*x%Ì7=»!3lF·5poU¯§MKvJDÁ3B¦Ç_AVjoJR7z©J²pJÃ!r#k.3rSJ¶1Z,³#S¶lQÂnZÇ]LLJS¬4xÃ5(#d$8°6|¸¼À´«GJ$P¤[$p7lRYG»cit!l(]%ʯ}*Kµ!AË0NÀK(%B)ÉmXB±k|(!4_ºS°*¦!¯mÅ!Ft$Id3¹!dnÌ|Hª%IÇv!¤º%{Z^b*Vl[D8jl¶ZIÃ)¬Hµb)¦%Ál¢Ê.K¯[¿6.n½w.q!A°}¢0y·GJCt,5m9,n.!YlF_,sluax!}(¯ÇP,dI4vÆeoÉ|p)K´¯*Î0NÀK¢$¯(ËKZJ·g]b!G³,Pm*¦!ªmÅ¿Ed$Id31!.#=jBpÆHn.·4Ë%%QIÃ(«ÎV9$d%Ì¿@ÇÉB©=¯5t%~½M³#¶ÇI7q0}#¿.J}½°HR#fp!|#³$Ǿ»¥my=hZGZ,pJÆcx½|)|;6ÇjR.*5¹oiZxÉJ³¯*Î0NÀK;$tLv°j%n;!dJGª,"
Data "I#*|!¦#ÅlEB$P¤3D!$$n=6ÇJ7Jdr[U#²³M;#²Kj72HºÁ31N,±mARIE#nt63¡zt%Ç,;IÈl;Ë$dJ2R(9n¥SGp%{£0v!DnÇZG!$D¦[]oBl©ËFh¤aR#7*p%ɯ5ÇÉI·B¦°i$Sh.a!Ålk¿3±f6_#|%ºmid0V!)Z4Z,¨#7B9@l37(33%²¯7$ll.!=£!xJAd)LmO|.7$rl;.*B0]Z2p%8XaJ¬ÌÌ0,D|Qr0pt$x%cFMÆÀO°R¦$ª¢Z7¯s%®È71!Vlx76Â,¾#d¦4t%nOG(({Ä0±!p$CY,BPzR%l3ÍoÁ¿%{K)¯CJ5µobJu:.§J§O0HULN#J%ÍK_!¶ÈEglGx,0m(t!ŨʿDR*wm^J4p5}MÃ.G¤°TB%.!WJEd,»mfd5B6ÂJGl,Âsh·5¢oË¥IpSPlXZ¦mJ²;fO#²KhB.lh:_5V,Äm;Z]E},¯3¦pzªgR2T#7k(a!^#k¿M4:Q¢#7*Ê#Y|m¡|$|37,·°:d²¼!¾7Ix%OiKÁ(³o¸7§ÍJ1!F|5v%V¦¦y)±°°UÅÌ%µ!._!"
Data "$KªºÉa|Î6l"
|
Download Source Code + kompilierte Exe: Around the Sphere build 2020-09-22.zip _________________ Gruß,
UEZ |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 20.12.2020, 16:35 Titel: Weihnachtsgrüße 2020 |
|
|
3D animierter Weihnachtsbaum inkl. Weihnachtstunes.
Da der Source Code und die Dateien zu groß sind, um sie hier als Code zu verpacken, hier der Link zum Download: FB Merry Christmas build 2020-12-21.zip
Frohe Weihnachten und ein frohes, gesundes neues Jahr 2021. _________________ Gruß,
UEZ
Zuletzt bearbeitet von UEZ am 21.12.2020, 19:18, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|