pcloud update

This commit is contained in:
Igor Elovikov
2020-07-10 13:38:46 +01:00
parent c3fcbc8579
commit 45027054c2
12 changed files with 119 additions and 32 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
+15 -8
View File
@@ -8,10 +8,14 @@ declare_inputs("particle_system")
lifetime_rand = tofloat(lifetime) * (1.0 - lifetime_random) lifetime_rand = tofloat(lifetime) * (1.0 - lifetime_random)
p_lifetime = toint(uniform_ab(lifetime_rand, tofloat(lifetime))) p_lifetime = toint(uniform_ab(lifetime_rand, tofloat(lifetime)))
stop_simulation = 0 stop_simulation = 0
n = get_float("$number")
total_particles = get_int("total_particles")
# calculate start position # calculate start position
emitter_direction = 0.0 emitter_direction = 0.0
norm_particle = n / tofloat(total_particles)
emitter_direction = norm_particle if uniform_direction else emitter_direction
p_position = start_position p_position = start_position
# calculate line position # calculate line position
@@ -24,6 +28,7 @@ line_direction = atan2(line_vec) / _2pi()
circle_rad = uniform_ab(emitter_radius.x, emitter_radius.y) circle_rad = uniform_ab(emitter_radius.x, emitter_radius.y)
circle_arc = uniform_ab(emitter_arc.x, emitter_arc.y) circle_arc = uniform_ab(emitter_arc.x, emitter_arc.y)
circle_arc = norm_particle if uniform_direction else circle_arc
circle_vec = vector2(-circle_rad, 0.0) circle_vec = vector2(-circle_rad, 0.0)
circle_vec = rotate_vec2(circle_vec, -circle_arc, float2(0.0, 0.0)) circle_vec = rotate_vec2(circle_vec, -circle_arc, float2(0.0, 0.0))
@@ -68,15 +73,17 @@ p_position = p_position + unit_rand @ pos_offset
{{ ps.init_parameter_random("velocity", -1, false, true) }} {{ ps.init_parameter_random("velocity", -1, false, true) }}
p_direction_angle = p_direction_angle + emitter_direction if inherit_direction else p_direction_angle p_direction_angle = p_direction_angle + emitter_direction if pc_inherit_direction else p_direction_angle
p_color = p_color * point_attrib.y if emitter_type == 3 else p_color p_color = p_color * point_attrib.y if emitter_type == 3 and pc_inherit_color else p_color
p_size = p_size * point_attrib.x if emitter_type == 3 else p_size p_size = p_size * point_attrib.x if emitter_type == 3 and pc_inherit_size else p_size
p_mass = p_mass * p_size if mass_mult == 1 else p_mass p_mass = p_mass * p_size if mass_mult == 1 else p_mass
p_mass = p_mass * p_size * p_size if mass_mult == 1 else p_mass p_mass = p_mass * p_size * p_size if mass_mult == 2 else p_mass
p_mass = p_mass * 1000.0
p_drag = p_drag * p_size if drag_mult == 1 else p_drag p_drag = p_drag * p_size if drag_mult == 1 else p_drag
p_drag = p_drag * p_size * p_size if drag_mult == 1 else p_drag p_drag = p_drag * p_size * p_size if drag_mult == 2 else p_drag
p_drag = p_drag * 1000.0
export(p_mass) export(p_mass)
export(p_drag) export(p_drag)
@@ -87,11 +94,11 @@ export(p_size)
p_velocity_vec = vector2(-1.0, 0.0) @ (p_velocity * 0.001) p_velocity_vec = vector2(-1.0, 0.0) @ (p_velocity * 0.001)
p_velocity_vec = rotate_vec2(p_velocity_vec, -p_direction_angle, float2(0.0, 0.0)) p_velocity_vec = rotate_vec2(p_velocity_vec, -p_direction_angle, float2(0.0, 0.0))
:: if pcloud_write
n = get_float("$number")
particle_index = toint(n) particle_index = toint(n)
_OUT_ = p_lifetime if particle_index < get_int("total_particles") else 1
export(particle_index) export(particle_index)
:: if pcloud_write
_OUT_ = p_lifetime if particle_index < total_particles else 1
:: else :: else
_OUT_ = p_lifetime _OUT_ = p_lifetime
:: endif :: endif
+32 -17
View File
@@ -14,10 +14,8 @@ step_limit = toint(step_limit)
total_lifetime = (lifetime - 1.0) if lifetime > 1.0 else 0.0 total_lifetime = (lifetime - 1.0) if lifetime > 1.0 else 0.0
itotal_lifetime = toint(total_lifetime) itotal_lifetime = toint(total_lifetime)
:: if pcloud_write
cloud_index = get_int("cloud_index") cloud_index = get_int("cloud_index")
particle_index = get_int("particle_index") particle_index = get_int("particle_index")
:: endif
norm_life = n / total_lifetime norm_life = n / total_lifetime
@@ -44,10 +42,11 @@ stop_simulation = get_int("stop_simulation")
{{ ps.apply_modifiers("masking", 6) }} {{ ps.apply_modifiers("masking", 6) }}
# calculate velocity coeffs # calculate velocity coeffs
#p_velocity_vec = rotate_vec2(p_velocity_vec, p_ang_velocity * 0.001, float2(0.0, 0.0))
p_velocity_norm = normalize_vec2(p_velocity_vec)
p_direction = atan2(p_velocity_vec) / _2pi()
p_v = length_vec2(p_velocity_vec) p_v = length_vec2(p_velocity_vec)
p_velocity_norm = normalize_vec2(p_velocity_vec) if p_v > 0.0 else float2(0.0, 1.0)
p_direction = atan2(p_velocity_vec) / _2pi()
# update position (excluding first frame) # update position (excluding first frame)
p_position = p_position + p_velocity_vec if n > 0.0 else p_position p_position = p_position + p_velocity_vec if n > 0.0 else p_position
@@ -63,7 +62,7 @@ force = force + drag_force
gravity_from_map = samplecol(p_position, 25, 1) gravity_from_map = samplecol(p_position, 25, 1)
gravity_from_map = gravity_from_map.xy @ 2.0 - float2(1.0, 1.0) if use_gravity_map else float2(0.0, 0.0) gravity_from_map = gravity_from_map.xy @ 2.0 - float2(1.0, 1.0) if use_gravity_map else float2(0.0, 0.0)
total_gravity = gravity_from_map @ gravity_scalar if use_gravity_map else gravity_vec total_gravity = gravity_from_map @ (gravity_scalar * 0.00001) if use_gravity_map else gravity_vec
# apply forces # apply forces
p_velocity_vec = p_velocity_vec + force @ ( 1.0 / p_mass) + total_gravity p_velocity_vec = p_velocity_vec + force @ ( 1.0 / p_mass) + total_gravity
@@ -77,6 +76,16 @@ p_velocity_vec = p_velocity_vec + p_velocity_norm @ p_v - p_velocity_vec if clam
p_velocity_vec = rotate_vec2(p_velocity_vec, p_ang_velocity * 0.001, float2(0.0, 0.0)) p_velocity_vec = rotate_vec2(p_velocity_vec, p_ang_velocity * 0.001, float2(0.0, 0.0))
need_jitter = uniform_ab(0.0, 1.0) < direction_jitter_prob
need_jitter = need_jitter and direction_jitter
need_jitter = need_jitter and ni % direction_jitter_quant == 0
need_jitter = need_jitter and ni > 0
jitter = uniform_ab(direction_jitter_amount.x, direction_jitter_amount.y)
jitter = -jitter if uniform_ab(0.0, 1.0) < 0.5 else jitter
p_velocity_vec = rotate_vec2(p_velocity_vec, jitter, float2(0.0, 0.0)) if need_jitter else p_velocity_vec
p_size_out = vector2(p_size, p_size) p_size_out = vector2(p_size, p_size)
stop_mask = samplelum(p_position, 24, 0) stop_mask = samplelum(p_position, 24, 0)
@@ -107,19 +116,19 @@ p_orientation_out = p_orientation + p_direction if velocity_orient else p_orient
# write simulation to pcloud # write simulation to pcloud
:: if pcloud_write
cloud_img_size = get_int2("cloud_img_size") cloud_img_size = get_int2("cloud_img_size")
fsize = get_float2("fsize") fsize = get_float2("fsize")
out_fragment_size = get_float2("out_fragment_size") out_fragment_size = get_float2("out_fragment_size")
p_orientation_out = 0.0
# current frame # current frame
cloud_masked = uniform_ab(0.0, 1.0) < pc_mask cloud_masked = uniform_ab(0.0, 1.0) < pc_mask
cloud_mask_sample = modifier_sample if point_cloud_type == 1 else modifier_sample_global cloud_mask_sample = modifier_sample if point_cloud_type == 1 else modifier_sample_global
cloud_mask = samplelum(cloud_mask_sample, 25, 0) cloud_mask = samplelum(cloud_mask_sample, 27, 0)
cloud_masked = cloud_masked or uniform_ab(0.0, 1.0) >= cloud_mask map_masked = uniform_ab(0.0, 1.0) >= cloud_mask if point_cloud_type > 0 else False
cloud_masked = cloud_masked or map_masked
write_to_cloud = True write_to_cloud = True
write_to_cloud = write_to_cloud and not cloud_masked write_to_cloud = write_to_cloud and not cloud_masked
@@ -127,12 +136,16 @@ pcloud_quant = True if last_step else ni % pcloud_quantize == 0
write_to_cloud = write_to_cloud and pcloud_quant write_to_cloud = write_to_cloud and pcloud_quant
write_to_cloud = write_to_cloud and not simulation_halted write_to_cloud = write_to_cloud and not simulation_halted
write_to_cloud = True if last_step else write_to_cloud
write_to_cloud = True if need_jitter and force_jitter else write_to_cloud
# check capacity # check capacity
write_to_cloud = write_to_cloud and cloud_index <= (cloud_img_size.a * cloud_img_size.b / 2 - 1) write_to_cloud = write_to_cloud and cloud_index <= (cloud_img_size.a * cloud_img_size.b / 2 - 1)
alpha = 1.0 if write_to_cloud else 0.0 alpha = 1.0 if write_to_cloud else 0.0
pos_color = merge_float4(p_position.x, p_position.y, p_direction + 0.5, alpha) pos_color = merge_float4(p_position.x, p_position.y, p_direction + 0.5, alpha)
p_flag = 1.0 if last_step else 0.0 p_flag = 1.0 if need_jitter else 0.0
p_flag = 2.0 if last_step and stop_simulation > 0 else p_flag p_flag = 2.0 if last_step else p_flag
p_flag = 3.0 if last_step and stop_simulation > 0 else p_flag
p_attribs = merge_float4(p_size, color_before_trim, p_flag, alpha) p_attribs = merge_float4(p_size, color_before_trim, p_flag, alpha)
output_row = tofloat((cloud_index * 2) / cloud_img_size.a) output_row = tofloat((cloud_index * 2) / cloud_img_size.a)
@@ -141,32 +154,34 @@ output_column = tofloat((cloud_index * 2) % cloud_img_size.a)
fcloud_index = tofloat(cloud_index) fcloud_index = tofloat(cloud_index)
write_index = (particle_index == get_int("total_particles")) write_index = (particle_index == get_int("total_particles"))
p_size_out = out_fragment_size
p_position_out = out_fragment_size / float2(2.0, 2.0) + vector2(output_column, output_row) / (fsize - float2(1.0, 1.0)) * (float2(1.0, 1.0) - out_fragment_size) p_position_out = out_fragment_size / float2(2.0, 2.0) + vector2(output_column, output_row) / (fsize - float2(1.0, 1.0)) * (float2(1.0, 1.0) - out_fragment_size)
#pos_color = merge_float4(0.5, 0.5, 0.0, alpha)
p_color_out = merge_float4(fcloud_index, fsize.x, fsize.y, 1.0) if write_index else pos_color
p_position_out = float2(1.0, 1.0) - out_fragment_size / float2(2.0, 2.0) if write_index else p_position_out p_position_out = float2(1.0, 1.0) - out_fragment_size / float2(2.0, 2.0) if write_index else p_position_out
cloud_index = cloud_index + 1 if write_to_cloud else cloud_index cloud_index = cloud_index + 1 if write_to_cloud else cloud_index
export(p_attribs) export(p_attribs)
export(p_color_out)
export(cloud_index) export(cloud_index)
:: if pcloud_write
p_orientation_out = 0.0
p_size_out = out_fragment_size
p_color_out = merge_float4(fcloud_index, fsize.x, fsize.y, 1.0) if write_index else pos_color
_OUT_ = 1 if write_index else 2 _OUT_ = 1 if write_index else 2
:: else :: else
p_position_out = p_position p_position_out = p_position
p_color_out = merge_float4(p_color, p_color, p_color, p_color) p_color_out = merge_float4(p_color, p_color, p_color, p_color)
export(p_color_out)
_OUT_ = 0 if simulation_halted else 1 _OUT_ = 0 if simulation_halted else 1
:: endif :: endif
stop_simulation = stop_simulation + 1 if stop_mask > stop_threshold and stop_sim_at_black else stop_simulation stop_simulation = stop_simulation + 1 if stop_mask > stop_threshold and stop_sim_at_black else stop_simulation
export(p_color_out)
export(stop_simulation) export(stop_simulation)
export(p_size_out) export(p_size_out)
export(p_orientation_out) export(p_orientation_out)
File diff suppressed because one or more lines are too long
+64
View File
@@ -0,0 +1,64 @@
declare_inputs("denoise")
INV_SQRT_OF_2PI = 0.39894228040143267793994605993439
INV_PI = 0.31830988618379067153776752674503
:: set MRAD = 8
:: set MRADQ = MRAD * MRAD
tolerance = 0.01
radius = floor(sigma * kSigma + 0.5)
radQ = radius * radius
invSigmaQx2 = 0.5 / (sigma * sigma)
invSigmaQx2PI = INV_PI * invSigmaQx2
invThresholdSqx2 = 0.5 / (threshold * threshold)
invThresholdSqrt2PI = INV_SQRT_OF_2PI / threshold
uv = get_float2("$pos")
size = get_float2("$size")
centrPx = samplelum(uv, 0, 0)
zBuff = 0.0
aBuff = 0.0
radius_ceil = -radius - tolerance
radius_floor = radius + tolerance
:: for dx in range(-MRAD, MRAD + 1)
pt = sqrt(radQ - {{ dx * dx | float }})
pt = ceil(pt)
use_iteration_dx = {{ dx | float }} > radius_ceil and {{ dx | float }} < radius_floor
pt_ceil = -pt - tolerance
pt_floor = pt + tolerance
:: for dy in range(-MRAD, MRAD + 1)
use_iteration_dy = {{ dy | float }} > pt_ceil and {{ dy | float }} < pt_floor
use_iteration = use_iteration_dx and use_iteration_dy
d = vector2({{ dx | float }}, {{ dy | float}})
blurFactor = exp( -(d ^ d) * invSigmaQx2 ) * invSigmaQx2PI
walkPx = samplelum(uv + d / size, 0, 0)
dc = walkPx - centrPx
deltaFactor = exp( - dc * dc * invThresholdSqx2) * invThresholdSqrt2PI * blurFactor
zBuff = zBuff + deltaFactor if use_iteration else zBuff
aBuff = aBuff + deltaFactor * walkPx if use_iteration else aBuff
:: endfor
:: endfor
res = aBuff / zBuff
_OUT_ = merge_float4(res, res, res, res)
File diff suppressed because one or more lines are too long