From d063f3488d6aacc84e21edfc0668df0c0146edf6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 24 Sep 2015 19:14:26 -0700 Subject: [PATCH 1/3] Back out fromSpherical code addition --- libraries/script-engine/src/Vec3.cpp | 24 ++++++++++++++++++++++++ libraries/script-engine/src/Vec3.h | 4 ++-- libraries/shared/src/GLMHelpers.cpp | 24 ------------------------ libraries/shared/src/GLMHelpers.h | 4 ---- 4 files changed, 26 insertions(+), 30 deletions(-) diff --git a/libraries/script-engine/src/Vec3.cpp b/libraries/script-engine/src/Vec3.cpp index 04e3a4fe05..88d6373b6d 100644 --- a/libraries/script-engine/src/Vec3.cpp +++ b/libraries/script-engine/src/Vec3.cpp @@ -58,3 +58,27 @@ glm::vec3 Vec3::toPolar(const glm::vec3& v) { return glm::vec3(elevation, azimuth, radius); } + +glm::vec3 Vec3::fromPolar(const glm::vec3& polar) { + float x = glm::cos(polar.x) * glm::sin(polar.y); + float y = glm::sin(-polar.x); + float z = glm::cos(polar.x) * glm::cos(polar.y); + + // Round small values to 0 + if (glm::abs(x) < EPSILON) { + x = 0.0f; + } + if (glm::abs(y) < EPSILON) { + y = 0.0f; + } + if (glm::abs(z) < EPSILON) { + z = 0.0f; + } + + return polar.z * glm::vec3(x, y, z); +} + +glm::vec3 Vec3::fromPolar(float elevation, float azimuth) { + glm::vec3 v = glm::vec3(elevation, azimuth, 1.0f); + return fromPolar(v); +} diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h index 2d703ac87e..b05e729a49 100644 --- a/libraries/script-engine/src/Vec3.h +++ b/libraries/script-engine/src/Vec3.h @@ -43,8 +43,8 @@ public slots: bool withinEpsilon(const glm::vec3& v1, const glm::vec3& v2, float epsilon); // FIXME misnamed, should be 'spherical' or 'euler' depending on the implementation glm::vec3 toPolar(const glm::vec3& v); - glm::vec3 fromPolar(const glm::vec3& polar) { return fromSpherical(polar); } - glm::vec3 fromPolar(float elevation, float azimuth) { return fromSpherical(elevation, azimuth); } + glm::vec3 fromPolar(const glm::vec3& polar); + glm::vec3 fromPolar(float elevation, float azimuth); const glm::vec3& UNIT_X() { return Vectors::UNIT_X; } const glm::vec3& UNIT_Y() { return Vectors::UNIT_Y; } const glm::vec3& UNIT_Z() { return Vectors::UNIT_Z; } diff --git a/libraries/shared/src/GLMHelpers.cpp b/libraries/shared/src/GLMHelpers.cpp index 3d705cf99e..7d56157e53 100644 --- a/libraries/shared/src/GLMHelpers.cpp +++ b/libraries/shared/src/GLMHelpers.cpp @@ -225,30 +225,6 @@ glm::quat rotationBetween(const glm::vec3& v1, const glm::vec3& v2) { return glm::angleAxis(angle, axis); } -glm::vec3 fromSpherical(const glm::vec3& spherical) { - float x = glm::cos(spherical.x) * glm::sin(spherical.y); - float y = glm::sin(-spherical.x); - float z = glm::cos(spherical.x) * glm::cos(spherical.y); - - // Round small values to 0 - if (glm::abs(x) < EPSILON) { - x = 0.0f; - } - if (glm::abs(y) < EPSILON) { - y = 0.0f; - } - if (glm::abs(z) < EPSILON) { - z = 0.0f; - } - - return spherical.z * glm::vec3(x, y, z); -} - -glm::vec3 fromSpherical(float elevation, float azimuth) { - glm::vec3 v = glm::vec3(elevation, azimuth, 1.0f); - return fromSpherical(v); -} - bool isPointBehindTrianglesPlane(glm::vec3 point, glm::vec3 p0, glm::vec3 p1, glm::vec3 p2) { glm::vec3 v1 = p0 - p1, v2 = p2 - p1; // Non-collinear vectors contained in the plane glm::vec3 n = glm::cross(v1, v2); // Plane's normal vector, pointing out of the triangle diff --git a/libraries/shared/src/GLMHelpers.h b/libraries/shared/src/GLMHelpers.h index 0245ca926f..6683088306 100644 --- a/libraries/shared/src/GLMHelpers.h +++ b/libraries/shared/src/GLMHelpers.h @@ -117,10 +117,6 @@ float angleBetween(const glm::vec3& v1, const glm::vec3& v2); glm::quat rotationBetween(const glm::vec3& v1, const glm::vec3& v2); -glm::vec3 fromSpherical(const glm::vec3& spherical); - -glm::vec3 fromSpherical(float elevation, float azimuth); - bool isPointBehindTrianglesPlane(glm::vec3 point, glm::vec3 p0, glm::vec3 p1, glm::vec3 p2); glm::vec3 extractTranslation(const glm::mat4& matrix); From 629128c17f3d191c1e98352a49b7eb85fb27eb97 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 24 Sep 2015 19:16:28 -0700 Subject: [PATCH 2/3] Fix particle emit directions for point emitter --- libraries/entities/src/ParticleEffectEntityItem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 8c45c860fa..3f3bde7077 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -711,10 +711,10 @@ void ParticleEffectEntityItem::stepSimulation(float deltaTime) { if (_emitDimensions == glm::vec3()) { // Point - emitDirection = _emitOrientation * fromSpherical(elevation, azimuth); + emitDirection = glm::angleAxis(PI_OVER_TWO - elevation, X_AXIS) * Z_AXIS; + emitDirection = glm::angleAxis(azimuth, Z_AXIS) * emitDirection; _particlePositions[i] = getPosition(); - } else { // Ellipsoid float radiusScale = 1.0f; From d233d3f81bdae9873cc93be0c5024398eb76e094 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 24 Sep 2015 19:17:02 -0700 Subject: [PATCH 3/3] Fix particle emitter corner cases --- libraries/entities/src/ParticleEffectEntityItem.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 3f3bde7077..9d11dff55a 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -682,9 +682,9 @@ void ParticleEffectEntityItem::stepSimulation(float deltaTime) { } updateRadius(i, 0.0f); - // Velocity and acceleration - if (_polarStart == 0.0f && _polarFinish == 0.0f) { - // Emit along z-axis + // Position, velocity, and acceleration + if (_polarStart == 0.0f && _polarFinish == 0.0f && _emitDimensions.z == 0.0f) { + // Emit along z-axis from position _particlePositions[i] = getPosition(); _particleVelocities[i] = (_emitSpeed + (2.0f * randFloat() - 1.0f) * _speedSpread) * (_emitOrientation * Z_AXIS); @@ -730,9 +730,9 @@ void ParticleEffectEntityItem::stepSimulation(float deltaTime) { float z = radiuses.z * glm::sin(elevation); glm::vec3 emitPosition = glm::vec3(x, y, z); emitDirection = glm::normalize(glm::vec3( - x / (radiuses.x * radiuses.x), - y / (radiuses.y * radiuses.y), - z / (radiuses.z * radiuses.z) + radiuses.x > 0.0f ? x / (radiuses.x * radiuses.x) : 0.0f, + radiuses.y > 0.0f ? y / (radiuses.y * radiuses.y) : 0.0f, + radiuses.z > 0.0f ? z / (radiuses.z * radiuses.z) : 0.0f )); _particlePositions[i] = getPosition() + _emitOrientation * emitPosition;