Chromium Code Reviews| Index: chrome/browser/android/vr_shell/ui_elements.cc |
| diff --git a/chrome/browser/android/vr_shell/ui_elements.cc b/chrome/browser/android/vr_shell/ui_elements.cc |
| index 5fb4805d8d95fe5216dfa43e31e48321fc93f78d..71e7b757f70dba0054c1893f7d29a71daea2c17a 100644 |
| --- a/chrome/browser/android/vr_shell/ui_elements.cc |
| +++ b/chrome/browser/android/vr_shell/ui_elements.cc |
| @@ -14,77 +14,90 @@ namespace vr_shell { |
| namespace { |
| -float GetRayPlaneIntersection(gvr::Vec3f ray_origin, |
| - gvr::Vec3f ray_vector, |
| - gvr::Vec3f plane_origin, |
| - gvr::Vec3f plane_normal) { |
| +bool GetRayPlaneDistance(const gvr::Vec3f& ray_origin, |
| + const gvr::Vec3f& ray_vector, |
| + const gvr::Vec3f& plane_origin, |
| + const gvr::Vec3f& plane_normal, |
| + float* distance) { |
|
tiborg
2017/03/06 17:51:43
Check for null pointer?
cjgrant
2017/03/06 18:41:02
IMO, null checks are good in APIs to protect again
|
| float denom = vr_shell::VectorDot(ray_vector, plane_normal); |
| if (denom == 0) { |
| - // TODO(mthiesse): Line could be contained in the plane, do we care? |
| - return -std::numeric_limits<float>::infinity(); |
| + return false; |
| } |
| gvr::Vec3f rel; |
| rel.x = ray_origin.x - plane_origin.x; |
| rel.y = ray_origin.y - plane_origin.y; |
| rel.z = ray_origin.z - plane_origin.z; |
| - |
| - return -vr_shell::VectorDot(plane_normal, rel) / denom; |
| + *distance = -vr_shell::VectorDot(plane_normal, rel) / denom; |
| + return true; |
| } |
| } // namespace |
| -ReversibleTransform::ReversibleTransform() { |
| +Transform::Transform() { |
| MakeIdentity(); |
| } |
| -void ReversibleTransform::MakeIdentity() { |
| +void Transform::MakeIdentity() { |
| SetIdentityM(to_world); |
| - SetIdentityM(from_world); |
| - orientation.qx = orientation.qy = orientation.qz = 0.0f; |
| - orientation.qw = 1.0f; |
| } |
| -void ReversibleTransform::Rotate(gvr::Quatf quat) { |
| - orientation = QuatMultiply(quat, orientation); |
| - |
| +void Transform::Rotate(gvr::Quatf quat) { |
| // TODO(klausw): use specialized rotation code? Constructing the matrix |
| // via axis-angle quaternion is inefficient. |
| gvr::Mat4f forward = QuatToMatrix(quat); |
| to_world = MatrixMul(forward, to_world); |
| - gvr::Mat4f reverse = MatrixTranspose(forward); |
| - from_world = MatrixMul(from_world, reverse); |
| } |
| -void ReversibleTransform::Rotate(float ax, float ay, float az, float rad) { |
| - // TODO(klausw): use specialized rotation code? Constructing the matrix |
| - // via axis-angle quaternion is inefficient. |
| +void Transform::Rotate(float ax, float ay, float az, float rad) { |
| Rotate(QuatFromAxisAngle({ax, ay, az}, rad)); |
| } |
| -void ReversibleTransform::Translate(float tx, float ty, float tz) { |
| +void Transform::Translate(float tx, float ty, float tz) { |
| TranslateM(to_world, to_world, tx, ty, tz); |
| - TranslateMRight(from_world, from_world, -tx, -ty, -tz); |
| } |
| -void ReversibleTransform::Scale(float sx, float sy, float sz) { |
| +void Transform::Scale(float sx, float sy, float sz) { |
| ScaleM(to_world, to_world, sx, sy, sz); |
| - ScaleMRight(from_world, from_world, 1.0f / sx, 1.0f / sy, 1.0f / sz); |
| +} |
| + |
| +const gvr::Mat4f& WorldRectangle::TransformMatrix() const { |
| + return transform_.to_world; |
| +} |
| + |
| +void WorldRectangle::SetTransform(const Transform& transform) { |
| + transform_ = transform; |
| } |
| gvr::Vec3f WorldRectangle::GetCenter() const { |
| const gvr::Vec3f kOrigin = {0.0f, 0.0f, 0.0f}; |
| - return MatrixVectorMul(transform.to_world, kOrigin); |
| + return MatrixVectorMul(transform_.to_world, kOrigin); |
| +} |
| + |
| +gvr::Vec2f WorldRectangle::GetUnitRectangleCoordinates( |
| + const gvr::Vec3f& world_point) { |
| + const gvr::Mat4f& transform = transform_.to_world; |
| + gvr::Vec3f origin = MatrixVectorMul(transform, gvr::Vec3f({0, 0, 0})); |
| + gvr::Vec3f xAxis = MatrixVectorMul(transform, gvr::Vec3f({1, 0, 0})); |
| + gvr::Vec3f yAxis = MatrixVectorMul(transform, gvr::Vec3f({0, 1, 0})); |
| + xAxis = VectorSubtract(xAxis, origin); |
| + yAxis = VectorSubtract(yAxis, origin); |
| + gvr::Vec3f point = VectorSubtract(world_point, origin); |
| + |
| + float x = VectorDot(point, xAxis) / VectorDot(xAxis, xAxis); |
| + float y = VectorDot(point, yAxis) / VectorDot(yAxis, yAxis); |
| + return {x, y}; |
| } |
| gvr::Vec3f WorldRectangle::GetNormal() const { |
| const gvr::Vec3f kNormalOrig = {0.0f, 0.0f, -1.0f}; |
| - return MatrixVectorRotate(transform.to_world, kNormalOrig); |
| + return MatrixVectorRotate(transform_.to_world, kNormalOrig); |
| } |
| -float WorldRectangle::GetRayDistance(gvr::Vec3f ray_origin, |
| - gvr::Vec3f ray_vector) const { |
| - return GetRayPlaneIntersection(ray_origin, ray_vector, GetCenter(), |
| - GetNormal()); |
| +bool WorldRectangle::GetRayDistance(const gvr::Vec3f& ray_origin, |
| + const gvr::Vec3f& ray_vector, |
| + float* distance) const { |
| + return GetRayPlaneDistance(ray_origin, ray_vector, GetCenter(), GetNormal(), |
| + distance); |
| } |
| ContentRectangle::ContentRectangle() = default; |