Files
LNXSDK/leenkx/Sources/leenkx/logicnode/DrawCameraTextureNode.hx

80 lines
2.2 KiB
Haxe

package leenkx.logicnode;
import iron.Scene;
import iron.object.CameraObject;
import iron.math.Vec4;
import iron.math.Quat;
import leenkx.math.Helper;
import leenkx.renderpath.RenderPathCreator;
class DrawCameraTextureNode extends LogicNode {
var cam: CameraObject;
var rt: kha.Image;
public function new(tree: LogicTree) {
super(tree);
}
override function run(from: Int) {
switch (from) {
case 0: // Start
final o = inputs[3].get();
assert(Error, Std.isOfType(o, iron.object.MeshObject), "Object must be a mesh object!");
final mo = cast(o, iron.object.MeshObject);
final matSlot = inputs[4].get();
assert(Error, matSlot < o.materials.length, 'Object "${mo.name}" does not have a material slot with index $matSlot!');
assert(Error, matSlot >= 0, 'Material slot must not be negative. Current value: $matSlot.');
final c = inputs[2].get();
assert(Error, Std.isOfType(c, CameraObject), "Camera must be a camera object!");
cam = cast(c, CameraObject);
rt = kha.Image.createRenderTarget(iron.App.w(), iron.App.h(),
kha.graphics4.TextureFormat.RGBA32,
kha.graphics4.DepthStencilFormat.NoDepthAndStencil);
assert(Error, mo.materials[matSlot].contexts[0].textures != null, 'Object "${mo.name}" has no diffuse texture to render to');
final n = inputs[5].get();
for (i => node in mo.materials[matSlot].contexts[0].raw.bind_textures){
if (node.name == n){
mo.materials[matSlot].contexts[0].textures[i] = rt; // Override diffuse texture
break;
}
}
tree.notifyOnRender(render);
runOutput(0);
case 1: // Stop
tree.removeRender(render);
runOutput(1);
}
}
function render(g: kha.graphics4.Graphics) {
final sceneCam = iron.Scene.active.camera;
final oldRT = cam.renderTarget;
iron.Scene.active.camera = cam;
cam.renderTarget = rt;
#if kha_html5
var q: Quat = new Quat();
q.fromAxisAngle(new Vec4(0, 0, 1, 1), Helper.degToRad(180));
cam.transform.rot.mult(q);
cam.transform.buildMatrix();
#end
cam.renderFrame(g);
#if kha_html5
cam.transform.rot.mult(q);
cam.transform.buildMatrix();
#end
cam.renderTarget = oldRT;
iron.Scene.active.camera = sceneCam;
}
}