[Работа с 3D-графикой, Разработка игр, Игры и игровые приставки] Wasm в Armory Engine
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Для тех кто в танке - wasm или WebAssembly это язык программирования низкого уровня для виртуальной стековой машины раз разработанный как портативная цель компиляции для высокоуровневых языков, таких как Си, C++, C#, Rust, Go. Проще говоря вы можете писать высокопроизводительный, компактный и переносимый код используя wasm. Наш Armory тоже использует wasm. Благодаря ему движок может работать в браузере и на других платформах с использованием Krom.Traits на С и RustЕще wasm используется в traits или скриптах. Для этого мы напишем скрипт вращения куба на языке Си.Код вращения куба
#define WASM_EXPORT __attribute__((visibility("default")))
// Declare Armory API used in this module
// github.com/armory3d/armory/blob/master/Sources/armory/trait/internal/wasm_api.h
void notify_on_update(void* f);
int get_object(const char* name);
void set_transform(int object, float x, float y, float z,
float rx, float ry, float rz, float sx, float sy, float sz);
WASM_EXPORT
void update() {
static float rot = 0.0f;
rot += 0.01f;
set_transform(get_object("Cube"), 0, 0, 0, 0, 0, rot, 1, 1, 1); // Set cube rotation
}
// Include main function, Armory calls it when trait is instantiated
WASM_EXPORT
int main() {
notify_on_update(update); // Register callback
return 0;
}
Скомпилировать этот исходник на С нам поможет webassembly.studio. Получившийся wasm файл мы переместим папку blend_location/Bundled. Далее, создадим в blender куб, перейдем в properties - Object - Armory Traits, создадим новую wasm traits, в modules выберем наш wasm файл. Нажимаем F5 и смотрим как вращается куб. Пример можно скачать отсюда.
Тоже самое но только на Rust.Код на Rust
extern {
fn notify_on_update(f: extern fn() -> ()) -> ();
fn get_object(name: *const i8) -> i32;
fn set_transform(object: i32, x: f32, y: f32, z: f32, rx: f32, ry: f32, rz: f32, sx: f32, sy: f32, sz: f32) -> ();
}
#[no_mangle]
pub extern "C" fn update() -> () {
unsafe {
let name = std::ffi::CString::new("Cube").unwrap();
let object = get_object(name.as_ptr());
static mut rot: f32 = 0.1;
rot += 0.01;
set_transform(object, 0.0, 0.0, 0.0, 0.0, 0.0, rot, 1.0, 1.0, 1.0);
}
}
#[no_mangle]
pub extern "C" fn main() -> i32 {
unsafe {
notify_on_update(update);
}
return 0;
}
Компилируем и переносим в Bundled.Вызов wasm на Haxe Wasm можно вызвать прямо из properties написанного в haxe. Начнем с простой функции С.
#define WASM_EXPORT __attribute__((visibility("default")))
WASM_EXPORT
float test() {
return 0.01f;
}
Компилируем исходник в webassembly.studio. Полученный файл помещаем в blend_location/Bundled.Вызов test() из Haxe.
package arm;
import iron.data.*
class MyTrait extends iron.Trait {
public function new() {
super();
notifyOnInit(init);
}
function init() {
Data.getBlob("main.wasm", function(b:kha.Blob) { // Load wasm blob
var wasm = Wasm.instance(b); // Create wasm module
var rot = 0.0;
notifyOnUpdate(function() {
rot += wasm.exports.test(); // Call function from wasm module!
object.transform.setRotation(0, 0, rot);
});
});
}
}
Примеры можно скачать отсюда.
===========
Источник:
habr.com
===========
Похожие новости:
- [Игры и игровые приставки] В клиенте Steam вышла из беты поддержка контроллера PlayStation 5
- [Работа с 3D-графикой, CAD/CAM, Управление проектами] Цифровизация управления проектами
- [Работа с 3D-графикой, Разработка игр, Игры и игровые приставки] Основы Armory. Traits
- [Гаджеты, Компьютерное железо, Настольные компьютеры, Игры и игровые приставки] Razer выпустила обещанный в 2014 году модульный геймерский мини-ПК за $3200, и он не очень-то модульный
- [Работа с 3D-графикой, Разработка под AR и VR, AR и VR] Google закроет сервис публикаций 3D-моделей Poly
- [Программирование, Разработка игр, Unity] Реактивное программирование для разработчиков игр: Введение (перевод)
- [Программирование, C++, Работа с 3D-графикой, Разработка игр, CGI (графика)] Vulkan. Руководство разработчика. Рисуем треугольник (перевод)
- [Математика, Игры и игровые приставки] В национальной лотерее ЮАР выпали цифры 5, 6, 7, 8, 9 и 10. Регулятор начал расследование
- [Программирование, Разработка игр, Unity] Представляем Owlcat Mono Profiler для Unity
- [Разработка игр, Компьютерное железо, Старое железо] Яндекс вновь запустил голосование за ретроигры. Финалисты Retro Games Battle 2020
Теги для поиска: #_rabota_s_3dgrafikoj (Работа с 3D-графикой), #_razrabotka_igr (Разработка игр), #_igry_i_igrovye_pristavki (Игры и игровые приставки), #_armory_engine, #_blender, #_haxe, #_webassembly, #_rust, #_rabota_s_3dgrafikoj (
Работа с 3D-графикой
), #_razrabotka_igr (
Разработка игр
), #_igry_i_igrovye_pristavki (
Игры и игровые приставки
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 24-Ноя 20:21
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Для тех кто в танке - wasm или WebAssembly это язык программирования низкого уровня для виртуальной стековой машины раз разработанный как портативная цель компиляции для высокоуровневых языков, таких как Си, C++, C#, Rust, Go. Проще говоря вы можете писать высокопроизводительный, компактный и переносимый код используя wasm. Наш Armory тоже использует wasm. Благодаря ему движок может работать в браузере и на других платформах с использованием Krom.Traits на С и RustЕще wasm используется в traits или скриптах. Для этого мы напишем скрипт вращения куба на языке Си.Код вращения куба #define WASM_EXPORT __attribute__((visibility("default")))
// Declare Armory API used in this module // github.com/armory3d/armory/blob/master/Sources/armory/trait/internal/wasm_api.h void notify_on_update(void* f); int get_object(const char* name); void set_transform(int object, float x, float y, float z, float rx, float ry, float rz, float sx, float sy, float sz); WASM_EXPORT void update() { static float rot = 0.0f; rot += 0.01f; set_transform(get_object("Cube"), 0, 0, 0, 0, 0, rot, 1, 1, 1); // Set cube rotation } // Include main function, Armory calls it when trait is instantiated WASM_EXPORT int main() { notify_on_update(update); // Register callback return 0; } Тоже самое но только на Rust.Код на Rust extern {
fn notify_on_update(f: extern fn() -> ()) -> (); fn get_object(name: *const i8) -> i32; fn set_transform(object: i32, x: f32, y: f32, z: f32, rx: f32, ry: f32, rz: f32, sx: f32, sy: f32, sz: f32) -> (); } #[no_mangle] pub extern "C" fn update() -> () { unsafe { let name = std::ffi::CString::new("Cube").unwrap(); let object = get_object(name.as_ptr()); static mut rot: f32 = 0.1; rot += 0.01; set_transform(object, 0.0, 0.0, 0.0, 0.0, 0.0, rot, 1.0, 1.0, 1.0); } } #[no_mangle] pub extern "C" fn main() -> i32 { unsafe { notify_on_update(update); } return 0; } #define WASM_EXPORT __attribute__((visibility("default")))
WASM_EXPORT float test() { return 0.01f; } package arm;
import iron.data.* class MyTrait extends iron.Trait { public function new() { super(); notifyOnInit(init); } function init() { Data.getBlob("main.wasm", function(b:kha.Blob) { // Load wasm blob var wasm = Wasm.instance(b); // Create wasm module var rot = 0.0; notifyOnUpdate(function() { rot += wasm.exports.test(); // Call function from wasm module! object.transform.setRotation(0, 0, rot); }); }); } } =========== Источник: habr.com =========== Похожие новости:
Работа с 3D-графикой ), #_razrabotka_igr ( Разработка игр ), #_igry_i_igrovye_pristavki ( Игры и игровые приставки ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 24-Ноя 20:21
Часовой пояс: UTC + 5