gosling 1.0.0

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.
@@ -0,0 +1,15 @@
1
+ describe Gosling::ImageLibrary do
2
+ it "returns a Gosu:Image reference when given a filename" do
3
+ expect(Gosling::ImageLibrary.get("C:/Users/Ben/Pictures/icons/me_64.png")).to be_instance_of(Gosu::Image)
4
+ end
5
+
6
+ it "raises an argument error if the file does not exist" do
7
+ expect { Gosling::ImageLibrary.get("C:/does/not/exist.png") }.to raise_error(ArgumentError)
8
+ end
9
+
10
+ it "does not create a new Gosu:Image if it already has one cached" do
11
+ image_a = Gosling::ImageLibrary.get("C:/Users/Ben/Pictures/icons/me_64.png")
12
+ image_b = Gosling::ImageLibrary.get("C:/Users/Ben/Pictures/icons/me_64.png")
13
+ expect(image_a).to be == image_b
14
+ end
15
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,213 @@
1
+ describe Gosling::Polygon do
2
+ before(:all) do
3
+ @window = Gosu::Window.new(640, 480, false)
4
+ @polygon = Gosling::Polygon.new(@window)
5
+ end
6
+
7
+ describe '#get_vertices' do
8
+ it 'returns a list of three or more vertices' do
9
+ expect(@polygon.get_vertices).to be_instance_of(Array)
10
+ expect(@polygon.get_vertices[0]).to be_instance_of(Vector)
11
+ expect(@polygon.get_vertices.length).to be >= 3
12
+ end
13
+ end
14
+
15
+ describe '#set_vertices' do
16
+ it 'assigns new vertices' do
17
+ vertices = [
18
+ Vector[ 1, 0, 1],
19
+ Vector[ 0, 1, 1],
20
+ Vector[-1, 0, 1],
21
+ Vector[ 0, -1, 1],
22
+ ]
23
+
24
+ polygon = Gosling::Polygon.new(@window)
25
+ polygon.set_vertices(vertices)
26
+ expect(polygon.get_vertices).to be == vertices
27
+ end
28
+
29
+ it 'raises an error if the parameter is not an array' do
30
+ polygon = Gosling::Polygon.new(@window)
31
+ expect { polygon.set_vertices("foo") }.to raise_error(ArgumentError)
32
+ end
33
+
34
+ it 'raises an error if the parameter array contains non-vectors' do
35
+ vertices = [
36
+ [ 1, 0, 1],
37
+ [ 0, 1, 1],
38
+ [-1, 0, 1],
39
+ [ 0, -1, 1],
40
+ ]
41
+
42
+ polygon = Gosling::Polygon.new(@window)
43
+ expect { polygon.set_vertices(vertices) }.to raise_error(ArgumentError)
44
+ end
45
+
46
+ it 'raises an error if the parameter array is too short' do
47
+ vertices = [
48
+ Vector[ 1, 0, 1],
49
+ Vector[ 0, 1, 1]
50
+ ]
51
+
52
+ polygon = Gosling::Polygon.new(@window)
53
+ expect { polygon.set_vertices(vertices) }.to raise_error(ArgumentError)
54
+ end
55
+
56
+ it 'raises an error if any vertices in the parameter array are not length 3' do
57
+ vertices = [
58
+ Vector[ 1, 0],
59
+ Vector[ 0, 1],
60
+ Vector[-1, 0],
61
+ Vector[ 0, -1],
62
+ ]
63
+
64
+ polygon = Gosling::Polygon.new(@window)
65
+ expect { polygon.set_vertices(vertices) }.to raise_error(ArgumentError)
66
+ end
67
+ end
68
+
69
+ describe '#get_global_vertices' do
70
+ before(:all) do
71
+ @global_polygon = Gosling::Polygon.new(@window)
72
+ @global_polygon.set_vertices([
73
+ Vector[1, 1, 0],
74
+ Vector[0, -1, 0],
75
+ Vector[-1, -1, 0],
76
+ Vector[-1, 2, 0]
77
+ ])
78
+ end
79
+
80
+ it 'returns a list of three or more vertices' do
81
+ result = @global_polygon.get_global_vertices
82
+ expect(result).to be_instance_of(Array)
83
+ expect(result[0]).to be_instance_of(Vector)
84
+ expect(result.length).to be >= 3
85
+ end
86
+
87
+ it 'respects centering' do
88
+ @global_polygon.x = 0
89
+ @global_polygon.y = 0
90
+ @global_polygon.center_x = 10
91
+ @global_polygon.center_y = 2
92
+ @global_polygon.scale_x = 1
93
+ @global_polygon.scale_y = 1
94
+ @global_polygon.rotation = 0
95
+
96
+ vertices = @global_polygon.get_global_vertices
97
+ expect(vertices).to be == [
98
+ Vector[-9, -1, 0],
99
+ Vector[-10, -3, 0],
100
+ Vector[-11, -3, 0],
101
+ Vector[-11, 0, 0]
102
+ ]
103
+ end
104
+
105
+ it 'respects scaling' do
106
+ @global_polygon.x = 0
107
+ @global_polygon.y = 0
108
+ @global_polygon.center_x = 0
109
+ @global_polygon.center_y = 0
110
+ @global_polygon.scale_x = 3
111
+ @global_polygon.scale_y = 2
112
+ @global_polygon.rotation = 0
113
+
114
+ vertices = @global_polygon.get_global_vertices
115
+ expect(vertices).to be == [
116
+ Vector[3, 2, 0],
117
+ Vector[0, -2, 0],
118
+ Vector[-3, -2, 0],
119
+ Vector[-3, 4, 0]
120
+ ]
121
+ end
122
+
123
+ it 'respects rotation' do
124
+ @global_polygon.x = 0
125
+ @global_polygon.y = 0
126
+ @global_polygon.center_x = 0
127
+ @global_polygon.center_y = 0
128
+ @global_polygon.scale_x = 1
129
+ @global_polygon.scale_y = 1
130
+ @global_polygon.rotation = Math::PI / 2
131
+
132
+ vertices = @global_polygon.get_global_vertices
133
+ expect(vertices).to be == [
134
+ Vector[1, -1, 0],
135
+ Vector[-1, 0, 0],
136
+ Vector[-1, 1, 0],
137
+ Vector[2, 1, 0]
138
+ ]
139
+ end
140
+
141
+ it 'respects translation' do
142
+ @global_polygon.x = -50
143
+ @global_polygon.y = 10
144
+ @global_polygon.center_x = 0
145
+ @global_polygon.center_y = 0
146
+ @global_polygon.scale_x = 1
147
+ @global_polygon.scale_y = 1
148
+ @global_polygon.rotation = 0
149
+
150
+ vertices = @global_polygon.get_global_vertices
151
+ expect(vertices).to be == [
152
+ Vector[-49, 11, 0],
153
+ Vector[-50, 9, 0],
154
+ Vector[-51, 9, 0],
155
+ Vector[-51, 12, 0]
156
+ ]
157
+ end
158
+
159
+ context 'with a long ancestry' do
160
+ before do
161
+ @global_polygon.x = 0
162
+ @global_polygon.y = 0
163
+ @global_polygon.center_x = 0
164
+ @global_polygon.center_y = 0
165
+ @global_polygon.scale_x = 1
166
+ @global_polygon.scale_y = 1
167
+ @global_polygon.rotation = 0
168
+
169
+ centered_view = Gosling::Actor.new(@window)
170
+ centered_view.center_x = 10
171
+ centered_view.center_y = 2
172
+
173
+ scaled_view = Gosling::Actor.new(@window)
174
+ scaled_view.scale_x = 3
175
+ scaled_view.scale_y = 2
176
+
177
+ rotated_view = Gosling::Actor.new(@window)
178
+ rotated_view.rotation = Math::PI / 2
179
+
180
+ translated_view = Gosling::Actor.new(@window)
181
+ translated_view.x = -50
182
+ translated_view.y = 10
183
+
184
+ centered_view.add_child(scaled_view)
185
+ scaled_view.add_child(rotated_view)
186
+ rotated_view.add_child(translated_view)
187
+ translated_view.add_child(@global_polygon)
188
+
189
+ @ancestry = [
190
+ centered_view,
191
+ scaled_view,
192
+ rotated_view,
193
+ translated_view,
194
+ @global_polygon
195
+ ]
196
+ end
197
+
198
+ it 'respects all ancestors' do
199
+ vertices = @global_polygon.get_global_vertices
200
+ expect(vertices).to be == [
201
+ Vector[(1 + 10) * 3 - 10, (1 - 50) * -2 - 2, 0],
202
+ Vector[(-1 + 10) * 3 - 10, (0 - 50) * -2 - 2, 0],
203
+ Vector[(-1 + 10) * 3 - 10, (-1 - 50) * -2 - 2, 0],
204
+ Vector[(2 + 10) * 3 - 10, (-1 - 50) * -2 - 2, 0]
205
+ ]
206
+ end
207
+
208
+ after do
209
+ @ancestry.each { |actor| actor.parent.remove_child(actor) if actor.parent }
210
+ end
211
+ end
212
+ end
213
+ end
data/spec/rect_spec.rb ADDED
@@ -0,0 +1,87 @@
1
+ describe Gosling::Rect do
2
+ before(:all) do
3
+ @window = Gosu::Window.new(640, 480, false)
4
+ @rect = Gosling::Rect.new(@window)
5
+ end
6
+
7
+ it 'starts with width and height 1' do
8
+ expect(@rect.width).to be == 1
9
+ expect(@rect.height).to be == 1
10
+ end
11
+
12
+ describe '#width' do
13
+ it 'returns our width' do
14
+ expect(@rect.width).to be_kind_of(Numeric)
15
+ end
16
+ end
17
+
18
+ describe '#set_width' do
19
+ it 'alters our width, updating our vertices' do
20
+ rect = Gosling::Rect.new(@window)
21
+ rect.width = 10
22
+ expect(rect.width).to be == 10
23
+ end
24
+
25
+ it 'cannot be less than one' do
26
+ rect = Gosling::Rect.new(@window)
27
+ expect { rect.width = 0 }.to raise_error(ArgumentError)
28
+ expect { rect.width = -100 }.to raise_error(ArgumentError)
29
+ end
30
+
31
+ it 'updates our vertices' do
32
+ expected_vertices = [
33
+ Vector[ 0, 0, 0],
34
+ Vector[11, 0, 0],
35
+ Vector[11, 1, 0],
36
+ Vector[ 0, 1, 0]
37
+ ]
38
+
39
+ rect = Gosling::Rect.new(@window)
40
+ rect.width = 11
41
+ expect(rect.get_vertices).to be == expected_vertices
42
+ end
43
+ end
44
+
45
+ describe '#height' do
46
+ it 'returns our height' do
47
+ expect(@rect.height).to be_kind_of(Numeric)
48
+ end
49
+ end
50
+
51
+ describe '#set_height' do
52
+ it 'alters our height, updating our vertices' do
53
+ rect = Gosling::Rect.new(@window)
54
+ rect.height = 15
55
+ expect(rect.height).to be == 15
56
+ end
57
+
58
+ it 'cannot be less than one' do
59
+ rect = Gosling::Rect.new(@window)
60
+ expect { rect.height = 0 }.to raise_error(ArgumentError)
61
+ expect { rect.height = -200 }.to raise_error(ArgumentError)
62
+ end
63
+
64
+ it 'updates our vertices' do
65
+ expected_vertices = [
66
+ Vector[0, 0, 0],
67
+ Vector[1, 0, 0],
68
+ Vector[1, 40, 0],
69
+ Vector[0, 40, 0]
70
+ ]
71
+
72
+ rect = Gosling::Rect.new(@window)
73
+ rect.height = 40
74
+ expect(rect.get_vertices).to be == expected_vertices
75
+ end
76
+ end
77
+
78
+ it 'does not allow set_vertices to be called directly' do
79
+ vertices = [
80
+ Vector[0, 0, 0],
81
+ Vector[1, 10, 0],
82
+ Vector[2, 20, 0],
83
+ Vector[3, 40, 0]
84
+ ]
85
+ expect { @rect.set_vertices(vertices) }.to raise_error(NoMethodError)
86
+ end
87
+ end
@@ -0,0 +1 @@
1
+ require_relative '../lib/gosling.rb'
@@ -0,0 +1,43 @@
1
+ describe Gosling::Sprite do
2
+ before(:all) do
3
+ @window = Gosu::Window.new(640, 480, false)
4
+ @local_path = File.dirname(__FILE__)
5
+ @image = Gosling::ImageLibrary.get(File.join(@local_path, 'images/key.png'))
6
+
7
+ @sprite = Gosling::Sprite.new(@window)
8
+ end
9
+
10
+ describe '#get_image' do
11
+ it 'returns our image' do
12
+ get_sprite = Gosling::Sprite.new(@window)
13
+ expect(get_sprite.get_image).to be == nil
14
+ get_sprite.set_image(@image)
15
+ expect(get_sprite.get_image).to be_instance_of(Gosu::Image)
16
+ end
17
+ end
18
+
19
+ describe '#set_image' do
20
+ before(:each) do
21
+ @image_sprite = Gosling::Sprite.new(@window)
22
+ @image_sprite.set_image(@image)
23
+ end
24
+
25
+ it 'complains if given something other than an image' do
26
+ expect { Gosling::Sprite.new(@window).set_image(:foo) }.to raise_error(ArgumentError)
27
+ end
28
+
29
+ it 'sets our image' do
30
+ expect(@image_sprite.get_image).to be == @image
31
+ end
32
+
33
+ it 'automatically updates our width and height' do
34
+ expect(@image_sprite.width).to be == @image.width
35
+ expect(@image_sprite.height).to be == @image.height
36
+ end
37
+ end
38
+
39
+ it 'does not allow set_width or set_height to be called directly' do
40
+ expect { @sprite.set_width(10) }.to raise_error(NoMethodError)
41
+ expect { @sprite.set_height(20) }.to raise_error(NoMethodError)
42
+ end
43
+ end
@@ -0,0 +1,328 @@
1
+ describe Gosling::Transform do
2
+ before(:all) do
3
+ @read_only_tf = Gosling::Transform.new
4
+ end
5
+
6
+ it 'has a center' do
7
+ expect(@read_only_tf.center).to be_instance_of(Vector)
8
+ end
9
+
10
+ it 'has a scale' do
11
+ expect(@read_only_tf.scale).to be_instance_of(Vector)
12
+ end
13
+
14
+ it 'has a rotation' do
15
+ expect(@read_only_tf.rotation).to be_instance_of(Fixnum)
16
+ end
17
+
18
+ it 'has a translation' do
19
+ expect(@read_only_tf.translation).to be_instance_of(Vector)
20
+ end
21
+
22
+ describe '#set_center' do
23
+ it 'accepts a size 3 vector' do
24
+ tf = Gosling::Transform.new
25
+ expect { tf.set_center(Vector[0,0,0]) }.not_to raise_error
26
+ expect { tf.set_center(Vector[0,0,0,0]) }.to raise_error(ArgumentError)
27
+ expect { tf.set_center(Vector[0,0]) }.to raise_error(ArgumentError)
28
+ expect { tf.set_center(:foo) }.to raise_error(ArgumentError)
29
+ end
30
+
31
+ it 'sets the center transform' do
32
+ v = Vector[10.to_r, 20.to_r, 0.to_r]
33
+ tf = Gosling::Transform.new
34
+ tf.set_center(v)
35
+ expect(tf.center).to be == v
36
+ end
37
+
38
+ it 'does not alter the z value, which should always be 0' do
39
+ tf = Gosling::Transform.new
40
+ [
41
+ Vector[1, 1, 1],
42
+ Vector[1, 1, 13],
43
+ Vector[1, 1, 7],
44
+ Vector[1, 1, 29373],
45
+ Vector[1, 1, -1],
46
+ Vector[1, 1, 0],
47
+ Vector[1, 1, -328.7],
48
+ ].each do |v|
49
+ tf.set_center(v)
50
+ expect(tf.center[2]).to be == 0
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#set_scale' do
56
+ it 'accepts a size 2 vector' do
57
+ tf = Gosling::Transform.new
58
+ expect { tf.set_scale(Vector[1,1]) }.not_to raise_error
59
+ expect { tf.set_scale(Vector[1,1,1]) }.to raise_error(ArgumentError)
60
+ expect { tf.set_scale(Vector[1]) }.to raise_error(ArgumentError)
61
+ expect { tf.set_scale(:foo) }.to raise_error(ArgumentError)
62
+ end
63
+
64
+ it 'sets the scale transform' do
65
+ v = Vector[2.to_r, 0.5.to_r]
66
+ tf = Gosling::Transform.new
67
+ tf.set_scale(v)
68
+ expect(tf.scale).to be == v
69
+ end
70
+ end
71
+
72
+ describe '#set_rotation' do
73
+ it 'sets the rotation transform' do
74
+ r = Math::PI / 2
75
+ tf = Gosling::Transform.new
76
+ tf.set_rotation(r)
77
+ expect(tf.rotation).to be == r
78
+ end
79
+ end
80
+
81
+ describe '#set_translation' do
82
+ it 'accepts a size 3 vector' do
83
+ tf = Gosling::Transform.new
84
+ expect { tf.set_translation(Vector[0,0,0]) }.not_to raise_error
85
+ expect { tf.set_translation(Vector[0,0,0,0]) }.to raise_error(ArgumentError)
86
+ expect { tf.set_translation(Vector[0,0]) }.to raise_error(ArgumentError)
87
+ expect { tf.set_translation(:foo) }.to raise_error(ArgumentError)
88
+ end
89
+
90
+ it 'sets the translation transform' do
91
+ v = Vector[1024.to_r, 768.to_r, 0.to_r]
92
+ tf = Gosling::Transform.new
93
+ tf.set_translation(v)
94
+ expect(tf.translation).to be == v
95
+ end
96
+
97
+ it 'does not alter the z value, which should always be 0' do
98
+ tf = Gosling::Transform.new
99
+ [
100
+ Vector[1, 1, 1],
101
+ Vector[1, 1, 13],
102
+ Vector[1, 1, 7],
103
+ Vector[1, 1, 29373],
104
+ Vector[1, 1, -1],
105
+ Vector[1, 1, 0],
106
+ Vector[1, 1, -328.7],
107
+ ].each do |v|
108
+ tf.set_translation(v)
109
+ expect(tf.translation[2]).to be == 0
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '#to_matrix' do
115
+ it 'returns a matrix' do
116
+ expect(@read_only_tf.to_matrix).to be_instance_of(Matrix)
117
+ end
118
+ end
119
+
120
+ it 'centers correctly' do
121
+ tf = Gosling::Transform.new
122
+ tf.set_center(Vector[10.to_r, 20.to_r, 0.to_r])
123
+ expected_matrix = Matrix[
124
+ [1, 0, -10],
125
+ [0, 1, -20],
126
+ [0, 0, 1]
127
+ ]
128
+ expect(tf.to_matrix).to be == expected_matrix
129
+ end
130
+
131
+ it 'scales correctly' do
132
+ tf = Gosling::Transform.new
133
+ tf.set_scale(Vector[2.to_r, 0.5.to_r])
134
+ expected_matrix = Matrix[
135
+ [2, 0, 0],
136
+ [0, 0.5, 0],
137
+ [0, 0, 1]
138
+ ]
139
+ expect(tf.to_matrix).to be == expected_matrix
140
+ end
141
+
142
+ it 'rotates correctly' do
143
+ tf = Gosling::Transform.new
144
+ tf.set_rotation(Math::PI / 2)
145
+ expected_matrix = Matrix[
146
+ [ 0, 1, 0],
147
+ [-1, 0, 0],
148
+ [ 0, 0, 1]
149
+ ]
150
+ expect(tf.to_matrix).to be == expected_matrix
151
+ end
152
+
153
+ it 'translates correctly' do
154
+ tf = Gosling::Transform.new
155
+ tf.set_translation(Vector[1024.to_r, 768.to_r, 0.to_r])
156
+ expected_matrix = Matrix[
157
+ [1, 0, 1024],
158
+ [0, 1, 768],
159
+ [0, 0, 1]
160
+ ]
161
+ expect(tf.to_matrix).to be == expected_matrix
162
+ end
163
+
164
+ it 'applies all transforms in the correct order' do
165
+ tf = Gosling::Transform.new
166
+ tf.set_center(Vector[10.to_r, 20.to_r, 0.to_r])
167
+ tf.set_scale(Vector[2.to_r, 0.5.to_r])
168
+ tf.set_rotation(Math::PI / 2)
169
+ tf.set_translation(Vector[1024.to_r, 768.to_r, 0.to_r])
170
+
171
+ expected_matrix = Matrix[
172
+ [0.0, 0.5, 1014.0],
173
+ [-2.0, 0.0, 788.0],
174
+ [0.0, 0.0, 1.0]
175
+ ]
176
+ expect(tf.to_matrix).to be == expected_matrix
177
+
178
+ v = Vector[0.to_r, -50.to_r, 1.to_r]
179
+ v_transformed = Vector[989.to_r, 788.to_r, 1.to_r]
180
+ expect(tf.to_matrix * v).to be == v_transformed
181
+
182
+ v = Vector[100.to_r, -50.to_r, 1.to_r]
183
+ v_transformed = Vector[989.to_r, 588.to_r, 1.to_r]
184
+ expect(tf.to_matrix * v).to be == v_transformed
185
+
186
+ v = Vector[100.to_r, 50.to_r, 1.to_r]
187
+ v_transformed = Vector[1039.to_r, 588.to_r, 1.to_r]
188
+ expect(tf.to_matrix * v).to be == v_transformed
189
+
190
+ v = Vector[0.to_r, 50.to_r, 1.to_r]
191
+ v_transformed = Vector[1039.to_r, 788.to_r, 1.to_r]
192
+ expect(tf.to_matrix * v).to be == v_transformed
193
+ end
194
+
195
+ describe '#transform_point' do
196
+ it 'expects a length 3 vector' do
197
+ expect { @read_only_tf.transform_point(Vector[1, 0, 1]) }.not_to raise_error
198
+ expect { @read_only_tf.transform_point(Vector[1, 0, 1, 1]) }.to raise_error(ArgumentError)
199
+ expect { @read_only_tf.transform_point(Vector[1, 0]) }.to raise_error(ArgumentError)
200
+ expect { @read_only_tf.transform_point(:foo) }.to raise_error(ArgumentError)
201
+ expect { @read_only_tf.transform_point(nil) }.to raise_error(ArgumentError)
202
+ end
203
+
204
+ it 'returns a length 3 vector' do
205
+ result = @read_only_tf.transform_point(Vector[1, 0, 1])
206
+ expect(result).to be_instance_of(Vector)
207
+ expect(result.size).to be == 3
208
+ end
209
+
210
+ it 'always returns a z value of 0' do
211
+ [
212
+ Vector[1, 1, 1],
213
+ Vector[-1, -1, -1],
214
+ Vector[-22, -22, 0],
215
+ Vector[-11, 13, 34],
216
+ Vector[37, -4, -15],
217
+ Vector[34, 39, -16],
218
+ Vector[-48, 23, -32],
219
+ Vector[24, -39, 42],
220
+ Vector[49, 44, -15],
221
+ Vector[27, 23, 42],
222
+ Vector[33, -25, -20],
223
+ Vector[-46, -18, 48],
224
+ ].each do |v|
225
+ expect(@read_only_tf.transform_point(v)[2]).to be == 0
226
+ end
227
+ end
228
+
229
+ it 'transforms the point correctly' do
230
+ tf = Gosling::Transform.new
231
+ tf.set_center(Vector[5.to_r, 20.to_r, 0.to_r])
232
+ tf.set_scale(Vector[2.to_r, 0.5.to_r])
233
+ tf.set_rotation(Math::PI / 2)
234
+ tf.set_translation(Vector[1024.to_r, 768.to_r, 0.to_r])
235
+
236
+ [
237
+ [0, 0],
238
+ [10, -20],
239
+ [-1024, -768],
240
+ [-5, 999],
241
+ [5, 20]
242
+ ].each do |pt|
243
+ x, y = pt
244
+ expect(tf.transform_point(Vector[x, y, 0])).to be == Vector[(y - 20) * 0.5 + 1024, (x - 5) * -2 + 768, 0]
245
+ end
246
+ end
247
+ end
248
+
249
+ describe '#untransform_point' do
250
+ it 'expects a length 3 vector' do
251
+ expect { @read_only_tf.untransform_point(Vector[1, 0, 1]) }.not_to raise_error
252
+ expect { @read_only_tf.untransform_point(Vector[1, 0, 1, 1]) }.to raise_error(ArgumentError)
253
+ expect { @read_only_tf.untransform_point(Vector[1, 0]) }.to raise_error(ArgumentError)
254
+ expect { @read_only_tf.untransform_point(:foo) }.to raise_error(ArgumentError)
255
+ expect { @read_only_tf.untransform_point(nil) }.to raise_error(ArgumentError)
256
+ end
257
+
258
+ it 'returns a length 3 vector' do
259
+ result = @read_only_tf.untransform_point(Vector[1, 0, 1])
260
+ expect(result).to be_instance_of(Vector)
261
+ expect(result.size).to be == 3
262
+ end
263
+
264
+ it 'always returns a z value of 0' do
265
+ [
266
+ Vector[1, 1, 1],
267
+ Vector[-1, -1, -1],
268
+ Vector[-22, -22, 0],
269
+ Vector[-11, 13, 34],
270
+ Vector[37, -4, -15],
271
+ Vector[34, 39, -16],
272
+ Vector[-48, 23, -32],
273
+ Vector[24, -39, 42],
274
+ Vector[49, 44, -15],
275
+ Vector[27, 23, 42],
276
+ Vector[33, -25, -20],
277
+ Vector[-46, -18, 48],
278
+ ].each do |v|
279
+ expect(@read_only_tf.untransform_point(v)[2]).to be == 0
280
+ end
281
+ end
282
+
283
+ it 'untransforms the point correctly' do
284
+ tf = Gosling::Transform.new
285
+ tf.set_center(Vector[5.to_r, 20.to_r, 0.to_r])
286
+ tf.set_scale(Vector[2.to_r, 0.5.to_r])
287
+ tf.set_rotation(Math::PI / 2)
288
+ tf.set_translation(Vector[1024.to_r, 768.to_r, 0.to_r])
289
+
290
+ [
291
+ [1014, 778],
292
+ [1004, 758],
293
+ [630, 2826],
294
+ [788, 3027],
295
+ [768, 1024]
296
+ ].each do |pt|
297
+ x, y = pt
298
+ expect(tf.untransform_point(Vector[x, y, 0])).to be == Vector[(y - 768) * -0.5 + 5, (x - 1024) * 2 + 20, 0]
299
+ end
300
+ end
301
+
302
+ it 'undoes the results of transform_point' do
303
+ tf = Gosling::Transform.new
304
+ tf.set_center(Vector[5.to_r, 20.to_r, 0.to_r])
305
+ tf.set_scale(Vector[2.to_r, 0.5.to_r])
306
+ tf.set_rotation(Math::PI / 2)
307
+ tf.set_translation(Vector[1024.to_r, 768.to_r, 0.to_r])
308
+
309
+ [
310
+ Vector[1, 1, 0],
311
+ Vector[-1, -1, 0],
312
+ Vector[-22, -22, 0],
313
+ Vector[-11, 13, 0],
314
+ Vector[37, -4, 0],
315
+ Vector[34, 39, 0],
316
+ Vector[-48, 23, 0],
317
+ Vector[24, -39, 0],
318
+ Vector[49, 44, 0],
319
+ Vector[27, 23, 0],
320
+ Vector[33, -25, 0],
321
+ Vector[-46, -18, 0],
322
+ ].each do |v|
323
+ expect(tf.untransform_point(tf.transform_point(v))).to be == v
324
+ expect(tf.transform_point(tf.untransform_point(v))).to be == v
325
+ end
326
+ end
327
+ end
328
+ end