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