rmath3d_plain 1.2.2 → 1.2.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: '012448e35e21dcb667f5b8f5fc15be090c982743'
4
- data.tar.gz: 0620adc32283fe56718594e9f8803c1ef72a1b69
2
+ SHA256:
3
+ metadata.gz: 4afeec14769aedc4dc064924600f42123b7db3001dd1d9b04887ea72226a6e62
4
+ data.tar.gz: 65f26f341e1c5c13e2e1971131132c7d641e1ac2cc1ee1abc1cc9a92c47f2731
5
5
  SHA512:
6
- metadata.gz: 541096f10e839b1788a1491fce0ff82f2b8db511b770919ddcd2eeddec6da7c98fa8974749255e6d7f4f0af21a2c3a03ef8ebdb05e96490dd0168155eeb8c8d7
7
- data.tar.gz: 2fe0ce58b9ae8c9295b0bcb111ccfe53e24eafe012035cec4fab4e8ba67d692b1592596de2d10c0f5b1a88eb88ddae1327f1a21d45561fee1aa35f69d7bdf25b
6
+ metadata.gz: dc52e86e9d990b0bfe033c399dbcf5da0b2eefd2309b37ce539bfaf420c58fbd8a526e4723c511d92ab5f473ea7257a696126f39b79606342dcfb91840273759
7
+ data.tar.gz: a197442846a593aa7d54a63609aa9ba3eebebdd6a2fa7b984def5741f077ec3e6322770164d2e200718769635f24a1cd58b3cc1ceb5a9bf1770336e81d7a822a
data/ChangeLog CHANGED
@@ -1,3 +1,11 @@
1
+ 2020-06-21 vaiorabbit <http://twitter.com/vaiorabbit>
2
+
3
+ * rmath3d.c, rmath3d_plain.rb (RMtx4): Added argument 'ndc_homogeneous' for projection matrix APIs.
4
+ Set true for the environment with Z coordinate ranges from -1 to +1 (OpenGL), and false otherwise (Direct3D, Metal)
5
+ https://www.slideshare.net/Mark_Kilgard/opengl-32-and-more/26-Direct3D_vs_OpenGL_Coordinate_System
6
+ https://metashapes.com/blog/opengl-metal-projection-matrix-problem/
7
+ * rmath3d_plain.rb: Removed Fixnum and Bignum symbols (deprecated and unified into Integer class since Ruby 2.4)
8
+
1
9
  2017-07-22 vaiorabbit <http://twitter.com/vaiorabbit>
2
10
 
3
11
  * Added 'Integer' type for argument type branching (constant ::Fixnum is deprecated since ruby 2.4).
@@ -1,5 +1,5 @@
1
1
  rmath3d : Ruby math module for 3D Applications
2
- Copyright (c) 2008-2017 vaiorabbit <http://twitter.com/vaiorabbit>
2
+ Copyright (c) 2008-2020 vaiorabbit <http://twitter.com/vaiorabbit>
3
3
 
4
4
  This software is provided 'as-is', without any express or implied
5
5
  warranty. In no event will the authors be held liable for any damages
data/README.md CHANGED
@@ -4,9 +4,12 @@
4
4
 
5
5
  rmath3d is a math module for 3D game programming and computer graphics.
6
6
 
7
- * Last Update: Jul 22, 2017
7
+ * Last Update: Jun 21, 2020
8
8
  * Since: Jul 20, 2008
9
9
 
10
+ * rmath3d (C Extension Library Implementation) [![Gem Version](https://badge.fury.io/rb/rmath3d.svg)](https://badge.fury.io/rb/rmath3d) [![Gem](https://img.shields.io/gem/dt/rmath3d.svg)](https://rubygems.org/gems/rmath3d)
11
+ * rmath3d_plain (Pure Ruby Implementation) [![Gem Version](https://badge.fury.io/rb/rmath3d_plain.svg)](https://badge.fury.io/rb/rmath3d_plain) [![Gem](https://img.shields.io/gem/dt/rmath3d_plain.svg)](https://rubygems.org/gems/rmath3d_plain)
12
+
10
13
  ## Features ##
11
14
 
12
15
  ### Supports frequently-used vector and matrix classes ###
@@ -29,7 +29,7 @@ module RMath3D
29
29
  0.0, 0.0 ]
30
30
  when 1
31
31
  case a[0]
32
- when Float, Integer, Fixnum, Bignum
32
+ when Float, Integer
33
33
  @e = [ a[0], a[0],
34
34
  a[0], a[0] ]
35
35
  when RMtx2
@@ -46,7 +46,7 @@ module RMath3D
46
46
  for col in 0...2 do
47
47
  index = 2*row + col
48
48
  case a[index]
49
- when Float, Integer, Fixnum, Bignum
49
+ when Float, Integer
50
50
  setElement( row, col, a[index] )
51
51
  else
52
52
  raise TypeError, "RMtx2#initialize : Unknown type #{a[0].class}."
@@ -88,7 +88,7 @@ module RMath3D
88
88
  #
89
89
  def coerce
90
90
  case arg
91
- when Float, Integer, Fixnum, Bignum
91
+ when Float, Integer
92
92
  return [ self, arg ]
93
93
  else
94
94
  raise TypeError, "RMtx2#coerce : #{arg.self} can't be coerced into #{self.class}."
@@ -411,7 +411,7 @@ module RMath3D
411
411
  #
412
412
  def *( arg )
413
413
  case arg
414
- when Float, Integer, Fixnum, Bignum
414
+ when Float, Integer
415
415
  return RMtx2.new( arg*self.e00, arg*self.e01,
416
416
  arg*self.e10, arg*self.e11 )
417
417
 
@@ -503,7 +503,7 @@ module RMath3D
503
503
  #
504
504
  def mul!( other )
505
505
  case other
506
- when Float, Integer, Fixnum, Bignum
506
+ when Float, Integer
507
507
  self.e00 = other*self.e00
508
508
  self.e01 = other*self.e01
509
509
  self.e10 = other*self.e10
@@ -560,7 +560,7 @@ module RMath3D
560
560
  0.0, 0.0, 0.0 ]
561
561
  when 1
562
562
  case a[0]
563
- when Float, Integer, Fixnum, Bignum
563
+ when Float, Integer
564
564
  @e = [ a[0], a[0], a[0],
565
565
  a[0], a[0], a[0],
566
566
  a[0], a[0], a[0] ]
@@ -579,7 +579,7 @@ module RMath3D
579
579
  for col in 0...3 do
580
580
  index = 3*row + col
581
581
  case a[index]
582
- when Float, Integer, Fixnum, Bignum
582
+ when Float, Integer
583
583
  setElement( row, col, a[index] )
584
584
  else
585
585
  raise TypeError, "RMtx3#initialize : Unknown type #{a[0].class}."
@@ -622,7 +622,7 @@ module RMath3D
622
622
  #
623
623
  def coerce
624
624
  case arg
625
- when Float, Integer, Fixnum, Bignum
625
+ when Float, Integer
626
626
  return [ self, arg ]
627
627
  else
628
628
  raise TypeError, "RMtx3#coerce : #{arg.self} can't be coerced into #{self.class}."
@@ -1098,7 +1098,7 @@ module RMath3D
1098
1098
  #
1099
1099
  def *( arg )
1100
1100
  case arg
1101
- when Float, Integer, Fixnum, Bignum
1101
+ when Float, Integer
1102
1102
  return RMtx3.new( arg*self.e00, arg*self.e01, arg*self.e02,
1103
1103
  arg*self.e10, arg*self.e11, arg*self.e12,
1104
1104
  arg*self.e20, arg*self.e21, arg*self.e22 )
@@ -1191,7 +1191,7 @@ module RMath3D
1191
1191
  #
1192
1192
  def mul!( other )
1193
1193
  case other
1194
- when Float, Integer, Fixnum, Bignum
1194
+ when Float, Integer
1195
1195
  self.e00 = other*self.e00
1196
1196
  self.e01 = other*self.e01
1197
1197
  self.e02 = other*self.e02
@@ -1259,7 +1259,7 @@ module RMath3D
1259
1259
  0.0, 0.0, 0.0, 0.0 ]
1260
1260
  when 1
1261
1261
  case a[0]
1262
- when Float, Integer, Fixnum, Bignum
1262
+ when Float, Integer
1263
1263
  @e = [ a[0], a[0], a[0], a[0],
1264
1264
  a[0], a[0], a[0], a[0],
1265
1265
  a[0], a[0], a[0], a[0],
@@ -1280,7 +1280,7 @@ module RMath3D
1280
1280
  for col in 0...4 do
1281
1281
  index = 4*row + col
1282
1282
  case a[index]
1283
- when Float, Integer, Fixnum, Bignum
1283
+ when Float, Integer
1284
1284
  setElement( row, col, a[index] )
1285
1285
  else
1286
1286
  raise TypeError, "RMtx4#initialize : Unknown type #{a[0].class}."
@@ -1324,7 +1324,7 @@ module RMath3D
1324
1324
  #
1325
1325
  def coerce
1326
1326
  case arg
1327
- when Float, Integer, Fixnum, Bignum
1327
+ when Float, Integer
1328
1328
  return [ self, arg ]
1329
1329
  else
1330
1330
  raise TypeError, "RMtx4#coerce : #{arg.self} can't be coerced into #{self.class}."
@@ -1837,6 +1837,39 @@ module RMath3D
1837
1837
  return self
1838
1838
  end
1839
1839
 
1840
+ #
1841
+ # call-seq: lookAtLH(eye,at,up) -> self
1842
+ #
1843
+ # Builds a viewing matrix for a left-handed coordinate system from:
1844
+ # * eye position (+eye+: RVec3)
1845
+ # * a point looking at (+at+: RVec3)
1846
+ # * up vector (+up+: RVec3)
1847
+ #
1848
+ def lookAtLH( eye, at, up )
1849
+ setIdentity()
1850
+
1851
+ axis_z = (at - eye).normalize!
1852
+ axis_x = RVec3.cross( up, axis_z ).normalize!
1853
+ axis_y = RVec3.cross( axis_z, axis_x )
1854
+
1855
+ self.e00 = axis_x[0]
1856
+ self.e01 = axis_x[1]
1857
+ self.e02 = axis_x[2]
1858
+ self.e03 = -RVec3.dot( axis_x, eye )
1859
+
1860
+ self.e10 = axis_y[0]
1861
+ self.e11 = axis_y[1]
1862
+ self.e12 = axis_y[2]
1863
+ self.e13 = -RVec3.dot( axis_y, eye )
1864
+
1865
+ self.e20 = axis_z[0]
1866
+ self.e21 = axis_z[1]
1867
+ self.e22 = axis_z[2]
1868
+ self.e23 = -RVec3.dot( axis_z, eye )
1869
+
1870
+ return self
1871
+ end
1872
+
1840
1873
  #
1841
1874
  # call-seq: lookAtRH(eye,at,up) -> self
1842
1875
  #
@@ -1871,37 +1904,42 @@ module RMath3D
1871
1904
  end
1872
1905
 
1873
1906
  #
1874
- # call-seq: perspectiveRH(width,height,znear,zfar) -> self
1907
+ # call-seq: perspectiveRH(width,height,znear,zfar,ndc_convention) -> self
1875
1908
  #
1876
1909
  # Builds a perspective projection matrix for a right-handed coordinate system from:
1877
1910
  # * View volume width (+width+)
1878
1911
  # * View volume height (+height+)
1879
1912
  # * Near clip plane distance (+znear+)
1880
1913
  # * Far clip plane distance (+zfar+)
1914
+ # * Set true for the environment with Z coordinate ranges from -1 to +1 (OpenGL), and false otherwise (Direct3D, Metal) (+ndc_homogeneous+)
1881
1915
  #
1882
- def perspectiveRH( width, height, znear, zfar )
1883
- perspectiveOffCenterRH(-width/2.0, width/2.0, -height/2.0, height/2.0, znear, zfar )
1916
+ def perspectiveRH( width, height, znear, zfar, ndc_homogeneous = true)
1917
+ perspectiveOffCenterRH(-width/2.0, width/2.0, -height/2.0, height/2.0, znear, zfar, ndc_homogeneous )
1884
1918
  return self
1885
1919
  end
1886
1920
 
1887
1921
  #
1888
- # call-seq: perspectiveFovRH(fovy,aspect,znear,zfar) -> self
1922
+ # call-seq: perspectiveFovRH(fovy,aspect,znear,zfar,ndc_homogeneous) -> self
1889
1923
  #
1890
1924
  # Builds a perspective projection matrix for a right-handed coordinate system from:
1891
1925
  # * Field of view in y direction (+fovy+ radian)
1892
1926
  # * Aspect ratio (+aspect+)
1893
1927
  # * Near clip plane distance (+znear+)
1894
1928
  # * Far clip plane distance (+zfar+)
1929
+ # * Set true for the environment with Z coordinate ranges from -1 to +1 (OpenGL), and false otherwise (Direct3D, Metal) (+ndc_homogeneous+)
1895
1930
  #
1896
- def perspectiveFovRH( fovy_radian, aspect, znear, zfar )
1931
+ def perspectiveFovRH( fovy_radian, aspect, znear, zfar, ndc_homogeneous = true)
1897
1932
  f = Math::tan( fovy_radian / 2.0 )
1898
1933
  f = 1.0 / f
1899
1934
 
1935
+ c = ndc_homogeneous ? -(zfar+znear) / (zfar-znear) : -zfar / (zfar-znear)
1936
+ d = ndc_homogeneous ? -(2*znear*zfar) / (zfar-znear) : -(znear*zfar) / (zfar-znear)
1937
+
1900
1938
  setIdentity()
1901
1939
  setElement( 0, 0, f / aspect )
1902
1940
  setElement( 1, 1, f )
1903
- setElement( 2, 2, (zfar+znear)/(znear-zfar) )
1904
- setElement( 2, 3, 2*zfar*znear/(znear-zfar) )
1941
+ setElement( 2, 2, c )
1942
+ setElement( 2, 3, d )
1905
1943
  setElement( 3, 2, -1.0 )
1906
1944
  setElement( 3, 3, 0.0 )
1907
1945
 
@@ -1918,12 +1956,13 @@ module RMath3D
1918
1956
  # * Maximum value of the view volume height (+top+)
1919
1957
  # * Near clip plane distance (+znear+)
1920
1958
  # * Far clip plane distance (+zfar+)
1959
+ # * Set true for the environment with Z coordinate ranges from -1 to +1 (OpenGL), and false otherwise (Direct3D, Metal) (+ndc_homogeneous+)
1921
1960
  #
1922
- def perspectiveOffCenterRH( left, right, bottom, top, znear, zfar )
1961
+ def perspectiveOffCenterRH( left, right, bottom, top, znear, zfar, ndc_homogeneous = true)
1923
1962
  a = (right+left) / (right-left)
1924
1963
  b = (top+bottom) / (top-bottom)
1925
- c = -(zfar+znear) / (zfar-znear)
1926
- d = -(2*znear*zfar) / (zfar-znear)
1964
+ c = ndc_homogeneous ? -(zfar+znear) / (zfar-znear) : -zfar / (zfar-znear)
1965
+ d = ndc_homogeneous ? -(2*znear*zfar) / (zfar-znear) : -(znear*zfar) / (zfar-znear)
1927
1966
 
1928
1967
  setIdentity()
1929
1968
 
@@ -1947,9 +1986,10 @@ module RMath3D
1947
1986
  # * View volume height (+height+)
1948
1987
  # * Near clip plane distance (+znear+)
1949
1988
  # * Far clip plane distance (+zfar+)
1989
+ # * Set true for the environment with Z coordinate ranges from -1 to +1 (OpenGL), and false otherwise (Direct3D, Metal) (+ndc_homogeneous+)
1950
1990
  #
1951
- def orthoRH( width, height, znear, zfar )
1952
- orthoOffCenterRH( -width/2.0, width/2.0, -height/2.0, height/2.0, znear, zfar )
1991
+ def orthoRH( width, height, znear, zfar, ndc_homogeneous = true)
1992
+ orthoOffCenterRH( -width/2.0, width/2.0, -height/2.0, height/2.0, znear, zfar, ndc_homogeneous )
1953
1993
  return self
1954
1994
  end
1955
1995
 
@@ -1963,11 +2003,12 @@ module RMath3D
1963
2003
  # * Maximum value of the view volume height (+top+)
1964
2004
  # * Near clip plane distance (+znear+)
1965
2005
  # * Far clip plane distance (+zfar+)
2006
+ # * Set true for the environment with Z coordinate ranges from -1 to +1 (OpenGL), and false otherwise (Direct3D, Metal) (+ndc_homogeneous+)
1966
2007
  #
1967
- def orthoOffCenterRH( left, right, bottom, top, znear, zfar )
1968
- tx = (right+left) / (right-left)
1969
- ty = (top+bottom) / (top-bottom)
1970
- tz = (zfar+znear) / (zfar-znear)
2008
+ def orthoOffCenterRH( left, right, bottom, top, znear, zfar, ndc_homogeneous = true)
2009
+ tx = -(right+left) / (right-left)
2010
+ ty = -(top+bottom) / (top-bottom)
2011
+ tz = ndc_homogeneous ? -(zfar+znear) / (zfar-znear) : -znear / (zfar-znear)
1971
2012
 
1972
2013
  setIdentity()
1973
2014
 
@@ -1975,7 +2016,7 @@ module RMath3D
1975
2016
  setElement( 0, 3, tx )
1976
2017
  setElement( 1, 1, 2.0/(top-bottom) )
1977
2018
  setElement( 1, 3, ty )
1978
- setElement( 2, 2, -2.0/(zfar-znear) )
2019
+ setElement( 2, 2, -(ndc_homogeneous ? 2.0 : 1.0)/(zfar-znear) )
1979
2020
  setElement( 2, 3, tz )
1980
2021
 
1981
2022
  return self
@@ -2048,7 +2089,7 @@ module RMath3D
2048
2089
  #
2049
2090
  def *( arg )
2050
2091
  case arg
2051
- when Float, Integer, Fixnum, Bignum
2092
+ when Float, Integer
2052
2093
  return RMtx4.new( arg*self.e00, arg*self.e01, arg*self.e02, arg*self.e03,
2053
2094
  arg*self.e10, arg*self.e11, arg*self.e12, arg*self.e13,
2054
2095
  arg*self.e20, arg*self.e21, arg*self.e22, arg*self.e23,
@@ -2142,7 +2183,7 @@ module RMath3D
2142
2183
  #
2143
2184
  def mul!( other )
2144
2185
  case other
2145
- when Float, Integer, Fixnum, Bignum
2186
+ when Float, Integer
2146
2187
  self.e00 = other*self.e00
2147
2188
  self.e01 = other*self.e01
2148
2189
  self.e02 = other*self.e02
@@ -2224,7 +2265,7 @@ module RMath3D
2224
2265
  @e = [0.0, 0.0, 0.0, 0.0]
2225
2266
  when 1
2226
2267
  case a[0]
2227
- when Float, Integer, Fixnum, Bignum
2268
+ when Float, Integer
2228
2269
  @e = [ a[0], a[0], a[0], a[0] ]
2229
2270
  when RQuat
2230
2271
  @e = [ a[0].x, a[0].y, a[0].z, a[0].w ]
@@ -2235,7 +2276,7 @@ module RMath3D
2235
2276
  when 4
2236
2277
  a.each_with_index do |elem, index|
2237
2278
  case elem
2238
- when Float, Integer, Fixnum, Bignum
2279
+ when Float, Integer
2239
2280
  @e[index] = elem
2240
2281
  else
2241
2282
  raise TypeError, "RQuat#initialize : Unknown type #{elem.class}."
@@ -2274,7 +2315,7 @@ module RMath3D
2274
2315
  #
2275
2316
  def coerce( arg )
2276
2317
  case arg
2277
- when Float, Integer, Fixnum, Bignum
2318
+ when Float, Integer
2278
2319
  return [ self, arg ]
2279
2320
  else
2280
2321
  raise TypeError, "RQuat#coerce : #{arg.self} can't be coerced into #{self.class}."
@@ -2613,7 +2654,7 @@ module RMath3D
2613
2654
  z = q1w*q2z + q1x*q2y - q1y*q2x + q1z*q2w
2614
2655
  w = q1w*q2w - q1x*q2x - q1y*q2y - q1z*q2z
2615
2656
  return RQuat.new( x, y, z, w )
2616
- when Float, Integer, Fixnum, Bignum
2657
+ when Float, Integer
2617
2658
  return RQuat.new( @e[0]*arg, @e[1]*arg, @e[2]*arg, @e[3]*arg )
2618
2659
  else
2619
2660
  raise TypeError, "RQuat#* : Unknown type #{arg}."
@@ -2708,7 +2749,7 @@ module RMath3D
2708
2749
 
2709
2750
  return self
2710
2751
 
2711
- when Float, Integer, Fixnum, Bignum
2752
+ when Float, Integer
2712
2753
  self.x *= other
2713
2754
  self.y *= other
2714
2755
  self.z *= other
@@ -2824,7 +2865,7 @@ module RMath3D
2824
2865
  @e = [0.0, 0.0]
2825
2866
  when 1
2826
2867
  case a[0]
2827
- when Float, Integer, Fixnum, Bignum
2868
+ when Float, Integer
2828
2869
  @e = [ a[0], a[0] ]
2829
2870
  when RVec2
2830
2871
  @e = [ a[0].x, a[0].y ]
@@ -2835,7 +2876,7 @@ module RMath3D
2835
2876
  when 2
2836
2877
  a.each_with_index do |elem, index|
2837
2878
  case elem
2838
- when Float, Integer, Fixnum, Bignum
2879
+ when Float, Integer
2839
2880
  @e[index] = elem
2840
2881
  else
2841
2882
  raise TypeError, "RVec2#initialize : Unknown type #{elem.class}."
@@ -2874,7 +2915,7 @@ module RMath3D
2874
2915
  #
2875
2916
  def coerce( arg )
2876
2917
  case arg
2877
- when Float, Integer, Fixnum, Bignum
2918
+ when Float, Integer
2878
2919
  return [ self, arg ]
2879
2920
  else
2880
2921
  raise TypeError, "RVec2#coerce : #{arg.self} can't be coerced into #{self.class}."
@@ -3063,7 +3104,7 @@ module RMath3D
3063
3104
  #
3064
3105
  def *( arg )
3065
3106
  case arg
3066
- when Float, Integer, Fixnum, Bignum
3107
+ when Float, Integer
3067
3108
  return RVec2.new( @e[0]*arg, @e[1]*arg )
3068
3109
  else
3069
3110
  raise TypeError, "RVec2#* : Unknown type #{arg}."
@@ -3129,7 +3170,7 @@ module RMath3D
3129
3170
  # vec1 *= vec2
3130
3171
  #
3131
3172
  def mul!( arg )
3132
- if !(arg.class == Float || arg.class == Integer || arg.class == Fixnum || arg.class == Bignum)
3173
+ if !(arg.class == Float || arg.class == Integer)
3133
3174
  raise TypeError, "RVec2#mul! : Unknown type #{arg.class}."
3134
3175
  return nil
3135
3176
  end
@@ -3163,7 +3204,7 @@ module RMath3D
3163
3204
  @e = [0.0, 0.0, 0.0]
3164
3205
  when 1
3165
3206
  case a[0]
3166
- when Float, Integer, Fixnum, Bignum
3207
+ when Float, Integer
3167
3208
  @e = [ a[0], a[0], a[0] ]
3168
3209
  when RVec3
3169
3210
  @e = [ a[0].x, a[0].y, a[0].z ]
@@ -3174,7 +3215,7 @@ module RMath3D
3174
3215
  when 3
3175
3216
  a.each_with_index do |elem, index|
3176
3217
  case elem
3177
- when Float, Integer, Fixnum, Bignum
3218
+ when Float, Integer
3178
3219
  @e[index] = elem
3179
3220
  else
3180
3221
  raise TypeError, "RVec3#initialize : Unknown type #{elem.class}."
@@ -3213,7 +3254,7 @@ module RMath3D
3213
3254
  #
3214
3255
  def coerce( arg )
3215
3256
  case arg
3216
- when Float, Integer, Fixnum, Bignum
3257
+ when Float, Integer
3217
3258
  return [ self, arg ]
3218
3259
  else
3219
3260
  raise TypeError, "RVec3#coerce : #{arg.self} can't be coerced into #{self.class}."
@@ -3517,9 +3558,9 @@ module RMath3D
3517
3558
  t_z = q.w*self[2] + q.x*self[1] - q.y*self[0]
3518
3559
  t_w = - q.x*self[0] - q.y*self[1] - q.z*self[2]
3519
3560
 
3520
- result.x = -t_w*q.x + t_x*q.w - t_y*q.z + t_z*q.y;
3521
- result.y = -t_w*q.y + t_x*q.z + t_y*q.w - t_z*q.x;
3522
- result.z = -t_w*q.z - t_x*q.y + t_y*q.x + t_z*q.w;
3561
+ result.x = -t_w*q.x + t_x*q.w - t_y*q.z + t_z*q.y
3562
+ result.y = -t_w*q.y + t_x*q.z + t_y*q.w - t_z*q.x
3563
+ result.z = -t_w*q.z - t_x*q.y + t_y*q.x + t_z*q.w
3523
3564
 
3524
3565
  return result
3525
3566
  end
@@ -3533,9 +3574,9 @@ module RMath3D
3533
3574
  t_z = q.w*self[2] + q.x*self[1] - q.y*self[0]
3534
3575
  t_w = - q.x*self[0] - q.y*self[1] - q.z*self[2]
3535
3576
 
3536
- self.x = -t_w*q.x + t_x*q.w - t_y*q.z + t_z*q.y;
3537
- self.y = -t_w*q.y + t_x*q.z + t_y*q.w - t_z*q.x;
3538
- self.z = -t_w*q.z - t_x*q.y + t_y*q.x + t_z*q.w;
3577
+ self.x = -t_w*q.x + t_x*q.w - t_y*q.z + t_z*q.y
3578
+ self.y = -t_w*q.y + t_x*q.z + t_y*q.w - t_z*q.x
3579
+ self.z = -t_w*q.z - t_x*q.y + t_y*q.x + t_z*q.w
3539
3580
 
3540
3581
  return self
3541
3582
  end
@@ -3616,7 +3657,7 @@ module RMath3D
3616
3657
  #
3617
3658
  def *( arg )
3618
3659
  case arg
3619
- when Float, Integer, Fixnum, Bignum
3660
+ when Float, Integer
3620
3661
  return RVec3.new( @e[0]*arg, @e[1]*arg, @e[2]*arg )
3621
3662
  else
3622
3663
  raise TypeError, "RVec3#* : Unknown type #{arg}."
@@ -3685,7 +3726,7 @@ module RMath3D
3685
3726
  # vec1 *= vec2
3686
3727
  #
3687
3728
  def mul!( arg )
3688
- if !(arg.class == Float || arg.class == Integer || arg.class == Fixnum || arg.class == Bignum)
3729
+ if !(arg.class == Float || arg.class == Integer)
3689
3730
  raise TypeError, "RVec3#mul! : Unknown type #{arg.class}."
3690
3731
  return nil
3691
3732
  end
@@ -3720,7 +3761,7 @@ module RMath3D
3720
3761
  @e = [0.0, 0.0, 0.0, 0.0]
3721
3762
  when 1
3722
3763
  case a[0]
3723
- when Float, Integer, Fixnum, Bignum
3764
+ when Float, Integer
3724
3765
  @e = [ a[0], a[0], a[0], a[0] ]
3725
3766
  when RVec3
3726
3767
  @e = [ a[0].x, a[0].y, a[0].z, 0.0 ]
@@ -3733,7 +3774,7 @@ module RMath3D
3733
3774
  when 4
3734
3775
  a.each_with_index do |elem, index|
3735
3776
  case elem
3736
- when Float, Integer, Fixnum, Bignum
3777
+ when Float, Integer
3737
3778
  @e[index] = elem
3738
3779
  else
3739
3780
  raise TypeError, "RVec4#initialize : Unknown type #{elem.class}."
@@ -3772,7 +3813,7 @@ module RMath3D
3772
3813
  #
3773
3814
  def coerce( arg )
3774
3815
  case arg
3775
- when Float, Integer, Fixnum, Bignum
3816
+ when Float, Integer
3776
3817
  return [ self, arg ]
3777
3818
  else
3778
3819
  raise TypeError, "RVec4#coerce : #{arg.self} can't be coerced into #{self.class}."
@@ -4062,7 +4103,7 @@ module RMath3D
4062
4103
  #
4063
4104
  def *( arg )
4064
4105
  case arg
4065
- when Float, Integer, Fixnum, Bignum
4106
+ when Float, Integer
4066
4107
  return RVec4.new( @e[0]*arg, @e[1]*arg, @e[2]*arg, @e[3]*arg )
4067
4108
  else
4068
4109
  raise TypeError, "RVec4#* : Unknown type #{arg}."
@@ -4134,7 +4175,7 @@ module RMath3D
4134
4175
  # vec1 *= vec2
4135
4176
  #
4136
4177
  def mul!( other )
4137
- if !(other.class == Float || other.class == Integer || other.class == Fixnum || other.class == Bignum)
4178
+ if !(other.class == Float || other.class == Integer)
4138
4179
  raise TypeError, "RVec4#mul! : Unknown type #{other.class}."
4139
4180
  return nil
4140
4181
  end
@@ -4152,7 +4193,7 @@ end
4152
4193
 
4153
4194
  =begin
4154
4195
  RMath : Ruby math module for 3D Applications
4155
- Copyright (c) 2008-2017 vaiorabbit <http://twitter.com/vaiorabbit>
4196
+ Copyright (c) 2008-2020 vaiorabbit <http://twitter.com/vaiorabbit>
4156
4197
 
4157
4198
  This software is provided 'as-is', without any express or implied
4158
4199
  warranty. In no event will the authors be held liable for any damages
@@ -104,7 +104,7 @@ class App
104
104
  def size_callback( window_handle, w, h )
105
105
  glViewport( 0, 0, w, h )
106
106
  glMatrixMode( GL_PROJECTION )
107
- @mtxProj.perspectiveFovRH( 30.0*Math::PI/180.0, w.to_f/h.to_f, 0.1, 1000.0 )
107
+ @mtxProj.perspectiveFovRH( 30.0*Math::PI/180.0, w.to_f/h.to_f, 0.1, 1000.0, true )
108
108
  glLoadMatrixf( @mtxProj.to_a.pack('F16') )
109
109
 
110
110
  @window_width = w
@@ -119,7 +119,7 @@ class App
119
119
  @at = RVec3.new(0.0, 0.0, 0.0)
120
120
  @up = RVec3.new(0.0, 1.0, 0.0)
121
121
  @mtxLookAt = RMtx4.new.lookAtRH( @eye, @at, @up )
122
- @mtxProj = RMtx4.new.perspectiveFovRH( 30.0*Math::PI/180.0, @window_width.to_f/@window_height.to_f, 0.1, 1000.0 )
122
+ @mtxProj = RMtx4.new.perspectiveFovRH( 30.0*Math::PI/180.0, @window_width.to_f/@window_height.to_f, 0.1, 1000.0, true )
123
123
 
124
124
  @light_pos = [2.5,0,5,1]
125
125
  @light_diffuse = [1,1,1,1]
@@ -42,7 +42,7 @@ class App
42
42
  def reshape( width, height )
43
43
  glViewport( 0, 0, width, height )
44
44
  glMatrixMode( GL_PROJECTION )
45
- @mtxProj.perspectiveFovRH( 30.0*Math::PI/180.0, width.to_f/height.to_f, 0.1, 1000.0 )
45
+ @mtxProj.perspectiveFovRH( 30.0*Math::PI/180.0, width.to_f/height.to_f, 0.1, 1000.0, true )
46
46
  glLoadMatrix( @mtxProj )
47
47
 
48
48
  @window_width = width
@@ -74,7 +74,7 @@ class App
74
74
  @at = RVec3.new(0.0, 0.0, 0.0)
75
75
  @up = RVec3.new(0.0, 1.0, 0.0)
76
76
  @mtxLookAt = RMtx4.new.lookAtRH( @eye, @at, @up )
77
- @mtxProj = RMtx4.new.perspectiveFovRH( 30.0*Math::PI/180.0, @window_width.to_f/@window_height.to_f, 0.1, 1000.0 )
77
+ @mtxProj = RMtx4.new.perspectiveFovRH( 30.0*Math::PI/180.0, @window_width.to_f/@window_height.to_f, 0.1, 1000.0, true )
78
78
 
79
79
  @light_pos = [2.5,0,5,1]
80
80
  @light_diffuse = [1,1,1,1]
@@ -1,4 +1,4 @@
1
- begin
1
+ begin
2
2
  require 'rmath3d/rmath3d'
3
3
  rescue LoadError
4
4
  require 'rmath3d/rmath3d_plain'
@@ -526,7 +526,7 @@ class TC_RMtx4 < Minitest::Test
526
526
  0.0, 2*z_n/height, 0.0, 0.0,
527
527
  0.0, 0.0, -(z_f+z_n)/(z_f-z_n), -2.0*z_f*z_n / (z_f-z_n),
528
528
  0.0, 0.0, -1.0, 0.0 )
529
- m1 = RMtx4.new.perspectiveRH( width, height, z_n, z_f )
529
+ m1 = RMtx4.new.perspectiveRH( width, height, z_n, z_f, true )
530
530
 
531
531
  for r in 0...4 do
532
532
  for c in 0...4 do
@@ -544,7 +544,7 @@ class TC_RMtx4 < Minitest::Test
544
544
  0.0, f, 0.0, 0.0,
545
545
  0.0, 0.0, (z_f+z_n)/(z_n-z_f), 2*z_f*z_n/(z_n-z_f),
546
546
  0.0, 0.0, -1.0, 0.0 )
547
- m3 = RMtx4.new.perspectiveFovRH( fovy, aspect, z_n, z_f );
547
+ m3 = RMtx4.new.perspectiveFovRH( fovy, aspect, z_n, z_f, true );
548
548
 
549
549
  for r in 0...4 do
550
550
  for c in 0...4 do
@@ -563,7 +563,7 @@ class TC_RMtx4 < Minitest::Test
563
563
  0.0, 0.0, c, d,
564
564
  0.0, 0.0, -1.0, 0.0 )
565
565
 
566
- m5 = RMtx4.new.perspectiveOffCenterRH( left, right, bottom, top, z_n, z_f )
566
+ m5 = RMtx4.new.perspectiveOffCenterRH( left, right, bottom, top, z_n, z_f, true )
567
567
 
568
568
  for r in 0...4 do
569
569
  for c in 0...4 do
@@ -584,14 +584,14 @@ class TC_RMtx4 < Minitest::Test
584
584
  height = top - bottom
585
585
 
586
586
  # RMtx4#orthoRH
587
- tx = (right+left)/width
588
- ty = (top+bottom)/height
589
- tz = (z_f+z_n)/(z_f-z_n)
587
+ tx = -(right+left)/width
588
+ ty = -(top+bottom)/height
589
+ tz = -(z_f+z_n)/(z_f-z_n)
590
590
  m0 = RMtx4.new( 2.0/width, 0.0, 0.0, tx,
591
591
  0.0, 2.0/height, 0.0, ty,
592
592
  0.0, 0.0, -2.0/(z_f-z_n), tz,
593
593
  0.0, 0.0, 0.0, 1.0 )
594
- m1 = RMtx4.new.orthoRH( width, height, z_n, z_f )
594
+ m1 = RMtx4.new.orthoRH( width, height, z_n, z_f, true )
595
595
 
596
596
  for r in 0...4 do
597
597
  for c in 0...4 do
@@ -600,14 +600,14 @@ class TC_RMtx4 < Minitest::Test
600
600
  end
601
601
 
602
602
  # RMtx4#orthoOffCenterRH
603
- tx = (right+left)/(right-left)
604
- ty = (top+bottom)/(top-bottom)
605
- tz = (z_f+z_n)/(z_f-z_n)
603
+ tx = -(right+left)/(right-left)
604
+ ty = -(top+bottom)/(top-bottom)
605
+ tz = -(z_f+z_n)/(z_f-z_n)
606
606
  m2 = RMtx4.new( 2.0/(right-left), 0.0, 0.0, tx,
607
607
  0.0, 2.0/(top-bottom), 0.0, ty,
608
608
  0.0, 0.0, -2.0/(z_f-z_n), tz,
609
609
  0.0, 0.0, 0.0, 1.0 )
610
- m3 = RMtx4.new.orthoOffCenterRH( left, right, bottom, top, z_n, z_f )
610
+ m3 = RMtx4.new.orthoOffCenterRH( left, right, bottom, top, z_n, z_f, true )
611
611
 
612
612
  for r in 0...4 do
613
613
  for c in 0...4 do
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rmath3d_plain
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - vaiorabbit
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-22 00:00:00.000000000 Z
11
+ date: 2020-06-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 'Provides vector2/3/4, matrix2x2/3x3/4x4 and quaternion in plain Ruby
14
14
  form.
15
15
 
16
- '
16
+ '
17
17
  email:
18
18
  - vaiorabbit@gmail.com
19
19
  executables: []
@@ -39,7 +39,7 @@ homepage: https://github.com/vaiorabbit/rmath3d
39
39
  licenses:
40
40
  - Zlib
41
41
  metadata: {}
42
- post_install_message:
42
+ post_install_message:
43
43
  rdoc_options: []
44
44
  require_paths:
45
45
  - lib
@@ -47,16 +47,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
- version: 2.0.0
50
+ version: 2.4.0
51
51
  required_rubygems_version: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  requirements: []
57
- rubyforge_project:
58
- rubygems_version: 2.6.12
59
- signing_key:
57
+ rubygems_version: 3.1.2
58
+ signing_key:
60
59
  specification_version: 4
61
60
  summary: Ruby Math Module for 3D Applications
62
61
  test_files: []