snow-math 1.6.1 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/snow-math/maths.c +8 -0
- data/ext/snow-math/maths_local.h +1 -1
- data/ext/snow-math/snow-math.c +201 -295
- data/lib/snow-math/mat3.rb +41 -0
- data/lib/snow-math/mat4.rb +40 -0
- data/lib/snow-math/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07dcfa849094229689bdbf469119e52479b5034e
|
4
|
+
data.tar.gz: 51702b6e75a2b89f77c257a79ca5e1b9162a763a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a625c25c0d0c193dc9cd1d76f921c6ac8e59d94da5da176418656afa924c6f7d2a9dfc8054c091736faa934a37354e5893fa1296c8bfb6905ad0b3f1ffdd562
|
7
|
+
data.tar.gz: a1f15c58795706985615239610c1a673ab009a41a12df9061c3bfac81b4af5f5c00cb03c74e0eba84236b230e9dd0beef48e3bc94ecd6d8d9fe286eea7ca892f
|
data/ext/snow-math/maths.c
CHANGED
data/ext/snow-math/maths_local.h
CHANGED
@@ -69,7 +69,7 @@ typedef s_float_t quat_t[4];
|
|
69
69
|
*
|
70
70
|
* It should be stressed that this is absolutely not an accurate epsilon.
|
71
71
|
*/
|
72
|
-
|
72
|
+
extern s_float_t S_FLOAT_EPSILON;
|
73
73
|
|
74
74
|
#define S_DEG2RAD s_float_lit(0.01745329)
|
75
75
|
#define S_RAD2DEG s_float_lit(57.2957795)
|
data/ext/snow-math/snow-math.c
CHANGED
@@ -87,6 +87,37 @@ static VALUE sm_mathtype_array_length(VALUE sm_self)
|
|
87
87
|
return rb_ivar_get(sm_self, kRB_IVAR_MATHARRAY_LENGTH);
|
88
88
|
}
|
89
89
|
|
90
|
+
|
91
|
+
|
92
|
+
/*
|
93
|
+
* Freezes the array and its elements.
|
94
|
+
*
|
95
|
+
* call-seq: freeze -> self
|
96
|
+
*/
|
97
|
+
static VALUE sm_mathtype_array_freeze(VALUE sm_self)
|
98
|
+
{
|
99
|
+
VALUE sm_cache;
|
100
|
+
VALUE sm_cached_entry;
|
101
|
+
long length;
|
102
|
+
long index;
|
103
|
+
|
104
|
+
if (OBJ_FROZEN(sm_self)) {
|
105
|
+
return sm_self;
|
106
|
+
}
|
107
|
+
|
108
|
+
sm_cache = rb_ivar_get(sm_self, kRB_IVAR_MATHARRAY_CACHE);
|
109
|
+
length = RARRAY_LEN(sm_cache);
|
110
|
+
|
111
|
+
for (index = 0; index < length; ++index) {
|
112
|
+
sm_cached_entry = rb_ary_entry(sm_cache, index);
|
113
|
+
if (RTEST(sm_cached_entry)) {
|
114
|
+
rb_funcall2(sm_cached_entry, kRB_NAME_FREEZE, 0, 0);
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
return rb_call_super(0, 0);
|
119
|
+
}
|
120
|
+
|
90
121
|
#endif
|
91
122
|
|
92
123
|
|
@@ -188,37 +219,6 @@ static VALUE sm_vec2_array_new(VALUE sm_self, VALUE sm_length_or_copy)
|
|
188
219
|
|
189
220
|
|
190
221
|
|
191
|
-
/*
|
192
|
-
* Freezes the array and its elements.
|
193
|
-
*
|
194
|
-
* call-seq: freeze -> self
|
195
|
-
*/
|
196
|
-
static VALUE sm_vec2_array_freeze(VALUE sm_self)
|
197
|
-
{
|
198
|
-
VALUE sm_cache;
|
199
|
-
VALUE sm_cached_entry;
|
200
|
-
long length;
|
201
|
-
long index;
|
202
|
-
|
203
|
-
if (OBJ_FROZEN(sm_self)) {
|
204
|
-
return sm_self;
|
205
|
-
}
|
206
|
-
|
207
|
-
sm_cache = rb_ivar_get(sm_self, kRB_IVAR_MATHARRAY_CACHE);
|
208
|
-
length = RARRAY_LEN(sm_cache);
|
209
|
-
|
210
|
-
for (index = 0; index < length; ++index) {
|
211
|
-
sm_cached_entry = rb_ary_entry(sm_cache, index);
|
212
|
-
if (RTEST(sm_cached_entry) && !OBJ_FROZEN(sm_cached_entry)) {
|
213
|
-
rb_funcall2(sm_cached_entry, kRB_NAME_FREEZE, 0, 0);
|
214
|
-
}
|
215
|
-
}
|
216
|
-
|
217
|
-
return rb_call_super(0, 0);
|
218
|
-
}
|
219
|
-
|
220
|
-
|
221
|
-
|
222
222
|
/*
|
223
223
|
* Resizes the array to new_length and returns self.
|
224
224
|
*
|
@@ -418,37 +418,6 @@ static VALUE sm_vec3_array_new(VALUE sm_self, VALUE sm_length_or_copy)
|
|
418
418
|
|
419
419
|
|
420
420
|
|
421
|
-
/*
|
422
|
-
* Freezes the array and its elements.
|
423
|
-
*
|
424
|
-
* call-seq: freeze -> self
|
425
|
-
*/
|
426
|
-
static VALUE sm_vec3_array_freeze(VALUE sm_self)
|
427
|
-
{
|
428
|
-
VALUE sm_cache;
|
429
|
-
VALUE sm_cached_entry;
|
430
|
-
long length;
|
431
|
-
long index;
|
432
|
-
|
433
|
-
if (OBJ_FROZEN(sm_self)) {
|
434
|
-
return sm_self;
|
435
|
-
}
|
436
|
-
|
437
|
-
sm_cache = rb_ivar_get(sm_self, kRB_IVAR_MATHARRAY_CACHE);
|
438
|
-
length = RARRAY_LEN(sm_cache);
|
439
|
-
|
440
|
-
for (index = 0; index < length; ++index) {
|
441
|
-
sm_cached_entry = rb_ary_entry(sm_cache, index);
|
442
|
-
if (RTEST(sm_cached_entry)) {
|
443
|
-
rb_funcall2(sm_cached_entry, kRB_NAME_FREEZE, 0, 0);
|
444
|
-
}
|
445
|
-
}
|
446
|
-
|
447
|
-
return rb_call_super(0, 0);
|
448
|
-
}
|
449
|
-
|
450
|
-
|
451
|
-
|
452
421
|
/*
|
453
422
|
* Resizes the array to new_length and returns self.
|
454
423
|
*
|
@@ -647,37 +616,6 @@ static VALUE sm_vec4_array_new(VALUE sm_self, VALUE sm_length_or_copy)
|
|
647
616
|
|
648
617
|
|
649
618
|
|
650
|
-
/*
|
651
|
-
* Freezes the array and its elements.
|
652
|
-
*
|
653
|
-
* call-seq: freeze -> self
|
654
|
-
*/
|
655
|
-
static VALUE sm_vec4_array_freeze(VALUE sm_self)
|
656
|
-
{
|
657
|
-
VALUE sm_cache;
|
658
|
-
VALUE sm_cached_entry;
|
659
|
-
long length;
|
660
|
-
long index;
|
661
|
-
|
662
|
-
if (OBJ_FROZEN(sm_self)) {
|
663
|
-
return sm_self;
|
664
|
-
}
|
665
|
-
|
666
|
-
sm_cache = rb_ivar_get(sm_self, kRB_IVAR_MATHARRAY_CACHE);
|
667
|
-
length = RARRAY_LEN(sm_cache);
|
668
|
-
|
669
|
-
for (index = 0; index < length; ++index) {
|
670
|
-
sm_cached_entry = rb_ary_entry(sm_cache, index);
|
671
|
-
if (RTEST(sm_cached_entry)) {
|
672
|
-
rb_funcall2(sm_cached_entry, kRB_NAME_FREEZE, 0, 0);
|
673
|
-
}
|
674
|
-
}
|
675
|
-
|
676
|
-
return rb_call_super(0, 0);
|
677
|
-
}
|
678
|
-
|
679
|
-
|
680
|
-
|
681
619
|
/*
|
682
620
|
* Resizes the array to new_length and returns self.
|
683
621
|
*
|
@@ -876,37 +814,6 @@ static VALUE sm_quat_array_new(VALUE sm_self, VALUE sm_length_or_copy)
|
|
876
814
|
|
877
815
|
|
878
816
|
|
879
|
-
/*
|
880
|
-
* Freezes the array and its elements.
|
881
|
-
*
|
882
|
-
* call-seq: freeze -> self
|
883
|
-
*/
|
884
|
-
static VALUE sm_quat_array_freeze(VALUE sm_self)
|
885
|
-
{
|
886
|
-
VALUE sm_cache;
|
887
|
-
VALUE sm_cached_entry;
|
888
|
-
long length;
|
889
|
-
long index;
|
890
|
-
|
891
|
-
if (OBJ_FROZEN(sm_self)) {
|
892
|
-
return sm_self;
|
893
|
-
}
|
894
|
-
|
895
|
-
sm_cache = rb_ivar_get(sm_self, kRB_IVAR_MATHARRAY_CACHE);
|
896
|
-
length = RARRAY_LEN(sm_cache);
|
897
|
-
|
898
|
-
for (index = 0; index < length; ++index) {
|
899
|
-
sm_cached_entry = rb_ary_entry(sm_cache, index);
|
900
|
-
if (RTEST(sm_cached_entry)) {
|
901
|
-
rb_funcall2(sm_cached_entry, kRB_NAME_FREEZE, 0, 0);
|
902
|
-
}
|
903
|
-
}
|
904
|
-
|
905
|
-
return rb_call_super(0, 0);
|
906
|
-
}
|
907
|
-
|
908
|
-
|
909
|
-
|
910
817
|
/*
|
911
818
|
* Resizes the array to new_length and returns self.
|
912
819
|
*
|
@@ -1105,37 +1012,6 @@ static VALUE sm_mat3_array_new(VALUE sm_self, VALUE sm_length_or_copy)
|
|
1105
1012
|
|
1106
1013
|
|
1107
1014
|
|
1108
|
-
/*
|
1109
|
-
* Freezes the array and its elements.
|
1110
|
-
*
|
1111
|
-
* call-seq: freeze -> self
|
1112
|
-
*/
|
1113
|
-
static VALUE sm_mat3_array_freeze(VALUE sm_self)
|
1114
|
-
{
|
1115
|
-
VALUE sm_cache;
|
1116
|
-
VALUE sm_cached_entry;
|
1117
|
-
long length;
|
1118
|
-
long index;
|
1119
|
-
|
1120
|
-
if (OBJ_FROZEN(sm_self)) {
|
1121
|
-
return sm_self;
|
1122
|
-
}
|
1123
|
-
|
1124
|
-
sm_cache = rb_ivar_get(sm_self, kRB_IVAR_MATHARRAY_CACHE);
|
1125
|
-
length = RARRAY_LEN(sm_cache);
|
1126
|
-
|
1127
|
-
for (index = 0; index < length; ++index) {
|
1128
|
-
sm_cached_entry = rb_ary_entry(sm_cache, index);
|
1129
|
-
if (RTEST(sm_cached_entry)) {
|
1130
|
-
rb_funcall2(sm_cached_entry, kRB_NAME_FREEZE, 0, 0);
|
1131
|
-
}
|
1132
|
-
}
|
1133
|
-
|
1134
|
-
return rb_call_super(0, 0);
|
1135
|
-
}
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
1015
|
/*
|
1140
1016
|
* Resizes the array to new_length and returns self.
|
1141
1017
|
*
|
@@ -1340,37 +1216,6 @@ static VALUE sm_mat4_array_new(VALUE sm_self, VALUE sm_length_or_copy)
|
|
1340
1216
|
|
1341
1217
|
|
1342
1218
|
|
1343
|
-
/*
|
1344
|
-
* Freezes the array and its elements.
|
1345
|
-
*
|
1346
|
-
* call-seq: freeze -> self
|
1347
|
-
*/
|
1348
|
-
static VALUE sm_mat4_array_freeze(VALUE sm_self)
|
1349
|
-
{
|
1350
|
-
VALUE sm_cache;
|
1351
|
-
VALUE sm_cached_entry;
|
1352
|
-
long length;
|
1353
|
-
long index;
|
1354
|
-
|
1355
|
-
if (OBJ_FROZEN(sm_self)) {
|
1356
|
-
return sm_self;
|
1357
|
-
}
|
1358
|
-
|
1359
|
-
sm_cache = rb_ivar_get(sm_self, kRB_IVAR_MATHARRAY_CACHE);
|
1360
|
-
length = RARRAY_LEN(sm_cache);
|
1361
|
-
|
1362
|
-
for (index = 0; index < length; ++index) {
|
1363
|
-
sm_cached_entry = rb_ary_entry(sm_cache, index);
|
1364
|
-
if (RTEST(sm_cached_entry)) {
|
1365
|
-
rb_funcall2(sm_cached_entry, kRB_NAME_FREEZE, 0, 0);
|
1366
|
-
}
|
1367
|
-
}
|
1368
|
-
|
1369
|
-
return rb_call_super(0, 0);
|
1370
|
-
}
|
1371
|
-
|
1372
|
-
|
1373
|
-
|
1374
1219
|
/*
|
1375
1220
|
* Resizes the array to new_length and returns self.
|
1376
1221
|
*
|
@@ -1576,7 +1421,7 @@ static VALUE sm_vec2_fetch (VALUE sm_self, VALUE sm_index)
|
|
1576
1421
|
rb_raise(rb_eRangeError,
|
1577
1422
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
1578
1423
|
}
|
1579
|
-
return
|
1424
|
+
return DBL2NUM(self[0][NUM2INT(sm_index)]);
|
1580
1425
|
}
|
1581
1426
|
|
1582
1427
|
|
@@ -1596,7 +1441,7 @@ static VALUE sm_vec2_store (VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
1596
1441
|
rb_raise(rb_eRangeError,
|
1597
1442
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
1598
1443
|
}
|
1599
|
-
self[0][index] = (s_float_t)
|
1444
|
+
self[0][index] = (s_float_t)NUM2DBL(sm_value);
|
1600
1445
|
return sm_value;
|
1601
1446
|
}
|
1602
1447
|
|
@@ -2058,7 +1903,7 @@ static VALUE sm_vec2_dot_product(VALUE sm_self, VALUE sm_other)
|
|
2058
1903
|
rb_obj_classname(sm_other));
|
2059
1904
|
return Qnil;
|
2060
1905
|
}
|
2061
|
-
return
|
1906
|
+
return DBL2NUM(
|
2062
1907
|
vec2_dot_product(
|
2063
1908
|
*sm_unwrap_vec2(sm_self, NULL),
|
2064
1909
|
*sm_unwrap_vec2(sm_other, NULL)));
|
@@ -2124,8 +1969,8 @@ static VALUE sm_vec2_init(int argc, VALUE *argv, VALUE sm_self)
|
|
2124
1969
|
if (0) {
|
2125
1970
|
case 2:
|
2126
1971
|
if (!SM_RB_IS_A(argv[0], rb_cArray)) {
|
2127
|
-
self[0][0] = (s_float_t)
|
2128
|
-
self[0][1] = (s_float_t)
|
1972
|
+
self[0][0] = (s_float_t)NUM2DBL(argv[0]);
|
1973
|
+
self[0][1] = (s_float_t)NUM2DBL(argv[1]);
|
2129
1974
|
break;
|
2130
1975
|
}
|
2131
1976
|
arr_index = NUM2SIZET(argv[1]);
|
@@ -2136,7 +1981,7 @@ static VALUE sm_vec2_init(int argc, VALUE *argv, VALUE sm_self)
|
|
2136
1981
|
const size_t arr_end = arr_index + 2;
|
2137
1982
|
s_float_t *vec_elem = *self;
|
2138
1983
|
for (; arr_index < arr_end; ++arr_index, ++vec_elem) {
|
2139
|
-
*vec_elem = (s_float_t)
|
1984
|
+
*vec_elem = (s_float_t)NUM2DBL(rb_ary_entry(arrdata, (long)arr_index));
|
2140
1985
|
}
|
2141
1986
|
break;
|
2142
1987
|
}
|
@@ -2181,7 +2026,7 @@ static VALUE sm_vec2_to_s(VALUE self)
|
|
2181
2026
|
*/
|
2182
2027
|
static VALUE sm_vec2_magnitude_squared(VALUE sm_self)
|
2183
2028
|
{
|
2184
|
-
return
|
2029
|
+
return DBL2NUM(vec2_length_squared(*sm_unwrap_vec2(sm_self, NULL)));
|
2185
2030
|
}
|
2186
2031
|
|
2187
2032
|
|
@@ -2194,7 +2039,7 @@ static VALUE sm_vec2_magnitude_squared(VALUE sm_self)
|
|
2194
2039
|
*/
|
2195
2040
|
static VALUE sm_vec2_magnitude(VALUE sm_self)
|
2196
2041
|
{
|
2197
|
-
return
|
2042
|
+
return DBL2NUM(vec2_length(*sm_unwrap_vec2(sm_self, NULL)));
|
2198
2043
|
}
|
2199
2044
|
|
2200
2045
|
|
@@ -2213,7 +2058,7 @@ static VALUE sm_vec2_scale(int argc, VALUE *argv, VALUE sm_self)
|
|
2213
2058
|
vec2_t *self = sm_unwrap_vec2(sm_self, NULL);
|
2214
2059
|
|
2215
2060
|
rb_scan_args(argc, argv, "11", &sm_scalar, &sm_out);
|
2216
|
-
scalar =
|
2061
|
+
scalar = NUM2DBL(sm_scalar);
|
2217
2062
|
|
2218
2063
|
if (SM_IS_A(sm_out, vec2) || SM_IS_A(sm_out, vec3) || SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat)) {
|
2219
2064
|
rb_check_frozen(sm_out);
|
@@ -2244,7 +2089,7 @@ static VALUE sm_vec2_divide(int argc, VALUE *argv, VALUE sm_self)
|
|
2244
2089
|
vec2_t *self = sm_unwrap_vec2(sm_self, NULL);
|
2245
2090
|
|
2246
2091
|
rb_scan_args(argc, argv, "11", &sm_scalar, &sm_out);
|
2247
|
-
scalar =
|
2092
|
+
scalar = NUM2DBL(sm_scalar);
|
2248
2093
|
|
2249
2094
|
if (SM_IS_A(sm_out, vec2) || SM_IS_A(sm_out, vec3) || SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat)) {
|
2250
2095
|
rb_check_frozen(sm_out);
|
@@ -2329,7 +2174,7 @@ static VALUE sm_vec3_fetch (VALUE sm_self, VALUE sm_index)
|
|
2329
2174
|
rb_raise(rb_eRangeError,
|
2330
2175
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
2331
2176
|
}
|
2332
|
-
return
|
2177
|
+
return DBL2NUM(self[0][NUM2INT(sm_index)]);
|
2333
2178
|
}
|
2334
2179
|
|
2335
2180
|
|
@@ -2349,7 +2194,7 @@ static VALUE sm_vec3_store (VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
2349
2194
|
rb_raise(rb_eRangeError,
|
2350
2195
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
2351
2196
|
}
|
2352
|
-
self[0][index] = (s_float_t)
|
2197
|
+
self[0][index] = (s_float_t)NUM2DBL(sm_value);
|
2353
2198
|
return sm_value;
|
2354
2199
|
}
|
2355
2200
|
|
@@ -2858,7 +2703,7 @@ static VALUE sm_vec3_dot_product(VALUE sm_self, VALUE sm_other)
|
|
2858
2703
|
rb_obj_classname(sm_other));
|
2859
2704
|
return Qnil;
|
2860
2705
|
}
|
2861
|
-
return
|
2706
|
+
return DBL2NUM(
|
2862
2707
|
vec3_dot_product(
|
2863
2708
|
*sm_unwrap_vec3(sm_self, NULL),
|
2864
2709
|
*sm_unwrap_vec3(sm_other, NULL)));
|
@@ -2936,7 +2781,7 @@ static VALUE sm_vec3_init(int argc, VALUE *argv, VALUE sm_self)
|
|
2936
2781
|
const size_t arr_end = arr_index + 3;
|
2937
2782
|
s_float_t *vec_elem = *self;
|
2938
2783
|
for (; arr_index < arr_end; ++arr_index, ++vec_elem) {
|
2939
|
-
*vec_elem = (s_float_t)
|
2784
|
+
*vec_elem = (s_float_t)NUM2DBL(rb_ary_entry(arrdata, (long)arr_index));
|
2940
2785
|
}
|
2941
2786
|
break;
|
2942
2787
|
}
|
@@ -2947,9 +2792,9 @@ static VALUE sm_vec3_init(int argc, VALUE *argv, VALUE sm_self)
|
|
2947
2792
|
|
2948
2793
|
/* X, Y, Z */
|
2949
2794
|
case 3: {
|
2950
|
-
self[0][0] = (s_float_t)
|
2951
|
-
self[0][1] = (s_float_t)
|
2952
|
-
self[0][2] = (s_float_t)
|
2795
|
+
self[0][0] = (s_float_t)NUM2DBL(argv[0]);
|
2796
|
+
self[0][1] = (s_float_t)NUM2DBL(argv[1]);
|
2797
|
+
self[0][2] = (s_float_t)NUM2DBL(argv[2]);
|
2953
2798
|
break;
|
2954
2799
|
}
|
2955
2800
|
|
@@ -2993,7 +2838,7 @@ static VALUE sm_vec3_to_s(VALUE self)
|
|
2993
2838
|
*/
|
2994
2839
|
static VALUE sm_vec3_magnitude_squared(VALUE sm_self)
|
2995
2840
|
{
|
2996
|
-
return
|
2841
|
+
return DBL2NUM(vec3_length_squared(*sm_unwrap_vec3(sm_self, NULL)));
|
2997
2842
|
}
|
2998
2843
|
|
2999
2844
|
|
@@ -3006,7 +2851,7 @@ static VALUE sm_vec3_magnitude_squared(VALUE sm_self)
|
|
3006
2851
|
*/
|
3007
2852
|
static VALUE sm_vec3_magnitude(VALUE sm_self)
|
3008
2853
|
{
|
3009
|
-
return
|
2854
|
+
return DBL2NUM(vec3_length(*sm_unwrap_vec3(sm_self, NULL)));
|
3010
2855
|
}
|
3011
2856
|
|
3012
2857
|
|
@@ -3025,7 +2870,7 @@ static VALUE sm_vec3_scale(int argc, VALUE *argv, VALUE sm_self)
|
|
3025
2870
|
vec3_t *self = sm_unwrap_vec3(sm_self, NULL);
|
3026
2871
|
|
3027
2872
|
rb_scan_args(argc, argv, "11", &sm_scalar, &sm_out);
|
3028
|
-
scalar =
|
2873
|
+
scalar = NUM2DBL(sm_scalar);
|
3029
2874
|
|
3030
2875
|
if (SM_IS_A(sm_out, vec3) || SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat)) {
|
3031
2876
|
rb_check_frozen(sm_out);
|
@@ -3056,7 +2901,7 @@ static VALUE sm_vec3_divide(int argc, VALUE *argv, VALUE sm_self)
|
|
3056
2901
|
vec3_t *self = sm_unwrap_vec3(sm_self, NULL);
|
3057
2902
|
|
3058
2903
|
rb_scan_args(argc, argv, "11", &sm_scalar, &sm_out);
|
3059
|
-
scalar =
|
2904
|
+
scalar = NUM2DBL(sm_scalar);
|
3060
2905
|
|
3061
2906
|
if (SM_IS_A(sm_out, vec3) || SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat)) {
|
3062
2907
|
rb_check_frozen(sm_out);
|
@@ -3140,7 +2985,7 @@ static VALUE sm_vec4_fetch (VALUE sm_self, VALUE sm_index)
|
|
3140
2985
|
rb_raise(rb_eRangeError,
|
3141
2986
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
3142
2987
|
}
|
3143
|
-
return
|
2988
|
+
return DBL2NUM(self[0][NUM2INT(sm_index)]);
|
3144
2989
|
}
|
3145
2990
|
|
3146
2991
|
|
@@ -3160,7 +3005,7 @@ static VALUE sm_vec4_store (VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
3160
3005
|
rb_raise(rb_eRangeError,
|
3161
3006
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
3162
3007
|
}
|
3163
|
-
self[0][index] = (s_float_t)
|
3008
|
+
self[0][index] = (s_float_t)NUM2DBL(sm_value);
|
3164
3009
|
return sm_value;
|
3165
3010
|
}
|
3166
3011
|
|
@@ -3618,7 +3463,7 @@ static VALUE sm_vec4_dot_product(VALUE sm_self, VALUE sm_other)
|
|
3618
3463
|
rb_obj_classname(sm_other));
|
3619
3464
|
return Qnil;
|
3620
3465
|
}
|
3621
|
-
return
|
3466
|
+
return DBL2NUM(
|
3622
3467
|
vec4_dot_product(
|
3623
3468
|
*sm_unwrap_vec4(sm_self, NULL),
|
3624
3469
|
*sm_unwrap_vec4(sm_other, NULL)));
|
@@ -3702,7 +3547,7 @@ static VALUE sm_vec4_init(int argc, VALUE *argv, VALUE sm_self)
|
|
3702
3547
|
const size_t arr_end = arr_index + 4;
|
3703
3548
|
s_float_t *vec_elem = *self;
|
3704
3549
|
for (; arr_index < arr_end; ++arr_index, ++vec_elem) {
|
3705
|
-
*vec_elem = (s_float_t)
|
3550
|
+
*vec_elem = (s_float_t)NUM2DBL(rb_ary_entry(arrdata, (long)arr_index));
|
3706
3551
|
}
|
3707
3552
|
break;
|
3708
3553
|
}
|
@@ -3713,11 +3558,11 @@ static VALUE sm_vec4_init(int argc, VALUE *argv, VALUE sm_self)
|
|
3713
3558
|
|
3714
3559
|
/* W */
|
3715
3560
|
case 4: {
|
3716
|
-
self[0][3] = (s_float_t)
|
3561
|
+
self[0][3] = (s_float_t)NUM2DBL(argv[3]);
|
3717
3562
|
case 3: /* X, Y, Z */
|
3718
|
-
self[0][0] = (s_float_t)
|
3719
|
-
self[0][1] = (s_float_t)
|
3720
|
-
self[0][2] = (s_float_t)
|
3563
|
+
self[0][0] = (s_float_t)NUM2DBL(argv[0]);
|
3564
|
+
self[0][1] = (s_float_t)NUM2DBL(argv[1]);
|
3565
|
+
self[0][2] = (s_float_t)NUM2DBL(argv[2]);
|
3721
3566
|
break;
|
3722
3567
|
}
|
3723
3568
|
|
@@ -3761,7 +3606,7 @@ static VALUE sm_vec4_to_s(VALUE self)
|
|
3761
3606
|
*/
|
3762
3607
|
static VALUE sm_vec4_magnitude_squared(VALUE sm_self)
|
3763
3608
|
{
|
3764
|
-
return
|
3609
|
+
return DBL2NUM(vec4_length_squared(*sm_unwrap_vec4(sm_self, NULL)));
|
3765
3610
|
}
|
3766
3611
|
|
3767
3612
|
|
@@ -3774,7 +3619,7 @@ static VALUE sm_vec4_magnitude_squared(VALUE sm_self)
|
|
3774
3619
|
*/
|
3775
3620
|
static VALUE sm_vec4_magnitude(VALUE sm_self)
|
3776
3621
|
{
|
3777
|
-
return
|
3622
|
+
return DBL2NUM(vec4_length(*sm_unwrap_vec4(sm_self, NULL)));
|
3778
3623
|
}
|
3779
3624
|
|
3780
3625
|
|
@@ -3794,7 +3639,7 @@ static VALUE sm_vec4_scale(int argc, VALUE *argv, VALUE sm_self)
|
|
3794
3639
|
vec4_t *self = sm_unwrap_vec4(sm_self, NULL);
|
3795
3640
|
|
3796
3641
|
rb_scan_args(argc, argv, "11", &sm_scalar, &sm_out);
|
3797
|
-
scalar =
|
3642
|
+
scalar = NUM2DBL(sm_scalar);
|
3798
3643
|
|
3799
3644
|
if ((SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat))) {
|
3800
3645
|
rb_check_frozen(sm_out);
|
@@ -3826,7 +3671,7 @@ static VALUE sm_vec4_divide(int argc, VALUE *argv, VALUE sm_self)
|
|
3826
3671
|
vec4_t *self = sm_unwrap_vec4(sm_self, NULL);
|
3827
3672
|
|
3828
3673
|
rb_scan_args(argc, argv, "11", &sm_scalar, &sm_out);
|
3829
|
-
scalar =
|
3674
|
+
scalar = NUM2DBL(sm_scalar);
|
3830
3675
|
|
3831
3676
|
if ((SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat))) {
|
3832
3677
|
rb_check_frozen(sm_out);
|
@@ -3909,7 +3754,7 @@ static VALUE sm_quat_fetch (VALUE sm_self, VALUE sm_index)
|
|
3909
3754
|
rb_raise(rb_eRangeError,
|
3910
3755
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
3911
3756
|
}
|
3912
|
-
return
|
3757
|
+
return DBL2NUM(self[0][NUM2INT(sm_index)]);
|
3913
3758
|
}
|
3914
3759
|
|
3915
3760
|
|
@@ -3929,7 +3774,7 @@ static VALUE sm_quat_store (VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
3929
3774
|
rb_raise(rb_eRangeError,
|
3930
3775
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
3931
3776
|
}
|
3932
|
-
self[0][index] = (s_float_t)
|
3777
|
+
self[0][index] = (s_float_t)NUM2DBL(sm_value);
|
3933
3778
|
return sm_value;
|
3934
3779
|
}
|
3935
3780
|
|
@@ -4192,7 +4037,7 @@ static VALUE sm_quat_init(int argc, VALUE *argv, VALUE sm_self)
|
|
4192
4037
|
const size_t arr_end = arr_index + 3;
|
4193
4038
|
s_float_t *vec_elem = *self;
|
4194
4039
|
for (; arr_index < arr_end; ++arr_index, ++vec_elem) {
|
4195
|
-
*vec_elem = (s_float_t)
|
4040
|
+
*vec_elem = (s_float_t)NUM2DBL(rb_ary_entry(arrdata, (long)arr_index));
|
4196
4041
|
}
|
4197
4042
|
break;
|
4198
4043
|
}
|
@@ -4203,11 +4048,11 @@ static VALUE sm_quat_init(int argc, VALUE *argv, VALUE sm_self)
|
|
4203
4048
|
|
4204
4049
|
/* W */
|
4205
4050
|
case 4: {
|
4206
|
-
self[0][3] = (s_float_t)
|
4051
|
+
self[0][3] = (s_float_t)NUM2DBL(argv[3]);
|
4207
4052
|
case 3: /* X, Y, Z */
|
4208
|
-
self[0][0] = (s_float_t)
|
4209
|
-
self[0][1] = (s_float_t)
|
4210
|
-
self[0][2] = (s_float_t)
|
4053
|
+
self[0][0] = (s_float_t)NUM2DBL(argv[0]);
|
4054
|
+
self[0][1] = (s_float_t)NUM2DBL(argv[1]);
|
4055
|
+
self[0][2] = (s_float_t)NUM2DBL(argv[2]);
|
4211
4056
|
break;
|
4212
4057
|
}
|
4213
4058
|
|
@@ -4265,7 +4110,7 @@ static VALUE sm_quat_angle_axis(int argc, VALUE *argv, VALUE self)
|
|
4265
4110
|
return Qnil;
|
4266
4111
|
}
|
4267
4112
|
|
4268
|
-
angle = (s_float_t)
|
4113
|
+
angle = (s_float_t)NUM2DBL(sm_angle);
|
4269
4114
|
axis = sm_unwrap_vec3(sm_axis, NULL);
|
4270
4115
|
|
4271
4116
|
if (SM_IS_A(sm_out, quat) || SM_IS_A(sm_out, vec4)) {
|
@@ -4317,7 +4162,7 @@ static VALUE sm_quat_slerp(int argc, VALUE *argv, VALUE sm_self)
|
|
4317
4162
|
s_float_t alpha;
|
4318
4163
|
|
4319
4164
|
rb_scan_args(argc, argv, "21", &sm_destination, &sm_alpha, &sm_out);
|
4320
|
-
alpha =
|
4165
|
+
alpha = NUM2DBL(sm_alpha);
|
4321
4166
|
|
4322
4167
|
if (!SM_IS_A(sm_destination, vec4) && !SM_IS_A(sm_destination, quat)) {
|
4323
4168
|
rb_raise(rb_eTypeError,
|
@@ -4389,7 +4234,7 @@ static VALUE sm_mat4_fetch (VALUE sm_self, VALUE sm_index)
|
|
4389
4234
|
rb_raise(rb_eRangeError,
|
4390
4235
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
4391
4236
|
}
|
4392
|
-
return
|
4237
|
+
return DBL2NUM(self[0][NUM2INT(sm_index)]);
|
4393
4238
|
}
|
4394
4239
|
|
4395
4240
|
|
@@ -4409,7 +4254,7 @@ static VALUE sm_mat4_store (VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
4409
4254
|
rb_raise(rb_eRangeError,
|
4410
4255
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
4411
4256
|
}
|
4412
|
-
self[0][index] = (s_float_t)
|
4257
|
+
self[0][index] = (s_float_t)NUM2DBL(sm_value);
|
4413
4258
|
return sm_value;
|
4414
4259
|
}
|
4415
4260
|
|
@@ -5005,9 +4850,9 @@ static VALUE sm_mat4_translate(int argc, VALUE *argv, VALUE sm_self)
|
|
5005
4850
|
}
|
5006
4851
|
|
5007
4852
|
case 3: {
|
5008
|
-
xyz[0] =
|
5009
|
-
xyz[1] =
|
5010
|
-
xyz[2] =
|
4853
|
+
xyz[0] = NUM2DBL(argv[0]);
|
4854
|
+
xyz[1] = NUM2DBL(argv[1]);
|
4855
|
+
xyz[2] = NUM2DBL(argv[2]);
|
5011
4856
|
|
5012
4857
|
SM_LABEL(get_output):
|
5013
4858
|
if (RTEST(sm_out)) {
|
@@ -5057,9 +4902,9 @@ static VALUE sm_mat4_translation(int argc, VALUE *argv, VALUE sm_self)
|
|
5057
4902
|
}
|
5058
4903
|
|
5059
4904
|
case 3: {
|
5060
|
-
xyz[0] =
|
5061
|
-
xyz[1] =
|
5062
|
-
xyz[2] =
|
4905
|
+
xyz[0] = NUM2DBL(argv[0]);
|
4906
|
+
xyz[1] = NUM2DBL(argv[1]);
|
4907
|
+
xyz[2] = NUM2DBL(argv[2]);
|
5063
4908
|
|
5064
4909
|
SM_LABEL(get_output):
|
5065
4910
|
if (RTEST(sm_out)) {
|
@@ -5158,7 +5003,7 @@ static VALUE sm_mat4_init(int argc, VALUE *argv, VALUE sm_self)
|
|
5158
5003
|
const size_t arr_end = arr_index + 16;
|
5159
5004
|
s_float_t *mat_elem = *self;
|
5160
5005
|
for (; arr_index < arr_end; ++arr_index, ++mat_elem) {
|
5161
|
-
*mat_elem =
|
5006
|
+
*mat_elem = NUM2DBL(rb_ary_entry(arrdata, (long)arr_index));
|
5162
5007
|
}
|
5163
5008
|
break;
|
5164
5009
|
}
|
@@ -5189,7 +5034,7 @@ static VALUE sm_mat4_init(int argc, VALUE *argv, VALUE sm_self)
|
|
5189
5034
|
s_float_t *mat_elem = *self;
|
5190
5035
|
VALUE *argv_p = argv;
|
5191
5036
|
for (; argc; --argc, ++argv_p, ++mat_elem) {
|
5192
|
-
*mat_elem = (s_float_t)
|
5037
|
+
*mat_elem = (s_float_t)NUM2DBL(*argv_p);
|
5193
5038
|
}
|
5194
5039
|
break;
|
5195
5040
|
}
|
@@ -5257,7 +5102,7 @@ static VALUE sm_mat4_angle_axis(int argc, VALUE *argv, VALUE self)
|
|
5257
5102
|
return Qnil;
|
5258
5103
|
}
|
5259
5104
|
|
5260
|
-
angle = (s_float_t)
|
5105
|
+
angle = (s_float_t)NUM2DBL(sm_angle);
|
5261
5106
|
axis = sm_unwrap_vec3(sm_axis, NULL);
|
5262
5107
|
|
5263
5108
|
if (SM_IS_A(sm_out, mat4)) {
|
@@ -5711,12 +5556,12 @@ static VALUE sm_mat4_frustum(int argc, VALUE *argv, VALUE self)
|
|
5711
5556
|
|
5712
5557
|
rb_scan_args(argc, argv, "61", &sm_left, &sm_right, &sm_bottom, &sm_top, &sm_z_near, &sm_z_far, &sm_out);
|
5713
5558
|
|
5714
|
-
left = (s_float_t)
|
5715
|
-
right = (s_float_t)
|
5716
|
-
bottom = (s_float_t)
|
5717
|
-
top = (s_float_t)
|
5718
|
-
z_near = (s_float_t)
|
5719
|
-
z_far = (s_float_t)
|
5559
|
+
left = (s_float_t)NUM2DBL(sm_left);
|
5560
|
+
right = (s_float_t)NUM2DBL(sm_right);
|
5561
|
+
bottom = (s_float_t)NUM2DBL(sm_bottom);
|
5562
|
+
top = (s_float_t)NUM2DBL(sm_top);
|
5563
|
+
z_near = (s_float_t)NUM2DBL(sm_z_near);
|
5564
|
+
z_far = (s_float_t)NUM2DBL(sm_z_far);
|
5720
5565
|
|
5721
5566
|
if (SM_IS_A(sm_out, mat4)) {
|
5722
5567
|
rb_check_frozen(sm_out);
|
@@ -5758,12 +5603,12 @@ static VALUE sm_mat4_orthographic(int argc, VALUE *argv, VALUE self)
|
|
5758
5603
|
|
5759
5604
|
rb_scan_args(argc, argv, "61", &sm_left, &sm_right, &sm_bottom, &sm_top, &sm_z_near, &sm_z_far, &sm_out);
|
5760
5605
|
|
5761
|
-
left = (s_float_t)
|
5762
|
-
right = (s_float_t)
|
5763
|
-
bottom = (s_float_t)
|
5764
|
-
top = (s_float_t)
|
5765
|
-
z_near = (s_float_t)
|
5766
|
-
z_far = (s_float_t)
|
5606
|
+
left = (s_float_t)NUM2DBL(sm_left);
|
5607
|
+
right = (s_float_t)NUM2DBL(sm_right);
|
5608
|
+
bottom = (s_float_t)NUM2DBL(sm_bottom);
|
5609
|
+
top = (s_float_t)NUM2DBL(sm_top);
|
5610
|
+
z_near = (s_float_t)NUM2DBL(sm_z_near);
|
5611
|
+
z_far = (s_float_t)NUM2DBL(sm_z_far);
|
5767
5612
|
|
5768
5613
|
if (SM_IS_A(sm_out, mat4)) {
|
5769
5614
|
rb_check_frozen(sm_out);
|
@@ -5801,10 +5646,10 @@ static VALUE sm_mat4_perspective(int argc, VALUE *argv, VALUE self)
|
|
5801
5646
|
|
5802
5647
|
rb_scan_args(argc, argv, "41", &sm_fov_y, &sm_aspect, &sm_z_near, &sm_z_far, &sm_out);
|
5803
5648
|
|
5804
|
-
fov_y = (s_float_t)
|
5805
|
-
aspect = (s_float_t)
|
5806
|
-
z_near = (s_float_t)
|
5807
|
-
z_far = (s_float_t)
|
5649
|
+
fov_y = (s_float_t)NUM2DBL(sm_fov_y);
|
5650
|
+
aspect = (s_float_t)NUM2DBL(sm_aspect);
|
5651
|
+
z_near = (s_float_t)NUM2DBL(sm_z_near);
|
5652
|
+
z_far = (s_float_t)NUM2DBL(sm_z_far);
|
5808
5653
|
|
5809
5654
|
if (SM_IS_A(sm_out, mat4)) {
|
5810
5655
|
rb_check_frozen(sm_out);
|
@@ -5875,9 +5720,9 @@ static VALUE sm_mat4_scale(int argc, VALUE *argv, VALUE sm_self)
|
|
5875
5720
|
mat4_t *self = sm_unwrap_mat4(sm_self, NULL);
|
5876
5721
|
|
5877
5722
|
rb_scan_args(argc, argv, "31", &sm_x, &sm_y, &sm_z, &sm_out);
|
5878
|
-
x =
|
5879
|
-
y =
|
5880
|
-
z =
|
5723
|
+
x = NUM2DBL(sm_x);
|
5724
|
+
y = NUM2DBL(sm_y);
|
5725
|
+
z = NUM2DBL(sm_z);
|
5881
5726
|
|
5882
5727
|
if (SM_IS_A(sm_out, mat4)) {
|
5883
5728
|
rb_check_frozen(sm_out);
|
@@ -5957,7 +5802,7 @@ static VALUE sm_mat3_fetch (VALUE sm_self, VALUE sm_index)
|
|
5957
5802
|
rb_raise(rb_eRangeError,
|
5958
5803
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
5959
5804
|
}
|
5960
|
-
return
|
5805
|
+
return DBL2NUM(self[0][NUM2INT(sm_index)]);
|
5961
5806
|
}
|
5962
5807
|
|
5963
5808
|
|
@@ -5977,7 +5822,7 @@ static VALUE sm_mat3_store (VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
5977
5822
|
rb_raise(rb_eRangeError,
|
5978
5823
|
"Index %d is out of bounds, must be from 0 through %d", index, max_index - 1);
|
5979
5824
|
}
|
5980
|
-
self[0][index] = (s_float_t)
|
5825
|
+
self[0][index] = (s_float_t)NUM2DBL(sm_value);
|
5981
5826
|
return sm_value;
|
5982
5827
|
}
|
5983
5828
|
|
@@ -6502,7 +6347,7 @@ static VALUE sm_mat3_init(int argc, VALUE *argv, VALUE sm_self)
|
|
6502
6347
|
const size_t arr_end = arr_index + 9;
|
6503
6348
|
s_float_t *mat_elem = *self;
|
6504
6349
|
for (; arr_index < arr_end; ++arr_index, ++mat_elem) {
|
6505
|
-
*mat_elem =
|
6350
|
+
*mat_elem = NUM2DBL(rb_ary_entry(arrdata, (long)arr_index));
|
6506
6351
|
}
|
6507
6352
|
break;
|
6508
6353
|
}
|
@@ -6533,7 +6378,7 @@ static VALUE sm_mat3_init(int argc, VALUE *argv, VALUE sm_self)
|
|
6533
6378
|
s_float_t *mat_elem = *self;
|
6534
6379
|
VALUE *argv_p = argv;
|
6535
6380
|
for (; argc; --argc, ++argv_p, ++mat_elem) {
|
6536
|
-
*mat_elem = (s_float_t)
|
6381
|
+
*mat_elem = (s_float_t)NUM2DBL(*argv_p);
|
6537
6382
|
}
|
6538
6383
|
break;
|
6539
6384
|
}
|
@@ -6598,7 +6443,7 @@ static VALUE sm_mat3_angle_axis(int argc, VALUE *argv, VALUE self)
|
|
6598
6443
|
return Qnil;
|
6599
6444
|
}
|
6600
6445
|
|
6601
|
-
angle = (s_float_t)
|
6446
|
+
angle = (s_float_t)NUM2DBL(sm_angle);
|
6602
6447
|
axis = sm_unwrap_vec3(sm_axis, NULL);
|
6603
6448
|
|
6604
6449
|
if (SM_IS_A(sm_out, mat3)) {
|
@@ -6844,9 +6689,9 @@ static VALUE sm_mat3_scale(int argc, VALUE *argv, VALUE sm_self)
|
|
6844
6689
|
mat3_t *self = sm_unwrap_mat3(sm_self, NULL);
|
6845
6690
|
|
6846
6691
|
rb_scan_args(argc, argv, "31", &sm_x, &sm_y, &sm_z, &sm_out);
|
6847
|
-
x =
|
6848
|
-
y =
|
6849
|
-
z =
|
6692
|
+
x = NUM2DBL(sm_x);
|
6693
|
+
y = NUM2DBL(sm_y);
|
6694
|
+
z = NUM2DBL(sm_z);
|
6850
6695
|
|
6851
6696
|
if (SM_IS_A(sm_out, mat3)) {
|
6852
6697
|
rb_check_frozen(sm_out);
|
@@ -6900,6 +6745,65 @@ static VALUE sm_get_address(VALUE sm_self)
|
|
6900
6745
|
|
6901
6746
|
|
6902
6747
|
|
6748
|
+
/*
|
6749
|
+
call-seq:
|
6750
|
+
float_epsilon -> Float
|
6751
|
+
|
6752
|
+
Gets the float epsilon for snow-math types. By default, this is 1e-9 for
|
6753
|
+
double-precision floats and 1e-6 for single-precision floats.
|
6754
|
+
*/
|
6755
|
+
static VALUE sm_get_float_epsilon(VALUE sm_self)
|
6756
|
+
{
|
6757
|
+
return DBL2NUM(S_FLOAT_EPSILON);
|
6758
|
+
}
|
6759
|
+
|
6760
|
+
|
6761
|
+
|
6762
|
+
/*
|
6763
|
+
call-seq:
|
6764
|
+
float_epsilon = value -> value
|
6765
|
+
|
6766
|
+
Sets the float epsilon for snow-math types. If snow-math is compiled to use
|
6767
|
+
single-precision floats, changing the epsilon for floats may cause the
|
6768
|
+
assigned value to lose precision itself in the cast, resulting in a subtly
|
6769
|
+
different epsilon than intended, as Ruby uses double-precision floats, which
|
6770
|
+
may lead you to think you're setting the epsilon to one value when it's
|
6771
|
+
another similar by not equal value.
|
6772
|
+
|
6773
|
+
Just be aware of what you're doing and the type of float you've compiled
|
6774
|
+
snow-math to use.
|
6775
|
+
*/
|
6776
|
+
static VALUE sm_set_float_epsilon(VALUE sm_self, VALUE sm_value)
|
6777
|
+
{
|
6778
|
+
switch (TYPE(sm_value)) {
|
6779
|
+
case T_FLOAT:
|
6780
|
+
case T_FIXNUM:
|
6781
|
+
case T_BIGNUM:
|
6782
|
+
case T_RATIONAL:
|
6783
|
+
case T_COMPLEX: {
|
6784
|
+
S_FLOAT_EPSILON = (s_float_t)NUM2DBL(sm_value);
|
6785
|
+
break;
|
6786
|
+
}
|
6787
|
+
default: {
|
6788
|
+
VALUE sm_value_s = rb_any_to_s(sm_value);
|
6789
|
+
if (0) {
|
6790
|
+
case T_STRING:
|
6791
|
+
sm_value_s = sm_value;
|
6792
|
+
}
|
6793
|
+
S_FLOAT_EPSILON =
|
6794
|
+
#ifdef USE_FLOAT
|
6795
|
+
strtof(StringValueCStr(sm_value_s), NULL)
|
6796
|
+
#else
|
6797
|
+
strtod(StringValueCStr(sm_value_s), NULL)
|
6798
|
+
#endif
|
6799
|
+
;
|
6800
|
+
break;
|
6801
|
+
}
|
6802
|
+
} /* switch (TYPE(sm_value)) */
|
6803
|
+
return sm_value;
|
6804
|
+
}
|
6805
|
+
|
6806
|
+
|
6903
6807
|
void Init_bindings()
|
6904
6808
|
{
|
6905
6809
|
ID kRB_CONST_SIZE, kRB_CONST_LENGTH, kRB_CONST_FLOAT_SIZE, kRB_CONST_TYPE,
|
@@ -6909,10 +6813,6 @@ void Init_bindings()
|
|
6909
6813
|
kRB_IVAR_MATHARRAY_LENGTH = rb_intern("__length");
|
6910
6814
|
kRB_IVAR_MATHARRAY_CACHE = rb_intern("__cache");
|
6911
6815
|
kRB_IVAR_MATHARRAY_SOURCE = rb_intern("__source");
|
6912
|
-
kRB_CONST_SIZE = rb_intern("SIZE");
|
6913
|
-
kRB_CONST_LENGTH = rb_intern("LENGTH");
|
6914
|
-
kRB_CONST_FLOAT_SIZE = rb_intern("SNOW_MATH_FLOAT_SIZE");
|
6915
|
-
kRB_CONST_TYPE = rb_intern("TYPE");
|
6916
6816
|
kRB_SIZE_METHOD = rb_intern("size");
|
6917
6817
|
kRB_BYTESIZE_METHOD = rb_intern("bytesize");
|
6918
6818
|
|
@@ -6929,19 +6829,25 @@ void Init_bindings()
|
|
6929
6829
|
s_sm_mat3_klass = rb_define_class_under(s_sm_snowmath_mod, "Mat3", rb_cData);
|
6930
6830
|
s_sm_mat4_klass = rb_define_class_under(s_sm_snowmath_mod, "Mat4", rb_cData);
|
6931
6831
|
|
6932
|
-
|
6933
|
-
|
6934
|
-
|
6935
|
-
|
6936
|
-
|
6937
|
-
|
6938
|
-
|
6939
|
-
|
6940
|
-
|
6941
|
-
|
6942
|
-
|
6943
|
-
|
6944
|
-
|
6832
|
+
rb_define_const(s_sm_snowmath_mod, "SNOW_MATH_FLOAT_SIZE", INT2FIX(sizeof(s_float_t)));
|
6833
|
+
rb_define_const(s_sm_snowmath_mod, "SNOW_MATH_DEFAULT_FLOAT_EPSILON", DBL2NUM(S_FLOAT_EPSILON));
|
6834
|
+
rb_define_const(s_sm_snowmath_mod, "DEGREES_TO_RADIANS", DBL2NUM(S_DEG2RAD));
|
6835
|
+
rb_define_const(s_sm_snowmath_mod, "RADIANS_TO_DEGREES", DBL2NUM(S_RAD2DEG));
|
6836
|
+
rb_define_const(s_sm_vec2_klass, "SIZE", INT2FIX(sizeof(vec2_t)));
|
6837
|
+
rb_define_const(s_sm_vec3_klass, "SIZE", INT2FIX(sizeof(vec3_t)));
|
6838
|
+
rb_define_const(s_sm_vec4_klass, "SIZE", INT2FIX(sizeof(vec4_t)));
|
6839
|
+
rb_define_const(s_sm_quat_klass, "SIZE", INT2FIX(sizeof(quat_t)));
|
6840
|
+
rb_define_const(s_sm_mat3_klass, "SIZE", INT2FIX(sizeof(mat3_t)));
|
6841
|
+
rb_define_const(s_sm_mat4_klass, "SIZE", INT2FIX(sizeof(mat4_t)));
|
6842
|
+
rb_define_const(s_sm_vec2_klass, "LENGTH", INT2FIX(sizeof(vec2_t) / sizeof(s_float_t)));
|
6843
|
+
rb_define_const(s_sm_vec3_klass, "LENGTH", INT2FIX(sizeof(vec3_t) / sizeof(s_float_t)));
|
6844
|
+
rb_define_const(s_sm_vec4_klass, "LENGTH", INT2FIX(sizeof(vec4_t) / sizeof(s_float_t)));
|
6845
|
+
rb_define_const(s_sm_quat_klass, "LENGTH", INT2FIX(sizeof(quat_t) / sizeof(s_float_t)));
|
6846
|
+
rb_define_const(s_sm_mat3_klass, "LENGTH", INT2FIX(sizeof(mat3_t) / sizeof(s_float_t)));
|
6847
|
+
rb_define_const(s_sm_mat4_klass, "LENGTH", INT2FIX(sizeof(mat4_t) / sizeof(s_float_t)));
|
6848
|
+
|
6849
|
+
rb_define_singleton_method(s_sm_snowmath_mod, "float_epsilon=", sm_set_float_epsilon, 1);
|
6850
|
+
rb_define_singleton_method(s_sm_snowmath_mod, "float_epsilon", sm_get_float_epsilon, 0);
|
6945
6851
|
|
6946
6852
|
rb_define_singleton_method(s_sm_vec2_klass, "new", sm_vec2_new, -1);
|
6947
6853
|
rb_define_method(s_sm_vec2_klass, "initialize", sm_vec2_init, -1);
|
@@ -7126,9 +7032,9 @@ void Init_bindings()
|
|
7126
7032
|
#if BUILD_ARRAY_TYPE
|
7127
7033
|
|
7128
7034
|
s_sm_vec2_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Vec2Array", rb_cData);
|
7129
|
-
|
7035
|
+
rb_define_const(s_sm_vec2_array_klass, "TYPE", s_sm_vec2_klass);
|
7130
7036
|
rb_define_singleton_method(s_sm_vec2_array_klass, "new", sm_vec2_array_new, 1);
|
7131
|
-
rb_define_method(s_sm_vec2_array_klass, "freeze",
|
7037
|
+
rb_define_method(s_sm_vec2_array_klass, "freeze", sm_mathtype_array_freeze, 0);
|
7132
7038
|
rb_define_method(s_sm_vec2_array_klass, "fetch", sm_vec2_array_fetch, 1);
|
7133
7039
|
rb_define_method(s_sm_vec2_array_klass, "store", sm_vec2_array_store, 2);
|
7134
7040
|
rb_define_method(s_sm_vec2_array_klass, "resize!", sm_vec2_array_resize, 1);
|
@@ -7138,9 +7044,9 @@ void Init_bindings()
|
|
7138
7044
|
rb_alias(s_sm_vec2_array_klass, kRB_BYTESIZE_METHOD, kRB_SIZE_METHOD);
|
7139
7045
|
|
7140
7046
|
s_sm_vec3_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Vec3Array", rb_cData);
|
7141
|
-
|
7047
|
+
rb_define_const(s_sm_vec3_array_klass, "TYPE", s_sm_vec3_klass);
|
7142
7048
|
rb_define_singleton_method(s_sm_vec3_array_klass, "new", sm_vec3_array_new, 1);
|
7143
|
-
rb_define_method(s_sm_vec3_array_klass, "freeze",
|
7049
|
+
rb_define_method(s_sm_vec3_array_klass, "freeze", sm_mathtype_array_freeze, 0);
|
7144
7050
|
rb_define_method(s_sm_vec3_array_klass, "fetch", sm_vec3_array_fetch, 1);
|
7145
7051
|
rb_define_method(s_sm_vec3_array_klass, "store", sm_vec3_array_store, 2);
|
7146
7052
|
rb_define_method(s_sm_vec3_array_klass, "resize!", sm_vec3_array_resize, 1);
|
@@ -7150,9 +7056,9 @@ void Init_bindings()
|
|
7150
7056
|
rb_alias(s_sm_vec3_array_klass, kRB_BYTESIZE_METHOD, kRB_SIZE_METHOD);
|
7151
7057
|
|
7152
7058
|
s_sm_vec4_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Vec4Array", rb_cData);
|
7153
|
-
|
7059
|
+
rb_define_const(s_sm_vec4_array_klass, "TYPE", s_sm_vec4_klass);
|
7154
7060
|
rb_define_singleton_method(s_sm_vec4_array_klass, "new", sm_vec4_array_new, 1);
|
7155
|
-
rb_define_method(s_sm_vec4_array_klass, "freeze",
|
7061
|
+
rb_define_method(s_sm_vec4_array_klass, "freeze", sm_mathtype_array_freeze, 0);
|
7156
7062
|
rb_define_method(s_sm_vec4_array_klass, "fetch", sm_vec4_array_fetch, 1);
|
7157
7063
|
rb_define_method(s_sm_vec4_array_klass, "store", sm_vec4_array_store, 2);
|
7158
7064
|
rb_define_method(s_sm_vec4_array_klass, "resize!", sm_vec4_array_resize, 1);
|
@@ -7162,9 +7068,9 @@ void Init_bindings()
|
|
7162
7068
|
rb_alias(s_sm_vec4_array_klass, kRB_BYTESIZE_METHOD, kRB_SIZE_METHOD);
|
7163
7069
|
|
7164
7070
|
s_sm_quat_array_klass = rb_define_class_under(s_sm_snowmath_mod, "QuatArray", rb_cData);
|
7165
|
-
|
7071
|
+
rb_define_const(s_sm_quat_array_klass, "TYPE", s_sm_quat_klass);
|
7166
7072
|
rb_define_singleton_method(s_sm_quat_array_klass, "new", sm_quat_array_new, 1);
|
7167
|
-
rb_define_method(s_sm_quat_array_klass, "freeze",
|
7073
|
+
rb_define_method(s_sm_quat_array_klass, "freeze", sm_mathtype_array_freeze, 0);
|
7168
7074
|
rb_define_method(s_sm_quat_array_klass, "fetch", sm_quat_array_fetch, 1);
|
7169
7075
|
rb_define_method(s_sm_quat_array_klass, "store", sm_quat_array_store, 2);
|
7170
7076
|
rb_define_method(s_sm_quat_array_klass, "resize!", sm_quat_array_resize, 1);
|
@@ -7174,9 +7080,9 @@ void Init_bindings()
|
|
7174
7080
|
rb_alias(s_sm_quat_array_klass, kRB_BYTESIZE_METHOD, kRB_SIZE_METHOD);
|
7175
7081
|
|
7176
7082
|
s_sm_mat3_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Mat3Array", rb_cData);
|
7177
|
-
|
7083
|
+
rb_define_const(s_sm_mat3_array_klass, "TYPE", s_sm_mat3_klass);
|
7178
7084
|
rb_define_singleton_method(s_sm_mat3_array_klass, "new", sm_mat3_array_new, 1);
|
7179
|
-
rb_define_method(s_sm_mat3_array_klass, "freeze",
|
7085
|
+
rb_define_method(s_sm_mat3_array_klass, "freeze", sm_mathtype_array_freeze, 0);
|
7180
7086
|
rb_define_method(s_sm_mat3_array_klass, "fetch", sm_mat3_array_fetch, 1);
|
7181
7087
|
rb_define_method(s_sm_mat3_array_klass, "store", sm_mat3_array_store, 2);
|
7182
7088
|
rb_define_method(s_sm_mat3_array_klass, "resize!", sm_mat3_array_resize, 1);
|
@@ -7186,9 +7092,9 @@ void Init_bindings()
|
|
7186
7092
|
rb_alias(s_sm_mat3_array_klass, kRB_BYTESIZE_METHOD, kRB_SIZE_METHOD);
|
7187
7093
|
|
7188
7094
|
s_sm_mat4_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Mat4Array", rb_cData);
|
7189
|
-
|
7095
|
+
rb_define_const(s_sm_mat4_array_klass, "TYPE", s_sm_mat4_klass);
|
7190
7096
|
rb_define_singleton_method(s_sm_mat4_array_klass, "new", sm_mat4_array_new, 1);
|
7191
|
-
rb_define_method(s_sm_mat4_array_klass, "freeze",
|
7097
|
+
rb_define_method(s_sm_mat4_array_klass, "freeze", sm_mathtype_array_freeze, 0);
|
7192
7098
|
rb_define_method(s_sm_mat4_array_klass, "fetch", sm_mat4_array_fetch, 1);
|
7193
7099
|
rb_define_method(s_sm_mat4_array_klass, "store", sm_mat4_array_store, 2);
|
7194
7100
|
rb_define_method(s_sm_mat4_array_klass, "resize!", sm_mat4_array_resize, 1);
|
data/lib/snow-math/mat3.rb
CHANGED
@@ -136,6 +136,47 @@ class Snow::Mat3
|
|
136
136
|
scale x, y, z, self
|
137
137
|
end
|
138
138
|
|
139
|
+
#
|
140
|
+
# Returns the pitch (X-axis rotation) of this matrix in degrees. This assumes
|
141
|
+
# the matrix is orthogonal.
|
142
|
+
#
|
143
|
+
def pitch
|
144
|
+
tx = self[6]
|
145
|
+
tz = self[8]
|
146
|
+
Math::atan2(
|
147
|
+
self[7],
|
148
|
+
Math::sqrt(tx * tx + tz * tz)) * ::Snow::RADIANS_TO_DEGREES
|
149
|
+
end
|
150
|
+
|
151
|
+
#
|
152
|
+
# Returns the yaw (Y-axis rotation) of this matrix in degrees. This assumes
|
153
|
+
# the matrix is orthogonal.
|
154
|
+
#
|
155
|
+
def yaw
|
156
|
+
-Math::atan2(self[6], self[8]) * ::Snow::RADIANS_TO_DEGREES
|
157
|
+
end
|
158
|
+
|
159
|
+
#
|
160
|
+
# Returns the roll (Z-axis rotation) of this matrix in degrees. This assumes
|
161
|
+
# the matrix is orthogonal.
|
162
|
+
#
|
163
|
+
def roll
|
164
|
+
Math::atan2(self[1], self[4]) * ::Snow::RADIANS_TO_DEGREES
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
# call-seq:
|
169
|
+
# orthogonal? -> true or false
|
170
|
+
#
|
171
|
+
# Returns whether self is an orthogonal matrix (its columns and rows are all
|
172
|
+
# unit vectors). Note that this allocates a new matrix. You probably don't
|
173
|
+
# want to call it often.
|
174
|
+
#
|
175
|
+
def orthogonal?
|
176
|
+
temp = self.transpose
|
177
|
+
multiply_mat3(temp, temp) == IDENTITY
|
178
|
+
end
|
179
|
+
|
139
180
|
|
140
181
|
alias_method :*, :multiply
|
141
182
|
alias_method :**, :scale
|
data/lib/snow-math/mat4.rb
CHANGED
@@ -162,6 +162,46 @@ class Snow::Mat4
|
|
162
162
|
inverse_general self
|
163
163
|
end
|
164
164
|
|
165
|
+
#
|
166
|
+
# Returns the pitch (X-axis rotation) of this matrix in degrees. This assumes
|
167
|
+
# the matrix is orthogonal.
|
168
|
+
#
|
169
|
+
def pitch
|
170
|
+
tx = self[8]
|
171
|
+
tz = self[10]
|
172
|
+
Math::atan2(
|
173
|
+
self[9],
|
174
|
+
Math::sqrt(tx * tx + tz * tz)) * ::Snow::RADIANS_TO_DEGREES
|
175
|
+
end
|
176
|
+
|
177
|
+
#
|
178
|
+
# Returns the yaw (Y-axis rotation) of this matrix in degrees. This assumes
|
179
|
+
# the matrix is orthogonal.
|
180
|
+
#
|
181
|
+
def yaw
|
182
|
+
-Math::atan2(self[8], self[10]) * ::Snow::RADIANS_TO_DEGREES
|
183
|
+
end
|
184
|
+
|
185
|
+
#
|
186
|
+
# Returns the roll (Z-axis rotation) of this matrix in degrees. This assumes
|
187
|
+
# the matrix is orthogonal.
|
188
|
+
#
|
189
|
+
def roll
|
190
|
+
Math::atan2(self[1], self[5]) * ::Snow::RADIANS_TO_DEGREES
|
191
|
+
end
|
192
|
+
|
193
|
+
#
|
194
|
+
# call-seq:
|
195
|
+
# orthogonal? -> true or false
|
196
|
+
#
|
197
|
+
# Returns whether self is an orthogonal matrix (its columns and rows are all
|
198
|
+
# unit vectors). Note that this allocates a new matrix.
|
199
|
+
#
|
200
|
+
def orthogonal?
|
201
|
+
temp = self.transpose
|
202
|
+
multiply_mat4(temp, temp) == IDENTITY
|
203
|
+
end
|
204
|
+
|
165
205
|
|
166
206
|
alias_method :*, :multiply
|
167
207
|
alias_method :**, :scale
|
data/lib/snow-math/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snow-math
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noel Raymond Cower
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Math types built on the SnowPalm math code
|
14
14
|
email: ncower@gmail.com
|