63 lines
1.7 KiB
Python
63 lines
1.7 KiB
Python
import vpsdk.window as window
|
|
import vpsdk.process as process
|
|
import vpsdk.vpui as vpui
|
|
import viperstring as string
|
|
import vipermath
|
|
from stdint import *
|
|
import gfx
|
|
import t, c
|
|
|
|
SCENE_W: t.CDefine = 640
|
|
SCENE_H: t.CDefine = 360
|
|
|
|
_zbuf_mem: t.CArray[t.CUInt8T, SCENE_W * SCENE_H * 8]
|
|
_fb_mem: t.CArray[t.CUInt32T, SCENE_W * SCENE_H]
|
|
|
|
_root_ptr: vpui.Tk | t.CPtr
|
|
_canvas_ptr: vpui.FBCanvas | t.CPtr
|
|
_s3d_ptr: gfx.Scene3D | t.CPtr
|
|
_time_val: float = float(0.0)
|
|
|
|
def _render_thread(arg: t.CVoid | t.CPtr) -> t.CVoid:
|
|
root: vpui.Tk | t.CPtr = _root_ptr
|
|
canvas: vpui.FBCanvas | t.CPtr = _canvas_ptr
|
|
s3d: gfx.Scene3D | t.CPtr = _s3d_ptr
|
|
while root.winfo_exists():
|
|
s3d.Render(_time_val)
|
|
_time_val += float(0.02)
|
|
root.update()
|
|
process.yield_cpu()
|
|
|
|
@c.Attribute(t.attr.section(".text.startup"), t.attr.aligned(16))
|
|
def _start() -> t.CInt | t.CExport:
|
|
root: vpui.Tk = vpui.Tk()
|
|
root.title("3D Scene")
|
|
root.set_style(window.STYLE_WIN11)
|
|
root.bg_color = t.CUInt32T(0x0F0F19)
|
|
master: vpui.Tk | t.CPtr = c.Addr(root)
|
|
|
|
canvas: vpui.FBCanvas = vpui.FBCanvas(master, SCENE_W, SCENE_H)
|
|
root.pack(0, vpui.PACK_TOP, vpui.FILL_BOTH, 1, 0, 0)
|
|
|
|
zbuf: float | t.CPtr = t.CVoid(c.Addr(_zbuf_mem), t.CPtr)
|
|
string.memset(zbuf, 0, SCENE_W * SCENE_H * 8)
|
|
|
|
fb: UINT32PTR = c.Addr(_fb_mem)
|
|
string.memset(fb, 0, SCENE_W * SCENE_H * 4)
|
|
canvas.set_fb(fb, SCENE_W, SCENE_H)
|
|
|
|
s3d: gfx.Scene3D = gfx.Scene3D(fb, zbuf, SCENE_W, SCENE_H)
|
|
|
|
root.geometry(100, 30, SCENE_W, SCENE_H + 32)
|
|
|
|
_root_ptr = c.Addr(root)
|
|
_canvas_ptr = c.Addr(canvas)
|
|
_s3d_ptr = c.Addr(s3d)
|
|
|
|
process.thread_create(_render_thread, None)
|
|
|
|
root.mainloop()
|
|
|
|
process.exit(0)
|
|
return 0
|