Bladeren bron

RectangleLight: clean code

lviguier 1 maand geleden
bovenliggende
commit
2e4fd752e6
2 gewijzigde bestanden met toevoegingen van 13 en 8 verwijderingen
  1. 8 4
      h3d/scene/pbr/RectangleLight.hx
  2. 5 4
      h3d/shader/pbr/Light.hx

+ 8 - 4
h3d/scene/pbr/RectangleLight.hx

@@ -68,16 +68,20 @@ class RectangleLight extends Light {
 	override function sync(ctx) {
 		super.sync(ctx);
 
+		inline function getPoint(signY : Float, signZ : Float) : h3d.col.Point {
+			return new h3d.col.Point(0, (width / 2) * signY, (height / 2) * signZ).transformed(getAbsPos());
+		}
+
 		pbr.lightColor.load(_color);
 		var power = power;
 		pbr.lightColor.scale(power * power);
 		pbr.lightPos.set(absPos.tx, absPos.ty, absPos.tz);
 		pbr.width = width;
 		pbr.height = height;
-		pbr.p0.load(new h3d.Vector(0, -width / 2, -height / 2).transformed(getAbsPos()));
-		pbr.p1.load(new h3d.Vector(0, width / 2, -height / 2).transformed(getAbsPos()));
-		pbr.p2.load(new h3d.Vector(0, -width / 2, height / 2).transformed(getAbsPos()));
-		pbr.p3.load(new h3d.Vector(0, width / 2, height / 2).transformed(getAbsPos()));
+		pbr.p0.load(getPoint(-1, -1));
+		pbr.p1.load(getPoint(1, -1));
+		pbr.p2.load(getPoint(-1, 1));
+		pbr.p3.load(getPoint(1, 1));
 		pbr.lightDir.load(absPos.front());
 		pbr.verticalAngle = hxd.Math.cos(hxd.Math.degToRad(verticalAngle/2.0));
 		pbr.verticalFallOff = hxd.Math.cos(hxd.Math.degToRad(hxd.Math.min(verticalAngle/2.0, fallOff)));

+ 5 - 4
h3d/shader/pbr/Light.hx

@@ -88,7 +88,7 @@ class SpotLight extends Light {
 				pbrLightColor *= cookie.rgb * cookie.a;
 			}
 			else
-			pbrLightColor *= fallOffInfoAngle;
+				pbrLightColor *= fallOffInfoAngle;
 		}
 	}
 }
@@ -266,18 +266,19 @@ class RectangleLight extends Light {
 			// Diffuse
 			var closestPointDiffuse = getClosestPointOnRectangle(transformedPosition, normal, p0, p1, p2, p3);
 			var delta = closestPointDiffuse - transformedPosition;
-			var epsilon = horizontalFallOff - horizontalAngle;
 			pbrLightDirection = normalize(delta);
 
+			var xyEpsilon = horizontalFallOff - horizontalAngle;
 			var xyLightDir = invLightDir - dot(invLightDir, up) * up;
 			var xyDelta = delta - dot(delta, up) * up;
 			var xyTheta = dot(xyDelta.normalize(), xyLightDir.normalize());
-			var horizontalFalloff = clamp((xyTheta - horizontalAngle) / epsilon, 0.0, 1.0);
+			var horizontalFalloff = saturate((xyTheta - horizontalAngle) / xyEpsilon);
 
+			var xzEpsilon = verticalFallOff - verticalAngle;
 			var xzLightDir = invLightDir - dot(invLightDir, right) * right;
 			var xzDelta = delta - dot(delta, right) * right;
 			var xzTheta = dot(xzDelta.normalize(), xzLightDir.normalize());
-			var verticalFalloff = clamp((xzTheta - verticalAngle) / epsilon, 0.0, 1.0);
+			var verticalFalloff = saturate((xzTheta - verticalAngle) / xzEpsilon);
 
 			var falloff = verticalFalloff * horizontalFalloff * pointLightIntensity(delta, range, invLightRange4);
 			pbrLightColor = falloff * lightColor;