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