14311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
24311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
34311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// found in the LICENSE file.
44311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
54311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#ifndef UI_GFX_BOX_F_H_
64311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#define UI_GFX_BOX_F_H_
74311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
84311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "ui/gfx/point3_f.h"
94311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "ui/gfx/vector3d_f.h"
104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochnamespace gfx {
124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// A 3d version of gfx::RectF, with the positive z-axis pointed towards
144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// the camera.
154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochclass UI_EXPORT BoxF {
164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch public:
174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  BoxF()
184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      : width_(0.f),
194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        height_(0.f),
204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        depth_(0.f) {}
214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  BoxF(float width, float height, float depth)
234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      : width_(width < 0 ? 0 : width),
244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        height_(height < 0 ? 0 : height),
254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        depth_(depth < 0 ? 0 : depth) {}
264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  BoxF(float x, float y, float z, float width, float height, float depth)
284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      : origin_(x, y, z),
294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        width_(width < 0 ? 0 : width),
304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        height_(height < 0 ? 0 : height),
314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        depth_(depth < 0 ? 0 : depth) {}
324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  BoxF(const Point3F& origin, float width, float height, float depth)
344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      : origin_(origin),
354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        width_(width < 0 ? 0 : width),
364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        height_(height < 0 ? 0 : height),
374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        depth_(depth < 0 ? 0 : depth) {}
384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ~BoxF() {}
404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Scales all three axes by the given scale.
424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void Scale(float scale) {
434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    Scale(scale, scale, scale);
444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Scales each axis by the corresponding given scale.
474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void Scale(float x_scale, float y_scale, float z_scale) {
484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    origin_.Scale(x_scale, y_scale, z_scale);
494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    set_size(width_ * x_scale, height_ * y_scale, depth_ * z_scale);
504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Moves the box by the specified distance in each dimension.
534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void operator+=(const Vector3dF& offset) {
544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    origin_ += offset;
554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Returns true if the box has no interior points.
584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  bool IsEmpty() const;
594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Computes the union of this box with the given box. The union is the
614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // smallest box that contains both boxes.
624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void Union(const BoxF& box);
634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  std::string ToString() const;
654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float x() const { return origin_.x(); }
674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void set_x(float x) { origin_.set_x(x); }
684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float y() const { return origin_.y(); }
704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void set_y(float y) { origin_.set_y(y); }
714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float z() const { return origin_.z(); }
734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void set_z(float z) { origin_.set_z(z); }
744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float width() const { return width_; }
764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void set_width(float width) { width_ = width < 0 ? 0 : width; }
774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float height() const { return height_; }
794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void set_height(float height) { height_ = height < 0 ? 0 : height; }
804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float depth() const { return depth_; }
824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void set_depth(float depth) { depth_ = depth < 0 ? 0 : depth; }
834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float right() const { return x() + width(); }
854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float bottom() const { return y() + height(); }
864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float front() const { return z() + depth(); }
874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void set_size(float width, float height, float depth) {
894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    width_ = width < 0 ? 0 : width;
904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    height_ = height < 0 ? 0 : height;
914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    depth_ = depth < 0 ? 0 : depth;
924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  const Point3F& origin() const { return origin_; }
954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void set_origin(const Point3F& origin) { origin_ = origin; }
964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch private:
984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  Point3F origin_;
994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float width_;
1004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float height_;
1014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  float depth_;
1024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch};
1034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochUI_EXPORT BoxF UnionBoxes(const BoxF& a, const BoxF& b);
1054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochinline BoxF ScaleBox(const BoxF& b,
1074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                     float x_scale,
1084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                     float y_scale,
1094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                     float z_scale) {
1104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return BoxF(b.x() * x_scale,
1114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.y() * y_scale,
1124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.z() * z_scale,
1134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.width() * x_scale,
1144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.height() * y_scale,
1154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.depth() * z_scale);
1164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
1174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochinline BoxF ScaleBox(const BoxF& b, float scale) {
1194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return ScaleBox(b, scale, scale, scale);
1204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
1214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochinline bool operator==(const BoxF& a, const BoxF& b) {
1234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return a.origin() == b.origin() && a.width() == b.width() &&
1244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch         a.height() == b.height() && a.depth() == b.depth();
1254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
1264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochinline bool operator!=(const BoxF& a, const BoxF& b) {
1284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return !(a == b);
1294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
1304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochinline BoxF operator+(const BoxF& b, const Vector3dF& v) {
1324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return BoxF(b.x() + v.x(),
1334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.y() + v.y(),
1344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.z() + v.z(),
1354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.width(),
1364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.height(),
1374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              b.depth());
1384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
1394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}  // namespace gfx
1414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#endif  // UI_GFX_BOX_F_H_
143