diff --git a/leenkx/Sources/iron/object/ParticleSystemCPU.hx b/leenkx/Sources/iron/object/ParticleSystemCPU.hx index fe25111..62160b7 100644 --- a/leenkx/Sources/iron/object/ParticleSystemCPU.hx +++ b/leenkx/Sources/iron/object/ParticleSystemCPU.hx @@ -139,11 +139,6 @@ class ParticleSystemCPU { scaleElementsCount = getRampElementsLength(); scaleRampSizeFactor = getRampSizeFactor(); - Scene.active.notifyOnInit(function () { - var i: Int; - for (i in 0...count) addToPool(); - }); - switch (type) { case 0: // Emission loopAnim = { @@ -163,17 +158,20 @@ class ParticleSystemCPU { if (loop) start(); } } + + Scene.active.notifyOnInit(function () { + if (autoStart) start(); + }); case 1: // Hair Scene.active.notifyOnInit(function () { - var i: Int; for (i in 0...count) spawnParticle(); }); default: } - Scene.active.notifyOnInit(function () { - if (autoStart) start(); - }); + Scene.active.notifyOnInit(function () { + for (i in 0...count) addToPool(); + }); }); } @@ -244,54 +242,54 @@ class ParticleSystemCPU { o.visible = true; - var normFactor: FastFloat = 1 / 32767; - var scalePos: FastFloat = owner.data.scalePos; - var scalePosParticle: FastFloat = cast(o, MeshObject).data.scalePos; + var normFactor: FastFloat = 1 / 32767; + var scalePos: FastFloat = owner.data.scalePos; + var scalePosParticle: FastFloat = cast(o, MeshObject).data.scalePos; - // TODO: add all properties from Blender's UI - switch (emitFrom) { - case 0: // Vertices - var pa: TVertexArray = owner.data.geom.positions; - var i: Int = Std.int(Math.random() * (pa.values.length / pa.size)); - var loc: Vec4 = new Vec4(pa.values[i * pa.size] * normFactor, pa.values[i * pa.size + 1] * normFactor, pa.values[i * pa.size + 2] * normFactor, 1); + // TODO: add all properties from Blender's UI + switch (emitFrom) { + case 0: // Vertices + var pa: TVertexArray = owner.data.geom.positions; + var i: Int = Std.int(Math.random() * (pa.values.length / pa.size)); + var loc: Vec4 = new Vec4(pa.values[i * pa.size] * normFactor, pa.values[i * pa.size + 1] * normFactor, pa.values[i * pa.size + 2] * normFactor, 1); - if (!localCoords) { - loc.applyQuat(objectRot); - loc.add(objectPos); - } - o.transform.loc.setFrom(loc); - case 1: // Faces - var positions: Int16Array = owner.data.geom.positions.values; - var ia: Uint32Array = owner.data.geom.indices[Std.random(owner.data.geom.indices.length)]; - var faceIndex: Int = Std.random(Std.int(ia.length / 3)); + if (!localCoords) { + loc.applyQuat(objectRot); + loc.add(objectPos); + } + o.transform.loc.setFrom(loc); + case 1: // Faces + var positions: Int16Array = owner.data.geom.positions.values; + var ia: Uint32Array = owner.data.geom.indices[Std.random(owner.data.geom.indices.length)]; + var faceIndex: Int = Std.random(Std.int(ia.length / 3)); - var i0 = ia[faceIndex * 3 + 0]; - var i1 = ia[faceIndex * 3 + 1]; - var i2 = ia[faceIndex * 3 + 2]; + var i0 = ia[faceIndex * 3 + 0]; + var i1 = ia[faceIndex * 3 + 1]; + var i2 = ia[faceIndex * 3 + 2]; - var v0: Vec3 = new Vec3(positions[i0 * 4], positions[i0 * 4 + 1], positions[i0 * 4 + 2]); - var v1: Vec3 = new Vec3(positions[i1 * 4], positions[i1 * 4 + 1], positions[i1 * 4 + 2]); - var v2: Vec3 = new Vec3(positions[i2 * 4], positions[i2 * 4 + 1], positions[i2 * 4 + 2]); + var v0: Vec3 = new Vec3(positions[i0 * 4], positions[i0 * 4 + 1], positions[i0 * 4 + 2]); + var v1: Vec3 = new Vec3(positions[i1 * 4], positions[i1 * 4 + 1], positions[i1 * 4 + 2]); + var v2: Vec3 = new Vec3(positions[i2 * 4], positions[i2 * 4 + 1], positions[i2 * 4 + 2]); - var pos: Vec3 = randomPointInTriangle(v0, v1, v2); + var pos: Vec3 = randomPointInTriangle(v0, v1, v2); - var loc: Vec4 = new Vec4(pos.x, pos.y, pos.z, 1).mult(normFactor); - if (!localCoords) { - loc.applyQuat(objectRot); - loc.add(objectPos); - } + var loc: Vec4 = new Vec4(pos.x, pos.y, pos.z, 1).mult(normFactor); + if (!localCoords) { + loc.applyQuat(objectRot); + loc.add(objectPos); + } - o.transform.loc.setFrom(loc); - case 2: // Volume - var scaleFactorVolume: Vec4 = new Vec4().setFrom(owner.transform.dim); - scaleFactorVolume.mult(0.5); - var loc: Vec4 = new Vec4((Math.random() * 2.0 - 1.0) * scaleFactorVolume.x, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.y, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.z, 1); + o.transform.loc.setFrom(loc); + case 2: // Volume + var scaleFactorVolume: Vec4 = new Vec4().setFrom(owner.transform.dim); + scaleFactorVolume.mult(0.5); + var loc: Vec4 = new Vec4((Math.random() * 2.0 - 1.0) * scaleFactorVolume.x, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.y, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.z, 1); - if (!localCoords) { - loc.applyQuat(objectRot); - loc.add(objectPos); - } - o.transform.loc.setFrom(loc); + if (!localCoords) { + loc.applyQuat(objectRot); + loc.add(objectPos); + } + o.transform.loc.setFrom(loc); } particleScale = 1 - scaleRandom * Math.random(); @@ -369,17 +367,6 @@ class ParticleSystemCPU { particlePhysics.set(o, physics); o.transform.buildMatrix(); - } - } - - function setVelocityHair(object: Object, velocity: Vec4, randQuat: Quat, phaseQuat: Quat) { - var dir: Vec4 = velocity.clone().normalize(); - var yaw: FastFloat = Math.atan2(-dir.x, dir.y); - var pitch: FastFloat = Math.asin(dir.z); - var targetRot: Quat = new Quat().fromEuler(pitch, 0, yaw); - - targetRot.mult(randQuat); - object.transform.rot.setFrom(targetRot.mult(phaseQuat)); } function updateParticles() { @@ -415,13 +402,22 @@ class ParticleSystemCPU { } } + function setVelocityHair(object: Object, velocity: Vec4, randQuat: Quat, phaseQuat: Quat) { + var dir: Vec4 = velocity.clone().normalize(); + var yaw: FastFloat = Math.atan2(-dir.x, dir.y); + var pitch: FastFloat = Math.asin(dir.z); + var targetRot: Quat = new Quat().fromEuler(pitch, 0, yaw); + + targetRot.mult(randQuat); + object.transform.rot.setFrom(targetRot.mult(phaseQuat)); + } + // Linear interpolation function interpolateRampValue(normalizedAge: FastFloat, positions: Array, colors: Array): FastFloat { if (positions.length == 0) return 1.0; if (normalizedAge <= positions[0]) return colors[0]; if (normalizedAge >= positions[positions.length - 1]) return colors[colors.length - 1]; - var i: Int; for (i in 0...(positions.length - 1)) { if (normalizedAge >= positions[i] && normalizedAge <= positions[i + 1]) { var t: FastFloat = (normalizedAge - positions[i]) / (positions[i + 1] - positions[i]); @@ -535,17 +531,17 @@ class ParticleSystemCPU { var v = c.sub(a); return a.add(u.mult(x).add(v.mult(y))); } +} - typedef TParticlePhysics = { - var velocity: Vec4; - var gravity: Vec3; - var lifetime: Float; - var age: Float; - var hasScaleRamp: Bool; - var baseScale: Vec4; - var rampPositions: Array; - var rampColors: Array; - var scaleRampSizeFactor: FastFloat; - } +typedef TParticlePhysics = { + var velocity: Vec4; + var gravity: Vec3; + var lifetime: Float; + var age: Float; + var hasScaleRamp: Bool; + var baseScale: Vec4; + var rampPositions: Array; + var rampColors: Array; + var scaleRampSizeFactor: FastFloat; } #end