teien 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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