geo3d 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 870525f0b9b488f8fe0bd03f72e679d173b40222
4
- data.tar.gz: c9803964afa4f1cf843b9a4472b2a16aa749abf5
3
+ metadata.gz: e792232f7a90e668e5cae09575b15574c33c0b30
4
+ data.tar.gz: 18ccd86ed62ef23860e8bd4bc650958b0401836f
5
5
  SHA512:
6
- metadata.gz: b377f16be7634b34158dbf5b21d0960c3025a4188c1ffb1e90b905f0621063d94a0d3f5f2185e5db3dc019984065dc06f4eb05a7bc2358dad37e1fb3bf257143
7
- data.tar.gz: 11fbe068470ca6034a2174344f5f6a33cbae544821ae5eb7136a91e3d02688ded7e672fedab991ff734d398f4f71c0dcb5be727be082b72cd6baba752af43ba4
6
+ metadata.gz: 048b7fb31747320c8024580e1381b630540442a1810089a9a6b49a94060140b0e8cb56e105927de9c6b15cdacda5e4a753934e2e42578979fb6763b7714a85b1
7
+ data.tar.gz: 119f28b82c0ed685bbf834e215b80501855520e848daf6a9a2f63e289c768116ead912585fec145d277e30213e0d78b0ae55d60b7e77d37f86aee47d1d981429
data/geo3d.gemspec CHANGED
@@ -21,4 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "misha-ruby-sdl-ffi"
25
+ spec.add_development_dependency "ruby-opengl"
24
26
  end
data/lib/geo3d.rb CHANGED
@@ -3,5 +3,6 @@ require 'vector'
3
3
  require 'matrix'
4
4
  require 'quaternion'
5
5
  require 'plane'
6
+ require 'triangle'
6
7
 
7
8
 
data/lib/geo3d/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Geo3d
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
data/lib/matrix.rb CHANGED
@@ -186,6 +186,15 @@ module Geo3d
186
186
  transformed_vector.z = _13 * vec.x + _23 * vec.y + _33 * vec.z + _43 * vec.w
187
187
  transformed_vector.w = _14 * vec.x + _24 * vec.y + _34 * vec.z + _44 * vec.w
188
188
  return transformed_vector
189
+ elsif Triangle == v.class
190
+ tri = v
191
+ transformed_tri = Triangle.new
192
+ transformed_tri.a = self * tri.a
193
+ transformed_tri.b = self * tri.b
194
+ transformed_tri.c = self * tri.c
195
+ return transformed_tri
196
+ elsif Array == v.class
197
+ return v.map { |i| self * i }
189
198
  else
190
199
  scalar = v
191
200
  result._11 = _11 * scalar
@@ -238,7 +247,7 @@ module Geo3d
238
247
  end
239
248
 
240
249
  def transform_coord vec
241
- self * Vector.new( vec.x, vec.y, vec.z, 1.0 )
250
+ self * Vector.new(vec.x, vec.y, vec.z, 1.0)
242
251
  end
243
252
 
244
253
  def transform vec
@@ -436,7 +445,38 @@ module Geo3d
436
445
  end
437
446
 
438
447
  def to_s
439
- (0..3).to_a.map{ |i| row(i).to_s}.join "\n"
448
+ (0..3).to_a.map { |i| row(i).to_s }.join "\n"
449
+ end
450
+
451
+ def self.glu_perspective_degrees fovy, aspect, zn, zf
452
+ fovy = fovy.to_f
453
+ aspect = aspect.to_f
454
+ zn = zn.to_f
455
+ zf = zf.to_f
456
+ range = zn*Math.tan(Geo3d::Utils.to_radians(fovy/2.0))
457
+ self.gl_frustum -range*aspect, range*aspect, -range, range, zn, zf
458
+ end
459
+
460
+ def self.gl_frustum l, r, b, t, zn, zf
461
+ l = l.to_f
462
+ r = r.to_f
463
+ b = b.to_f
464
+ t = t.to_f
465
+ zn = zn.to_f
466
+ zf = zf.to_f
467
+ a = (r+l) / (r-l)
468
+ b = (t+b) / (t-b)
469
+ c = -(zf + zn) / (zf - zn)
470
+ d = -(2 * zf * zn) / (zf - zn)
471
+ matrix = self.new
472
+ matrix._11 = 2.0 * zn / (r-l)
473
+ matrix._31 = a
474
+ matrix._22 = 2.0 * zn / (t-b) #todo: the man page says multiply this by two, but I don't actually match what glFrustum does if I do
475
+ matrix._32 = b
476
+ matrix._33 = c
477
+ matrix._43 = d
478
+ matrix._34 = -1.0
479
+ matrix
440
480
  end
441
481
 
442
482
  def self.perspective_fov_rh fovy, aspect, zn, zf
data/lib/triangle.rb ADDED
@@ -0,0 +1,46 @@
1
+ module Geo3d
2
+ class Triangle
3
+ attr_accessor :a, :b, :c
4
+
5
+ def points
6
+ [a, b, c]
7
+ end
8
+
9
+ def initialize
10
+ @a = Vector.new
11
+ @b = Vector.new
12
+ @c = Vector.new
13
+ end
14
+
15
+ def flip!
16
+ @b, @c = @c, @b
17
+ end
18
+
19
+ def flip
20
+ f = clone
21
+ f.flip!
22
+ f
23
+ end
24
+
25
+ def normal
26
+ (b - a).cross(c - a).normalize
27
+ end
28
+
29
+ def signed_area reference_normal = Vector.new(0,0,-1)
30
+ sum = Vector.new 0, 0, 0, 0
31
+ points.each_with_index do |current_point, i|
32
+ next_point = points[(i == points.size - 1) ? 0 : i+1]
33
+ sum += current_point.cross next_point
34
+ end
35
+ reference_normal.dot(sum) / 2.0
36
+ end
37
+
38
+ def clockwise?
39
+ signed_area > 0
40
+ end
41
+
42
+ def counter_clockwise?
43
+ signed_area < 0
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Geo3d::Triangle do
4
+ it "should detect winding" do
5
+ [{:a => [0,0,0], :b => [1,0,0], :c => [1,1,0], :expected => "counter-clockwise"},
6
+ {:a => [0,0,0], :b => [1,0,0], :c => [1,-1,0], :expected => "clockwise"}].each do |data|
7
+ t = Geo3d::Triangle.new
8
+ t.a = Geo3d::Vector.new *data[:a]
9
+ t.b = Geo3d::Vector.new *data[:b]
10
+ t.c = Geo3d::Vector.new *data[:c]
11
+ winding = t.counter_clockwise?? 'counter-clockwise' : 'clockwise'
12
+ winding.should == data[:expected]
13
+ end
14
+ end
15
+
16
+ it "should calculate normal" do
17
+
18
+ end
19
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Geo3d::Matrix do
4
+ before :each do
5
+ @gl_initialized = false
6
+ require "ruby-sdl-ffi"
7
+ require "opengl"
8
+
9
+ if SDL.Init(SDL::INIT_VIDEO) < 0
10
+ puts "not able to init"
11
+ else
12
+
13
+ SDL.GL_SetAttribute SDL::GL_RED_SIZE, 5
14
+ SDL.GL_SetAttribute SDL::GL_GREEN_SIZE, 5
15
+ SDL.GL_SetAttribute SDL::GL_BLUE_SIZE, 5
16
+ SDL.GL_SetAttribute SDL::GL_DEPTH_SIZE, 16
17
+ SDL.GL_SetAttribute SDL::GL_DOUBLEBUFFER, 1
18
+
19
+ if 0 == SDL.SetVideoMode(640, 480, SDL.GetVideoInfo.vfmt.BitsPerPixel, SDL::OPENGL)
20
+ puts "not able to set video mode"
21
+ else
22
+ @gl_initialized = true
23
+ end
24
+ end
25
+ raise "opengl not able to initialize" unless @gl_initialized
26
+ end
27
+
28
+
29
+ it "the right handed view constructor should be functionally equivalent to gluLookAt" do
30
+ [{:eye => [1, 0, 0], :focus => [100, 0, -100], :up => [0, 1, 0]}].each do |data|
31
+ eye = Geo3d::Vector.new *data[:eye]
32
+ focus = Geo3d::Vector.new *data[:eye]
33
+ up = Geo3d::Vector.new *data[:eye]
34
+
35
+ glMatrixMode GL_MODELVIEW
36
+ glLoadIdentity
37
+ gluLookAt eye.x, eye.y, eye.z, focus.x, focus.y, focus.z, up.x, up.y, up.z
38
+ gl_version = Geo3d::Matrix.new *glGetFloatv(GL_MODELVIEW_MATRIX).flatten
39
+
40
+ gl_version.should == Geo3d::Matrix.look_at_rh(eye, focus, up)
41
+ end
42
+ end
43
+
44
+ it "gl_frustum should be equivalent to opengl glFrustum" do
45
+ [{:l => -2, :r => 2, :b => -2, :t => 2, :zn => 1, :zf => 1000},
46
+ {:l => -231, :r => 453, :b => -232, :t => 2786, :zn => 9.221, :zf => 10000}].each do |data|
47
+ glMatrixMode GL_PROJECTION
48
+ glLoadIdentity
49
+ glFrustum data[:l], data[:r], data[:b], data[:t], data[:zn], data[:zf]
50
+
51
+ gl_version = Geo3d::Matrix.new *(glGetFloatv(GL_PROJECTION_MATRIX).flatten)
52
+ geo3d_matrix = Geo3d::Matrix.gl_frustum data[:l], data[:r], data[:b], data[:t], data[:zn], data[:zf]
53
+
54
+ gl_version.should == geo3d_matrix
55
+ end
56
+
57
+ end
58
+
59
+ it "glu_perspective_degrees should be equivalent to opengl gluPerspective" do
60
+ [{:fovy_in_degrees => 60, :width => 640, :height => 480, :near => 0.1, :far => 1000}].each do |data|
61
+ glMatrixMode GL_PROJECTION
62
+ glLoadIdentity
63
+ gluPerspective data[:fovy_in_degrees], data[:width].to_f/data[:height].to_f, data[:near], data[:far]
64
+
65
+ gl_version = Geo3d::Matrix.new *glGetFloatv(GL_PROJECTION_MATRIX).flatten
66
+ geo3d_matrix = Geo3d::Matrix.glu_perspective_degrees(data[:fovy_in_degrees], data[:width].to_f/data[:height].to_f, data[:near], data[:far])
67
+
68
+ gl_version.should == geo3d_matrix
69
+ end
70
+ end
71
+
72
+ it "should multiply matrices the same way opengl does" do
73
+ 10000.times do
74
+ a_values = (0..15).to_a.map do |i|
75
+ rand * rand(100)
76
+ end
77
+
78
+ b_values = (0..15).to_a.map do |i|
79
+ rand * rand(100)
80
+ end
81
+
82
+ geo3d_matrix = Geo3d::Matrix.new(*b_values) * Geo3d::Matrix.new(*a_values)
83
+
84
+ glMatrixMode GL_MODELVIEW
85
+ glLoadIdentity
86
+ glLoadMatrixf a_values
87
+ glMultMatrixf b_values
88
+ gl_version = Geo3d::Matrix.new *glGetFloatv(GL_MODELVIEW).flatten
89
+
90
+ gl_version.should == geo3d_matrix
91
+ end
92
+ end
93
+
94
+
95
+ end
metadata CHANGED
@@ -1,55 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geo3d
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Misha Conway
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-16 00:00:00.000000000 Z
11
+ date: 2014-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: misha-ruby-sdl-ffi
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ruby-opengl
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
55
83
  description: Library for common 3d graphics vector and matrix operations
@@ -59,7 +87,7 @@ executables: []
59
87
  extensions: []
60
88
  extra_rdoc_files: []
61
89
  files:
62
- - .gitignore
90
+ - ".gitignore"
63
91
  - Gemfile
64
92
  - LICENSE.txt
65
93
  - README.md
@@ -70,12 +98,15 @@ files:
70
98
  - lib/matrix.rb
71
99
  - lib/plane.rb
72
100
  - lib/quaternion.rb
101
+ - lib/triangle.rb
73
102
  - lib/utils.rb
74
103
  - lib/vector.rb
75
104
  - spec/lib/matrix_spec.rb
76
105
  - spec/lib/plane_spec.rb
77
106
  - spec/lib/quaternion_spec.rb
107
+ - spec/lib/triangle_spec.rb
78
108
  - spec/lib/vector_spec.rb
109
+ - spec/opengl/matrix_spec.rb
79
110
  - spec/spec_helper.rb
80
111
  homepage: https://github.com/MishaConway/geo3d
81
112
  licenses:
@@ -87,17 +118,17 @@ require_paths:
87
118
  - lib
88
119
  required_ruby_version: !ruby/object:Gem::Requirement
89
120
  requirements:
90
- - - '>='
121
+ - - ">="
91
122
  - !ruby/object:Gem::Version
92
123
  version: '0'
93
124
  required_rubygems_version: !ruby/object:Gem::Requirement
94
125
  requirements:
95
- - - '>='
126
+ - - ">="
96
127
  - !ruby/object:Gem::Version
97
128
  version: '0'
98
129
  requirements: []
99
130
  rubyforge_project:
100
- rubygems_version: 2.1.11
131
+ rubygems_version: 2.2.1
101
132
  signing_key:
102
133
  specification_version: 4
103
134
  summary: Library for common 3d graphics vector and matrix operations
@@ -105,5 +136,7 @@ test_files:
105
136
  - spec/lib/matrix_spec.rb
106
137
  - spec/lib/plane_spec.rb
107
138
  - spec/lib/quaternion_spec.rb
139
+ - spec/lib/triangle_spec.rb
108
140
  - spec/lib/vector_spec.rb
141
+ - spec/opengl/matrix_spec.rb
109
142
  - spec/spec_helper.rb