basilisk-engine 0.1.5__tar.gz → 0.1.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of basilisk-engine might be problematic. Click here for more details.

Files changed (142) hide show
  1. {basilisk_engine-0.1.5/basilisk_engine.egg-info → basilisk_engine-0.1.7}/PKG-INFO +2 -1
  2. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/__init__.py +3 -1
  3. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/collider_handler.py +2 -3
  4. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/contact_manifold.py +6 -1
  5. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/dataclasses.py +3 -1
  6. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/gjk.py +1 -1
  7. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/helper.py +1 -1
  8. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/engine.py +7 -5
  9. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/abstract_custom.py +1 -1
  10. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/collisions.py +5 -3
  11. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/matrices.py +6 -4
  12. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/quat.py +10 -5
  13. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/nodes/node.py +9 -7
  14. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/camera.py +2 -0
  15. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/frame.py +5 -2
  16. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/framebuffer.py +30 -5
  17. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/post_process.py +1 -1
  18. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/scene.py +11 -3
  19. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7/basilisk_engine.egg-info}/PKG-INFO +2 -1
  20. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk_engine.egg-info/requires.txt +1 -0
  21. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/setup.py +2 -2
  22. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/MANIFEST.in +0 -0
  23. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/README.md +0 -0
  24. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/bsk_assets/Roboto-Regular.ttf +0 -0
  25. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/bsk_assets/__init__.py +0 -0
  26. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/bsk_assets/basilisk.png +0 -0
  27. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/bsk_assets/cube.obj +0 -0
  28. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/bsk_assets/skybox.png +0 -0
  29. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/__init__.py +0 -0
  30. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/broad/__init__.py +0 -0
  31. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/broad/broad_aabb.py +0 -0
  32. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/broad/broad_bvh.py +0 -0
  33. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/collider.py +0 -0
  34. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/__init__.py +0 -0
  35. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/deprecated.py +0 -0
  36. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/epa.py +0 -0
  37. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/graham_scan.py +0 -0
  38. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/line_intersections.py +0 -0
  39. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/collisions/narrow/sutherland_hodgman.py +0 -0
  40. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/config.py +0 -0
  41. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/draw/__init__.py +0 -0
  42. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/draw/draw.py +0 -0
  43. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/draw/draw_handler.py +0 -0
  44. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/draw/font_renderer.py +0 -0
  45. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/__init__.py +0 -0
  46. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/abstract_bvh.py +0 -0
  47. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/input_validation.py +0 -0
  48. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/math.py +0 -0
  49. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/meshes.py +0 -0
  50. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/quat_methods.py +0 -0
  51. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/raycast_result.py +0 -0
  52. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/generic/vec3.py +0 -0
  53. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/input/__init__.py +0 -0
  54. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/input/mouse.py +0 -0
  55. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/input/path.py +0 -0
  56. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/mesh/__init__.py +0 -0
  57. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/mesh/cube.py +0 -0
  58. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/mesh/mesh.py +0 -0
  59. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/mesh/mesh_from_data.py +0 -0
  60. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/mesh/model.py +0 -0
  61. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/mesh/narrow_aabb.py +0 -0
  62. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/mesh/narrow_bvh.py +0 -0
  63. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/mesh/narrow_primative.py +0 -0
  64. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/nodes/__init__.py +0 -0
  65. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/nodes/helper.py +0 -0
  66. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/nodes/node_handler.py +0 -0
  67. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/particles/__init__.py +0 -0
  68. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/particles/particle_handler.py +0 -0
  69. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/particles/particle_renderer.py +0 -0
  70. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/physics/__init__.py +0 -0
  71. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/physics/impulse.py +0 -0
  72. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/physics/physics_body.py +0 -0
  73. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/physics/physics_engine.py +0 -0
  74. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/__init__.py +0 -0
  75. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/batch.py +0 -0
  76. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/chunk.py +0 -0
  77. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/chunk_handler.py +0 -0
  78. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/image.py +0 -0
  79. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/image_handler.py +0 -0
  80. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/light.py +0 -0
  81. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/light_handler.py +0 -0
  82. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/material.py +0 -0
  83. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/material_handler.py +0 -0
  84. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/shader.py +0 -0
  85. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/shader_handler.py +0 -0
  86. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/render/sky.py +0 -0
  87. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/__init__.py +0 -0
  88. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/batch.frag +0 -0
  89. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/batch.vert +0 -0
  90. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/crt.frag +0 -0
  91. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/draw.frag +0 -0
  92. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/draw.vert +0 -0
  93. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/filter.frag +0 -0
  94. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/frame.frag +0 -0
  95. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/frame.vert +0 -0
  96. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/geometry.frag +0 -0
  97. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/geometry.vert +0 -0
  98. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/normal.frag +0 -0
  99. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/normal.vert +0 -0
  100. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/particle.frag +0 -0
  101. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/particle.vert +0 -0
  102. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/sky.frag +0 -0
  103. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk/shaders/sky.vert +0 -0
  104. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk_engine.egg-info/SOURCES.txt +0 -0
  105. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk_engine.egg-info/dependency_links.txt +0 -0
  106. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/basilisk_engine.egg-info/top_level.txt +0 -0
  107. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/docs/images/0_boilerplate.png +0 -0
  108. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/images/cloth.png +0 -0
  109. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/images/floor.png +0 -0
  110. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/images/foil.png +0 -0
  111. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/images/mud.png +0 -0
  112. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/setup.cfg +0 -0
  113. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/SkySkybox.png +0 -0
  114. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/brick.png +0 -0
  115. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/brick_normal.png +0 -0
  116. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/bunny.obj +0 -0
  117. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/closet_001.obj +0 -0
  118. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/cloth_albedo.png +0 -0
  119. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/cloth_normal.png +0 -0
  120. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/cube.obj +0 -0
  121. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/cubemaps_skybox.png +0 -0
  122. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/cylinder.obj +0 -0
  123. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/demo_sphere.obj +0 -0
  124. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/dirt.png +0 -0
  125. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/floor_albedo.png +0 -0
  126. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/floor_normal.png +0 -0
  127. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/foil_normal.png +0 -0
  128. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/fridge_001.obj +0 -0
  129. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/grass.jpg +0 -0
  130. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/grass_ao.jpg +0 -0
  131. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/grass_block_side.png +0 -0
  132. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/grass_block_top.png +0 -0
  133. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/grass_normal.png +0 -0
  134. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/grass_roughness.jpg +0 -0
  135. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/image.png +0 -0
  136. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/lucy.obj +0 -0
  137. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/monkey.obj +0 -0
  138. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/mud.png +0 -0
  139. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/mud_normal.png +0 -0
  140. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/oak_tree.obj +0 -0
  141. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/skybox.png +0 -0
  142. {basilisk_engine-0.1.5 → basilisk_engine-0.1.7}/tests/sphere.obj +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: basilisk-engine
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Python 3D Framework
5
5
  Home-page: https://basilisk-website.vercel.app/
6
6
  Author: Name
@@ -12,6 +12,7 @@ Requires-Dist: pygame-ce
12
12
  Requires-Dist: moderngl
13
13
  Requires-Dist: PyGLM
14
14
  Requires-Dist: numba
15
+ Requires-Dist: PyOpenAL
15
16
 
16
17
  # Basilisk Engine
17
18
  ![image](https://github.com/user-attachments/assets/5e39445c-e0da-452c-9f18-e590cca948c4)
@@ -10,4 +10,6 @@ from .render.shader_handler import ShaderHandler
10
10
  from .draw import draw
11
11
  from .render.camera import FreeCamera, StaticCamera, FollowCamera, OrbitCamera
12
12
  from .render.sky import Sky
13
- from .render.post_process import PostProcess
13
+ from .render.post_process import PostProcess
14
+ from .render.framebuffer import Framebuffer
15
+ from .audio.sound import Sound
@@ -141,7 +141,6 @@ class ColliderHandler():
141
141
  for point in incoming:
142
142
  incoming_indices.add(point.index)
143
143
  if point.index not in existing or glm.length2(point.vertex - existing[point.index]) > 1e-5: existing[point.index] = glm.vec3(point.vertex)
144
- # if glm.length2(point.vertex - existing[point.index]) != 0: print(point.vertex - existing[point.index])
145
144
 
146
145
  # remove changed stored points
147
146
  remove_indices = []
@@ -195,7 +194,7 @@ class ColliderHandler():
195
194
  points1 = [ContactPoint(p.index1, p.vertex1) for p in polytope]
196
195
  points2 = [ContactPoint(p.index2, p.vertex2) for p in polytope]
197
196
 
198
- if glm.dot(vec, node2.position - node1.position) > 0: vec *= -1
197
+ if glm.dot(vec, node2.position.data - node1.position.data) > 0: vec *= -1
199
198
 
200
199
  # add collision data to colliders
201
200
  collider1.collisions.append(Collision(node2, vec))
@@ -210,7 +209,7 @@ class ColliderHandler():
210
209
 
211
210
  collider_tuple = (collider1, collider2)
212
211
  manifold = get_contact_manifold(
213
- node1.position - vec,
212
+ node1.position.data - vec,
214
213
  vec,
215
214
  self.contact_manifolds[collider_tuple].contact_points1.values(),
216
215
  self.contact_manifolds[collider_tuple].contact_points2.values()
@@ -4,6 +4,10 @@ from .line_intersections import line_line_intersect, line_poly_intersect
4
4
  from .graham_scan import graham_scan
5
5
  from .sutherland_hodgman import sutherland_hodgman
6
6
  from .dataclasses import ContactPoint
7
+ from ...generic.vec3 import Vec3
8
+ from ...generic.quat import Quat
9
+
10
+
7
11
 
8
12
  # sutherland hodgman clipping algorithm
9
13
  def get_contact_manifold(contact_plane_point:glm.vec3, contact_plane_normal:glm.vec3, points1:list[glm.vec3], points2:list[glm.vec3]) -> list[glm.vec3]:
@@ -47,6 +51,7 @@ def separate_polytope(points1: list[ContactPoint], points2: list[ContactPoint],
47
51
  """
48
52
  Determines the potential contact manifold points of each shape based on their position along the penetrating axis
49
53
  """
54
+
50
55
  proj1 = [(glm.dot(point.vertex, contact_plane_normal), point) for point in points1]
51
56
  proj2 = [(glm.dot(point.vertex, contact_plane_normal), point) for point in points2]
52
57
 
@@ -63,7 +68,7 @@ def distance_to_plane(contact_plane_point:glm.vec3, contact_plane_normal:glm.vec
63
68
  """gets the smallest distance a point is from a plane"""
64
69
  return glm.dot(point - contact_plane_point, contact_plane_normal) #TODO check this formula
65
70
 
66
- def project_points(contact_plane_point:glm.vec3, contact_plane_normal:glm.vec3, points:list[glm.vec3]) -> list[glm.vec3]:
71
+ def project_points(contact_plane_point:glm.vec3, contact_plane_normal:glm.vec3, points:list[Vec3]) -> list[glm.vec3]:
67
72
  """gets the projected positions of the given points onto the given plane"""
68
73
  return [point - glm.dot(point - contact_plane_point, contact_plane_normal) * contact_plane_normal for point in points]
69
74
 
@@ -1,5 +1,7 @@
1
1
  import glm
2
2
  from dataclasses import dataclass
3
+
4
+ from basilisk.generic.vec3 import Vec3
3
5
  # from ...nodes.node import Node
4
6
 
5
7
  # frozen because data does not need to be mutable
@@ -18,7 +20,7 @@ class SupportPoint():
18
20
  @dataclass(frozen=True)
19
21
  class ContactPoint():
20
22
  index: int
21
- vertex: glm.vec3
23
+ vertex: Vec3
22
24
 
23
25
  # contact manifold object used in the contact handler list
24
26
  @dataclass
@@ -10,7 +10,7 @@ def collide_gjk(node1: Node, node2: Node, iterations: int=20) -> tuple: # TODO f
10
10
  Determines if two convex polyhedra collide, returns the polytope if there is a collision.
11
11
  """
12
12
  # generate starting values
13
- dir_vec = node1.position - node2.position
13
+ dir_vec = node1.position.data - node2.position.data
14
14
  simplex = [get_support_point(node1, node2, dir_vec)]
15
15
  dir_vec = -simplex[0].support_point # set direction to point away from starting simplex point
16
16
 
@@ -15,7 +15,7 @@ def get_furthest_point(node: Node, dir_vec: glm.vec3) -> glm.vec3:
15
15
  Determines the furthest point in a given direction
16
16
  """
17
17
  # determine furthest point by using untransformed mesh
18
- node_dir_vec = node.rotation * dir_vec # rotate the world space vector to node space
18
+ node_dir_vec = node.rotation.data * dir_vec # rotate the world space vector to node space
19
19
  index = node.collider.mesh.get_best_dot(node_dir_vec)
20
20
  vertex = node.collider.mesh.points[index]
21
21
  vertex = node.model_matrix * glm.vec4(vertex, 1.0)
@@ -10,7 +10,8 @@ from .config import Config
10
10
  from .input.mouse import Mouse
11
11
  from .mesh.cube import Cube
12
12
  from .render.shader import Shader
13
-
13
+ import glcontext
14
+ import openal
14
15
 
15
16
  class Engine():
16
17
  win_size: tuple
@@ -83,10 +84,9 @@ class Engine():
83
84
  # Global attributes referenced by the handlers
84
85
  self.headless = headless
85
86
  self.set_configurations()
86
- # self.root = get_root()
87
- # self.root = getattr(sys, '_MEIPASS', os.getcwd()) + '/basilisk'
88
87
  self.root = os.path.dirname(__file__)
89
88
  self.cube = Cube(self)
89
+ self.fbos = []
90
90
 
91
91
  # Update the icon
92
92
  pg.display.set_icon(pg.image.load(self.root + '/bsk_assets/basilisk.png'))
@@ -111,7 +111,7 @@ class Engine():
111
111
  # Set the scene to running
112
112
  self.running = True
113
113
 
114
- def update(self) -> None:
114
+ def update(self, render=True) -> None:
115
115
  """
116
116
  Updates all input, physics, and time variables. Renders the current scene.
117
117
  """
@@ -132,6 +132,7 @@ class Engine():
132
132
  # Loop through all pygame events
133
133
  for event in self.events:
134
134
  if event.type == pg.QUIT: # Quit the engine
135
+ openal.oalQuit()
135
136
  self.quit()
136
137
  return
137
138
  if event.type == pg.VIDEORESIZE:
@@ -140,12 +141,13 @@ class Engine():
140
141
  self.ctx.viewport = (0, 0, event.w, event.h)
141
142
  self.scene.camera.use()
142
143
  self.scene.frame.resize()
144
+ for fbo in self.fbos: fbo.resize()
143
145
 
144
146
 
145
147
  # Update the scene if possible
146
148
  if self.scene: self.scene.update()
147
149
  # Render after the scene and engine has been updated
148
- self.render()
150
+ if render: self.render()
149
151
 
150
152
 
151
153
  def render(self) -> None:
@@ -8,7 +8,7 @@ class Custom():
8
8
  """
9
9
  Inplace normalizes the vector
10
10
  """
11
- self.data = glm.normalize(self.data)
11
+ self._data = glm.normalize(self._data)
12
12
  return self
13
13
 
14
14
  def apply_function(): ... # will be overridden by child custom classes
@@ -1,4 +1,6 @@
1
1
  import glm
2
+ from ..generic.vec3 import Vec3
3
+ from ..generic.quat import Quat
2
4
 
3
5
 
4
6
  def collide_aabb_aabb(top_right1: glm.vec3, bottom_left1: glm.vec3, top_right2: glm.vec3, bottom_left2: glm.vec3, epsilon:float=1e-7) -> bool:
@@ -53,13 +55,13 @@ def moller_trumbore(point:glm.vec3, vec:glm.vec3, triangle:list[glm.vec3], epsil
53
55
  if t > epsilon: return point + vec * t
54
56
  return None
55
57
 
56
- def get_sat_axes(rotation1: glm.quat, rotation2: glm.quat) -> list[glm.vec3]:
58
+ def get_sat_axes(rotation1: Quat, rotation2: Quat) -> list[glm.vec3]:
57
59
  """
58
60
  Gets the axes for SAT from obb rotation matrices
59
61
  """
60
62
  axes = []
61
- axes.extend(glm.transpose(glm.mat3_cast(rotation1)))
62
- axes.extend(glm.transpose(glm.mat3_cast(rotation2)))
63
+ axes.extend(glm.transpose(glm.mat3_cast(rotation1.data)))
64
+ axes.extend(glm.transpose(glm.mat3_cast(rotation2.data)))
63
65
 
64
66
  # crossed roots
65
67
  for i in range(0, 3):
@@ -1,14 +1,16 @@
1
1
  import glm
2
+ from ..generic.vec3 import Vec3
3
+ from ..generic.quat import Quat
2
4
 
3
5
 
4
6
  # transform matrices
5
- def get_model_matrix(position: glm.vec3, scale: glm.vec3, rotation: glm.quat) -> glm.mat4x4:
7
+ def get_model_matrix(position: Vec3, scale: Vec3, rotation: Quat) -> glm.mat4x4:
6
8
  """
7
9
  Gets projection matrix from object data
8
10
  """
9
- translation_matrix = glm.translate(glm.mat4(1.0), position)
10
- rotation_matrix = glm.mat4_cast(rotation)
11
- scale_matrix = glm.scale(glm.mat4(1.0), scale)
11
+ translation_matrix = glm.translate(glm.mat4(1.0), position.data)
12
+ rotation_matrix = glm.mat4_cast(rotation.data)
13
+ scale_matrix = glm.scale(glm.mat4(1.0), scale.data)
12
14
  model_matrix = translation_matrix * glm.transpose(rotation_matrix) * scale_matrix
13
15
  return model_matrix
14
16
 
@@ -82,10 +82,10 @@ class Quat(Custom):
82
82
 
83
83
  # override str operators
84
84
  def __repr__(self):
85
- return str(self.data)
86
-
87
- def __iter__(self):
88
- return iter((self.x, self.y, self.z))
85
+ return 'bsk' + str(self.data)
86
+
87
+ def __str__(self):
88
+ return 'bsk ' + str(self.data)
89
89
 
90
90
  @property
91
91
  def data(self): return self._data
@@ -108,6 +108,7 @@ class Quat(Custom):
108
108
  if self.callback and (abs(cur.w - prev.w) > thresh or abs(cur.x - prev.x) > thresh or abs(cur.y - prev.y) > thresh or abs(cur.z - prev.z) > thresh):
109
109
  self.prev_data = glm.quat(self._data)
110
110
  self.callback()
111
+ self.normalize()
111
112
 
112
113
  @w.setter
113
114
  def w(self, value):
@@ -115,6 +116,7 @@ class Quat(Custom):
115
116
  if self.callback and abs(value - self.prev_data.w) > 1e-6:
116
117
  self.prev_data.w = value
117
118
  self.callback()
119
+ self.normalize()
118
120
 
119
121
  @x.setter
120
122
  def x(self, value):
@@ -122,6 +124,7 @@ class Quat(Custom):
122
124
  if self.callback and abs(value - self.prev_data.x) > 1e-6:
123
125
  self.prev_data.x = value
124
126
  self.callback()
127
+ self.normalize()
125
128
 
126
129
  @y.setter
127
130
  def y(self, value):
@@ -129,10 +132,12 @@ class Quat(Custom):
129
132
  if self.callback and abs(value - self.prev_data.y) > 1e-6:
130
133
  self.prev_data.y = value
131
134
  self.callback()
135
+ self.normalize()
132
136
 
133
137
  @z.setter
134
138
  def z(self, value):
135
139
  self._data.z = value
136
140
  if self.callback and abs(value - self.prev_data.z) > 1e-6:
137
141
  self.prev_data.z = value
138
- self.callback()
142
+ self.callback()
143
+ self.normalize()
@@ -217,7 +217,7 @@ class Node():
217
217
  """
218
218
  # update based on physical properties
219
219
  if any(self.velocity): self.position += dt * self.velocity
220
- if any(self.rotational_velocity): self.rotation = glm.normalize(self.rotation - dt / 2 * self.rotation * glm.quat(0, *self.rotational_velocity))
220
+ if any(self.rotational_velocity): self.rotation = glm.normalize(self.rotation.data - dt / 2 * self.rotation.data * glm.quat(0, *self.rotational_velocity))
221
221
 
222
222
  if self.physics_body:
223
223
  self.velocity += self.physics_body.get_delta_velocity(dt)
@@ -344,7 +344,7 @@ class Node():
344
344
  if self.physics_body: inertia_tensor *= self.physics_body.mass
345
345
 
346
346
  # rotation
347
- rotation_matrix = glm.mat3_cast(self.rotation)
347
+ rotation_matrix = glm.mat3_cast(self.rotation.data)
348
348
  inertia_tensor = rotation_matrix * inertia_tensor * glm.transpose(rotation_matrix)
349
349
 
350
350
  return glm.inverse(inertia_tensor)
@@ -405,11 +405,11 @@ class Node():
405
405
  return f'<Bailisk Node | {self.name}, {self.mesh}, ({self.position})>'
406
406
 
407
407
  @property
408
- def position(self): return self.internal_position.data
408
+ def position(self): return self.internal_position
409
409
  @property
410
- def scale(self): return self.internal_scale.data
410
+ def scale(self): return self.internal_scale
411
411
  @property
412
- def rotation(self): return self.internal_rotation.data
412
+ def rotation(self): return self.internal_rotation
413
413
  @property
414
414
  def forward(self): return self._forward
415
415
  @property
@@ -492,6 +492,7 @@ class Node():
492
492
  @position.setter
493
493
  def position(self, value: tuple | list | glm.vec3 | np.ndarray):
494
494
  if isinstance(value, glm.vec3): self.internal_position.data = value
495
+ elif isinstance(value, Vec3): self.internal_position.data = value.data
495
496
  elif isinstance(value, tuple) or isinstance(value, list) or isinstance(value, np.ndarray):
496
497
  if len(value) != 3: raise ValueError(f'Node: Invalid number of values for position. Expected 3, got {len(value)}')
497
498
  self.internal_position.data = glm.vec3(value)
@@ -503,6 +504,7 @@ class Node():
503
504
  @scale.setter
504
505
  def scale(self, value: tuple | list | glm.vec3 | np.ndarray):
505
506
  if isinstance(value, glm.vec3): self.internal_scale.data = value
507
+ elif isinstance(value, Vec3): self.internal_scale.data = value.data
506
508
  elif isinstance(value, tuple) or isinstance(value, list) or isinstance(value, np.ndarray):
507
509
  if len(value) != 3: raise ValueError(f'Node: Invalid number of values for scale. Expected 3, got {len(value)}')
508
510
  self.internal_scale.data = glm.vec3(value)
@@ -514,6 +516,7 @@ class Node():
514
516
  @rotation.setter
515
517
  def rotation(self, value: tuple | list | glm.vec3 | glm.quat | glm.vec4 | np.ndarray):
516
518
  if isinstance(value, glm.quat) or isinstance(value, glm.vec4) or isinstance(value, glm.vec3): self.internal_rotation.data = glm.quat(value)
519
+ elif isinstance(value, Quat): self.internal_rotation.data = value.data
517
520
  elif isinstance(value, tuple) or isinstance(value, list) or isinstance(value, np.ndarray):
518
521
  if len(value) == 3: self.internal_rotation.data = glm.quat(glm.vec3(*value))
519
522
  elif len(value) == 4: self.internal_rotation.data = glm.quat(*value)
@@ -677,5 +680,4 @@ class Node():
677
680
  if self.node_handler: self.collider.collider_handler = self.node_handler.scene.collider_handler
678
681
  elif not self.collider:
679
682
  self.collider = Collider(self)
680
- if self.node_handler: self.collider.collider_handler = self.node_handler.scene.collider_handler
681
-
683
+ if self.node_handler: self.collider.collider_handler = self.node_handler.scene.collider_handler
@@ -101,6 +101,8 @@ class Camera:
101
101
  def direction(self): return self.forward
102
102
  @property
103
103
  def horizontal(self): return glm.normalize(self.forward.xz)
104
+ @property
105
+ def rotation(self): return glm.conjugate(glm.quatLookAt(self.forward, self.UP))
104
106
 
105
107
  @scene.setter
106
108
  def scene(self, value):
@@ -46,7 +46,7 @@ class Frame:
46
46
  """
47
47
 
48
48
  for process in self.post_processes:
49
- process.apply(self.framebuffer, self.ping_pong_buffer)
49
+ self.ping_pong_buffer = process.apply(self.framebuffer, self.ping_pong_buffer)
50
50
 
51
51
  temp = self.framebuffer
52
52
  self.framebuffer = self.ping_pong_buffer
@@ -64,7 +64,7 @@ class Frame:
64
64
  """
65
65
 
66
66
  self.framebuffer.use()
67
- self.framebuffer.clear()
67
+ self.clear()
68
68
 
69
69
  def add_post_process(self, post_process: PostProcess) -> PostProcess:
70
70
  """
@@ -81,6 +81,9 @@ class Frame:
81
81
 
82
82
  self.framebuffer.save(destination)
83
83
 
84
+ def clear(self):
85
+ self.framebuffer.clear()
86
+
84
87
  def resize(self, size: tuple[int]=None) -> None:
85
88
  """
86
89
  Resize the frame to the given size. None for window size
@@ -1,6 +1,7 @@
1
+ import numpy as np
1
2
  import moderngl as mgl
2
3
  from PIL import Image
3
-
4
+ from ..render.shader import Shader
4
5
 
5
6
 
6
7
  class Framebuffer:
@@ -15,7 +16,7 @@ class Framebuffer:
15
16
  size: tuple[int]
16
17
  """The dimensions of the framebuffer (x, y)"""
17
18
 
18
- def __init__(self, engine, size: tuple[int]=None, components: int=4, filter=(mgl.LINEAR, mgl.LINEAR)) -> None:
19
+ def __init__(self, engine, size: tuple[int]=None, resolution_scale: float=1.0, components: int=4, filter=(mgl.LINEAR, mgl.LINEAR)) -> None:
19
20
  """
20
21
  Abstraction to the mgl framebuffer
21
22
  Args:
@@ -28,18 +29,38 @@ class Framebuffer:
28
29
  # Set attributes
29
30
  self.engine = engine
30
31
  self.ctx = engine.ctx
31
- self.size = size if size else engine.win_size
32
32
  self.components = components
33
33
 
34
+ # Set the size
35
+ self.resolution_scale = resolution_scale
36
+ self._size = size
37
+ self.size = self._size if self._size else self.engine.win_size
38
+ self.size = (int(self.size[0] * resolution_scale), int(self.size[1] * resolution_scale))
39
+
34
40
  # Create the fbo
35
41
  self.texture = self.ctx.texture(self.size, components=self.components)
36
42
  self.depth = self.ctx.depth_texture(self.size)
37
43
  self.fbo = self.ctx.framebuffer([self.texture], self.depth)
38
44
 
39
- print()
45
+ # Load Shaders
46
+ self.shader = Shader(self.engine, self.engine.root + '/shaders/frame.vert', self.engine.root + '/shaders/frame.frag')
47
+ self.engine.scene.shader_handler.add(self.shader)
48
+
49
+ # Load VAO
50
+ self.vbo = self.ctx.buffer(np.array([[-1, -1, 0, 0, 0], [1, -1, 0, 1, 0], [1, 1, 0, 1, 1], [-1, 1, 0, 0, 1], [-1, -1, 0, 0, 0], [1, 1, 0, 1, 1]], dtype='f4'))
51
+ self.vao = self.ctx.vertex_array(self.shader.program, [(self.vbo, '3f 2f', 'in_position', 'in_uv')], skip_errors=True)
40
52
 
53
+ # Save the filter
41
54
  self.filter = filter
42
55
 
56
+ # Add to the engine for updates
57
+ self.engine.fbos.append(self)
58
+
59
+ def render(self) -> None:
60
+ self.shader.program['screenTexture'] = 0
61
+ self.texture.use(location=0)
62
+ self.vao.render()
63
+
43
64
  def use(self) -> None:
44
65
  """
45
66
  Select this framebuffer for use
@@ -74,7 +95,11 @@ class Framebuffer:
74
95
  self.__del__()
75
96
 
76
97
  # Set/get size attribute
77
- self.size = size if size else self.engine.win_size
98
+ if size:
99
+ self.size = size
100
+ else:
101
+ self.size = self._size if self._size else self.engine.win_size
102
+ self.size = (int(self.size[0] * self.resolution_scale), int(self.size[1] * self.resolution_scale))
78
103
 
79
104
  # Create the fbo
80
105
  self.texture = self.ctx.texture(self.size, components=self.components)
@@ -80,7 +80,7 @@ class PostProcess:
80
80
  """
81
81
 
82
82
  # Create a blank framebuffer
83
- if not detination:
83
+ if not detination or detination.size != self.size:
84
84
  fbo = Framebuffer(self.engine, self.size, self.components)
85
85
  old_filter = None
86
86
  fbo.texture.filter = self.filter
@@ -18,6 +18,7 @@ from .nodes.node import Node
18
18
  from .generic.collisions import moller_trumbore
19
19
  from .generic.raycast_result import RaycastResult
20
20
  from .render.post_process import PostProcess
21
+ from .render.framebuffer import Framebuffer
21
22
 
22
23
  class Scene():
23
24
  engine: any
@@ -54,19 +55,26 @@ class Scene():
54
55
  if self.engine.delta_time < 0.5: # TODO this will cause physics to slow down when on low frame rate, this is probabl;y acceptable
55
56
  self.collider_handler.resolve_collisions()
56
57
 
57
- def render(self) -> None:
58
+ def render(self, render_target: Framebuffer|Frame=None) -> None:
58
59
  """
59
60
  Renders all the nodes with meshes in the scene
60
61
  """
61
62
 
62
- self.frame.use()
63
+ if render_target:
64
+ show = False
65
+ else:
66
+ render_target = self.frame
67
+ show = True
68
+
69
+ render_target.use()
70
+ render_target.clear()
63
71
  self.shader_handler.write()
64
72
  if self.sky: self.sky.render()
65
73
  self.node_handler.render()
66
74
  self.particle.render()
67
75
  self.draw_handler.render()
68
76
 
69
- if self.engine.headless: return
77
+ if self.engine.headless or not show: return
70
78
  self.frame.render()
71
79
 
72
80
  def add(self, *objects: Node | None) -> None | Node | list:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: basilisk-engine
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Python 3D Framework
5
5
  Home-page: https://basilisk-website.vercel.app/
6
6
  Author: Name
@@ -12,6 +12,7 @@ Requires-Dist: pygame-ce
12
12
  Requires-Dist: moderngl
13
13
  Requires-Dist: PyGLM
14
14
  Requires-Dist: numba
15
+ Requires-Dist: PyOpenAL
15
16
 
16
17
  # Basilisk Engine
17
18
  ![image](https://github.com/user-attachments/assets/5e39445c-e0da-452c-9f18-e590cca948c4)
@@ -4,3 +4,4 @@ pygame-ce
4
4
  moderngl
5
5
  PyGLM
6
6
  numba
7
+ PyOpenAL
@@ -7,7 +7,7 @@ with open(path.join(working_directory, 'README.md'), encoding='utf-8') as f:
7
7
 
8
8
  setup(
9
9
  name = 'basilisk-engine', # Name of folder containing scripts and __init__
10
- version = '0.1.5',
10
+ version = '0.1.7',
11
11
  url = 'https://basilisk-website.vercel.app/',
12
12
  author = 'Name',
13
13
  author_email = 'basiliskengine@gmail.com',
@@ -16,5 +16,5 @@ setup(
16
16
  long_description_content_type = 'text/markdown',
17
17
  packages=find_packages(),
18
18
  include_package_data=True,
19
- install_requires=['numpy', 'pillow', 'pygame-ce', 'moderngl', 'PyGLM', 'numba'], # Include all used packages
19
+ install_requires=['numpy', 'pillow', 'pygame-ce', 'moderngl', 'PyGLM', 'numba', 'PyOpenAL'], # Include all used packages
20
20
  )