rmath3d 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog +5 -0
- data/README.md +1 -1
- data/ext/rmath3d/rmath3d.c +92 -119
- data/lib/rmath3d/rmath3d_plain.rb +64 -71
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 480f9d7cfa725618252ced196bead41f187d86c2
|
4
|
+
data.tar.gz: cfb9c4dfd3027b08020bb25be79debf32c329efb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 585ec81811bbb4baa2835fca142a78d92674be01ef232bed8f3d021148c22586deb8fa0858e89d6a5dd19019cfa814c7b365857b488c358cdeb28c65d3539e88
|
7
|
+
data.tar.gz: 28ba4c0c9c30fee57d682ed96da605bf76a59c7d00d62609f4cf795c57808d94ac992af53625deaa8b08a1e091a01f7e38de4694a56b8aa6c3a74e1ea6c1b9ee
|
data/ChangeLog
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
2015-08-23 vaiorabbit <http://twitter.com/vaiorabbit>
|
2
|
+
|
3
|
+
* rmath3d.c (def ==): Removed control path returning Qnil.
|
4
|
+
* rmath3d_plain.rb (def ==): Removed control path returning Qnil.
|
5
|
+
|
1
6
|
2015-05-02 vaiorabbit <http://twitter.com/vaiorabbit>
|
2
7
|
|
3
8
|
* Ruby 1.9.3 and prior versions are no longer supported. Ref.: https://www.ruby-lang.org/en/news/2015/02/23/support-for-ruby-1-9-3-has-ended/
|
data/README.md
CHANGED
data/ext/rmath3d/rmath3d.c
CHANGED
@@ -935,27 +935,24 @@ RMtx2_op_binary_mult( VALUE self, VALUE other )
|
|
935
935
|
static VALUE
|
936
936
|
RMtx2_op_binary_eq( VALUE self, VALUE other )
|
937
937
|
{
|
938
|
-
|
939
|
-
RMtx2* m2 = NULL;
|
940
|
-
|
941
|
-
#ifdef RMATH_ENABLE_ARGUMENT_CHECK
|
942
|
-
if ( !IsRMtx2(other) )
|
938
|
+
if ( IsRMtx2(other) )
|
943
939
|
{
|
944
|
-
|
945
|
-
|
946
|
-
rb_special_const_p( other ) ? RSTRING_PTR( rb_inspect( other ) ) : rb_obj_classname( other )
|
947
|
-
);
|
948
|
-
return Qnil;
|
949
|
-
}
|
950
|
-
#endif
|
940
|
+
RMtx2* m1 = NULL;
|
941
|
+
RMtx2* m2 = NULL;
|
951
942
|
|
952
|
-
|
953
|
-
|
943
|
+
TypedData_Get_Struct( self, RMtx2, &RMtx2_type, m1 );
|
944
|
+
TypedData_Get_Struct( other, RMtx2, &RMtx2_type, m2 );
|
954
945
|
|
955
|
-
|
956
|
-
|
946
|
+
if ( !RMtx2Equal(m1,m2) )
|
947
|
+
return Qfalse;
|
948
|
+
else
|
949
|
+
return Qtrue;
|
950
|
+
|
951
|
+
}
|
957
952
|
else
|
958
|
-
|
953
|
+
{
|
954
|
+
return Qfalse;
|
955
|
+
}
|
959
956
|
}
|
960
957
|
|
961
958
|
/*
|
@@ -2060,27 +2057,23 @@ RMtx3_op_binary_mult( VALUE self, VALUE other )
|
|
2060
2057
|
static VALUE
|
2061
2058
|
RMtx3_op_binary_eq( VALUE self, VALUE other )
|
2062
2059
|
{
|
2063
|
-
|
2064
|
-
RMtx3* m2 = NULL;
|
2065
|
-
|
2066
|
-
#ifdef RMATH_ENABLE_ARGUMENT_CHECK
|
2067
|
-
if ( !IsRMtx3(other) )
|
2060
|
+
if ( IsRMtx3(other) )
|
2068
2061
|
{
|
2069
|
-
|
2070
|
-
|
2071
|
-
rb_special_const_p( other ) ? RSTRING_PTR( rb_inspect( other ) ) : rb_obj_classname( other )
|
2072
|
-
);
|
2073
|
-
return Qnil;
|
2074
|
-
}
|
2075
|
-
#endif
|
2062
|
+
RMtx3* m1 = NULL;
|
2063
|
+
RMtx3* m2 = NULL;
|
2076
2064
|
|
2077
|
-
|
2078
|
-
|
2065
|
+
TypedData_Get_Struct( self, RMtx3, &RMtx3_type, m1 );
|
2066
|
+
TypedData_Get_Struct( other, RMtx3, &RMtx3_type, m2 );
|
2079
2067
|
|
2080
|
-
|
2081
|
-
|
2068
|
+
if ( !RMtx3Equal(m1,m2) )
|
2069
|
+
return Qfalse;
|
2070
|
+
else
|
2071
|
+
return Qtrue;
|
2072
|
+
}
|
2082
2073
|
else
|
2083
|
-
|
2074
|
+
{
|
2075
|
+
return Qfalse;
|
2076
|
+
}
|
2084
2077
|
}
|
2085
2078
|
|
2086
2079
|
/*
|
@@ -3616,27 +3609,23 @@ RMtx4_op_binary_mult( VALUE self, VALUE other )
|
|
3616
3609
|
static VALUE
|
3617
3610
|
RMtx4_op_binary_eq( VALUE self, VALUE other )
|
3618
3611
|
{
|
3619
|
-
|
3620
|
-
RMtx4* m2 = NULL;
|
3621
|
-
|
3622
|
-
#ifdef RMATH_ENABLE_ARGUMENT_CHECK
|
3623
|
-
if ( !IsRMtx4(other) )
|
3612
|
+
if ( IsRMtx4(other) )
|
3624
3613
|
{
|
3625
|
-
|
3626
|
-
|
3627
|
-
rb_special_const_p( other ) ? RSTRING_PTR( rb_inspect( other ) ) : rb_obj_classname( other )
|
3628
|
-
);
|
3629
|
-
return Qnil;
|
3630
|
-
}
|
3631
|
-
#endif
|
3614
|
+
RMtx4* m1 = NULL;
|
3615
|
+
RMtx4* m2 = NULL;
|
3632
3616
|
|
3633
|
-
|
3634
|
-
|
3617
|
+
TypedData_Get_Struct( self, RMtx4, &RMtx4_type, m1 );
|
3618
|
+
TypedData_Get_Struct( other, RMtx4, &RMtx4_type, m2 );
|
3635
3619
|
|
3636
|
-
|
3637
|
-
|
3620
|
+
if ( !RMtx4Equal(m1,m2) )
|
3621
|
+
return Qfalse;
|
3622
|
+
else
|
3623
|
+
return Qtrue;
|
3624
|
+
}
|
3638
3625
|
else
|
3639
|
-
|
3626
|
+
{
|
3627
|
+
return Qfalse;
|
3628
|
+
}
|
3640
3629
|
}
|
3641
3630
|
|
3642
3631
|
/*
|
@@ -4549,27 +4538,23 @@ RQuat_op_binary_mult( VALUE self, VALUE other )
|
|
4549
4538
|
static VALUE
|
4550
4539
|
RQuat_op_binary_eq( VALUE self, VALUE other )
|
4551
4540
|
{
|
4552
|
-
|
4553
|
-
RQuat* v2 = NULL;
|
4554
|
-
|
4555
|
-
#ifdef RMATH_ENABLE_ARGUMENT_CHECK
|
4556
|
-
if ( !IsRQuat(other) )
|
4541
|
+
if ( IsRQuat(other) )
|
4557
4542
|
{
|
4558
|
-
|
4559
|
-
|
4560
|
-
rb_special_const_p( other ) ? RSTRING_PTR( rb_inspect( other ) ) : rb_obj_classname( other )
|
4561
|
-
);
|
4562
|
-
return Qnil;
|
4563
|
-
}
|
4564
|
-
#endif
|
4543
|
+
RQuat* v1 = NULL;
|
4544
|
+
RQuat* v2 = NULL;
|
4565
4545
|
|
4566
|
-
|
4567
|
-
|
4546
|
+
TypedData_Get_Struct( self, RQuat, &RQuat_type, v1 );
|
4547
|
+
TypedData_Get_Struct( other, RQuat, &RQuat_type, v2 );
|
4568
4548
|
|
4569
|
-
|
4570
|
-
|
4549
|
+
if ( !RQuatEqual(v1,v2) )
|
4550
|
+
return Qfalse;
|
4551
|
+
else
|
4552
|
+
return Qtrue;
|
4553
|
+
}
|
4571
4554
|
else
|
4572
|
-
|
4555
|
+
{
|
4556
|
+
return Qfalse;
|
4557
|
+
}
|
4573
4558
|
}
|
4574
4559
|
|
4575
4560
|
/*
|
@@ -5365,27 +5350,23 @@ RVec2_op_binary_mult( VALUE self, VALUE other )
|
|
5365
5350
|
static VALUE
|
5366
5351
|
RVec2_op_binary_eq( VALUE self, VALUE other )
|
5367
5352
|
{
|
5368
|
-
|
5369
|
-
RVec2* v2 = NULL;
|
5370
|
-
|
5371
|
-
#ifdef RMATH_ENABLE_ARGUMENT_CHECK
|
5372
|
-
if ( !IsRVec2(other) )
|
5353
|
+
if ( IsRVec2(other) )
|
5373
5354
|
{
|
5374
|
-
|
5375
|
-
|
5376
|
-
rb_special_const_p( other ) ? RSTRING_PTR( rb_inspect( other ) ) : rb_obj_classname( other )
|
5377
|
-
);
|
5378
|
-
return Qnil;
|
5379
|
-
}
|
5380
|
-
#endif
|
5355
|
+
RVec2* v1 = NULL;
|
5356
|
+
RVec2* v2 = NULL;
|
5381
5357
|
|
5382
|
-
|
5383
|
-
|
5358
|
+
TypedData_Get_Struct( self, RVec2, &RVec2_type, v1 );
|
5359
|
+
TypedData_Get_Struct( other, RVec2, &RVec2_type, v2 );
|
5384
5360
|
|
5385
|
-
|
5386
|
-
|
5361
|
+
if ( !RVec2Equal(v1,v2) )
|
5362
|
+
return Qfalse;
|
5363
|
+
else
|
5364
|
+
return Qtrue;
|
5365
|
+
}
|
5387
5366
|
else
|
5388
|
-
|
5367
|
+
{
|
5368
|
+
return Qfalse;
|
5369
|
+
}
|
5389
5370
|
}
|
5390
5371
|
|
5391
5372
|
/*
|
@@ -6367,27 +6348,23 @@ RVec3_op_binary_mult( VALUE self, VALUE other )
|
|
6367
6348
|
static VALUE
|
6368
6349
|
RVec3_op_binary_eq( VALUE self, VALUE other )
|
6369
6350
|
{
|
6370
|
-
|
6371
|
-
RVec3* v2 = NULL;
|
6372
|
-
|
6373
|
-
#ifdef RMATH_ENABLE_ARGUMENT_CHECK
|
6374
|
-
if ( !IsRVec3(other) )
|
6351
|
+
if ( IsRVec3(other) )
|
6375
6352
|
{
|
6376
|
-
|
6377
|
-
|
6378
|
-
rb_special_const_p( other ) ? RSTRING_PTR( rb_inspect( other ) ) : rb_obj_classname( other )
|
6379
|
-
);
|
6380
|
-
return Qnil;
|
6381
|
-
}
|
6382
|
-
#endif
|
6353
|
+
RVec3* v1 = NULL;
|
6354
|
+
RVec3* v2 = NULL;
|
6383
6355
|
|
6384
|
-
|
6385
|
-
|
6356
|
+
TypedData_Get_Struct( self, RVec3, &RVec3_type, v1 );
|
6357
|
+
TypedData_Get_Struct( other, RVec3, &RVec3_type, v2 );
|
6386
6358
|
|
6387
|
-
|
6388
|
-
|
6359
|
+
if ( !RVec3Equal(v1,v2) )
|
6360
|
+
return Qfalse;
|
6361
|
+
else
|
6362
|
+
return Qtrue;
|
6363
|
+
}
|
6389
6364
|
else
|
6390
|
-
|
6365
|
+
{
|
6366
|
+
return Qfalse;
|
6367
|
+
}
|
6391
6368
|
}
|
6392
6369
|
|
6393
6370
|
/*
|
@@ -7270,27 +7247,23 @@ RVec4_op_binary_mult( VALUE self, VALUE other )
|
|
7270
7247
|
static VALUE
|
7271
7248
|
RVec4_op_binary_eq( VALUE self, VALUE other )
|
7272
7249
|
{
|
7273
|
-
|
7274
|
-
RVec4* v2 = NULL;
|
7275
|
-
|
7276
|
-
#ifdef RMATH_ENABLE_ARGUMENT_CHECK
|
7277
|
-
if ( !IsRVec4(other) )
|
7250
|
+
if ( IsRVec4(other) )
|
7278
7251
|
{
|
7279
|
-
|
7280
|
-
|
7281
|
-
rb_special_const_p( other ) ? RSTRING_PTR( rb_inspect( other ) ) : rb_obj_classname( other )
|
7282
|
-
);
|
7283
|
-
return Qnil;
|
7284
|
-
}
|
7285
|
-
#endif
|
7252
|
+
RVec4* v1 = NULL;
|
7253
|
+
RVec4* v2 = NULL;
|
7286
7254
|
|
7287
|
-
|
7288
|
-
|
7255
|
+
TypedData_Get_Struct( self, RVec4, &RVec4_type, v1 );
|
7256
|
+
TypedData_Get_Struct( other, RVec4, &RVec4_type, v2 );
|
7289
7257
|
|
7290
|
-
|
7291
|
-
|
7258
|
+
if ( !RVec4Equal(v1,v2) )
|
7259
|
+
return Qfalse;
|
7260
|
+
else
|
7261
|
+
return Qtrue;
|
7262
|
+
}
|
7292
7263
|
else
|
7293
|
-
|
7264
|
+
{
|
7265
|
+
return Qfalse;
|
7266
|
+
}
|
7294
7267
|
}
|
7295
7268
|
|
7296
7269
|
/*
|
@@ -440,19 +440,18 @@ module RMath3D
|
|
440
440
|
# mtx1 == mtx2 : evaluates equality.
|
441
441
|
#
|
442
442
|
def ==( other )
|
443
|
-
if
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
for col in 0...2 do
|
450
|
-
if ( (getElement(row,col) - other.getElement(row,col)).abs > TOLERANCE )
|
451
|
-
return false
|
443
|
+
if other.class == RMtx2
|
444
|
+
for row in 0...2 do
|
445
|
+
for col in 0...2 do
|
446
|
+
if ( (getElement(row,col) - other.getElement(row,col)).abs > TOLERANCE )
|
447
|
+
return false
|
448
|
+
end
|
452
449
|
end
|
453
450
|
end
|
451
|
+
return true
|
452
|
+
else
|
453
|
+
return false
|
454
454
|
end
|
455
|
-
return true
|
456
455
|
end
|
457
456
|
|
458
457
|
#
|
@@ -1129,19 +1128,18 @@ module RMath3D
|
|
1129
1128
|
# mtx1 == mtx2 : evaluates equality.
|
1130
1129
|
#
|
1131
1130
|
def ==( other )
|
1132
|
-
if
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1138
|
-
for col in 0...3 do
|
1139
|
-
if ( (getElement(row,col) - other.getElement(row,col)).abs > TOLERANCE )
|
1140
|
-
return false
|
1131
|
+
if other.class == RMtx3
|
1132
|
+
for row in 0...3 do
|
1133
|
+
for col in 0...3 do
|
1134
|
+
if ( (getElement(row,col) - other.getElement(row,col)).abs > TOLERANCE )
|
1135
|
+
return false
|
1136
|
+
end
|
1141
1137
|
end
|
1142
1138
|
end
|
1139
|
+
return true
|
1140
|
+
else
|
1141
|
+
return false
|
1143
1142
|
end
|
1144
|
-
return true
|
1145
1143
|
end
|
1146
1144
|
|
1147
1145
|
#
|
@@ -2081,19 +2079,18 @@ module RMath3D
|
|
2081
2079
|
# mtx1 == mtx2 : evaluates equality.
|
2082
2080
|
#
|
2083
2081
|
def ==( other )
|
2084
|
-
if
|
2085
|
-
|
2086
|
-
|
2087
|
-
|
2088
|
-
|
2089
|
-
|
2090
|
-
for col in 0...4 do
|
2091
|
-
if ( (getElement(row,col) - other.getElement(row,col)).abs > TOLERANCE )
|
2092
|
-
return false
|
2082
|
+
if other.class == RMtx4
|
2083
|
+
for row in 0...4 do
|
2084
|
+
for col in 0...4 do
|
2085
|
+
if ( (getElement(row,col) - other.getElement(row,col)).abs > TOLERANCE )
|
2086
|
+
return false
|
2087
|
+
end
|
2093
2088
|
end
|
2094
2089
|
end
|
2090
|
+
return true
|
2091
|
+
else
|
2092
|
+
return false
|
2095
2093
|
end
|
2096
|
-
return true
|
2097
2094
|
end
|
2098
2095
|
|
2099
2096
|
#
|
@@ -2258,7 +2255,7 @@ module RMath3D
|
|
2258
2255
|
# Returns human-readable string.
|
2259
2256
|
#
|
2260
2257
|
def to_s
|
2261
|
-
return "( #{@e[0]}, #{@e[1]}, #{@e[2]}, #{@e[3]} )
|
2258
|
+
return "( #{@e[0]}, #{@e[1]}, #{@e[2]}, #{@e[3]} )"
|
2262
2259
|
end
|
2263
2260
|
|
2264
2261
|
#
|
@@ -2630,16 +2627,15 @@ module RMath3D
|
|
2630
2627
|
# quat1 == quat2 : evaluates equality.
|
2631
2628
|
#
|
2632
2629
|
def ==( other )
|
2633
|
-
if other.class
|
2634
|
-
|
2635
|
-
|
2636
|
-
|
2637
|
-
|
2638
|
-
|
2639
|
-
|
2640
|
-
|
2641
|
-
|
2642
|
-
return true
|
2630
|
+
if other.class == RQuat
|
2631
|
+
if (x-other.x).abs<=Float::EPSILON &&
|
2632
|
+
(y-other.y).abs<=Float::EPSILON &&
|
2633
|
+
(z-other.z).abs<=Float::EPSILON &&
|
2634
|
+
(w-other.w).abs<=Float::EPSILON
|
2635
|
+
return true
|
2636
|
+
else
|
2637
|
+
return false
|
2638
|
+
end
|
2643
2639
|
else
|
2644
2640
|
return false
|
2645
2641
|
end
|
@@ -2859,7 +2855,7 @@ module RMath3D
|
|
2859
2855
|
# Returns human-readable string.
|
2860
2856
|
#
|
2861
2857
|
def to_s
|
2862
|
-
return "( #{@e[0]}, #{@e[1]} )
|
2858
|
+
return "( #{@e[0]}, #{@e[1]} )"
|
2863
2859
|
end
|
2864
2860
|
|
2865
2861
|
#
|
@@ -3081,14 +3077,13 @@ module RMath3D
|
|
3081
3077
|
# vec1 == vec2 : evaluates equality.
|
3082
3078
|
#
|
3083
3079
|
def ==( other )
|
3084
|
-
if other.class
|
3085
|
-
|
3086
|
-
|
3087
|
-
|
3088
|
-
|
3089
|
-
|
3090
|
-
|
3091
|
-
return true
|
3080
|
+
if other.class == RVec2
|
3081
|
+
if (x-other.x).abs<=Float::EPSILON &&
|
3082
|
+
(y-other.y).abs<=Float::EPSILON
|
3083
|
+
return true
|
3084
|
+
else
|
3085
|
+
return false
|
3086
|
+
end
|
3092
3087
|
else
|
3093
3088
|
return false
|
3094
3089
|
end
|
@@ -3199,7 +3194,7 @@ module RMath3D
|
|
3199
3194
|
# Returns human-readable string.
|
3200
3195
|
#
|
3201
3196
|
def to_s
|
3202
|
-
return "( #{@e[0]}, #{@e[1]}, #{@e[2]} )
|
3197
|
+
return "( #{@e[0]}, #{@e[1]}, #{@e[2]} )"
|
3203
3198
|
end
|
3204
3199
|
|
3205
3200
|
#
|
@@ -3635,15 +3630,14 @@ module RMath3D
|
|
3635
3630
|
# vec1 == vec2 : evaluates equality.
|
3636
3631
|
#
|
3637
3632
|
def ==( other )
|
3638
|
-
if other.class
|
3639
|
-
|
3640
|
-
|
3641
|
-
|
3642
|
-
|
3643
|
-
|
3644
|
-
|
3645
|
-
|
3646
|
-
return true
|
3633
|
+
if other.class == RVec3
|
3634
|
+
if (x-other.x).abs<=Float::EPSILON &&
|
3635
|
+
(y-other.y).abs<=Float::EPSILON &&
|
3636
|
+
(z-other.z).abs<=Float::EPSILON
|
3637
|
+
return true
|
3638
|
+
else
|
3639
|
+
return false
|
3640
|
+
end
|
3647
3641
|
else
|
3648
3642
|
return false
|
3649
3643
|
end
|
@@ -3759,7 +3753,7 @@ module RMath3D
|
|
3759
3753
|
# Returns human-readable string.
|
3760
3754
|
#
|
3761
3755
|
def to_s
|
3762
|
-
return "( #{@e[0]}, #{@e[1]}, #{@e[2]}, #{@e[3]} )
|
3756
|
+
return "( #{@e[0]}, #{@e[1]}, #{@e[2]}, #{@e[3]} )"
|
3763
3757
|
end
|
3764
3758
|
|
3765
3759
|
#
|
@@ -4082,16 +4076,15 @@ module RMath3D
|
|
4082
4076
|
# vec1 == vec2 : evaluates equality.
|
4083
4077
|
#
|
4084
4078
|
def ==( other )
|
4085
|
-
if other.class
|
4086
|
-
|
4087
|
-
|
4088
|
-
|
4089
|
-
|
4090
|
-
|
4091
|
-
|
4092
|
-
|
4093
|
-
|
4094
|
-
return true
|
4079
|
+
if other.class == RVec4
|
4080
|
+
if (x-other.x).abs<=Float::EPSILON &&
|
4081
|
+
(y-other.y).abs<=Float::EPSILON &&
|
4082
|
+
(z-other.z).abs<=Float::EPSILON &&
|
4083
|
+
(w-other.w).abs<=Float::EPSILON
|
4084
|
+
return true
|
4085
|
+
else
|
4086
|
+
return false
|
4087
|
+
end
|
4095
4088
|
else
|
4096
4089
|
return false
|
4097
4090
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmath3d
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- vaiorabbit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
Provides vector2/3/4, matrix2x2/3x3/4x4 and quaternion in C extension library form (and plain Ruby form with the same interface for debugging use).
|
@@ -74,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
74
|
version: '0'
|
75
75
|
requirements: []
|
76
76
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.4.
|
77
|
+
rubygems_version: 2.4.5.1
|
78
78
|
signing_key:
|
79
79
|
specification_version: 4
|
80
80
|
summary: Ruby Math Module for 3D Applications
|