forked from LeenkxTeam/Leenkx_Examples
update
This commit is contained in:
79
ui_script3d/Sources/lnx/UITrait.hx
Normal file
79
ui_script3d/Sources/lnx/UITrait.hx
Normal file
@ -0,0 +1,79 @@
|
||||
package lnx;
|
||||
|
||||
import iron.object.Object;
|
||||
import iron.system.Input;
|
||||
import zui.*;
|
||||
|
||||
class UITrait extends iron.Trait {
|
||||
|
||||
var ui:Zui;
|
||||
var rt:kha.Image; // Render target for UI
|
||||
var uiWidth = 512;
|
||||
var uiHeight = 512;
|
||||
var gate:Object;
|
||||
var opened = false;
|
||||
|
||||
public function new() {
|
||||
super();
|
||||
|
||||
// Load font for UI labels
|
||||
iron.data.Data.getFont("font_default.ttf", function(f:kha.Font) {
|
||||
ui = new Zui({font: f, autoNotifyInput: false});
|
||||
iron.Scene.active.notifyOnInit(sceneInit);
|
||||
});
|
||||
}
|
||||
|
||||
function sceneInit() {
|
||||
// Reference to gate object
|
||||
gate = iron.Scene.active.getChild('Gate');
|
||||
gate.animation.pause();
|
||||
|
||||
rt = kha.Image.createRenderTarget(uiWidth, uiHeight);
|
||||
|
||||
// We will use empty texture slot in attached material to render UI
|
||||
var mat:iron.data.MaterialData = cast(object, iron.object.MeshObject).materials[0];
|
||||
mat.contexts[0].textures[0] = rt; // Override diffuse texture
|
||||
|
||||
notifyOnRender(render);
|
||||
notifyOnUpdate(update);
|
||||
}
|
||||
|
||||
function render(g:kha.graphics4.Graphics) {
|
||||
// Begin drawing UI
|
||||
ui.begin(rt.g2);
|
||||
// Make new window
|
||||
if (ui.window(Id.handle(), 0, 0, uiWidth, uiHeight, true)) {
|
||||
// Gate controll buttons
|
||||
if (ui.button("Open") && !opened) {
|
||||
// Gate object is animated in Blender
|
||||
// Play GateOpen animation
|
||||
gate.animation.play('GateOpen', function() { gate.animation.pause(); });
|
||||
opened = true;
|
||||
}
|
||||
if (ui.button("Close") && opened) {
|
||||
// And close..
|
||||
gate.animation.play('GateClose', function() { gate.animation.pause(); });
|
||||
opened = false;
|
||||
}
|
||||
}
|
||||
ui.end();
|
||||
}
|
||||
|
||||
function update() {
|
||||
// Get plane UV
|
||||
var mouse = Input.getMouse();
|
||||
var uv = iron.math.RayCaster.boxIntersect(cast object.transform, mouse.x, mouse.y, iron.Scene.active.camera);
|
||||
if (uv == null) return;
|
||||
|
||||
// Pixel coords
|
||||
var d1 = object.transform.dim;
|
||||
var px = Std.int(((uv.x-(-d1.x/2)) / ((d1.x/2)-(-d1.x/2)) - object.transform.worldx()) * uiWidth);
|
||||
var py = Std.int(((uv.z-(d1.z/2)) / ((d1.z/2)-(-d1.z/2)) - object.transform.worldz()) * -uiHeight) ;
|
||||
|
||||
|
||||
// Send input events
|
||||
if (mouse.started()) ui.onMouseDown(0, px, py);
|
||||
else if (mouse.released()) ui.onMouseUp(0, px, py);
|
||||
if (mouse.movementX != 0 || mouse.movementY != 0) ui.onMouseMove(px, py, 0, 0);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user