Metadata-Version: 2.4
Name: aether-engine
Version: 1.0.3
Summary: Полноценный 3D игровой движок на Python с OpenGL
Home-page: https://pypi.org/project/aether-engine/
Author: entiti937
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Topic :: Games/Entertainment
Classifier: Topic :: Multimedia :: Graphics :: 3D Rendering
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/plain
License-File: LICENSE
Requires-Dist: numpy>=1.24
Requires-Dist: glfw>=2.6
Requires-Dist: PyOpenGL>=3.1.7
Requires-Dist: Pillow>=10.0
Provides-Extra: audio
Requires-Dist: pygame-ce>=2.5; extra == "audio"
Provides-Extra: physics
Requires-Dist: pymunk>=6.0; extra == "physics"
Provides-Extra: imgui
Provides-Extra: full
Requires-Dist: pymunk>=6.0; extra == "full"
Requires-Dist: freetype-py>=2.4; extra == "full"
Requires-Dist: pyyaml>=6.0; extra == "full"
Requires-Dist: imageio>=2.31; extra == "full"
Requires-Dist: trimesh>=3.21; extra == "full"
Requires-Dist: pygame-ce>=2.5; extra == "full"
Requires-Dist: noise>=1.2; extra == "full"
Dynamic: author
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

AETHER ENGINE
============

Полноценный 3D игровой движок на Python с OpenGL 4.6
Автор: entiti937 | Версия: 1.0.2 | Лицензия: MIT
PyPI: https://pypi.org/project/aether-engine/


УСТАНОВКА
--------

Базовая:
    pip install aether-engine

С аудио:
    pip install aether-engine[audio]

С физикой:
    pip install aether-engine[physics]

Полная:
    pip install aether-engine[full]


БЫСТРЫЙ СТАРТ
-------------

Создайте файл main.py:

    from aether.core.engine import Engine
    from aether.scene.scene import Scene
    from aether.scene.entity import Entity
    from aether.scene.component import Transform, MeshRenderer
    from aether.graphics.mesh_factory import MeshFactory
    from aether.graphics.material import Material
    from aether.graphics.camera import Camera

    engine = Engine(1280, 720, "Моя игра")
    scene = Scene("MainScene")
    camera = Camera(position=(0, 2, 8))
    scene.set_main_camera(camera)

    cube = Entity("Player")
    cube.add_component(Transform(position=(0, 1, 0)))
    cube.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=Material()))
    scene.spawn(cube)

    engine.load_scene(scene)
    engine.run()

Запустите:
    python main.py

Управление: WASD - движение, мышь - поворот, ESC - выход.


СОЗДАНИЕ ОКНА И СЦЕНЫ
---------------------

Настройка движка:
    from aether.core.engine import Engine
    from aether.core.config import EngineConfig

    config = EngineConfig()
    config.app_name = "Моя RPG"
    config.graphics.width = 1920
    config.graphics.height = 1080
    engine = Engine(config=config)

    # Или просто
    engine = Engine(1280, 720, "Моя игра")

Работа со сценами:
    from aether.scene.scene import Scene
    from aether.scene.scene_manager import SceneManager

    menu = Scene("Menu")
    game = Scene("Game")
    manager = SceneManager()
    manager.register_scene(menu)
    manager.register_scene(game)
    manager.load_scene("Game")
    manager.transition_to("Menu", transition_time=1.0)


ENTITY И КОМПОНЕНТЫ
-------------------

Создание объекта:
    from aether.scene.entity import Entity
    from aether.scene.component import Transform, MeshRenderer, RigidbodyComponent

    player = Entity("Player", tag="player")
    player.add_component(Transform(position=(0, 2, 0), rotation=(0, 45, 0), scale=(1, 1, 1)))
    player.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=Material()))
    player.add_component(RigidbodyComponent(mass=75.0, use_gravity=True))
    scene.spawn(player)

Доступ к компонентам:
    transform = player.get_component("Transform")
    transform.translate(0, 0, 1)
    transform.rotate(0, 10, 0)

    mesh = player.get_component("MeshRenderer")
    mesh.visible = False

Свой компонент:
    from aether.scene.component import Component

    class HealthComponent(Component):
        def __init__(self, max_hp=100):
            super().__init__()
            self.max_hp = max_hp
            self.hp = max_hp

        def update(self, dt):
            if self.hp <= 0:
                print(f"{self.entity.name} died!")

        def take_damage(self, amount):
            self.hp -= amount

    player.add_component(HealthComponent(100))


КАМЕРА
------

    from aether.graphics.camera import Camera

    camera = Camera(position=(0, 5, 15), yaw=-90, pitch=-20, fov=60)
    scene.set_main_camera(camera)
    camera.move_forward(dt)
    camera.move_left(dt)
    camera.rotate(dx, dy)


ОСВЕЩЕНИЕ
---------

    from aether.graphics.light import DirectionalLight, PointLight, SpotLight

    sun = DirectionalLight(direction=(0.5, -1, 0.3), color=(1.0, 0.95, 0.8), intensity=1.5)
    lamp = PointLight(position=(0, 3, 0), color=(1.0, 0.8, 0.6), intensity=2.0, range=15.0)
    flashlight = SpotLight(position=(0, 2, 0), direction=(0, 0, -1), intensity=3.0)


МАТЕРИАЛЫ И ТЕКСТУРЫ
--------------------

    from aether.graphics.material import Material
    from aether.graphics.texture import Texture

    mat = Material("Metal")
    mat.albedo = (0.8, 0.2, 0.2)
    mat.metallic = 1.0
    mat.roughness = 0.3
    mat.albedo_map = Texture("textures/rust.png")
    mat.normal_map = Texture("textures/rust_normal.png")


ФИЗИКА
------

Встроенная (AABB):
    from aether.physics.collider import BoxCollider, SphereCollider
    from aether.scene.component import RigidbodyComponent

    body = RigidbodyComponent(mass=10.0, use_gravity=True)
    entity.add_component(body)
    entity.add_component(BoxCollider(size=(1, 1, 1)))
    body.add_force((0, 100, 0))
    body.add_impulse((0, 0, 50))

Raycast:
    from aether.physics.raycast import Ray, raycast

    ray = Ray(origin=(0, 10, 0), direction=(0, -1, 0))
    hit = physics_world.raycast(ray.origin, ray.direction)
    if hit.hit:
        print(f"Попадание в {hit.entity.name}")

PyBullet (опционально):
    from aether.physics.bullet_backend import BulletPhysicsBackend

    bullet = BulletPhysicsBackend()
    bullet.initialize(gravity=(0, -9.81, 0))
    body_id = bullet.create_rigid_body("my_entity", mass=1.0, shape_type="box", dimensions=(1,1,1), position=(0,5,0))
    bullet.step(dt)


СИСТЕМА ЧАСТИЦ
--------------

    from aether.graphics.particle_system import ParticleEmitter

    fire = ParticleEmitter(max_particles=1000)
    fire.position = (0, 1, 0)
    fire.emission_rate = 200
    fire.start_color = (1.0, 0.5, 0.0, 1.0)
    fire.end_color = (1.0, 0.0, 0.0, 0.0)
    fire.velocity = (0, 3, 0)

    fire.update(dt)
    fire.render(view, projection)


ТЕРРАЙН
-------

    from aether.graphics.terrain import Terrain

    terrain = Terrain(width=512, depth=512, max_height=100)
    terrain.generate_height_map(seed=42, octaves=6)
    terrain.generate_chunks()
    height = terrain.get_height(world_x, world_z)
    terrain.render(view, projection, camera_position)


ВОДА
----

    from aether.graphics.water import WaterBody

    water = WaterBody(size=100, resolution=256, position=(0, 0, 0))
    water.wave_speed = 1.5
    water.water_color = (0.0, 0.3, 0.6)
    water.update(dt)
    water.render(view, projection, camera_position)


НЕБО И АТМОСФЕРА
----------------

    from aether.graphics.sky_atmosphere import SkyDome

    sky = SkyDome(radius=500)
    sky.set_time_of_day(12.0)  # Полдень
    sky.render(view, projection)


ОКРУЖЕНИЕ
---------

    from aether.environment.environment_system import EnvironmentSystem, Weather, Season

    env = EnvironmentSystem()
    env.set_weather(Weather.RAIN)
    env.set_time(18, 30, 0)
    env.set_season(Season.WINTER)
    env.update(dt)


AI И НАВИГАЦИЯ
--------------

Деревья поведения:
    from aether.ai.behavior_tree import BehaviorTree, Sequence, Selector, IsEnemyNearby, AttackTarget

    bt = BehaviorTree()
    root = Selector("Root")
    attack = Sequence("Attack")
    attack.add_child(IsEnemyNearby(radius=5.0))
    attack.add_child(AttackTarget(damage=10.0))
    root.add_child(attack)
    bt.set_root(root)
    bt.set_context("entity", enemy)
    bt.set_context("target", player)
    bt.tick()

NavMesh:
    from aether.ai.navmesh import NavMeshBuilder

    navmesh = NavMeshBuilder.build_from_grid(origin=(0,0,0), size_x=100, size_z=100, cell_size=1.0)
    path = navmesh.find_path(start_pos, end_pos)
    smoothed = navmesh.smooth_path(path)


АУДИО
-----

    from aether.audio.audio_manager import AudioManager

    audio = AudioManager()
    audio.load_sound("explosion", "sounds/explosion.wav")
    audio.play_sound("explosion", volume=0.8)
    audio.play_music("music/background.mp3", loop=True)
    audio.set_master_volume(0.7)


UI
--

    from aether.ui.canvas import Canvas
    from aether.ui.button import Button, Panel, Label

    canvas = Canvas(1920, 1080)

    def on_click():
        print("Нажали!")

    btn = Button("Начать игру", x=100, y=100, width=200, height=50, callback=on_click)
    panel = Panel(x=50, y=50, width=400, height=300)
    panel.title = "Инвентарь"
    canvas.add(panel)
    canvas.add(btn)
    canvas.update(dt, mouse_x, mouse_y, mouse_pressed, mouse_just_pressed)
    canvas.render()


СЕТЬ
----

Сервер:
    from aether.network.network_manager import NetworkServer

    server = NetworkServer(max_clients=32)
    server.start(host="0.0.0.0", port=7777)

Клиент:
    from aether.network.network_manager import NetworkClient

    client = NetworkClient("Player1")
    client.connect("127.0.0.1", 7777)
    client.send(NetworkMessage("chat", {"text": "Привет!"}))


СОХРАНЕНИЯ
----------

    from aether.core.save_system import SaveSystem, SaveData

    save_system = SaveSystem()
    data = SaveData("save_01")
    data.set_custom("health", 85)
    save_system.save(slot_id=0, save_data=data)
    loaded = save_system.load(slot_id=0)


ДОСТИЖЕНИЯ
----------

    from aether.core.achievement_system import AchievementSystem

    achievements = AchievementSystem()
    achievements.register_achievement("first_kill", "Первая кровь", points=10)
    achievements.increment_stat("kills")


КОНСОЛЬ РАЗРАБОТЧИКА
--------------------

    from aether.core.console import Console

    console = Console()
    console.register_command("spawn", spawn_enemy)
    console.register_variable("g_difficulty", 2, "Сложность", 1, 5)
    console.execute("spawn 5")


РЕДАКТОР (ImGui)
----------------

    from aether.editor.imgui_integration import ImGuiManager, EditorLayout, HierarchyPanel, InspectorPanel

    imgui = ImGuiManager()
    imgui.initialize(window, 1920, 1080)
    editor = EditorLayout()
    editor.add_panel(HierarchyPanel())
    editor.add_panel(InspectorPanel())

    # В игровом цикле:
    imgui.begin_frame()
    editor.render(scene, console, profiler)
    imgui.end_frame()


STEAM API
---------

    from aether.platform.steam_api import SteamAPI

    steam = SteamAPI()
    steam.initialize(app_id=1234567)
    steam.set_achievement("ACH_WIN_ONE_GAME")
    steam.cloud_save("save.sav", data)


СТРУКТУРА ДВИЖКА
----------------

aether/
  core/           - Ядро (Engine, Config, Input, Time, Console, SaveSystem)
  graphics/       - Графика (Renderer, Shader, Mesh, Camera, Light, Water, Sky, Terrain, Particles)
  scene/          - Сцена (Entity, Component, Scene, SceneGraph, SceneManager)
  physics/        - Физика (PhysicsWorld, Collider, Rigidbody, Raycast, BulletBackend)
  ai/             - AI (NavMesh, BehaviorTree)
  network/        - Сеть (Client, Server)
  audio/          - Аудио (AudioManager, Sound, Music)
  ui/             - UI (Canvas, Button, Panel, Label, Font)
  editor/         - Редактор (ImGui, Gizmo, DebugDraw)
  environment/    - Окружение (TimeOfDay, Weather, Seasons)
  resources/      - Ресурсы (ResourceManager, AssetDatabase, OBJ Loader, Texture Loader)
  platform/       - Платформа (SteamAPI)
  animation/      - Анимация (Skeleton, AnimationClip, Animator)
  assets/         - Ассеты (AssetPipeline)
  utils/          - Утилиты (Math, Logger, Profiler, ObjectPool)


ЗАВИСИМОСТИ
-----------

Базовая установка (обязательно):
    numpy>=1.24, glfw>=2.6, PyOpenGL>=3.1.7, Pillow>=10.0

Аудио (опционально):
    pygame>=2.5 (Python 3.10-3.12) или pygame-ce (Python 3.13+)

Физика (опционально):
    PyBullet>=3.2.5 (требует Visual Studio Build Tools)
    pymunk>=6.0 (альтернатива, не требует компиляции)

Полная установка:
    Все выше + freetype-py, imgui, noise, pyyaml, imageio

Примечание по версиям Python:
    Python 3.10-3.12: все пакеты доступны
    Python 3.13+: используйте pygame-ce вместо pygame
    Python 3.14+: PyBullet может не собраться, используйте pymunk


СИСТЕМНЫЕ ТРЕБОВАНИЯ
--------------------

    Python 3.10+
    OpenGL 4.6
    Windows 10+ / Linux / macOS
    Видеокарта с поддержкой OpenGL 4.6
    4 GB RAM минимум


ЛИЦЕНЗИЯ
--------

MIT License. Используйте свободно в любых проектах.


Автор: entiti937
Версия: 1.0.3 - Исправления установки библеотек на разные версии пайтон
