Vector.h revision d2dcd6fded3a036f334a88bf9593398833f2919a
1a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy/* 2a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * Copyright (C) 2010 The Android Open Source Project 3a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * 4a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * you may not use this file except in compliance with the License. 6a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * You may obtain a copy of the License at 7a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * 8a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * 10a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * Unless required by applicable law or agreed to in writing, software 11a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * See the License for the specific language governing permissions and 14a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy * limitations under the License. 15a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy */ 16a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 17a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy#ifndef ANDROID_HWUI_VECTOR_H 18a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy#define ANDROID_HWUI_VECTOR_H 19a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 20a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guynamespace android { 21a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guynamespace uirenderer { 22a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 23a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy/////////////////////////////////////////////////////////////////////////////// 24a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy// Classes 25a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy/////////////////////////////////////////////////////////////////////////////// 26a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 271aa5d2d7068147ff781cfe911a93f01593a68c79John Reck// MUST BE A POD - this means no ctor or dtor! 28a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guystruct Vector2 { 29a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy float x; 30a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy float y; 31a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 327b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui float lengthSquared() const { 337b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui return x * x + y * y; 347b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui } 357b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 36a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy float length() const { 37a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy return sqrt(x * x + y * y); 38a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 39a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 40a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy void operator+=(const Vector2& v) { 41a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy x += v.x; 42a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy y += v.y; 43a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 44a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 45a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy void operator-=(const Vector2& v) { 46a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy x -= v.x; 47a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy y -= v.y; 48a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 49a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 50a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy void operator+=(const float v) { 51a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy x += v; 52a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy y += v; 53a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 54a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 55a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy void operator-=(const float v) { 56a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy x -= v; 57a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy y -= v; 58a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 59a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 60a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy void operator/=(float s) { 61a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy x /= s; 62a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy y /= s; 63a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 64a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 65a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy void operator*=(float s) { 66a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy x *= s; 67a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy y *= s; 68a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 69a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 70a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy Vector2 operator+(const Vector2& v) const { 711aa5d2d7068147ff781cfe911a93f01593a68c79John Reck return (Vector2){x + v.x, y + v.y}; 72a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 73a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 74a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy Vector2 operator-(const Vector2& v) const { 751aa5d2d7068147ff781cfe911a93f01593a68c79John Reck return (Vector2){x - v.x, y - v.y}; 76a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 77a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 78a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy Vector2 operator/(float s) const { 791aa5d2d7068147ff781cfe911a93f01593a68c79John Reck return (Vector2){x / s, y / s}; 80a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 81a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 82a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy Vector2 operator*(float s) const { 831aa5d2d7068147ff781cfe911a93f01593a68c79John Reck return (Vector2){x * s, y * s}; 84a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 85a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 86a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy void normalize() { 87a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy float s = 1.0f / length(); 88a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy x *= s; 89a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy y *= s; 90a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 91a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 92a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy Vector2 copyNormalized() const { 931aa5d2d7068147ff781cfe911a93f01593a68c79John Reck Vector2 v = {x, y}; 94a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy v.normalize(); 95a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy return v; 96a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 97a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 98a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy float dot(const Vector2& v) const { 99a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy return x * v.x + y * v.y; 100a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 101a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 102d2dcd6fded3a036f334a88bf9593398833f2919aztenghui float cross(const Vector2& v) const { 103d2dcd6fded3a036f334a88bf9593398833f2919aztenghui return x * v.y - y * v.x; 104d2dcd6fded3a036f334a88bf9593398833f2919aztenghui } 105d2dcd6fded3a036f334a88bf9593398833f2919aztenghui 106a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy void dump() { 1075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("Vector2[%.2f, %.2f]", x, y); 108a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy } 109a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy}; // class Vector2 110a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 1111aa5d2d7068147ff781cfe911a93f01593a68c79John Reck// MUST BE A POD - this means no ctor or dtor! 112f57776b2d195f0937906eb88b777bb55ccc36967Chris Craikclass Vector3 { 113f57776b2d195f0937906eb88b777bb55ccc36967Chris Craikpublic: 114f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik float x; 115f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik float y; 116f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik float z; 117f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik 118d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui Vector3 operator+(const Vector3& v) const { 119d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui return (Vector3){x + v.x, y + v.y, z + v.z}; 120d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui } 121d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui 122d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui Vector3 operator-(const Vector3& v) const { 123d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui return (Vector3){x - v.x, y - v.y, z - v.z}; 124d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui } 125d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui 126d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui Vector3 operator/(float s) const { 127d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui return (Vector3){x / s, y / s, z / s}; 128d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui } 129d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui 130d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui Vector3 operator*(float s) const { 131d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui return (Vector3){x * s, y * s, z * s}; 132d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui } 133d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui 134d5e8ade498b41b42874273cbfa375aed7b4d6a08ztenghui 135b79a3e301a8d89b9e1b1f6f3d7fd6aa56610a6f0Chris Craik void dump() { 136b79a3e301a8d89b9e1b1f6f3d7fd6aa56610a6f0Chris Craik ALOGD("Vector3[%.2f, %.2f, %.2f]", x, y, z); 137b79a3e301a8d89b9e1b1f6f3d7fd6aa56610a6f0Chris Craik } 138f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik}; 139f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik 140a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy}; // namespace uirenderer 141a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy}; // namespace android 142a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 143a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy#endif // ANDROID_HWUI_VECTOR_H 144