teien 0.0.3 → 0.1.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.
Files changed (103) hide show
  1. data/README.md +7 -5
  2. data/bin/teien +36 -37
  3. data/lib/teien/{smooth_mover.rb → action_model/smooth_moving.rb} +19 -3
  4. data/lib/teien/actor/actor.rb +21 -0
  5. data/{sample/actor/app/helpers/user_event.rb → lib/teien/actor/actor_event.rb} +41 -32
  6. data/lib/teien/actor/actor_factory.rb +20 -0
  7. data/lib/teien/actor/actor_info.rb +7 -0
  8. data/lib/teien/actor/actor_manager.rb +31 -0
  9. data/lib/teien/actor/actor_manager_proxy.rb +72 -0
  10. data/lib/teien/addon/addon.rb +25 -0
  11. data/lib/teien/{animation.rb → animation/animation.rb} +1 -0
  12. data/lib/teien/animation/animation_event.rb +17 -0
  13. data/lib/teien/animation/animation_manager.rb +23 -0
  14. data/lib/teien/animation/animation_manager_proxy.rb +27 -0
  15. data/lib/teien/application/application.rb +43 -0
  16. data/lib/teien/base_object/attachment_info.rb +15 -0
  17. data/lib/teien/{garden_object.rb → base_object/base_object.rb} +43 -52
  18. data/lib/teien/{event.rb → base_object/base_object_event.rb} +9 -12
  19. data/lib/teien/base_object/base_object_manager.rb +57 -0
  20. data/lib/teien/{garden_base.rb → base_object/base_object_manager_base.rb} +22 -31
  21. data/lib/teien/{proxy_garden.rb → base_object/base_object_manager_proxy.rb} +20 -62
  22. data/lib/teien/base_object/object_info.rb +21 -0
  23. data/lib/teien/{physics.rb → base_object/physics.rb} +4 -5
  24. data/lib/teien/{physics_info.rb → base_object/physics_info.rb} +1 -0
  25. data/lib/teien/base_object/physics_object_factory.rb +23 -0
  26. data/lib/teien/base_object/std_objects/box_object_info.rb +42 -0
  27. data/lib/teien/base_object/std_objects/capsule_object_info.rb +44 -0
  28. data/lib/teien/base_object/std_objects/cone_object_info.rb +41 -0
  29. data/lib/teien/base_object/std_objects/cylinder_object_info.rb +44 -0
  30. data/lib/teien/base_object/std_objects/floor_object_info.rb +45 -0
  31. data/lib/teien/base_object/std_objects/light_object_info.rb +40 -0
  32. data/lib/teien/base_object/std_objects/mesh_bb_object_info.rb +42 -0
  33. data/lib/teien/base_object/std_objects/mesh_object_info.rb +62 -0
  34. data/lib/teien/base_object/std_objects/sphere_object_info.rb +38 -0
  35. data/lib/teien/commands/browser_command.rb +46 -0
  36. data/lib/teien/commands/local_command.rb +21 -0
  37. data/lib/teien/commands/server_command.rb +39 -0
  38. data/lib/teien/commands/std_command.rb +71 -0
  39. data/lib/teien/core/client_network.rb +26 -0
  40. data/lib/teien/core/component_manager.rb +11 -0
  41. data/lib/teien/core/core_event.rb +7 -0
  42. data/lib/teien/core/dispatcher.rb +30 -0
  43. data/lib/teien/core/event_router.rb +116 -0
  44. data/lib/teien/core/launcher.rb +31 -0
  45. data/lib/teien/core/network.rb +28 -0
  46. data/lib/teien/{remote_info.rb → core/remote_info.rb} +6 -1
  47. data/lib/teien/core/server_network.rb +23 -0
  48. data/lib/teien/{tools.rb → core/tools.rb} +2 -2
  49. data/lib/teien/{camera.rb → ui/camera.rb} +1 -1
  50. data/lib/teien/{camera_mover.rb → ui/camera_mover.rb} +1 -2
  51. data/lib/teien/ui/std_objects/box_object_info.rb +29 -0
  52. data/lib/teien/ui/std_objects/capsule_object_info.rb +28 -0
  53. data/lib/teien/ui/std_objects/cone_object_info.rb +25 -0
  54. data/lib/teien/ui/std_objects/cylinder_object_info.rb +26 -0
  55. data/lib/teien/ui/std_objects/floor_object_info.rb +34 -0
  56. data/lib/teien/ui/std_objects/light_object_info.rb +23 -0
  57. data/lib/teien/ui/std_objects/mesh_bb_object_info.rb +24 -0
  58. data/lib/teien/ui/std_objects/mesh_object_info.rb +24 -0
  59. data/lib/teien/ui/std_objects/sphere_object_info.rb +26 -0
  60. data/lib/teien/{user_interface.rb → ui/user_interface.rb} +18 -13
  61. data/lib/teien/{view.rb → ui/view.rb} +42 -20
  62. data/lib/teien/ui/view_object.rb +142 -0
  63. data/lib/teien/ui/view_object_factory.rb +23 -0
  64. data/lib/teien/version.rb +1 -1
  65. data/lib/teien.rb +3 -78
  66. data/mods/actor/addons/sinbad/lib/sinbad/sinbad_info.rb +16 -0
  67. data/{sample/actor/app/helpers → mods/actor/addons/sinbad/lib}/sinbad/sinbad_state.rb +14 -39
  68. data/mods/actor/addons/sinbad/lib/sinbad.rb +180 -0
  69. data/mods/actor/apps/browser/browser_application.rb +185 -0
  70. data/mods/actor/apps/common/browser_event.rb +68 -0
  71. data/mods/actor/apps/server/server_application.rb +101 -0
  72. data/{sample/actor/app/ais → mods/actor/commands/ai}/actor_ai.rb +8 -3
  73. data/mods/actor/commands/ai_command.rb +20 -0
  74. data/{sample/actor/config → mods/actor/configs}/plugins.cfg +4 -4
  75. data/{sample/hello_garden/app/controllers/hello_garden_controller.rb → mods/hello_garden/apps/browser/browser_application.rb} +48 -25
  76. data/mods/hello_garden/apps/common/browser_event.rb +58 -0
  77. data/{sample/hello_garden/app/models/hello_garden_model.rb → mods/hello_garden/apps/server/server_application.rb} +35 -26
  78. data/teien.gemspec +3 -1
  79. metadata +114 -55
  80. data/lib/teien/ai.rb +0 -27
  81. data/lib/teien/controller.rb +0 -30
  82. data/lib/teien/dispatcher.rb +0 -22
  83. data/lib/teien/event_router.rb +0 -118
  84. data/lib/teien/garden.rb +0 -91
  85. data/lib/teien/model.rb +0 -34
  86. data/lib/teien/network.rb +0 -108
  87. data/lib/teien/object_info.rb +0 -192
  88. data/lib/teien/physics_object_factory.rb +0 -170
  89. data/lib/teien/synchronizer.rb +0 -26
  90. data/lib/teien/view_object.rb +0 -67
  91. data/lib/teien/view_object_factory.rb +0 -210
  92. data/sample/actor/app/controllers/actor_controller.rb +0 -182
  93. data/sample/actor/app/helpers/sinbad/sinbad.rb +0 -176
  94. data/sample/actor/app/models/actor_model.rb +0 -108
  95. data/sample/hello_garden/app/helpers/user_event.rb +0 -12
  96. /data/lib/teien/{animation_operator.rb → animation/animation_operator.rb} +0 -0
  97. /data/lib/teien/{physics_object.rb → base_object/physics_object.rb} +0 -0
  98. /data/lib/teien/{sky_dome.rb → base_object/sky_dome.rb} +0 -0
  99. /data/lib/teien/{ui_listener.rb → ui/ui_listener.rb} +0 -0
  100. /data/{sample/actor/config → mods/actor/configs}/resources.cfg +0 -0
  101. /data/{sample/hello_garden/config → mods/hello_garden/configs}/plugins.cfg +0 -0
  102. /data/{sample/hello_garden/config → mods/hello_garden/configs}/resources.cfg +0 -0
  103. /data/{sample → mods}/hello_garden/run +0 -0
@@ -1,13 +1,13 @@
1
- require "teien/tools.rb"
2
- require "teien/physics_object.rb"
3
- require "teien/view_object.rb"
1
+ require "teien/core/tools.rb"
2
+ require "teien/base_object/physics_object.rb"
3
+ require "teien/base_object/attachment_info.rb"
4
+
4
5
 
5
6
  module Teien
6
7
 
7
- #
8
- # GardenObject has a rigidBody(bullet physics), an entity and a sceneNode(ogre3d view).
9
- #
10
- class GardenObject < Bullet::BtMotionState
8
+ class BaseObject < Bullet::BtMotionState
9
+ include Dispatcher
10
+
11
11
  # object ID
12
12
  attr_accessor :id
13
13
  attr_accessor :name
@@ -15,11 +15,11 @@ class GardenObject < Bullet::BtMotionState
15
15
 
16
16
  attr_accessor :object_info
17
17
  attr_accessor :physics_info
18
- attr_accessor :animation_info
19
18
 
20
- attr_accessor :garden
19
+ attr_accessor :attached_objects
20
+
21
+ attr_accessor :manager
21
22
  attr_accessor :physics_object
22
- attr_accessor :view_object
23
23
 
24
24
  MODE_FREE = 0
25
25
  MODE_ATTACHED = 1
@@ -28,47 +28,41 @@ class GardenObject < Bullet::BtMotionState
28
28
  super()
29
29
  @id = -1
30
30
  @mode = MODE_FREE
31
+ @attached_objects = Hash.new
31
32
 
32
- @garden = nil
33
+ @manager = nil
33
34
  @physics_object = nil
34
- @view_object = nil
35
- @animation_info = Animation.new
35
+ # @animation_info = Animation.new
36
36
  end
37
37
 
38
38
  def finalize()
39
- @view_object.finalize() if @view_object
39
+ notify(:finalize)
40
40
  @physics_object.finalize()
41
41
  end
42
42
 
43
43
  def set_activation_state(state)
44
44
  @physics_object.rigid_body.set_activation_state(state)
45
45
  end
46
-
47
-
46
+
48
47
  # Set a position.
49
- #
48
+ #
50
49
  # ==== Args
51
50
  # [aPos: Vector3D]
52
51
  def set_position(aPos)
53
-
54
- # @pivot_scene_node.set_position(aPos.x, aPos.y, aPos.z) unless @garden.is_server
55
52
  @physics_object.transform.set_origin(Bullet::BtVector3.new(aPos.x, aPos.y, aPos.z))
56
- @physics_object.rigid_body.set_center_of_mass_transform(@physics_object.transform) if (@physics_object.rigid_body != nil)
57
-
58
- # view
59
- if (@view_object)
60
- if (object_info.class == LightObjectInfo)
61
- @view_object.entity.set_position(Vector3D.to_ogre(aPos))
62
- else
63
- @view_object.pivot_scene_node.set_position(aPos.x, aPos.y, aPos.z)
64
- end
53
+ if @physics_object.rigid_body != nil
54
+ @physics_object.rigid_body.set_center_of_mass_transform(@physics_object.transform)
65
55
  end
56
+
57
+ notify(:set_position, aPos)
66
58
  end
67
59
 
68
60
  def set_position_with_interpolation(pos)
69
61
  ip_pos = (get_position() + Vector3D.to_bullet(pos)) / 2
70
62
  @physics_object.transform.set_origin(ip_pos)
71
- @physics_object.rigid_body.set_center_of_mass_transform(@physics_object.transform) if (@physics_object.rigid_body != nil)
63
+ if @physics_object.rigid_body != nil
64
+ @physics_object.rigid_body.set_center_of_mass_transform(@physics_object.transform)
65
+ end
72
66
  end
73
67
 
74
68
  # Set a linear velocity.
@@ -149,27 +143,16 @@ class GardenObject < Bullet::BtMotionState
149
143
  end
150
144
 
151
145
  def set_collision_filter(filter)
152
- @garden.physics.dynamicsWorld.remove_rigid_body(@physics_object.rigid_body)
153
- @garden.physics.dynamicsWorld.add_rigid_body(@physics_object.rigid_body, filter.group, filter.mask)
146
+ @manager.physics.dynamicsWorld.remove_rigid_body(@physics_object.rigid_body)
147
+ @manager.physics.dynamicsWorld.add_rigid_body(@physics_object.rigid_body, filter.group, filter.mask)
154
148
  physics_info.collisionFilter = filter
155
149
  end
156
150
 
157
151
  def set_world_transform(worldTrans)
158
- @physics_object.transform = Bullet::BtTransform.new(worldTrans) if (@mode == MODE_FREE)
159
-
160
- if (@view_object)
161
- if (@mode == MODE_FREE)
162
- newPos = @physics_object.transform.get_origin()
163
- newRot = @physics_object.transform.get_rotation()
164
- # puts "newRot(#{id}: #{newRot.x}, #{newRot.y}, #{newRot.z}, #{newRot.w})"
165
- # puts "newPos(#{id}: #{newPos.x}, #{newPos.y}, #{newPos.z})"
166
-
167
- return if (newRot.x.nan?)
168
-
169
- @view_object.pivot_scene_node.set_position(newPos.x, newPos.y, newPos.z)
170
- @view_object.pivot_scene_node.set_orientation(newRot.w, newRot.x, newRot.y, newRot.z)
171
- end
172
- end
152
+ # @physics_object.transform = Bullet::BtTransform.new(worldTrans) if (@mode == MODE_FREE)
153
+ @physics_object.transform = Bullet::BtTransform.new(worldTrans)
154
+
155
+ notify(:set_world_transform, @physics_object.transform)
173
156
  end
174
157
 
175
158
  def get_world_transform(worldTrans)
@@ -263,16 +246,24 @@ class GardenObject < Bullet::BtMotionState
263
246
  transform.set_rotation(@newRot)
264
247
  @physics_object.rigid_body.set_center_of_mass_transform(transform)
265
248
 
266
- if (@view_object)
267
- @view_object.pivot_scene_node.set_orientation(Quaternion.to_ogre(@newRot))
268
- end
249
+ notify(:set_rotation, @newRot)
269
250
  end
251
+
252
+ def attach_object_to_bone(bone_name, obj,
253
+ offset_quat = Quaternion.new(1, 0, 0, 0),
254
+ offset_pos = Vector3D.new(0, 0, 0))
255
+
256
+ attached_objects[bone_name] = AttachmentInfo.new(bone_name, obj.name, offset_quat, offset_pos)
257
+ obj.mode = MODE_ATTACHED
258
+ end
259
+
260
+
270
261
 
271
262
  =begin
272
263
  def attach_object_to_bone(boneName, obj)
273
264
  obj.scene_node.detach_object(obj.entity)
274
265
  tag = @entity.attach_object_to_bone(boneName, obj.entity)
275
- @garden.physics.dynamics_world.remove_rigid_body(obj.rigid_body)
266
+ @manager.physics.dynamics_world.remove_rigid_body(obj.rigid_body)
276
267
  obj.mode = MODE_ATTACHED
277
268
  return tag
278
269
  end
@@ -281,11 +272,11 @@ class GardenObject < Bullet::BtMotionState
281
272
  @entity.detach_object_from_bone(obj.entity)
282
273
  obj.scene_node.attach_object(obj.entity)
283
274
  if obj.physics_info.collision_filter
284
- @garden.physics.dynamics_world.add_rigid_body(obj.rigid_body,
275
+ @manager.physics.dynamics_world.add_rigid_body(obj.rigid_body,
285
276
  obj.physics_info.collision_filter.group,
286
277
  obj.physics_info.collision_filter.mask)
287
278
  else
288
- @garden.physics.dynamics_world.add_rigid_body(obj.rigid_body)
279
+ @manager.physics.dynamics_world.add_rigid_body(obj.rigid_body)
289
280
  end
290
281
  obj.mode = MODE_FREE
291
282
  end
@@ -1,12 +1,6 @@
1
+ module Teien
1
2
  module Event
2
-
3
- # event
4
-
5
- class ClientConnected
6
- end
7
-
8
- class ClientUnbinded
9
- end
3
+ module BaseObject
10
4
 
11
5
  class SyncEnv
12
6
  attr_accessor :gravity
@@ -27,7 +21,6 @@ class SyncObject
27
21
 
28
22
  attr_accessor :object_info
29
23
  attr_accessor :physics_info
30
- attr_accessor :animation_info
31
24
 
32
25
  attr_accessor :pos
33
26
  attr_accessor :linear_vel
@@ -35,6 +28,7 @@ class SyncObject
35
28
  attr_accessor :quat
36
29
  attr_accessor :accel
37
30
 
31
+ attr_accessor :attached_objects
38
32
 
39
33
  def initialize(obj)
40
34
  @id = obj.id
@@ -42,13 +36,15 @@ class SyncObject
42
36
 
43
37
  @object_info = obj.object_info
44
38
  @physics_info = obj.physics_info
45
- @animation_info = obj.animation_info
46
39
 
47
40
  @pos = Vector3D.to_self(obj.get_position())
48
41
  @linear_vel = Vector3D.to_self(obj.get_linear_velocity())
49
42
  @angular_vel = Vector3D.to_self(obj.get_angular_velocity())
50
43
  @quat = Quaternion.to_self(obj.get_rotation())
51
44
  @accel = obj.get_acceleration()
45
+
46
+ @attached_objects = obj.attached_objects
47
+
52
48
  end
53
49
 
54
50
  def print
@@ -56,5 +52,6 @@ class SyncObject
56
52
  end
57
53
  end
58
54
 
59
-
60
- end # module Event
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,57 @@
1
+ require "teien/base_object/base_object_manager_base.rb"
2
+ require "teien/core/network.rb"
3
+ require "teien/base_object/base_object_event.rb"
4
+
5
+ module Teien
6
+
7
+ class BaseObjectManager < BaseObjectManagerBase
8
+ def initialize(event_router, sync_period)
9
+ super(event_router)
10
+ @sync_period = sync_period
11
+ @sync_timer = sync_period
12
+ end
13
+
14
+ # EventRouter handler
15
+ def setup()
16
+
17
+ @physics.setup(self)
18
+ end
19
+
20
+ # EventRouter handler
21
+ def update(delta)
22
+ @physics.update(delta)
23
+
24
+ @sync_timer += delta
25
+ if (@sync_timer > @sync_period)
26
+ notify_objects()
27
+ @sync_timer = 0
28
+ end
29
+
30
+ return !@quit
31
+ end
32
+
33
+ # EventRouter handler
34
+ def connection_binded(from)
35
+ event = Event::BaseObject::SyncEnv.new(@gravity, @ambient_light_color, @sky_dome)
36
+ @event_router.send_event(event, from)
37
+ notify_objects(from)
38
+ end
39
+
40
+ def notify_objects(to = nil)
41
+ @objects.each_value { |obj|
42
+ if to
43
+ to.send_object(Event::BaseObject::SyncObject.new(obj))
44
+ else
45
+ @event_router.send_event(Event::BaseObject::SyncObject.new(obj))
46
+ end
47
+ }
48
+ end
49
+
50
+ def finalize()
51
+ @physics.finalize()
52
+ @objects = {}
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -1,24 +1,21 @@
1
- require "teien/garden_object.rb"
2
- require "teien/sky_dome.rb"
3
- require "teien/physics.rb"
4
- #require "teien/user_interface.rb"
5
- #require "teien/event_router.rb"
6
- require "teien/dispatcher.rb"
7
-
8
- require "eventmachine"
9
- require "teien/network.rb"
1
+ require 'teien/base_object/object_info'
2
+ require 'teien/base_object/physics_info'
3
+ require "teien/base_object/physics_object_factory"
4
+ require "teien/base_object/base_object"
5
+ require "teien/base_object/sky_dome"
6
+ require "teien/base_object/physics"
10
7
 
11
8
  module Teien
12
9
 
13
10
  # This is a top object of 3D world.
14
- class GardenBase
11
+ class BaseObjectManagerBase
15
12
  include Dispatcher
16
13
 
17
14
  attr_accessor :resources_cfg
18
15
  attr_accessor :plugins_cfg
16
+
19
17
  attr_accessor :physics
20
18
  attr_accessor :objects
21
- attr_accessor :actors
22
19
 
23
20
  attr_accessor :gravity
24
21
  attr_accessor :ambient_light_color
@@ -26,21 +23,24 @@ class GardenBase
26
23
  #
27
24
  # _script_klass_:: : set a user define class.
28
25
  #
29
- def initialize()
26
+ def initialize(event_router)
30
27
  super()
31
28
 
32
- @physics = Physics.new()
33
- @actors = Hash.new()
29
+ puts "initialize base_object_manager_base"
34
30
 
35
- @resources_cfg = nil
36
- @plugins_cfg = nil
31
+ @event_router = event_router
32
+ @event_router.register_receiver(self)
33
+
34
+ @physics = Physics.new()
37
35
 
38
36
  @objects = {}
39
37
  @object_num = 0
40
38
 
41
- @debug_draw = false
42
39
  @quit = false
43
- @last_time = 0
40
+ @debug_draw = false
41
+
42
+ @resources_cfg = nil
43
+ @plugins_cfg = nil
44
44
 
45
45
  # environment value
46
46
  @gravity = nil
@@ -73,18 +73,18 @@ class GardenBase
73
73
  notify(:set_sky_dome, enable, materialName, curvature, tiling, distance)
74
74
  end
75
75
 
76
- def create_object(name, object_info, physics_info)
76
+ def create_object(name, object_info, physics_info = nil)
77
77
  if (@objects[name])
78
78
  #raise RuntimeError, "There is a object with the same name (#{obj.name})"
79
79
  puts "There is a object with the same name (#{name})"
80
80
  return @objects[name]
81
81
  else
82
- obj = GardenObject.new()
82
+ obj = BaseObject.new()
83
83
  obj.name = name
84
84
  obj.object_info = object_info
85
85
  obj.physics_info = physics_info
86
86
 
87
- obj.garden = @garden
87
+ obj.manager = self
88
88
  @objects[obj.name] = obj
89
89
  obj.id = @object_num
90
90
  @object_num += 1
@@ -94,21 +94,12 @@ class GardenBase
94
94
  end
95
95
  end
96
96
 
97
- def add_actor(actor)
98
- if (@actors[actor.name] == nil)
99
- actors[name] = actor
100
- notify(:add_actor, actor)
101
- else
102
- raise RuntimeError, "There is an actor with the same name (#{actor.name})"
103
- end
104
- end
105
-
106
97
  def check_collision(objectA, objectB)
107
98
  result = @physics.contact_pair_test(objectA.rigid_body, objectB.rigid_body)
108
99
  return result.collided?()
109
100
  end
110
101
 
111
- # quit the current running garden.
102
+ # quit the current running process.
112
103
  def quit()
113
104
  @quit = true
114
105
  end
@@ -1,88 +1,45 @@
1
- require "teien/garden_base.rb"
1
+ require "teien/base_object/base_object_manager_base"
2
+ require "teien/core/network.rb"
3
+ require "teien/base_object/base_object_event.rb"
2
4
 
3
5
  module Teien
4
6
 
5
- class ProxyGarden < GardenBase
6
- attr_accessor :view
7
- attr_accessor :ui
8
-
9
- def initialize()
10
- super
11
- end
12
-
13
- def set_window_title(title)
14
- @view.window_title = title
7
+ class BaseObjectManagerProxy < BaseObjectManagerBase
8
+ def initialize(event_router)
9
+ super(event_router)
10
+ @quit = false
15
11
  end
16
12
 
17
- #
18
- # mainloop
19
- #
20
- def run(ip = nil, port = 11922)
21
- return false unless setup()
22
-
23
- EM.run do
24
- EM.add_periodic_timer(0.001) do
25
- @last_time = Time.now.to_f if @last_time == 0
26
-
27
- now_time = Time.now.to_f
28
- delta = now_time - @last_time
29
- @last_time = now_time
30
-
31
- unless update(delta)
32
- EM.stop
33
- self.finalize()
34
- end
35
- end
36
-
37
- Signal.trap("INT") { EM.stop; self.finalize() }
38
- Signal.trap("TERM") { EM.stop; self.finalize() }
39
-
40
- if (ip)
41
- EM.connect(ip, port, Network, self)
42
- end
43
- end
44
- end
45
-
13
+ # EventRouter handler
46
14
  def setup()
47
15
  @physics.setup(self)
48
- notify(:setup, self)
49
16
  return true
50
17
  end
51
18
 
19
+ # EventRouter handler
52
20
  def update(delta)
53
21
  @physics.update(delta)
54
- @actors.each_value {|actor|
55
- actor.update(delta)
56
- }
57
- notify(:update, delta)
58
22
  return !@quit
59
23
  end
60
24
 
25
+ # EventRouter handler
61
26
  def receive_event(event, from)
27
+
28
+ # There was a case which this manager gets a new sync packet
29
+ # after finalizing.
30
+ return if @quit
31
+
62
32
  case event
63
- when Event::SyncEnv
64
- # puts "SyncEnv"
33
+ when Event::BaseObject::SyncEnv
65
34
  set_gravity(event.gravity)
66
35
  set_ambient_light(event.ambient_light_color)
67
36
  set_sky_dome(event.sky_dome.enable, event.sky_dome.materialName)
68
- when Event::SyncObject
37
+ when Event::BaseObject::SyncObject
69
38
  if @objects[event.name]
70
- # puts "sync"
71
39
  sync_object_with_event(event, @objects[event.name])
72
40
  else
73
- # puts "add"
74
41
  create_object_from_event(event)
75
42
  end
76
-
77
- end
78
- notify(:receive_event, event, from)
79
- end
80
-
81
- def send_event(event, to = nil)
82
- if (to)
83
- to.send_object(event)
84
- else
85
- Network::send_all(event)
86
43
  end
87
44
  end
88
45
 
@@ -93,7 +50,7 @@ class ProxyGarden < GardenBase
93
50
  obj.set_angular_velocity(event.angular_vel)
94
51
  obj.set_rotation(event.quat)
95
52
  obj.set_acceleration(event.accel)
96
- # obj.animation_info = event.animation_info
53
+ obj.attached_objects = event.attached_objects
97
54
  end
98
55
 
99
56
  def sync_object_with_event(event, obj)
@@ -104,7 +61,7 @@ class ProxyGarden < GardenBase
104
61
  obj.set_angular_velocity_with_interpolation(event.angular_vel)
105
62
  obj.set_rotation(event.quat)
106
63
  obj.set_acceleration(event.accel)
107
- # obj.animation_info = event.animation_info
64
+ obj.attached_objects = event.attached_objects
108
65
  end
109
66
 
110
67
  # called by Garden class.
@@ -112,6 +69,7 @@ class ProxyGarden < GardenBase
112
69
  def finalize()
113
70
  @physics.finalize()
114
71
  @objects = {}
72
+ @quit = true
115
73
  end
116
74
  end
117
75
 
@@ -0,0 +1,21 @@
1
+ module Teien
2
+
3
+ class ObjectInfo
4
+ attr_accessor :use_physics
5
+
6
+ def initialize()
7
+ @use_physics = false
8
+ end
9
+ end
10
+
11
+ require_relative "std_objects/light_object_info"
12
+ require_relative "std_objects/floor_object_info"
13
+ require_relative "std_objects/mesh_bb_object_info"
14
+ require_relative "std_objects/mesh_object_info"
15
+ require_relative "std_objects/box_object_info"
16
+ require_relative "std_objects/sphere_object_info"
17
+ require_relative "std_objects/capsule_object_info"
18
+ require_relative "std_objects/cone_object_info"
19
+ require_relative "std_objects/cylinder_object_info"
20
+
21
+ end
@@ -1,4 +1,4 @@
1
- require "teien/physics_object_factory.rb"
1
+ require "teien/base_object/physics_object_factory.rb"
2
2
 
3
3
  module Teien
4
4
 
@@ -33,7 +33,6 @@ class Physics < Bullet::TickListener
33
33
  def initialize()
34
34
  super()
35
35
 
36
- @object_factory = PhysicsObjectFactory.new(self)
37
36
  @rigid_bodies = []
38
37
 
39
38
  @max_sub_steps = 1
@@ -86,10 +85,10 @@ class Physics < Bullet::TickListener
86
85
  end
87
86
 
88
87
  def add_physics_object(obj)
89
- obj.physics_object = @object_factory.create_object(obj)
88
+ obj.physics_object = PhysicsObjectFactory::create_object(obj, self)
90
89
 
91
- if (obj.physics_object.rigid_body != nil &&
92
- obj.object_info.class != LightObjectInfo)
90
+ if (obj.object_info.use_physics &&
91
+ obj.physics_object.rigid_body != nil)
93
92
 
94
93
  if (obj.physics_info.collision_filter)
95
94
  add_rigid_body(obj.physics_object.rigid_body,
@@ -20,4 +20,5 @@ class PhysicsInfo
20
20
  end
21
21
  end
22
22
 
23
+
23
24
  end
@@ -0,0 +1,23 @@
1
+ require 'teien/base_object/base_object'
2
+
3
+ module Teien
4
+
5
+ class PhysicsObjectFactory
6
+ @creators = Hash.new
7
+
8
+ def self.create_object(obj, physics)
9
+ if @creators[obj.object_info.class] != nil
10
+ return @creators[obj.object_info.class].call(obj, physics)
11
+ else
12
+ puts "no such class: #{obj.object_info.class}"
13
+ return nil
14
+ end
15
+ end
16
+
17
+ def self.set_creator(info_klass, creator)
18
+ @creators[info_klass] = creator
19
+ end
20
+ end
21
+
22
+
23
+ end
@@ -0,0 +1,42 @@
1
+ require_relative "../physics_object_factory"
2
+
3
+ module Teien
4
+
5
+ class BoxObjectInfo < ObjectInfo
6
+ attr_accessor :size
7
+ attr_accessor :num_seg_x
8
+ attr_accessor :num_seg_y
9
+ attr_accessor :num_seg_z
10
+ attr_accessor :u_tile
11
+ attr_accessor :v_tile
12
+ attr_accessor :material_name
13
+
14
+ def initialize(size, num_seg_x = 1, num_seg_y = 1, num_seg_z = 1, u_tile = 1.0, v_tile = 1.0)
15
+ super()
16
+ @size = size
17
+ @num_seg_x = num_seg_x
18
+ @num_seg_y = num_seg_y
19
+ @num_seg_z = num_seg_z
20
+ @u_tile = u_tile
21
+ @v_tile = v_tile
22
+ @material_name = nil
23
+ end
24
+
25
+ def self.create_physics_object(obj, physics)
26
+ physics_object = PhysicsObject.new(physics)
27
+ cShape = Bullet::BtBoxShape.new(Vector3D.new(obj.object_info.size.x,
28
+ obj.object_info.size.y,
29
+ obj.object_info.size.z))
30
+ inertia = Bullet::BtVector3.new()
31
+ cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
32
+ physics_object.set_rigid_body(obj, cShape, inertia)
33
+
34
+ obj.object_info.use_physics = true
35
+
36
+ return physics_object
37
+ end
38
+
39
+ PhysicsObjectFactory::set_creator(self, self.method(:create_physics_object))
40
+ end
41
+
42
+ end
@@ -0,0 +1,44 @@
1
+ require_relative "../physics_object_factory"
2
+
3
+ module Teien
4
+
5
+ class CapsuleObjectInfo < ObjectInfo
6
+ attr_accessor :radius
7
+ attr_accessor :height
8
+ attr_accessor :num_rings
9
+ attr_accessor :num_segments
10
+ attr_accessor :num_seg_height
11
+ attr_accessor :u_tile
12
+ attr_accessor :v_tile
13
+ attr_accessor :material_name
14
+
15
+ def initialize(radius, height, num_rings = 8, num_segments = 16, num_seg_height = 1, u_tile = 1.0, v_tile = 1.0)
16
+ super()
17
+ @radius = radius
18
+ @height = height
19
+ @num_rings = num_rings
20
+ @num_segments = num_segments
21
+ @num_seg_height = num_seg_height
22
+ @u_tile = u_tile
23
+ @v_tile = v_tile
24
+ @material_name = nil
25
+ end
26
+
27
+ def self.create_physics_object(obj, physics)
28
+ physics_object = PhysicsObject.new(physics)
29
+ cShape = Bullet::BtCapsuleShape.new(obj.object_info.radius,
30
+ obj.object_info.height)
31
+ inertia = Bullet::BtVector3.new()
32
+ cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
33
+ physics_object.set_rigid_body(obj, cShape, inertia)
34
+
35
+ obj.object_info.use_physics = true
36
+
37
+ return physics_object
38
+ end
39
+
40
+ PhysicsObjectFactory::set_creator(self, self.method(:create_physics_object))
41
+ end
42
+
43
+
44
+ end