Редактор сцен
Вкладка «3D-сцена» в редакторе и `lecodes scene` локально: дерево, инспектор, гизмо, материалы. Правки пишутся прямо в `.scene.ts`, а правки из IDE подхватываются на лету — редактор и код не спорят, кто главный.
3D на Filament, физика Jolt и Box2D, скелетная анимация с IK, навмеш, частицы, ландшафт, 2D-движок и AR — всё в рантайме на C++, а не в браузерной обёртке. Один бандл запускается на телефонах, компьютерах, в VR-шлеме и в вебе.
Metallic-roughness материалы, окружение IBL из KTX, солнце с тенями, скайбокс, туман по высоте, bloom и тонмаппинг — ACES, filmic или neutral. Статику уровня lecodes lightmap запекает в лайтмапы, динамика живёт поверх в реальном времени.
Материалы .mat на языке Filament компилируются локально командой lecodes shaders и подхватываются Material.load на всех целях. Обновил движок — lecodes shaders update перекомпилировал всё за тебя.
Ландшафт, растительность, инстансинг для тысяч одинаковых объектов, декали, система частиц с лентами и mesh-частицами, шум для процедурного контента. Всё это — классы SDK, а не плагины со стороны.
Тела и формы, триггеры, события контактов, рейкасты и зонд земли, рэгдоллы, контроллер персонажа поверх CharacterVirtual и машины с колёсами. Одна и та же симуляция на всех хостах, включая headless-прогон — физика в тесте настоящая, а не заглушка.
Клипы, слои и смешивание, IK, root motion, локомоция, постановка ног на неровности и динамические кости для хвостов и плащей. Модели из Mixamo, Unity и Unreal переносятся конвейером ассетов, включая ретаргет на другой скелет.
Навмеш на Recast/Detour: lecodes navmesh запекает, агенты ходят по нему в рантайме. Один Input для клавиатуры, мыши, тача и геймпада — кнопка геймпада это просто клавиша. Позиционный звук: источники и зоны, привязанные к узлам сцены.
Спрайты, спрайт-листы и покадровая анимация, слои с сортировкой по Y для псевдо-3D, своя камера с зумом и слежением. Клик или тап по сцене отдаёт объект, в который попал.
Тайлмапы и тайлсеты с автотайлингом: рисуешь область — движок сам подбирает края и углы. Карта — такой же узел сцены, как и всё остальное.
Тела, формы, триггеры, контроллер 2D-персонажа и односторонние платформы для платформеров. Столкновения приходят событиями на узел. Узлы, аспекты и игровой цикл устроены так же, как в 3D.
ARScene — та же сцена, только с якорями в реальном мире: модель ставится на стол или привязывается к картинке, жесты управления добавляются одной строкой. Работает в приложении le.codes на iOS и Android.
HUD, меню и экраны — на flexbox-раскладке Yoga в том же файле, что и сцена. Сигналы обновляют текст без перерисовки, списки виртуализированы нативно. Второй проект для интерфейса не нужен.
В headless-прогоне setLoop, физика и аспекты идут фиксированным шагом 1/60 от сценария, а не от часов: тест, прошедший однажды, проходит всегда. Упавший шаг сохраняет JSON и PNG кадра — красный шаг объясняет себя сам.
Сцена, свет, тени, физика и управление — один файл. Ни импортов, ни node_modules: весь SDK доступен как глобалы, а в бандл попадает только то, на что проект ссылается. Поведение узла — Aspect, логика всей сцены — System; никаких пустых узлов с циклом и рукописных tick(), а имя аксессора выводит компилятор: Aspect<'health', …> становится node.health.
const scene = new Scene({ skybox: '#202030', bloom: true })
const ground = Mesh.plane({ material: Material.lit({ color: '#333' }), normal: [0, 1, 0], scale: 20 })
.aspect(Shape, { box: [10, 0.1, 10] })
.aspect(Physics, { motion: 'static' })
const crate = Mesh.box({ material: Material.lit({ color: '#e33' }), position: [0, 4, 0] })
.aspect(Shape, {}) // форма подбирается по мешу
.aspect(Physics, { mass: 2 }) // динамическое тело по умолчанию
crate.addEventListener('enter', other => console.log('удар:', other.name))
scene.add(Light.sun({ shadowsQuality: 2 }), ground, crate)
scene.camera.position = [0, 3, 6]
scene.open()
setLoop(() => {
if (Input.key('Space')) crate.physics.applyImpulse([0, 6, 0])
})2D-сцена — тем же языком:
const scene = new Scene2D({ background: '#10131a' })
scene.layer(1).ySort() // слой 1 сортируется по Y
const load = async () => {
const tex = await Texture2D.load(asset('./hero.png'))
scene.add(new Sprite({ texture: tex, anchor: [0.5, 1], layer: 1 }))
}
load()
scene.addEventListener('click', ev => {
console.log('тап по', ev.target?.id ?? 'пустому месту', ev.worldX, ev.worldY)
})
scene.open()Оба примера собираются командой lecodes compile меньше чем за секунду в один app.js, который одинаково исполняется на всех платформах.
Сцена, ассеты и тесты — в терминале и в редакторе, без сторонних программ.
Вкладка «3D-сцена» в редакторе и `lecodes scene` локально: дерево, инспектор, гизмо, материалы. Правки пишутся прямо в `.scene.ts`, а правки из IDE подхватываются на лету — редактор и код не спорят, кто главный.
FBX → GLB с текстурами внутри, `doctor` для GLB (лимит костей, KTX2, масштаб), ретаргет анимаций с другого скелета — в том числе Mixamo, `.anim` из Unity и чтение `.uasset` из Unreal. Всё это — `lecodes assets`.
`lecodes render` и `lecodes test` гоняют настоящий бандл с настоящей физикой без устройства и браузера. 3D в headless приходит как JSON, за пикселями — `--desktop` через нативный хост.
Модули отключаемые — не подключил 3D, и он не попал в бандл. Приложение без сцены весит около 2 МБ, с 3D и физикой — около 6.
Движок — это набор нативных библиотек на C++, к которым JavaScript-код приложения обращается через узкий мост. Скрипты исполняет QuickJS, а раскладку, отрисовку, физику и анимацию делает натив — поэтому 60 кадров в секунду не зависят от скорости JS.
| Подсистема | Библиотека | Что делает |
|---|---|---|
| 3D-рендер | Filament | PBR, IBL, тени, bloom, лайтмапы, KTX2 |
| 3D-физика | Jolt | тела, персонажи, машины, рэгдоллы, события |
| Анимация | creator-anim | клипы, слои, IK, root motion, динамические кости |
| Частицы | creator-particles | эмиттеры, кривые, ленты, mesh-частицы |
| Навигация | Recast / Detour | навмеш и агенты |
| 2D | sokol + Box2D | спрайты, тайлмапы, 2D-физика |
| Интерфейс | Yoga | flexbox-раскладка, отрисовка хостом |
Компилятор chisel на Rust собирает проект в один app.js и вырезает всё неиспользуемое вплоть до отдельных методов классов. Заголовок бандла говорит хосту, какие движки поднимать: приложение без 3D не грузит Filament вообще. Подробное инженерное описание — на странице Состав и архитектура.
| Платформа | Графика | Хост |
|---|---|---|
| iOS, macOS | Metal | Swift, одна кодовая база на оба |
| Android | OpenGL ES | Kotlin + нативное ядро; отдельная сборка для Quest под OpenXR |
| Windows, Linux, Astra Linux | Vulkan или OpenGL | C++ хост, один процесс, ~11 МБ на диске |
| Web | WebGL 2 | полный хост на wasm или лёгкий на ~31 КБ без wasm |
| Headless | — | Bun: настоящая физика, 3D как JSON — для тестов и ИИ-агентов |
Честно о границах: AR работает только в приложении, не в вебе; лёгкий веб-хост не умеет 2D; headless не растеризует 3D. Новые возможности движка — анимация v2, 2D-физика, машины, ландшафт, лайтмапы — появляются сначала на десктопе и затем доходят до мобильных хостов; паритет платформ проверяется автоматической матрицей по каждому члену API.
Ассистент платформы знает движок по той же документации, что и вы: он пишет сцены, физику и аспекты этим же API и видит результат своего кода через headless-рендер. Но движок не требует ассистента — это обычный TypeScript в вашей папке, и lecodes compile собирает его без сервера и аккаунта.
Редактор, движок и сборка бесплатные. Подпишитесь на наш Telegram и введите промокод tg_sub26 при первом пополнении: скидка 50% и 2 500 кредитов в подарок.
Открыть редакторИгра, приложение с 3D, встраивание движка в свой продукт или вопрос по возможностям — напишите, и мы ответим на указанный email.