This commit is contained in:
2026-05-17 18:28:03 -07:00
parent 8b65973bff
commit acc0d62321

View File

@ -139,11 +139,6 @@ class ParticleSystemCPU {
scaleElementsCount = getRampElementsLength(); scaleElementsCount = getRampElementsLength();
scaleRampSizeFactor = getRampSizeFactor(); scaleRampSizeFactor = getRampSizeFactor();
Scene.active.notifyOnInit(function () {
var i: Int;
for (i in 0...count) addToPool();
});
switch (type) { switch (type) {
case 0: // Emission case 0: // Emission
loopAnim = { loopAnim = {
@ -163,17 +158,20 @@ class ParticleSystemCPU {
if (loop) start(); if (loop) start();
} }
} }
Scene.active.notifyOnInit(function () {
if (autoStart) start();
});
case 1: // Hair case 1: // Hair
Scene.active.notifyOnInit(function () { Scene.active.notifyOnInit(function () {
var i: Int;
for (i in 0...count) spawnParticle(); for (i in 0...count) spawnParticle();
}); });
default: default:
} }
Scene.active.notifyOnInit(function () { Scene.active.notifyOnInit(function () {
if (autoStart) start(); for (i in 0...count) addToPool();
}); });
}); });
} }
@ -244,54 +242,54 @@ class ParticleSystemCPU {
o.visible = true; o.visible = true;
var normFactor: FastFloat = 1 / 32767; var normFactor: FastFloat = 1 / 32767;
var scalePos: FastFloat = owner.data.scalePos; var scalePos: FastFloat = owner.data.scalePos;
var scalePosParticle: FastFloat = cast(o, MeshObject).data.scalePos; var scalePosParticle: FastFloat = cast(o, MeshObject).data.scalePos;
// TODO: add all properties from Blender's UI // TODO: add all properties from Blender's UI
switch (emitFrom) { switch (emitFrom) {
case 0: // Vertices case 0: // Vertices
var pa: TVertexArray = owner.data.geom.positions; var pa: TVertexArray = owner.data.geom.positions;
var i: Int = Std.int(Math.random() * (pa.values.length / pa.size)); 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); 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) { if (!localCoords) {
loc.applyQuat(objectRot); loc.applyQuat(objectRot);
loc.add(objectPos); loc.add(objectPos);
} }
o.transform.loc.setFrom(loc); o.transform.loc.setFrom(loc);
case 1: // Faces case 1: // Faces
var positions: Int16Array = owner.data.geom.positions.values; var positions: Int16Array = owner.data.geom.positions.values;
var ia: Uint32Array = owner.data.geom.indices[Std.random(owner.data.geom.indices.length)]; 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 faceIndex: Int = Std.random(Std.int(ia.length / 3));
var i0 = ia[faceIndex * 3 + 0]; var i0 = ia[faceIndex * 3 + 0];
var i1 = ia[faceIndex * 3 + 1]; var i1 = ia[faceIndex * 3 + 1];
var i2 = ia[faceIndex * 3 + 2]; var i2 = ia[faceIndex * 3 + 2];
var v0: Vec3 = new Vec3(positions[i0 * 4], positions[i0 * 4 + 1], positions[i0 * 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 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 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); var loc: Vec4 = new Vec4(pos.x, pos.y, pos.z, 1).mult(normFactor);
if (!localCoords) { if (!localCoords) {
loc.applyQuat(objectRot); loc.applyQuat(objectRot);
loc.add(objectPos); loc.add(objectPos);
} }
o.transform.loc.setFrom(loc); o.transform.loc.setFrom(loc);
case 2: // Volume case 2: // Volume
var scaleFactorVolume: Vec4 = new Vec4().setFrom(owner.transform.dim); var scaleFactorVolume: Vec4 = new Vec4().setFrom(owner.transform.dim);
scaleFactorVolume.mult(0.5); 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); 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) { if (!localCoords) {
loc.applyQuat(objectRot); loc.applyQuat(objectRot);
loc.add(objectPos); loc.add(objectPos);
} }
o.transform.loc.setFrom(loc); o.transform.loc.setFrom(loc);
} }
particleScale = 1 - scaleRandom * Math.random(); particleScale = 1 - scaleRandom * Math.random();
@ -369,17 +367,6 @@ class ParticleSystemCPU {
particlePhysics.set(o, physics); particlePhysics.set(o, physics);
o.transform.buildMatrix(); 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() { 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 // Linear interpolation
function interpolateRampValue(normalizedAge: FastFloat, positions: Array<FastFloat>, colors: Array<FastFloat>): FastFloat { function interpolateRampValue(normalizedAge: FastFloat, positions: Array<FastFloat>, colors: Array<FastFloat>): FastFloat {
if (positions.length == 0) return 1.0; if (positions.length == 0) return 1.0;
if (normalizedAge <= positions[0]) return colors[0]; if (normalizedAge <= positions[0]) return colors[0];
if (normalizedAge >= positions[positions.length - 1]) return colors[colors.length - 1]; if (normalizedAge >= positions[positions.length - 1]) return colors[colors.length - 1];
var i: Int;
for (i in 0...(positions.length - 1)) { for (i in 0...(positions.length - 1)) {
if (normalizedAge >= positions[i] && normalizedAge <= positions[i + 1]) { if (normalizedAge >= positions[i] && normalizedAge <= positions[i + 1]) {
var t: FastFloat = (normalizedAge - positions[i]) / (positions[i + 1] - positions[i]); var t: FastFloat = (normalizedAge - positions[i]) / (positions[i + 1] - positions[i]);
@ -535,17 +531,17 @@ class ParticleSystemCPU {
var v = c.sub(a); var v = c.sub(a);
return a.add(u.mult(x).add(v.mult(y))); return a.add(u.mult(x).add(v.mult(y)));
} }
}
typedef TParticlePhysics = { typedef TParticlePhysics = {
var velocity: Vec4; var velocity: Vec4;
var gravity: Vec3; var gravity: Vec3;
var lifetime: Float; var lifetime: Float;
var age: Float; var age: Float;
var hasScaleRamp: Bool; var hasScaleRamp: Bool;
var baseScale: Vec4; var baseScale: Vec4;
var rampPositions: Array<FastFloat>; var rampPositions: Array<FastFloat>;
var rampColors: Array<FastFloat>; var rampColors: Array<FastFloat>;
var scaleRampSizeFactor: FastFloat; var scaleRampSizeFactor: FastFloat;
}
} }
#end #end