diff --git a/leenkx/Sources/iron/object/ParticleSystem.hx b/leenkx/Sources/iron/object/ParticleSystem.hx index 245c525..6e55a36 100644 --- a/leenkx/Sources/iron/object/ParticleSystem.hx +++ b/leenkx/Sources/iron/object/ParticleSystem.hx @@ -51,6 +51,7 @@ class ParticleSystem { seed = pref.seed; particles = []; ready = false; + Data.getParticle(sceneName, pref.particle, function(b: ParticleData) { data = b; r = data.raw; @@ -70,7 +71,13 @@ class ParticleSystem { lifetime = r.lifetime / frameRate; animtime = (r.frame_end - r.frame_start) / frameRate; spawnRate = ((r.frame_end - r.frame_start) / r.count) / frameRate; - for (i in 0...r.count) particles.push(new Particle(i)); + + for (i in 0...r.count) { + var particle = new Particle(i); + particle.sr = 1 - Math.random() * r.size_random; + particles.push(particle); + } + ready = true; }); } @@ -108,7 +115,7 @@ class ParticleSystem { } // Animate - time += Time.realDelta * speed; + time += Time.delta * speed; lap = Std.int(time / animtime); lapTime = time - lap * animtime; count = Std.int(lapTime / spawnRate); @@ -143,7 +150,7 @@ class ParticleSystem { } function setupGeomGpu(object: MeshObject, owner: MeshObject) { - var instancedData = new Float32Array(particles.length * 3); + var instancedData = new Float32Array(particles.length * 6); var i = 0; var normFactor = 1 / 32767; // pa.values are not normalized @@ -162,6 +169,10 @@ class ParticleSystem { instancedData.set(i, pa.values[j * pa.size ] * normFactor * scaleFactor.x); i++; instancedData.set(i, pa.values[j * pa.size + 1] * normFactor * scaleFactor.y); i++; instancedData.set(i, pa.values[j * pa.size + 2] * normFactor * scaleFactor.z); i++; + + instancedData.set(i, p.sr); i++; + instancedData.set(i, p.sr); i++; + instancedData.set(i, p.sr); i++; } case 1: // Face @@ -185,6 +196,10 @@ class ParticleSystem { instancedData.set(i, pos.x * normFactor * scaleFactor.x); i++; instancedData.set(i, pos.y * normFactor * scaleFactor.y); i++; instancedData.set(i, pos.z * normFactor * scaleFactor.z); i++; + + instancedData.set(i, p.sr); i++; + instancedData.set(i, p.sr); i++; + instancedData.set(i, p.sr); i++; } case 2: // Volume @@ -195,9 +210,13 @@ class ParticleSystem { instancedData.set(i, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.x); i++; instancedData.set(i, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.y); i++; instancedData.set(i, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.z); i++; + + instancedData.set(i, p.sr); i++; + instancedData.set(i, p.sr); i++; + instancedData.set(i, p.sr); i++; } } - object.data.geom.setupInstanced(instancedData, 1, Usage.StaticUsage); + object.data.geom.setupInstanced(instancedData, 3, Usage.StaticUsage); } function fhash(n: Int): Float { @@ -236,9 +255,10 @@ class ParticleSystem { class Particle { public var i: Int; - public var x = 0.0; - public var y = 0.0; - public var z = 0.0; + public var px = 0.0; + public var py = 0.0; + public var pz = 0.0; + public var sr = 1.0; // Size random public var cameraDistance: Float; public function new(i: Int) { diff --git a/leenkx/blender/lnx/material/make_particle.py b/leenkx/blender/lnx/material/make_particle.py index a8dd707..d22e534 100644 --- a/leenkx/blender/lnx/material/make_particle.py +++ b/leenkx/blender/lnx/material/make_particle.py @@ -86,7 +86,7 @@ def write(vert, particle_info=None, shadowmap=False): vert.write('p_fade = sin(min((p_age / 2) * 3.141592, 3.141592));') if out_index: - vert.add_out('float p_index'); + vert.add_out('float p_index') vert.write('p_index = gl_InstanceID;') def write_tilesheet(vert): diff --git a/leenkx/blender/lnx/material/make_shader.py b/leenkx/blender/lnx/material/make_shader.py index 8fd4dda..89f4fe9 100644 --- a/leenkx/blender/lnx/material/make_shader.py +++ b/leenkx/blender/lnx/material/make_shader.py @@ -209,7 +209,8 @@ def make_instancing_and_skinning(mat: Material, mat_users: Dict[Material, List[O global_elems.append({'name': 'ipos', 'data': 'float3'}) if 'Rot' in inst: global_elems.append({'name': 'irot', 'data': 'float3'}) - if 'Scale' in inst: + #HACK: checking `mat.arm_particle_flag` to force appending 'iscl' to the particle's vertex shader + if 'Scale' in inst or mat.arm_particle_flag: global_elems.append({'name': 'iscl', 'data': 'float3'}) elif inst == 'Off':