source: trunk/packages/vizservers/nanovis/vrmath/include/vrmath/Vector4f.h @ 3627

Last change on this file since 3627 was 3627, checked in by ldelgass, 7 years ago

Use vrmath::Color4f for color where appropriate

  • Property svn:eol-style set to native
File size: 4.1 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * Copyright (c) 2004-2013  HUBzero Foundation, LLC
4 *
5 * Author: Insoo Woo <iwoo@purdue.edu>
6 */
7#ifndef VRVECTOR4F_H
8#define VRVECTOR4F_H
9
10#include <vrmath/Vector3f.h>
11#include <vrmath/Vector4f.h>
12
13namespace vrmath {
14
15class Vector4f
16{
17public:
18    Vector4f() :
19        x(0.0f), y(0.0f), z(0.0f), w(0.0f)
20    {}
21
22    Vector4f(const Vector4f& other) :
23        x(other.x), y(other.y), z(other.z), w(other.w)
24    {}
25
26    Vector4f(const Vector3f& v3, float w1) :
27        x(v3.x), y(v3.y), z(v3.z), w(w1)
28    {}
29
30    Vector4f(float x1, float y1, float z1, float w1) :
31        x(x1), y(y1), z(z1), w(w1)
32    {}
33
34    void set(float x1, float y1, float z1, float w1);
35 
36    void set(const Vector3f& v, float w);
37
38    void set(const Vector4f& v4);
39
40    Vector4f& operator=(const Vector4f& other)
41    {
42        set(other.x, other.y, other.z, other.w);
43        return *this;
44    }
45
46    bool operator==(const Vector4f& op2) const
47    {
48        return (x == op2.x && y == op2.y && z == op2.z && w == op2.w);
49    }
50
51    Vector4f operator+(const Vector4f& op2) const
52    {
53        return Vector4f(x + op2.x, y + op2.y, z + op2.z, w + op2.w);
54    }
55
56    Vector4f operator-(const Vector4f& op2) const
57    {
58        return Vector4f(x - op2.x, y - op2.y, z - op2.z, w - op2.w);
59    }
60
61    float operator*(const Vector4f& op2) const
62    {
63        return (x * op2.x) + (y * op2.y) + (z * op2.z) + (w * op2.w);
64    }
65
66    Vector4f operator*(float op2) const
67    {
68        return Vector4f(x * op2, y * op2, z * op2, w * op2);
69    }
70
71    Vector4f operator/(float op2) const
72    {
73        return Vector4f(x / op2, y / op2, z / op2, w / op2);
74    }
75
76    void divideByW();
77
78    float dot(const Vector4f& vec) const;
79
80    union {
81        struct {
82            float x, y, z, w;
83        };
84        struct {
85            float r, g, b, a;
86        };
87    };
88};
89
90inline void Vector4f::divideByW()
91{
92    if (w != 0) {
93        x /= w; y /= w; z /= w;
94        w = 1.0f;
95    }
96}
97
98inline void Vector4f::set(float x1, float y1, float z1, float w1)
99{
100    x = x1;
101    y = y1;
102    z = z1;
103    w = w1;
104}
105
106inline void Vector4f::set(const Vector4f& v4)
107{
108    x = v4.x;
109    y = v4.y;
110    z = v4.z;
111    w = v4.w;
112}
113
114inline void Vector4f::set(const Vector3f& v, float w1)
115{
116    x = v.x;
117    y = v.y;
118    z = v.z;
119    w = w1;
120}
121
122inline float Vector4f::dot(const Vector4f& vec) const
123{
124    return (x * vec.x + y * vec.y + z * vec.z + w * vec.w);
125}
126
127/**
128 * \brief Linear interpolation of 2 points
129 */
130inline Vector4f vlerp(const Vector4f& v1, const Vector4f& v2, double t)
131{
132    return Vector4f(v1.x * (1.0-t) + v2.x * t,
133                    v1.y * (1.0-t) + v2.y * t,
134                    v1.z * (1.0-t) + v2.z * t,
135                    v1.w * (1.0-t) + v2.w * t);
136}
137
138/**
139 * \brief Finds the intersection of a line through
140 * p1 and p2 with the given plane.
141 *
142 * If the line lies in the plane, an arbitrary
143 * point on the line is returned.
144 *
145 * Reference:
146 * http://astronomy.swin.edu.au/pbourke/geometry/planeline/
147 *
148 * \param[in] pt1 First point
149 * \param[in] pt2 Second point
150 * \param[in] plane Plane equation coefficients
151 * \param[out] ret Point of intersection if a solution was found
152 * \return Bool indicating if an intersection was found
153 */
154inline bool 
155planeLineIntersection(const Vector4f& pt1, const Vector4f& pt2,
156                      const Vector4f& plane, Vector4f& ret)
157{
158    float a = plane.x;
159    float b = plane.y;
160    float c = plane.z;
161    float d = plane.w;
162
163    Vector4f p1 = pt1;
164    float x1 = p1.x;
165    float y1 = p1.y;
166    float z1 = p1.z;
167
168    Vector4f p2 = pt2;
169    float x2 = p2.x;
170    float y2 = p2.y;
171    float z2 = p2.z;
172
173    float uDenom = a * (x1 - x2) + b * (y1 - y2) + c * (z1 - z2);
174    float uNumer = a * x1 + b * y1 + c * z1 + d;
175
176    if (uDenom == 0.0f) {
177        // Plane parallel to line
178        if (uNumer == 0.0f) {
179            // Line within plane
180            ret = p1;
181            return true;
182        }
183        // No solution
184        return false;
185    }
186
187    float u = uNumer / uDenom;
188    ret.x = x1 + u * (x2 - x1);
189    ret.y = y1 + u * (y2 - y1);
190    ret.z = z1 + u * (z2 - z1);
191    ret.w = 1;
192    return true;
193}
194
195}
196
197#endif
Note: See TracBrowser for help on using the repository browser.