Skip to content

Commit

Permalink
Improve light probe
Browse files Browse the repository at this point in the history
  • Loading branch information
luboslenco committed Jan 15, 2019
1 parent 5251387 commit 32c4202
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 21 deletions.
3 changes: 3 additions & 0 deletions Sources/iron/RenderPath.hx
Expand Up @@ -21,6 +21,7 @@ class RenderPath {
public var frameScissorW = 0;
public var frameScissorH = 0;
public var frameTime = 0.0;
public var frame = 0;
public var currentTarget:RenderTarget = null;
public var currentFace:Int;
public var light:LightObject = null;
Expand Down Expand Up @@ -121,6 +122,8 @@ class RenderPath {
light = Scene.active.lights[0];

commands();

if (!isProbe) frame++;
}

public function setTarget(target:String, additional:Array<String> = null, viewportScale = 1.0) {
Expand Down
33 changes: 14 additions & 19 deletions Sources/iron/object/CameraObject.hx
Expand Up @@ -179,36 +179,31 @@ class CameraObject extends Object {

static var vcenter = new Vec4();
static var vup = new Vec4();
public static function setCubeFace(m:Mat4, eye:Vec4, face:Int) {
public static function setCubeFace(m:Mat4, eye:Vec4, face:Int, flip = false) {
// Set matrix to match cubemap face
vcenter.setFrom(eye);
var f = flip ? -1.0 : 1.0;
switch (face) {
case 0: // x+
vcenter.addf(1.0, 0.0, 0.0);
vup.set(0.0, -1.0, 0.0);
vcenter.addf(1.0 * f, 0.0, 0.0);
vup.set(0.0, -1.0 * f, 0.0);
case 1: // x-
vcenter.addf(-1.0, 0.0, 0.0);
vup.set(0.0, -1.0, 0.0);
vcenter.addf(-1.0 * f, 0.0, 0.0);
vup.set(0.0, -1.0 * f, 0.0);
case 2: // y+
vcenter.addf(0.0, 1.0, 0.0);
vup.set(0.0, 0.0, 1.0);
vcenter.addf(0.0, 1.0 * f, 0.0);
vup.set(0.0, 0.0, 1.0 * f);
case 3: // y-
vcenter.addf(0.0, -1.0, 0.0);
vup.set(0.0, 0.0, -1.0);
vcenter.addf(0.0, -1.0 * f, 0.0);
vup.set(0.0, 0.0, -1.0 * f);
case 4: // z+
vcenter.addf(0.0, 0.0, 1.0);
vup.set(0.0, -1.0, 0.0);
vcenter.addf(0.0, 0.0, 1.0 * f);
vup.set(0.0, -1.0 * f, 0.0);
case 5: // z-
vcenter.addf(0.0, 0.0, -1.0);
vup.set(0.0, -1.0, 0.0);
vcenter.addf(0.0, 0.0, -1.0 * f);
vup.set(0.0, -1.0 * f, 0.0);
}
m.setLookAt(eye, vcenter, vup);
#if (!kha_opengl && !kha_webgl)
m._01 = -m._01;
m._11 = -m._11;
m._21 = -m._21;
m._31 = -m._31;
#end
}

public inline function right():Vec4 { return new Vec4(transform.local._00, transform.local._01, transform.local._02); }
Expand Down
6 changes: 6 additions & 0 deletions Sources/iron/object/LightObject.hx
Expand Up @@ -255,6 +255,12 @@ class LightObject extends Object {
// Set matrix to match cubemap face
eye.set(transform.worldx(), transform.worldy(), transform.worldz());
CameraObject.setCubeFace(V, eye, face);
#if (!kha_opengl && !kha_webgl)
V._01 = -V._01;
V._11 = -V._11;
V._21 = -V._21;
V._31 = -V._31;
#end
updateViewFrustum(camera);
}

Expand Down
9 changes: 7 additions & 2 deletions Sources/iron/object/ProbeObject.hx
Expand Up @@ -168,7 +168,7 @@ class ProbeObject extends Object {
}

public function render(g:Graphics, activeCamera:CameraObject) {
if (camera == null || !ready || !visible || cullProbe(activeCamera)) return;
if (camera == null || !ready || !RenderPath.active.ready || !visible || cullProbe(activeCamera)) return;

if (data.raw.type == "planar") {
camera.V.setFrom(m1);
Expand All @@ -185,7 +185,12 @@ class ProbeObject extends Object {
if (perFrame || redraw) {
for (i in 0...6) {
camera.currentFace = i;
CameraObject.setCubeFace(camera.V, probep, i);
#if (!kha_opengl && !kha_webgl)
var flip = (i == 2 || i == 3) ? true : false; // Flip +Y, -Y
#else
var flip = false;
#end
CameraObject.setCubeFace(camera.V, probep, i, flip);
camera.transform.local.getInverse(camera.V);
camera.transform.decompose();
camera.renderFrame(g);
Expand Down

0 comments on commit 32c4202

Please sign in to comment.