
Bagi mereka yang berada dalam tank, wasm atau WebAssembly adalah bahasa pemrograman mesin stack virtual tingkat rendah yang pernah dirancang sebagai target kompilasi portabel untuk bahasa tingkat tinggi seperti C, C ++, C #, Rust, Go. Sederhananya, Anda dapat menulis kode berkinerja tinggi, ringkas, dan portabel menggunakan wasm. Gudang senjata kami juga menggunakan wasm. Berkat dia, mesin tersebut dapat berjalan di browser dan di platform lain menggunakan Krom.
Sifat di C dan Karat
Wasm juga digunakan dalam ciri atau skrip. Untuk melakukan ini, kita akan menulis skrip rotasi kubus di C.
Kode rotasi kubus
#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;
}
Mengkompilasi kode sumber di C akan membantu kita webassembly.studio . Kami akan memindahkan file wasm yang dihasilkan ke folder blend_location / Bundled.
Selanjutnya, mari kita buat kubus dalam blender, buka properti - Objek - Sifat Senjata, buat sifat wasm baru, pilih file wasm di modul . Tekan F5 dan lihat kubus berputar. Contoh dapat diunduh dari sini .

Hal yang sama tetapi hanya di Rust.
Kode karat
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;
}
Kami menyusun dan mentransfer ke Bundled .
Memanggil wasm dari Haxe
Wasm dapat dipanggil langsung dari properti yang ditulis dalam haxe. Mari kita mulai dengan fungsi C sederhana.
#define WASM_EXPORT __attribute__((visibility("default")))
WASM_EXPORT
float test() {
return 0.01f;
}
Kami mengkompilasi sumber ke webassembly.studio . Tempatkan file yang dihasilkan di blend_location / Bundled.
Tes panggilan () dari 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);
});
});
}
}
Contohnya dapat diunduh dari sini .