rmath3d 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog +4 -0
- data/LICENSE.txt +1 -1
- data/README.md +5 -3
- data/ext/rmath3d/RMath3D.h +2 -0
- data/ext/rmath3d/RMtx2.c +255 -0
- data/ext/rmath3d/RMtx2.h +88 -0
- data/ext/rmath3d/RVec2.c +167 -0
- data/ext/rmath3d/RVec2.h +80 -0
- data/ext/rmath3d/rmath3d.c +3575 -1811
- data/lib/rmath3d/rmath3d_plain.rb +1886 -1015
- data/test/test.rb +2 -0
- data/test/test_RMtx2.rb +363 -0
- data/test/test_RVec2.rb +187 -0
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb1e762ea46c80e060d6efdcaf6db861e6ad2ffc
|
4
|
+
data.tar.gz: c4cbac65664fd3c54d08ca66dd9e207a9f3384b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf14364015645a9631a9e57c6c54279a93090f2bb8ed7470bfd75795e04cfdb2ca519aceaaeaf9f10d19caf5909b1e7a71645cd4237bd563236dc788c93b8081
|
7
|
+
data.tar.gz: 158e3a7d837715897afadf073c644aa10fa7dbd3b9fc735bdf6c1d5bbd029f6637fb82e0731d9806109bc9c7122f39d7ac8113fe84a01a681956e5854f52f8bd
|
data/ChangeLog
CHANGED
data/LICENSE.txt
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
rmath3d : Ruby math module for 3D Applications
|
2
|
-
Copyright (c) 2008-
|
2
|
+
Copyright (c) 2008-2015 vaiorabbit <http://twitter.com/vaiorabbit>
|
3
3
|
|
4
4
|
This software is provided 'as-is', without any express or implied
|
5
5
|
warranty. In no event will the authors be held liable for any damages
|
data/README.md
CHANGED
@@ -4,18 +4,20 @@
|
|
4
4
|
|
5
5
|
rmath3d is a math module for 3D game programming and computer graphics.
|
6
6
|
|
7
|
-
* Last Update:
|
7
|
+
* Last Update: Apr 12, 2015
|
8
8
|
* Since: Jul 20, 2008
|
9
9
|
|
10
10
|
## Features ##
|
11
11
|
|
12
12
|
### Supports frequently-used vector and matrix classes ###
|
13
13
|
|
14
|
+
* RMtx2 (2x2 matrix)
|
14
15
|
* RMtx3 (3x3 matrix)
|
15
16
|
* RMtx4 (4x4 matrix)
|
16
17
|
* RQuat (Quaternion)
|
17
|
-
*
|
18
|
-
*
|
18
|
+
* RVec2 (2-element vector)
|
19
|
+
* RVec3 (3-element vector)
|
20
|
+
* RVec4 (4-element vector)
|
19
21
|
|
20
22
|
### Two implementations that are interchangeable with each other ###
|
21
23
|
|
data/ext/rmath3d/RMath3D.h
CHANGED
data/ext/rmath3d/RMtx2.c
ADDED
@@ -0,0 +1,255 @@
|
|
1
|
+
#include <math.h>
|
2
|
+
#include <string.h>
|
3
|
+
|
4
|
+
#include "RVec2.h"
|
5
|
+
#include "RMtx2.h"
|
6
|
+
|
7
|
+
/* NOTE : column-major */
|
8
|
+
#define SET_ELEMENT(out, row, col, val) (out)->e[(col)*2+(row)] = (val)
|
9
|
+
#define GET_ELEMENT(in, row, col) ((in)->e[(col)*2+(row)])
|
10
|
+
|
11
|
+
void
|
12
|
+
RMtx2SetElement( RMtx2* out, int row, int col, rmReal e )
|
13
|
+
{
|
14
|
+
SET_ELEMENT( out, row, col, e );
|
15
|
+
}
|
16
|
+
|
17
|
+
rmReal
|
18
|
+
RMtx2GetElement( const RMtx2* in, int row, int col )
|
19
|
+
{
|
20
|
+
return GET_ELEMENT( in, row, col );
|
21
|
+
}
|
22
|
+
|
23
|
+
void
|
24
|
+
RMtx2GetRow( RVec2* out, const RMtx2* in, int row )
|
25
|
+
{
|
26
|
+
RVec2SetX( out, GET_ELEMENT( in, row, 0 ) );
|
27
|
+
RVec2SetY( out, GET_ELEMENT( in, row, 1 ) );
|
28
|
+
}
|
29
|
+
|
30
|
+
void
|
31
|
+
RMtx2GetColumn( RVec2* out, const RMtx2* in, int col )
|
32
|
+
{
|
33
|
+
RVec2SetX( out, GET_ELEMENT( in, 0, col ) );
|
34
|
+
RVec2SetY( out, GET_ELEMENT( in, 1, col ) );
|
35
|
+
}
|
36
|
+
|
37
|
+
void
|
38
|
+
RMtx2SetRow( RMtx2* out, const RVec2* in, int row )
|
39
|
+
{
|
40
|
+
SET_ELEMENT( out, row, 0, RVec2GetElement( in, 0 ) );
|
41
|
+
SET_ELEMENT( out, row, 1, RVec2GetElement( in, 1 ) );
|
42
|
+
}
|
43
|
+
|
44
|
+
void
|
45
|
+
RMtx2SetColumn( RMtx2* out, const RVec2* in, int col )
|
46
|
+
{
|
47
|
+
SET_ELEMENT( out, 0, col, RVec2GetElement( in, 0 ) );
|
48
|
+
SET_ELEMENT( out, 1, col, RVec2GetElement( in, 1 ) );
|
49
|
+
}
|
50
|
+
|
51
|
+
void
|
52
|
+
RMtx2Copy( RMtx2* out, const RMtx2* in )
|
53
|
+
{
|
54
|
+
memmove( out, in, sizeof(RMtx2) );
|
55
|
+
}
|
56
|
+
|
57
|
+
void
|
58
|
+
RMtx2SetElements( RMtx2* out,
|
59
|
+
rmReal e00, rmReal e01,
|
60
|
+
rmReal e10, rmReal e11
|
61
|
+
)
|
62
|
+
{
|
63
|
+
SET_ELEMENT( out, 0, 0, e00 );
|
64
|
+
SET_ELEMENT( out, 0, 1, e01 );
|
65
|
+
|
66
|
+
SET_ELEMENT( out, 1, 0, e10 );
|
67
|
+
SET_ELEMENT( out, 1, 1, e11 );
|
68
|
+
}
|
69
|
+
|
70
|
+
void
|
71
|
+
RMtx2Zero( RMtx2* out )
|
72
|
+
{
|
73
|
+
int row, col;
|
74
|
+
for ( row = 0; row < 2; ++row )
|
75
|
+
for ( col = 0; col < 2; ++col )
|
76
|
+
SET_ELEMENT( out, row, col, 0.0f );
|
77
|
+
}
|
78
|
+
|
79
|
+
void
|
80
|
+
RMtx2Identity( RMtx2* out )
|
81
|
+
{
|
82
|
+
int row, col;
|
83
|
+
for ( row = 0; row < 2; ++row )
|
84
|
+
for ( col = 0; col < 2; ++col )
|
85
|
+
SET_ELEMENT( out, row, col, (row==col) ? 1.0f : 0.0f );
|
86
|
+
}
|
87
|
+
|
88
|
+
rmReal
|
89
|
+
RMtx2Determinant( const RMtx2* in )
|
90
|
+
{
|
91
|
+
#define I( r, c ) GET_ELEMENT( in, (r), (c) )
|
92
|
+
#define D( e00, e01, e10, e11 ) ((e00)*(e11)-(e01)*(e10))
|
93
|
+
|
94
|
+
return D( I(0,0), I(0,1), I(1,0), I(1,1) );
|
95
|
+
|
96
|
+
#undef I
|
97
|
+
#undef D
|
98
|
+
}
|
99
|
+
|
100
|
+
void
|
101
|
+
RMtx2Transpose( RMtx2* out, const RMtx2* in )
|
102
|
+
{
|
103
|
+
int row, col;
|
104
|
+
RMtx2 tmp;
|
105
|
+
for ( row = 0; row < 2; ++row )
|
106
|
+
for ( col = 0; col < 2; ++col )
|
107
|
+
SET_ELEMENT( &tmp, row, col, GET_ELEMENT( in, col, row ) );
|
108
|
+
|
109
|
+
RMtx2Copy( out, &tmp );
|
110
|
+
}
|
111
|
+
|
112
|
+
rmReal
|
113
|
+
RMtx2Inverse( RMtx2* out, const RMtx2* in )
|
114
|
+
{
|
115
|
+
#define I( r, c ) GET_ELEMENT( in, (r), (c) )
|
116
|
+
#define R( r, c ) GET_ELEMENT( &result, (r), (c) )
|
117
|
+
#define D( e00, e01, e10, e11 ) ((e00)*(e11)-(e01)*(e10))
|
118
|
+
|
119
|
+
RMtx2 result;
|
120
|
+
rmReal det;
|
121
|
+
|
122
|
+
det = D( I(0,0), I(0,1), I(1,0), I(1,1) );
|
123
|
+
|
124
|
+
if ( rmFabs(det) < RMATH_TOLERANCE )
|
125
|
+
return det;
|
126
|
+
|
127
|
+
SET_ELEMENT( &result, 0, 0, I(1,1) );
|
128
|
+
SET_ELEMENT( &result, 0, 1, -I(0,1) );
|
129
|
+
|
130
|
+
SET_ELEMENT( &result, 1, 0, -I(1,0) );
|
131
|
+
SET_ELEMENT( &result, 1, 1, I(0,0) );
|
132
|
+
|
133
|
+
RMtx2Scale( out, &result, 1.0f / det );
|
134
|
+
|
135
|
+
return det;
|
136
|
+
|
137
|
+
#undef I
|
138
|
+
#undef R
|
139
|
+
#undef D
|
140
|
+
}
|
141
|
+
|
142
|
+
|
143
|
+
/* http://en.wikipedia.org/wiki/Rotation_representation_%28mathematics%29
|
144
|
+
http://en.wikipedia.org/wiki/Rotation_matrix
|
145
|
+
*/
|
146
|
+
void
|
147
|
+
RMtx2Rotation( RMtx2* out, rmReal radian )
|
148
|
+
{
|
149
|
+
rmReal s = rmSin( radian );
|
150
|
+
rmReal c = rmCos( radian );
|
151
|
+
|
152
|
+
RMtx2Identity( out );
|
153
|
+
SET_ELEMENT( out, 0, 0, c );
|
154
|
+
SET_ELEMENT( out, 0, 1, -s );
|
155
|
+
SET_ELEMENT( out, 1, 0, s );
|
156
|
+
SET_ELEMENT( out, 1, 1, c );
|
157
|
+
}
|
158
|
+
|
159
|
+
void
|
160
|
+
RMtx2Scaling( RMtx2* out, rmReal sx, rmReal sy )
|
161
|
+
{
|
162
|
+
RMtx2Identity( out );
|
163
|
+
SET_ELEMENT( out, 0, 0, sx );
|
164
|
+
SET_ELEMENT( out, 1, 1, sy );
|
165
|
+
}
|
166
|
+
|
167
|
+
|
168
|
+
int
|
169
|
+
RMtx2Equal( const RMtx2* m1, const RMtx2* m2 )
|
170
|
+
{
|
171
|
+
if ( 0 == memcmp( m1, m2, sizeof(RMtx2) ) )
|
172
|
+
return !0;
|
173
|
+
else
|
174
|
+
return 0;
|
175
|
+
}
|
176
|
+
|
177
|
+
|
178
|
+
void
|
179
|
+
RMtx2Add( RMtx2* out, const RMtx2* m1, const RMtx2* m2 )
|
180
|
+
{
|
181
|
+
int row, col;
|
182
|
+
RMtx2 tmp;
|
183
|
+
for ( row = 0; row < 2; ++row )
|
184
|
+
for ( col = 0; col < 2; ++col )
|
185
|
+
SET_ELEMENT( &tmp, row, col,
|
186
|
+
GET_ELEMENT( m1, row, col ) + GET_ELEMENT( m2, row, col ) );
|
187
|
+
|
188
|
+
RMtx2Copy( out, &tmp );
|
189
|
+
}
|
190
|
+
|
191
|
+
void
|
192
|
+
RMtx2Sub( RMtx2* out, const RMtx2* m1, const RMtx2* m2 )
|
193
|
+
{
|
194
|
+
int row, col;
|
195
|
+
for ( row = 0; row < 2; ++row )
|
196
|
+
for ( col = 0; col < 2; ++col )
|
197
|
+
SET_ELEMENT( out, row, col,
|
198
|
+
GET_ELEMENT( m1, row, col ) - GET_ELEMENT( m2, row, col ) );
|
199
|
+
}
|
200
|
+
|
201
|
+
void
|
202
|
+
RMtx2Mul( RMtx2* out, const RMtx2* m1, const RMtx2* m2 )
|
203
|
+
{
|
204
|
+
int row, col;
|
205
|
+
RMtx2 tmp;
|
206
|
+
for ( row = 0; row < 2; ++row )
|
207
|
+
{
|
208
|
+
for ( col = 0; col < 2; ++col )
|
209
|
+
{
|
210
|
+
int i;
|
211
|
+
rmReal sum = 0.0f;
|
212
|
+
for ( i = 0; i < 2; ++i )
|
213
|
+
{
|
214
|
+
sum += GET_ELEMENT( m1, row, i ) * GET_ELEMENT( m2, i, col );
|
215
|
+
}
|
216
|
+
SET_ELEMENT( &tmp, row, col, sum );
|
217
|
+
}
|
218
|
+
}
|
219
|
+
|
220
|
+
RMtx2Copy( out, &tmp );
|
221
|
+
}
|
222
|
+
|
223
|
+
void
|
224
|
+
RMtx2Scale( RMtx2* out, const RMtx2* m, rmReal f )
|
225
|
+
{
|
226
|
+
int row, col;
|
227
|
+
for ( row = 0; row < 2; ++row )
|
228
|
+
for ( col = 0; col < 2; ++col )
|
229
|
+
SET_ELEMENT( out, row, col,
|
230
|
+
GET_ELEMENT( m, row, col ) * f );
|
231
|
+
}
|
232
|
+
|
233
|
+
/*
|
234
|
+
RMath : Ruby math module for 3D Applications
|
235
|
+
Copyright (c) 2008- vaiorabbit <http://twitter.com/vaiorabbit>
|
236
|
+
|
237
|
+
This software is provided 'as-is', without any express or implied
|
238
|
+
warranty. In no event will the authors be held liable for any damages
|
239
|
+
arising from the use of this software.
|
240
|
+
|
241
|
+
Permission is granted to anyone to use this software for any purpose,
|
242
|
+
including commercial applications, and to alter it and redistribute it
|
243
|
+
freely, subject to the following restrictions:
|
244
|
+
|
245
|
+
1. The origin of this software must not be misrepresented; you must not
|
246
|
+
claim that you wrote the original software. If you use this software
|
247
|
+
in a product, an acknowledgment in the product documentation would be
|
248
|
+
appreciated but is not required.
|
249
|
+
|
250
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
251
|
+
misrepresented as being the original software.
|
252
|
+
|
253
|
+
3. This notice may not be removed or altered from any source
|
254
|
+
distribution.
|
255
|
+
*/
|
data/ext/rmath3d/RMtx2.h
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
/* -*- C -*- */
|
2
|
+
#ifndef RMATHMTX2_H_INCLUDED
|
3
|
+
#define RMATHMTX2_H_INCLUDED
|
4
|
+
|
5
|
+
#include "RType.h"
|
6
|
+
|
7
|
+
struct RVec2;
|
8
|
+
|
9
|
+
typedef struct RMtx2
|
10
|
+
{
|
11
|
+
union
|
12
|
+
{
|
13
|
+
/* NOTE : column-major */
|
14
|
+
struct
|
15
|
+
{
|
16
|
+
rmReal e00, e10;
|
17
|
+
rmReal e01, e11;
|
18
|
+
};
|
19
|
+
rmReal e[4];
|
20
|
+
};
|
21
|
+
} RMtx2;
|
22
|
+
|
23
|
+
#ifdef __cplusplus
|
24
|
+
extern "C" {
|
25
|
+
#endif
|
26
|
+
|
27
|
+
void RMtx2SetElements( RMtx2* out,
|
28
|
+
rmReal e00, rmReal e01,
|
29
|
+
rmReal e10, rmReal e11
|
30
|
+
);
|
31
|
+
|
32
|
+
void RMtx2SetElement( RMtx2* out, int row, int col, rmReal e );
|
33
|
+
rmReal RMtx2GetElement( const RMtx2* in, int row, int col );
|
34
|
+
|
35
|
+
void RMtx2GetRow( struct RVec2* out, const RMtx2* in, int row );
|
36
|
+
void RMtx2GetColumn( struct RVec2* out, const RMtx2* in, int col );
|
37
|
+
|
38
|
+
void RMtx2SetRow( struct RMtx2* out, const RVec2* in, int row );
|
39
|
+
void RMtx2SetColumn( struct RMtx2* out, const RVec2* in, int col );
|
40
|
+
|
41
|
+
void RMtx2Copy( RMtx2* out, const RMtx2* in );
|
42
|
+
|
43
|
+
void RMtx2Zero( RMtx2* out );
|
44
|
+
void RMtx2Identity( RMtx2* out );
|
45
|
+
rmReal RMtx2Determinant( const RMtx2* in );
|
46
|
+
void RMtx2Transpose( RMtx2* out, const RMtx2* in );
|
47
|
+
rmReal RMtx2Inverse( RMtx2* out, const RMtx2* in );
|
48
|
+
|
49
|
+
void RMtx2Rotation( RMtx2* out, rmReal radian );
|
50
|
+
void RMtx2Scaling( RMtx2* out, rmReal sx, rmReal sy );
|
51
|
+
|
52
|
+
int RMtx2Equal( const RMtx2* m1, const RMtx2* m2 );
|
53
|
+
|
54
|
+
void RMtx2Add( RMtx2* out, const RMtx2* m1, const RMtx2* m2 );
|
55
|
+
void RMtx2Sub( RMtx2* out, const RMtx2* m1, const RMtx2* m2 );
|
56
|
+
void RMtx2Mul( RMtx2* out, const RMtx2* m1, const RMtx2* m2 );
|
57
|
+
void RMtx2Scale( RMtx2* out, const RMtx2* m, rmReal f );
|
58
|
+
|
59
|
+
#ifdef __cplusplus
|
60
|
+
}
|
61
|
+
#endif
|
62
|
+
|
63
|
+
|
64
|
+
#endif
|
65
|
+
|
66
|
+
/*
|
67
|
+
RMath : Ruby math module for 3D Applications
|
68
|
+
Copyright (c) 2008- vaiorabbit <http://twitter.com/vaiorabbit>
|
69
|
+
|
70
|
+
This software is provided 'as-is', without any express or implied
|
71
|
+
warranty. In no event will the authors be held liable for any damages
|
72
|
+
arising from the use of this software.
|
73
|
+
|
74
|
+
Permission is granted to anyone to use this software for any purpose,
|
75
|
+
including commercial applications, and to alter it and redistribute it
|
76
|
+
freely, subject to the following restrictions:
|
77
|
+
|
78
|
+
1. The origin of this software must not be misrepresented; you must not
|
79
|
+
claim that you wrote the original software. If you use this software
|
80
|
+
in a product, an acknowledgment in the product documentation would be
|
81
|
+
appreciated but is not required.
|
82
|
+
|
83
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
84
|
+
misrepresented as being the original software.
|
85
|
+
|
86
|
+
3. This notice may not be removed or altered from any source
|
87
|
+
distribution.
|
88
|
+
*/
|
data/ext/rmath3d/RVec2.c
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
#include <math.h>
|
2
|
+
#include <string.h>
|
3
|
+
|
4
|
+
#include "RVec2.h"
|
5
|
+
#include "RMtx2.h"
|
6
|
+
|
7
|
+
#define SET_ELEMENT( out, at, f )
|
8
|
+
|
9
|
+
void
|
10
|
+
RVec2SetElement( RVec2* out, int at, rmReal f )
|
11
|
+
{
|
12
|
+
out->e[at] = f;
|
13
|
+
}
|
14
|
+
|
15
|
+
void
|
16
|
+
RVec2SetX( RVec2* out, rmReal x )
|
17
|
+
{
|
18
|
+
out->x = x;
|
19
|
+
}
|
20
|
+
|
21
|
+
void
|
22
|
+
RVec2SetY( RVec2* out, rmReal y )
|
23
|
+
{
|
24
|
+
out->y = y;
|
25
|
+
}
|
26
|
+
|
27
|
+
void
|
28
|
+
RVec2SetElements( RVec2* out, rmReal x, rmReal y )
|
29
|
+
{
|
30
|
+
RVec2SetX( out, x );
|
31
|
+
RVec2SetY( out, y );
|
32
|
+
}
|
33
|
+
|
34
|
+
rmReal
|
35
|
+
RVec2GetElement( const RVec2* in, int at )
|
36
|
+
{
|
37
|
+
return in->e[at];
|
38
|
+
}
|
39
|
+
|
40
|
+
rmReal
|
41
|
+
RVec2GetX( const RVec2* in )
|
42
|
+
{
|
43
|
+
return in->x;
|
44
|
+
}
|
45
|
+
|
46
|
+
rmReal
|
47
|
+
RVec2GetY( const RVec2* in )
|
48
|
+
{
|
49
|
+
return in->y;
|
50
|
+
}
|
51
|
+
|
52
|
+
int
|
53
|
+
RVec2Equal( const RVec2* v1, const RVec2* v2 )
|
54
|
+
{
|
55
|
+
if ( 0 == memcmp( v1, v2, sizeof(RVec2) ) )
|
56
|
+
return !0;
|
57
|
+
else
|
58
|
+
return 0;
|
59
|
+
}
|
60
|
+
|
61
|
+
void
|
62
|
+
RVec2Add( RVec2* out, const RVec2* v1, const RVec2* v2 )
|
63
|
+
{
|
64
|
+
out->x = v1->x + v2->x;
|
65
|
+
out->y = v1->y + v2->y;
|
66
|
+
}
|
67
|
+
|
68
|
+
void
|
69
|
+
RVec2Sub( RVec2* out, const RVec2* v1, const RVec2* v2 )
|
70
|
+
{
|
71
|
+
out->x = v1->x - v2->x;
|
72
|
+
out->y = v1->y - v2->y;
|
73
|
+
}
|
74
|
+
|
75
|
+
void
|
76
|
+
RVec2Scale( RVec2* out, const RVec2* in, rmReal f )
|
77
|
+
{
|
78
|
+
out->x = in->x * f;
|
79
|
+
out->y = in->y * f;
|
80
|
+
}
|
81
|
+
|
82
|
+
rmReal
|
83
|
+
RVec2Cross( const RVec2* v1, const RVec2* v2 )
|
84
|
+
{
|
85
|
+
rmReal v1x, v1y, v2x, v2y;
|
86
|
+
|
87
|
+
v1x = v1->x;
|
88
|
+
v1y = v1->y;
|
89
|
+
v2x = v2->x;
|
90
|
+
v2y = v2->y;
|
91
|
+
|
92
|
+
return v1x*v2y - v1y*v2x;
|
93
|
+
}
|
94
|
+
|
95
|
+
rmReal
|
96
|
+
RVec2LengthSq( const RVec2* in )
|
97
|
+
{
|
98
|
+
return in->x*in->x + in->y*in->y;
|
99
|
+
}
|
100
|
+
|
101
|
+
rmReal
|
102
|
+
RVec2Length( const RVec2* in )
|
103
|
+
{
|
104
|
+
return rmSqrt( in->x*in->x + in->y*in->y );
|
105
|
+
}
|
106
|
+
|
107
|
+
rmReal
|
108
|
+
RVec2Dot( const RVec2* v1, const RVec2* v2 )
|
109
|
+
{
|
110
|
+
return v1->x*v2->x + v1->y*v2->y;
|
111
|
+
}
|
112
|
+
|
113
|
+
void
|
114
|
+
RVec2Copy( RVec2* out, const RVec2* in )
|
115
|
+
{
|
116
|
+
out->x = in->x;
|
117
|
+
out->y = in->y;
|
118
|
+
}
|
119
|
+
|
120
|
+
void
|
121
|
+
RVec2Normalize( RVec2* out, const RVec2* in )
|
122
|
+
{
|
123
|
+
rmReal length = RVec2Length( in );
|
124
|
+
RVec2Scale( out, in, 1.0f/length );
|
125
|
+
}
|
126
|
+
|
127
|
+
void
|
128
|
+
RVec2Transform( RVec2* out, const RMtx2* m, const RVec2* in )
|
129
|
+
{
|
130
|
+
RVec2 result, in_vec2;
|
131
|
+
int row;
|
132
|
+
|
133
|
+
RVec2Copy( &in_vec2, in );
|
134
|
+
for ( row = 0; row < 2; ++row )
|
135
|
+
{
|
136
|
+
RVec2 row_vector;
|
137
|
+
RMtx2GetRow( &row_vector, m, row );
|
138
|
+
RVec2SetElement( &result, row, RVec2Dot( &row_vector, &in_vec2 ) );
|
139
|
+
}
|
140
|
+
|
141
|
+
out->x = RVec2GetX( &result );
|
142
|
+
out->y = RVec2GetY( &result );
|
143
|
+
}
|
144
|
+
|
145
|
+
/*
|
146
|
+
RMath : Ruby math module for 3D Applications
|
147
|
+
Copyright (c) 2008- vaiorabbit <http://twitter.com/vaiorabbit>.
|
148
|
+
|
149
|
+
This software is provided 'as-is', without any express or implied
|
150
|
+
warranty. In no event will the authors be held liable for any damages
|
151
|
+
arising from the use of this software.
|
152
|
+
|
153
|
+
Permission is granted to anyone to use this software for any purpose,
|
154
|
+
including commercial applications, and to alter it and redistribute it
|
155
|
+
freely, subject to the following restrictions:
|
156
|
+
|
157
|
+
1. The origin of this software must not be misrepresented; you must not
|
158
|
+
claim that you wrote the original software. If you use this software
|
159
|
+
in a product, an acknowledgment in the product documentation would be
|
160
|
+
appreciated but is not required.
|
161
|
+
|
162
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
163
|
+
misrepresented as being the original software.
|
164
|
+
|
165
|
+
3. This notice may not be removed or altered from any source
|
166
|
+
distribution.
|
167
|
+
*/
|