root/OpenSceneGraph/trunk/src/osgPlugins/3ds/lib3ds/lib3ds_vector.c @ 10853

Revision 10853, 5.1 kB (checked in by robert, 4 years ago)

From Sukender,
"Here is our freshly baked 3DS reader/writer (named 'v0.5' to differentiate from previous one). Changes are against trunk rev. 10819.
Short changelog (from rev 10819):
- Added 3DS writer
- Sync'd with latest lib3DS
- Added options, especially "flattenMatrixTransforms" to get the "old" behaviour (else the reader correctly maps to OSG the transforms from the 3DS file).

What should be done:
- Check with pivot points, with and without "flattenMatrixTransforms" option.
- We ran tests on it, but we can never be 100% sure there is no bug. Testing from the community would of course be helpful."

RevLine 
[10853]1/*
2    Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
3    All rights reserved.
4   
5    This program is free  software: you can redistribute it and/or modify
6    it under the terms of the GNU Lesser General Public License as published
7    by the Free Software Foundation, either version 2.1 of the License, or
8    (at your option) any later version.
9
10    Thisprogram  is  distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13    GNU Lesser General Public License for more details.
14   
15    You should  have received a copy of the GNU Lesser General Public License
16    along with  this program; If not, see <http://www.gnu.org/licenses/>.
17*/
18#include "lib3ds_impl.h"
19
20
21void 
22lib3ds_vector_make(float c[3], float x, float y, float z) {
23    c[0] = x;
24    c[1] = y;
25    c[2] = z;
26}
27
28
29void
30lib3ds_vector_zero(float c[3]) {
31    int i;
32    for (i = 0; i < 3; ++i) {
33        c[i] = 0.0f;
34    }
35}
36
37
38void
39lib3ds_vector_copy(float dst[3], float src[3]) {
40    int i;
41    for (i = 0; i < 3; ++i) {
42        dst[i] = src[i];
43    }
44}
45
46
47/*!
48 * Add two vectors.
49 *
50 * \param c Result.
51 * \param a First addend.
52 * \param b Second addend.
53 */
54void
55lib3ds_vector_add(float c[3], float a[3], float b[3]) {
56    int i;
57    for (i = 0; i < 3; ++i) {
58        c[i] = a[i] + b[i];
59    }
60}
61
62
63/*!
64 * Subtract two vectors.
65 *
66 * \param c Result.
67 * \param a Addend.
68 * \param b Minuend.
69 */
70void
71lib3ds_vector_sub(float c[3], float a[3], float b[3]) {
72    int i;
73    for (i = 0; i < 3; ++i) {
74        c[i] = a[i] - b[i];
75    }
76}
77
78
79/*!
80 * Multiply a vector by a scalar.
81 *
82 * \param c Vector to be multiplied.
83 * \param k Scalar.
84 */
85void
86lib3ds_vector_scalar_mul(float c[3], float a[3], float k) {
87    int i;
88    for (i = 0; i < 3; ++i) {
89        c[i] = a[i] * k;
90    }
91}
92
93
94/*!
95 * Compute cross product.
96 *
97 * \param c Result.
98 * \param a First vector.
99 * \param b Second vector.
100 */
101void
102lib3ds_vector_cross(float c[3], float a[3], float b[3]) {
103    c[0] = a[1] * b[2] - a[2] * b[1];
104    c[1] = a[2] * b[0] - a[0] * b[2];
105    c[2] = a[0] * b[1] - a[1] * b[0];
106}
107
108
109/*!
110 * Compute dot product.
111 *
112 * \param a First vector.
113 * \param b Second vector.
114 *
115 * \return Dot product.
116 */
117float
118lib3ds_vector_dot(float a[3], float b[3]) {
119    return(a[0]*b[0] + a[1]*b[1] + a[2]*b[2]);
120}
121
122
123/*!
124 * Compute length of vector.
125 *
126 * Computes |c| = sqrt(x*x + y*y + z*z)
127 *
128 * \param c Vector to compute.
129 *
130 * \return Length of vector.
131 */
132float
133lib3ds_vector_length(float c[3]) {
134    return((float)sqrt(c[0]*c[0] + c[1]*c[1] + c[2]*c[2]));
135}
136
137
138/*!
139 * Normalize a vector.
140 *
141 * Scales a vector so that its length is 1.0.
142 *
143 * \param c Vector to normalize.
144 */
145void
146lib3ds_vector_normalize(float c[3]) {
147    float l, m;
148
149    l = (float)sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2]);
150    if (fabs(l) < LIB3DS_EPSILON) {
151        if ((c[0] >= c[1]) && (c[0] >= c[2])) {
152            c[0] = 1.0f;
153            c[1] = c[2] = 0.0f;
154        } else
155            if (c[1] >= c[2]) {
156                c[1] = 1.0f;
157                c[0] = c[2] = 0.0f;
158            } else {
159                c[2] = 1.0f;
160                c[0] = c[1] = 0.0f;
161            }
162    } else {
163        m = 1.0f / l;
164        c[0] *= m;
165        c[1] *= m;
166        c[2] *= m;
167    }
168}
169
170
171/*!
172 * Compute a vector normal to two line segments.
173 *
174 * Computes the normal vector to the lines b-a and b-c.
175 *
176 * \param n Returned normal vector.
177 * \param a Endpoint of first line.
178 * \param b Base point of both lines.
179 * \param c Endpoint of second line.
180 */
181void
182lib3ds_vector_normal(float n[3], float a[3], float b[3], float c[3]) {
183    float p[3], q[3];
184
185    lib3ds_vector_sub(p, c, b);
186    lib3ds_vector_sub(q, a, b);
187    lib3ds_vector_cross(n, p, q);
188    lib3ds_vector_normalize(n);
189}
190
191
192/*!
193 * Multiply a point by a transformation matrix.
194 *
195 * Applies the given transformation matrix to the given point.  With some
196 * transformation matrices, a vector may also be transformed.
197 *
198 * \param c Result.
199 * \param m Transformation matrix.
200 * \param a Input point.
201 */
202void
203lib3ds_vector_transform(float c[3], float m[4][4], float a[3]) {
204    c[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0];
205    c[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1];
206    c[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2];
207}
208
209
210/*!
211 * c[i] = min(c[i], a[i]);
212 *
213 * Computes minimum values of x,y,z independently.
214 */
215void
216lib3ds_vector_min(float c[3], float a[3]) {
217    int i;
218    for (i = 0; i < 3; ++i) {
219        if (a[i] < c[i]) {
220            c[i] = a[i];
221        }
222    }
223}
224
225
226/*!
227 * c[i] = max(c[i], a[i]);
228 *
229 * Computes maximum values of x,y,z independently.
230 */
231void
232lib3ds_vector_max(float c[3], float a[3]) {
233    int i;
234    for (i = 0; i < 3; ++i) {
235        if (a[i] > c[i]) {
236            c[i] = a[i];
237        }
238    }
239}
240
241
242void
243lib3ds_vector_dump(float c[3]) {
244    fprintf(stderr, "%f %f %f\n", c[0], c[1], c[2]);
245}
Note: See TracBrowser for help on using the browser.