Files
ViperOS/Apps/Scene3D/main.py
2026-07-19 12:38:20 +08:00

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