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.
- {aether_engine-1.7.1 → aether_engine-1.8.1}/MANIFEST.in +3 -0
- {aether_engine-1.7.1/aether_engine.egg-info → aether_engine-1.8.1}/PKG-INFO +34 -46
- aether_engine-1.8.1/README.md +80 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/__init__.py +1 -1
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/cli.py +66 -13
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/_identity.py +1 -1
- aether_engine-1.8.1/aether/docs/GUIDE.md +270 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/camera.py +38 -9
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/mesh_factory.py +68 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/component.py +3 -3
- aether_engine-1.8.1/aether/scene/scene.py +55 -0
- aether_engine-1.8.1/aether/ui/hud.py +150 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/content.py +97 -21
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/plain_content.py +49 -3
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/registry.py +12 -11
- {aether_engine-1.7.1 → aether_engine-1.8.1/aether_engine.egg-info}/PKG-INFO +34 -46
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/SOURCES.txt +2 -0
- aether_engine-1.8.1/docs/GUIDE.md +270 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/setup.py +1 -1
- aether_engine-1.7.1/README.md +0 -92
- aether_engine-1.7.1/aether/scene/scene.py +0 -33
- aether_engine-1.7.1/aether/ui/hud.py +0 -65
- {aether_engine-1.7.1 → aether_engine-1.8.1}/LICENSE +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/__main__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/accelerators/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/accelerators/gameplay.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/accelerators/voxel.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ai/behavior_tree.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ai/navmesh.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/animation/skeleton.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/assets/__pycache__/asset_pipeline.cpython-314.pyc +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/assets/asset_pipeline.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/assets/fonts/AetherSans.ttf +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/audio_manager.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/music.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/sfx.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/audio/sound.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/achievement_system.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/application.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/boot_splash.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/branding_guard.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/config.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/console.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/engine.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/event_bus.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/input.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/plugin_system.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/save_system.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/time_manager.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/core/window.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/editor/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/environment/environment_system.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/first_person.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/framebuffer.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/light.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/lod_system.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/material.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/mesh.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/particle_system.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/post_process.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/renderer.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/shader.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/shader_library.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/sky_atmosphere.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/terrain.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/texture.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/voxel_mesh.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics/water.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/graphics2d/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/network/network_manager.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/bullet_backend.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/collider.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/physics2d.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/physics3d.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/physics_world.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/raycast.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/physics/rigidbody.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/platform/steam_api.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/asset_database.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/asset_loader.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/loaders/model_loader.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/loaders/obj_loader.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/loaders/texture_loader.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/resource_manager.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/save_load.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/resources/serialization.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/entity.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/scene_graph.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/scene/scene_manager.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/tools/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/tools/packager.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ui/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ui/button.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ui/canvas.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/ui/text.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/fonts.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/logger.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/math_utils.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/object_pool.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/utils/profiler.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/__init__.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/bot_detect.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/config.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/notifications.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/plain.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/secrets.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/server.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/templates.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether/web/urls.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/dependency_links.txt +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/entry_points.txt +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/requires.txt +4 -4
- {aether_engine-1.7.1 → aether_engine-1.8.1}/aether_engine.egg-info/top_level.txt +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/examples/01_hello_cube.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/examples/02_sphere_scene.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/examples/03_first_person.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/examples/04_physics2d.py +0 -0
- {aether_engine-1.7.1 → aether_engine-1.8.1}/pyproject.toml +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
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.
|
|
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()
|
|
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 —
|
|
83
|
-
aether website —
|
|
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
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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="Краткая
|
|
134
|
-
sub.add_parser("docs", help="
|
|
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 игры")
|
|
@@ -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
|