Merge pull request 'moisesjpelaez - Add particles random size' (#50) from Onek8/LNXSDK:main into main

Reviewed-on: #50
This commit is contained in:
LeenkxTeam 2025-05-13 20:03:56 +00:00
commit 288b085d0c
3 changed files with 30 additions and 9 deletions

View File

@ -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) {

View File

@ -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):

View File

@ -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':