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

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

Refactor and cleanups in nanovis, mainly to switch to using STL hash tables
(TR1 required) instead of Tcl hash tables, split out Flow particles and boxes
to separate implementation files. The goal is to achieve better separation of
Tcl command parsing and the core graphics rendering objects and code.

  • Property svn:eol-style set to native
File size: 4.0 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    bool operator==(const Vector4f& op2) const
41    {
42        return (x == op2.x && y == op2.y && z == op2.z && w == op2.w);
43    }
44
45    Vector4f operator+(const Vector4f& op2) const
46    {
47        return Vector4f(x + op2.x, y + op2.y, z + op2.z, w + op2.w);
48    }
49
50    Vector4f operator-(const Vector4f& op2) const
51    {
52        return Vector4f(x - op2.x, y - op2.y, z - op2.z, w - op2.w);
53    }
54
55    float operator*(const Vector4f& op2) const
56    {
57        return (x * op2.x) + (y * op2.y) + (z * op2.z) + (w * op2.w);
58    }
59
60    Vector4f operator*(float op2) const
61    {
62        return Vector4f(x * op2, y * op2, z * op2, w * op2);
63    }
64
65    Vector4f operator/(float op2) const
66    {
67        return Vector4f(x / op2, y / op2, z / op2, w / op2);
68    }
69
70    void divideByW();
71
72    float dot(const Vector4f& vec) const;
73
74    union {
75        struct {
76            float x, y, z, w;
77        };
78        struct {
79            float r, g, b, a;
80        };
81    };
82};
83
84inline void Vector4f::divideByW()
85{
86    if (w != 0) {
87        x /= w; y /= w; z /= w;
88        w = 1.0f;
89    }
90}
91
92inline void Vector4f::set(float x1, float y1, float z1, float w1)
93{
94    x = x1;
95    y = y1;
96    z = z1;
97    w = w1;
98}
99
100inline void Vector4f::set(const Vector4f& v4)
101{
102    x = v4.x;
103    y = v4.y;
104    z = v4.z;
105    w = v4.w;
106}
107
108inline void Vector4f::set(const Vector3f& v, float w1)
109{
110    x = v.x;
111    y = v.y;
112    z = v.z;
113    w = w1;
114}
115
116inline float Vector4f::dot(const Vector4f& vec) const
117{
118    return (x * vec.x + y * vec.y + z * vec.z + w * vec.w);
119}
120
121/**
122 * \brief Linear interpolation of 2 points
123 */
124inline Vector4f vlerp(const Vector4f& v1, const Vector4f& v2, double t)
125{
126    return Vector4f(v1.x * (1.0-t) + v2.x * t,
127                    v1.y * (1.0-t) + v2.y * t,
128                    v1.z * (1.0-t) + v2.z * t,
129                    v1.w * (1.0-t) + v2.w * t);
130}
131
132/**
133 * \brief Finds the intersection of a line through
134 * p1 and p2 with the given plane.
135 *
136 * If the line lies in the plane, an arbitrary
137 * point on the line is returned.
138 *
139 * Reference:
140 * http://astronomy.swin.edu.au/pbourke/geometry/planeline/
141 *
142 * \param[in] pt1 First point
143 * \param[in] pt2 Second point
144 * \param[in] plane Plane equation coefficients
145 * \param[out] ret Point of intersection if a solution was found
146 * \return Bool indicating if an intersection was found
147 */
148inline bool 
149planeLineIntersection(const Vector4f& pt1, const Vector4f& pt2,
150                      const Vector4f& plane, Vector4f& ret)
151{
152    float a = plane.x;
153    float b = plane.y;
154    float c = plane.z;
155    float d = plane.w;
156
157    Vector4f p1 = pt1;
158    float x1 = p1.x;
159    float y1 = p1.y;
160    float z1 = p1.z;
161
162    Vector4f p2 = pt2;
163    float x2 = p2.x;
164    float y2 = p2.y;
165    float z2 = p2.z;
166
167    float uDenom = a * (x1 - x2) + b * (y1 - y2) + c * (z1 - z2);
168    float uNumer = a * x1 + b * y1 + c * z1 + d;
169
170    if (uDenom == 0.0f) {
171        // Plane parallel to line
172        if (uNumer == 0.0f) {
173            // Line within plane
174            ret = p1;
175            return true;
176        }
177        // No solution
178        return false;
179    }
180
181    float u = uNumer / uDenom;
182    ret.x = x1 + u * (x2 - x1);
183    ret.y = y1 + u * (y2 - y1);
184    ret.z = z1 + u * (z2 - z1);
185    ret.w = 1;
186    return true;
187}
188
189}
190
191#endif
Note: See TracBrowser for help on using the repository browser.