basilisk-engine 0.1.43__py3-none-any.whl → 0.1.44__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 (98) hide show
  1. basilisk/__init__.py +26 -26
  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 +225 -225
  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 +53 -53
  18. basilisk/draw/draw.py +100 -100
  19. basilisk/draw/draw_handler.py +178 -178
  20. basilisk/draw/font_renderer.py +28 -28
  21. basilisk/engine.py +169 -169
  22. basilisk/generic/abstract_bvh.py +15 -15
  23. basilisk/generic/abstract_custom.py +133 -133
  24. basilisk/generic/collisions.py +70 -70
  25. basilisk/generic/input_validation.py +82 -82
  26. basilisk/generic/math.py +17 -17
  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/__init__.py +0 -0
  34. basilisk/input/mouse.py +62 -0
  35. basilisk/input/path.py +14 -0
  36. basilisk/input_output/IO_handler.py +91 -91
  37. basilisk/input_output/clock.py +49 -49
  38. basilisk/input_output/keys.py +43 -43
  39. basilisk/input_output/mouse.py +90 -90
  40. basilisk/input_output/path.py +14 -14
  41. basilisk/mesh/cube.py +33 -33
  42. basilisk/mesh/mesh.py +233 -233
  43. basilisk/mesh/mesh_from_data.py +150 -150
  44. basilisk/mesh/model.py +271 -271
  45. basilisk/mesh/narrow_aabb.py +89 -89
  46. basilisk/mesh/narrow_bvh.py +91 -91
  47. basilisk/mesh/narrow_primative.py +23 -23
  48. basilisk/nodes/helper.py +28 -28
  49. basilisk/nodes/node.py +709 -709
  50. basilisk/nodes/node_handler.py +97 -97
  51. basilisk/particles/particle_handler.py +64 -64
  52. basilisk/particles/particle_renderer.py +93 -93
  53. basilisk/physics/impulse.py +112 -112
  54. basilisk/physics/physics_body.py +43 -43
  55. basilisk/physics/physics_engine.py +35 -35
  56. basilisk/render/batch.py +103 -103
  57. basilisk/render/bloom.py +117 -117
  58. basilisk/render/camera.py +260 -260
  59. basilisk/render/chunk.py +113 -113
  60. basilisk/render/chunk_handler.py +167 -167
  61. basilisk/render/frame.py +130 -130
  62. basilisk/render/framebuffer.py +192 -192
  63. basilisk/render/image.py +120 -120
  64. basilisk/render/image_handler.py +120 -120
  65. basilisk/render/light.py +96 -96
  66. basilisk/render/light_handler.py +58 -58
  67. basilisk/render/material.py +232 -232
  68. basilisk/render/material_handler.py +133 -133
  69. basilisk/render/post_process.py +180 -180
  70. basilisk/render/shader.py +135 -135
  71. basilisk/render/shader_handler.py +109 -109
  72. basilisk/render/sky.py +119 -119
  73. basilisk/scene.py +287 -287
  74. basilisk/shaders/batch.frag +288 -293
  75. basilisk/shaders/batch.vert +117 -117
  76. basilisk/shaders/bloom_downsample.frag +23 -23
  77. basilisk/shaders/bloom_frame.frag +25 -0
  78. basilisk/shaders/bloom_upsample.frag +33 -33
  79. basilisk/shaders/crt.frag +34 -34
  80. basilisk/shaders/draw.frag +27 -27
  81. basilisk/shaders/draw.vert +25 -25
  82. basilisk/shaders/filter.frag +22 -22
  83. basilisk/shaders/frame.frag +13 -13
  84. basilisk/shaders/frame.vert +13 -13
  85. basilisk/shaders/frame_hdr.frag +27 -27
  86. basilisk/shaders/geometry.frag +10 -10
  87. basilisk/shaders/geometry.vert +41 -41
  88. basilisk/shaders/normal.frag +62 -62
  89. basilisk/shaders/normal.vert +96 -96
  90. basilisk/shaders/particle.frag +81 -81
  91. basilisk/shaders/particle.vert +86 -86
  92. basilisk/shaders/sky.frag +23 -23
  93. basilisk/shaders/sky.vert +13 -13
  94. {basilisk_engine-0.1.43.dist-info → basilisk_engine-0.1.44.dist-info}/METADATA +89 -89
  95. basilisk_engine-0.1.44.dist-info/RECORD +115 -0
  96. {basilisk_engine-0.1.43.dist-info → basilisk_engine-0.1.44.dist-info}/WHEEL +1 -1
  97. basilisk_engine-0.1.43.dist-info/RECORD +0 -111
  98. {basilisk_engine-0.1.43.dist-info → basilisk_engine-0.1.44.dist-info}/top_level.txt +0 -0
basilisk/render/chunk.py CHANGED
@@ -1,114 +1,114 @@
1
- import sys
2
- from .batch import Batch
3
-
4
-
5
- class Chunk():
6
- chunk_handler: ...
7
- """Back refrence to the parent chunk handler"""
8
- position: tuple
9
- """The position of the chunk. Used as a key in the chunk handler"""
10
- batch: Batch
11
- """Batched mesh of the chunk"""
12
- nodes: set
13
- """Set conaining references to all nodes in the chunk"""
14
- static: bool
15
- """Type of node that the chunk recognizes"""
16
-
17
- def __init__(self, chunk_handler, position: tuple, static: bool, shader=None) -> None:
18
- """
19
- Basilisk chunk object.
20
- Contains references to all nodes in the chunk.
21
- Handles batching for its own nodes
22
- """
23
-
24
- # Back references
25
- self.chunk_handler = chunk_handler
26
-
27
- # Chunk Attrbiutes
28
- self.position = position
29
- self.static = static
30
- self.shader = shader
31
-
32
- # Create empty batch
33
- self.batch = Batch(self)
34
-
35
- # Create empty set for chunk's nodes
36
- self.nodes = set()
37
-
38
- def render(self) -> None:
39
- """
40
- Renders the chunk mesh
41
- """
42
-
43
- if self.batch.vao: self.batch.vao.render()
44
-
45
- def update(self) -> bool:
46
- """
47
- Batches all the node meshes in the chunk
48
- """
49
-
50
- # Check if there are no nodes in the chunk
51
- if not self.nodes: return False
52
- # Batch the chunk nodes, return success bit
53
- return self.batch.batch()
54
-
55
- def node_update_callback(self, node):
56
- if not self.batch.vbo: return
57
-
58
- data = node.get_data()
59
-
60
- if (node.data_index * data.shape[1] + (data.shape[0] * data.shape[1])) > self.batch.vbo.size:
61
- self.batch.batch()
62
- else:
63
- self.batch.vbo.write(data, node.data_index * data.shape[1] * 4)
64
-
65
- def add(self, node):
66
- """
67
- Adds an existing node to the chunk. Updates the node's chunk reference
68
- """
69
-
70
- self.nodes.add(node)
71
- node.chunk = self
72
-
73
- return node
74
-
75
- def remove(self, node):
76
- """
77
- Removes a node from the chunk
78
- """
79
-
80
- if node == None: return
81
-
82
- self.nodes.remove(node)
83
- if self.batch and self.batch.vbo:
84
- self.batch.vbo.clear()
85
- self.batch.batch()
86
-
87
- return node
88
-
89
- def get_shader(self):
90
- """
91
- Gets the bsk.Shader of the chunks nodes' shader
92
- """
93
-
94
- shader = self.shader
95
-
96
- if shader: return shader
97
- return self.chunk_handler.scene.shader
98
-
99
- def swap_shader(self, shader):
100
- """
101
- Swaps the batches shader to the given shader
102
- """
103
-
104
- self.batch.swap_shader(shader)
105
-
106
- def __repr__(self) -> str:
107
- return f'<Basilisk Chunk | {self.position}, {len(self.nodes)} nodes, {"static" if self.static else "dynamic"}>'
108
-
109
- def __del__(self) -> None:
110
- """
111
- Deletes the batch if this chunk is deleted
112
- """
113
-
1
+ import sys
2
+ from .batch import Batch
3
+
4
+
5
+ class Chunk():
6
+ chunk_handler: ...
7
+ """Back refrence to the parent chunk handler"""
8
+ position: tuple
9
+ """The position of the chunk. Used as a key in the chunk handler"""
10
+ batch: Batch
11
+ """Batched mesh of the chunk"""
12
+ nodes: set
13
+ """Set conaining references to all nodes in the chunk"""
14
+ static: bool
15
+ """Type of node that the chunk recognizes"""
16
+
17
+ def __init__(self, chunk_handler, position: tuple, static: bool, shader=None) -> None:
18
+ """
19
+ Basilisk chunk object.
20
+ Contains references to all nodes in the chunk.
21
+ Handles batching for its own nodes
22
+ """
23
+
24
+ # Back references
25
+ self.chunk_handler = chunk_handler
26
+
27
+ # Chunk Attrbiutes
28
+ self.position = position
29
+ self.static = static
30
+ self.shader = shader
31
+
32
+ # Create empty batch
33
+ self.batch = Batch(self)
34
+
35
+ # Create empty set for chunk's nodes
36
+ self.nodes = set()
37
+
38
+ def render(self) -> None:
39
+ """
40
+ Renders the chunk mesh
41
+ """
42
+
43
+ if self.batch.vao: self.batch.vao.render()
44
+
45
+ def update(self) -> bool:
46
+ """
47
+ Batches all the node meshes in the chunk
48
+ """
49
+
50
+ # Check if there are no nodes in the chunk
51
+ if not self.nodes: return False
52
+ # Batch the chunk nodes, return success bit
53
+ return self.batch.batch()
54
+
55
+ def node_update_callback(self, node):
56
+ if not self.batch.vbo: return
57
+
58
+ data = node.get_data()
59
+
60
+ if ((node.data_index * data.shape[1] + (data.shape[0] * data.shape[1])) * 4) > self.batch.vbo.size:
61
+ self.batch.batch()
62
+ else:
63
+ self.batch.vbo.write(data, node.data_index * data.shape[1] * 4)
64
+
65
+ def add(self, node):
66
+ """
67
+ Adds an existing node to the chunk. Updates the node's chunk reference
68
+ """
69
+
70
+ self.nodes.add(node)
71
+ node.chunk = self
72
+
73
+ return node
74
+
75
+ def remove(self, node):
76
+ """
77
+ Removes a node from the chunk
78
+ """
79
+
80
+ if node == None: return
81
+
82
+ self.nodes.remove(node)
83
+ if self.batch and self.batch.vbo:
84
+ self.batch.vbo.clear()
85
+ self.batch.batch()
86
+
87
+ return node
88
+
89
+ def get_shader(self):
90
+ """
91
+ Gets the bsk.Shader of the chunks nodes' shader
92
+ """
93
+
94
+ shader = self.shader
95
+
96
+ if shader: return shader
97
+ return self.chunk_handler.scene.shader
98
+
99
+ def swap_shader(self, shader):
100
+ """
101
+ Swaps the batches shader to the given shader
102
+ """
103
+
104
+ self.batch.swap_shader(shader)
105
+
106
+ def __repr__(self) -> str:
107
+ return f'<Basilisk Chunk | {self.position}, {len(self.nodes)} nodes, {"static" if self.static else "dynamic"}>'
108
+
109
+ def __del__(self) -> None:
110
+ """
111
+ Deletes the batch if this chunk is deleted
112
+ """
113
+
114
114
  del self.batch
@@ -1,168 +1,168 @@
1
- import numpy as np
2
- import moderngl as mgl
3
- from .chunk import Chunk
4
- from ..nodes.node import Node
5
-
6
-
7
- class ChunkHandler():
8
- engine: ...
9
- """Back reference to the parent engine"""
10
- scene: ...
11
- """Back reference to the parent scene"""
12
- ctx: mgl.Context
13
- """Back reference to the parent context"""
14
- program: mgl.Program
15
- """Reference to the shader program used by batches"""
16
- chunks: list[dict]
17
- """List containing two dictionaries for dynamic and static chunks repsectivly"""
18
- updated_chunks: set
19
- """Set containing recently updated chunks"""
20
-
21
- def __init__(self, scene) -> None:
22
- # Reference to the scene hadlers and variables
23
- """
24
- Handles all the chunking of all the nodes in the scene
25
- """
26
-
27
- # Back references
28
- self.scene = scene
29
- self.engine = scene.engine
30
- self.ctx = scene.engine.ctx
31
- self.program = scene.engine.shader.program
32
-
33
- # List for the dynamic and static chunk dictionaries | [dyanmic: dict, static: dict]
34
- self.shader_groups = {None : ({}, {})}
35
- # self.chunks = [{}, {}]
36
- self.updated_chunks = set()
37
-
38
-
39
- def render(self) -> None:
40
- """
41
- Renders all the chunk batches in the camera's range
42
- Includes some view culling, but not frustum culling.
43
- """
44
-
45
- # Gets a rectanglur prism of chunks in the cameras view
46
- render_range_x, render_range_y, render_range_z = self.get_render_range()
47
-
48
- chunk_keys = [(x, y, z) for x in range(*render_range_x) for y in range(*render_range_y) for z in range(*render_range_z)]
49
-
50
- # Loop through all chunks in view and render
51
- for shader, group in self.shader_groups.items():
52
- if shader == None: shader = self.engine.shader
53
- for chunk in chunk_keys:
54
- # Render the chunk if it exists
55
- if chunk in group[0]: group[0][chunk].render()
56
- if chunk in group[1]: group[1][chunk].render()
57
-
58
-
59
- def update(self) -> None:
60
- """
61
- Updates all the chunks that have been updated since the last frame.
62
- """
63
-
64
- self.program = self.scene.engine.shader.program
65
-
66
- # Loop through the set of updated chunk keys and update the chunk
67
- removes = []
68
-
69
- for chunk in self.updated_chunks:
70
- if chunk.update(): continue
71
- removes.append(chunk)
72
-
73
- # Remove any empty chunks
74
- for chunk in removes:
75
- del self.shader_groups[chunk.shader][chunk.static][chunk.position]
76
-
77
- # Clears the set of updated chunks so that they are not updated unless they are updated again
78
- self.updated_chunks.clear()
79
-
80
- def update_all(self):
81
- self.program = self.scene.engine.shader.program
82
- for shader in self.shader_groups.values():
83
- for chunk in shader[0].values():
84
- self.updated_chunks.add(chunk)
85
- for chunk in shader[1].values():
86
- self.updated_chunks.add(chunk)
87
-
88
- def add(self, node: Node) -> Node:
89
- """
90
- Adds an existing node to its chunk. Updates the node's chunk reference
91
- """
92
-
93
- # The key of the chunk the node will be added to
94
- chunk_size = self.engine.config.chunk_size
95
- chunk_key = (int(node.x // chunk_size), int(node.y // chunk_size), int(node.z // chunk_size))
96
- shader = node.shader
97
-
98
- if shader not in self.shader_groups:
99
- self.shader_groups[shader] = ({}, {})
100
-
101
- # Ensure that the chunk exists
102
- if chunk_key not in self.shader_groups[shader][node.static]:
103
- chunk = Chunk(self, chunk_key, node.static, shader)
104
- self.shader_groups[shader][node.static][chunk_key] = chunk
105
-
106
- # Add the node to the chunk
107
- self.shader_groups[shader][node.static][chunk_key].add(node)
108
-
109
- node.chunk = self.shader_groups[shader][node.static][chunk_key]
110
-
111
- # Update the chunk
112
- self.updated_chunks.add(self.shader_groups[shader][node.static][chunk_key])
113
-
114
- return Node
115
-
116
- def remove(self, node: Node) -> None:
117
- """
118
- Removes a node from the its chunk
119
- """
120
-
121
- if node == None: return
122
-
123
- # Remove the node
124
- chunk = node.chunk
125
- chunk.remove(node)
126
- node.chunk = None
127
-
128
- # Update the chunk
129
- self.updated_chunks.add(chunk)
130
-
131
- def get_render_range(self) -> tuple:
132
- """
133
- Returns a rectangluar prism of chunks that are in the camera's view.
134
- Tuple return is in form ((x1, x2), (y1, y2), (z1, z2))
135
- """
136
-
137
- cam_position = self.scene.camera.position # glm.vec3(x, y, z)
138
- fov = 40 # The range in which a direction will not be culled
139
-
140
- # Default to a cube of chunks around the camera extending view_distance chunks in each direction
141
- chunk_size = self.engine.config.chunk_size
142
- render_distance = self.engine.config.render_distance
143
- render_range_x = [int(cam_position.x // chunk_size - render_distance), int(cam_position.x // chunk_size + render_distance + 1)]
144
- render_range_y = [int(cam_position.y // chunk_size - render_distance), int(cam_position.y // chunk_size + render_distance + 1)]
145
- render_range_z = [int(cam_position.z // chunk_size - render_distance), int(cam_position.z // chunk_size + render_distance + 1)]
146
-
147
- # Remove chunks that the camera is facing away from
148
- render_range_x[1] -= render_distance * (180 - fov < self.scene.camera.yaw < 180 + fov) - 1
149
- render_range_x[0] += render_distance * (-fov < self.scene.camera.yaw < fov or self.scene.camera.yaw > 360 - fov) - 1
150
-
151
- render_range_y[0] += render_distance * (self.scene.camera.pitch > 25) - 1
152
- render_range_y[1] -= render_distance * (self.scene.camera.pitch < -25) - 1
153
-
154
- render_range_z[1] -= render_distance * (270 - fov < self.scene.camera.yaw < 270 + fov) - 1
155
- render_range_z[0] += render_distance * (90 - fov < self.scene.camera.yaw < 90 + fov) - 1
156
-
157
- return (render_range_x, render_range_y, render_range_z)
158
-
159
- def swap_default(self, shader):
160
- """
161
- Swaps the shader of the default chunks
162
- """
163
-
164
- group = self.shader_groups[None]
165
- for chunk in group[0].values():
166
- chunk.swap_shader(shader)
167
- for chunk in group[1].values():
1
+ import numpy as np
2
+ import moderngl as mgl
3
+ from .chunk import Chunk
4
+ from ..nodes.node import Node
5
+
6
+
7
+ class ChunkHandler():
8
+ engine: ...
9
+ """Back reference to the parent engine"""
10
+ scene: ...
11
+ """Back reference to the parent scene"""
12
+ ctx: mgl.Context
13
+ """Back reference to the parent context"""
14
+ program: mgl.Program
15
+ """Reference to the shader program used by batches"""
16
+ chunks: list[dict]
17
+ """List containing two dictionaries for dynamic and static chunks repsectivly"""
18
+ updated_chunks: set
19
+ """Set containing recently updated chunks"""
20
+
21
+ def __init__(self, scene) -> None:
22
+ # Reference to the scene hadlers and variables
23
+ """
24
+ Handles all the chunking of all the nodes in the scene
25
+ """
26
+
27
+ # Back references
28
+ self.scene = scene
29
+ self.engine = scene.engine
30
+ self.ctx = scene.engine.ctx
31
+ self.program = scene.engine.shader.program
32
+
33
+ # List for the dynamic and static chunk dictionaries | [dyanmic: dict, static: dict]
34
+ self.shader_groups = {None : ({}, {})}
35
+ # self.chunks = [{}, {}]
36
+ self.updated_chunks = set()
37
+
38
+
39
+ def render(self) -> None:
40
+ """
41
+ Renders all the chunk batches in the camera's range
42
+ Includes some view culling, but not frustum culling.
43
+ """
44
+
45
+ # Gets a rectanglur prism of chunks in the cameras view
46
+ render_range_x, render_range_y, render_range_z = self.get_render_range()
47
+
48
+ chunk_keys = [(x, y, z) for x in range(*render_range_x) for y in range(*render_range_y) for z in range(*render_range_z)]
49
+
50
+ # Loop through all chunks in view and render
51
+ for shader, group in self.shader_groups.items():
52
+ if shader == None: shader = self.engine.shader
53
+ for chunk in chunk_keys:
54
+ # Render the chunk if it exists
55
+ if chunk in group[0]: group[0][chunk].render()
56
+ if chunk in group[1]: group[1][chunk].render()
57
+
58
+
59
+ def update(self) -> None:
60
+ """
61
+ Updates all the chunks that have been updated since the last frame.
62
+ """
63
+
64
+ self.program = self.scene.engine.shader.program
65
+
66
+ # Loop through the set of updated chunk keys and update the chunk
67
+ removes = []
68
+
69
+ for chunk in self.updated_chunks:
70
+ if chunk.update(): continue
71
+ removes.append(chunk)
72
+
73
+ # Remove any empty chunks
74
+ for chunk in removes:
75
+ del self.shader_groups[chunk.shader][chunk.static][chunk.position]
76
+
77
+ # Clears the set of updated chunks so that they are not updated unless they are updated again
78
+ self.updated_chunks.clear()
79
+
80
+ def update_all(self):
81
+ self.program = self.scene.engine.shader.program
82
+ for shader in self.shader_groups.values():
83
+ for chunk in shader[0].values():
84
+ self.updated_chunks.add(chunk)
85
+ for chunk in shader[1].values():
86
+ self.updated_chunks.add(chunk)
87
+
88
+ def add(self, node: Node) -> Node:
89
+ """
90
+ Adds an existing node to its chunk. Updates the node's chunk reference
91
+ """
92
+
93
+ # The key of the chunk the node will be added to
94
+ chunk_size = self.engine.config.chunk_size
95
+ chunk_key = (int(node.x // chunk_size), int(node.y // chunk_size), int(node.z // chunk_size))
96
+ shader = node.shader
97
+
98
+ if shader not in self.shader_groups:
99
+ self.shader_groups[shader] = ({}, {})
100
+
101
+ # Ensure that the chunk exists
102
+ if chunk_key not in self.shader_groups[shader][node.static]:
103
+ chunk = Chunk(self, chunk_key, node.static, shader)
104
+ self.shader_groups[shader][node.static][chunk_key] = chunk
105
+
106
+ # Add the node to the chunk
107
+ self.shader_groups[shader][node.static][chunk_key].add(node)
108
+
109
+ node.chunk = self.shader_groups[shader][node.static][chunk_key]
110
+
111
+ # Update the chunk
112
+ self.updated_chunks.add(self.shader_groups[shader][node.static][chunk_key])
113
+
114
+ return Node
115
+
116
+ def remove(self, node: Node) -> None:
117
+ """
118
+ Removes a node from the its chunk
119
+ """
120
+
121
+ if node == None: return
122
+
123
+ # Remove the node
124
+ chunk = node.chunk
125
+ chunk.remove(node)
126
+ node.chunk = None
127
+
128
+ # Update the chunk
129
+ self.updated_chunks.add(chunk)
130
+
131
+ def get_render_range(self) -> tuple:
132
+ """
133
+ Returns a rectangluar prism of chunks that are in the camera's view.
134
+ Tuple return is in form ((x1, x2), (y1, y2), (z1, z2))
135
+ """
136
+
137
+ cam_position = self.scene.camera.position # glm.vec3(x, y, z)
138
+ fov = 40 # The range in which a direction will not be culled
139
+
140
+ # Default to a cube of chunks around the camera extending view_distance chunks in each direction
141
+ chunk_size = self.engine.config.chunk_size
142
+ render_distance = self.engine.config.render_distance
143
+ render_range_x = [int(cam_position.x // chunk_size - render_distance), int(cam_position.x // chunk_size + render_distance + 1)]
144
+ render_range_y = [int(cam_position.y // chunk_size - render_distance), int(cam_position.y // chunk_size + render_distance + 1)]
145
+ render_range_z = [int(cam_position.z // chunk_size - render_distance), int(cam_position.z // chunk_size + render_distance + 1)]
146
+
147
+ # Remove chunks that the camera is facing away from
148
+ render_range_x[1] -= render_distance * (180 - fov < self.scene.camera.yaw < 180 + fov) - 1
149
+ render_range_x[0] += render_distance * (-fov < self.scene.camera.yaw < fov or self.scene.camera.yaw > 360 - fov) - 1
150
+
151
+ render_range_y[0] += render_distance * (self.scene.camera.pitch > 25) - 1
152
+ render_range_y[1] -= render_distance * (self.scene.camera.pitch < -25) - 1
153
+
154
+ render_range_z[1] -= render_distance * (270 - fov < self.scene.camera.yaw < 270 + fov) - 1
155
+ render_range_z[0] += render_distance * (90 - fov < self.scene.camera.yaw < 90 + fov) - 1
156
+
157
+ return (render_range_x, render_range_y, render_range_z)
158
+
159
+ def swap_default(self, shader):
160
+ """
161
+ Swaps the shader of the default chunks
162
+ """
163
+
164
+ group = self.shader_groups[None]
165
+ for chunk in group[0].values():
166
+ chunk.swap_shader(shader)
167
+ for chunk in group[1].values():
168
168
  chunk.swap_shader(shader)