Przeglądaj źródła

[LIGHTS] Fix null access.

clementlandrin 4 lat temu
rodzic
commit
946ae89413
1 zmienionych plików z 69 dodań i 67 usunięć
  1. 69 67
      h3d/scene/pbr/LightBuffer.hx

+ 69 - 67
h3d/scene/pbr/LightBuffer.hx

@@ -128,73 +128,75 @@ class LightBuffer {
 			lightInfos[i] = 0;
 
 		var lights = sortLights(ctx);
-		for ( l in lights ) {
-
-			// Dir Light
-			var dl = Std.downcast(l, DirLight);
-			if( dl != null && s.dirLightCount < MAX_DIR_LIGHT ) {
-				var li = s.dirLightCount;
-				var i = li * DIR_LIGHT_INFO_SIZE * 4;
-				var pbr = @:privateAccess dl.pbr;
-				fillVector(lightInfos, pbr.lightColor, i);
-				lightInfos[i+3] = (dl.shadows != null && dl.shadows.mode != None) ? 1.0 : -1.0;
-				fillVector(lightInfos, pbr.lightDir, i+4);
-				/*if( lightInfos[i+3] > 0 ) {
-					lightInfos[i+7] = dl.shadows.bias;
-					s.dirShadowMaps[li] = dl.shadows.getShadowTex();
-					var mat = dl.shadows.getShadowProj();
-					fillFloats(lightInfos, mat._11, mat._21, mat._31, mat._41, i+8);
-					fillFloats(lightInfos, mat._12, mat._22, mat._32, mat._42, i+12);
-					fillFloats(lightInfos, mat._13, mat._23, mat._33, mat._43, i+16);
-				}*/
-				s.dirLightCount++;
-			}
-
-			// Point Light
-			var pl = Std.downcast(l, PointLight);
-			if( pl != null && s.pointLightCount < MAX_POINT_LIGHT ) {
-				var offset = MAX_DIR_LIGHT * DIR_LIGHT_INFO_SIZE * 4;
-				var li = s.pointLightCount;
-				var i = li * POINT_LIGHT_INFO_SIZE * 4 + offset;
-				var pbr = @:privateAccess pl.pbr;
-				fillVector(lightInfos, pbr.lightColor, i);
-				lightInfos[i+3] = pbr.pointSize;
-				fillVector(lightInfos, pbr.lightPos, i+4);
-				lightInfos[i+7] = pbr.invLightRange4;
-				lightInfos[i+8] = pl.range;
-				lightInfos[i+9] = (pl.shadows != null && pl.shadows.mode != None) ? 1.0 : -1.0;
-				/*if( lightInfos[i+9] > 0 ) {
-					lightInfos[i+10] = pl.shadows.bias;
-					s.pointShadowMaps[li] = pl.shadows.getShadowTex();
-				}*/
-				s.pointLightCount++;
-			}
-
-			// Spot Light
-			var sl = Std.downcast(l, SpotLight);
-			if( sl != null && s.spotLightCount < MAX_SPOT_LIGHT ) {
-				var offset = (MAX_DIR_LIGHT * DIR_LIGHT_INFO_SIZE + MAX_POINT_LIGHT * POINT_LIGHT_INFO_SIZE) * 4 ;
-				var li = s.spotLightCount;
-				var i = s.spotLightCount * SPOT_LIGHT_INFO_SIZE * 4 + offset;
-				var pbr = @:privateAccess sl.pbr;
-				fillVector(lightInfos, pbr.lightColor, i);
-				lightInfos[i+3] = pbr.range;
-				fillVector(lightInfos, pbr.lightPos, i+4);
-				lightInfos[i+7] = pbr.invLightRange4;
-				fillVector(lightInfos, pbr.spotDir, i+8);
-				lightInfos[i+12] = pbr.angle;
-				lightInfos[i+13] = pbr.fallOff;
-				lightInfos[i+14] = (sl.shadows != null && sl.shadows.mode != None) ? 1.0 : -1.0;
-				/*if( lightInfos[i+14] > 0 ) {
-					lightInfos[i+15] = sl.shadows.bias;
-					var mat = sl.shadows.getShadowProj();
-					fillFloats(lightInfos, mat._11, mat._21, mat._31, mat._41, i+16);
-					fillFloats(lightInfos, mat._12, mat._22, mat._32, mat._42, i+20);
-					fillFloats(lightInfos, mat._13, mat._23, mat._33, mat._43, i+24);
-					fillFloats(lightInfos, mat._14, mat._24, mat._34, mat._44, i+28);
-					s.spotShadowMaps[li] = sl.shadows.getShadowTex();
-				}*/
-				s.spotLightCount++;
+		if (lights != null) {
+			for ( l in lights ) {
+
+				// Dir Light
+				var dl = Std.downcast(l, DirLight);
+				if( dl != null && s.dirLightCount < MAX_DIR_LIGHT ) {
+					var li = s.dirLightCount;
+					var i = li * DIR_LIGHT_INFO_SIZE * 4;
+					var pbr = @:privateAccess dl.pbr;
+					fillVector(lightInfos, pbr.lightColor, i);
+					lightInfos[i+3] = (dl.shadows != null && dl.shadows.mode != None) ? 1.0 : -1.0;
+					fillVector(lightInfos, pbr.lightDir, i+4);
+					/*if( lightInfos[i+3] > 0 ) {
+						lightInfos[i+7] = dl.shadows.bias;
+						s.dirShadowMaps[li] = dl.shadows.getShadowTex();
+						var mat = dl.shadows.getShadowProj();
+						fillFloats(lightInfos, mat._11, mat._21, mat._31, mat._41, i+8);
+						fillFloats(lightInfos, mat._12, mat._22, mat._32, mat._42, i+12);
+						fillFloats(lightInfos, mat._13, mat._23, mat._33, mat._43, i+16);
+					}*/
+					s.dirLightCount++;
+				}
+	
+				// Point Light
+				var pl = Std.downcast(l, PointLight);
+				if( pl != null && s.pointLightCount < MAX_POINT_LIGHT ) {
+					var offset = MAX_DIR_LIGHT * DIR_LIGHT_INFO_SIZE * 4;
+					var li = s.pointLightCount;
+					var i = li * POINT_LIGHT_INFO_SIZE * 4 + offset;
+					var pbr = @:privateAccess pl.pbr;
+					fillVector(lightInfos, pbr.lightColor, i);
+					lightInfos[i+3] = pbr.pointSize;
+					fillVector(lightInfos, pbr.lightPos, i+4);
+					lightInfos[i+7] = pbr.invLightRange4;
+					lightInfos[i+8] = pl.range;
+					lightInfos[i+9] = (pl.shadows != null && pl.shadows.mode != None) ? 1.0 : -1.0;
+					/*if( lightInfos[i+9] > 0 ) {
+						lightInfos[i+10] = pl.shadows.bias;
+						s.pointShadowMaps[li] = pl.shadows.getShadowTex();
+					}*/
+					s.pointLightCount++;
+				}
+	
+				// Spot Light
+				var sl = Std.downcast(l, SpotLight);
+				if( sl != null && s.spotLightCount < MAX_SPOT_LIGHT ) {
+					var offset = (MAX_DIR_LIGHT * DIR_LIGHT_INFO_SIZE + MAX_POINT_LIGHT * POINT_LIGHT_INFO_SIZE) * 4 ;
+					var li = s.spotLightCount;
+					var i = s.spotLightCount * SPOT_LIGHT_INFO_SIZE * 4 + offset;
+					var pbr = @:privateAccess sl.pbr;
+					fillVector(lightInfos, pbr.lightColor, i);
+					lightInfos[i+3] = pbr.range;
+					fillVector(lightInfos, pbr.lightPos, i+4);
+					lightInfos[i+7] = pbr.invLightRange4;
+					fillVector(lightInfos, pbr.spotDir, i+8);
+					lightInfos[i+12] = pbr.angle;
+					lightInfos[i+13] = pbr.fallOff;
+					lightInfos[i+14] = (sl.shadows != null && sl.shadows.mode != None) ? 1.0 : -1.0;
+					/*if( lightInfos[i+14] > 0 ) {
+						lightInfos[i+15] = sl.shadows.bias;
+						var mat = sl.shadows.getShadowProj();
+						fillFloats(lightInfos, mat._11, mat._21, mat._31, mat._41, i+16);
+						fillFloats(lightInfos, mat._12, mat._22, mat._32, mat._42, i+20);
+						fillFloats(lightInfos, mat._13, mat._23, mat._33, mat._43, i+24);
+						fillFloats(lightInfos, mat._14, mat._24, mat._34, mat._44, i+28);
+						s.spotShadowMaps[li] = sl.shadows.getShadowTex();
+					}*/
+					s.spotLightCount++;
+				}
 			}
 		}
 		s.lightInfos.uploadVector(lightInfos, 0, s.lightInfos.vertices, 0);