snow-math 1.3.0pre0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/extconf.rb +50 -8
- data/ext/snow-math/snow-math.c +474 -352
- data/lib/snow-math/mat3.rb +0 -1
- data/lib/snow-math/mat4.rb +0 -1
- data/lib/snow-math/quat.rb +1 -1
- data/lib/snow-math.rb +1 -1
- metadata +3 -3
data/ext/snow-math/snow-math.c
CHANGED
@@ -8,6 +8,9 @@ See COPYING for license information
|
|
8
8
|
#include "maths_local.h"
|
9
9
|
#include "ruby.h"
|
10
10
|
|
11
|
+
#define kSM_WANT_THREE_OR_FOUR_FORMAT_LIT ("Expected a Vec3, Vec4, or Quat, got %s")
|
12
|
+
#define kSM_WANT_FOUR_FORMAT_LIT ("Expected a Vec4 or Quat, got %s")
|
13
|
+
|
11
14
|
/*
|
12
15
|
Generates a label within the current function with the given name. Should be
|
13
16
|
as unique as anyone needs.
|
@@ -289,10 +292,9 @@ static VALUE sm_vec3_array_store(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
289
292
|
rb_raise(rb_eRangeError,
|
290
293
|
"Index %zu out of bounds for array with length %zu",
|
291
294
|
index, length);
|
292
|
-
} else if (!SM_IS_A(sm_value, vec3)) {
|
295
|
+
} else if (!SM_IS_A(sm_value, vec3) && !SM_IS_A(sm_value, vec4) && !SM_IS_A(sm_value, quat)) {
|
293
296
|
rb_raise(rb_eTypeError,
|
294
|
-
"Invalid value to store: expected
|
295
|
-
rb_class2name(s_sm_vec3_klass),
|
297
|
+
"Invalid value to store: expected Vec3, Vec4, or Quat, got %s",
|
296
298
|
rb_obj_classname(sm_value));
|
297
299
|
}
|
298
300
|
|
@@ -480,10 +482,9 @@ static VALUE sm_vec4_array_store(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
480
482
|
rb_raise(rb_eRangeError,
|
481
483
|
"Index %zu out of bounds for array with length %zu",
|
482
484
|
index, length);
|
483
|
-
} else if (!SM_IS_A(sm_value, vec4)) {
|
485
|
+
} else if (!SM_IS_A(sm_value, vec4) || !(SM_IS_A(sm_value, quat))) {
|
484
486
|
rb_raise(rb_eTypeError,
|
485
|
-
"Invalid value to store: expected
|
486
|
-
rb_class2name(s_sm_vec4_klass),
|
487
|
+
"Invalid value to store: expected Quat or Vec4, got %s",
|
487
488
|
rb_obj_classname(sm_value));
|
488
489
|
}
|
489
490
|
|
@@ -671,10 +672,9 @@ static VALUE sm_quat_array_store(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
671
672
|
rb_raise(rb_eRangeError,
|
672
673
|
"Index %zu out of bounds for array with length %zu",
|
673
674
|
index, length);
|
674
|
-
} else if (!SM_IS_A(sm_value, quat)) {
|
675
|
+
} else if (!SM_IS_A(sm_value, vec4) || !(SM_IS_A(sm_value, quat))) {
|
675
676
|
rb_raise(rb_eTypeError,
|
676
|
-
"Invalid value to store: expected
|
677
|
-
rb_class2name(s_sm_quat_klass),
|
677
|
+
"Invalid value to store: expected Quat or Vec4, got %s",
|
678
678
|
rb_obj_classname(sm_value));
|
679
679
|
}
|
680
680
|
|
@@ -849,35 +849,40 @@ static VALUE sm_mat3_array_fetch(VALUE sm_self, VALUE sm_index)
|
|
849
849
|
* array and stored at the index, then no copy is done, otherwise the Mat3 is
|
850
850
|
* copied to the array.
|
851
851
|
*
|
852
|
+
* If the value stored is a Mat4, it will be converted to a Mat3 for storage,
|
853
|
+
* though this will not modify the value directly.
|
854
|
+
*
|
852
855
|
* call-seq: store(index, value) -> value
|
853
856
|
*/
|
854
857
|
static VALUE sm_mat3_array_store(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
855
858
|
{
|
856
859
|
mat3_t *arr;
|
857
|
-
mat3_t *value;
|
858
860
|
size_t length = NUM2SIZET(sm_mathtype_array_length(sm_self));
|
859
861
|
size_t index = NUM2SIZET(sm_index);
|
862
|
+
int is_mat3 = 0;
|
860
863
|
|
861
864
|
if (index >= length) {
|
862
865
|
rb_raise(rb_eRangeError,
|
863
866
|
"Index %zu out of bounds for array with length %zu",
|
864
867
|
index, length);
|
865
|
-
} else if (!SM_IS_A(sm_value, mat3)) {
|
868
|
+
} else if (!(is_mat3 = SM_IS_A(sm_value, mat3)) && !SM_IS_A(sm_value, mat4)) {
|
866
869
|
rb_raise(rb_eTypeError,
|
867
|
-
"Invalid value to store: expected
|
868
|
-
rb_class2name(s_sm_mat3_klass),
|
870
|
+
"Invalid value to store: expected Mat3 or Mat4, got %s",
|
869
871
|
rb_obj_classname(sm_value));
|
870
872
|
}
|
871
873
|
|
872
874
|
Data_Get_Struct(sm_self, mat3_t, arr);
|
873
|
-
value = sm_unwrap_mat3(sm_value, NULL);
|
874
875
|
|
875
|
-
if (
|
876
|
-
|
877
|
-
|
876
|
+
if (is_mat3) {
|
877
|
+
mat3_t *value = sm_unwrap_mat3(sm_value, NULL);
|
878
|
+
if (value == &arr[index]) {
|
879
|
+
/* The object's part of the array, don't bother copying */
|
880
|
+
return sm_value;
|
881
|
+
}
|
882
|
+
mat3_copy(*value, arr[index]);
|
883
|
+
} else {
|
884
|
+
mat4_to_mat3(*sm_unwrap_mat4(sm_value, NULL), arr[index]);
|
878
885
|
}
|
879
|
-
|
880
|
-
mat3_copy(*value, arr[index]);
|
881
886
|
return sm_value;
|
882
887
|
}
|
883
888
|
|
@@ -1040,35 +1045,40 @@ static VALUE sm_mat4_array_fetch(VALUE sm_self, VALUE sm_index)
|
|
1040
1045
|
* array and stored at the index, then no copy is done, otherwise the Mat4 is
|
1041
1046
|
* copied to the array.
|
1042
1047
|
*
|
1048
|
+
* If the value stored is a Mat3, it will be converted to a Mat4 for storage,
|
1049
|
+
* though this will not modify the value directly.
|
1050
|
+
*
|
1043
1051
|
* call-seq: store(index, value) -> value
|
1044
1052
|
*/
|
1045
1053
|
static VALUE sm_mat4_array_store(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
1046
1054
|
{
|
1047
1055
|
mat4_t *arr;
|
1048
|
-
mat4_t *value;
|
1049
1056
|
size_t length = NUM2SIZET(sm_mathtype_array_length(sm_self));
|
1050
1057
|
size_t index = NUM2SIZET(sm_index);
|
1058
|
+
int is_mat4 = 0;
|
1051
1059
|
|
1052
1060
|
if (index >= length) {
|
1053
1061
|
rb_raise(rb_eRangeError,
|
1054
1062
|
"Index %zu out of bounds for array with length %zu",
|
1055
1063
|
index, length);
|
1056
|
-
} else if (!SM_IS_A(sm_value, mat4)) {
|
1064
|
+
} else if (!(is_mat4 = SM_IS_A(sm_value, mat4)) && !SM_IS_A(sm_value, mat3)) {
|
1057
1065
|
rb_raise(rb_eTypeError,
|
1058
|
-
"Invalid value to store: expected
|
1059
|
-
rb_class2name(s_sm_mat4_klass),
|
1066
|
+
"Invalid value to store: expected Mat3 or Mat4, got %s",
|
1060
1067
|
rb_obj_classname(sm_value));
|
1061
1068
|
}
|
1062
1069
|
|
1063
1070
|
Data_Get_Struct(sm_self, mat4_t, arr);
|
1064
|
-
value = sm_unwrap_mat4(sm_value, NULL);
|
1065
1071
|
|
1066
|
-
if (
|
1067
|
-
|
1068
|
-
|
1072
|
+
if (is_mat4) {
|
1073
|
+
mat4_t *value = sm_unwrap_mat4(sm_value, NULL);
|
1074
|
+
if (value == &arr[index]) {
|
1075
|
+
/* The object's part of the array, don't bother copying */
|
1076
|
+
return sm_value;
|
1077
|
+
}
|
1078
|
+
mat4_copy(*value, arr[index]);
|
1079
|
+
} else {
|
1080
|
+
mat3_to_mat4(*sm_unwrap_mat3(sm_value, NULL), arr[index]);
|
1069
1081
|
}
|
1070
|
-
|
1071
|
-
mat4_copy(*value, arr[index]);
|
1072
1082
|
return sm_value;
|
1073
1083
|
}
|
1074
1084
|
|
@@ -1203,7 +1213,12 @@ static VALUE sm_vec3_length (VALUE self)
|
|
1203
1213
|
if (!RTEST(sm_out)) {
|
1204
1214
|
goto SM_LABEL(skip_output);
|
1205
1215
|
}{
|
1206
|
-
|
1216
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1217
|
+
rb_raise(rb_eTypeError,
|
1218
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1219
|
+
rb_obj_classname(sm_out));
|
1220
|
+
return Qnil;
|
1221
|
+
}
|
1207
1222
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1208
1223
|
vec3_copy (*self, *output);
|
1209
1224
|
}} else if (argc == 0) {
|
@@ -1237,7 +1252,12 @@ static VALUE sm_vec3_length (VALUE self)
|
|
1237
1252
|
if (!RTEST(sm_out)) {
|
1238
1253
|
goto SM_LABEL(skip_output);
|
1239
1254
|
}{
|
1240
|
-
|
1255
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1256
|
+
rb_raise(rb_eTypeError,
|
1257
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1258
|
+
rb_obj_classname(sm_out));
|
1259
|
+
return Qnil;
|
1260
|
+
}
|
1241
1261
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1242
1262
|
vec3_normalize (*self, *output);
|
1243
1263
|
}} else if (argc == 0) {
|
@@ -1271,7 +1291,12 @@ static VALUE sm_vec3_length (VALUE self)
|
|
1271
1291
|
if (!RTEST(sm_out)) {
|
1272
1292
|
goto SM_LABEL(skip_output);
|
1273
1293
|
}{
|
1274
|
-
|
1294
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1295
|
+
rb_raise(rb_eTypeError,
|
1296
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1297
|
+
rb_obj_classname(sm_out));
|
1298
|
+
return Qnil;
|
1299
|
+
}
|
1275
1300
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1276
1301
|
vec3_inverse (*self, *output);
|
1277
1302
|
}} else if (argc == 0) {
|
@@ -1304,7 +1329,12 @@ static VALUE sm_vec3_length (VALUE self)
|
|
1304
1329
|
if (!RTEST(sm_out)) {
|
1305
1330
|
goto SM_LABEL(skip_output);
|
1306
1331
|
}{
|
1307
|
-
|
1332
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1333
|
+
rb_raise(rb_eTypeError,
|
1334
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1335
|
+
rb_obj_classname(sm_out));
|
1336
|
+
return Qnil;
|
1337
|
+
}
|
1308
1338
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1309
1339
|
vec3_negate (*self, *output);
|
1310
1340
|
}} else if (argc == 0) {
|
@@ -1335,13 +1365,23 @@ static VALUE sm_vec3_project(int argc, VALUE *argv, VALUE sm_self)
|
|
1335
1365
|
vec3_t *rhs;
|
1336
1366
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
1337
1367
|
self = sm_unwrap_vec3(sm_self, NULL);
|
1338
|
-
|
1368
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
1369
|
+
rb_raise(rb_eTypeError,
|
1370
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1371
|
+
rb_obj_classname(sm_rhs));
|
1372
|
+
return Qnil;
|
1373
|
+
}
|
1339
1374
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
1340
1375
|
if (argc == 2) {
|
1341
1376
|
if (!RTEST(sm_out)) {
|
1342
1377
|
goto SM_LABEL(skip_output);
|
1343
1378
|
}{
|
1344
|
-
|
1379
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1380
|
+
rb_raise(rb_eTypeError,
|
1381
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1382
|
+
rb_obj_classname(sm_out));
|
1383
|
+
return Qnil;
|
1384
|
+
}
|
1345
1385
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1346
1386
|
vec3_project(*self, *rhs, *output);
|
1347
1387
|
}} else if (argc == 1) {
|
@@ -1372,13 +1412,23 @@ static VALUE sm_vec3_reflect(int argc, VALUE *argv, VALUE sm_self)
|
|
1372
1412
|
vec3_t *rhs;
|
1373
1413
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
1374
1414
|
self = sm_unwrap_vec3(sm_self, NULL);
|
1375
|
-
|
1415
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
1416
|
+
rb_raise(rb_eTypeError,
|
1417
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1418
|
+
rb_obj_classname(sm_rhs));
|
1419
|
+
return Qnil;
|
1420
|
+
}
|
1376
1421
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
1377
1422
|
if (argc == 2) {
|
1378
1423
|
if (!RTEST(sm_out)) {
|
1379
1424
|
goto SM_LABEL(skip_output);
|
1380
1425
|
}{
|
1381
|
-
|
1426
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1427
|
+
rb_raise(rb_eTypeError,
|
1428
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1429
|
+
rb_obj_classname(sm_out));
|
1430
|
+
return Qnil;
|
1431
|
+
}
|
1382
1432
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1383
1433
|
vec3_reflect(*self, *rhs, *output);
|
1384
1434
|
}} else if (argc == 1) {
|
@@ -1409,13 +1459,23 @@ static VALUE sm_vec3_cross_product(int argc, VALUE *argv, VALUE sm_self)
|
|
1409
1459
|
vec3_t *rhs;
|
1410
1460
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
1411
1461
|
self = sm_unwrap_vec3(sm_self, NULL);
|
1412
|
-
|
1462
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
1463
|
+
rb_raise(rb_eTypeError,
|
1464
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1465
|
+
rb_obj_classname(sm_rhs));
|
1466
|
+
return Qnil;
|
1467
|
+
}
|
1413
1468
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
1414
1469
|
if (argc == 2) {
|
1415
1470
|
if (!RTEST(sm_out)) {
|
1416
1471
|
goto SM_LABEL(skip_output);
|
1417
1472
|
}{
|
1418
|
-
|
1473
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1474
|
+
rb_raise(rb_eTypeError,
|
1475
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1476
|
+
rb_obj_classname(sm_out));
|
1477
|
+
return Qnil;
|
1478
|
+
}
|
1419
1479
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1420
1480
|
vec3_cross_product(*self, *rhs, *output);
|
1421
1481
|
}} else if (argc == 1) {
|
@@ -1447,13 +1507,23 @@ static VALUE sm_vec3_multiply(int argc, VALUE *argv, VALUE sm_self)
|
|
1447
1507
|
vec3_t *rhs;
|
1448
1508
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
1449
1509
|
self = sm_unwrap_vec3(sm_self, NULL);
|
1450
|
-
|
1510
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
1511
|
+
rb_raise(rb_eTypeError,
|
1512
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1513
|
+
rb_obj_classname(sm_rhs));
|
1514
|
+
return Qnil;
|
1515
|
+
}
|
1451
1516
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
1452
1517
|
if (argc == 2) {
|
1453
1518
|
if (!RTEST(sm_out)) {
|
1454
1519
|
goto SM_LABEL(skip_output);
|
1455
1520
|
}{
|
1456
|
-
|
1521
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1522
|
+
rb_raise(rb_eTypeError,
|
1523
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1524
|
+
rb_obj_classname(sm_out));
|
1525
|
+
return Qnil;
|
1526
|
+
}
|
1457
1527
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1458
1528
|
vec3_multiply(*self, *rhs, *output);
|
1459
1529
|
}} else if (argc == 1) {
|
@@ -1484,13 +1554,23 @@ static VALUE sm_vec3_add(int argc, VALUE *argv, VALUE sm_self)
|
|
1484
1554
|
vec3_t *rhs;
|
1485
1555
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
1486
1556
|
self = sm_unwrap_vec3(sm_self, NULL);
|
1487
|
-
|
1557
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
1558
|
+
rb_raise(rb_eTypeError,
|
1559
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1560
|
+
rb_obj_classname(sm_rhs));
|
1561
|
+
return Qnil;
|
1562
|
+
}
|
1488
1563
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
1489
1564
|
if (argc == 2) {
|
1490
1565
|
if (!RTEST(sm_out)) {
|
1491
1566
|
goto SM_LABEL(skip_output);
|
1492
1567
|
}{
|
1493
|
-
|
1568
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1569
|
+
rb_raise(rb_eTypeError,
|
1570
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1571
|
+
rb_obj_classname(sm_out));
|
1572
|
+
return Qnil;
|
1573
|
+
}
|
1494
1574
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1495
1575
|
vec3_add(*self, *rhs, *output);
|
1496
1576
|
}} else if (argc == 1) {
|
@@ -1522,13 +1602,23 @@ static VALUE sm_vec3_subtract(int argc, VALUE *argv, VALUE sm_self)
|
|
1522
1602
|
vec3_t *rhs;
|
1523
1603
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
1524
1604
|
self = sm_unwrap_vec3(sm_self, NULL);
|
1525
|
-
|
1605
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
1606
|
+
rb_raise(rb_eTypeError,
|
1607
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1608
|
+
rb_obj_classname(sm_rhs));
|
1609
|
+
return Qnil;
|
1610
|
+
}
|
1526
1611
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
1527
1612
|
if (argc == 2) {
|
1528
1613
|
if (!RTEST(sm_out)) {
|
1529
1614
|
goto SM_LABEL(skip_output);
|
1530
1615
|
}{
|
1531
|
-
|
1616
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1617
|
+
rb_raise(rb_eTypeError,
|
1618
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
1619
|
+
rb_obj_classname(sm_out));
|
1620
|
+
return Qnil;
|
1621
|
+
}
|
1532
1622
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
1533
1623
|
vec3_subtract(*self, *rhs, *output);
|
1534
1624
|
}} else if (argc == 1) {
|
@@ -1890,7 +1980,7 @@ static VALUE sm_vec4_length (VALUE self)
|
|
1890
1980
|
* Returns a copy of self.
|
1891
1981
|
*
|
1892
1982
|
* call-seq:
|
1893
|
-
* copy(output = nil) -> output or new vec4
|
1983
|
+
* copy(output = nil) -> output or new vec4 / quat
|
1894
1984
|
*/
|
1895
1985
|
static VALUE sm_vec4_copy(int argc, VALUE *argv, VALUE sm_self)
|
1896
1986
|
{
|
@@ -1902,7 +1992,12 @@ static VALUE sm_vec4_length (VALUE self)
|
|
1902
1992
|
if (!RTEST(sm_out)) {
|
1903
1993
|
goto SM_LABEL(skip_output);
|
1904
1994
|
}{
|
1905
|
-
|
1995
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
1996
|
+
rb_raise(rb_eTypeError,
|
1997
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
1998
|
+
rb_obj_classname(sm_out));
|
1999
|
+
return Qnil;
|
2000
|
+
}
|
1906
2001
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
1907
2002
|
vec4_copy (*self, *output);
|
1908
2003
|
}} else if (argc == 0) {
|
@@ -1920,10 +2015,11 @@ static VALUE sm_vec4_length (VALUE self)
|
|
1920
2015
|
|
1921
2016
|
|
1922
2017
|
/*
|
1923
|
-
* Returns a normalized
|
2018
|
+
* Returns a normalized Vec4 or Quat, depending on the type of the receiver and
|
2019
|
+
* output.
|
1924
2020
|
*
|
1925
2021
|
* call-seq:
|
1926
|
-
* normalize(output = nil) -> output or new vec4
|
2022
|
+
* normalize(output = nil) -> output or new vec4 / quat
|
1927
2023
|
*/
|
1928
2024
|
static VALUE sm_vec4_normalize(int argc, VALUE *argv, VALUE sm_self)
|
1929
2025
|
{
|
@@ -1935,7 +2031,11 @@ static VALUE sm_vec4_length (VALUE self)
|
|
1935
2031
|
if (!RTEST(sm_out)) {
|
1936
2032
|
goto SM_LABEL(skip_output);
|
1937
2033
|
}{
|
1938
|
-
|
2034
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2035
|
+
rb_raise(rb_eTypeError,
|
2036
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2037
|
+
rb_obj_classname(sm_out));
|
2038
|
+
}
|
1939
2039
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
1940
2040
|
vec4_normalize (*self, *output);
|
1941
2041
|
}} else if (argc == 0) {
|
@@ -1969,7 +2069,12 @@ static VALUE sm_vec4_length (VALUE self)
|
|
1969
2069
|
if (!RTEST(sm_out)) {
|
1970
2070
|
goto SM_LABEL(skip_output);
|
1971
2071
|
}{
|
1972
|
-
|
2072
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2073
|
+
rb_raise(rb_eTypeError,
|
2074
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2075
|
+
rb_obj_classname(sm_out));
|
2076
|
+
return Qnil;
|
2077
|
+
}
|
1973
2078
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
1974
2079
|
vec4_inverse (*self, *output);
|
1975
2080
|
}} else if (argc == 0) {
|
@@ -1987,10 +2092,10 @@ static VALUE sm_vec4_length (VALUE self)
|
|
1987
2092
|
|
1988
2093
|
|
1989
2094
|
/*
|
1990
|
-
* Negates this vector's components and returns the result.
|
2095
|
+
* Negates this vector or quaternions's components and returns the result.
|
1991
2096
|
*
|
1992
2097
|
* call-seq:
|
1993
|
-
* negate(output = nil) -> output or new vec4
|
2098
|
+
* negate(output = nil) -> output or new vec4 or quat
|
1994
2099
|
*/
|
1995
2100
|
static VALUE sm_vec4_negate(int argc, VALUE *argv, VALUE sm_self)
|
1996
2101
|
{
|
@@ -2002,7 +2107,12 @@ static VALUE sm_vec4_length (VALUE self)
|
|
2002
2107
|
if (!RTEST(sm_out)) {
|
2003
2108
|
goto SM_LABEL(skip_output);
|
2004
2109
|
}{
|
2005
|
-
|
2110
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2111
|
+
rb_raise(rb_eTypeError,
|
2112
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2113
|
+
rb_obj_classname(sm_out));
|
2114
|
+
return Qnil;
|
2115
|
+
}
|
2006
2116
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
2007
2117
|
vec4_negate (*self, *output);
|
2008
2118
|
}} else if (argc == 0) {
|
@@ -2033,13 +2143,23 @@ static VALUE sm_vec4_project(int argc, VALUE *argv, VALUE sm_self)
|
|
2033
2143
|
vec4_t *rhs;
|
2034
2144
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
2035
2145
|
self = sm_unwrap_vec4(sm_self, NULL);
|
2036
|
-
|
2146
|
+
if (!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2147
|
+
rb_raise(rb_eTypeError,
|
2148
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2149
|
+
rb_obj_classname(sm_rhs));
|
2150
|
+
return Qnil;
|
2151
|
+
}
|
2037
2152
|
rhs = sm_unwrap_vec4(sm_rhs, NULL);
|
2038
2153
|
if (argc == 2) {
|
2039
2154
|
if (!RTEST(sm_out)) {
|
2040
2155
|
goto SM_LABEL(skip_output);
|
2041
2156
|
}{
|
2042
|
-
|
2157
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2158
|
+
rb_raise(rb_eTypeError,
|
2159
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2160
|
+
rb_obj_classname(sm_out));
|
2161
|
+
return Qnil;
|
2162
|
+
}
|
2043
2163
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
2044
2164
|
vec4_project(*self, *rhs, *output);
|
2045
2165
|
}} else if (argc == 1) {
|
@@ -2070,13 +2190,23 @@ static VALUE sm_vec4_reflect(int argc, VALUE *argv, VALUE sm_self)
|
|
2070
2190
|
vec4_t *rhs;
|
2071
2191
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
2072
2192
|
self = sm_unwrap_vec4(sm_self, NULL);
|
2073
|
-
|
2193
|
+
if (!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2194
|
+
rb_raise(rb_eTypeError,
|
2195
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2196
|
+
rb_obj_classname(sm_rhs));
|
2197
|
+
return Qnil;
|
2198
|
+
}
|
2074
2199
|
rhs = sm_unwrap_vec4(sm_rhs, NULL);
|
2075
2200
|
if (argc == 2) {
|
2076
2201
|
if (!RTEST(sm_out)) {
|
2077
2202
|
goto SM_LABEL(skip_output);
|
2078
2203
|
}{
|
2079
|
-
|
2204
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2205
|
+
rb_raise(rb_eTypeError,
|
2206
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2207
|
+
rb_obj_classname(sm_out));
|
2208
|
+
return Qnil;
|
2209
|
+
}
|
2080
2210
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
2081
2211
|
vec4_reflect(*self, *rhs, *output);
|
2082
2212
|
}} else if (argc == 1) {
|
@@ -2108,13 +2238,23 @@ static VALUE sm_vec4_multiply(int argc, VALUE *argv, VALUE sm_self)
|
|
2108
2238
|
vec4_t *rhs;
|
2109
2239
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
2110
2240
|
self = sm_unwrap_vec4(sm_self, NULL);
|
2111
|
-
|
2241
|
+
if (!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2242
|
+
rb_raise(rb_eTypeError,
|
2243
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2244
|
+
rb_obj_classname(sm_rhs));
|
2245
|
+
return Qnil;
|
2246
|
+
}
|
2112
2247
|
rhs = sm_unwrap_vec4(sm_rhs, NULL);
|
2113
2248
|
if (argc == 2) {
|
2114
2249
|
if (!RTEST(sm_out)) {
|
2115
2250
|
goto SM_LABEL(skip_output);
|
2116
2251
|
}{
|
2117
|
-
|
2252
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2253
|
+
rb_raise(rb_eTypeError,
|
2254
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2255
|
+
rb_obj_classname(sm_out));
|
2256
|
+
return Qnil;
|
2257
|
+
}
|
2118
2258
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
2119
2259
|
vec4_multiply(*self, *rhs, *output);
|
2120
2260
|
}} else if (argc == 1) {
|
@@ -2132,10 +2272,11 @@ SM_LABEL(skip_output): {
|
|
2132
2272
|
|
2133
2273
|
|
2134
2274
|
/*
|
2135
|
-
* Adds this and another vector's components together and returns
|
2275
|
+
* Adds this and another vector or quaternion's components together and returns
|
2276
|
+
* the result. The result type is that of the receiver.
|
2136
2277
|
*
|
2137
2278
|
* call-seq:
|
2138
|
-
* add(vec4, output = nil) -> output or new vec4
|
2279
|
+
* add(vec4, output = nil) -> output or new vec4 or quat
|
2139
2280
|
*/
|
2140
2281
|
static VALUE sm_vec4_add(int argc, VALUE *argv, VALUE sm_self)
|
2141
2282
|
{
|
@@ -2145,13 +2286,23 @@ static VALUE sm_vec4_add(int argc, VALUE *argv, VALUE sm_self)
|
|
2145
2286
|
vec4_t *rhs;
|
2146
2287
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
2147
2288
|
self = sm_unwrap_vec4(sm_self, NULL);
|
2148
|
-
|
2289
|
+
if (!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2290
|
+
rb_raise(rb_eTypeError,
|
2291
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2292
|
+
rb_obj_classname(sm_rhs));
|
2293
|
+
return Qnil;
|
2294
|
+
}
|
2149
2295
|
rhs = sm_unwrap_vec4(sm_rhs, NULL);
|
2150
2296
|
if (argc == 2) {
|
2151
2297
|
if (!RTEST(sm_out)) {
|
2152
2298
|
goto SM_LABEL(skip_output);
|
2153
2299
|
}{
|
2154
|
-
|
2300
|
+
if (!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2301
|
+
rb_raise(rb_eTypeError,
|
2302
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2303
|
+
rb_obj_classname(sm_rhs));
|
2304
|
+
return Qnil;
|
2305
|
+
}
|
2155
2306
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
2156
2307
|
vec4_add(*self, *rhs, *output);
|
2157
2308
|
}} else if (argc == 1) {
|
@@ -2169,8 +2320,8 @@ SM_LABEL(skip_output): {
|
|
2169
2320
|
|
2170
2321
|
|
2171
2322
|
/*
|
2172
|
-
* Subtracts another vector's components from this vector's and
|
2173
|
-
* result.
|
2323
|
+
* Subtracts another vector or quaternion's components from this vector's and
|
2324
|
+
* returns the result. The return type is that of the receiver.
|
2174
2325
|
*
|
2175
2326
|
* call-seq:
|
2176
2327
|
* subtract(vec4, output = nil) -> output or new vec4
|
@@ -2183,13 +2334,23 @@ static VALUE sm_vec4_subtract(int argc, VALUE *argv, VALUE sm_self)
|
|
2183
2334
|
vec4_t *rhs;
|
2184
2335
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
2185
2336
|
self = sm_unwrap_vec4(sm_self, NULL);
|
2186
|
-
|
2337
|
+
if (!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2338
|
+
rb_raise(rb_eTypeError,
|
2339
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2340
|
+
rb_obj_classname(sm_rhs));
|
2341
|
+
return Qnil;
|
2342
|
+
}
|
2187
2343
|
rhs = sm_unwrap_vec4(sm_rhs, NULL);
|
2188
2344
|
if (argc == 2) {
|
2189
2345
|
if (!RTEST(sm_out)) {
|
2190
2346
|
goto SM_LABEL(skip_output);
|
2191
2347
|
}{
|
2192
|
-
|
2348
|
+
if (!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2349
|
+
rb_raise(rb_eTypeError,
|
2350
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2351
|
+
rb_obj_classname(sm_rhs));
|
2352
|
+
return Qnil;
|
2353
|
+
}
|
2193
2354
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
2194
2355
|
vec4_subtract(*self, *rhs, *output);
|
2195
2356
|
}} else if (argc == 1) {
|
@@ -2219,7 +2380,7 @@ static VALUE sm_vec4_dot_product(VALUE sm_self, VALUE sm_other)
|
|
2219
2380
|
if (!SM_IS_A(sm_other, vec4) &&
|
2220
2381
|
!SM_IS_A(sm_other, quat)) {
|
2221
2382
|
rb_raise(rb_eArgError,
|
2222
|
-
|
2383
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2223
2384
|
rb_obj_classname(sm_other));
|
2224
2385
|
return Qnil;
|
2225
2386
|
}
|
@@ -2374,7 +2535,8 @@ static VALUE sm_vec4_magnitude(VALUE sm_self)
|
|
2374
2535
|
|
2375
2536
|
|
2376
2537
|
/*
|
2377
|
-
* Scales this vector's components by a scalar value and returns
|
2538
|
+
* Scales this vector or quaternion's components by a scalar value and returns
|
2539
|
+
* the result. The return type is that of the receiver.
|
2378
2540
|
*
|
2379
2541
|
* call-seq:
|
2380
2542
|
* scale(scalar, output = nil) -> output or new vec4
|
@@ -2404,7 +2566,8 @@ static VALUE sm_vec4_scale(int argc, VALUE *argv, VALUE sm_self)
|
|
2404
2566
|
|
2405
2567
|
|
2406
2568
|
/*
|
2407
|
-
* Divides this vector's components by a scalar value and returns
|
2569
|
+
* Divides this vector or quaternion's components by a scalar value and returns
|
2570
|
+
* the result. The return type is that of the receiver.
|
2408
2571
|
*
|
2409
2572
|
* call-seq:
|
2410
2573
|
* divide(scalar, output = nil) -> output or new vec4
|
@@ -2550,39 +2713,6 @@ static VALUE sm_quat_length (VALUE self)
|
|
2550
2713
|
|
2551
2714
|
|
2552
2715
|
|
2553
|
-
/*
|
2554
|
-
* Returns a copy of self.
|
2555
|
-
*
|
2556
|
-
* call-seq:
|
2557
|
-
* copy(output = nil) -> output or new quat
|
2558
|
-
*/
|
2559
|
-
static VALUE sm_quat_copy(int argc, VALUE *argv, VALUE sm_self)
|
2560
|
-
{
|
2561
|
-
VALUE sm_out;
|
2562
|
-
quat_t *self;
|
2563
|
-
rb_scan_args(argc, argv, "01", &sm_out);
|
2564
|
-
self = sm_unwrap_quat(sm_self, NULL);
|
2565
|
-
if (argc == 1) {
|
2566
|
-
if (!RTEST(sm_out)) {
|
2567
|
-
goto SM_LABEL(skip_output);
|
2568
|
-
}{
|
2569
|
-
SM_RAISE_IF_NOT_TYPE(sm_out, quat);
|
2570
|
-
quat_t *output = sm_unwrap_quat(sm_out, NULL);
|
2571
|
-
quat_copy (*self, *output);
|
2572
|
-
}} else if (argc == 0) {
|
2573
|
-
SM_LABEL(skip_output): {
|
2574
|
-
quat_t output;
|
2575
|
-
quat_copy (*self, output);
|
2576
|
-
sm_out = sm_wrap_quat(output, rb_obj_class(sm_self));
|
2577
|
-
rb_obj_call_init(sm_out, 0, 0);
|
2578
|
-
}} else {
|
2579
|
-
rb_raise(rb_eArgError, "Invalid number of arguments to copy");
|
2580
|
-
}
|
2581
|
-
return sm_out;
|
2582
|
-
}
|
2583
|
-
|
2584
|
-
|
2585
|
-
|
2586
2716
|
/*
|
2587
2717
|
* Returns the inverse of this Quat. Note that this is not the same as the
|
2588
2718
|
* inverse of, for example, a Vec4.
|
@@ -2600,7 +2730,12 @@ static VALUE sm_quat_length (VALUE self)
|
|
2600
2730
|
if (!RTEST(sm_out)) {
|
2601
2731
|
goto SM_LABEL(skip_output);
|
2602
2732
|
}{
|
2603
|
-
|
2733
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2734
|
+
rb_raise(rb_eTypeError,
|
2735
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2736
|
+
rb_obj_classname(sm_out));
|
2737
|
+
return Qnil;
|
2738
|
+
}
|
2604
2739
|
quat_t *output = sm_unwrap_quat(sm_out, NULL);
|
2605
2740
|
quat_inverse (*self, *output);
|
2606
2741
|
}} else if (argc == 0) {
|
@@ -2617,39 +2752,6 @@ static VALUE sm_quat_length (VALUE self)
|
|
2617
2752
|
|
2618
2753
|
|
2619
2754
|
|
2620
|
-
/*
|
2621
|
-
* Negates all components of this quaternion and returns the result.
|
2622
|
-
*
|
2623
|
-
* call-seq:
|
2624
|
-
* negate(output = nil) -> output or new quat
|
2625
|
-
*/
|
2626
|
-
static VALUE sm_quat_negate(int argc, VALUE *argv, VALUE sm_self)
|
2627
|
-
{
|
2628
|
-
VALUE sm_out;
|
2629
|
-
quat_t *self;
|
2630
|
-
rb_scan_args(argc, argv, "01", &sm_out);
|
2631
|
-
self = sm_unwrap_quat(sm_self, NULL);
|
2632
|
-
if (argc == 1) {
|
2633
|
-
if (!RTEST(sm_out)) {
|
2634
|
-
goto SM_LABEL(skip_output);
|
2635
|
-
}{
|
2636
|
-
SM_RAISE_IF_NOT_TYPE(sm_out, quat);
|
2637
|
-
quat_t *output = sm_unwrap_quat(sm_out, NULL);
|
2638
|
-
quat_negate (*self, *output);
|
2639
|
-
}} else if (argc == 0) {
|
2640
|
-
SM_LABEL(skip_output): {
|
2641
|
-
quat_t output;
|
2642
|
-
quat_negate (*self, output);
|
2643
|
-
sm_out = sm_wrap_quat(output, rb_obj_class(sm_self));
|
2644
|
-
rb_obj_call_init(sm_out, 0, 0);
|
2645
|
-
}} else {
|
2646
|
-
rb_raise(rb_eArgError, "Invalid number of arguments to negate");
|
2647
|
-
}
|
2648
|
-
return sm_out;
|
2649
|
-
}
|
2650
|
-
|
2651
|
-
|
2652
|
-
|
2653
2755
|
/*
|
2654
2756
|
* Concatenates this quaternion and another and returns the result.
|
2655
2757
|
*
|
@@ -2664,13 +2766,23 @@ static VALUE sm_quat_multiply(int argc, VALUE *argv, VALUE sm_self)
|
|
2664
2766
|
quat_t *rhs;
|
2665
2767
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
2666
2768
|
self = sm_unwrap_quat(sm_self, NULL);
|
2667
|
-
|
2769
|
+
if (!!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2770
|
+
rb_raise(rb_eTypeError,
|
2771
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2772
|
+
rb_obj_classname(sm_rhs));
|
2773
|
+
return Qnil;
|
2774
|
+
}
|
2668
2775
|
rhs = sm_unwrap_quat(sm_rhs, NULL);
|
2669
2776
|
if (argc == 2) {
|
2670
2777
|
if (!RTEST(sm_out)) {
|
2671
2778
|
goto SM_LABEL(skip_output);
|
2672
2779
|
}{
|
2673
|
-
|
2780
|
+
if (!!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2781
|
+
rb_raise(rb_eTypeError,
|
2782
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2783
|
+
rb_obj_classname(sm_out));
|
2784
|
+
return Qnil;
|
2785
|
+
}
|
2674
2786
|
quat_t *output = sm_unwrap_quat(sm_out, NULL);
|
2675
2787
|
quat_multiply(*self, *rhs, *output);
|
2676
2788
|
}} else if (argc == 1) {
|
@@ -2698,23 +2810,33 @@ static VALUE sm_quat_multiply_vec3(int argc, VALUE *argv, VALUE sm_self)
|
|
2698
2810
|
VALUE sm_rhs;
|
2699
2811
|
VALUE sm_out;
|
2700
2812
|
quat_t *self;
|
2701
|
-
|
2813
|
+
vec3_t *rhs;
|
2702
2814
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
2703
2815
|
self = sm_unwrap_quat(sm_self, NULL);
|
2704
|
-
|
2705
|
-
|
2816
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
2817
|
+
rb_raise(rb_eTypeError,
|
2818
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
2819
|
+
rb_obj_classname(sm_rhs));
|
2820
|
+
return Qnil;
|
2821
|
+
}
|
2822
|
+
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
2706
2823
|
if (argc == 2) {
|
2707
2824
|
if (!RTEST(sm_out)) {
|
2708
2825
|
goto SM_LABEL(skip_output);
|
2709
2826
|
}{
|
2710
|
-
|
2711
|
-
|
2827
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
2828
|
+
rb_raise(rb_eTypeError,
|
2829
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
2830
|
+
rb_obj_classname(sm_out));
|
2831
|
+
return Qnil;
|
2832
|
+
}
|
2833
|
+
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
2712
2834
|
quat_multiply_vec3(*self, *rhs, *output);
|
2713
2835
|
}} else if (argc == 1) {
|
2714
2836
|
SM_LABEL(skip_output): {
|
2715
|
-
|
2837
|
+
vec3_t output;
|
2716
2838
|
quat_multiply_vec3(*self, *rhs, output);
|
2717
|
-
sm_out =
|
2839
|
+
sm_out = sm_wrap_vec3(output, rb_obj_class(sm_rhs));
|
2718
2840
|
rb_obj_call_init(sm_out, 0, 0);
|
2719
2841
|
}} else {
|
2720
2842
|
rb_raise(rb_eArgError, "Invalid number of arguments to quat");
|
@@ -2871,7 +2993,12 @@ static VALUE sm_quat_angle_axis(int argc, VALUE *argv, VALUE self)
|
|
2871
2993
|
const vec3_t *axis;
|
2872
2994
|
|
2873
2995
|
rb_scan_args(argc, argv, "21", &sm_angle, &sm_axis, &sm_out);
|
2874
|
-
|
2996
|
+
if (!SM_IS_A(sm_axis, vec3) && !SM_IS_A(sm_axis, vec4) && !SM_IS_A(sm_axis, quat)) {
|
2997
|
+
rb_raise(rb_eTypeError,
|
2998
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
2999
|
+
rb_obj_classname(sm_axis));
|
3000
|
+
return Qnil;
|
3001
|
+
}
|
2875
3002
|
|
2876
3003
|
angle = (s_float_t)rb_num2dbl(sm_angle);
|
2877
3004
|
axis = sm_unwrap_vec3(sm_axis, NULL);
|
@@ -2906,67 +3033,6 @@ static VALUE sm_quat_identity(VALUE sm_self)
|
|
2906
3033
|
|
2907
3034
|
|
2908
3035
|
|
2909
|
-
/*
|
2910
|
-
* Scales this quaternion's components by a scalar value and returns the result.
|
2911
|
-
*
|
2912
|
-
* call-seq:
|
2913
|
-
* scale(scalar, output = nil) -> output or new quat
|
2914
|
-
*/
|
2915
|
-
static VALUE sm_quat_scale(int argc, VALUE *argv, VALUE sm_self)
|
2916
|
-
{
|
2917
|
-
VALUE sm_out;
|
2918
|
-
VALUE sm_scalar;
|
2919
|
-
s_float_t scalar;
|
2920
|
-
vec4_t *self = sm_unwrap_vec4(sm_self, NULL);
|
2921
|
-
|
2922
|
-
rb_scan_args(argc, argv, "11", &sm_scalar, &sm_out);
|
2923
|
-
scalar = rb_num2dbl(sm_scalar);
|
2924
|
-
|
2925
|
-
if ((SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat))) {
|
2926
|
-
vec4_scale(*self, scalar, *sm_unwrap_vec4(sm_out, NULL));
|
2927
|
-
} else {
|
2928
|
-
vec4_t out;
|
2929
|
-
vec4_scale(*self, scalar, out);
|
2930
|
-
sm_out = sm_wrap_quat(out, rb_obj_class(sm_self));
|
2931
|
-
rb_obj_call_init(sm_out, 0, 0);
|
2932
|
-
}
|
2933
|
-
|
2934
|
-
return sm_out;
|
2935
|
-
}
|
2936
|
-
|
2937
|
-
|
2938
|
-
|
2939
|
-
/*
|
2940
|
-
* Divides this quaternion's components by a scalar value and returns the
|
2941
|
-
* result.
|
2942
|
-
*
|
2943
|
-
* call-seq:
|
2944
|
-
* divide(scalar, output = nil) -> output or new quat
|
2945
|
-
*/
|
2946
|
-
static VALUE sm_quat_divide(int argc, VALUE *argv, VALUE sm_self)
|
2947
|
-
{
|
2948
|
-
VALUE sm_out;
|
2949
|
-
VALUE sm_scalar;
|
2950
|
-
s_float_t scalar;
|
2951
|
-
vec4_t *self = sm_unwrap_vec4(sm_self, NULL);
|
2952
|
-
|
2953
|
-
rb_scan_args(argc, argv, "11", &sm_scalar, &sm_out);
|
2954
|
-
scalar = rb_num2dbl(sm_scalar);
|
2955
|
-
|
2956
|
-
if ((SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat))) {
|
2957
|
-
vec4_divide(*self, scalar, *sm_unwrap_vec4(sm_out, NULL));
|
2958
|
-
} else {
|
2959
|
-
vec4_t out;
|
2960
|
-
vec4_divide(*self, scalar, out);
|
2961
|
-
sm_out = sm_wrap_quat(out, rb_obj_class(sm_self));
|
2962
|
-
rb_obj_call_init(sm_out, 0, 0);
|
2963
|
-
}
|
2964
|
-
|
2965
|
-
return sm_out;
|
2966
|
-
}
|
2967
|
-
|
2968
|
-
|
2969
|
-
|
2970
3036
|
/*
|
2971
3037
|
* Returns a quaternion interpolated between self and destination using
|
2972
3038
|
* spherical linear interpolation. Alpha is the interpolation value and must be
|
@@ -2989,7 +3055,7 @@ static VALUE sm_quat_slerp(int argc, VALUE *argv, VALUE sm_self)
|
|
2989
3055
|
|
2990
3056
|
if (!SM_IS_A(sm_destination, vec4) && !SM_IS_A(sm_destination, quat)) {
|
2991
3057
|
rb_raise(rb_eTypeError,
|
2992
|
-
|
3058
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
2993
3059
|
rb_obj_classname(sm_destination));
|
2994
3060
|
return Qnil;
|
2995
3061
|
}
|
@@ -3010,108 +3076,6 @@ static VALUE sm_quat_slerp(int argc, VALUE *argv, VALUE sm_self)
|
|
3010
3076
|
|
3011
3077
|
|
3012
3078
|
|
3013
|
-
/*
|
3014
|
-
* Normalizes the quaternion.
|
3015
|
-
*
|
3016
|
-
* call-seq:
|
3017
|
-
* normalize(output = nil) -> output or new qual
|
3018
|
-
*/
|
3019
|
-
static VALUE sm_quat_normalize(int argc, VALUE *argv, VALUE sm_self)
|
3020
|
-
{
|
3021
|
-
VALUE sm_out;
|
3022
|
-
VALUE sm_scalar;
|
3023
|
-
s_float_t scalar;
|
3024
|
-
vec4_t *self = sm_unwrap_vec4(sm_self, NULL);
|
3025
|
-
|
3026
|
-
rb_scan_args(argc, argv, "01", &sm_scalar, &sm_out);
|
3027
|
-
scalar = rb_num2dbl(sm_scalar);
|
3028
|
-
|
3029
|
-
if ((SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat))) {
|
3030
|
-
vec4_normalize(*self, *sm_unwrap_vec4(sm_out, NULL));
|
3031
|
-
} else {
|
3032
|
-
vec4_t out;
|
3033
|
-
vec4_normalize(*self, out);
|
3034
|
-
sm_out = sm_wrap_quat(out, rb_obj_class(sm_self));
|
3035
|
-
rb_obj_call_init(sm_out, 0, 0);
|
3036
|
-
}
|
3037
|
-
|
3038
|
-
return sm_out;
|
3039
|
-
}
|
3040
|
-
|
3041
|
-
|
3042
|
-
|
3043
|
-
/*
|
3044
|
-
* Adds the components of this and another quaternion together and returns the
|
3045
|
-
* result.
|
3046
|
-
*
|
3047
|
-
* call-seq:
|
3048
|
-
* add(quat, output = nil) -> output or new quat
|
3049
|
-
*/
|
3050
|
-
static VALUE sm_quat_add(int argc, VALUE *argv, VALUE sm_self)
|
3051
|
-
{
|
3052
|
-
VALUE sm_out;
|
3053
|
-
VALUE sm_left;
|
3054
|
-
vec4_t *self = sm_unwrap_vec4(sm_self, NULL);
|
3055
|
-
|
3056
|
-
rb_scan_args(argc, argv, "11", &sm_left, &sm_out);
|
3057
|
-
|
3058
|
-
if (!SM_IS_A(sm_left, vec4) && !SM_IS_A(sm_left, quat)) {
|
3059
|
-
rb_raise(rb_eTypeError,
|
3060
|
-
"Expected either Vec4 or Quat, got %s",
|
3061
|
-
rb_obj_classname(sm_left));
|
3062
|
-
return Qnil;
|
3063
|
-
}
|
3064
|
-
|
3065
|
-
if ((SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat))) {
|
3066
|
-
vec4_add(*self, *sm_unwrap_vec4(sm_left, NULL), *sm_unwrap_vec4(sm_out, NULL));
|
3067
|
-
} else {
|
3068
|
-
vec4_t out;
|
3069
|
-
vec4_add(*self, *sm_unwrap_vec4(sm_left, NULL), out);
|
3070
|
-
sm_out = sm_wrap_quat(out, rb_obj_class(sm_self));
|
3071
|
-
rb_obj_call_init(sm_out, 0, 0);
|
3072
|
-
}
|
3073
|
-
|
3074
|
-
return sm_out;
|
3075
|
-
}
|
3076
|
-
|
3077
|
-
|
3078
|
-
|
3079
|
-
/*
|
3080
|
-
* Subtract's another quaternion's components from this quaternion and returns
|
3081
|
-
* the result.
|
3082
|
-
*
|
3083
|
-
* call-seq:
|
3084
|
-
* subtract(quat, output = nil) -> output or new quat
|
3085
|
-
*/
|
3086
|
-
static VALUE sm_quat_subtract(int argc, VALUE *argv, VALUE sm_self)
|
3087
|
-
{
|
3088
|
-
VALUE sm_out;
|
3089
|
-
VALUE sm_left;
|
3090
|
-
vec4_t *self = sm_unwrap_vec4(sm_self, NULL);
|
3091
|
-
|
3092
|
-
rb_scan_args(argc, argv, "11", &sm_left, &sm_out);
|
3093
|
-
|
3094
|
-
if (!SM_IS_A(sm_left, vec4) && !SM_IS_A(sm_left, quat)) {
|
3095
|
-
rb_raise(rb_eTypeError,
|
3096
|
-
"Expected either Vec4 or Quat, got %s",
|
3097
|
-
rb_obj_classname(sm_left));
|
3098
|
-
return Qnil;
|
3099
|
-
}
|
3100
|
-
|
3101
|
-
if ((SM_IS_A(sm_out, vec4) || SM_IS_A(sm_out, quat))) {
|
3102
|
-
vec4_subtract(*self, *sm_unwrap_vec4(sm_left, NULL), *sm_unwrap_vec4(sm_out, NULL));
|
3103
|
-
} else {
|
3104
|
-
vec4_t out;
|
3105
|
-
vec4_subtract(*self, *sm_unwrap_vec4(sm_left, NULL), out);
|
3106
|
-
sm_out = sm_wrap_quat(out, rb_obj_class(sm_self));
|
3107
|
-
rb_obj_call_init(sm_out, 0, 0);
|
3108
|
-
}
|
3109
|
-
|
3110
|
-
return sm_out;
|
3111
|
-
}
|
3112
|
-
|
3113
|
-
|
3114
|
-
|
3115
3079
|
/*==============================================================================
|
3116
3080
|
|
3117
3081
|
mat4_t functions
|
@@ -3425,13 +3389,23 @@ static VALUE sm_mat4_multiply_vec4(int argc, VALUE *argv, VALUE sm_self)
|
|
3425
3389
|
vec4_t *rhs;
|
3426
3390
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
3427
3391
|
self = sm_unwrap_mat4(sm_self, NULL);
|
3428
|
-
|
3392
|
+
if (!SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
3393
|
+
rb_raise(rb_eTypeError,
|
3394
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
3395
|
+
rb_obj_classname(sm_rhs));
|
3396
|
+
return Qnil;
|
3397
|
+
}
|
3429
3398
|
rhs = sm_unwrap_vec4(sm_rhs, NULL);
|
3430
3399
|
if (argc == 2) {
|
3431
3400
|
if (!RTEST(sm_out)) {
|
3432
3401
|
goto SM_LABEL(skip_output);
|
3433
3402
|
}{
|
3434
|
-
|
3403
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
3404
|
+
rb_raise(rb_eTypeError,
|
3405
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
3406
|
+
rb_obj_classname(sm_out));
|
3407
|
+
return Qnil;
|
3408
|
+
}
|
3435
3409
|
vec4_t *output = sm_unwrap_vec4(sm_out, NULL);
|
3436
3410
|
mat4_multiply_vec4(*self, *rhs, *output);
|
3437
3411
|
}} else if (argc == 1) {
|
@@ -3462,13 +3436,23 @@ static VALUE sm_mat4_transform_vec3(int argc, VALUE *argv, VALUE sm_self)
|
|
3462
3436
|
vec3_t *rhs;
|
3463
3437
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
3464
3438
|
self = sm_unwrap_mat4(sm_self, NULL);
|
3465
|
-
|
3439
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
3440
|
+
rb_raise(rb_eTypeError,
|
3441
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
3442
|
+
rb_obj_classname(sm_rhs));
|
3443
|
+
return Qnil;
|
3444
|
+
}
|
3466
3445
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
3467
3446
|
if (argc == 2) {
|
3468
3447
|
if (!RTEST(sm_out)) {
|
3469
3448
|
goto SM_LABEL(skip_output);
|
3470
3449
|
}{
|
3471
|
-
|
3450
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
3451
|
+
rb_raise(rb_eTypeError,
|
3452
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
3453
|
+
rb_obj_classname(sm_out));
|
3454
|
+
return Qnil;
|
3455
|
+
}
|
3472
3456
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
3473
3457
|
mat4_transform_vec3(*self, *rhs, *output);
|
3474
3458
|
}} else if (argc == 1) {
|
@@ -3500,13 +3484,23 @@ static VALUE sm_mat4_rotate_vec3(int argc, VALUE *argv, VALUE sm_self)
|
|
3500
3484
|
vec3_t *rhs;
|
3501
3485
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
3502
3486
|
self = sm_unwrap_mat4(sm_self, NULL);
|
3503
|
-
|
3487
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
3488
|
+
rb_raise(rb_eTypeError,
|
3489
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
3490
|
+
rb_obj_classname(sm_rhs));
|
3491
|
+
return Qnil;
|
3492
|
+
}
|
3504
3493
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
3505
3494
|
if (argc == 2) {
|
3506
3495
|
if (!RTEST(sm_out)) {
|
3507
3496
|
goto SM_LABEL(skip_output);
|
3508
3497
|
}{
|
3509
|
-
|
3498
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
3499
|
+
rb_raise(rb_eTypeError,
|
3500
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
3501
|
+
rb_obj_classname(sm_out));
|
3502
|
+
return Qnil;
|
3503
|
+
}
|
3510
3504
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
3511
3505
|
mat4_rotate_vec3(*self, *rhs, *output);
|
3512
3506
|
}} else if (argc == 1) {
|
@@ -3538,13 +3532,23 @@ static VALUE sm_mat4_inv_rotate_vec3(int argc, VALUE *argv, VALUE sm_self)
|
|
3538
3532
|
vec3_t *rhs;
|
3539
3533
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
3540
3534
|
self = sm_unwrap_mat4(sm_self, NULL);
|
3541
|
-
|
3535
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
3536
|
+
rb_raise(rb_eTypeError,
|
3537
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
3538
|
+
rb_obj_classname(sm_rhs));
|
3539
|
+
return Qnil;
|
3540
|
+
}
|
3542
3541
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
3543
3542
|
if (argc == 2) {
|
3544
3543
|
if (!RTEST(sm_out)) {
|
3545
3544
|
goto SM_LABEL(skip_output);
|
3546
3545
|
}{
|
3547
|
-
|
3546
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
3547
|
+
rb_raise(rb_eTypeError,
|
3548
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
3549
|
+
rb_obj_classname(sm_out));
|
3550
|
+
return Qnil;
|
3551
|
+
}
|
3548
3552
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
3549
3553
|
mat4_inv_rotate_vec3(*self, *rhs, *output);
|
3550
3554
|
}} else if (argc == 1) {
|
@@ -3877,7 +3881,7 @@ static VALUE sm_mat4_init(int argc, VALUE *argv, VALUE sm_self)
|
|
3877
3881
|
if (!SM_IS_A(argv[arg_index], vec4) && !SM_IS_A(argv[arg_index], quat)) {
|
3878
3882
|
rb_raise(
|
3879
3883
|
rb_eArgError,
|
3880
|
-
"Argument %d must be a Vec4 or Quat when supplying four arguments to Mat4.initialize",
|
3884
|
+
"Argument %d must be a Vec4 or Quat when supplying four arguments to Mat4.initialize/set",
|
3881
3885
|
(int)(arg_index + 1));
|
3882
3886
|
}
|
3883
3887
|
|
@@ -3952,7 +3956,12 @@ static VALUE sm_mat4_angle_axis(int argc, VALUE *argv, VALUE self)
|
|
3952
3956
|
const vec3_t *axis;
|
3953
3957
|
|
3954
3958
|
rb_scan_args(argc, argv, "21", &sm_angle, &sm_axis, &sm_out);
|
3955
|
-
|
3959
|
+
if (!SM_IS_A(sm_axis, vec3) && !SM_IS_A(sm_axis, vec4) && !SM_IS_A(sm_axis, quat)) {
|
3960
|
+
rb_raise(rb_eTypeError,
|
3961
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
3962
|
+
rb_obj_classname(sm_axis));
|
3963
|
+
return Qnil;
|
3964
|
+
}
|
3956
3965
|
|
3957
3966
|
angle = (s_float_t)rb_num2dbl(sm_angle);
|
3958
3967
|
axis = sm_unwrap_vec3(sm_axis, NULL);
|
@@ -3976,7 +3985,7 @@ static VALUE sm_mat4_angle_axis(int argc, VALUE *argv, VALUE self)
|
|
3976
3985
|
* Returns a Vec3 whose components are that of the row at the given index.
|
3977
3986
|
*
|
3978
3987
|
* call-seq:
|
3979
|
-
* get_row3(index) -> new vec3
|
3988
|
+
* get_row3(index, output = nil) -> output or new vec3
|
3980
3989
|
*/
|
3981
3990
|
static VALUE sm_mat4_get_row3(int argc, VALUE *argv, VALUE sm_self)
|
3982
3991
|
{
|
@@ -4000,7 +4009,12 @@ static VALUE sm_mat4_get_row3(int argc, VALUE *argv, VALUE sm_self)
|
|
4000
4009
|
sm_out = argv[1];
|
4001
4010
|
|
4002
4011
|
if (RTEST(sm_out)) {
|
4003
|
-
|
4012
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
4013
|
+
rb_raise(rb_eTypeError,
|
4014
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
4015
|
+
rb_obj_classname(sm_out));
|
4016
|
+
return Qnil;
|
4017
|
+
}
|
4004
4018
|
} else {
|
4005
4019
|
goto SM_LABEL(no_output);
|
4006
4020
|
}
|
@@ -4034,7 +4048,7 @@ static VALUE sm_mat4_get_row3(int argc, VALUE *argv, VALUE sm_self)
|
|
4034
4048
|
* Returns a Vec4 whose components are that of the row at the given index.
|
4035
4049
|
*
|
4036
4050
|
* call-seq:
|
4037
|
-
* get_row4(index) -> new vec4
|
4051
|
+
* get_row4(index, output = nil) -> output or new vec4
|
4038
4052
|
*/
|
4039
4053
|
static VALUE sm_mat4_get_row4(int argc, VALUE *argv, VALUE sm_self)
|
4040
4054
|
{
|
@@ -4058,7 +4072,12 @@ static VALUE sm_mat4_get_row4(int argc, VALUE *argv, VALUE sm_self)
|
|
4058
4072
|
sm_out = argv[1];
|
4059
4073
|
|
4060
4074
|
if (RTEST(sm_out)) {
|
4061
|
-
|
4075
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
4076
|
+
rb_raise(rb_eTypeError,
|
4077
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
4078
|
+
rb_obj_classname(sm_out));
|
4079
|
+
return Qnil;
|
4080
|
+
}
|
4062
4081
|
} else {
|
4063
4082
|
goto SM_LABEL(no_output);
|
4064
4083
|
}
|
@@ -4092,7 +4111,7 @@ static VALUE sm_mat4_get_row4(int argc, VALUE *argv, VALUE sm_self)
|
|
4092
4111
|
* Returns a Vec3 whose components are that of the column at the given index.
|
4093
4112
|
*
|
4094
4113
|
* call-seq:
|
4095
|
-
* get_column3(index) -> new vec3
|
4114
|
+
* get_column3(index, output = nil) -> output or new vec3
|
4096
4115
|
*/
|
4097
4116
|
static VALUE sm_mat4_get_column3(int argc, VALUE *argv, VALUE sm_self)
|
4098
4117
|
{
|
@@ -4116,7 +4135,12 @@ static VALUE sm_mat4_get_column3(int argc, VALUE *argv, VALUE sm_self)
|
|
4116
4135
|
sm_out = argv[1];
|
4117
4136
|
|
4118
4137
|
if (RTEST(sm_out)) {
|
4119
|
-
|
4138
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
4139
|
+
rb_raise(rb_eTypeError,
|
4140
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
4141
|
+
rb_obj_classname(sm_out));
|
4142
|
+
return Qnil;
|
4143
|
+
}
|
4120
4144
|
} else {
|
4121
4145
|
goto SM_LABEL(no_output);
|
4122
4146
|
}
|
@@ -4150,7 +4174,7 @@ static VALUE sm_mat4_get_column3(int argc, VALUE *argv, VALUE sm_self)
|
|
4150
4174
|
* Returns a Vec4 whose components are that of the column at the given index.
|
4151
4175
|
*
|
4152
4176
|
* call-seq:
|
4153
|
-
* get_column4(index) -> new vec4
|
4177
|
+
* get_column4(index, output = nil) -> output or new vec4
|
4154
4178
|
*/
|
4155
4179
|
static VALUE sm_mat4_get_column4(int argc, VALUE *argv, VALUE sm_self)
|
4156
4180
|
{
|
@@ -4174,7 +4198,12 @@ static VALUE sm_mat4_get_column4(int argc, VALUE *argv, VALUE sm_self)
|
|
4174
4198
|
sm_out = argv[1];
|
4175
4199
|
|
4176
4200
|
if (RTEST(sm_out)) {
|
4177
|
-
|
4201
|
+
if (!SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
4202
|
+
rb_raise(rb_eTypeError,
|
4203
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
4204
|
+
rb_obj_classname(sm_out));
|
4205
|
+
return Qnil;
|
4206
|
+
}
|
4178
4207
|
} else {
|
4179
4208
|
goto SM_LABEL(no_output);
|
4180
4209
|
}
|
@@ -4216,7 +4245,12 @@ static VALUE sm_mat4_set_row3(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
4216
4245
|
int index;
|
4217
4246
|
mat4_t *self;
|
4218
4247
|
|
4219
|
-
|
4248
|
+
if (!SM_IS_A(sm_value, vec3) && !SM_IS_A(sm_value, vec4) && !SM_IS_A(sm_value, quat)) {
|
4249
|
+
rb_raise(rb_eTypeError,
|
4250
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
4251
|
+
rb_obj_classname(sm_value));
|
4252
|
+
return Qnil;
|
4253
|
+
}
|
4220
4254
|
|
4221
4255
|
self = sm_unwrap_mat4(sm_self, NULL);
|
4222
4256
|
value = sm_unwrap_vec3(sm_value, NULL);
|
@@ -4246,7 +4280,12 @@ static VALUE sm_mat4_set_column3(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
4246
4280
|
int index;
|
4247
4281
|
mat4_t *self;
|
4248
4282
|
|
4249
|
-
|
4283
|
+
if (!SM_IS_A(sm_value, vec3) && !SM_IS_A(sm_value, vec4) && !SM_IS_A(sm_value, quat)) {
|
4284
|
+
rb_raise(rb_eTypeError,
|
4285
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
4286
|
+
rb_obj_classname(sm_value));
|
4287
|
+
return Qnil;
|
4288
|
+
}
|
4250
4289
|
|
4251
4290
|
self = sm_unwrap_mat4(sm_self, NULL);
|
4252
4291
|
value = sm_unwrap_vec3(sm_value, NULL);
|
@@ -4276,7 +4315,12 @@ static VALUE sm_mat4_set_row4(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
4276
4315
|
int index;
|
4277
4316
|
mat4_t *self;
|
4278
4317
|
|
4279
|
-
|
4318
|
+
if (!SM_IS_A(sm_value, vec4) && !SM_IS_A(sm_value, quat)) {
|
4319
|
+
rb_raise(rb_eTypeError,
|
4320
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
4321
|
+
rb_obj_classname(sm_value));
|
4322
|
+
return Qnil;
|
4323
|
+
}
|
4280
4324
|
|
4281
4325
|
self = sm_unwrap_mat4(sm_self, NULL);
|
4282
4326
|
value = sm_unwrap_vec4(sm_value, NULL);
|
@@ -4306,7 +4350,12 @@ static VALUE sm_mat4_set_column4(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
4306
4350
|
int index;
|
4307
4351
|
mat4_t *self;
|
4308
4352
|
|
4309
|
-
|
4353
|
+
if (!SM_IS_A(sm_value, vec4) && !SM_IS_A(sm_value, quat)) {
|
4354
|
+
rb_raise(rb_eTypeError,
|
4355
|
+
kSM_WANT_FOUR_FORMAT_LIT,
|
4356
|
+
rb_obj_classname(sm_value));
|
4357
|
+
return Qnil;
|
4358
|
+
}
|
4310
4359
|
|
4311
4360
|
self = sm_unwrap_mat4(sm_self, NULL);
|
4312
4361
|
value = sm_unwrap_vec4(sm_value, NULL);
|
@@ -4904,13 +4953,23 @@ static VALUE sm_mat3_rotate_vec3(int argc, VALUE *argv, VALUE sm_self)
|
|
4904
4953
|
vec3_t *rhs;
|
4905
4954
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
4906
4955
|
self = sm_unwrap_mat3(sm_self, NULL);
|
4907
|
-
|
4956
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
4957
|
+
rb_raise(rb_eTypeError,
|
4958
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
4959
|
+
rb_obj_classname(sm_rhs));
|
4960
|
+
return Qnil;
|
4961
|
+
}
|
4908
4962
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
4909
4963
|
if (argc == 2) {
|
4910
4964
|
if (!RTEST(sm_out)) {
|
4911
4965
|
goto SM_LABEL(skip_output);
|
4912
4966
|
}{
|
4913
|
-
|
4967
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
4968
|
+
rb_raise(rb_eTypeError,
|
4969
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
4970
|
+
rb_obj_classname(sm_out));
|
4971
|
+
return Qnil;
|
4972
|
+
}
|
4914
4973
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
4915
4974
|
mat3_rotate_vec3(*self, *rhs, *output);
|
4916
4975
|
}} else if (argc == 1) {
|
@@ -4942,13 +5001,23 @@ static VALUE sm_mat3_inv_rotate_vec3(int argc, VALUE *argv, VALUE sm_self)
|
|
4942
5001
|
vec3_t *rhs;
|
4943
5002
|
rb_scan_args(argc, argv, "11", &sm_rhs, &sm_out);
|
4944
5003
|
self = sm_unwrap_mat3(sm_self, NULL);
|
4945
|
-
|
5004
|
+
if (!SM_IS_A(sm_rhs, vec3) && !SM_IS_A(sm_rhs, vec4) && !SM_IS_A(sm_rhs, quat)) {
|
5005
|
+
rb_raise(rb_eTypeError,
|
5006
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
5007
|
+
rb_obj_classname(sm_rhs));
|
5008
|
+
return Qnil;
|
5009
|
+
}
|
4946
5010
|
rhs = sm_unwrap_vec3(sm_rhs, NULL);
|
4947
5011
|
if (argc == 2) {
|
4948
5012
|
if (!RTEST(sm_out)) {
|
4949
5013
|
goto SM_LABEL(skip_output);
|
4950
5014
|
}{
|
4951
|
-
|
5015
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
5016
|
+
rb_raise(rb_eTypeError,
|
5017
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
5018
|
+
rb_obj_classname(sm_out));
|
5019
|
+
return Qnil;
|
5020
|
+
}
|
4952
5021
|
vec3_t *output = sm_unwrap_vec3(sm_out, NULL);
|
4953
5022
|
mat3_inv_rotate_vec3(*self, *rhs, *output);
|
4954
5023
|
}} else if (argc == 1) {
|
@@ -5196,7 +5265,12 @@ static VALUE sm_mat3_angle_axis(int argc, VALUE *argv, VALUE self)
|
|
5196
5265
|
const vec3_t *axis;
|
5197
5266
|
|
5198
5267
|
rb_scan_args(argc, argv, "21", &sm_angle, &sm_axis, &sm_out);
|
5199
|
-
|
5268
|
+
if (!SM_IS_A(sm_axis, vec3) && !SM_IS_A(sm_axis, vec4) && !SM_IS_A(sm_axis, quat)) {
|
5269
|
+
rb_raise(rb_eTypeError,
|
5270
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
5271
|
+
rb_obj_classname(sm_axis));
|
5272
|
+
return Qnil;
|
5273
|
+
}
|
5200
5274
|
|
5201
5275
|
angle = (s_float_t)rb_num2dbl(sm_angle);
|
5202
5276
|
axis = sm_unwrap_vec3(sm_axis, NULL);
|
@@ -5220,7 +5294,7 @@ static VALUE sm_mat3_angle_axis(int argc, VALUE *argv, VALUE self)
|
|
5220
5294
|
* Returns a Vec3 whose components are that of the row at the given index.
|
5221
5295
|
*
|
5222
5296
|
* call-seq:
|
5223
|
-
* get_row3(index) -> new vec3
|
5297
|
+
* get_row3(index, output = nil) -> output or new vec3
|
5224
5298
|
*/
|
5225
5299
|
static VALUE sm_mat3_get_row3(int argc, VALUE *argv, VALUE sm_self)
|
5226
5300
|
{
|
@@ -5244,7 +5318,12 @@ static VALUE sm_mat3_get_row3(int argc, VALUE *argv, VALUE sm_self)
|
|
5244
5318
|
sm_out = argv[1];
|
5245
5319
|
|
5246
5320
|
if (RTEST(sm_out)) {
|
5247
|
-
|
5321
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
5322
|
+
rb_raise(rb_eTypeError,
|
5323
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
5324
|
+
rb_obj_classname(sm_out));
|
5325
|
+
return Qnil;
|
5326
|
+
}
|
5248
5327
|
} else {
|
5249
5328
|
goto SM_LABEL(no_output);
|
5250
5329
|
}
|
@@ -5278,7 +5357,7 @@ static VALUE sm_mat3_get_row3(int argc, VALUE *argv, VALUE sm_self)
|
|
5278
5357
|
* Returns a Vec3 whose components are that of the column at the given index.
|
5279
5358
|
*
|
5280
5359
|
* call-seq:
|
5281
|
-
* get_column3(index) -> new vec3
|
5360
|
+
* get_column3(index, output = nil) -> output or new vec3
|
5282
5361
|
*/
|
5283
5362
|
static VALUE sm_mat3_get_column3(int argc, VALUE *argv, VALUE sm_self)
|
5284
5363
|
{
|
@@ -5302,7 +5381,12 @@ static VALUE sm_mat3_get_column3(int argc, VALUE *argv, VALUE sm_self)
|
|
5302
5381
|
sm_out = argv[1];
|
5303
5382
|
|
5304
5383
|
if (RTEST(sm_out)) {
|
5305
|
-
|
5384
|
+
if (!SM_IS_A(sm_out, vec3) && !SM_IS_A(sm_out, vec4) && !SM_IS_A(sm_out, quat)) {
|
5385
|
+
rb_raise(rb_eTypeError,
|
5386
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
5387
|
+
rb_obj_classname(sm_out));
|
5388
|
+
return Qnil;
|
5389
|
+
}
|
5306
5390
|
} else {
|
5307
5391
|
goto SM_LABEL(no_output);
|
5308
5392
|
}
|
@@ -5344,7 +5428,12 @@ static VALUE sm_mat3_set_row3(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
5344
5428
|
int index;
|
5345
5429
|
mat3_t *self;
|
5346
5430
|
|
5347
|
-
|
5431
|
+
if (!SM_IS_A(sm_value, vec3) && !SM_IS_A(sm_value, vec4) && !SM_IS_A(sm_value, quat)) {
|
5432
|
+
rb_raise(rb_eTypeError,
|
5433
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
5434
|
+
rb_obj_classname(sm_value));
|
5435
|
+
return Qnil;
|
5436
|
+
}
|
5348
5437
|
|
5349
5438
|
self = sm_unwrap_mat3(sm_self, NULL);
|
5350
5439
|
value = sm_unwrap_vec3(sm_value, NULL);
|
@@ -5374,7 +5463,12 @@ static VALUE sm_mat3_set_column3(VALUE sm_self, VALUE sm_index, VALUE sm_value)
|
|
5374
5463
|
int index;
|
5375
5464
|
mat3_t *self;
|
5376
5465
|
|
5377
|
-
|
5466
|
+
if (!SM_IS_A(sm_value, vec3) && !SM_IS_A(sm_value, vec4) && !SM_IS_A(sm_value, quat)) {
|
5467
|
+
rb_raise(rb_eTypeError,
|
5468
|
+
kSM_WANT_THREE_OR_FOUR_FORMAT_LIT,
|
5469
|
+
rb_obj_classname(sm_value));
|
5470
|
+
return Qnil;
|
5471
|
+
}
|
5378
5472
|
|
5379
5473
|
self = sm_unwrap_mat3(sm_self, NULL);
|
5380
5474
|
value = sm_unwrap_vec3(sm_value, NULL);
|
@@ -5478,9 +5572,20 @@ static VALUE sm_get_address(VALUE sm_self)
|
|
5478
5572
|
|
5479
5573
|
void Init_bindings()
|
5480
5574
|
{
|
5575
|
+
ID kRB_CONST_SIZE, kRB_CONST_LENGTH, kRB_CONST_FLOAT_SIZE, kRB_CONST_TYPE;
|
5576
|
+
|
5481
5577
|
kRB_IVAR_MATHARRAY_LENGTH = rb_intern("__length");
|
5482
5578
|
kRB_IVAR_MATHARRAY_CACHE = rb_intern("__cache");
|
5483
5579
|
kRB_IVAR_MATHARRAY_SOURCE = rb_intern("__source");
|
5580
|
+
kRB_CONST_SIZE = rb_intern("SIZE");
|
5581
|
+
kRB_CONST_LENGTH = rb_intern("LENGTH");
|
5582
|
+
kRB_CONST_FLOAT_SIZE = rb_intern("SNOW_MATH_FLOAT_SIZE");
|
5583
|
+
kRB_CONST_TYPE = rb_intern("TYPE");
|
5584
|
+
|
5585
|
+
/*
|
5586
|
+
* The size in bytes of the base snow-math floating point type. Set to 4 when
|
5587
|
+
* using float or 8 when using double.
|
5588
|
+
*/
|
5484
5589
|
|
5485
5590
|
s_sm_snowmath_mod = rb_define_module("Snow");
|
5486
5591
|
s_sm_vec3_klass = rb_define_class_under(s_sm_snowmath_mod, "Vec3", rb_cObject);
|
@@ -5489,6 +5594,18 @@ void Init_bindings()
|
|
5489
5594
|
s_sm_mat3_klass = rb_define_class_under(s_sm_snowmath_mod, "Mat3", rb_cObject);
|
5490
5595
|
s_sm_mat4_klass = rb_define_class_under(s_sm_snowmath_mod, "Mat4", rb_cObject);
|
5491
5596
|
|
5597
|
+
rb_const_set(s_sm_snowmath_mod, kRB_CONST_FLOAT_SIZE, INT2FIX(sizeof(s_float_t)));
|
5598
|
+
rb_const_set(s_sm_vec3_klass, kRB_CONST_SIZE, INT2FIX(sizeof(vec3_t)));
|
5599
|
+
rb_const_set(s_sm_vec4_klass, kRB_CONST_SIZE, INT2FIX(sizeof(vec4_t)));
|
5600
|
+
rb_const_set(s_sm_quat_klass, kRB_CONST_SIZE, INT2FIX(sizeof(quat_t)));
|
5601
|
+
rb_const_set(s_sm_mat3_klass, kRB_CONST_SIZE, INT2FIX(sizeof(mat3_t)));
|
5602
|
+
rb_const_set(s_sm_mat4_klass, kRB_CONST_SIZE, INT2FIX(sizeof(mat4_t)));
|
5603
|
+
rb_const_set(s_sm_vec3_klass, kRB_CONST_LENGTH, INT2FIX(sizeof(vec3_t) / sizeof(s_float_t)));
|
5604
|
+
rb_const_set(s_sm_vec4_klass, kRB_CONST_LENGTH, INT2FIX(sizeof(vec4_t) / sizeof(s_float_t)));
|
5605
|
+
rb_const_set(s_sm_quat_klass, kRB_CONST_LENGTH, INT2FIX(sizeof(quat_t) / sizeof(s_float_t)));
|
5606
|
+
rb_const_set(s_sm_mat3_klass, kRB_CONST_LENGTH, INT2FIX(sizeof(mat3_t) / sizeof(s_float_t)));
|
5607
|
+
rb_const_set(s_sm_mat4_klass, kRB_CONST_LENGTH, INT2FIX(sizeof(mat4_t) / sizeof(s_float_t)));
|
5608
|
+
|
5492
5609
|
rb_define_singleton_method(s_sm_vec3_klass, "new", sm_vec3_new, -1);
|
5493
5610
|
rb_define_method(s_sm_vec3_klass, "initialize", sm_vec3_init, -1);
|
5494
5611
|
rb_define_method(s_sm_vec3_klass, "set", sm_vec3_init, -1);
|
@@ -5551,18 +5668,18 @@ void Init_bindings()
|
|
5551
5668
|
rb_define_method(s_sm_quat_klass, "length", sm_quat_length, 0);
|
5552
5669
|
rb_define_method(s_sm_quat_klass, "to_s", sm_quat_to_s, 0);
|
5553
5670
|
rb_define_method(s_sm_quat_klass, "address", sm_get_address, 0);
|
5554
|
-
rb_define_method(s_sm_quat_klass, "copy", sm_quat_copy, -1);
|
5555
5671
|
rb_define_method(s_sm_quat_klass, "inverse", sm_quat_inverse, -1);
|
5556
|
-
rb_define_method(s_sm_quat_klass, "negate", sm_quat_negate, -1);
|
5557
5672
|
rb_define_method(s_sm_quat_klass, "multiply_quat", sm_quat_multiply, -1);
|
5558
5673
|
rb_define_method(s_sm_quat_klass, "multiply_vec3", sm_quat_multiply_vec3, -1);
|
5559
|
-
rb_define_method(s_sm_quat_klass, "normalize", sm_quat_normalize, -1);
|
5560
|
-
rb_define_method(s_sm_quat_klass, "scale", sm_quat_scale, -1);
|
5561
|
-
rb_define_method(s_sm_quat_klass, "divide", sm_quat_divide, -1);
|
5562
|
-
rb_define_method(s_sm_quat_klass, "add", sm_quat_add, -1);
|
5563
|
-
rb_define_method(s_sm_quat_klass, "subtract", sm_quat_subtract, -1);
|
5564
5674
|
rb_define_method(s_sm_quat_klass, "slerp", sm_quat_slerp, -1);
|
5565
5675
|
// Borrow some functions from vec4
|
5676
|
+
rb_define_method(s_sm_quat_klass, "copy", sm_vec4_copy, -1);
|
5677
|
+
rb_define_method(s_sm_quat_klass, "negate", sm_vec4_negate, -1);
|
5678
|
+
rb_define_method(s_sm_quat_klass, "normalize", sm_vec4_normalize, -1);
|
5679
|
+
rb_define_method(s_sm_quat_klass, "scale", sm_vec4_scale, -1);
|
5680
|
+
rb_define_method(s_sm_quat_klass, "divide", sm_vec4_divide, -1);
|
5681
|
+
rb_define_method(s_sm_quat_klass, "add", sm_vec4_add, -1);
|
5682
|
+
rb_define_method(s_sm_quat_klass, "subtract", sm_vec4_subtract, -1);
|
5566
5683
|
rb_define_method(s_sm_quat_klass, "dot_product", sm_vec4_dot_product, 1);
|
5567
5684
|
rb_define_method(s_sm_quat_klass, "magnitude_squared", sm_vec4_magnitude_squared, 0);
|
5568
5685
|
rb_define_method(s_sm_quat_klass, "magnitude", sm_vec4_magnitude, 0);
|
@@ -5641,6 +5758,7 @@ void Init_bindings()
|
|
5641
5758
|
#if BUILD_ARRAY_TYPE
|
5642
5759
|
|
5643
5760
|
s_sm_vec3_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Vec3Array", rb_cObject);
|
5761
|
+
rb_const_set(s_sm_vec3_array_klass, kRB_CONST_TYPE, s_sm_vec3_klass);
|
5644
5762
|
rb_define_singleton_method(s_sm_vec3_array_klass, "new", sm_vec3_array_new, 1);
|
5645
5763
|
rb_define_method(s_sm_vec3_array_klass, "fetch", sm_vec3_array_fetch, 1);
|
5646
5764
|
rb_define_method(s_sm_vec3_array_klass, "store", sm_vec3_array_store, 2);
|
@@ -5650,6 +5768,7 @@ void Init_bindings()
|
|
5650
5768
|
rb_define_method(s_sm_vec3_array_klass, "address", sm_get_address, 0);
|
5651
5769
|
|
5652
5770
|
s_sm_vec4_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Vec4Array", rb_cObject);
|
5771
|
+
rb_const_set(s_sm_vec4_array_klass, kRB_CONST_TYPE, s_sm_vec4_klass);
|
5653
5772
|
rb_define_singleton_method(s_sm_vec4_array_klass, "new", sm_vec4_array_new, 1);
|
5654
5773
|
rb_define_method(s_sm_vec4_array_klass, "fetch", sm_vec4_array_fetch, 1);
|
5655
5774
|
rb_define_method(s_sm_vec4_array_klass, "store", sm_vec4_array_store, 2);
|
@@ -5659,6 +5778,7 @@ void Init_bindings()
|
|
5659
5778
|
rb_define_method(s_sm_vec4_array_klass, "address", sm_get_address, 0);
|
5660
5779
|
|
5661
5780
|
s_sm_quat_array_klass = rb_define_class_under(s_sm_snowmath_mod, "QuatArray", rb_cObject);
|
5781
|
+
rb_const_set(s_sm_quat_array_klass, kRB_CONST_TYPE, s_sm_quat_klass);
|
5662
5782
|
rb_define_singleton_method(s_sm_quat_array_klass, "new", sm_quat_array_new, 1);
|
5663
5783
|
rb_define_method(s_sm_quat_array_klass, "fetch", sm_quat_array_fetch, 1);
|
5664
5784
|
rb_define_method(s_sm_quat_array_klass, "store", sm_quat_array_store, 2);
|
@@ -5668,6 +5788,7 @@ void Init_bindings()
|
|
5668
5788
|
rb_define_method(s_sm_quat_array_klass, "address", sm_get_address, 0);
|
5669
5789
|
|
5670
5790
|
s_sm_mat3_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Mat3Array", rb_cObject);
|
5791
|
+
rb_const_set(s_sm_mat3_array_klass, kRB_CONST_TYPE, s_sm_mat3_klass);
|
5671
5792
|
rb_define_singleton_method(s_sm_mat3_array_klass, "new", sm_mat3_array_new, 1);
|
5672
5793
|
rb_define_method(s_sm_mat3_array_klass, "fetch", sm_mat3_array_fetch, 1);
|
5673
5794
|
rb_define_method(s_sm_mat3_array_klass, "store", sm_mat3_array_store, 2);
|
@@ -5677,6 +5798,7 @@ void Init_bindings()
|
|
5677
5798
|
rb_define_method(s_sm_mat3_array_klass, "address", sm_get_address, 0);
|
5678
5799
|
|
5679
5800
|
s_sm_mat4_array_klass = rb_define_class_under(s_sm_snowmath_mod, "Mat4Array", rb_cObject);
|
5801
|
+
rb_const_set(s_sm_mat4_array_klass, kRB_CONST_TYPE, s_sm_mat4_klass);
|
5680
5802
|
rb_define_singleton_method(s_sm_mat4_array_klass, "new", sm_mat4_array_new, 1);
|
5681
5803
|
rb_define_method(s_sm_mat4_array_klass, "fetch", sm_mat4_array_fetch, 1);
|
5682
5804
|
rb_define_method(s_sm_mat4_array_klass, "store", sm_mat4_array_store, 2);
|