Browse Source

Translate inactive particles to -INF

Erik Johnson 2 years ago
parent
commit
6229c2a1f9

+ 6 - 3
drivers/gles3/shaders/particles_copy.glsl

@@ -44,8 +44,12 @@ uniform highp mat4 inv_emission_transform;
 
 #define PARTICLE_FLAG_ACTIVE uint(1)
 
+#define FLT_MAX float(3.402823466e+38)
+
 void main() {
-	mat4 txform = mat4(vec4(0.0), vec4(0.0), vec4(0.0), vec4(0.0)); // zero scale, becomes invisible.
+	// Set scale to zero and translate to -INF so particle will be invisible
+	// even for materials that ignore rotation/scale (i.e. billboards).
+	mat4 txform = mat4(vec4(0.0), vec4(0.0), vec4(0.0), vec4(-FLT_MAX, -FLT_MAX, -FLT_MAX, 0.0));
 	if (bool(floatBitsToUint(velocity_flags.w) & PARTICLE_FLAG_ACTIVE)) {
 #ifdef MODE_3D
 		txform = transpose(mat4(xform_1, xform_2, xform_3, vec4(0.0, 0.0, 0.0, 1.0)));
@@ -102,9 +106,8 @@ void main() {
 		// as they will be drawn with the node position as origin.
 		txform = inv_emission_transform * txform;
 #endif
-
-		txform = transpose(txform);
 	}
+	txform = transpose(txform);
 
 	instance_color_custom_data = uvec4(packHalf2x16(color.xy), packHalf2x16(color.zw), packHalf2x16(custom.xy), packHalf2x16(custom.zw));
 	out_xform_1 = txform[0];

+ 4 - 3
servers/rendering/renderer_rd/shaders/particles_copy.glsl

@@ -206,11 +206,12 @@ void main() {
 			// as they will be drawn with the node position as origin.
 			txform = params.inv_emission_transform * txform;
 		}
-
-		txform = transpose(txform);
 	} else {
-		txform = mat4(vec4(0.0), vec4(0.0), vec4(0.0), vec4(0.0)); //zero scale, becomes invisible
+		// Set scale to zero and translate to -INF so particle will be invisible
+		// even for materials that ignore rotation/scale (i.e. billboards).
+		txform = mat4(vec4(0.0), vec4(0.0), vec4(0.0), vec4(-1.0 / 0.0, -1.0 / 0.0, -1.0 / 0.0, 0.0));
 	}
+	txform = transpose(txform);
 
 	if (params.copy_mode_2d) {
 		uint write_offset = gl_GlobalInvocationID.x * (2 + 1 + 1); //xform + color + custom