@Override public void prepare(final ParticleSystem system) { _line.setOrigin(_axis.getOrigin()); _line.setDirection(_axis.getDirection()); final ReadOnlyMatrix3 mat = system.getEmitterTransform().getMatrix(); if (_transformWithScene && !mat.isIdentity()) { final Vector3 temp = Vector3.fetchTempInstance(); mat.applyPost(_line.getOrigin(), temp); _line.setOrigin(temp); mat.applyPost(_line.getDirection(), temp); _line.setDirection(temp); Vector3.releaseTempInstance(temp); } if (_type == VT_CYLINDER) { _rot.fromAngleAxis(-_divergence, _line.getDirection()); } }
@Override public void prepare(final ParticleSystem system) { _line.setOrigin(_axis.getOrigin()); _line.setDirection(_axis.getDirection()); final ReadOnlyMatrix3 mat = system.getEmitterTransform().getMatrix(); if (_transformWithScene && !mat.isIdentity()) { final Vector3 temp = Vector3.fetchTempInstance(); mat.applyPost(_line.getOrigin(), temp); _line.setOrigin(temp); mat.applyPost(_line.getDirection(), temp); _line.setDirection(temp); Vector3.releaseTempInstance(temp); } if (_type == VT_CYLINDER) { _rot.fromAngleAxis(-_divergence, _line.getDirection()); } }
@Test public void testGetSet() { final Line3 line1 = new Line3(); assertEquals(Vector3.ZERO, line1.getOrigin()); assertEquals(Vector3.UNIT_Z, line1.getDirection()); line1.setOrigin(Vector3.NEG_ONE); line1.setDirection(Vector3.UNIT_X); assertEquals(Vector3.NEG_ONE, line1.getOrigin()); assertEquals(Vector3.UNIT_X, line1.getDirection()); final Line3 line2 = new Line3(line1); assertEquals(Vector3.NEG_ONE, line2.getOrigin()); assertEquals(Vector3.UNIT_X, line2.getDirection()); final Line3 line3 = new Line3(Vector3.ONE, Vector3.UNIT_Y); assertEquals(Vector3.ONE, line3.getOrigin()); assertEquals(Vector3.UNIT_Y, line3.getDirection()); }
@Override public void apply(final double dt, final Particle p, final int index) { final double dtStr = dt * _strength * (_random ? MathUtils.nextRandomFloat() : 1f); p.getPosition().subtract(_line.getOrigin(), _v1); _line.getDirection().cross(_v1, v2); if (v2.length() == 0) { // particle is on the axis return; } v2.normalizeLocal(); if (_type == VT_CYLINDER) { _rot.apply(v2, v2); v2.scaleAdd(dtStr, p.getVelocity(), p.getVelocity()); return; } v2.cross(_line.getDirection(), _v1); _v1.multiplyLocal(_radius); _line.getDirection().scaleAdd(_height, _v1, _v1); _v1.addLocal(_line.getOrigin()); _v1.subtractLocal(p.getPosition()); if (_v1.length() == 0) { // particle is on the ring return; } _v1.normalizeLocal(); _v1.cross(v2, v3); _rot.fromAngleAxis(-_divergence, v2); _rot.apply(v3, v3); v3.scaleAdd(dtStr, p.getVelocity(), p.getVelocity()); }
@Override public void apply(final double dt, final Particle p, final int index) { final double dtStr = dt * _strength * (_random ? MathUtils.nextRandomFloat() : 1f); p.getPosition().subtract(_line.getOrigin(), _v1); _line.getDirection().cross(_v1, v2); if (v2.length() == 0) { // particle is on the axis return; } v2.normalizeLocal(); if (_type == VT_CYLINDER) { _rot.apply(v2, v2); v2.scaleAdd(dtStr, p.getVelocity(), p.getVelocity()); return; } v2.cross(_line.getDirection(), _v1); _v1.multiplyLocal(_radius); _line.getDirection().scaleAdd(_height, _v1, _v1); _v1.addLocal(_line.getOrigin()); _v1.subtractLocal(p.getPosition()); if (_v1.length() == 0) { // particle is on the ring return; } _v1.normalizeLocal(); _v1.cross(v2, v3); _rot.fromAngleAxis(-_divergence, v2); _rot.apply(v3, v3); v3.scaleAdd(dtStr, p.getVelocity(), p.getVelocity()); }