basilisk-engine 0.1.23__tar.gz → 0.1.25__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of basilisk-engine might be problematic. Click here for more details.
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/PKG-INFO +1 -1
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/__init__.py +1 -1
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/engine.py +5 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/input_output/IO_handler.py +1 -2
- basilisk_engine-0.1.25/basilisk/input_output/mouse.py +90 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/mesh/mesh.py +5 -2
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/mesh/mesh_from_data.py +23 -3
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/nodes/node.py +7 -4
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/batch.py +8 -10
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/camera.py +15 -24
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/chunk.py +4 -4
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/frame.py +5 -9
- basilisk_engine-0.1.25/basilisk/render/framebuffer.py +289 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/shader.py +12 -3
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk_engine.egg-info/PKG-INFO +1 -1
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk_engine.egg-info/SOURCES.txt +3 -1
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/setup.py +1 -1
- basilisk_engine-0.1.25/tests/shaders/custom_format.frag +10 -0
- basilisk_engine-0.1.25/tests/shaders/custom_format.vert +55 -0
- basilisk_engine-0.1.23/basilisk/input_output/mouse.py +0 -62
- basilisk_engine-0.1.23/basilisk/render/framebuffer.py +0 -132
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/MANIFEST.in +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/README.md +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/audio/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/audio/sound.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/bsk_assets/Roboto-Regular.ttf +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/bsk_assets/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/bsk_assets/basilisk.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/bsk_assets/cube.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/bsk_assets/skybox.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/broad/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/broad/broad_aabb.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/broad/broad_bvh.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/collider.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/collider_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/contact_manifold.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/dataclasses.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/deprecated.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/epa.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/gjk.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/graham_scan.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/helper.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/line_intersections.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/collisions/narrow/sutherland_hodgman.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/config.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/draw/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/draw/draw.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/draw/draw_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/draw/font_renderer.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/abstract_bvh.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/abstract_custom.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/collisions.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/input_validation.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/math.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/matrices.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/meshes.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/quat.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/quat_methods.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/raycast_result.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/generic/vec3.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/input_output/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/input_output/clock.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/input_output/keys.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/input_output/path.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/mesh/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/mesh/cube.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/mesh/model.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/mesh/narrow_aabb.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/mesh/narrow_bvh.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/mesh/narrow_primative.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/nodes/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/nodes/helper.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/nodes/node_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/particles/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/particles/particle_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/particles/particle_renderer.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/physics/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/physics/impulse.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/physics/physics_body.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/physics/physics_engine.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/chunk_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/image.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/image_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/light.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/light_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/material.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/material_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/post_process.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/shader_handler.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/render/sky.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/scene.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/__init__.py +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/batch.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/batch.vert +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/crt.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/draw.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/draw.vert +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/filter.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/frame.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/frame.vert +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/geometry.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/geometry.vert +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/normal.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/normal.vert +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/particle.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/particle.vert +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/sky.frag +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk/shaders/sky.vert +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk_engine.egg-info/dependency_links.txt +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk_engine.egg-info/requires.txt +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/basilisk_engine.egg-info/top_level.txt +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/docs/images/0_boilerplate.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/images/cloth.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/images/floor.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/images/foil.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/images/mud.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/setup.cfg +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/SkySkybox.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/brick.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/brick_normal.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/bunny.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/closet_001.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/cloth_albedo.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/cloth_normal.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/cube.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/cubemaps_skybox.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/cylinder.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/demo_sphere.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/dirt.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/floor_albedo.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/floor_normal.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/foil_normal.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/fridge_001.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/grass.jpg +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/grass_ao.jpg +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/grass_block_side.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/grass_block_top.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/grass_normal.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/grass_roughness.jpg +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/image.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/lucy.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/monkey.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/mud.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/mud_normal.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/oak_tree.obj +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/skybox.png +0 -0
- {basilisk_engine-0.1.23 → basilisk_engine-0.1.25}/tests/sphere.obj +0 -0
|
@@ -8,7 +8,7 @@ from .render.material import Material
|
|
|
8
8
|
from .render.shader import Shader
|
|
9
9
|
from .render.shader_handler import ShaderHandler
|
|
10
10
|
from .draw import draw
|
|
11
|
-
from .render.camera import FreeCamera, StaticCamera, FollowCamera, OrbitCamera
|
|
11
|
+
from .render.camera import FreeCamera, StaticCamera, FollowCamera, OrbitCamera, FixedCamera
|
|
12
12
|
from .render.sky import Sky
|
|
13
13
|
from .render.post_process import PostProcess
|
|
14
14
|
from .particles.particle_handler import ParticleHandler
|
|
@@ -41,6 +41,10 @@ class Engine():
|
|
|
41
41
|
"""Path to the root directory containing internal data"""
|
|
42
42
|
current_frame_updated: bool=False
|
|
43
43
|
"""Flag for if the engine has been updated this frame"""
|
|
44
|
+
keys: list[bool]
|
|
45
|
+
"""List of all keyboard inputs as booleans"""
|
|
46
|
+
previous_keys: list[bool]
|
|
47
|
+
"""List of all keyoard inputs from the last frame as booleans"""
|
|
44
48
|
|
|
45
49
|
def __init__(self, win_size=(800, 800), title="Basilisk Engine", vsync=None, max_fps=None, grab_mouse=True, headless=False, resizable=True) -> None:
|
|
46
50
|
"""
|
|
@@ -113,6 +117,7 @@ class Engine():
|
|
|
113
117
|
|
|
114
118
|
if self.current_frame_updated: return
|
|
115
119
|
|
|
120
|
+
for fbo in self.fbos: fbo.clear()
|
|
116
121
|
self.clock.update()
|
|
117
122
|
self.IO.update()
|
|
118
123
|
|
|
@@ -73,8 +73,7 @@ class IO:
|
|
|
73
73
|
self.event_resize = True
|
|
74
74
|
self.engine.win_size = (event.w, event.h)
|
|
75
75
|
self.engine.ctx.viewport = (0, 0, event.w, event.h)
|
|
76
|
-
self.engine.
|
|
77
|
-
# for fbo in self.fbos: fbo.resize()
|
|
76
|
+
for fbo in self.engine.fbos: fbo.resize()
|
|
78
77
|
|
|
79
78
|
def update_caption(self) -> None:
|
|
80
79
|
"""
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import pygame as pg
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Mouse():
|
|
5
|
+
def __init__(self, grab=True):
|
|
6
|
+
self._position = list(pg.mouse.get_pos())
|
|
7
|
+
self._relative = [0, 0]
|
|
8
|
+
self.buttons = pg.mouse.get_pressed()
|
|
9
|
+
self.previous_buttons = pg.mouse.get_pressed()
|
|
10
|
+
self.grab = grab
|
|
11
|
+
self.visible = not self.grab
|
|
12
|
+
|
|
13
|
+
def update(self, events):
|
|
14
|
+
"""
|
|
15
|
+
Updates all mouse state variables.
|
|
16
|
+
Checks for mouse-related events.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
self._position = list(pg.mouse.get_pos())
|
|
20
|
+
self._relative = list(pg.mouse.get_rel())
|
|
21
|
+
self.previous_buttons = self.buttons
|
|
22
|
+
self.buttons = pg.mouse.get_pressed()
|
|
23
|
+
|
|
24
|
+
for event in events:
|
|
25
|
+
if event.type == pg.KEYUP:
|
|
26
|
+
if event.key == pg.K_ESCAPE and self.grab:
|
|
27
|
+
# Unlock mouse
|
|
28
|
+
self.grab = False
|
|
29
|
+
self.visible = True
|
|
30
|
+
if event.type == pg.MOUSEBUTTONUP and not self.grab:
|
|
31
|
+
# Lock mouse
|
|
32
|
+
self.grab = True
|
|
33
|
+
self.visible = False
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def position(self): return self._position
|
|
37
|
+
@property
|
|
38
|
+
def x(self): return self._position[0]
|
|
39
|
+
@property
|
|
40
|
+
def y(self): return self._position[1]
|
|
41
|
+
@property
|
|
42
|
+
def relative(self): return self._relative
|
|
43
|
+
@property
|
|
44
|
+
def relative_x(self): return self._relative[0]
|
|
45
|
+
@property
|
|
46
|
+
def relative_y(self): return self._relative[1]
|
|
47
|
+
@property
|
|
48
|
+
def click(self): return self.buttons[0] and not self.previous_buttons[0]
|
|
49
|
+
@property
|
|
50
|
+
def left_click(self): return self.buttons[0] and not self.previous_buttons[0]
|
|
51
|
+
@property
|
|
52
|
+
def middle_click(self): return self.buttons[1] and not self.previous_buttons[1]
|
|
53
|
+
@property
|
|
54
|
+
def right_click(self): return self.buttons[2] and not self.previous_buttons[2]
|
|
55
|
+
@property
|
|
56
|
+
def left_down(self): return self.buttons[0]
|
|
57
|
+
@property
|
|
58
|
+
def middle_down(self): return self.buttons[1]
|
|
59
|
+
@property
|
|
60
|
+
def right_down(self): return self.buttons[2]
|
|
61
|
+
@property
|
|
62
|
+
def grab(self): return self._grab
|
|
63
|
+
@property
|
|
64
|
+
def visible(self): return self._visable
|
|
65
|
+
|
|
66
|
+
@position.setter
|
|
67
|
+
def position(self, value: tuple[int]) -> tuple[int]:
|
|
68
|
+
self._position = value
|
|
69
|
+
pg.mouse.set_pos(self._position)
|
|
70
|
+
return self._position
|
|
71
|
+
@x.setter
|
|
72
|
+
def x(self, value: int) -> int:
|
|
73
|
+
self._position[0] = value
|
|
74
|
+
pg.mouse.set_pos(self._position)
|
|
75
|
+
return self._position
|
|
76
|
+
@y.setter
|
|
77
|
+
def y(self, value: int) -> int:
|
|
78
|
+
self._position[1] = value
|
|
79
|
+
pg.mouse.set_pos(self._position)
|
|
80
|
+
return self._position
|
|
81
|
+
@grab.setter
|
|
82
|
+
def grab(self, value) -> bool:
|
|
83
|
+
self._grab = value
|
|
84
|
+
pg.event.set_grab(self._grab)
|
|
85
|
+
return self._grab
|
|
86
|
+
@visible.setter
|
|
87
|
+
def visible(self, value) -> bool:
|
|
88
|
+
self._visible = value
|
|
89
|
+
pg.mouse.set_visible(self._visible)
|
|
90
|
+
return self._visible
|
|
@@ -30,12 +30,14 @@ class Mesh():
|
|
|
30
30
|
bvh: NarrowBVH
|
|
31
31
|
"""BVH for accessing triangle intersections with a line"""
|
|
32
32
|
|
|
33
|
-
def __init__(self, data: str | os.PathLike | np.ndarray) -> None:
|
|
33
|
+
def __init__(self, data: str | os.PathLike | np.ndarray, custom_format:bool=False) -> None:
|
|
34
34
|
"""
|
|
35
35
|
Mesh object containing all the data needed to render an object and perform physics/collisions on it
|
|
36
36
|
Args:
|
|
37
37
|
data: str
|
|
38
38
|
path to the .obj file of the model or an array of the mesh data
|
|
39
|
+
custom_format: bool
|
|
40
|
+
makes expected changes to the given data if false. Leaves data as given if true
|
|
39
41
|
"""
|
|
40
42
|
|
|
41
43
|
# Verify the path type
|
|
@@ -59,7 +61,7 @@ class Mesh():
|
|
|
59
61
|
self.data = np.hstack([self.data, tangents])
|
|
60
62
|
|
|
61
63
|
elif isinstance(data, np.ndarray):
|
|
62
|
-
model = from_data(data)
|
|
64
|
+
model = from_data(data, custom_format)
|
|
63
65
|
self.data = model.vertex_data
|
|
64
66
|
|
|
65
67
|
else: # Invalid data type
|
|
@@ -70,6 +72,7 @@ class Mesh():
|
|
|
70
72
|
self.indices = model.point_indices.copy()
|
|
71
73
|
|
|
72
74
|
self.hash = hash(str(self.data))
|
|
75
|
+
self.custom = custom_format
|
|
73
76
|
|
|
74
77
|
# generate edges from faces
|
|
75
78
|
edges = [set() for _ in range(len(self.points))]
|
|
@@ -2,14 +2,20 @@ import numpy as np
|
|
|
2
2
|
from .model import Model
|
|
3
3
|
import glm
|
|
4
4
|
|
|
5
|
-
def from_data(data: np.ndarray) -> Model:
|
|
5
|
+
def from_data(data: np.ndarray, custom_format:bool=False) -> Model:
|
|
6
6
|
"""
|
|
7
7
|
Converts data given to a format compatable with basilisk models
|
|
8
|
+
Args:
|
|
9
|
+
data: np.ndarray
|
|
10
|
+
array of the mesh data
|
|
11
|
+
custom_format: bool
|
|
12
|
+
makes expected changes to the given data if false. Leaves data as given if true
|
|
8
13
|
"""
|
|
9
14
|
|
|
15
|
+
if custom_format: return format_raw(data)
|
|
16
|
+
|
|
10
17
|
# Create an empty model
|
|
11
18
|
model = Model()
|
|
12
|
-
# Get the shape of the given data
|
|
13
19
|
|
|
14
20
|
# Get the shape of the given data and check for a valid shape
|
|
15
21
|
shape = data.shape
|
|
@@ -128,4 +134,18 @@ def get_points_and_indices(positions: np.ndarray) -> tuple[np.ndarray]:
|
|
|
128
134
|
for triangle in index_mapping:
|
|
129
135
|
indices[triangle].append(i)
|
|
130
136
|
|
|
131
|
-
return np.array(list(points.keys()), dtype='f4'), np.array(indices, dtype='i')
|
|
137
|
+
return np.array(list(points.keys()), dtype='f4'), np.array(indices, dtype='i')
|
|
138
|
+
|
|
139
|
+
def format_raw(data: np.ndarray) -> np.ndarray:
|
|
140
|
+
# Create an empty model
|
|
141
|
+
model = Model()
|
|
142
|
+
|
|
143
|
+
# Get the needed data (assume position is in the first three positions)
|
|
144
|
+
model.vertex_data = np.array(data, dtype='f4')
|
|
145
|
+
if model.vertex_data.shape[1] >= 3:
|
|
146
|
+
model.vertex_points, model.point_indices = get_points_and_indices(model.vertex_data[:,:3])
|
|
147
|
+
else:
|
|
148
|
+
model.vertex_points = np.zeros(shape=(1, model.vertex_data.shape[1]))
|
|
149
|
+
model.point_indices = np.zeros(shape=(1, 3))
|
|
150
|
+
|
|
151
|
+
return model
|
|
@@ -371,13 +371,16 @@ class Node():
|
|
|
371
371
|
if not per_vertex_mtl: node_data[-1] = self.material.index
|
|
372
372
|
|
|
373
373
|
# Create an array to hold the node's data
|
|
374
|
-
|
|
374
|
+
width = 25 if not self.mesh.custom else 11 + mesh_data.shape[1]
|
|
375
|
+
data = np.zeros(shape=(mesh_data.shape[0], width), dtype='f4')
|
|
375
376
|
|
|
376
377
|
|
|
377
|
-
data[:,:
|
|
378
|
-
data[:,
|
|
378
|
+
data[:,:mesh_data.shape[1]] = mesh_data
|
|
379
|
+
data[:,mesh_data.shape[1]:] = node_data
|
|
379
380
|
|
|
380
|
-
if per_vertex_mtl: data[
|
|
381
|
+
if per_vertex_mtl: data[:,-1] = self.material
|
|
382
|
+
|
|
383
|
+
if self.shader and not self.mesh.custom: data = np.take(data, self.shader.attribute_indices, axis=1)
|
|
381
384
|
|
|
382
385
|
return data
|
|
383
386
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import numpy as np
|
|
2
2
|
import moderngl as mgl
|
|
3
|
-
|
|
3
|
+
from .shader import Shader
|
|
4
4
|
|
|
5
5
|
class Batch():
|
|
6
6
|
chunk: ...
|
|
7
7
|
"""Reference to the parent chunk of the batch"""
|
|
8
8
|
ctx: mgl.Context
|
|
9
9
|
"""Reference to the context of the parent engine"""
|
|
10
|
-
|
|
11
|
-
"""Reference to the
|
|
10
|
+
shader: Shader
|
|
11
|
+
"""Reference to the bsk.Shader used by batches"""
|
|
12
12
|
vao: mgl.VertexArray
|
|
13
13
|
"""The vertex array of the batch. Used for rendering"""
|
|
14
14
|
vbo: mgl.Buffer
|
|
@@ -23,7 +23,7 @@ class Batch():
|
|
|
23
23
|
# Back references
|
|
24
24
|
self.chunk = chunk
|
|
25
25
|
self.ctx = chunk.chunk_handler.engine.ctx
|
|
26
|
-
self.
|
|
26
|
+
self.shader = self.chunk.get_shader()
|
|
27
27
|
|
|
28
28
|
# Set intial values
|
|
29
29
|
self.vbo = None
|
|
@@ -35,7 +35,7 @@ class Batch():
|
|
|
35
35
|
Returns True if batch was successful.
|
|
36
36
|
"""
|
|
37
37
|
|
|
38
|
-
self.
|
|
38
|
+
self.shader = self.chunk.get_shader()
|
|
39
39
|
|
|
40
40
|
# Empty list to contain all vertex data of models in the chunk
|
|
41
41
|
batch_data = []
|
|
@@ -68,11 +68,9 @@ class Batch():
|
|
|
68
68
|
|
|
69
69
|
# Create the vbo and the vao from mesh data
|
|
70
70
|
self.vbo = self.ctx.buffer(batch_data)
|
|
71
|
-
self.vao = self.ctx.vertex_array(self.program, [(self.vbo,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
skip_errors=True)
|
|
75
|
-
|
|
71
|
+
self.vao = self.ctx.vertex_array(self.shader.program, [(self.vbo, self.shader.fmt, *self.shader.attributes)], skip_errors=True)
|
|
72
|
+
|
|
73
|
+
|
|
76
74
|
return True
|
|
77
75
|
|
|
78
76
|
def swap_shader(self, shader):
|
|
@@ -24,7 +24,7 @@ class Camera:
|
|
|
24
24
|
position: glm.vec3
|
|
25
25
|
"""Location of the camera (maters)"""
|
|
26
26
|
|
|
27
|
-
def __init__(self, position=(0, 0, 20), rotation=(1, 0, 0, 0)
|
|
27
|
+
def __init__(self, position=(0, 0, 20), rotation=(1, 0, 0, 0)) -> None:
|
|
28
28
|
"""
|
|
29
29
|
Camera object to get view and projection matricies. Movement built in
|
|
30
30
|
"""
|
|
@@ -52,20 +52,6 @@ class Camera:
|
|
|
52
52
|
# self.update_camera_vectors()
|
|
53
53
|
self.m_view = self.get_view_matrix()
|
|
54
54
|
|
|
55
|
-
# def update_camera_vectors(self) -> None:
|
|
56
|
-
# """
|
|
57
|
-
# Computes the forward vector based on the pitch and yaw. Computes horizontal and vertical vectors with cross product.
|
|
58
|
-
# """
|
|
59
|
-
# yaw, pitch = glm.radians(self.yaw), glm.radians(self.pitch)
|
|
60
|
-
|
|
61
|
-
# self.forward.x = glm.cos(yaw) * glm.cos(pitch)
|
|
62
|
-
# self.forward.y = glm.sin(pitch)
|
|
63
|
-
# self.forward.z = glm.sin(yaw) * glm.cos(pitch)
|
|
64
|
-
|
|
65
|
-
# self.forward = glm.normalize(self.forward)
|
|
66
|
-
# self.right = glm.normalize(glm.cross(self.forward, self.UP))
|
|
67
|
-
# self.up = glm.normalize(glm.cross(self.right, self.forward))
|
|
68
|
-
|
|
69
55
|
def use(self):
|
|
70
56
|
# Updated aspect ratio of the screen
|
|
71
57
|
self.aspect_ratio = self.engine.win_size[0] / self.engine.win_size[1]
|
|
@@ -186,8 +172,8 @@ class Camera:
|
|
|
186
172
|
|
|
187
173
|
|
|
188
174
|
class FreeCamera(Camera):
|
|
189
|
-
def __init__(self, position=(0, 0, 20), rotation=(1, 0, 0, 0)
|
|
190
|
-
super().__init__(position, rotation
|
|
175
|
+
def __init__(self, position=(0, 0, 20), rotation=(1, 0, 0, 0)):
|
|
176
|
+
super().__init__(position, rotation)
|
|
191
177
|
|
|
192
178
|
def update(self) -> None:
|
|
193
179
|
"""
|
|
@@ -203,7 +189,7 @@ class FreeCamera(Camera):
|
|
|
203
189
|
"""
|
|
204
190
|
Rotates the camera based on the amount of mouse movement.
|
|
205
191
|
"""
|
|
206
|
-
rel_x, rel_y =
|
|
192
|
+
rel_x, rel_y = self.engine.mouse.relative
|
|
207
193
|
|
|
208
194
|
yaw_rotation = glm.angleAxis(SENSITIVITY * rel_x, -self.UP)
|
|
209
195
|
pitch_rotation = glm.angleAxis(SENSITIVITY * rel_y, -self.right)
|
|
@@ -231,11 +217,16 @@ class FreeCamera(Camera):
|
|
|
231
217
|
self.position += self.UP * velocity
|
|
232
218
|
if keys[pg.K_LSHIFT]:
|
|
233
219
|
self.position -= self.UP * velocity
|
|
220
|
+
|
|
221
|
+
class FixedCamera(FreeCamera):
|
|
222
|
+
def __init__(self, position=(0, 0, 20), rotation=(1, 0, 0, 0)):
|
|
223
|
+
super().__init__(position, rotation)
|
|
234
224
|
|
|
225
|
+
def move(self): pass
|
|
235
226
|
|
|
236
227
|
class FollowCamera(FreeCamera):
|
|
237
|
-
def __init__(self, parent, position=(0, 0, 20), rotation=(1, 0, 0, 0),
|
|
238
|
-
super().__init__(position, rotation
|
|
228
|
+
def __init__(self, parent, position=(0, 0, 20), rotation=(1, 0, 0, 0), offset=(0, 0, 0)):
|
|
229
|
+
super().__init__(position, rotation)
|
|
239
230
|
self.parent = parent
|
|
240
231
|
self.offest = glm.vec3(offset)
|
|
241
232
|
|
|
@@ -247,11 +238,11 @@ class FollowCamera(FreeCamera):
|
|
|
247
238
|
self.position = self.parent.position + self.offest
|
|
248
239
|
|
|
249
240
|
class OrbitCamera(FreeCamera):
|
|
250
|
-
def __init__(self, parent, position=(0, 0, 20), rotation=(1, 0, 0, 0),
|
|
241
|
+
def __init__(self, parent, position=(0, 0, 20), rotation=(1, 0, 0, 0), distance=5, offset=(0, 0)):
|
|
251
242
|
self.parent = parent
|
|
252
243
|
self.distance = distance
|
|
253
244
|
self.offset = glm.vec2(offset)
|
|
254
|
-
super().__init__(position, rotation
|
|
245
|
+
super().__init__(position, rotation)
|
|
255
246
|
|
|
256
247
|
def get_view_matrix(self) -> glm.mat4x4:
|
|
257
248
|
return glm.lookAt(self.position, self.parent.position, self.up)
|
|
@@ -263,5 +254,5 @@ class OrbitCamera(FreeCamera):
|
|
|
263
254
|
self.position = self.parent.position - glm.normalize(self.forward) * self.distance
|
|
264
255
|
|
|
265
256
|
class StaticCamera(Camera):
|
|
266
|
-
def __init__(self, position=(0, 0, 20), rotation=(1, 0, 0, 0)
|
|
267
|
-
super().__init__(position, rotation
|
|
257
|
+
def __init__(self, position=(0, 0, 20), rotation=(1, 0, 0, 0)):
|
|
258
|
+
super().__init__(position, rotation)
|
|
@@ -79,15 +79,15 @@ class Chunk():
|
|
|
79
79
|
|
|
80
80
|
return node
|
|
81
81
|
|
|
82
|
-
def
|
|
82
|
+
def get_shader(self):
|
|
83
83
|
"""
|
|
84
|
-
Gets the
|
|
84
|
+
Gets the bsk.Shader of the chunks nodes' shader
|
|
85
85
|
"""
|
|
86
86
|
|
|
87
87
|
shader = self.shader
|
|
88
88
|
|
|
89
|
-
if shader: return shader
|
|
90
|
-
return self.chunk_handler.engine.shader
|
|
89
|
+
if shader: return shader
|
|
90
|
+
return self.chunk_handler.engine.shader
|
|
91
91
|
|
|
92
92
|
def swap_shader(self, shader):
|
|
93
93
|
"""
|
|
@@ -11,7 +11,7 @@ class Frame:
|
|
|
11
11
|
vao: mgl.VertexArray=None
|
|
12
12
|
framebuffer: mgl.Framebuffer=None
|
|
13
13
|
|
|
14
|
-
def __init__(self, engine,
|
|
14
|
+
def __init__(self, engine, scale: float=1.0, linear_filter: bool=False) -> None:
|
|
15
15
|
"""
|
|
16
16
|
Basilisk render destination.
|
|
17
17
|
Can be used to render to the screen or for headless rendering
|
|
@@ -21,11 +21,8 @@ class Frame:
|
|
|
21
21
|
self.ctx = engine.ctx
|
|
22
22
|
|
|
23
23
|
# Load framebuffer
|
|
24
|
-
self.
|
|
25
|
-
self.
|
|
26
|
-
size = tuple(map(lambda x: int(x * self.resolution), self.engine.win_size))
|
|
27
|
-
self.framebuffer = Framebuffer(self.engine, size=size, filter=self.filter)
|
|
28
|
-
self.ping_pong_buffer = Framebuffer(self.engine, size=size, filter=self.filter)
|
|
24
|
+
self.framebuffer = Framebuffer(self.engine, scale=scale, linear_filter=linear_filter)
|
|
25
|
+
self.ping_pong_buffer = Framebuffer(self.engine, scale=scale, linear_filter=linear_filter)
|
|
29
26
|
|
|
30
27
|
# Load Shaders
|
|
31
28
|
self.shader = Shader(self.engine, self.engine.root + '/shaders/frame.vert', self.engine.root + '/shaders/frame.frag')
|
|
@@ -87,9 +84,8 @@ class Frame:
|
|
|
87
84
|
Resize the frame to the given size. None for window size
|
|
88
85
|
"""
|
|
89
86
|
|
|
90
|
-
|
|
91
|
-
self.
|
|
92
|
-
self.ping_pong_buffer.resize(size)
|
|
87
|
+
self.framebuffer.resize()
|
|
88
|
+
self.ping_pong_buffer.resize()
|
|
93
89
|
|
|
94
90
|
def __del__(self) -> None:
|
|
95
91
|
"""
|