basilisk-engine 0.1.10__py3-none-any.whl → 0.1.11__py3-none-any.whl
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/__init__.py +14 -14
- basilisk/audio/sound.py +27 -27
- basilisk/bsk_assets/cube.obj +48 -48
- basilisk/collisions/broad/broad_aabb.py +102 -102
- basilisk/collisions/broad/broad_bvh.py +137 -137
- basilisk/collisions/collider.py +95 -95
- basilisk/collisions/collider_handler.py +224 -224
- basilisk/collisions/narrow/contact_manifold.py +95 -95
- basilisk/collisions/narrow/dataclasses.py +34 -34
- basilisk/collisions/narrow/deprecated.py +46 -46
- basilisk/collisions/narrow/epa.py +91 -91
- basilisk/collisions/narrow/gjk.py +66 -66
- basilisk/collisions/narrow/graham_scan.py +24 -24
- basilisk/collisions/narrow/helper.py +29 -29
- basilisk/collisions/narrow/line_intersections.py +106 -106
- basilisk/collisions/narrow/sutherland_hodgman.py +75 -75
- basilisk/config.py +2 -2
- basilisk/draw/draw.py +100 -100
- basilisk/draw/draw_handler.py +179 -179
- basilisk/draw/font_renderer.py +28 -28
- basilisk/engine.py +206 -206
- basilisk/generic/abstract_bvh.py +15 -15
- basilisk/generic/abstract_custom.py +133 -133
- basilisk/generic/collisions.py +72 -72
- basilisk/generic/input_validation.py +66 -66
- basilisk/generic/math.py +6 -6
- basilisk/generic/matrices.py +35 -35
- basilisk/generic/meshes.py +72 -72
- basilisk/generic/quat.py +142 -142
- basilisk/generic/quat_methods.py +7 -7
- basilisk/generic/raycast_result.py +23 -23
- basilisk/generic/vec3.py +143 -143
- basilisk/input/mouse.py +61 -61
- basilisk/input/path.py +14 -14
- basilisk/mesh/cube.py +33 -33
- basilisk/mesh/mesh.py +230 -230
- basilisk/mesh/mesh_from_data.py +130 -130
- basilisk/mesh/model.py +271 -271
- basilisk/mesh/narrow_aabb.py +89 -89
- basilisk/mesh/narrow_bvh.py +91 -91
- basilisk/mesh/narrow_primative.py +23 -23
- basilisk/nodes/helper.py +28 -28
- basilisk/nodes/node.py +682 -682
- basilisk/nodes/node_handler.py +95 -95
- basilisk/particles/particle_handler.py +63 -63
- basilisk/particles/particle_renderer.py +87 -87
- basilisk/physics/impulse.py +112 -112
- basilisk/physics/physics_body.py +43 -43
- basilisk/physics/physics_engine.py +35 -35
- basilisk/render/batch.py +105 -86
- basilisk/render/camera.py +206 -206
- basilisk/render/chunk.py +106 -99
- basilisk/render/chunk_handler.py +166 -155
- basilisk/render/frame.py +101 -101
- basilisk/render/framebuffer.py +130 -130
- basilisk/render/image.py +87 -87
- basilisk/render/image_handler.py +122 -122
- basilisk/render/light.py +96 -96
- basilisk/render/light_handler.py +58 -58
- basilisk/render/material.py +219 -219
- basilisk/render/material_handler.py +135 -135
- basilisk/render/post_process.py +132 -132
- basilisk/render/shader.py +110 -109
- basilisk/render/shader_handler.py +79 -79
- basilisk/render/sky.py +120 -120
- basilisk/scene.py +264 -264
- basilisk/shaders/batch.frag +276 -276
- basilisk/shaders/batch.vert +115 -115
- basilisk/shaders/crt.frag +31 -31
- basilisk/shaders/draw.frag +21 -21
- basilisk/shaders/draw.vert +21 -21
- basilisk/shaders/filter.frag +22 -22
- basilisk/shaders/frame.frag +12 -12
- basilisk/shaders/frame.vert +13 -13
- basilisk/shaders/geometry.frag +8 -8
- basilisk/shaders/geometry.vert +41 -41
- basilisk/shaders/normal.frag +59 -59
- basilisk/shaders/normal.vert +96 -96
- basilisk/shaders/particle.frag +71 -71
- basilisk/shaders/particle.vert +84 -84
- basilisk/shaders/sky.frag +9 -9
- basilisk/shaders/sky.vert +13 -13
- {basilisk_engine-0.1.10.dist-info → basilisk_engine-0.1.11.dist-info}/METADATA +38 -45
- basilisk_engine-0.1.11.dist-info/RECORD +103 -0
- {basilisk_engine-0.1.10.dist-info → basilisk_engine-0.1.11.dist-info}/WHEEL +1 -1
- basilisk_engine-0.1.10.dist-info/RECORD +0 -103
- {basilisk_engine-0.1.10.dist-info → basilisk_engine-0.1.11.dist-info}/top_level.txt +0 -0
basilisk/generic/vec3.py
CHANGED
|
@@ -1,144 +1,144 @@
|
|
|
1
|
-
import glm
|
|
2
|
-
import numpy as np
|
|
3
|
-
from .abstract_custom import Custom
|
|
4
|
-
|
|
5
|
-
class Vec3(Custom):
|
|
6
|
-
def __init__(self, *args, callback=None):
|
|
7
|
-
self.callback = callback
|
|
8
|
-
self.prev_data = glm.vec3(0.0)
|
|
9
|
-
|
|
10
|
-
if len(args) == 1:
|
|
11
|
-
|
|
12
|
-
if isinstance(args[0], Vec3):
|
|
13
|
-
self.data = glm.vec3(args[0].data)
|
|
14
|
-
self.prev_data = glm.vec3(args[0].prev_data)
|
|
15
|
-
self.callback = args[0].callback
|
|
16
|
-
|
|
17
|
-
elif isinstance(args[0], glm.vec3):
|
|
18
|
-
self.data = args[0]
|
|
19
|
-
|
|
20
|
-
elif isinstance(args[0], tuple) or isinstance(args[0], list) or isinstance(args[0], np.ndarray):
|
|
21
|
-
assert len(args[0]) == 3, f'Vec3: Expected 3 values from incoming vector, got {len(args[0])}'
|
|
22
|
-
self.data = glm.vec3(args[0])
|
|
23
|
-
|
|
24
|
-
else:
|
|
25
|
-
try: self.data = glm.vec3(args[0])
|
|
26
|
-
except: raise ValueError(f'Vec3: Unexpected incoming vector type {args[0]}')
|
|
27
|
-
|
|
28
|
-
elif len(args) == 3: self.data = glm.vec3(*args)
|
|
29
|
-
else: raise ValueError(f'Vec3: Expected either 1 vector or 3 numbers, got {len(args)} values')
|
|
30
|
-
|
|
31
|
-
def apply_function(self, other, func, func_name):
|
|
32
|
-
vec = glm.vec3(self.data)
|
|
33
|
-
|
|
34
|
-
if isinstance(other, (glm.vec3, glm.quat)):
|
|
35
|
-
vec = func(vec, other)
|
|
36
|
-
|
|
37
|
-
elif isinstance(other, tuple) or isinstance(other, list) or isinstance(other, np.ndarray):
|
|
38
|
-
assert len(other) == 3, f'Vec3: Number of added values must be 3, got {len(other)}'
|
|
39
|
-
vec = func(vec, other)
|
|
40
|
-
|
|
41
|
-
elif isinstance(other, Custom): # perserve self.callback over other.callback. this should never be done by the user
|
|
42
|
-
vec = func(vec, other.data)
|
|
43
|
-
|
|
44
|
-
else:
|
|
45
|
-
try: vec = func(vec, other)
|
|
46
|
-
except: raise ValueError(f'Vec3: Not an accepted type for {func_name}, got {type(other)}')
|
|
47
|
-
return Vec3(vec)
|
|
48
|
-
|
|
49
|
-
# unary operators
|
|
50
|
-
def __neg__(self):
|
|
51
|
-
return Vec3(-self.data, callback=self.callback)
|
|
52
|
-
|
|
53
|
-
def __abs__(self):
|
|
54
|
-
return Vec3(abs(self.data), callback=self.callback)
|
|
55
|
-
|
|
56
|
-
# accessor functions
|
|
57
|
-
def __getitem__(self, index):
|
|
58
|
-
assert int(index) == index, f'Vec3: index must be an int, got {type(index)}' # check if index is a float
|
|
59
|
-
assert 0 <= index <= 2, f'Vec3: index out of bounds, got {index}'
|
|
60
|
-
return self.data[index]
|
|
61
|
-
|
|
62
|
-
def __setitem__(self, index, value):
|
|
63
|
-
assert int(index) == index, f'Vec3: index must be an int, got {type(index)}' # check if index is a float
|
|
64
|
-
assert 0 <= index <= 2, f'Vec3: index out of bounds, got {index}'
|
|
65
|
-
try: self.data[index] = value
|
|
66
|
-
except: raise ValueError(f'Vec3: Invalid element type, got {type(value)}')
|
|
67
|
-
|
|
68
|
-
def __delitem__(self, index): # index in a vec cannot be deleted, so we default to zero
|
|
69
|
-
assert int(index) == index, f'Vec3: index must be an int, got {type(index)}' # check if index is a float
|
|
70
|
-
assert 0 <= index <= 2, f'Vec3: index out of bounds, got {index}'
|
|
71
|
-
self.data[index] = 0
|
|
72
|
-
|
|
73
|
-
def __len__(self):
|
|
74
|
-
return 3
|
|
75
|
-
|
|
76
|
-
def __iter__(self):
|
|
77
|
-
return iter(self.data)
|
|
78
|
-
|
|
79
|
-
def __contains__(self, item):
|
|
80
|
-
return item in self.data
|
|
81
|
-
|
|
82
|
-
# override str operators
|
|
83
|
-
def __repr__(self):
|
|
84
|
-
return 'bsk ' + str(self.data)
|
|
85
|
-
|
|
86
|
-
def __str__(self):
|
|
87
|
-
return 'bsk ' + str(self.data)
|
|
88
|
-
|
|
89
|
-
@property
|
|
90
|
-
def data(self): return self._data
|
|
91
|
-
@property
|
|
92
|
-
def x(self): return self.data.x
|
|
93
|
-
@property
|
|
94
|
-
def y(self): return self.data.y
|
|
95
|
-
@property
|
|
96
|
-
def z(self): return self.data.z
|
|
97
|
-
|
|
98
|
-
@data.setter
|
|
99
|
-
def data(self, value: glm.vec3):
|
|
100
|
-
self._data = glm.vec3(value)
|
|
101
|
-
cur = self._data
|
|
102
|
-
prev = self.prev_data
|
|
103
|
-
thresh = 1e-6
|
|
104
|
-
|
|
105
|
-
if self.callback and (abs(cur.x - prev.x) > thresh or abs(cur.y - prev.y) > thresh or abs(cur.z - prev.z) > thresh):
|
|
106
|
-
self.prev_data = glm.vec3(self._data)
|
|
107
|
-
self.callback()
|
|
108
|
-
|
|
109
|
-
@x.setter
|
|
110
|
-
def x(self, value):
|
|
111
|
-
self._data.x = value
|
|
112
|
-
if self.callback and abs(value - self.prev_data.x) > 1e-6:
|
|
113
|
-
self.prev_data.x = value
|
|
114
|
-
self.callback()
|
|
115
|
-
|
|
116
|
-
@y.setter
|
|
117
|
-
def y(self, value):
|
|
118
|
-
self._data.y = value
|
|
119
|
-
if self.callback and abs(value - self.prev_data.y) > 1e-6:
|
|
120
|
-
self.prev_data.y = value
|
|
121
|
-
self.callback()
|
|
122
|
-
|
|
123
|
-
@z.setter
|
|
124
|
-
def z(self, value):
|
|
125
|
-
self._data.z = value
|
|
126
|
-
if self.callback and abs(value - self.prev_data.z) > 1e-6:
|
|
127
|
-
self.prev_data.z = value
|
|
128
|
-
self.callback()
|
|
129
|
-
|
|
130
|
-
class Node():
|
|
131
|
-
|
|
132
|
-
def __init__(self, pos):
|
|
133
|
-
|
|
134
|
-
def callback(): print('calling back')
|
|
135
|
-
self.pos_callback = callback
|
|
136
|
-
self._pos = Vec3(pos, callback=self.pos_callback)
|
|
137
|
-
|
|
138
|
-
@property
|
|
139
|
-
def pos(self): return self._pos
|
|
140
|
-
|
|
141
|
-
@pos.setter
|
|
142
|
-
def pos(self, value):
|
|
143
|
-
if isinstance(value, Vec3): self._pos.data = value.data
|
|
1
|
+
import glm
|
|
2
|
+
import numpy as np
|
|
3
|
+
from .abstract_custom import Custom
|
|
4
|
+
|
|
5
|
+
class Vec3(Custom):
|
|
6
|
+
def __init__(self, *args, callback=None):
|
|
7
|
+
self.callback = callback
|
|
8
|
+
self.prev_data = glm.vec3(0.0)
|
|
9
|
+
|
|
10
|
+
if len(args) == 1:
|
|
11
|
+
|
|
12
|
+
if isinstance(args[0], Vec3):
|
|
13
|
+
self.data = glm.vec3(args[0].data)
|
|
14
|
+
self.prev_data = glm.vec3(args[0].prev_data)
|
|
15
|
+
self.callback = args[0].callback
|
|
16
|
+
|
|
17
|
+
elif isinstance(args[0], glm.vec3):
|
|
18
|
+
self.data = args[0]
|
|
19
|
+
|
|
20
|
+
elif isinstance(args[0], tuple) or isinstance(args[0], list) or isinstance(args[0], np.ndarray):
|
|
21
|
+
assert len(args[0]) == 3, f'Vec3: Expected 3 values from incoming vector, got {len(args[0])}'
|
|
22
|
+
self.data = glm.vec3(args[0])
|
|
23
|
+
|
|
24
|
+
else:
|
|
25
|
+
try: self.data = glm.vec3(args[0])
|
|
26
|
+
except: raise ValueError(f'Vec3: Unexpected incoming vector type {args[0]}')
|
|
27
|
+
|
|
28
|
+
elif len(args) == 3: self.data = glm.vec3(*args)
|
|
29
|
+
else: raise ValueError(f'Vec3: Expected either 1 vector or 3 numbers, got {len(args)} values')
|
|
30
|
+
|
|
31
|
+
def apply_function(self, other, func, func_name):
|
|
32
|
+
vec = glm.vec3(self.data)
|
|
33
|
+
|
|
34
|
+
if isinstance(other, (glm.vec3, glm.quat)):
|
|
35
|
+
vec = func(vec, other)
|
|
36
|
+
|
|
37
|
+
elif isinstance(other, tuple) or isinstance(other, list) or isinstance(other, np.ndarray):
|
|
38
|
+
assert len(other) == 3, f'Vec3: Number of added values must be 3, got {len(other)}'
|
|
39
|
+
vec = func(vec, other)
|
|
40
|
+
|
|
41
|
+
elif isinstance(other, Custom): # perserve self.callback over other.callback. this should never be done by the user
|
|
42
|
+
vec = func(vec, other.data)
|
|
43
|
+
|
|
44
|
+
else:
|
|
45
|
+
try: vec = func(vec, other)
|
|
46
|
+
except: raise ValueError(f'Vec3: Not an accepted type for {func_name}, got {type(other)}')
|
|
47
|
+
return Vec3(vec)
|
|
48
|
+
|
|
49
|
+
# unary operators
|
|
50
|
+
def __neg__(self):
|
|
51
|
+
return Vec3(-self.data, callback=self.callback)
|
|
52
|
+
|
|
53
|
+
def __abs__(self):
|
|
54
|
+
return Vec3(abs(self.data), callback=self.callback)
|
|
55
|
+
|
|
56
|
+
# accessor functions
|
|
57
|
+
def __getitem__(self, index):
|
|
58
|
+
assert int(index) == index, f'Vec3: index must be an int, got {type(index)}' # check if index is a float
|
|
59
|
+
assert 0 <= index <= 2, f'Vec3: index out of bounds, got {index}'
|
|
60
|
+
return self.data[index]
|
|
61
|
+
|
|
62
|
+
def __setitem__(self, index, value):
|
|
63
|
+
assert int(index) == index, f'Vec3: index must be an int, got {type(index)}' # check if index is a float
|
|
64
|
+
assert 0 <= index <= 2, f'Vec3: index out of bounds, got {index}'
|
|
65
|
+
try: self.data[index] = value
|
|
66
|
+
except: raise ValueError(f'Vec3: Invalid element type, got {type(value)}')
|
|
67
|
+
|
|
68
|
+
def __delitem__(self, index): # index in a vec cannot be deleted, so we default to zero
|
|
69
|
+
assert int(index) == index, f'Vec3: index must be an int, got {type(index)}' # check if index is a float
|
|
70
|
+
assert 0 <= index <= 2, f'Vec3: index out of bounds, got {index}'
|
|
71
|
+
self.data[index] = 0
|
|
72
|
+
|
|
73
|
+
def __len__(self):
|
|
74
|
+
return 3
|
|
75
|
+
|
|
76
|
+
def __iter__(self):
|
|
77
|
+
return iter(self.data)
|
|
78
|
+
|
|
79
|
+
def __contains__(self, item):
|
|
80
|
+
return item in self.data
|
|
81
|
+
|
|
82
|
+
# override str operators
|
|
83
|
+
def __repr__(self):
|
|
84
|
+
return 'bsk ' + str(self.data)
|
|
85
|
+
|
|
86
|
+
def __str__(self):
|
|
87
|
+
return 'bsk ' + str(self.data)
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def data(self): return self._data
|
|
91
|
+
@property
|
|
92
|
+
def x(self): return self.data.x
|
|
93
|
+
@property
|
|
94
|
+
def y(self): return self.data.y
|
|
95
|
+
@property
|
|
96
|
+
def z(self): return self.data.z
|
|
97
|
+
|
|
98
|
+
@data.setter
|
|
99
|
+
def data(self, value: glm.vec3):
|
|
100
|
+
self._data = glm.vec3(value)
|
|
101
|
+
cur = self._data
|
|
102
|
+
prev = self.prev_data
|
|
103
|
+
thresh = 1e-6
|
|
104
|
+
|
|
105
|
+
if self.callback and (abs(cur.x - prev.x) > thresh or abs(cur.y - prev.y) > thresh or abs(cur.z - prev.z) > thresh):
|
|
106
|
+
self.prev_data = glm.vec3(self._data)
|
|
107
|
+
self.callback()
|
|
108
|
+
|
|
109
|
+
@x.setter
|
|
110
|
+
def x(self, value):
|
|
111
|
+
self._data.x = value
|
|
112
|
+
if self.callback and abs(value - self.prev_data.x) > 1e-6:
|
|
113
|
+
self.prev_data.x = value
|
|
114
|
+
self.callback()
|
|
115
|
+
|
|
116
|
+
@y.setter
|
|
117
|
+
def y(self, value):
|
|
118
|
+
self._data.y = value
|
|
119
|
+
if self.callback and abs(value - self.prev_data.y) > 1e-6:
|
|
120
|
+
self.prev_data.y = value
|
|
121
|
+
self.callback()
|
|
122
|
+
|
|
123
|
+
@z.setter
|
|
124
|
+
def z(self, value):
|
|
125
|
+
self._data.z = value
|
|
126
|
+
if self.callback and abs(value - self.prev_data.z) > 1e-6:
|
|
127
|
+
self.prev_data.z = value
|
|
128
|
+
self.callback()
|
|
129
|
+
|
|
130
|
+
class Node():
|
|
131
|
+
|
|
132
|
+
def __init__(self, pos):
|
|
133
|
+
|
|
134
|
+
def callback(): print('calling back')
|
|
135
|
+
self.pos_callback = callback
|
|
136
|
+
self._pos = Vec3(pos, callback=self.pos_callback)
|
|
137
|
+
|
|
138
|
+
@property
|
|
139
|
+
def pos(self): return self._pos
|
|
140
|
+
|
|
141
|
+
@pos.setter
|
|
142
|
+
def pos(self, value):
|
|
143
|
+
if isinstance(value, Vec3): self._pos.data = value.data
|
|
144
144
|
else: self._pos.data = value
|
basilisk/input/mouse.py
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import pygame as pg
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class Mouse():
|
|
5
|
-
def __init__(self, grab=True):
|
|
6
|
-
self.x, self.y = pg.mouse.get_pos()
|
|
7
|
-
self.buttons = pg.mouse.get_pressed()
|
|
8
|
-
self.previous_buttons = pg.mouse.get_pressed()
|
|
9
|
-
self.grab = grab
|
|
10
|
-
|
|
11
|
-
def update(self, events):
|
|
12
|
-
"""
|
|
13
|
-
Updates all mouse state variables.
|
|
14
|
-
Checks for mouse-related events.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
self.x, self.y = pg.mouse.get_pos()
|
|
18
|
-
self.previous_buttons = self.buttons
|
|
19
|
-
self.buttons = pg.mouse.get_pressed()
|
|
20
|
-
|
|
21
|
-
for event in events:
|
|
22
|
-
if event.type == pg.KEYUP:
|
|
23
|
-
if event.key == pg.K_ESCAPE and self.grab:
|
|
24
|
-
# Unlock mouse
|
|
25
|
-
pg.event.set_grab(False)
|
|
26
|
-
pg.mouse.set_visible(True)
|
|
27
|
-
if event.type == pg.MOUSEBUTTONUP and self.grab:
|
|
28
|
-
# Lock mouse
|
|
29
|
-
pg.event.set_grab(True)
|
|
30
|
-
pg.mouse.set_visible(False)
|
|
31
|
-
|
|
32
|
-
def set_pos(self, x, y):
|
|
33
|
-
"""Set the mouse position"""
|
|
34
|
-
pg.mouse.set_pos(x, y)
|
|
35
|
-
|
|
36
|
-
@property
|
|
37
|
-
def click(self): return self.buttons[0] and not self.previous_buttons[0]
|
|
38
|
-
@property
|
|
39
|
-
def left_click(self): return self.buttons[0] and not self.previous_buttons[0]
|
|
40
|
-
@property
|
|
41
|
-
def middle_click(self): return self.buttons[1] and not self.previous_buttons[1]
|
|
42
|
-
@property
|
|
43
|
-
def right_click(self): return self.buttons[2] and not self.previous_buttons[2]
|
|
44
|
-
@property
|
|
45
|
-
def left_down(self): return self.buttons[0]
|
|
46
|
-
@property
|
|
47
|
-
def middle_down(self): return self.buttons[1]
|
|
48
|
-
@property
|
|
49
|
-
def right_down(self): return self.buttons[2]
|
|
50
|
-
|
|
51
|
-
@property
|
|
52
|
-
def grab(self): return self._grab
|
|
53
|
-
|
|
54
|
-
@grab.setter
|
|
55
|
-
def grab(self, value):
|
|
56
|
-
self._grab = value
|
|
57
|
-
if self._grab:
|
|
58
|
-
pg.event.set_grab(True)
|
|
59
|
-
pg.mouse.set_visible(False)
|
|
60
|
-
else:
|
|
61
|
-
pg.event.set_grab(False)
|
|
1
|
+
import pygame as pg
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Mouse():
|
|
5
|
+
def __init__(self, grab=True):
|
|
6
|
+
self.x, self.y = pg.mouse.get_pos()
|
|
7
|
+
self.buttons = pg.mouse.get_pressed()
|
|
8
|
+
self.previous_buttons = pg.mouse.get_pressed()
|
|
9
|
+
self.grab = grab
|
|
10
|
+
|
|
11
|
+
def update(self, events):
|
|
12
|
+
"""
|
|
13
|
+
Updates all mouse state variables.
|
|
14
|
+
Checks for mouse-related events.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
self.x, self.y = pg.mouse.get_pos()
|
|
18
|
+
self.previous_buttons = self.buttons
|
|
19
|
+
self.buttons = pg.mouse.get_pressed()
|
|
20
|
+
|
|
21
|
+
for event in events:
|
|
22
|
+
if event.type == pg.KEYUP:
|
|
23
|
+
if event.key == pg.K_ESCAPE and self.grab:
|
|
24
|
+
# Unlock mouse
|
|
25
|
+
pg.event.set_grab(False)
|
|
26
|
+
pg.mouse.set_visible(True)
|
|
27
|
+
if event.type == pg.MOUSEBUTTONUP and self.grab:
|
|
28
|
+
# Lock mouse
|
|
29
|
+
pg.event.set_grab(True)
|
|
30
|
+
pg.mouse.set_visible(False)
|
|
31
|
+
|
|
32
|
+
def set_pos(self, x, y):
|
|
33
|
+
"""Set the mouse position"""
|
|
34
|
+
pg.mouse.set_pos(x, y)
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def click(self): return self.buttons[0] and not self.previous_buttons[0]
|
|
38
|
+
@property
|
|
39
|
+
def left_click(self): return self.buttons[0] and not self.previous_buttons[0]
|
|
40
|
+
@property
|
|
41
|
+
def middle_click(self): return self.buttons[1] and not self.previous_buttons[1]
|
|
42
|
+
@property
|
|
43
|
+
def right_click(self): return self.buttons[2] and not self.previous_buttons[2]
|
|
44
|
+
@property
|
|
45
|
+
def left_down(self): return self.buttons[0]
|
|
46
|
+
@property
|
|
47
|
+
def middle_down(self): return self.buttons[1]
|
|
48
|
+
@property
|
|
49
|
+
def right_down(self): return self.buttons[2]
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def grab(self): return self._grab
|
|
53
|
+
|
|
54
|
+
@grab.setter
|
|
55
|
+
def grab(self, value):
|
|
56
|
+
self._grab = value
|
|
57
|
+
if self._grab:
|
|
58
|
+
pg.event.set_grab(True)
|
|
59
|
+
pg.mouse.set_visible(False)
|
|
60
|
+
else:
|
|
61
|
+
pg.event.set_grab(False)
|
|
62
62
|
pg.mouse.set_visible(True)
|
basilisk/input/path.py
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import sys
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
# Credit for function: https://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile
|
|
6
|
-
def get_root():
|
|
7
|
-
""" Get absolute path to resource, works for dev and for PyInstaller """
|
|
8
|
-
try:
|
|
9
|
-
# PyInstaller creates a temp folder and stores path in _MEIPASS
|
|
10
|
-
base_path = sys._MEIPASS
|
|
11
|
-
except Exception:
|
|
12
|
-
base_path = os.path.abspath(".")
|
|
13
|
-
|
|
14
|
-
return base_path + '/basilisk'
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
# Credit for function: https://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile
|
|
6
|
+
def get_root():
|
|
7
|
+
""" Get absolute path to resource, works for dev and for PyInstaller """
|
|
8
|
+
try:
|
|
9
|
+
# PyInstaller creates a temp folder and stores path in _MEIPASS
|
|
10
|
+
base_path = sys._MEIPASS
|
|
11
|
+
except Exception:
|
|
12
|
+
base_path = os.path.abspath(".")
|
|
13
|
+
|
|
14
|
+
return base_path + '/basilisk'
|
basilisk/mesh/cube.py
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import glm
|
|
2
|
-
import os
|
|
3
|
-
from .mesh import Mesh
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class Cube(Mesh):
|
|
7
|
-
def __init__(self, engine) -> None:
|
|
8
|
-
# built-in cube mesh with custom functions
|
|
9
|
-
path = engine.root + '/bsk_assets/cube.obj'
|
|
10
|
-
super().__init__(path)
|
|
11
|
-
|
|
12
|
-
self.dot_indices = [0 for _ in range(8)]
|
|
13
|
-
for i, point in enumerate(self.points):
|
|
14
|
-
index = 0
|
|
15
|
-
if point[0] > 0: index += 4
|
|
16
|
-
if point[1] > 0: index += 2
|
|
17
|
-
if point[2] > 0: index += 1
|
|
18
|
-
self.dot_indices[index] = i
|
|
19
|
-
|
|
20
|
-
def get_best_dot(self, vec: glm.vec3) -> int:
|
|
21
|
-
"""
|
|
22
|
-
Gets the best dot point of a cube
|
|
23
|
-
"""
|
|
24
|
-
index = 0
|
|
25
|
-
if vec[0] > 0: index += 4
|
|
26
|
-
if vec[1] > 0: index += 2
|
|
27
|
-
if vec[2] > 0: index += 1
|
|
28
|
-
return self.dot_indices[index]
|
|
29
|
-
|
|
30
|
-
def get_line_collided(self, position: glm.vec3, forward: glm.vec3) -> list[int]:
|
|
31
|
-
"""
|
|
32
|
-
Returns all the faces on the cube since the AABB degenerates on the cube mesh
|
|
33
|
-
"""
|
|
1
|
+
import glm
|
|
2
|
+
import os
|
|
3
|
+
from .mesh import Mesh
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Cube(Mesh):
|
|
7
|
+
def __init__(self, engine) -> None:
|
|
8
|
+
# built-in cube mesh with custom functions
|
|
9
|
+
path = engine.root + '/bsk_assets/cube.obj'
|
|
10
|
+
super().__init__(path)
|
|
11
|
+
|
|
12
|
+
self.dot_indices = [0 for _ in range(8)]
|
|
13
|
+
for i, point in enumerate(self.points):
|
|
14
|
+
index = 0
|
|
15
|
+
if point[0] > 0: index += 4
|
|
16
|
+
if point[1] > 0: index += 2
|
|
17
|
+
if point[2] > 0: index += 1
|
|
18
|
+
self.dot_indices[index] = i
|
|
19
|
+
|
|
20
|
+
def get_best_dot(self, vec: glm.vec3) -> int:
|
|
21
|
+
"""
|
|
22
|
+
Gets the best dot point of a cube
|
|
23
|
+
"""
|
|
24
|
+
index = 0
|
|
25
|
+
if vec[0] > 0: index += 4
|
|
26
|
+
if vec[1] > 0: index += 2
|
|
27
|
+
if vec[2] > 0: index += 1
|
|
28
|
+
return self.dot_indices[index]
|
|
29
|
+
|
|
30
|
+
def get_line_collided(self, position: glm.vec3, forward: glm.vec3) -> list[int]:
|
|
31
|
+
"""
|
|
32
|
+
Returns all the faces on the cube since the AABB degenerates on the cube mesh
|
|
33
|
+
"""
|
|
34
34
|
return [i for i in range(12)]
|