summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Johnson <ecmjohnson@hotmail.com>2023-03-20 20:40:13 -0400
committerYuri Sizov <yuris@humnom.net>2023-04-24 16:28:30 +0200
commit410b503aace744ba1ea5b1f7a67d0d8600258481 (patch)
tree2f28bad499fba4e21920e517efc67b3455d1a8bf
parent3445fa7dbcddff1aabb73e0ee156d97227dbe41b (diff)
Translate inactive particles to -INF
(cherry picked from commit 6229c2a1f99135b841ce43f2728b4ac35a9b1938)
-rw-r--r--drivers/gles3/shaders/particles_copy.glsl9
-rw-r--r--servers/rendering/renderer_rd/shaders/particles_copy.glsl7
2 files changed, 10 insertions, 6 deletions
diff --git a/drivers/gles3/shaders/particles_copy.glsl b/drivers/gles3/shaders/particles_copy.glsl
index f273cb7b64..774aa139b3 100644
--- a/drivers/gles3/shaders/particles_copy.glsl
+++ b/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];
diff --git a/servers/rendering/renderer_rd/shaders/particles_copy.glsl b/servers/rendering/renderer_rd/shaders/particles_copy.glsl
index afbd5a9caa..67a894b86f 100644
--- a/servers/rendering/renderer_rd/shaders/particles_copy.glsl
+++ b/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