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.
- 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
|