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