make_particle.ts 1.3 KB

12345678910111213141516171819202122
  1. function make_particle_mask(kong: node_shader_t) {
  2. ///if arm_physics
  3. node_shader_add_out(kong, "wpos: float4");
  4. node_shader_add_constant(kong, "W: float4x4", "_world_matrix");
  5. node_shader_write_attrib_vert(kong, "output.wpos = constants.W * float4(input.pos.xyz, 1.0);");
  6. node_shader_add_constant(kong, "particle_hit: float3", "_particle_hit");
  7. node_shader_add_constant(kong, "particle_hit_last: float3", "_particle_hit_last");
  8. node_shader_write_frag(kong, "var pa: float3 = input.wpos.xyz - constants.particle_hit;");
  9. node_shader_write_frag(kong, "var ba: float3 = constants.particle_hit_last - constants.particle_hit;");
  10. node_shader_write_frag(kong, "var h: float = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);");
  11. node_shader_write_frag(kong, "dist = length(pa - ba * h) * 10.0;");
  12. node_shader_write_frag(kong, "if (dist > 1.0) { discard; }");
  13. node_shader_write_frag(kong, "var str: float = clamp(pow(1.0 / dist * constants.brush_hardness * 0.2, 4.0), 0.0, 1.0) * opacity;");
  14. node_shader_write_frag(kong, "if (constants.particle_hit.x == 0.0 && constants.particle_hit.y == 0.0 && constants.particle_hit.z == 0.0) { str = 0.0; }");
  15. node_shader_write_frag(kong, "if (str == 0.0) { discard; }");
  16. ///else
  17. node_shader_write_frag(kong, "var str: float = 0.0;");
  18. ///end
  19. }