armory/Sources/armory/trait/internal/WasmScript.hx
E1e5en ef4dbd7611 LN for Traits
1. Modification of CanvasScript and WasmScript classes: added a field to save the name of the script / file in the class.
2. Added logical nodes for working with Traits.
- Get Object Traits - gets an array of Traits for the specified object;
- Get Trait Name - get the Trait name (the name that appears in the list in Armory Traits) and its type (Canvas, Wasm, Bundle, LogicNode or Haxe).
2020-10-24 22:04:47 +03:00

92 lines
3.1 KiB
Haxe

package armory.trait.internal;
#if js
import iron.data.Data;
import iron.data.Wasm;
import iron.system.Input;
import iron.system.Time;
class WasmScript extends iron.Trait {
var wasm: Wasm;
public var wasmName: String;
var objectMap: Map<Int, iron.object.Object> = new Map();
public function new(handle: String) {
super();
wasmName = handle;
// Armory API exposed to WebAssembly
// TODO: static
/*static*/ var imports = {
env: {
trace: function(i: Int) { trace(wasm.getString(i)); },
tracef: function(f: Float) { trace(f); },
tracei: function(i: Int) { trace(i); },
notify_on_update: function(i: Int) { notifyOnUpdate(wasm.exports.update); },
remove_update: function(i: Int) { removeUpdate(wasm.exports.update); },
get_object: function(name: Int) {
var s = wasm.getString(name);
var o = iron.Scene.active.getChild(s);
if (o == null) return -1;
objectMap.set(o.uid, o);
return o.uid;
},
set_transform: function(object: Int, x: Float, y: Float, z: Float, rx: Float, ry: Float, rz: Float, sx: Float, sy: Float, sz: Float) {
var o = objectMap.get(object);
if (o == null) return;
var t = o.transform;
t.loc.set(x, y, z);
t.scale.set(sx, sy, sz);
t.setRotation(rx, ry, rz);
},
set_location: function(object: Int, x: Float, y: Float, z: Float) {
var o = objectMap.get(object);
if (o == null) return;
var t = o.transform;
t.loc.set(x, y, z);
},
set_scale: function(object: Int, x: Float, y: Float, z: Float) {
var o = objectMap.get(object);
if (o == null) return;
var t = o.transform;
t.scale.set(x, y, z);
},
set_rotation: function(object: Int, x: Float, y: Float, z: Float) {
var o = objectMap.get(object);
if (o == null) return;
var t = o.transform;
t.setRotation(x, y, z);
},
mouse_x: function() { return Input.getMouse().x; },
mouse_y: function() { return Input.getMouse().y; },
mouse_started: function(button: Int) { return Input.getMouse().started(); },
mouse_down: function(button: Int) { return Input.getMouse().down(); },
mouse_released: function(button: Int) { return Input.getMouse().released(); },
key_started: function(key: Int) { return Input.getKeyboard().started(Keyboard.keyCode(cast key)); },
key_down: function(key: Int) { return Input.getKeyboard().down(Keyboard.keyCode(cast key)); },
key_released: function(key: Int) { return Input.getKeyboard().released(Keyboard.keyCode(cast key)); },
time_real: function() { return Time.time(); },
time_delta: function() { return Time.delta; },
js_eval: function(fn: Int) { js.Lib.eval(wasm.getString(fn)); },
js_call_object: function(object: Int, fn: Int) { Reflect.callMethod(objectMap.get(object), Reflect.field(objectMap.get(object), wasm.getString(fn)), null); },
js_call_static: function(path: Int, fn: Int) { var cpath = wasm.getString(path); var ctype = Type.resolveClass(cpath); Reflect.callMethod(ctype, Reflect.field(ctype, wasm.getString(fn)), []); },
},
};
Data.getBlob(handle + ".wasm", function(b: kha.Blob) {
wasm = Wasm.instance(b, imports);
wasm.exports.main();
});
}
}
#end