aboutsummaryrefslogtreecommitdiff
path: root/dep/g3dlite/source/Ray.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dep/g3dlite/source/Ray.cpp')
-rw-r--r--dep/g3dlite/source/Ray.cpp221
1 files changed, 111 insertions, 110 deletions
diff --git a/dep/g3dlite/source/Ray.cpp b/dep/g3dlite/source/Ray.cpp
index 0436ef0b323..8a8cf77c5b7 100644
--- a/dep/g3dlite/source/Ray.cpp
+++ b/dep/g3dlite/source/Ray.cpp
@@ -16,127 +16,128 @@
namespace G3D {
void Ray::set(const Vector3& origin, const Vector3& direction) {
- m_origin = origin;
- m_direction = direction;
- debugAssert(direction.isUnit());
-
- m_invDirection = Vector3::one() / direction;
-
- // ray slope
- ibyj = m_direction.x * m_invDirection.y;
- jbyi = m_direction.y * m_invDirection.x;
- jbyk = m_direction.y * m_invDirection.z;
- kbyj = m_direction.z * m_invDirection.y;
- ibyk = m_direction.x * m_invDirection.z;
- kbyi = m_direction.z * m_invDirection.x;
-
- // precomputed terms
- c_xy = m_origin.y - jbyi * m_origin.x;
- c_xz = m_origin.z - kbyi * m_origin.x;
- c_yx = m_origin.x - ibyj * m_origin.y;
- c_yz = m_origin.z - kbyj * m_origin.y;
- c_zx = m_origin.x - ibyk * m_origin.z;
- c_zy = m_origin.y - jbyk * m_origin.z;
-
- //ray slope classification
- if (m_direction.x < 0) {
- if (m_direction.y < 0) {
- if (m_direction.z < 0) {
- classification = MMM;
- } else if (m_direction.z > 0) {
- classification = MMP;
- } else { //(m_direction.z >= 0)
- classification = MMO;
- }
- } else { //(m_direction.y >= 0)
- if (m_direction.z < 0) {
- if (m_direction.y == 0) {
- classification = MOM;
- } else {
- classification = MPM;
- }
- } else { //(m_direction.z >= 0)
- if ((m_direction.y == 0) && (m_direction.z == 0)) {
- classification = MOO;
- } else if (m_direction.z == 0) {
- classification = MPO;
- } else if (m_direction.y == 0) {
- classification = MOP;
- } else {
- classification = MPP;
- }
- }
- }
- } else { //(m_direction.x >= 0)
- if (m_direction.y < 0) {
- if (m_direction.z < 0) {
- if (m_direction.x == 0) {
- classification = OMM;
- } else {
- classification = PMM;
- }
- } else { //(m_direction.z >= 0)
- if ((m_direction.x == 0) && (m_direction.z == 0)) {
- classification = OMO;
- } else if (m_direction.z == 0) {
- classification = PMO;
- } else if (m_direction.x == 0) {
- classification = OMP;
- } else {
- classification = PMP;
- }
- }
- } else { //(m_direction.y >= 0)
- if (m_direction.z < 0) {
- if ((m_direction.x == 0) && (m_direction.y == 0)) {
- classification = OOM;
- } else if (m_direction.x == 0) {
- classification = OPM;
- } else if (m_direction.y == 0) {
- classification = POM;
- } else {
- classification = PPM;
- }
- } else { //(m_direction.z > 0)
- if (m_direction.x == 0) {
- if (m_direction.y == 0) {
- classification = OOP;
- } else if (m_direction.z == 0) {
- classification = OPO;
- } else {
- classification = OPP;
- }
- } else {
- if ((m_direction.y == 0) && (m_direction.z == 0)) {
- classification = POO;
- } else if (m_direction.y == 0) {
- classification = POP;
- } else if (m_direction.z == 0) {
- classification = PPO;
- } else {
- classification = PPP;
- }
- }
- }
- }
- }
+ m_origin = origin;
+ m_direction = direction;
+ debugAssert(direction.isUnit());
+
+ m_invDirection = Vector3::one() / direction;
+
+ // ray slope
+ ibyj = m_direction.x * m_invDirection.y;
+ jbyi = m_direction.y * m_invDirection.x;
+ jbyk = m_direction.y * m_invDirection.z;
+ kbyj = m_direction.z * m_invDirection.y;
+ ibyk = m_direction.x * m_invDirection.z;
+ kbyi = m_direction.z * m_invDirection.x;
+
+ // precomputed terms
+ c_xy = m_origin.y - jbyi * m_origin.x;
+ c_xz = m_origin.z - kbyi * m_origin.x;
+ c_yx = m_origin.x - ibyj * m_origin.y;
+ c_yz = m_origin.z - kbyj * m_origin.y;
+ c_zx = m_origin.x - ibyk * m_origin.z;
+ c_zy = m_origin.y - jbyk * m_origin.z;
+
+ //ray slope classification
+ if (m_direction.x < 0) {
+ if (m_direction.y < 0) {
+ if (m_direction.z < 0) {
+ classification = MMM;
+ } else if (m_direction.z > 0) {
+ classification = MMP;
+ } else { //(m_direction.z >= 0)
+ classification = MMO;
+ }
+ } else { //(m_direction.y >= 0)
+ if (m_direction.z < 0) {
+ if (m_direction.y == 0) {
+ classification = MOM;
+ } else {
+ classification = MPM;
+ }
+ } else { //(m_direction.z >= 0)
+ if ((m_direction.y == 0) && (m_direction.z == 0)) {
+ classification = MOO;
+ } else if (m_direction.z == 0) {
+ classification = MPO;
+ } else if (m_direction.y == 0) {
+ classification = MOP;
+ } else {
+ classification = MPP;
+ }
+ }
+ }
+ } else { //(m_direction.x >= 0)
+ if (m_direction.y < 0) {
+ if (m_direction.z < 0) {
+ if (m_direction.x == 0) {
+ classification = OMM;
+ } else {
+ classification = PMM;
+ }
+ } else { //(m_direction.z >= 0)
+ if ((m_direction.x == 0) && (m_direction.z == 0)) {
+ classification = OMO;
+ } else if (m_direction.z == 0) {
+ classification = PMO;
+ } else if (m_direction.x == 0) {
+ classification = OMP;
+ } else {
+ classification = PMP;
+ }
+ }
+ } else { //(m_direction.y >= 0)
+ if (m_direction.z < 0) {
+ if ((m_direction.x == 0) && (m_direction.y == 0)) {
+ classification = OOM;
+ } else if (m_direction.x == 0) {
+ classification = OPM;
+ } else if (m_direction.y == 0) {
+ classification = POM;
+ } else {
+ classification = PPM;
+ }
+ } else { //(m_direction.z > 0)
+ if (m_direction.x == 0) {
+ if (m_direction.y == 0) {
+ classification = OOP;
+ } else if (m_direction.z == 0) {
+ classification = OPO;
+ } else {
+ classification = OPP;
+ }
+ } else {
+ if ((m_direction.y == 0) && (m_direction.z == 0)) {
+ classification = POO;
+ } else if (m_direction.y == 0) {
+ classification = POP;
+ } else if (m_direction.z == 0) {
+ classification = PPO;
+ } else {
+ classification = PPP;
+ }
+ }
+ }
+ }
+ }
}
+
Ray::Ray(class BinaryInput& b) {
- deserialize(b);
+ deserialize(b);
}
void Ray::serialize(class BinaryOutput& b) const {
- m_origin.serialize(b);
- m_direction.serialize(b);
+ m_origin.serialize(b);
+ m_direction.serialize(b);
}
void Ray::deserialize(class BinaryInput& b) {
- m_origin.deserialize(b);
- m_direction.deserialize(b);
- set(m_origin, m_direction);
+ m_origin.deserialize(b);
+ m_direction.deserialize(b);
+ set(m_origin, m_direction);
}