teien 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +7 -5
- data/bin/teien +36 -37
- data/lib/teien/{smooth_mover.rb → action_model/smooth_moving.rb} +19 -3
- data/lib/teien/actor/actor.rb +21 -0
- data/{sample/actor/app/helpers/user_event.rb → lib/teien/actor/actor_event.rb} +41 -32
- data/lib/teien/actor/actor_factory.rb +20 -0
- data/lib/teien/actor/actor_info.rb +7 -0
- data/lib/teien/actor/actor_manager.rb +31 -0
- data/lib/teien/actor/actor_manager_proxy.rb +72 -0
- data/lib/teien/addon/addon.rb +25 -0
- data/lib/teien/{animation.rb → animation/animation.rb} +1 -0
- data/lib/teien/animation/animation_event.rb +17 -0
- data/lib/teien/animation/animation_manager.rb +23 -0
- data/lib/teien/animation/animation_manager_proxy.rb +27 -0
- data/lib/teien/application/application.rb +43 -0
- data/lib/teien/base_object/attachment_info.rb +15 -0
- data/lib/teien/{garden_object.rb → base_object/base_object.rb} +43 -52
- data/lib/teien/{event.rb → base_object/base_object_event.rb} +9 -12
- data/lib/teien/base_object/base_object_manager.rb +57 -0
- data/lib/teien/{garden_base.rb → base_object/base_object_manager_base.rb} +22 -31
- data/lib/teien/{proxy_garden.rb → base_object/base_object_manager_proxy.rb} +20 -62
- data/lib/teien/base_object/object_info.rb +21 -0
- data/lib/teien/{physics.rb → base_object/physics.rb} +4 -5
- data/lib/teien/{physics_info.rb → base_object/physics_info.rb} +1 -0
- data/lib/teien/base_object/physics_object_factory.rb +23 -0
- data/lib/teien/base_object/std_objects/box_object_info.rb +42 -0
- data/lib/teien/base_object/std_objects/capsule_object_info.rb +44 -0
- data/lib/teien/base_object/std_objects/cone_object_info.rb +41 -0
- data/lib/teien/base_object/std_objects/cylinder_object_info.rb +44 -0
- data/lib/teien/base_object/std_objects/floor_object_info.rb +45 -0
- data/lib/teien/base_object/std_objects/light_object_info.rb +40 -0
- data/lib/teien/base_object/std_objects/mesh_bb_object_info.rb +42 -0
- data/lib/teien/base_object/std_objects/mesh_object_info.rb +62 -0
- data/lib/teien/base_object/std_objects/sphere_object_info.rb +38 -0
- data/lib/teien/commands/browser_command.rb +46 -0
- data/lib/teien/commands/local_command.rb +21 -0
- data/lib/teien/commands/server_command.rb +39 -0
- data/lib/teien/commands/std_command.rb +71 -0
- data/lib/teien/core/client_network.rb +26 -0
- data/lib/teien/core/component_manager.rb +11 -0
- data/lib/teien/core/core_event.rb +7 -0
- data/lib/teien/core/dispatcher.rb +30 -0
- data/lib/teien/core/event_router.rb +116 -0
- data/lib/teien/core/launcher.rb +31 -0
- data/lib/teien/core/network.rb +28 -0
- data/lib/teien/{remote_info.rb → core/remote_info.rb} +6 -1
- data/lib/teien/core/server_network.rb +23 -0
- data/lib/teien/{tools.rb → core/tools.rb} +2 -2
- data/lib/teien/{camera.rb → ui/camera.rb} +1 -1
- data/lib/teien/{camera_mover.rb → ui/camera_mover.rb} +1 -2
- data/lib/teien/ui/std_objects/box_object_info.rb +29 -0
- data/lib/teien/ui/std_objects/capsule_object_info.rb +28 -0
- data/lib/teien/ui/std_objects/cone_object_info.rb +25 -0
- data/lib/teien/ui/std_objects/cylinder_object_info.rb +26 -0
- data/lib/teien/ui/std_objects/floor_object_info.rb +34 -0
- data/lib/teien/ui/std_objects/light_object_info.rb +23 -0
- data/lib/teien/ui/std_objects/mesh_bb_object_info.rb +24 -0
- data/lib/teien/ui/std_objects/mesh_object_info.rb +24 -0
- data/lib/teien/ui/std_objects/sphere_object_info.rb +26 -0
- data/lib/teien/{user_interface.rb → ui/user_interface.rb} +18 -13
- data/lib/teien/{view.rb → ui/view.rb} +42 -20
- data/lib/teien/ui/view_object.rb +142 -0
- data/lib/teien/ui/view_object_factory.rb +23 -0
- data/lib/teien/version.rb +1 -1
- data/lib/teien.rb +3 -78
- data/mods/actor/addons/sinbad/lib/sinbad/sinbad_info.rb +16 -0
- data/{sample/actor/app/helpers → mods/actor/addons/sinbad/lib}/sinbad/sinbad_state.rb +14 -39
- data/mods/actor/addons/sinbad/lib/sinbad.rb +180 -0
- data/mods/actor/apps/browser/browser_application.rb +185 -0
- data/mods/actor/apps/common/browser_event.rb +68 -0
- data/mods/actor/apps/server/server_application.rb +101 -0
- data/{sample/actor/app/ais → mods/actor/commands/ai}/actor_ai.rb +8 -3
- data/mods/actor/commands/ai_command.rb +20 -0
- data/{sample/actor/config → mods/actor/configs}/plugins.cfg +4 -4
- data/{sample/hello_garden/app/controllers/hello_garden_controller.rb → mods/hello_garden/apps/browser/browser_application.rb} +48 -25
- data/mods/hello_garden/apps/common/browser_event.rb +58 -0
- data/{sample/hello_garden/app/models/hello_garden_model.rb → mods/hello_garden/apps/server/server_application.rb} +35 -26
- data/teien.gemspec +3 -1
- metadata +114 -55
- data/lib/teien/ai.rb +0 -27
- data/lib/teien/controller.rb +0 -30
- data/lib/teien/dispatcher.rb +0 -22
- data/lib/teien/event_router.rb +0 -118
- data/lib/teien/garden.rb +0 -91
- data/lib/teien/model.rb +0 -34
- data/lib/teien/network.rb +0 -108
- data/lib/teien/object_info.rb +0 -192
- data/lib/teien/physics_object_factory.rb +0 -170
- data/lib/teien/synchronizer.rb +0 -26
- data/lib/teien/view_object.rb +0 -67
- data/lib/teien/view_object_factory.rb +0 -210
- data/sample/actor/app/controllers/actor_controller.rb +0 -182
- data/sample/actor/app/helpers/sinbad/sinbad.rb +0 -176
- data/sample/actor/app/models/actor_model.rb +0 -108
- data/sample/hello_garden/app/helpers/user_event.rb +0 -12
- /data/lib/teien/{animation_operator.rb → animation/animation_operator.rb} +0 -0
- /data/lib/teien/{physics_object.rb → base_object/physics_object.rb} +0 -0
- /data/lib/teien/{sky_dome.rb → base_object/sky_dome.rb} +0 -0
- /data/lib/teien/{ui_listener.rb → ui/ui_listener.rb} +0 -0
- /data/{sample/actor/config → mods/actor/configs}/resources.cfg +0 -0
- /data/{sample/hello_garden/config → mods/hello_garden/configs}/plugins.cfg +0 -0
- /data/{sample/hello_garden/config → mods/hello_garden/configs}/resources.cfg +0 -0
- /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/
|
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
|
-
|
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 :
|
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
|
-
@
|
33
|
+
@manager = nil
|
33
34
|
@physics_object = nil
|
34
|
-
@
|
35
|
-
@animation_info = Animation.new
|
35
|
+
# @animation_info = Animation.new
|
36
36
|
end
|
37
37
|
|
38
38
|
def finalize()
|
39
|
-
|
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
|
-
|
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
|
-
|
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
|
-
@
|
153
|
-
@
|
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
|
-
|
161
|
-
|
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
|
-
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
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
|
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
|
2
|
-
require
|
3
|
-
require "teien/
|
4
|
-
|
5
|
-
|
6
|
-
require "teien/
|
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
|
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
|
-
|
33
|
-
@actors = Hash.new()
|
29
|
+
puts "initialize base_object_manager_base"
|
34
30
|
|
35
|
-
@
|
36
|
-
@
|
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
|
-
@
|
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 =
|
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.
|
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
|
102
|
+
# quit the current running process.
|
112
103
|
def quit()
|
113
104
|
@quit = true
|
114
105
|
end
|
@@ -1,88 +1,45 @@
|
|
1
|
-
require "teien/
|
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
|
6
|
-
|
7
|
-
|
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
|
-
|
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
|
-
|
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 =
|
88
|
+
obj.physics_object = PhysicsObjectFactory::create_object(obj, self)
|
90
89
|
|
91
|
-
if (obj.
|
92
|
-
obj.
|
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,
|
@@ -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
|