basilisk-engine 0.1.19__py3-none-any.whl → 0.1.20__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 -15
  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 -96
  45. basilisk/particles/particle_handler.py +64 -64
  46. basilisk/particles/particle_renderer.py +92 -92
  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 +221 -221
  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 +22 -21
  71. basilisk/shaders/draw.vert +25 -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.19.dist-info → basilisk_engine-0.1.20.dist-info}/METADATA +38 -45
  84. basilisk_engine-0.1.20.dist-info/RECORD +103 -0
  85. {basilisk_engine-0.1.19.dist-info → basilisk_engine-0.1.20.dist-info}/WHEEL +1 -1
  86. basilisk_engine-0.1.19.dist-info/RECORD +0 -103
  87. {basilisk_engine-0.1.19.dist-info → basilisk_engine-0.1.20.dist-info}/top_level.txt +0 -0
basilisk/render/camera.py CHANGED
@@ -1,222 +1,222 @@
1
- import pygame as pg
2
- import glm
3
- import numpy as np
4
- from ..generic.vec3 import Vec3
5
- from ..generic.quat import Quat
6
-
7
-
8
- # Camera view constants
9
- FOV = 50 # Degrees
10
- NEAR = 0.1
11
- FAR = 350
12
-
13
- # Camera movement constants
14
- SPEED = 10
15
- SENSITIVITY = 0.15
16
-
17
- class Camera:
18
- engine: ...
19
- """Back reference to the parent engine"""
20
- scene: ...
21
- """Back reference to the parent scene"""
22
- aspect_ratio: float
23
- """Aspect ratio of the engine window"""
24
- position: glm.vec3
25
- """Location of the camera (maters)"""
26
-
27
- def __init__(self, position=(0, 0, 20), yaw=-90, pitch=0) -> None:
28
- """
29
- Camera object to get view and projection matricies. Movement built in
30
- """
31
-
32
- # Back references
33
- self.scene = None
34
- self.engine = None
35
- # fov
36
- self.fov = 50
37
- # The initial aspect ratio of the screen
38
- self.aspect_ratio = 1.0
39
- # Position
40
- self.position = glm.vec3(position)
41
- # k vector for vertical movement
42
- self.UP = glm.vec3(0, 1, 0)
43
- # Movement vectors
44
- self.up = glm.vec3(0, 1, 0)
45
- self.right = glm.vec3(1, 0, 0)
46
- self.forward = glm.vec3(0, 0, -1)
47
- # Look directions in degrees
48
- self.yaw = yaw
49
- self.pitch = pitch
50
- # View matrix
51
- self.m_view = self.get_view_matrix()
52
- # Projection matrix
53
- self.m_proj = self.get_projection_matrix()
54
-
55
- def update(self) -> None:
56
- """
57
- Updates the camera view matrix
58
- """
59
-
60
- self.update_camera_vectors()
61
- self.m_view = self.get_view_matrix()
62
-
63
- def update_camera_vectors(self) -> None:
64
- """
65
- Computes the forward vector based on the pitch and yaw. Computes horizontal and vertical vectors with cross product.
66
- """
67
- yaw, pitch = glm.radians(self.yaw), glm.radians(self.pitch)
68
-
69
- self.forward.x = glm.cos(yaw) * glm.cos(pitch)
70
- self.forward.y = glm.sin(pitch)
71
- self.forward.z = glm.sin(yaw) * glm.cos(pitch)
72
-
73
- self.forward = glm.normalize(self.forward)
74
- self.right = glm.normalize(glm.cross(self.forward, self.UP))
75
- self.up = glm.normalize(glm.cross(self.right, self.forward))
76
-
77
- def use(self):
78
- # Updated aspect ratio of the screen
79
- self.aspect_ratio = self.engine.win_size[0] / self.engine.win_size[1]
80
- # View matrix
81
- self.m_view = self.get_view_matrix()
82
- # Projection matrix
83
- self.m_proj = self.get_projection_matrix()
84
-
85
- def get_view_matrix(self) -> glm.mat4x4:
86
- return glm.lookAt(self.position, self.position + self.forward, self.up)
87
-
88
- def get_projection_matrix(self) -> glm.mat4x4:
89
- return glm.perspective(glm.radians(self.fov), self.aspect_ratio, NEAR, FAR)
90
-
91
- def get_params(self) -> tuple:
92
- return self.engine, self.position, self.yaw, self.pitch
93
-
94
- def look_at(self, other) -> None:
95
- forward = glm.normalize(other.position - self.position)
96
- self.yaw = np.degrees(np.arctan2(forward.z, forward.x))
97
- self.pitch = np.degrees(np.arctan2(forward.y, np.sqrt(forward.x ** 2 + forward.z ** 2)))
98
-
99
- def __repr__(self):
100
- return f'<Basilisk Camera | Position: {self.position}, Direction: {self.forward}>'
101
-
102
- @property
103
- def scene(self): return self._scene
104
- @property
105
- def position(self): return self._position
106
- @property
107
- def direction(self): return self.forward
108
- @property
109
- def horizontal(self): return glm.normalize(self.forward.xz)
110
- @property
111
- def rotation(self): return glm.conjugate(glm.quatLookAt(self.forward, self.UP))
112
- @property
113
- def fov(self): return self._fov
114
-
115
- @scene.setter
116
- def scene(self, value):
117
- if value == None: return
118
- self._scene = value
119
- self.engine = self._scene.engine
120
- self.use()
121
-
122
- @position.setter
123
- def position(self, value: tuple | list | glm.vec3 | np.ndarray | Vec3):
124
- if isinstance(value, glm.vec3): self._position = glm.vec3(value)
125
- elif isinstance(value, Vec3): self._position = glm.vec3(value.data)
126
- elif isinstance(value, tuple) or isinstance(value, list) or isinstance(value, np.ndarray):
127
- if len(value) != 3: raise ValueError(f'Camera: Invalid number of values for position. Expected 3, got {len(value)}')
128
- self._position = glm.vec3(value)
129
- else: raise TypeError(f'Camera: Invalid position value type {type(value)}')
130
-
131
- @direction.setter
132
- def direction(self, value: tuple | list | glm.vec3 | np.ndarray | Vec3):
133
- if isinstance(value, glm.vec3): self.forward = glm.normalize(glm.vec3(value))
134
- elif isinstance(value, Vec3): self.forward = glm.normalize(value.data)
135
- elif isinstance(value, tuple) or isinstance(value, list) or isinstance(value, np.ndarray):
136
- if len(value) != 3: raise ValueError(f'Camera: Invalid number of values for direction. Expected 3, got {len(value)}')
137
- self.forward = glm.normalize(glm.vec3(value))
138
- else: raise TypeError(f'Camera: Invalid direction value type {type(value)}')
139
-
140
- @fov.setter
141
- def fov(self, value):
142
- self._fov = value
143
- if self.engine: self.use()
144
-
145
-
146
- class FreeCamera(Camera):
147
- def __init__(self, position=(0, 0, 20), yaw=-90, pitch=0):
148
- super().__init__(position, yaw, pitch)
149
-
150
- def update(self) -> None:
151
- """
152
- Updates the camera position and rotaiton based on user input
153
- """
154
-
155
- self.move()
156
- self.rotate()
157
- self.update_camera_vectors()
158
- self.m_view = self.get_view_matrix()
159
-
160
- def rotate(self) -> None:
161
- """
162
- Rotates the camera based on the amount of mouse movement.
163
- """
164
- rel_x, rel_y = pg.mouse.get_rel()
165
- self.yaw += rel_x * SENSITIVITY
166
- self.pitch -= rel_y * SENSITIVITY
167
- self.yaw = self.yaw % 360
168
- self.pitch = max(-89, min(89, self.pitch))
169
-
170
- def move(self) -> None:
171
- """
172
- Checks for button presses and updates vectors accordingly.
173
- """
174
- velocity = (SPEED + self.engine.keys[pg.K_CAPSLOCK] * 10) * self.engine.delta_time
175
- keys = self.engine.keys
176
- if keys[pg.K_w]:
177
- self.position += glm.normalize(glm.vec3(self.forward.x, 0, self.forward.z)) * velocity
178
- if keys[pg.K_s]:
179
- self.position -= glm.normalize(glm.vec3(self.forward.x, 0, self.forward.z)) * velocity
180
- if keys[pg.K_a]:
181
- self.position -= self.right * velocity
182
- if keys[pg.K_d]:
183
- self.position += self.right * velocity
184
- if keys[pg.K_SPACE]:
185
- self.position += self.UP * velocity
186
- if keys[pg.K_LSHIFT]:
187
- self.position -= self.UP * velocity
188
-
189
-
190
- class FollowCamera(FreeCamera):
191
- def __init__(self, parent, position=(0, 0, 20), yaw=-90, pitch=0, offset=(0, 0, 0)):
192
- super().__init__(position, yaw, pitch)
193
- self.parent = parent
194
- self.offest = glm.vec3(offset)
195
-
196
- def move(self) -> None:
197
- """
198
- Moves the camera to the parent node
199
- """
200
-
201
- self.position = self.parent.position + self.offest
202
-
203
- class OrbitCamera(FreeCamera):
204
- def __init__(self, parent, position=(0, 0, 20), yaw=-90, pitch=0, distance=5, offset=(0, 0)):
205
- self.parent = parent
206
- self.distance = distance
207
- self.offset = glm.vec2(offset)
208
- super().__init__(position, yaw, pitch)
209
-
210
- def get_view_matrix(self) -> glm.mat4x4:
211
- return glm.lookAt(self.position, self.parent.position, self.up)
212
-
213
- def move(self) -> None:
214
- """
215
- Moves the camera to the parent node
216
- """
217
-
218
- self.position = self.parent.position - glm.normalize(self.forward) * self.distance
219
-
220
- class StaticCamera(Camera):
221
- def __init__(self, position=(0, 0, 20), yaw=-90, pitch=0):
1
+ import pygame as pg
2
+ import glm
3
+ import numpy as np
4
+ from ..generic.vec3 import Vec3
5
+ from ..generic.quat import Quat
6
+
7
+
8
+ # Camera view constants
9
+ FOV = 50 # Degrees
10
+ NEAR = 0.1
11
+ FAR = 350
12
+
13
+ # Camera movement constants
14
+ SPEED = 10
15
+ SENSITIVITY = 0.15
16
+
17
+ class Camera:
18
+ engine: ...
19
+ """Back reference to the parent engine"""
20
+ scene: ...
21
+ """Back reference to the parent scene"""
22
+ aspect_ratio: float
23
+ """Aspect ratio of the engine window"""
24
+ position: glm.vec3
25
+ """Location of the camera (maters)"""
26
+
27
+ def __init__(self, position=(0, 0, 20), yaw=-90, pitch=0) -> None:
28
+ """
29
+ Camera object to get view and projection matricies. Movement built in
30
+ """
31
+
32
+ # Back references
33
+ self.scene = None
34
+ self.engine = None
35
+ # fov
36
+ self.fov = 50
37
+ # The initial aspect ratio of the screen
38
+ self.aspect_ratio = 1.0
39
+ # Position
40
+ self.position = glm.vec3(position)
41
+ # k vector for vertical movement
42
+ self.UP = glm.vec3(0, 1, 0)
43
+ # Movement vectors
44
+ self.up = glm.vec3(0, 1, 0)
45
+ self.right = glm.vec3(1, 0, 0)
46
+ self.forward = glm.vec3(0, 0, -1)
47
+ # Look directions in degrees
48
+ self.yaw = yaw
49
+ self.pitch = pitch
50
+ # View matrix
51
+ self.m_view = self.get_view_matrix()
52
+ # Projection matrix
53
+ self.m_proj = self.get_projection_matrix()
54
+
55
+ def update(self) -> None:
56
+ """
57
+ Updates the camera view matrix
58
+ """
59
+
60
+ self.update_camera_vectors()
61
+ self.m_view = self.get_view_matrix()
62
+
63
+ def update_camera_vectors(self) -> None:
64
+ """
65
+ Computes the forward vector based on the pitch and yaw. Computes horizontal and vertical vectors with cross product.
66
+ """
67
+ yaw, pitch = glm.radians(self.yaw), glm.radians(self.pitch)
68
+
69
+ self.forward.x = glm.cos(yaw) * glm.cos(pitch)
70
+ self.forward.y = glm.sin(pitch)
71
+ self.forward.z = glm.sin(yaw) * glm.cos(pitch)
72
+
73
+ self.forward = glm.normalize(self.forward)
74
+ self.right = glm.normalize(glm.cross(self.forward, self.UP))
75
+ self.up = glm.normalize(glm.cross(self.right, self.forward))
76
+
77
+ def use(self):
78
+ # Updated aspect ratio of the screen
79
+ self.aspect_ratio = self.engine.win_size[0] / self.engine.win_size[1]
80
+ # View matrix
81
+ self.m_view = self.get_view_matrix()
82
+ # Projection matrix
83
+ self.m_proj = self.get_projection_matrix()
84
+
85
+ def get_view_matrix(self) -> glm.mat4x4:
86
+ return glm.lookAt(self.position, self.position + self.forward, self.up)
87
+
88
+ def get_projection_matrix(self) -> glm.mat4x4:
89
+ return glm.perspective(glm.radians(self.fov), self.aspect_ratio, NEAR, FAR)
90
+
91
+ def get_params(self) -> tuple:
92
+ return self.engine, self.position, self.yaw, self.pitch
93
+
94
+ def look_at(self, other) -> None:
95
+ forward = glm.normalize(other.position - self.position)
96
+ self.yaw = np.degrees(np.arctan2(forward.z, forward.x))
97
+ self.pitch = np.degrees(np.arctan2(forward.y, np.sqrt(forward.x ** 2 + forward.z ** 2)))
98
+
99
+ def __repr__(self):
100
+ return f'<Basilisk Camera | Position: {self.position}, Direction: {self.forward}>'
101
+
102
+ @property
103
+ def scene(self): return self._scene
104
+ @property
105
+ def position(self): return self._position
106
+ @property
107
+ def direction(self): return self.forward
108
+ @property
109
+ def horizontal(self): return glm.normalize(self.forward.xz)
110
+ @property
111
+ def rotation(self): return glm.conjugate(glm.quatLookAt(self.forward, self.UP))
112
+ @property
113
+ def fov(self): return self._fov
114
+
115
+ @scene.setter
116
+ def scene(self, value):
117
+ if value == None: return
118
+ self._scene = value
119
+ self.engine = self._scene.engine
120
+ self.use()
121
+
122
+ @position.setter
123
+ def position(self, value: tuple | list | glm.vec3 | np.ndarray | Vec3):
124
+ if isinstance(value, glm.vec3): self._position = glm.vec3(value)
125
+ elif isinstance(value, Vec3): self._position = glm.vec3(value.data)
126
+ elif isinstance(value, tuple) or isinstance(value, list) or isinstance(value, np.ndarray):
127
+ if len(value) != 3: raise ValueError(f'Camera: Invalid number of values for position. Expected 3, got {len(value)}')
128
+ self._position = glm.vec3(value)
129
+ else: raise TypeError(f'Camera: Invalid position value type {type(value)}')
130
+
131
+ @direction.setter
132
+ def direction(self, value: tuple | list | glm.vec3 | np.ndarray | Vec3):
133
+ if isinstance(value, glm.vec3): self.forward = glm.normalize(glm.vec3(value))
134
+ elif isinstance(value, Vec3): self.forward = glm.normalize(value.data)
135
+ elif isinstance(value, tuple) or isinstance(value, list) or isinstance(value, np.ndarray):
136
+ if len(value) != 3: raise ValueError(f'Camera: Invalid number of values for direction. Expected 3, got {len(value)}')
137
+ self.forward = glm.normalize(glm.vec3(value))
138
+ else: raise TypeError(f'Camera: Invalid direction value type {type(value)}')
139
+
140
+ @fov.setter
141
+ def fov(self, value):
142
+ self._fov = value
143
+ if self.engine: self.use()
144
+
145
+
146
+ class FreeCamera(Camera):
147
+ def __init__(self, position=(0, 0, 20), yaw=-90, pitch=0):
148
+ super().__init__(position, yaw, pitch)
149
+
150
+ def update(self) -> None:
151
+ """
152
+ Updates the camera position and rotaiton based on user input
153
+ """
154
+
155
+ self.move()
156
+ self.rotate()
157
+ self.update_camera_vectors()
158
+ self.m_view = self.get_view_matrix()
159
+
160
+ def rotate(self) -> None:
161
+ """
162
+ Rotates the camera based on the amount of mouse movement.
163
+ """
164
+ rel_x, rel_y = pg.mouse.get_rel()
165
+ self.yaw += rel_x * SENSITIVITY
166
+ self.pitch -= rel_y * SENSITIVITY
167
+ self.yaw = self.yaw % 360
168
+ self.pitch = max(-89, min(89, self.pitch))
169
+
170
+ def move(self) -> None:
171
+ """
172
+ Checks for button presses and updates vectors accordingly.
173
+ """
174
+ velocity = (SPEED + self.engine.keys[pg.K_CAPSLOCK] * 10) * self.engine.delta_time
175
+ keys = self.engine.keys
176
+ if keys[pg.K_w]:
177
+ self.position += glm.normalize(glm.vec3(self.forward.x, 0, self.forward.z)) * velocity
178
+ if keys[pg.K_s]:
179
+ self.position -= glm.normalize(glm.vec3(self.forward.x, 0, self.forward.z)) * velocity
180
+ if keys[pg.K_a]:
181
+ self.position -= self.right * velocity
182
+ if keys[pg.K_d]:
183
+ self.position += self.right * velocity
184
+ if keys[pg.K_SPACE]:
185
+ self.position += self.UP * velocity
186
+ if keys[pg.K_LSHIFT]:
187
+ self.position -= self.UP * velocity
188
+
189
+
190
+ class FollowCamera(FreeCamera):
191
+ def __init__(self, parent, position=(0, 0, 20), yaw=-90, pitch=0, offset=(0, 0, 0)):
192
+ super().__init__(position, yaw, pitch)
193
+ self.parent = parent
194
+ self.offest = glm.vec3(offset)
195
+
196
+ def move(self) -> None:
197
+ """
198
+ Moves the camera to the parent node
199
+ """
200
+
201
+ self.position = self.parent.position + self.offest
202
+
203
+ class OrbitCamera(FreeCamera):
204
+ def __init__(self, parent, position=(0, 0, 20), yaw=-90, pitch=0, distance=5, offset=(0, 0)):
205
+ self.parent = parent
206
+ self.distance = distance
207
+ self.offset = glm.vec2(offset)
208
+ super().__init__(position, yaw, pitch)
209
+
210
+ def get_view_matrix(self) -> glm.mat4x4:
211
+ return glm.lookAt(self.position, self.parent.position, self.up)
212
+
213
+ def move(self) -> None:
214
+ """
215
+ Moves the camera to the parent node
216
+ """
217
+
218
+ self.position = self.parent.position - glm.normalize(self.forward) * self.distance
219
+
220
+ class StaticCamera(Camera):
221
+ def __init__(self, position=(0, 0, 20), yaw=-90, pitch=0):
222
222
  super().__init__(position, yaw, pitch)
basilisk/render/chunk.py CHANGED
@@ -1,107 +1,107 @@
1
- from .batch import Batch
2
-
3
-
4
- class Chunk():
5
- chunk_handler: ...
6
- """Back refrence to the parent chunk handler"""
7
- position: tuple
8
- """The position of the chunk. Used as a key in the chunk handler"""
9
- batch: Batch
10
- """Batched mesh of the chunk"""
11
- nodes: set
12
- """Set conaining references to all nodes in the chunk"""
13
- static: bool
14
- """Type of node that the chunk recognizes"""
15
-
16
- def __init__(self, chunk_handler, position: tuple, static: bool, shader=None) -> None:
17
- """
18
- Basilisk chunk object.
19
- Contains references to all nodes in the chunk.
20
- Handles batching for its own nodes
21
- """
22
-
23
- # Back references
24
- self.chunk_handler = chunk_handler
25
-
26
- # Chunk Attrbiutes
27
- self.position = position
28
- self.static = static
29
- self.shader = shader
30
-
31
- # Create empty batch
32
- self.batch = Batch(self)
33
-
34
- # Create empty set for chunk's nodes
35
- self.nodes = set()
36
-
37
- def render(self) -> None:
38
- """
39
- Renders the chunk mesh
40
- """
41
-
42
- if self.batch.vao: self.batch.vao.render()
43
-
44
- def update(self) -> bool:
45
- """
46
- Batches all the node meshes in the chunk
47
- """
48
-
49
- # Check if there are no nodes in the chunk
50
- if not self.nodes: return False
51
- # Batch the chunk nodes, return success bit
52
- return self.batch.batch()
53
-
54
- def node_update_callback(self, node):
55
- if not self.batch.vbo: return
56
-
57
- data = node.get_data()
58
- self.batch.vbo.write(data, node.data_index * 25 * 4)
59
-
60
- def add(self, node):
61
- """
62
- Adds an existing node to the chunk. Updates the node's chunk reference
63
- """
64
-
65
- self.nodes.add(node)
66
- node.chunk = self
67
-
68
- return node
69
-
70
- def remove(self, node):
71
- """
72
- Removes a node from the chunk
73
- """
74
-
75
- if node == None: return
76
-
77
- self.nodes.remove(node)
78
- if self.batch and self.batch.vbo: self.batch.vbo.clear()
79
-
80
- return node
81
-
82
- def get_program(self):
83
- """
84
- Gets the program of the chunks nodes' shader
85
- """
86
-
87
- shader = self.shader
88
-
89
- if shader: return shader.program
90
- return self.chunk_handler.engine.shader.program
91
-
92
- def swap_shader(self, shader):
93
- """
94
- Swaps the batches shader to the given shader
95
- """
96
-
97
- self.batch.swap_shader(shader)
98
-
99
- def __repr__(self) -> str:
100
- return f'<Basilisk Chunk | {self.position}, {len(self.nodes)} nodes, {"static" if self.static else "dynamic"}>'
101
-
102
- def __del__(self) -> None:
103
- """
104
- Deletes the batch if this chunk is deleted
105
- """
106
-
1
+ from .batch import Batch
2
+
3
+
4
+ class Chunk():
5
+ chunk_handler: ...
6
+ """Back refrence to the parent chunk handler"""
7
+ position: tuple
8
+ """The position of the chunk. Used as a key in the chunk handler"""
9
+ batch: Batch
10
+ """Batched mesh of the chunk"""
11
+ nodes: set
12
+ """Set conaining references to all nodes in the chunk"""
13
+ static: bool
14
+ """Type of node that the chunk recognizes"""
15
+
16
+ def __init__(self, chunk_handler, position: tuple, static: bool, shader=None) -> None:
17
+ """
18
+ Basilisk chunk object.
19
+ Contains references to all nodes in the chunk.
20
+ Handles batching for its own nodes
21
+ """
22
+
23
+ # Back references
24
+ self.chunk_handler = chunk_handler
25
+
26
+ # Chunk Attrbiutes
27
+ self.position = position
28
+ self.static = static
29
+ self.shader = shader
30
+
31
+ # Create empty batch
32
+ self.batch = Batch(self)
33
+
34
+ # Create empty set for chunk's nodes
35
+ self.nodes = set()
36
+
37
+ def render(self) -> None:
38
+ """
39
+ Renders the chunk mesh
40
+ """
41
+
42
+ if self.batch.vao: self.batch.vao.render()
43
+
44
+ def update(self) -> bool:
45
+ """
46
+ Batches all the node meshes in the chunk
47
+ """
48
+
49
+ # Check if there are no nodes in the chunk
50
+ if not self.nodes: return False
51
+ # Batch the chunk nodes, return success bit
52
+ return self.batch.batch()
53
+
54
+ def node_update_callback(self, node):
55
+ if not self.batch.vbo: return
56
+
57
+ data = node.get_data()
58
+ self.batch.vbo.write(data, node.data_index * 25 * 4)
59
+
60
+ def add(self, node):
61
+ """
62
+ Adds an existing node to the chunk. Updates the node's chunk reference
63
+ """
64
+
65
+ self.nodes.add(node)
66
+ node.chunk = self
67
+
68
+ return node
69
+
70
+ def remove(self, node):
71
+ """
72
+ Removes a node from the chunk
73
+ """
74
+
75
+ if node == None: return
76
+
77
+ self.nodes.remove(node)
78
+ if self.batch and self.batch.vbo: self.batch.vbo.clear()
79
+
80
+ return node
81
+
82
+ def get_program(self):
83
+ """
84
+ Gets the program of the chunks nodes' shader
85
+ """
86
+
87
+ shader = self.shader
88
+
89
+ if shader: return shader.program
90
+ return self.chunk_handler.engine.shader.program
91
+
92
+ def swap_shader(self, shader):
93
+ """
94
+ Swaps the batches shader to the given shader
95
+ """
96
+
97
+ self.batch.swap_shader(shader)
98
+
99
+ def __repr__(self) -> str:
100
+ return f'<Basilisk Chunk | {self.position}, {len(self.nodes)} nodes, {"static" if self.static else "dynamic"}>'
101
+
102
+ def __del__(self) -> None:
103
+ """
104
+ Deletes the batch if this chunk is deleted
105
+ """
106
+
107
107
  del self.batch