
Für diejenigen im Tank ist wasm oder WebAssembly eine einfache Programmiersprache für eine virtuelle Stapelmaschine, die einst als tragbares Kompilierungsziel für höhere Sprachen wie C, C ++, C #, Rust, Go entwickelt wurde. Einfach ausgedrückt, können Sie mit wasm leistungsstarken, kompakten und portablen Code schreiben. Unsere Waffenkammer benutzt auch Wasm. Dank ihm kann die Engine mit Krom im Browser und auf anderen Plattformen ausgeführt werden.
Eigenschaften in C und Rust
Wasm wird auch in Merkmalen oder Skripten verwendet. Dazu schreiben wir ein Cube-Rotationsskript in C.
Würfelrotationscode
#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;
}
Das Kompilieren des Quellcodes in C hilft uns bei webassembly.studio . Wir werden die resultierende wasm-Datei in den Ordner blend_location / Bundled verschieben.
Als nächstes erstellen wir einen Würfel in Blender, gehen zu Eigenschaften - Objekt - Waffenkammermerkmale, erstellen neue Wasm-Merkmale und wählen unsere Wasm-Datei in Modulen aus . Drücken Sie F5 und beobachten Sie, wie sich der Würfel dreht. Ein Beispiel kann hier heruntergeladen werden .

Das gleiche, aber nur in Rust.
Rostcode
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;
}
Wir kompilieren und übertragen auf Bundled .
Wasm von Haxe anrufen
Wasm kann direkt von in haxe geschriebenen Eigenschaften aufgerufen werden. Beginnen wir mit einer einfachen C-Funktion.
#define WASM_EXPORT __attribute__((visibility("default")))
WASM_EXPORT
float test() {
return 0.01f;
}
Wir kompilieren die Quelle zu webassembly.studio . Platzieren Sie die resultierende Datei in blend_location / Bundled.
Aufruf von test () von 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);
});
});
}
}
Beispiele können hier heruntergeladen werden .