basilisk-engine 0.1.16__py3-none-any.whl → 0.1.18__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.

Files changed (87) hide show
  1. basilisk/__init__.py +15 -14
  2. basilisk/audio/sound.py +27 -27
  3. basilisk/bsk_assets/cube.obj +48 -48
  4. basilisk/collisions/broad/broad_aabb.py +102 -102
  5. basilisk/collisions/broad/broad_bvh.py +137 -137
  6. basilisk/collisions/collider.py +95 -95
  7. basilisk/collisions/collider_handler.py +224 -224
  8. basilisk/collisions/narrow/contact_manifold.py +95 -95
  9. basilisk/collisions/narrow/dataclasses.py +34 -34
  10. basilisk/collisions/narrow/deprecated.py +46 -46
  11. basilisk/collisions/narrow/epa.py +91 -91
  12. basilisk/collisions/narrow/gjk.py +66 -66
  13. basilisk/collisions/narrow/graham_scan.py +24 -24
  14. basilisk/collisions/narrow/helper.py +29 -29
  15. basilisk/collisions/narrow/line_intersections.py +106 -106
  16. basilisk/collisions/narrow/sutherland_hodgman.py +75 -75
  17. basilisk/config.py +2 -2
  18. basilisk/draw/draw.py +100 -100
  19. basilisk/draw/draw_handler.py +179 -179
  20. basilisk/draw/font_renderer.py +28 -28
  21. basilisk/engine.py +206 -206
  22. basilisk/generic/abstract_bvh.py +15 -15
  23. basilisk/generic/abstract_custom.py +133 -133
  24. basilisk/generic/collisions.py +72 -72
  25. basilisk/generic/input_validation.py +66 -66
  26. basilisk/generic/math.py +6 -6
  27. basilisk/generic/matrices.py +35 -35
  28. basilisk/generic/meshes.py +72 -72
  29. basilisk/generic/quat.py +142 -142
  30. basilisk/generic/quat_methods.py +7 -7
  31. basilisk/generic/raycast_result.py +26 -26
  32. basilisk/generic/vec3.py +143 -143
  33. basilisk/input/mouse.py +61 -61
  34. basilisk/input/path.py +14 -14
  35. basilisk/mesh/cube.py +33 -33
  36. basilisk/mesh/mesh.py +230 -230
  37. basilisk/mesh/mesh_from_data.py +130 -130
  38. basilisk/mesh/model.py +271 -271
  39. basilisk/mesh/narrow_aabb.py +89 -89
  40. basilisk/mesh/narrow_bvh.py +91 -91
  41. basilisk/mesh/narrow_primative.py +23 -23
  42. basilisk/nodes/helper.py +28 -28
  43. basilisk/nodes/node.py +684 -684
  44. basilisk/nodes/node_handler.py +96 -95
  45. basilisk/particles/particle_handler.py +64 -63
  46. basilisk/particles/particle_renderer.py +93 -87
  47. basilisk/physics/impulse.py +112 -112
  48. basilisk/physics/physics_body.py +43 -43
  49. basilisk/physics/physics_engine.py +35 -35
  50. basilisk/render/batch.py +105 -105
  51. basilisk/render/camera.py +211 -211
  52. basilisk/render/chunk.py +106 -106
  53. basilisk/render/chunk_handler.py +165 -165
  54. basilisk/render/frame.py +101 -101
  55. basilisk/render/framebuffer.py +130 -130
  56. basilisk/render/image.py +87 -87
  57. basilisk/render/image_handler.py +122 -122
  58. basilisk/render/light.py +96 -96
  59. basilisk/render/light_handler.py +58 -58
  60. basilisk/render/material.py +219 -219
  61. basilisk/render/material_handler.py +135 -135
  62. basilisk/render/post_process.py +132 -132
  63. basilisk/render/shader.py +110 -110
  64. basilisk/render/shader_handler.py +80 -80
  65. basilisk/render/sky.py +120 -120
  66. basilisk/scene.py +276 -276
  67. basilisk/shaders/batch.frag +276 -276
  68. basilisk/shaders/batch.vert +115 -115
  69. basilisk/shaders/crt.frag +31 -31
  70. basilisk/shaders/draw.frag +21 -21
  71. basilisk/shaders/draw.vert +21 -21
  72. basilisk/shaders/filter.frag +22 -22
  73. basilisk/shaders/frame.frag +12 -12
  74. basilisk/shaders/frame.vert +13 -13
  75. basilisk/shaders/geometry.frag +8 -8
  76. basilisk/shaders/geometry.vert +41 -41
  77. basilisk/shaders/normal.frag +59 -59
  78. basilisk/shaders/normal.vert +96 -96
  79. basilisk/shaders/particle.frag +71 -71
  80. basilisk/shaders/particle.vert +84 -84
  81. basilisk/shaders/sky.frag +9 -9
  82. basilisk/shaders/sky.vert +13 -13
  83. {basilisk_engine-0.1.16.dist-info → basilisk_engine-0.1.18.dist-info}/METADATA +45 -38
  84. basilisk_engine-0.1.18.dist-info/RECORD +103 -0
  85. {basilisk_engine-0.1.16.dist-info → basilisk_engine-0.1.18.dist-info}/WHEEL +1 -1
  86. basilisk_engine-0.1.16.dist-info/RECORD +0 -103
  87. {basilisk_engine-0.1.16.dist-info → basilisk_engine-0.1.18.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)]