forked from KolibriOS/kolibrios
upload PlasmaEffect demo
git-svn-id: svn://kolibrios.org@7315 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
a1a9148eb9
commit
8924de4eb3
24
programs/demos/PlasmaEffect/LScript.x
Normal file
24
programs/demos/PlasmaEffect/LScript.x
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
PATH_SIZE = 1024;
|
||||||
|
PARAMS_SIZE = 256;
|
||||||
|
STACK_SIZE = 1024;
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.all : AT(0){
|
||||||
|
LONG(0x554e454D);
|
||||||
|
LONG(0x31305445);
|
||||||
|
LONG(1);
|
||||||
|
LONG("@Main");
|
||||||
|
LONG(END);
|
||||||
|
LONG($END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
|
||||||
|
LONG($END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
|
||||||
|
LONG($END + PATH_SIZE);
|
||||||
|
LONG($END);
|
||||||
|
*(.text)
|
||||||
|
*(.rdata)
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
END = .;
|
||||||
|
.bss ALIGN(16) : {*(.bss)}
|
||||||
|
$END = .;
|
||||||
|
}
|
281
programs/demos/PlasmaEffect/PlasmaEffect.asm
Normal file
281
programs/demos/PlasmaEffect/PlasmaEffect.asm
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
Comment *---------------------------+
|
||||||
|
| |
|
||||||
|
| Plasma Effect |
|
||||||
|
| |
|
||||||
|
+-----------------------------------*
|
||||||
|
.686
|
||||||
|
.Model Flat, StdCall
|
||||||
|
Option CaseMap: None
|
||||||
|
|
||||||
|
RepArg Macro Arg
|
||||||
|
Local NewStr
|
||||||
|
Quot SubStr <Arg>, 1, 1
|
||||||
|
IfIdn Quot, <">
|
||||||
|
.Data
|
||||||
|
NewStr db Arg,0
|
||||||
|
.Code
|
||||||
|
ExitM <ADDR NewStr>
|
||||||
|
Else
|
||||||
|
ExitM <Arg>
|
||||||
|
EndIf
|
||||||
|
EndM
|
||||||
|
|
||||||
|
@ Macro Function:Req, Args:VarArg
|
||||||
|
Arg equ <Invoke Function>
|
||||||
|
For Var, <Args>
|
||||||
|
Arg CatStr Arg, <, RepArg(Var)>
|
||||||
|
EndM
|
||||||
|
Arg
|
||||||
|
ExitM <eax>
|
||||||
|
EndM
|
||||||
|
|
||||||
|
Public @Main
|
||||||
|
|
||||||
|
; Event Constants
|
||||||
|
REDRAW_EVENT = 1
|
||||||
|
KEY_EVENT = 2
|
||||||
|
|
||||||
|
; Event Mask Constants
|
||||||
|
EM_REDRAW = 1
|
||||||
|
EM_KEY = 2
|
||||||
|
|
||||||
|
; Window styles
|
||||||
|
WS_FILL_TRANSPARENT = 40000000H
|
||||||
|
|
||||||
|
TSize Struct
|
||||||
|
SizeY Word ?
|
||||||
|
SizeX Word ?
|
||||||
|
TSize EndS
|
||||||
|
|
||||||
|
TRGBQuad Struct
|
||||||
|
Blue Byte ?
|
||||||
|
Green Byte ?
|
||||||
|
Red Byte ?
|
||||||
|
reserved Byte ?
|
||||||
|
TRGBQuad EndS
|
||||||
|
|
||||||
|
SetEventMask Proto EventMask:Dword
|
||||||
|
CheckEvent Proto
|
||||||
|
BeginDraw Proto
|
||||||
|
EndDraw Proto
|
||||||
|
GetScreenSize Proto
|
||||||
|
DrawWindow Proto Left:SDword, Top:SDword, Right:SDword, Bottom:SDword, Caption:Ptr, BackColor:Dword, Style:Dword, CapStyle:Dword
|
||||||
|
DrawImageEx Proto Image:Ptr, X:SDword, Y:SDword, XSize:Dword, YSize:Dword, BPP:Dword, Palette:Ptr, Padding:Dword
|
||||||
|
HeapCreate Proto
|
||||||
|
HeapAllocate Proto Bytes:Dword
|
||||||
|
GetTickCount Proto
|
||||||
|
Sleep Proto Time:Dword
|
||||||
|
ThreadTerminate Proto
|
||||||
|
|
||||||
|
.Const
|
||||||
|
Float_50 Real4 50.0 ; to keep the FrameRate
|
||||||
|
Float_40 Real4 40.0 ; around 40-50 FPS
|
||||||
|
; The table below can be calculated approximately as: SinTab[i] = Sin(2 * PI * i / 255) * 128 + 128
|
||||||
|
SinTab Label Byte
|
||||||
|
Byte 128, 131, 134, 137, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174
|
||||||
|
Byte 177, 180, 183, 186, 189, 191, 194, 197, 199, 202, 205, 207, 209, 212, 214, 217
|
||||||
|
Byte 219, 221, 223, 225, 227, 229, 231, 233, 235, 236, 238, 240, 241, 243, 244, 245
|
||||||
|
Byte 246, 248, 249, 250, 251, 252, 252, 253, 254, 254, 255, 255, 255, 255, 255, 255
|
||||||
|
Byte 255, 255, 255, 255, 255, 255, 254, 254, 253, 253, 252, 251, 250, 249, 248, 247
|
||||||
|
Byte 246, 245, 243, 242, 240, 239, 237, 236, 234, 232, 230, 228, 226, 224, 222, 220
|
||||||
|
Byte 218, 215, 213, 211, 208, 206, 203, 201, 198, 195, 193, 190, 187, 184, 181, 179
|
||||||
|
Byte 176, 173, 170, 167, 164, 161, 158, 155, 152, 148, 145, 142, 139, 136, 133, 130
|
||||||
|
Byte 126, 123, 120, 117, 114, 111, 108, 104, 101, 98, 95, 92, 89, 86, 83, 80
|
||||||
|
Byte 77, 75, 72, 69, 66, 63, 61, 58, 55, 53, 50, 48, 45, 43, 41, 38
|
||||||
|
Byte 36, 34, 32, 30, 28, 26, 24, 22, 20, 19, 17, 16, 14, 13, 11, 10
|
||||||
|
Byte 9, 8, 7, 6, 5, 4, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0
|
||||||
|
Byte 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 10
|
||||||
|
Byte 11, 12, 13, 15, 16, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35, 37
|
||||||
|
Byte 39, 42, 44, 47, 49, 51, 54, 57, 59, 62, 65, 67, 70, 73, 76, 79
|
||||||
|
Byte 82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 112, 115, 119, 122, 125, 128
|
||||||
|
|
||||||
|
.Data
|
||||||
|
i1 Dword 50
|
||||||
|
j1 Dword 90
|
||||||
|
Freq Dword 100 ; // GetTickCount return count of 1/100s of second
|
||||||
|
Instant Real4 0.0
|
||||||
|
SleepTime Dword 0
|
||||||
|
|
||||||
|
.Data?
|
||||||
|
Screen TSize <>
|
||||||
|
i2 Dword ?
|
||||||
|
j2 Dword ?
|
||||||
|
Palette TRGBQuad 256 Dup (<>)
|
||||||
|
Image Dword ?
|
||||||
|
ImageWidth Dword ?
|
||||||
|
ImageHeight Dword ?
|
||||||
|
FrameStart Dword ?
|
||||||
|
|
||||||
|
.Code
|
||||||
|
CreatePalette Proc Uses ebx
|
||||||
|
Local i:Dword
|
||||||
|
Local Red:Dword, Green:Dword, Blue:Dword
|
||||||
|
mov i, 0
|
||||||
|
.Repeat
|
||||||
|
mov eax, i
|
||||||
|
.If eax <= 63
|
||||||
|
; do nothing
|
||||||
|
.ElseIf eax <= 127
|
||||||
|
neg eax
|
||||||
|
add eax, 127
|
||||||
|
.ElseIf eax <= 189
|
||||||
|
sub eax, 128
|
||||||
|
.ElseIf eax <= 255
|
||||||
|
neg eax
|
||||||
|
add eax, 255
|
||||||
|
.EndIf
|
||||||
|
|
||||||
|
mov Red, eax
|
||||||
|
mov Green, eax
|
||||||
|
mov Blue, eax
|
||||||
|
|
||||||
|
.If i <= 127
|
||||||
|
shl Green, 1
|
||||||
|
shl Blue, 2
|
||||||
|
.ElseIf i <= 255
|
||||||
|
shl Red, 2
|
||||||
|
shl Blue, 1
|
||||||
|
.EndIf
|
||||||
|
|
||||||
|
mov eax, Red ;
|
||||||
|
cmp eax, 255 ;
|
||||||
|
setna bl ; IF Red > 255 THEN bl = 255
|
||||||
|
dec bl ; ELSE bl = Red
|
||||||
|
or bl, al ;
|
||||||
|
|
||||||
|
mov eax, Green ;
|
||||||
|
cmp eax, 255 ;
|
||||||
|
setna cl ; IF Green > 255 THEN cl = 255
|
||||||
|
dec cl ; ELSE cl = Green
|
||||||
|
or cl, al ;
|
||||||
|
|
||||||
|
mov eax, Blue ;
|
||||||
|
cmp eax, 255 ;
|
||||||
|
setna dl ; IF Blue > 255 THEN dl = 255
|
||||||
|
dec dl ; ELSE dl = Blue
|
||||||
|
or dl, al ;
|
||||||
|
|
||||||
|
mov eax, i
|
||||||
|
mov Palette.Red[eax * SizeOf(Type(Palette))], bl
|
||||||
|
mov Palette.Green[eax * SizeOf(Type(Palette))], cl
|
||||||
|
mov Palette.Blue[eax * SizeOf(Type(Palette))], dl
|
||||||
|
|
||||||
|
inc i
|
||||||
|
.Until i > 255
|
||||||
|
ret
|
||||||
|
CreatePalette EndP
|
||||||
|
;*******************************************************************************
|
||||||
|
Render Proc
|
||||||
|
Local X:Dword, Y:Dword
|
||||||
|
Local Row:Ptr
|
||||||
|
dec i1
|
||||||
|
add j1, 2
|
||||||
|
|
||||||
|
mov Y, 0
|
||||||
|
Align 4
|
||||||
|
.Repeat
|
||||||
|
mov eax, Y
|
||||||
|
add eax, i1
|
||||||
|
and eax, 255
|
||||||
|
movzx eax, SinTab[eax]
|
||||||
|
mov i2, eax
|
||||||
|
|
||||||
|
mov eax, j1
|
||||||
|
and eax, 255
|
||||||
|
movzx eax, SinTab[eax]
|
||||||
|
mov j2, eax
|
||||||
|
|
||||||
|
mov eax, Y
|
||||||
|
mul ImageWidth
|
||||||
|
add eax, Image
|
||||||
|
mov Row, eax
|
||||||
|
|
||||||
|
mov X, 0
|
||||||
|
Align 4
|
||||||
|
.Repeat
|
||||||
|
mov eax, X
|
||||||
|
add eax, i2
|
||||||
|
and eax, 255
|
||||||
|
movzx ecx, SinTab[eax]
|
||||||
|
|
||||||
|
mov eax, Y
|
||||||
|
add eax, j2
|
||||||
|
and eax, 255
|
||||||
|
movzx eax, SinTab[eax]
|
||||||
|
add ecx, eax
|
||||||
|
|
||||||
|
mov eax, Row
|
||||||
|
add eax, X
|
||||||
|
mov [eax], cl
|
||||||
|
|
||||||
|
inc X
|
||||||
|
mov eax, ImageWidth
|
||||||
|
.Until eax == X
|
||||||
|
inc Y
|
||||||
|
mov eax, ImageHeight
|
||||||
|
.Until eax == Y
|
||||||
|
ret
|
||||||
|
Render EndP
|
||||||
|
;*******************************************************************************
|
||||||
|
QueryPerf Proc
|
||||||
|
Local Diff:Dword
|
||||||
|
Invoke GetTickCount
|
||||||
|
sub eax, FrameStart
|
||||||
|
mov Diff, eax
|
||||||
|
fild Diff
|
||||||
|
fild Freq
|
||||||
|
fdivrp
|
||||||
|
fstp Instant
|
||||||
|
mov FrameStart, @(GetTickCount)
|
||||||
|
ret
|
||||||
|
QueryPerf EndP
|
||||||
|
;*******************************************************************************
|
||||||
|
Waiting Proc
|
||||||
|
; Keep the FrameRate around 40-50 FPS
|
||||||
|
fld Float_50
|
||||||
|
fld Instant
|
||||||
|
fcomip st(0), st(1)
|
||||||
|
fstp st(0)
|
||||||
|
.If ABOVE?
|
||||||
|
inc SleepTime
|
||||||
|
.Else
|
||||||
|
fld Float_40
|
||||||
|
fld Instant
|
||||||
|
fcomip st(0), st(1)
|
||||||
|
fstp st(0)
|
||||||
|
.If BELOW? && (SleepTime != 0)
|
||||||
|
dec SleepTime
|
||||||
|
.EndIf
|
||||||
|
.EndIf
|
||||||
|
Invoke Sleep, SleepTime
|
||||||
|
ret
|
||||||
|
Waiting EndP
|
||||||
|
;*******************************************************************************
|
||||||
|
@Main:
|
||||||
|
Invoke HeapCreate
|
||||||
|
mov Screen, @(GetScreenSize)
|
||||||
|
Invoke CreatePalette
|
||||||
|
movzx eax, Screen.SizeX
|
||||||
|
movzx ecx, Screen.SizeY
|
||||||
|
mov ImageWidth, eax
|
||||||
|
mov ImageHeight, ecx
|
||||||
|
mul ecx
|
||||||
|
mov Image, @(HeapAllocate, eax)
|
||||||
|
mov FrameStart, @(GetTickCount)
|
||||||
|
Invoke SetEventMask, EM_REDRAW + EM_KEY
|
||||||
|
.Repeat
|
||||||
|
Invoke CheckEvent
|
||||||
|
.If eax == REDRAW_EVENT
|
||||||
|
Invoke BeginDraw
|
||||||
|
Invoke DrawWindow, 0, 0, ImageWidth, ImageHeight, 0, 0, WS_FILL_TRANSPARENT, 0
|
||||||
|
Invoke EndDraw
|
||||||
|
.ElseIf eax == KEY_EVENT
|
||||||
|
Invoke ThreadTerminate
|
||||||
|
.Else
|
||||||
|
Invoke Render
|
||||||
|
Invoke QueryPerf
|
||||||
|
Invoke DrawImageEx, Image, 0, 0, ImageWidth, ImageHeight, 8, Offset Palette, 0
|
||||||
|
Invoke Waiting
|
||||||
|
.EndIf
|
||||||
|
.Until 0
|
||||||
|
END
|
4
programs/demos/PlasmaEffect/Tupfile.lua
Normal file
4
programs/demos/PlasmaEffect/Tupfile.lua
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
if tup.getconfig('NO_JWASM') ~= "" or tup.getconfig("NO_GCC") ~= "" then return end
|
||||||
|
|
||||||
|
tup.rule({"PlasmaEffect.asm"}, "jwasm -zt0 -coff %f ", "PlasmaEffect.o")
|
||||||
|
tup.rule("PlasmaEffect.o", "kos32-ld -T LScript.x -o %o %f -L ../../../contrib/sdk/lib -l KolibriOS && kos32-objcopy %o -O binary -j .all" .. tup.getconfig("KPACK_CMD"),"PlasmaEffect")
|
6
programs/demos/PlasmaEffect/make.bat
Normal file
6
programs/demos/PlasmaEffect/make.bat
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
: %KolibriOS% - directory which contains KolibriOS.lib
|
||||||
|
uasm32 -zt0 -coff PlasmaEffect.asm
|
||||||
|
ld -T LScript.x PlasmaEffect.obj -o PlasmaEffect.kex -L %KolibriOS% -l KolibriOS
|
||||||
|
objcopy -O binary -j .all PlasmaEffect.kex
|
||||||
|
Del PlasmaEffect.obj
|
||||||
|
Pause
|
Loading…
Reference in New Issue
Block a user