
بالنسبة لأولئك الموجودين في الخزان ، تعد wasm أو WebAssembly لغة برمجة منخفضة المستوى لآلة تكديس افتراضية ذات مرة مصممة كهدف تجميع محمول للغات عالية المستوى مثل C و C ++ و C # و Rust و Go. ببساطة ، يمكنك كتابة كود عالي الأداء وصغير الحجم ومحمول باستخدام wasm. يستخدم مخزن الأسلحة لدينا wasm أيضًا. بفضله ، يمكن تشغيل المحرك في المتصفح وعلى الأنظمة الأساسية الأخرى باستخدام Krom.
السمات في C و Rust
يستخدم Wasm أيضًا في السمات أو النصوص. للقيام بذلك ، سنكتب برنامج نصي لتدوير المكعب في C.
كود دوران المكعب
#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;
}
سيساعدنا تجميع الكود المصدري في لغة C على webassembly.studio . سننقل ملف wasm الناتج إلى المجلد blend_location / Bundled.
بعد ذلك ، دعنا ننشئ مكعبًا في الخلاط ، وانتقل إلى الخصائص - الكائن - سمات الأسلحة ، وقم بإنشاء سمات wasm جديدة ، وحدد ملف wasm الخاص بنا في الوحدات النمطية . اضغط على F5 وراقب المكعب وهو يدور. يمكن تنزيل مثال من هنا .

نفس الشيء ولكن فقط في الصدأ.
كود الصدأ
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 مباشرة من الخصائص المكتوبة بأسلوب haxe. لنبدأ بدالة C بسيطة.
#define WASM_EXPORT __attribute__((visibility("default")))
WASM_EXPORT
float test() {
return 0.01f;
}
نقوم بتجميع المصدر إلى webassembly.studio . ضع الملف الناتج في blend_location / Bundled.
اختبار الاتصال () من 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);
});
});
}
}
يمكن تنزيل الأمثلة من هنا .