disp3D 0.2.1 → 1.0.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.
Files changed (56) hide show
  1. data/Gemfile +1 -1
  2. data/README.md +56 -0
  3. data/VERSION +1 -1
  4. data/disp3D.gemspec +24 -20
  5. data/example/stl_viewer/document_ctrl.rb +2 -2
  6. data/example/stl_viewer/qt_widget_controller.rb +3 -7
  7. data/example/tutorial/03_CameraScene.rb +5 -5
  8. data/example/tutorial/04_Qt.rb +4 -4
  9. data/example/tutorial/05_Pick.rb +13 -13
  10. data/example/tutorial/06_FileParser.rb +3 -3
  11. data/example/tutorial/07_SceneGraph.rb +16 -4
  12. data/example/tutorial/08_SceneGraph2.rb +16 -15
  13. data/example/tutorial/09_Texture.rb +28 -0
  14. data/example/tutorial/10_Animation.rb +27 -0
  15. data/example/tutorial/10_AnimationQt.rb +53 -0
  16. data/example/tutorial/11_MultiView.rb +41 -0
  17. data/example/tutorial/12_Light.rb +65 -0
  18. data/example/tutorial/13_RectPick.rb +38 -0
  19. data/example/tutorial/14_LineRubberband.rb +43 -0
  20. data/example/{test → tutorial}/data/test.png +0 -0
  21. data/example/{test → tutorial}/data/test2.jpg +0 -0
  22. data/lib/camera.rb +8 -0
  23. data/lib/compass.rb +21 -14
  24. data/lib/disp3D.rb +3 -0
  25. data/lib/gl_view.rb +70 -40
  26. data/lib/glut_window.rb +24 -18
  27. data/lib/light.rb +35 -21
  28. data/lib/manipulator.rb +0 -7
  29. data/lib/node/node.rb +100 -105
  30. data/lib/node/node_arrows.rb +1 -1
  31. data/lib/node/node_collection.rb +63 -17
  32. data/lib/node/node_cone.rb +49 -0
  33. data/lib/node/node_coord.rb +26 -11
  34. data/lib/node/node_leaf.rb +17 -11
  35. data/lib/node/node_lines.rb +1 -1
  36. data/lib/node/node_points.rb +2 -1
  37. data/lib/node/node_polylines.rb +1 -1
  38. data/lib/node/node_rectangle.rb +9 -4
  39. data/lib/node/node_sphere.rb +28 -0
  40. data/lib/node/node_tea_pod.rb +4 -4
  41. data/lib/node/node_text.rb +2 -2
  42. data/lib/node/node_tris.rb +1 -1
  43. data/lib/node/node_workplane.rb +33 -1
  44. data/lib/picker.rb +157 -3
  45. data/lib/qt_widget_gl.rb +24 -11
  46. data/lib/scene_graph.rb +3 -3
  47. data/test/node/test_node.rb +230 -0
  48. data/test/node/test_node_collection.rb +99 -79
  49. data/test/test_picker.rb +6 -6
  50. metadata +28 -24
  51. data/README.rdoc +0 -63
  52. data/example/test/capture_test.rb +0 -16
  53. data/example/test/dsl_test.rb +0 -46
  54. data/example/test/texture_test.rb +0 -39
  55. data/test/data/binary_test.stl +0 -0
  56. data/test/data/bunny-flatfoot.stl +0 -0
data/lib/qt_widget_gl.rb CHANGED
@@ -1,13 +1,20 @@
1
+ require 'forwardable'
1
2
  require 'Qt'
2
3
  require 'disp3D'
3
4
 
4
5
  include Disp3D
5
6
  class QtWidgetGL < Qt::GLWidget
7
+ extend Forwardable
8
+
6
9
  attr_accessor :width
7
10
  attr_accessor :height
8
11
 
9
12
  attr_reader :load_proc
10
13
 
14
+ def_delegators :@view, :camera, :world_scene_graph, :camera_scene_graph
15
+ def_delegators :@view, :manipulator, :light, :picker
16
+ def_delegators :@view, :sync_to, :capture, :fit, :centering
17
+
11
18
  def initialize(parent, width = 400, height = 400)
12
19
  super(parent)
13
20
  @width = width
@@ -21,10 +28,6 @@ class QtWidgetGL < Qt::GLWidget
21
28
  super
22
29
  end
23
30
 
24
- def gl_view
25
- @view
26
- end
27
-
28
31
  def set_load_proc(proc)
29
32
  @load_proc = proc
30
33
  end
@@ -49,18 +52,17 @@ class QtWidgetGL < Qt::GLWidget
49
52
  end
50
53
 
51
54
  def mouseReleaseEvent(event)
52
- @view.mouse_release_proc.call(self, get_GLUT_button(event), event.pos.x, event.pos.y) if( @view.mouse_release_proc != nil)
53
- @view.manipulator.mouse(get_GLUT_button(event), GLUT::GLUT_UP, event.pos.x,event.pos.y)
55
+ glut_button = get_GLUT_button(event)
56
+ @view.mouse_release_process(glut_button, event.pos.x, event.pos.y)
54
57
  end
55
58
 
56
59
  def mousePressEvent(event)
57
- @view.mouse_press_proc.call(self, get_GLUT_button(event), event.pos.x, event.pos.y) if( @view.mouse_press_proc != nil)
58
- @view.manipulator.mouse(get_GLUT_button(event), GLUT::GLUT_DOWN, event.pos.x,event.pos.y)
60
+ glut_button = get_GLUT_button(event)
61
+ @view.mouse_press_process(glut_button, event.pos.x, event.pos.y)
59
62
  end
60
63
 
61
64
  def mouseMoveEvent(event)
62
- @view.mouse_move_proc.call(self, x,y) if( @view.mouse_move_proc != nil)
63
- need_update = @view.manipulator.motion(event.pos.x,event.pos.y)
65
+ need_update = @view.mouse_move_process(event.pos.x,event.pos.y)
64
66
  if(need_update)
65
67
  updateGL()
66
68
  end
@@ -71,7 +73,18 @@ class QtWidgetGL < Qt::GLWidget
71
73
  end
72
74
 
73
75
  def resizeGL(width, height)
74
- @view.camera.reshape(width, height)
76
+ @view.reshape(width, height)
77
+ end
78
+
79
+ def idle_process(wait_msec = nil, &block)
80
+ @idle_proc = block
81
+ @idle_process_timer_id = startTimer(wait_msec)
82
+ end
83
+
84
+ def timerEvent(event)
85
+ if( event.timerId == @idle_process_timer_id)
86
+ @idle_proc.call
87
+ end
75
88
  end
76
89
  end
77
90
 
data/lib/scene_graph.rb CHANGED
@@ -8,9 +8,9 @@ module Disp3D
8
8
  @root_node = NodeCollection.new()
9
9
  end
10
10
 
11
- def gl_display()
12
- Node.init_path_db
13
- @root_node.draw()
11
+ def gl_display(current_view)
12
+ NodePathDB.init
13
+ @root_node.draw(current_view)
14
14
  end
15
15
 
16
16
  def add(node)
@@ -17,6 +17,236 @@ class NodeTestCase < MiniTest::Unit::TestCase
17
17
  assert_equal(nil, node.post_translate)
18
18
 
19
19
  assert_equal([], node.parents)
20
+
21
+ assert_equal(nil, node.name)
22
+ assert(node.instance_id.kind_of?(Integer))
23
+
24
+ node_with_name = Disp3D::Node.new(:node00)
25
+ assert_equal(:node00, node_with_name.name)
26
+ end
27
+
28
+ def test_ancestor
29
+ node_group = Disp3D::NodeCollection.new()
30
+ node_group.open do
31
+ add_new :type => :Points, :geom => Vector3.new(), :name => :node01
32
+ add_new :type => :TeaPod, :name => :node02
33
+ add_new :type => :Text, :geom => Vector3.new(), :name => :node03
34
+ add_new :name => :node04 do
35
+ add_new :type => :Coord, :name => :node05
36
+ add_new :name => :node06 do
37
+ add_new :type => :Points, :geom => Vector3.new(), :name => :node07
38
+ add :node01
39
+ end
40
+ end
41
+
42
+ add_new :name => :node08 do
43
+ add :node02
44
+ add :node07
45
+ end
46
+ end
47
+
48
+ root_id = node_group.instance_id
49
+ node04_id = Disp3D::NodeDB.find_by_name(:node04).instance_id
50
+ node06_id = Disp3D::NodeDB.find_by_name(:node06).instance_id
51
+ node08_id = Disp3D::NodeDB.find_by_name(:node08).instance_id
52
+
53
+ assert_equal([root_id, node04_id, node06_id].sort , Disp3D::NodeDB.find_by_name(:node01).ancestors.sort)
54
+ assert_equal([root_id, node08_id].sort , Disp3D::NodeDB.find_by_name(:node02).ancestors.sort)
55
+ assert_equal([root_id].sort , Disp3D::NodeDB.find_by_name(:node03).ancestors.sort)
56
+ assert_equal([root_id, node04_id].sort , Disp3D::NodeDB.find_by_name(:node05).ancestors.sort)
57
+ assert_equal([root_id, node04_id, node06_id, node08_id].sort, Disp3D::NodeDB.find_by_name(:node07).ancestors.sort)
58
+ end
59
+
60
+ def test_create_and_update
61
+ node_group = Disp3D::NodeCollection.new()
62
+ # create test
63
+ node_group.open do
64
+ create :type => :TeaPod,
65
+ :size => 0.5,
66
+ :name => :node10
67
+
68
+ create :type => :Points,
69
+ :geom => Vector3.new(),
70
+ :size => 10.0,
71
+ :name => :node11,
72
+ :pre_translate => Vector3.new(1,0,1),
73
+ :post_translate => Vector3.new(1,0,1),
74
+ :rotate => Quat.from_axis(Vector3.new(1,0,0), Math::PI)
75
+
76
+ create :type => :Text,
77
+ :geom => Vector3.new(),
78
+ :name => :node12,
79
+ :text => "this is node12"
80
+
81
+ create :type => :Collection,
82
+ :name => :node13,
83
+ :pre_translate => Vector3.new(1,0,1),
84
+ :post_translate => Vector3.new(1,0,1),
85
+ :rotate => Quat.from_axis(Vector3.new(1,0,0), Math::PI)
86
+
87
+ create :type => :Points,
88
+ :geom => Vector3.new,
89
+ :name => :node14,
90
+ :colors => [1,1,0,1]
91
+
92
+ create :type => :Lines,
93
+ :geom => FiniteLine.new,
94
+ :name => :node14,
95
+ :colors => [1,1,0,1]
96
+ end
97
+
98
+ node10 = Disp3D::NodeDB.find_by_name(:node10)
99
+ assert_equal( Disp3D::NodeTeaPod, node10.class)
100
+ assert_equal( 0.5, node10.size)
101
+
102
+ node11 = Disp3D::NodeDB.find_by_name(:node11)
103
+ assert_equal( Disp3D::NodePoints, node11.class)
104
+ # assert_equal( Vector3.new, node11.geom)
105
+ assert_equal( 10.0, node11.size)
106
+ assert_equal( Vector3.new(1,0,1), node11.pre_translate)
107
+ assert_equal( Vector3.new(1,0,1), node11.post_translate)
108
+ assert_equal( Quat.from_axis(Vector3.new(1,0,0), Math::PI), node11.rotate)
109
+
110
+ node12 = Disp3D::NodeDB.find_by_name(:node12)
111
+ assert_equal( Disp3D::NodeText, node12.class)
112
+ assert_equal( "this is node12", node12.text )
113
+
114
+ node13 = Disp3D::NodeDB.find_by_name(:node13)
115
+ assert_equal( Disp3D::NodeCollection, node13.class)
116
+ assert_equal( Vector3.new(1,0,1), node13.pre_translate)
117
+ assert_equal( Vector3.new(1,0,1), node13.post_translate)
118
+ assert_equal( Quat.from_axis(Vector3.new(1,0,0), Math::PI), node13.rotate)
119
+
120
+ node14 = Disp3D::NodeDB.find_by_name(:node14)
121
+ assert_equal( Array, node14.class)
122
+ node14.each do |node|
123
+ assert_equal( :node14, node.name)
124
+ assert_equal( [1,1,0,1], node.colors)
125
+ assert( [Disp3D::NodePoints, Disp3D::NodeLines].include?(node.class) )
126
+ end
127
+
128
+ # update test
129
+ node_group.open do
130
+ update :name => :node10,
131
+ :size => 2.0
132
+
133
+ update :name => :node11,
134
+ :size => 4.0,
135
+ :geom => Vector3.new(3,2,1),
136
+ :pre_translate => Vector3.new(1,2,3),
137
+ :post_translate => Vector3.new(1,2,3),
138
+ :rotate => Quat.from_axis(Vector3.new(0,1,0), Math::PI/2.0)
139
+
140
+ update :name => :node12,
141
+ :geom => Vector3.new(),
142
+ :text => "this is node12 updated"
143
+
144
+ update :name => :node13,
145
+ :pre_translate => Vector3.new(3,2,1),
146
+ :post_translate => Vector3.new(3,2,-1),
147
+ :rotate => Quat.from_axis(Vector3.new(0,0,1), Math::PI)
148
+
149
+ update :name => :node14,
150
+ :colors => [0,1,1,1]
151
+ end
152
+
153
+ node10 = Disp3D::NodeDB.find_by_name(:node10)
154
+ assert_equal( Disp3D::NodeTeaPod, node10.class)
155
+ assert_equal( 2.0, node10.size)
156
+
157
+ node11 = Disp3D::NodeDB.find_by_name(:node11)
158
+ assert_equal( Disp3D::NodePoints, node11.class)
159
+ assert_equal( 4.0, node11.size)
160
+ assert_equal( Vector3.new(1,2,3), node11.pre_translate)
161
+ assert_equal( Vector3.new(1,2,3), node11.post_translate)
162
+ assert_equal( Quat.from_axis(Vector3.new(0,1,0), Math::PI/2.0), node11.rotate)
163
+
164
+ node12 = Disp3D::NodeDB.find_by_name(:node12)
165
+ assert_equal( Disp3D::NodeText, node12.class)
166
+ assert_equal( "this is node12 updated", node12.text )
167
+
168
+ node13 = Disp3D::NodeDB.find_by_name(:node13)
169
+ assert_equal( Disp3D::NodeCollection, node13.class)
170
+ assert_equal( Vector3.new(3,2,1), node13.pre_translate)
171
+ assert_equal( Vector3.new(3,2,-1), node13.post_translate)
172
+ assert_equal( Quat.from_axis(Vector3.new(0,0,1), Math::PI), node13.rotate)
173
+
174
+ node14 = Disp3D::NodeDB.find_by_name(:node14)
175
+ assert_equal( Array, node14.class)
176
+ node14.each do |node|
177
+ assert_equal( :node14, node.name)
178
+ assert_equal( [0,1,1,1], node.colors)
179
+ assert( [Disp3D::NodePoints, Disp3D::NodeLines].include?(node.class) )
180
+ end
20
181
  end
21
182
 
183
+ def test_box_trans_form
184
+ node = Disp3D::Node.new
185
+ box = Box.new
186
+ box_org = box.clone
187
+
188
+ node_group = Disp3D::NodeCollection.new
189
+ node_group.pre_translate = Vector3.new(1,1,1)
190
+ node_group.open do
191
+ box = box_transform(box_org)
192
+ end
193
+ assert_equal(box_org.translate(Vector3.new(1,1,1)), box)
194
+
195
+ rotate_quat = Quat.from_axis( Vector3.new(1,0,0), 45.0/180.0*Math::PI )
196
+ node_group.rotate = rotate_quat
197
+ node_group.open do
198
+ box = box_transform(box_org)
199
+ end
200
+ assert_equal(box_org.translate(Vector3.new(1,1,1)).rotate(rotate_quat), box)
201
+
202
+ node_group.post_translate = Vector3.new(-1,-1,-1)
203
+ node_group.open do
204
+ box = box_transform(box_org)
205
+ end
206
+ assert_equal(box_org.translate(Vector3.new(1,1,1)).rotate(rotate_quat).translate(Vector3.new(-1,-1,-1)), box)
207
+ end
208
+
209
+ def test_delete
210
+ node_group = Disp3D::NodeCollection.new()
211
+ node_group.open do
212
+ create :type => :TeaPod,
213
+ :name => :node20
214
+
215
+ create :type => :Points,
216
+ :geom => Vector3.new(),
217
+ :name => :node21
218
+
219
+ create :type => :Text,
220
+ :geom => Vector3.new(),
221
+ :name => :node22
222
+
223
+ create :type => :Collection,
224
+ :name => :node23
225
+
226
+ create :type => :Coord,
227
+ :name => :node23 # same name
228
+
229
+ add :node20
230
+ add :node21
231
+ add :node23
232
+ end
233
+ assert_equal( 4, node_group.child_nodes.size)
234
+ assert_equal( Disp3D::NodeTeaPod, Disp3D::NodeDB.find_by_name(:node20).class)
235
+ node_ary = Disp3D::NodeDB.find_by_name(:node23)
236
+ assert_equal( Array, node_ary.class)
237
+ assert( node_ary.find { |node| node.class == Disp3D::NodeCollection })
238
+ assert( node_ary.find { |node| node.class == Disp3D::NodeCoord })
239
+
240
+ node_group.open do
241
+ delete :node20
242
+ end
243
+ assert_equal( 3, node_group.child_nodes.size)
244
+ assert_equal( nil, Disp3D::NodeDB.find_by_name(:node20))
245
+
246
+ node_group.open do
247
+ delete :node23
248
+ end
249
+ assert_equal( 1, node_group.child_nodes.size)
250
+ assert_equal( nil, Disp3D::NodeDB.find_by_name(:node23))
251
+ end
22
252
  end
@@ -11,100 +11,120 @@ class NodeCollectionTestCase < MiniTest::Unit::TestCase
11
11
  @gl_view = Disp3D::GLUTWindow.new(300, 300)
12
12
  end
13
13
 
14
- def test_add_include
15
- node_collection = Disp3D::NodeCollection.new()
16
- node_point = Disp3D::NodePoints.new(Vector3.new())
17
- added_id = node_collection.add(node_point)
14
+ def test_add
15
+ node_group = Disp3D::NodeCollection.new()
16
+
18
17
  node_ary = Array.new()
19
- node_ary[0] = Disp3D::NodeTeaPod.new(4)
18
+ node_ary[0] = Disp3D::NodeTeaPod.new()
20
19
  node_ary[1] = Disp3D::NodeLines.new(FiniteLine.new(Vector3.new(0,0,0),Vector3.new(1,1,1)))
21
- added_id_ary = node_collection.add(node_ary)
22
20
 
23
- assert(node_collection.include?(added_id))
24
- assert_equal(node_point, node_collection.child(added_id))
25
- assert_equal(2, added_id_ary.size)
26
- added_id_ary.each do |item|
27
- assert(node_collection.include?(item))
21
+ path_id = -1
22
+ path_id_ary = -1
23
+ node_group.open do
24
+ create :type => :Points,
25
+ :geom => Vector3.new(),
26
+ :name => :node100
27
+
28
+ path_id = add :node100
29
+ path_id_ary = add node_ary
28
30
  end
29
- assert_equal(node_ary[0], node_collection.child(added_id_ary[0]))
30
- assert_equal(node_ary[1], node_collection.child(added_id_ary[1]))
31
- assert_equal(nil, node_collection.child(-1))
32
- end
33
31
 
34
- def test_ancestor
35
- node_root = Disp3D::NodeCollection.new()
36
- node_child = Disp3D::NodeCollection.new()
37
- node_g_child = Disp3D::NodeCollection.new()
38
- node_root.add(node_child)
39
- node_child.add(node_g_child)
40
- ancestors = node_child.ancestors
41
- assert_equal(1,ancestors.size)
42
- assert(ancestors.include?(node_root.instance_id))
43
-
44
- ancestors = node_g_child.ancestors
45
- assert_equal(2,ancestors.size)
46
- assert(ancestors.include?(node_root.instance_id))
47
- assert(ancestors.include?(node_child.instance_id))
48
-
49
- node_root.add(node_g_child)
50
- ancestors = node_g_child.ancestors
51
- assert_equal(2,ancestors.size)
52
- assert(ancestors.include?(node_root.instance_id))
53
- assert(ancestors.include?(node_child.instance_id))
54
-
55
- node_root.add(node_child)
56
- ancestors = node_g_child.ancestors
57
- assert_equal(2,ancestors.size)
58
- assert(ancestors.include?(node_root.instance_id))
59
- assert(ancestors.include?(node_child.instance_id))
60
-
61
- node_g_child2 = Disp3D::NodeCollection.new()
62
- node_child.add(node_g_child2)
63
- ancestors = node_g_child2.ancestors
64
- assert_equal(2,ancestors.size)
65
- assert(ancestors.include?(node_root.instance_id))
66
- assert(ancestors.include?(node_child.instance_id))
67
-
68
- node_gg_child = Disp3D::NodeCollection.new()
69
- node_g_child.add(node_gg_child)
70
- ancestors = node_gg_child.ancestors
71
- assert_equal(3,ancestors.size)
72
- assert(ancestors.include?(node_root.instance_id))
73
- assert(ancestors.include?(node_child.instance_id))
74
- assert(ancestors.include?(node_g_child.instance_id))
75
-
76
- node_g_child2.add(node_gg_child)
77
- ancestors = node_gg_child.ancestors
78
- assert_equal(4,ancestors.size)
79
- assert(ancestors.include?(node_root.instance_id))
80
- assert(ancestors.include?(node_child.instance_id))
81
- assert(ancestors.include?(node_g_child.instance_id))
82
- assert(ancestors.include?(node_g_child2.instance_id))
32
+ assert(node_group.include?(path_id))
33
+ assert_equal(Disp3D::NodeDB.find_by_name(:node100), node_group.child(path_id))
34
+ assert_equal(2, path_id_ary.size)
35
+ path_id_ary.each do |item|
36
+ assert(node_group.include?(item))
37
+ end
38
+ assert_equal(node_ary[0], node_group.child(path_id_ary[0]))
39
+ assert_equal(node_ary[1], node_group.child(path_id_ary[1]))
40
+ assert_equal(nil, node_group.child(-1))
83
41
  end
84
42
 
85
- def test_circular_reference
86
- node_collection1 = Disp3D::NodeCollection.new()
87
- node_collection2 = Disp3D::NodeCollection.new()
88
- node_collection3 = Disp3D::NodeCollection.new()
89
- node_collection1.add(node_collection2)
90
- node_collection2.add(node_collection3)
91
43
 
92
- # circular reference occures!
44
+ def test_circular_reference
93
45
  assert_raises Disp3D::CircularReferenceException do
94
- node_collection3.add(node_collection1)
46
+ Disp3D::NodeCollection.new().open do
47
+ add_new :name => :node101 do
48
+ add_new :name => :node102 do
49
+ add :node101
50
+ end
51
+ end
52
+ end
95
53
  end
96
- # @gl_view.world_scene_graph.add(node_collection1)
97
- # @gl_view.gl_display()
98
54
  end
99
55
 
100
56
  def test_self_reference
101
- node_collection1 = Disp3D::NodeCollection.new()
102
57
  assert_raises Disp3D::CircularReferenceException do
103
- node_collection1.add(node_collection1)
58
+ Disp3D::NodeCollection.new().open do
59
+ add_new :name => :node111 do
60
+ add :node111
61
+ end
62
+ end
104
63
  end
105
64
  end
106
65
 
107
- def test_box_boundary
66
+ def test_add_new
67
+ # test add_new
68
+ node_group = Disp3D::NodeCollection.new()
69
+ node_group.open do
70
+ add_new :type => :TeaPod,
71
+ :size => 0.5,
72
+ :name => :node120
73
+
74
+ add_new :type => :Points,
75
+ :geom => Vector3.new(),
76
+ :size => 10.0,
77
+ :name => :node121,
78
+ :pre_translate => Vector3.new(1,0,1),
79
+ :post_translate => Vector3.new(1,0,1),
80
+ :rotate => Quat.from_axis(Vector3.new(1,0,0), Math::PI)
81
+
82
+ add_new :type => :Text,
83
+ :geom => Vector3.new(),
84
+ :name => :node122,
85
+ :text => "this is node12"
86
+
87
+ add_new :name => :node123, :post_translate => Vector3.new(1,0,1) do
88
+ add :node120
89
+ add_new :type => :Arrows,
90
+ :geom => FiniteLine.new(Vector3.new(), Vector3.new(1,2,3)),
91
+ :name => :node124
92
+ end
93
+ end
94
+ assert_equal(4, node_group.child_nodes.size)
95
+ childe_nodes_name_ary = node_group.child_nodes.collect{ |node| node.name }
96
+ assert_equal([:node120, :node121, :node122, :node123].sort,childe_nodes_name_ary.sort)
97
+ child_group_node = node_group.child_nodes.find{ |node| node.class == Disp3D::NodeCollection }
98
+ assert_equal(2, child_group_node.child_nodes.size)
99
+ childe_nodes_name_ary = child_group_node.child_nodes.collect{ |node| node.name }
100
+ assert_equal([:node120, :node124].sort,childe_nodes_name_ary.sort)
101
+
102
+ # remove test
103
+
104
+ # path id DB is created by drawing
105
+ @gl_view.world_scene_graph.add(node_group)
106
+ @gl_view.world_scene_graph.gl_display @gl_view
107
+
108
+ path_id_120_1 = node_group.child_path_id.find{ |path_id| node_group.child(path_id).name == :node120}
109
+ path_id_120_2 = child_group_node.child_path_id.find{ |path_id| child_group_node.child(path_id).name == :node120}
110
+ node_group.open do
111
+ remove path_id_120_1
112
+ end
113
+ assert_equal(3, node_group.child_nodes.size)
114
+ assert_equal(2, child_group_node.child_nodes.size)
115
+
116
+ node_group.open do
117
+ remove path_id_120_2
118
+ end
119
+ assert_equal(3, node_group.child_nodes.size)
120
+ assert_equal(1, child_group_node.child_nodes.size)
121
+
122
+ node = Disp3D::NodeDB.find_by_name(:node120)
123
+ assert_equal(Disp3D::NodeTeaPod, node.class)
124
+ assert_equal(0.5, node.size)
125
+ end
126
+
127
+ def test_boundary_box
108
128
  box_geom = Box.new(Vector3.new(-1,-1,-1), Vector3.new(1,1,1))
109
129
  box_node = Disp3D::NodeTris.new(TriMesh.from_box(box_geom))
110
130
  bb = box_node.box
@@ -138,7 +158,7 @@ class NodeCollectionTestCase < MiniTest::Unit::TestCase
138
158
 
139
159
  node_collection.rotate = Quat.from_axis(Vector3.new(1,0,0), angle_45)
140
160
  bb = node_collection.box
141
- assert_equal(Vector3.new(0, 0, -Math.sqrt(2)), bb.min_point)
142
- assert_equal(Vector3.new(2, 2*Math.sqrt(2),Math.sqrt(2)), bb.max_point)
161
+ assert_equal(Vector3.new(0, -Math.sqrt(2), 0), bb.min_point)
162
+ assert_equal(Vector3.new(2, Math.sqrt(2), 2*Math.sqrt(2),), bb.max_point)
143
163
  end
144
164
  end