Particle loop

This commit is contained in:
Lubos Lenco 2017-10-15 18:16:55 +02:00
parent 3c7b336dc5
commit 8e2de33dc9
4 changed files with 13 additions and 5 deletions

View file

@ -2419,6 +2419,7 @@ class ArmoryExporter:
o['gpu_sim'] = True
o['type'] = 0 if psettings.type == 'EMITTER' else 1 # HAIR
o['loop'] = psettings.arm_loop
# Emission
o['count'] = psettings.count * psettings.arm_count_mult
o['frame_start'] = psettings.frame_start

View file

@ -21,11 +21,16 @@ def write(vert, particle_info=None):
if out_age:
prep = ''
vert.add_out('float p_age')
# var p_age = (count - p.i) * spawnRate;
vert.write(prep + 'p_age = (pd[0][0] - gl_InstanceID) * pd[0][1];')
# var p_age = lapTime - p.i * spawnRate
vert.write(prep + 'p_age = pd[3][3] - gl_InstanceID * pd[0][1];')
# p_age -= p_age * fhash(i) * r.lifetime_random;
vert.write('p_age -= p_age * fhash(gl_InstanceID) * pd[2][3];')
# Loop
# pd[0][0] - animtime, loop stored in sign
# vert.write('while (p_age < 0) p_age += pd[0][0];')
vert.write('if (pd[0][0] > 0 && p_age < 0) p_age += (int(-p_age / pd[0][0]) + 1) * pd[0][0];')
# lifetime
prep = 'float '
if out_lifetime:
@ -33,9 +38,9 @@ def write(vert, particle_info=None):
vert.add_out('float p_lifetime')
vert.write(prep + 'p_lifetime = pd[0][2];')
# todo: properly discard
vert.write('if (gl_InstanceID > pd[0][0] || p_age < 0 || p_age > p_lifetime) { spos.x = spos.y = spos.z = -99999; }')
vert.write('if (p_age < 0 || p_age > p_lifetime) { spos.x = spos.y = spos.z = -99999; }')
vert.write('p_age /= 2;')
vert.write('p_age /= 2;') # Match
# object_align_factor / 2 + gxyz
prep = 'vec3 '
@ -76,7 +81,7 @@ def write(vert, particle_info=None):
def write_tilesheet(vert):
# tilesx, tilesy, framerate - pd[3][0], pd[3][1], pd[3][2]
vert.write('int frame = int((p_age / 2) / pd[3][2]);')
vert.write('int frame = int((p_age) / pd[3][2]);')
vert.write('int tx = frame % int(pd[3][0]);')
vert.write('int ty = int(frame / pd[3][0]);')
vert.write('vec2 tilesheetOffset = vec2(tx * (1 / pd[3][0]), ty * (1 / pd[3][1]));')

View file

@ -341,6 +341,7 @@ def init_properties():
# Particles
bpy.types.ParticleSettings.arm_gpu_sim = bpy.props.BoolProperty(name="GPU Simulation", description="Calculate particle simulation on GPU", default=False, update=assets.invalidate_shader_cache)
bpy.types.ParticleSettings.arm_count_mult = bpy.props.FloatProperty(name="Multiply Count", description="Multiply particle count when rendering in Armory", default=1.0)
bpy.types.ParticleSettings.arm_loop = bpy.props.BoolProperty(name="Loop", description="Loop this particle system", default=False)
create_wrd()

View file

@ -101,6 +101,7 @@ class ParticlesPropsPanel(bpy.types.Panel):
if obj == None:
return
layout.prop(obj.settings, 'arm_loop')
layout.prop(obj.settings, 'arm_gpu_sim')
layout.prop(obj.settings, 'arm_count_mult')