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

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

View File

@ -51,6 +51,7 @@ class ParticleSystem {
seed = pref.seed; seed = pref.seed;
particles = []; particles = [];
ready = false; ready = false;
Data.getParticle(sceneName, pref.particle, function(b: ParticleData) { Data.getParticle(sceneName, pref.particle, function(b: ParticleData) {
data = b; data = b;
r = data.raw; r = data.raw;
@ -70,7 +71,13 @@ class ParticleSystem {
lifetime = r.lifetime / frameRate; lifetime = r.lifetime / frameRate;
animtime = (r.frame_end - r.frame_start) / frameRate; animtime = (r.frame_end - r.frame_start) / frameRate;
spawnRate = ((r.frame_end - r.frame_start) / r.count) / 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; ready = true;
}); });
} }
@ -108,7 +115,7 @@ class ParticleSystem {
} }
// Animate // Animate
time += Time.realDelta * speed; time += Time.delta * speed;
lap = Std.int(time / animtime); lap = Std.int(time / animtime);
lapTime = time - lap * animtime; lapTime = time - lap * animtime;
count = Std.int(lapTime / spawnRate); count = Std.int(lapTime / spawnRate);
@ -143,7 +150,7 @@ class ParticleSystem {
} }
function setupGeomGpu(object: MeshObject, owner: MeshObject) { function setupGeomGpu(object: MeshObject, owner: MeshObject) {
var instancedData = new Float32Array(particles.length * 3); var instancedData = new Float32Array(particles.length * 6);
var i = 0; var i = 0;
var normFactor = 1 / 32767; // pa.values are not normalized 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 ] * 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 + 1] * normFactor * scaleFactor.y); i++;
instancedData.set(i, pa.values[j * pa.size + 2] * normFactor * scaleFactor.z); 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 case 1: // Face
@ -185,6 +196,10 @@ class ParticleSystem {
instancedData.set(i, pos.x * normFactor * scaleFactor.x); i++; instancedData.set(i, pos.x * normFactor * scaleFactor.x); i++;
instancedData.set(i, pos.y * normFactor * scaleFactor.y); i++; instancedData.set(i, pos.y * normFactor * scaleFactor.y); i++;
instancedData.set(i, pos.z * normFactor * scaleFactor.z); 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 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.x); i++;
instancedData.set(i, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.y); 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, (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 { function fhash(n: Int): Float {
@ -236,9 +255,10 @@ class ParticleSystem {
class Particle { class Particle {
public var i: Int; public var i: Int;
public var x = 0.0; public var px = 0.0;
public var y = 0.0; public var py = 0.0;
public var z = 0.0; public var pz = 0.0;
public var sr = 1.0; // Size random
public var cameraDistance: Float; public var cameraDistance: Float;
public function new(i: Int) { 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));') vert.write('p_fade = sin(min((p_age / 2) * 3.141592, 3.141592));')
if out_index: if out_index:
vert.add_out('float p_index'); vert.add_out('float p_index')
vert.write('p_index = gl_InstanceID;') vert.write('p_index = gl_InstanceID;')
def write_tilesheet(vert): 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'}) global_elems.append({'name': 'ipos', 'data': 'float3'})
if 'Rot' in inst: if 'Rot' in inst:
global_elems.append({'name': 'irot', 'data': 'float3'}) 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'}) global_elems.append({'name': 'iscl', 'data': 'float3'})
elif inst == 'Off': elif inst == 'Off':