aether-engine 1.7.1__tar.gz → 1.8.1__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.
Files changed (126) hide show
  1. {aether_engine-1.7.1 → aether_engine-1.8.1}/MANIFEST.in +3 -0
  2. {aether_engine-1.7.1/aether_engine.egg-info → aether_engine-1.8.1}/PKG-INFO +34 -46
  3. aether_engine-1.8.1/README.md +80 -0
  4. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/__init__.py +1 -1
  5. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/cli.py +66 -13
  6. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/_identity.py +1 -1
  7. aether_engine-1.8.1/aether/docs/GUIDE.md +270 -0
  8. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/camera.py +38 -9
  9. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/mesh_factory.py +68 -0
  10. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/component.py +3 -3
  11. aether_engine-1.8.1/aether/scene/scene.py +55 -0
  12. aether_engine-1.8.1/aether/ui/hud.py +150 -0
  13. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/content.py +97 -21
  14. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/plain_content.py +49 -3
  15. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/registry.py +12 -11
  16. {aether_engine-1.7.1 → aether_engine-1.8.1/aether_engine.egg-info}/PKG-INFO +34 -46
  17. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/SOURCES.txt +2 -0
  18. aether_engine-1.8.1/docs/GUIDE.md +270 -0
  19. {aether_engine-1.7.1 → aether_engine-1.8.1}/setup.py +1 -1
  20. aether_engine-1.7.1/README.md +0 -92
  21. aether_engine-1.7.1/aether/scene/scene.py +0 -33
  22. aether_engine-1.7.1/aether/ui/hud.py +0 -65
  23. {aether_engine-1.7.1 → aether_engine-1.8.1}/LICENSE +0 -0
  24. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/__main__.py +0 -0
  25. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/accelerators/__init__.py +0 -0
  26. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/accelerators/gameplay.py +0 -0
  27. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/accelerators/voxel.py +0 -0
  28. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ai/behavior_tree.py +0 -0
  29. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ai/navmesh.py +0 -0
  30. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/animation/skeleton.py +0 -0
  31. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/assets/__pycache__/asset_pipeline.cpython-314.pyc +0 -0
  32. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/assets/asset_pipeline.py +0 -0
  33. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/assets/fonts/AetherSans.ttf +0 -0
  34. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/__init__.py +0 -0
  35. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/audio_manager.py +0 -0
  36. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/music.py +0 -0
  37. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/sfx.py +0 -0
  38. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/sound.py +0 -0
  39. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/__init__.py +0 -0
  40. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/achievement_system.py +0 -0
  41. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/application.py +0 -0
  42. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/boot_splash.py +0 -0
  43. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/branding_guard.py +0 -0
  44. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/config.py +0 -0
  45. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/console.py +0 -0
  46. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/engine.py +0 -0
  47. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/event_bus.py +0 -0
  48. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/input.py +0 -0
  49. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/plugin_system.py +0 -0
  50. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/save_system.py +0 -0
  51. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/time_manager.py +0 -0
  52. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/window.py +0 -0
  53. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/editor/__init__.py +0 -0
  54. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/environment/environment_system.py +0 -0
  55. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/__init__.py +0 -0
  56. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/first_person.py +0 -0
  57. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/framebuffer.py +0 -0
  58. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/light.py +0 -0
  59. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/lod_system.py +0 -0
  60. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/material.py +0 -0
  61. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/mesh.py +0 -0
  62. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/particle_system.py +0 -0
  63. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/post_process.py +0 -0
  64. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/renderer.py +0 -0
  65. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/shader.py +0 -0
  66. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/shader_library.py +0 -0
  67. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/sky_atmosphere.py +0 -0
  68. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/terrain.py +0 -0
  69. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/texture.py +0 -0
  70. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/voxel_mesh.py +0 -0
  71. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/water.py +0 -0
  72. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics2d/__init__.py +0 -0
  73. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/network/network_manager.py +0 -0
  74. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/__init__.py +0 -0
  75. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/bullet_backend.py +0 -0
  76. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/collider.py +0 -0
  77. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/physics2d.py +0 -0
  78. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/physics3d.py +0 -0
  79. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/physics_world.py +0 -0
  80. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/raycast.py +0 -0
  81. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/rigidbody.py +0 -0
  82. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/platform/steam_api.py +0 -0
  83. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/__init__.py +0 -0
  84. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/asset_database.py +0 -0
  85. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/asset_loader.py +0 -0
  86. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/loaders/model_loader.py +0 -0
  87. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/loaders/obj_loader.py +0 -0
  88. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/loaders/texture_loader.py +0 -0
  89. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/resource_manager.py +0 -0
  90. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/save_load.py +0 -0
  91. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/serialization.py +0 -0
  92. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/__init__.py +0 -0
  93. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/entity.py +0 -0
  94. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/scene_graph.py +0 -0
  95. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/scene_manager.py +0 -0
  96. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/tools/__init__.py +0 -0
  97. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/tools/packager.py +0 -0
  98. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ui/__init__.py +0 -0
  99. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ui/button.py +0 -0
  100. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ui/canvas.py +0 -0
  101. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ui/text.py +0 -0
  102. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/__init__.py +0 -0
  103. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/fonts.py +0 -0
  104. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/logger.py +0 -0
  105. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/math_utils.py +0 -0
  106. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/object_pool.py +0 -0
  107. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/profiler.py +0 -0
  108. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/__init__.py +0 -0
  109. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/bot_detect.py +0 -0
  110. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/config.py +0 -0
  111. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/notifications.py +0 -0
  112. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/plain.py +0 -0
  113. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/secrets.py +0 -0
  114. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/server.py +0 -0
  115. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/templates.py +0 -0
  116. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/urls.py +0 -0
  117. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/dependency_links.txt +0 -0
  118. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/entry_points.txt +0 -0
  119. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/requires.txt +4 -4
  120. {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/top_level.txt +0 -0
  121. {aether_engine-1.7.1 → aether_engine-1.8.1}/examples/01_hello_cube.py +0 -0
  122. {aether_engine-1.7.1 → aether_engine-1.8.1}/examples/02_sphere_scene.py +0 -0
  123. {aether_engine-1.7.1 → aether_engine-1.8.1}/examples/03_first_person.py +0 -0
  124. {aether_engine-1.7.1 → aether_engine-1.8.1}/examples/04_physics2d.py +0 -0
  125. {aether_engine-1.7.1 → aether_engine-1.8.1}/pyproject.toml +0 -0
  126. {aether_engine-1.7.1 → aether_engine-1.8.1}/setup.cfg +0 -0
@@ -1,13 +1,16 @@
1
1
  include README.md
2
2
  include LICENSE
3
3
  include pyproject.toml
4
+ include docs/GUIDE.md
4
5
 
5
6
  recursive-include aether *.py
6
7
  recursive-include aether *.glsl
7
8
  recursive-include aether *.vert
8
9
  recursive-include aether *.frag
9
10
  recursive-include aether *.json
11
+ recursive-include aether *.md
10
12
  recursive-include aether/assets *
13
+ recursive-include aether/docs *
11
14
 
12
15
  recursive-include examples *.py
13
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aether-engine
3
- Version: 1.7.1
3
+ Version: 1.8.1
4
4
  Summary: 3D/2D game engine by entiti937 — OpenGL, physics, FPS, mandatory branding splash
5
5
  Home-page: https://pypi.org/project/aether-engine/
6
6
  Author: entiti937
@@ -31,13 +31,13 @@ Requires-Dist: trimesh>=3.21; extra == "models"
31
31
  Provides-Extra: build
32
32
  Requires-Dist: pyinstaller>=6.0; extra == "build"
33
33
  Provides-Extra: full
34
- Requires-Dist: pyinstaller>=6.0; extra == "full"
35
- Requires-Dist: pygame-ce>=2.5; extra == "full"
36
- Requires-Dist: imageio>=2.31; extra == "full"
37
- Requires-Dist: trimesh>=3.21; extra == "full"
38
34
  Requires-Dist: pymunk>=6.0; extra == "full"
35
+ Requires-Dist: imageio>=2.31; extra == "full"
39
36
  Requires-Dist: pyyaml>=6.0; extra == "full"
37
+ Requires-Dist: pyinstaller>=6.0; extra == "full"
40
38
  Requires-Dist: freetype-py>=2.4; extra == "full"
39
+ Requires-Dist: trimesh>=3.21; extra == "full"
40
+ Requires-Dist: pygame-ce>=2.5; extra == "full"
41
41
  Dynamic: author
42
42
  Dynamic: classifier
43
43
  Dynamic: description
@@ -52,10 +52,10 @@ Dynamic: summary
52
52
  # Aether Engine
53
53
 
54
54
  **3D / 2D игровой движок на Python + OpenGL**
55
- **Разработчик:** entiti937 · **Версия:** 1.7.1 · **Лицензия:** MIT
55
+ **Разработчик:** entiti937 · **Версия:** 1.8.1 · **Лицензия:** MIT
56
56
  **PyPI:** https://pypi.org/project/aether-engine/
57
57
 
58
- > Полное руководство: [`docs/GUIDE.md`](docs/GUIDE.md)
58
+ > Полное руководство: [`docs/GUIDE.md`](docs/GUIDE.md) · сайт: `aether website`
59
59
 
60
60
  ---
61
61
 
@@ -65,38 +65,24 @@ Dynamic: summary
65
65
  pip install -U "aether-engine[full]"
66
66
  ```
67
67
 
68
- ## Что нового в 1.7.1
69
-
70
- - Документация: 2D-физика (pymunk), статус 3D-солвера, GLFW vs pygame-ce
71
- - Единый импорт компонентов из `aether`
72
- - Расширен раздел Performance
73
-
74
- ## Что нового в 1.7.0
75
-
76
- - **AssetLoader** — загрузка любых моделей, спрайтов и текстур (OBJ/GLB/FBX/PNG/WebP/…)
77
- - `Sprite.from_image(path)` — быстрый импорт 2D-графики
78
- - Встроенный редактор **убран** (может вернуться в будущих версиях)
79
-
80
- ## Showcase-игра
81
-
82
- Minecraft-like sandbox **на этом же движке**:
83
-
84
- ```bash
85
- aether help
86
- aether build games/aether_craft.py --name AetherCraft
87
- python games/aether_craft.py
68
+ ```python
69
+ import aether # правильно
70
+ # import aether_engine # НЕПРАВИЛЬНО — такого модуля нет
88
71
  ```
89
72
 
90
- Там есть: воксельный мир, вид от 1 лица, ломать/ставить блоки, HUD, звуки, день/ночь, сейвы (F5/F9), урон и респавн.
73
+ ## Что нового в 1.8.1
91
74
 
92
- ## Другие запуски
75
+ - `Hud.draw_bar(x, y, w, h, value, max_value, color)` — простой и понятный вызов
76
+ - `aether docs` печатает **полный** GUIDE.md (гайд вшит в пакет)
77
+ - Координаты HUD явно: (0,0) = центр экрана
93
78
 
94
- ```bash
95
- python games/orb_rush.py
96
- python examples/03_first_person.py
97
- python examples/04_physics2d.py
98
- aether website
99
- ```
79
+ ## Что нового в 1.8.0
80
+
81
+ - `Scene.remove()` / `despawn()` / `find()`
82
+ - `MeshFactory.create_cylinder(...)`
83
+ - `Camera.look_at(target)` + безопасное присвоение `cam.position = (x,y,z)`
84
+ - HUD: `draw_rect`, `draw_panel`
85
+ - Полный **API Reference** в документации (и `/plain/all` для ИИ)
100
86
 
101
87
  ## Минимальный код
102
88
 
@@ -123,20 +109,22 @@ engine.enable_first_person(camera)
123
109
  engine.run()
124
110
  ```
125
111
 
126
- ## Возможности
112
+ ## Частые операции
127
113
 
128
- - PBR 3D + sprites 2D + HUD overlay
129
- - FPS (`enable_first_person`) и free-look камера
130
- - Физика 3D/2D + raycast
131
- - `AssetLoader` / `ModelLoader` — OBJ/GLB/glTF/STL/FBX/STEP/… + PNG/WebP спрайты
132
- - Procedural SFX, JSON save/load
133
- - Примеры и игры в репозитории
134
-
135
- > Встроенный редактор моделей/пиксель-арт **временно убран** — планируется вернуть позже. Сейчас используйте Blender, Aseprite и т.д., файлы подгружайте через `AssetLoader`.
114
+ ```python
115
+ scene.remove(entity) # удалить объект
116
+ MeshFactory.create_cylinder(0.5, 2) # цилиндр
117
+ cam.look_at(player_tf.position) # смотреть на игрока
118
+ engine.free_camera = False # своя камера (не WASD fly)
119
+ ```
136
120
 
137
- ## Документация
121
+ ## Возможности
138
122
 
139
- Все команды, API и туториалы: **[docs/GUIDE.md](docs/GUIDE.md)**
123
+ - PBR 3D + sprites 2D + HUD overlay
124
+ - FPS / free-look / `look_at` follow-камера
125
+ - Физика 2D (pymunk) + лёгкий 3D solver
126
+ - `AssetLoader` — модели и спрайты
127
+ - `aether website` + plain docs для LLM
140
128
 
141
129
  ---
142
130
 
@@ -0,0 +1,80 @@
1
+ # Aether Engine
2
+
3
+ **3D / 2D игровой движок на Python + OpenGL**
4
+ **Разработчик:** entiti937 · **Версия:** 1.8.1 · **Лицензия:** MIT
5
+ **PyPI:** https://pypi.org/project/aether-engine/
6
+
7
+ > Полное руководство: [`docs/GUIDE.md`](docs/GUIDE.md) · сайт: `aether website`
8
+
9
+ ---
10
+
11
+ ## Установка
12
+
13
+ ```bash
14
+ pip install -U "aether-engine[full]"
15
+ ```
16
+
17
+ ```python
18
+ import aether # правильно
19
+ # import aether_engine # НЕПРАВИЛЬНО — такого модуля нет
20
+ ```
21
+
22
+ ## Что нового в 1.8.1
23
+
24
+ - `Hud.draw_bar(x, y, w, h, value, max_value, color)` — простой и понятный вызов
25
+ - `aether docs` печатает **полный** GUIDE.md (гайд вшит в пакет)
26
+ - Координаты HUD явно: (0,0) = центр экрана
27
+
28
+ ## Что нового в 1.8.0
29
+
30
+ - `Scene.remove()` / `despawn()` / `find()`
31
+ - `MeshFactory.create_cylinder(...)`
32
+ - `Camera.look_at(target)` + безопасное присвоение `cam.position = (x,y,z)`
33
+ - HUD: `draw_rect`, `draw_panel`
34
+ - Полный **API Reference** в документации (и `/plain/all` для ИИ)
35
+
36
+ ## Минимальный код
37
+
38
+ ```python
39
+ from aether import (
40
+ Engine, Scene, Entity, Transform, MeshRenderer,
41
+ MeshFactory, Material, Camera,
42
+ )
43
+
44
+ engine = Engine(1280, 720, "Game by you — engine by entiti937")
45
+ scene = Scene("Main")
46
+ camera = Camera(position=(0, 2, 6), yaw=-90)
47
+ scene.set_main_camera(camera)
48
+
49
+ cube = Entity("Cube")
50
+ cube.add_component(Transform(position=(0, 1, 0)))
51
+ mat = Material()
52
+ mat.albedo[:] = (0.2, 0.85, 1.0)
53
+ cube.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=mat))
54
+ scene.spawn(cube)
55
+
56
+ engine.load_scene(scene)
57
+ engine.enable_first_person(camera)
58
+ engine.run()
59
+ ```
60
+
61
+ ## Частые операции
62
+
63
+ ```python
64
+ scene.remove(entity) # удалить объект
65
+ MeshFactory.create_cylinder(0.5, 2) # цилиндр
66
+ cam.look_at(player_tf.position) # смотреть на игрока
67
+ engine.free_camera = False # своя камера (не WASD fly)
68
+ ```
69
+
70
+ ## Возможности
71
+
72
+ - PBR 3D + sprites 2D + HUD overlay
73
+ - FPS / free-look / `look_at` follow-камера
74
+ - Физика 2D (pymunk) + лёгкий 3D solver
75
+ - `AssetLoader` — модели и спрайты
76
+ - `aether website` + plain docs для LLM
77
+
78
+ ---
79
+
80
+ Aether Engine © **entiti937**
@@ -31,7 +31,7 @@ from aether.audio.sfx import SfxBank
31
31
  from aether.resources.save_load import save_json, load_json
32
32
  from aether.physics.raycast import Raycaster
33
33
 
34
- __version__ = "1.7.1"
34
+ __version__ = "1.8.1"
35
35
 
36
36
  from aether.graphics.voxel_mesh import ChunkedVoxelMesher
37
37
  from aether.accelerators import is_native_available, backend_name
@@ -15,6 +15,8 @@ QUICK_REFERENCE = f"""
15
15
 
16
16
  УСТАНОВКА
17
17
  pip install -U "aether-engine[full]"
18
+ # пакет на PyPI: aether-engine
19
+ # импорт в коде: import aether (НЕ aether_engine)
18
20
 
19
21
  МИНИМАЛЬНЫЙ КОД (3D)
20
22
  from aether import Engine, Scene, Entity, Transform, MeshRenderer, MeshFactory, Material, Camera
@@ -26,7 +28,8 @@ QUICK_REFERENCE = f"""
26
28
 
27
29
  cube = Entity("Cube")
28
30
  cube.add_component(Transform(position=(0, 1, 0)))
29
- mat = Material(); mat.albedo[:] = (0.2, 0.9, 0.3)
31
+ mat = Material()
32
+ mat.albedo[:] = (0.2, 0.9, 0.3)
30
33
  cube.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=mat))
31
34
  scene.spawn(cube)
32
35
 
@@ -34,6 +37,39 @@ QUICK_REFERENCE = f"""
34
37
  engine.enable_first_person(cam) # FPS
35
38
  engine.run() # ESC — выход
36
39
 
40
+ УДАЛЕНИЕ ОБЪЕКТОВ
41
+ scene.remove(entity) # убрать из сцены + destroy()
42
+ # или entity.destroy() # только компоненты (лучше scene.remove)
43
+
44
+ ПРИМИТИВЫ MeshFactory
45
+ create_cube(size=1)
46
+ create_plane(size=10)
47
+ create_sphere(radius=1, sectors=24, stacks=16)
48
+ create_cylinder(radius=0.5, height=1, segments=24)
49
+ create_pyramid(size=1, height=1)
50
+
51
+ КАМЕРА
52
+ cam.position = (x, y, z) # numpy array под капотом
53
+ cam.yaw, cam.pitch, cam.fov
54
+ cam.look_at(target) # смотреть на точку/игрока
55
+ cam.rotate(dx, dy)
56
+ engine.free_camera = False # если управляете камерой сами
57
+
58
+ TRANSFORM
59
+ tf.position # np.ndarray float32, можно tf.position[:] = (x,y,z)
60
+ tf.set_position(x,y,z) / set_rotation / set_scale
61
+ tf.translate(dx,dy,dz)
62
+
63
+ HUD (координаты: 0,0 = ЦЕНТР экрана, +Y вверх; текста нет — пишите в title)
64
+ from aether import Hud
65
+ engine.draw_hud = True
66
+ hud = Hud(engine.renderer2d)
67
+ hud.clear()
68
+ # draw_bar(x, y, width, height, value, max_value, color)
69
+ hud.draw_bar(-500, 300, 200, 20, hp, 100, (0.8, 0.2, 0.2, 1.0))
70
+ hud.draw_crosshair()
71
+ engine.window.set_title(f"HP {{hp}}")
72
+
37
73
  FPS / КАМЕРА
38
74
  engine.enable_first_person(camera, eye_height=1.7, walk_speed=6)
39
75
  engine.free_camera = True # WASD + Tab (мышь)
@@ -78,13 +114,13 @@ NPC / НАГРАДЫ (RUST, опционально)
78
114
  aether build my_game.py --name MyGame --console
79
115
 
80
116
  ИНСТРУМЕНТЫ
81
- aether help — эта справка
82
- aether docs — краткий гайд по API
83
- aether website — documentation site (domain in bell notifications)
117
+ aether help — краткая шпаргалка
118
+ aether docs — ПОЛНЫЙ гайд (весь GUIDE.md в терминал)
119
+ aether website — HTML-сайт документации
84
120
  python -m aether website
85
121
  python games/aether_craft.py
86
122
 
87
- ПОЛНАЯ ДОКУМЕНТАЦИЯ: docs/GUIDE.md
123
+ ПОЛНАЯ ДОКУМЕНТАЦИЯ: aether docs | сайт: aether website
88
124
  PyPI: https://pypi.org/project/aether-engine/
89
125
  """
90
126
 
@@ -95,12 +131,29 @@ def cmd_help(_args):
95
131
 
96
132
 
97
133
  def cmd_docs(_args):
98
- guide = Path(__file__).resolve().parents[2] / "docs" / "GUIDE.md"
99
- if guide.exists():
100
- print(guide.read_text(encoding="utf-8"))
101
- else:
102
- print(QUICK_REFERENCE)
103
- return 0
134
+ """Print the full bundled developer guide."""
135
+ here = Path(__file__).resolve().parent
136
+ candidates = [
137
+ here / "docs" / "GUIDE.md",
138
+ here.parents[1] / "docs" / "GUIDE.md",
139
+ here.parents[0] / "docs" / "GUIDE.md",
140
+ ]
141
+ for guide in candidates:
142
+ if guide.exists():
143
+ text = guide.read_text(encoding="utf-8")
144
+ try:
145
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
146
+ except Exception:
147
+ pass
148
+ try:
149
+ print(text)
150
+ except UnicodeEncodeError:
151
+ sys.stdout.buffer.write(text.encode("utf-8", errors="replace"))
152
+ sys.stdout.buffer.write(b"\n")
153
+ return 0
154
+ print(QUICK_REFERENCE)
155
+ print("\n[aether docs] GUIDE.md not found in package — reinstall: pip install -U aether-engine")
156
+ return 1
104
157
 
105
158
 
106
159
  def cmd_build(args):
@@ -130,8 +183,8 @@ def main(argv=None):
130
183
 
131
184
  sub = parser.add_subparsers(dest="command")
132
185
 
133
- sub.add_parser("help", help="Краткая справка по API и командам").set_defaults(func=cmd_help)
134
- sub.add_parser("docs", help="Полная документация").set_defaults(func=cmd_docs)
186
+ sub.add_parser("help", help="Краткая шпаргалка").set_defaults(func=cmd_help)
187
+ sub.add_parser("docs", help="Полный гайд разработчика (весь GUIDE.md)").set_defaults(func=cmd_docs)
135
188
 
136
189
  p_build = sub.add_parser("build", help="Собрать игру в .exe (PyInstaller)")
137
190
  p_build.add_argument("script", help="Путь к main.py игры")
@@ -20,7 +20,7 @@ _B = {
20
20
  ]),
21
21
  "sig": bytes([
22
22
  230, 194, 211, 207, 194, 213, 135, 226, 201, 192, 206, 201, 194,
23
- 135, 150, 137, 144, 137, 150,
23
+ 135, 150, 137, 159, 137, 150,
24
24
  ]),
25
25
  }
26
26
 
@@ -0,0 +1,270 @@
1
+ # Aether Engine — Full Developer Guide
2
+
3
+ **Version:** 1.8.1 · **Author:** entiti937 · **License:** MIT
4
+ **PyPI package:** `aether-engine`
5
+ **Python import:** `import aether` ← NEVER `import aether_engine`
6
+
7
+ Commands:
8
+ - `aether help` — short cheat sheet
9
+ - `aether docs` — **this full guide** (printed to terminal)
10
+ - `aether website` — local HTML docs (+ `/plain/all` for AI)
11
+
12
+ ---
13
+
14
+ ## 0. Exact package names
15
+
16
+ ```bash
17
+ pip install -U "aether-engine[full]"
18
+ ```
19
+
20
+ ```python
21
+ from aether import Engine, Scene, Entity, Transform, MeshRenderer
22
+ from aether import MeshFactory, Material, Camera, Hud, HudBar, Sprite, AssetLoader
23
+ ```
24
+
25
+ ---
26
+
27
+ ## 1. Minimal 3D game
28
+
29
+ ```python
30
+ from aether import (
31
+ Engine, Scene, Entity, Transform, MeshRenderer,
32
+ MeshFactory, Material, Camera,
33
+ )
34
+
35
+ engine = Engine(1280, 720, "My Game")
36
+ scene = Scene("Main")
37
+ camera = Camera(position=(0, 2, 8), yaw=-90, pitch=-15)
38
+ scene.set_main_camera(camera)
39
+
40
+ cube = Entity("Cube")
41
+ cube.add_component(Transform(position=(0, 1, 0)))
42
+ mat = Material("green")
43
+ mat.albedo[:] = (0.2, 0.9, 0.4)
44
+ cube.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=mat))
45
+ scene.spawn(cube)
46
+
47
+ engine.load_scene(scene)
48
+ engine.enable_first_person(camera)
49
+ engine.run() # blocks until ESC
50
+ ```
51
+
52
+ ---
53
+
54
+ ## 2. Scene — add / remove objects
55
+
56
+ ```python
57
+ scene.spawn(entity) # add
58
+ scene.remove(entity) # REMOVE from scene + destroy() ← use this to delete
59
+ scene.despawn(entity) # same as remove
60
+ found = scene.find("Player") # Entity or None
61
+ ```
62
+
63
+ **Important:** `entity.destroy()` alone does NOT remove it from `scene.entities`. Always prefer `scene.remove(entity)`.
64
+
65
+ ---
66
+
67
+ ## 3. Transform
68
+
69
+ `position`, `rotation`, `scale` = **numpy float32 arrays** length 3. Rotation in **degrees**.
70
+
71
+ ```python
72
+ tf = Transform(position=(0, 1, 0), rotation=(0, 45, 0), scale=(1, 1, 1))
73
+ tf.set_position(x, y, z)
74
+ tf.position[:] = (1, 2, 3)
75
+ tf.position[1] += 0.1
76
+ tf.translate(dx, dy, dz)
77
+ tf.set_rotation(rx, ry, rz)
78
+ tf.rotate(0, 90 * dt, 0)
79
+ tf.set_scale(sx, sy, sz)
80
+ ```
81
+
82
+ ---
83
+
84
+ ## 4. Camera
85
+
86
+ ```python
87
+ cam = Camera(position=(0, 5, 10), yaw=-90, pitch=-20, fov=60)
88
+ cam.position = (x, y, z) # tuple OK
89
+ cam.yaw = -45
90
+ cam.pitch = -15
91
+ cam.look_at(target) # world point or player_tf.position
92
+ cam.rotate(dx, dy) # mouse deltas
93
+ ```
94
+
95
+ Third-person follow:
96
+
97
+ ```python
98
+ engine.free_camera = False # REQUIRED when you move the camera yourself
99
+ target = player_tf.position
100
+ cam.position = (target[0], target[1] + 6, target[2] + 10)
101
+ cam.look_at(target)
102
+ ```
103
+
104
+ FPS: `engine.enable_first_person(camera, eye_height=1.7, walk_speed=6)`
105
+
106
+ ---
107
+
108
+ ## 5. MeshFactory — ALL primitives
109
+
110
+ | Method | Signature |
111
+ |--------|-----------|
112
+ | cube | `create_cube(size=1.0)` |
113
+ | plane | `create_plane(size=10.0)` |
114
+ | sphere | `create_sphere(radius=1.0, sectors=24, stacks=16)` |
115
+ | cylinder | `create_cylinder(radius=0.5, height=1.0, segments=24, capped=True)` |
116
+ | pyramid | `create_pyramid(size=1.0, height=1.0)` |
117
+
118
+ ```python
119
+ MeshFactory.create_cylinder(radius=0.8, height=3.0, segments=24)
120
+ ```
121
+
122
+ ---
123
+
124
+ ## 6. Material
125
+
126
+ ```python
127
+ mat = Material("metal")
128
+ mat.albedo[:] = (0.9, 0.2, 0.2) # RGB 0..1 numpy
129
+ mat.metallic = 0.8
130
+ mat.roughness = 0.3
131
+ mat.ao = 1.0
132
+ ```
133
+
134
+ ---
135
+
136
+ ## 7. HUD — exact API (read carefully)
137
+
138
+ Enable overlay:
139
+
140
+ ```python
141
+ from aether import Hud, HudBar
142
+
143
+ engine.draw_hud = True
144
+ hud = Hud(engine.renderer2d)
145
+ ```
146
+
147
+ **Coordinates:** origin `(0,0)` = **center of the window**, +X right, +Y up.
148
+ Not top-left pixels. On 1280×720, top-left area ≈ `(-500, 300)`.
149
+
150
+ **No bitmap text yet.** Put strings in the window title:
151
+
152
+ ```python
153
+ engine.window.set_title(f"HP {hp} | score {score}")
154
+ ```
155
+
156
+ ### draw_bar — exact signatures
157
+
158
+ ```python
159
+ # RECOMMENDED — current value + max value + color
160
+ hud.draw_bar(x, y, width, height, value, max_value, color)
161
+ hud.draw_bar(-500, 300, 200, 20, hp, 100, (0.8, 0.2, 0.2, 1.0))
162
+
163
+ # Fraction 0..1 only
164
+ hud.draw_bar(-500, 300, 200, 20, 0.75)
165
+
166
+ # HudBar object
167
+ hud.draw_bar(-500, 300, 200, 20, HudBar("hp", value=0.75, color=(0.8, 0.2, 0.2, 1.0)))
168
+ ```
169
+
170
+ ### Other HUD methods
171
+
172
+ ```python
173
+ hud.clear() # call every frame before drawing
174
+ hud.draw_crosshair(size=10, thickness=2)
175
+ hud.draw_hotbar(slots=7, selected=0, colors=[(1,0,0), (0,1,0)], y=-220)
176
+ hud.draw_rect(x, y, width, height, color=(1,1,1,1), layer=70)
177
+ hud.draw_panel(x, y, width, height)
178
+ ```
179
+
180
+ Full frame example:
181
+
182
+ ```python
183
+ def update(dt):
184
+ hud.clear()
185
+ hud.draw_bar(-500, 300, 200, 20, hp, 100, (0.8, 0.2, 0.2, 1.0))
186
+ hud.draw_crosshair()
187
+ engine.window.set_title(f"HP {hp}")
188
+ ```
189
+
190
+ ---
191
+
192
+ ## 8. Assets
193
+
194
+ ```python
195
+ from aether import AssetLoader, Sprite
196
+
197
+ mesh = AssetLoader.load_model("hero.glb")
198
+ sprite = Sprite.from_image("icon.png", x=0, y=0)
199
+ tex_id = AssetLoader.load_texture("wall.jpg")
200
+ ```
201
+
202
+ ---
203
+
204
+ ## 9. Physics
205
+
206
+ **2D (ready):** `engine.physics2d` (pymunk) — see `examples/04_physics2d.py`
207
+
208
+ ```python
209
+ engine.set_mode("2d")
210
+ pw = engine.physics2d
211
+ ground = pw.create_box(0, -200, 600, 40, static=True)
212
+ ball = pw.create_circle(0, 0, 20, mass=1.0)
213
+ sprite.x, sprite.y = ball.x, ball.y # Y-up, same space
214
+ ```
215
+
216
+ **3D:** lightweight built-in solver. PyBullet/Jolt planned later.
217
+
218
+ ```python
219
+ from aether import BoxCollider
220
+ body = engine.physics3d.create_body_for_entity(ent, mass=1.0, collider=BoxCollider(size=(1,1,1)))
221
+ ```
222
+
223
+ ---
224
+
225
+ ## 10. Input / update
226
+
227
+ ```python
228
+ import glfw
229
+
230
+ def update(dt):
231
+ if engine.input.get_key(glfw.KEY_W):
232
+ ...
233
+ if engine.input.get_key_down(glfw.KEY_SPACE):
234
+ ...
235
+
236
+ engine.on_update(update)
237
+ ```
238
+
239
+ ---
240
+
241
+ ## 11. Window vs audio
242
+
243
+ - **GLFW** — window, input, OpenGL 4.6
244
+ - **pygame-ce** — sound mixer only (display never initialized)
245
+
246
+ ---
247
+
248
+ ## 12. CLI
249
+
250
+ ```bash
251
+ aether help
252
+ aether docs # full guide (this file)
253
+ aether website # HTML docs on localhost
254
+ aether build game.py --name MyGame
255
+ ```
256
+
257
+ ---
258
+
259
+ ## 13. Examples
260
+
261
+ | File | Topic |
262
+ |------|--------|
263
+ | `examples/01_hello_cube.py` | Basics |
264
+ | `examples/02_sphere_scene.py` | Materials |
265
+ | `examples/03_first_person.py` | FPS |
266
+ | `examples/04_physics2d.py` | 2D physics |
267
+
268
+ ---
269
+
270
+ Aether Engine © entiti937