Merge pull request 'moisesjpelaez - Add particles random size' (#50) from Onek8/LNXSDK:main into main
Reviewed-on: #50
This commit is contained in:
@ -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) {
|
||||||
|
@ -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):
|
||||||
|
@ -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':
|
||||||
|
Reference in New Issue
Block a user