forked from LeenkxTeam/LNXSDK
80 lines
2.2 KiB
Haxe
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;
|
|
}
|
|
}
|