teien 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +11 -6
- data/bin/teien +16 -2
- data/lib/teien/ai.rb +27 -0
- data/lib/teien/animation.rb +34 -0
- data/lib/teien/animation_operator.rb +6 -0
- data/lib/teien/controller.rb +30 -0
- data/lib/teien/dispatcher.rb +22 -0
- data/lib/teien/event.rb +60 -0
- data/lib/teien/event_router.rb +118 -0
- data/lib/teien/garden.rb +60 -172
- data/lib/teien/garden_base.rb +117 -0
- data/lib/teien/garden_object.rb +119 -136
- data/lib/teien/model.rb +34 -0
- data/lib/teien/network.rb +108 -0
- data/lib/teien/object_info.rb +21 -0
- data/lib/teien/physics.rb +47 -39
- data/lib/teien/physics_object.rb +57 -0
- data/lib/teien/physics_object_factory.rb +170 -0
- data/lib/teien/proxy_garden.rb +118 -0
- data/lib/teien/remote_info.rb +20 -0
- data/lib/teien/sky_dome.rb +15 -0
- data/lib/teien/smooth_mover.rb +31 -42
- data/lib/teien/synchronizer.rb +26 -0
- data/lib/teien/tools.rb +30 -2
- data/lib/teien/user_interface.rb +58 -5
- data/lib/teien/version.rb +1 -1
- data/lib/teien/view.rb +52 -33
- data/lib/teien/view_object.rb +67 -0
- data/lib/teien/view_object_factory.rb +210 -0
- data/lib/teien.rb +62 -14
- data/sample/actor/app/ais/actor_ai.rb +112 -0
- data/sample/actor/app/controllers/actor_controller.rb +182 -0
- data/sample/actor/app/helpers/sinbad/sinbad.rb +176 -0
- data/sample/actor/app/helpers/sinbad/sinbad_state.rb +224 -0
- data/sample/actor/app/helpers/user_event.rb +75 -0
- data/sample/actor/app/models/actor_model.rb +108 -0
- data/sample/actor/config/plugins.cfg +19 -0
- data/sample/actor/config/resources.cfg +24 -0
- data/sample/hello_garden/app/controllers/hello_garden_controller.rb +90 -0
- data/sample/hello_garden/app/helpers/user_event.rb +12 -0
- data/sample/{standalone/hello_garden/hello_garden.rb → hello_garden/app/models/hello_garden_model.rb} +29 -83
- data/sample/{standalone/hello_garden → hello_garden/config}/plugins.cfg +0 -0
- data/sample/{standalone/hello_garden → hello_garden/config}/resources.cfg +0 -0
- data/sample/hello_garden/run +6 -0
- data/teien.gemspec +2 -1
- metadata +52 -15
- data/lib/teien/light_object.rb +0 -36
- data/lib/teien/object_factory.rb +0 -308
- data/sample/standalone/hello_garden/run +0 -5
data/lib/teien/physics.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "teien/physics_object_factory.rb"
|
2
|
+
|
1
3
|
module Teien
|
2
4
|
|
3
5
|
CollisionFilter = Struct.new(:group, :mask)
|
@@ -5,6 +7,7 @@ CollisionFilter = Struct.new(:group, :mask)
|
|
5
7
|
class ContactResult < Bullet::ContactResultCallback
|
6
8
|
def initialize
|
7
9
|
super
|
10
|
+
|
8
11
|
@isCollided = false
|
9
12
|
end
|
10
13
|
|
@@ -27,18 +30,23 @@ class Physics < Bullet::TickListener
|
|
27
30
|
attr_accessor :fixed_time_step
|
28
31
|
# attr_accessor :softBodyWorldInfo
|
29
32
|
|
30
|
-
def initialize(
|
33
|
+
def initialize()
|
31
34
|
super()
|
32
|
-
|
35
|
+
|
36
|
+
@object_factory = PhysicsObjectFactory.new(self)
|
37
|
+
@rigid_bodies = []
|
33
38
|
|
34
39
|
@max_sub_steps = 1
|
35
40
|
@fixed_time_step = 1.0 / 60.0
|
41
|
+
end
|
36
42
|
|
37
|
-
|
43
|
+
def set_gravity(vec)
|
44
|
+
@dynamics_world.set_gravity(vec)
|
38
45
|
end
|
39
46
|
|
40
|
-
def setup
|
41
|
-
@
|
47
|
+
def setup(garden)
|
48
|
+
@garden = garden
|
49
|
+
@collision_config = Bullet::BtDefaultCollisionConfiguration.new()
|
42
50
|
@collision_dispatcher = Bullet::BtCollisionDispatcher.new(@collision_config)
|
43
51
|
|
44
52
|
worldAabbMin = Bullet::BtVector3.new(-3000.0,-500.0, -3000.0)
|
@@ -77,6 +85,35 @@ class Physics < Bullet::TickListener
|
|
77
85
|
# @dynamics_world.finalize()
|
78
86
|
end
|
79
87
|
|
88
|
+
def add_physics_object(obj)
|
89
|
+
obj.physics_object = @object_factory.create_object(obj)
|
90
|
+
|
91
|
+
if (obj.physics_object.rigid_body != nil &&
|
92
|
+
obj.object_info.class != LightObjectInfo)
|
93
|
+
|
94
|
+
if (obj.physics_info.collision_filter)
|
95
|
+
add_rigid_body(obj.physics_object.rigid_body,
|
96
|
+
obj.physics_info.collision_filter)
|
97
|
+
else
|
98
|
+
add_rigid_body(obj.physics_object.rigid_body)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def add_rigid_body(rigid_body, collision_filter = nil)
|
104
|
+
@rigid_bodies.push(rigid_body)
|
105
|
+
if (collision_filter)
|
106
|
+
@dynamics_world.add_rigid_body(rigid_body, collision_filter.group, collision_filter.mask)
|
107
|
+
else
|
108
|
+
@dynamics_world.add_rigid_body(rigid_body)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def del_rigid_body(rigid_body)
|
113
|
+
@rigid_bodies.delete(rigid_body)
|
114
|
+
@dynamics_world.remove_rigid_body(rigid_body)
|
115
|
+
end
|
116
|
+
|
80
117
|
def update(delta)
|
81
118
|
@dynamics_world.step_simulation(delta, @max_sub_steps, @fixed_time_step)
|
82
119
|
return true
|
@@ -94,56 +131,27 @@ class Physics < Bullet::TickListener
|
|
94
131
|
@dynamics_world.get_dispatcher())
|
95
132
|
end
|
96
133
|
|
97
|
-
def set_gravity(vec)
|
98
|
-
@dynamics_world.set_gravity(vec)
|
99
|
-
end
|
100
|
-
|
101
|
-
=begin
|
102
|
-
def create_box_shape(size)
|
103
|
-
return Bullet::BtBoxShape.new(size)
|
104
|
-
end
|
105
|
-
|
106
|
-
def createSphereShape(radius)
|
107
|
-
return Bullet::BtSphereShape.new(radius)
|
108
|
-
end
|
109
|
-
=end
|
110
|
-
|
111
|
-
def create_rigid_body(mass, motionState, colObj, inertia)
|
112
|
-
rigid_body = Bullet::BtRigidBody.new(mass, motionState, colObj, inertia)
|
113
|
-
rigid_body.instance_variable_set(:@collision_shape, colObj) # prevent this colObj from GC.
|
114
|
-
return rigid_body
|
115
|
-
end
|
116
|
-
|
117
|
-
def add_rigid_body(rigid_body, collision_filter = nil)
|
118
|
-
@rigid_bodies.push(rigid_body)
|
119
|
-
if (collision_filter)
|
120
|
-
@dynamics_world.add_rigid_body(rigid_body, collision_filter.group, collision_filter.mask)
|
121
|
-
else
|
122
|
-
@dynamics_world.add_rigid_body(rigid_body)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
134
|
def contact_pair_test(colObjA, colObjB)
|
127
135
|
result = ContactResult.new
|
128
136
|
@dynamics_world.contact_pair_test(colObjA, colObjB, result)
|
129
137
|
return result
|
130
138
|
end
|
131
139
|
|
132
|
-
def
|
133
|
-
# print "
|
140
|
+
def pre_tick_callback(timeStep)
|
141
|
+
# print "pre_tick_callback: ", timeStep * 1000, "ms\n"
|
134
142
|
delta = Bullet::BtVector3.new(timeStep, timeStep, timeStep)
|
135
143
|
|
136
144
|
@garden.objects.each {|name, obj|
|
137
145
|
if (obj.get_mass() > 0)
|
138
|
-
newVel = obj.get_linear_velocity() + obj.get_acceleration() * delta
|
146
|
+
newVel = obj.get_linear_velocity() + Vector3D.to_bullet(obj.get_acceleration()) * delta
|
139
147
|
obj.set_linear_velocity(obj.limit_velocity(newVel))
|
140
148
|
lastVel = obj.get_linear_velocity()
|
141
149
|
end
|
142
150
|
}
|
143
151
|
end
|
144
152
|
|
145
|
-
def
|
146
|
-
# print "
|
153
|
+
def tick_callback(timeStep)
|
154
|
+
# print "tick_callback: ", timeStep * 1000, "ms\n"
|
147
155
|
end
|
148
156
|
end
|
149
157
|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Teien
|
2
|
+
|
3
|
+
class PhysicsObject
|
4
|
+
# Bullet accessor
|
5
|
+
attr_accessor :rigid_body # shows the center of this object.
|
6
|
+
attr_accessor :transform
|
7
|
+
attr_accessor :pivot_shape
|
8
|
+
attr_accessor :shape
|
9
|
+
attr_accessor :acceleration
|
10
|
+
attr_accessor :maxHorizontalVelocity
|
11
|
+
attr_accessor :maxVerticalVelocity
|
12
|
+
|
13
|
+
def initialize(physics)
|
14
|
+
@physics = physics
|
15
|
+
@rigid_body = nil
|
16
|
+
@transform = Bullet::BtTransform.new()
|
17
|
+
@transform.set_identity()
|
18
|
+
@acceleration = Vector3D.new(0, 0, 0)
|
19
|
+
|
20
|
+
@maxHorizontalVelocity = 0
|
21
|
+
@maxVerticalVelocity = 0
|
22
|
+
end
|
23
|
+
|
24
|
+
def finalize()
|
25
|
+
@physics.del_rigid_body(@rigid_body)
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# The offset changes the local position of the shape(collision shape) in Object.
|
30
|
+
#
|
31
|
+
def set_rigid_body(obj, shape, inertia, offset = Vector3D.new(0, 0, 0))
|
32
|
+
# puts "offset(#{offset.x}, #{offset.y}, #{offset.z})"
|
33
|
+
@pivot_shape = Bullet::BtCompoundShape.new
|
34
|
+
localTrans = Bullet::BtTransform.new
|
35
|
+
localTrans.set_identity()
|
36
|
+
localTrans.set_origin(offset)
|
37
|
+
@pivot_shape.add_child_shape(localTrans, shape)
|
38
|
+
@shape = shape
|
39
|
+
# @rigid_body = @physics.create_rigid_body(obj.physics_info.mass, obj, @pivot_shape, inertia)
|
40
|
+
@rigid_body = create_rigid_body(obj.physics_info.mass, obj, @pivot_shape, inertia)
|
41
|
+
@rigid_body.set_angular_factor(obj.physics_info.angular_factor)
|
42
|
+
@rigid_body.set_restitution(obj.physics_info.restitution)
|
43
|
+
@rigid_body.set_friction(obj.physics_info.friction)
|
44
|
+
@rigid_body.set_damping(obj.physics_info.linear_damping,
|
45
|
+
obj.physics_info.angular_damping)
|
46
|
+
return @rigid_body
|
47
|
+
end
|
48
|
+
|
49
|
+
def create_rigid_body(mass, motionState, colObj, inertia)
|
50
|
+
rigid_body = Bullet::BtRigidBody.new(mass, motionState, colObj, inertia)
|
51
|
+
rigid_body.instance_variable_set(:@collision_shape, colObj) # prevent this colObj from GC.
|
52
|
+
return rigid_body
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'teien/garden_object'
|
2
|
+
|
3
|
+
module Teien
|
4
|
+
|
5
|
+
class PhysicsObjectFactory
|
6
|
+
def initialize(physics)
|
7
|
+
@physics = physics
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_object(obj)
|
11
|
+
case obj.object_info
|
12
|
+
when LightObjectInfo
|
13
|
+
return create_light_object(obj)
|
14
|
+
when FloorObjectInfo
|
15
|
+
return create_floor_object(obj)
|
16
|
+
when BoxObjectInfo
|
17
|
+
return create_box_object(obj)
|
18
|
+
when SphereObjectInfo
|
19
|
+
return create_sphere_object(obj)
|
20
|
+
when CapsuleObjectInfo
|
21
|
+
return create_capsule_object(obj)
|
22
|
+
when ConeObjectInfo
|
23
|
+
return create_cone_object(obj)
|
24
|
+
when CylinderObjectInfo
|
25
|
+
return create_cylinder_object(obj)
|
26
|
+
when MeshBBObjectInfo
|
27
|
+
return create_meshBB_object(obj)
|
28
|
+
when MeshObjectInfo
|
29
|
+
return create_mesh_object(obj)
|
30
|
+
else
|
31
|
+
puts "Error: passed no supported object_info."
|
32
|
+
return nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_light_object(obj)
|
37
|
+
physics_object = PhysicsObject.new(@physics)
|
38
|
+
cShape = Bullet::BtSphereShape.new(0.1)
|
39
|
+
inertia = Bullet::BtVector3.new()
|
40
|
+
cShape.calculate_local_inertia(0, inertia)
|
41
|
+
physics_object.set_rigid_body(obj, cShape, inertia)
|
42
|
+
return physics_object
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Floor Object
|
47
|
+
#
|
48
|
+
|
49
|
+
# Setting a collision shape and a rigid body of Bullet.
|
50
|
+
def create_floor_object(obj)
|
51
|
+
physics_object = PhysicsObject.new(@physics)
|
52
|
+
cShape = Bullet::BtBoxShape.new(Vector3D.new(obj.object_info.width,
|
53
|
+
obj.object_info.depth,
|
54
|
+
obj.object_info.height))
|
55
|
+
physics_object.set_rigid_body(obj, cShape,
|
56
|
+
Vector3D.new(0, 0, 0),
|
57
|
+
Vector3D.new(0.0, -obj.object_info.depth, 0.0))
|
58
|
+
return physics_object
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# Box Object
|
63
|
+
#
|
64
|
+
|
65
|
+
def create_box_object(obj)
|
66
|
+
physics_object = PhysicsObject.new(@physics)
|
67
|
+
cShape = Bullet::BtBoxShape.new(Vector3D.new(obj.object_info.size.x,
|
68
|
+
obj.object_info.size.y,
|
69
|
+
obj.object_info.size.z))
|
70
|
+
inertia = Bullet::BtVector3.new()
|
71
|
+
cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
|
72
|
+
physics_object.set_rigid_body(obj, cShape, inertia)
|
73
|
+
return physics_object
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# Sphere Object
|
78
|
+
#
|
79
|
+
|
80
|
+
def create_sphere_object(obj)
|
81
|
+
physics_object = PhysicsObject.new(@physics)
|
82
|
+
cShape = Bullet::BtSphereShape.new(obj.object_info.radius)
|
83
|
+
inertia = Bullet::BtVector3.new()
|
84
|
+
cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
|
85
|
+
physics_object.set_rigid_body(obj, cShape, inertia)
|
86
|
+
return physics_object
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Capsule Object
|
91
|
+
#
|
92
|
+
|
93
|
+
def create_capsule_object(obj)
|
94
|
+
physics_object = PhysicsObject.new(@physics)
|
95
|
+
cShape = Bullet::BtCapsuleShape.new(obj.object_info.radius,
|
96
|
+
obj.object_info.height)
|
97
|
+
inertia = Bullet::BtVector3.new()
|
98
|
+
cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
|
99
|
+
physics_object.set_rigid_body(obj, cShape, inertia)
|
100
|
+
return physics_object
|
101
|
+
end
|
102
|
+
|
103
|
+
#
|
104
|
+
# Cone Object
|
105
|
+
#
|
106
|
+
|
107
|
+
def create_cone_object(obj)
|
108
|
+
physics_object = PhysicsObject.new(@physics)
|
109
|
+
cShape = Bullet::BtConeShape.new(obj.object_info.radius, obj.object_info.height)
|
110
|
+
inertia = Bullet::BtVector3.new()
|
111
|
+
cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
|
112
|
+
physics_object.set_rigid_body(obj, cShape, inertia,
|
113
|
+
Vector3D.new(0, obj.object_info.height / 2, 0))
|
114
|
+
return physics_object
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
# Cylinder Object
|
119
|
+
#
|
120
|
+
|
121
|
+
def create_cylinder_object(obj)
|
122
|
+
physics_object = PhysicsObject.new(@physics)
|
123
|
+
cShape = Bullet::BtCylinderShape.new(Bullet::BtVector3.new(obj.object_info.radius,
|
124
|
+
obj.object_info.height / 2,
|
125
|
+
obj.object_info.radius))
|
126
|
+
inertia = Bullet::BtVector3.new()
|
127
|
+
cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
|
128
|
+
physics_object.set_rigid_body(obj, cShape, inertia)
|
129
|
+
return physics_object
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# MeshBB Object
|
134
|
+
#
|
135
|
+
|
136
|
+
def create_meshBB_object(obj)
|
137
|
+
physics_object = PhysicsObject.new(@physics)
|
138
|
+
cShape = Bullet::BtBoxShape.new(obj.object_info.size)
|
139
|
+
inertia = Bullet::BtVector3.new()
|
140
|
+
cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
|
141
|
+
physics_object.set_rigid_body(obj, cShape, inertia, obj.object_info.physics_offset)
|
142
|
+
return physics_object
|
143
|
+
end
|
144
|
+
|
145
|
+
#
|
146
|
+
# Mesh Object
|
147
|
+
#
|
148
|
+
|
149
|
+
# This method needs the obj.entity to create a collision shape.
|
150
|
+
# So it's not support to use this method on server(physics only) currently.
|
151
|
+
def add_mesh_object(obj)
|
152
|
+
physics_object = PhysicsObject.new(@physics)
|
153
|
+
strider = Teienlib::MeshStrider.new(obj.entity.get_mesh().get())
|
154
|
+
cShape = Bullet::BtGImpactMeshShape.new(strider)
|
155
|
+
cShape.set_local_scaling(Bullet::BtVector3.new(obj.object_info.scale.x,
|
156
|
+
obj.object_info.scale.y,
|
157
|
+
obj.object_info.scale.z))
|
158
|
+
cShape.instance_variable_set(:@strider, strider) # prevent this from GC.
|
159
|
+
cShape.post_update()
|
160
|
+
cShape.update_bound()
|
161
|
+
inertia = Bullet::BtVector3.new()
|
162
|
+
cShape.calculate_local_inertia(obj.physics_info.mass, inertia)
|
163
|
+
physics_object.set_rigid_body(obj, cShape, inertia,
|
164
|
+
obj.object_info.physics_offset)
|
165
|
+
return physics_object
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require "teien/garden_base.rb"
|
2
|
+
|
3
|
+
module Teien
|
4
|
+
|
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
|
15
|
+
end
|
16
|
+
|
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
|
+
|
46
|
+
def setup()
|
47
|
+
@physics.setup(self)
|
48
|
+
notify(:setup, self)
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
|
52
|
+
def update(delta)
|
53
|
+
@physics.update(delta)
|
54
|
+
@actors.each_value {|actor|
|
55
|
+
actor.update(delta)
|
56
|
+
}
|
57
|
+
notify(:update, delta)
|
58
|
+
return !@quit
|
59
|
+
end
|
60
|
+
|
61
|
+
def receive_event(event, from)
|
62
|
+
case event
|
63
|
+
when Event::SyncEnv
|
64
|
+
# puts "SyncEnv"
|
65
|
+
set_gravity(event.gravity)
|
66
|
+
set_ambient_light(event.ambient_light_color)
|
67
|
+
set_sky_dome(event.sky_dome.enable, event.sky_dome.materialName)
|
68
|
+
when Event::SyncObject
|
69
|
+
if @objects[event.name]
|
70
|
+
# puts "sync"
|
71
|
+
sync_object_with_event(event, @objects[event.name])
|
72
|
+
else
|
73
|
+
# puts "add"
|
74
|
+
create_object_from_event(event)
|
75
|
+
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
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def create_object_from_event(event)
|
90
|
+
obj = create_object(event.name, event.object_info, event.physics_info)
|
91
|
+
obj.set_position(event.pos)
|
92
|
+
obj.set_linear_velocity(event.linear_vel)
|
93
|
+
obj.set_angular_velocity(event.angular_vel)
|
94
|
+
obj.set_rotation(event.quat)
|
95
|
+
obj.set_acceleration(event.accel)
|
96
|
+
# obj.animation_info = event.animation_info
|
97
|
+
end
|
98
|
+
|
99
|
+
def sync_object_with_event(event, obj)
|
100
|
+
obj.set_position_with_interpolation(event.pos)
|
101
|
+
obj.set_linear_velocity(event.linear_vel)
|
102
|
+
# obj.set_linear_velocity_with_interpolation(event.linear_vel)
|
103
|
+
# obj.set_angular_velocity(event.angular_vel)
|
104
|
+
obj.set_angular_velocity_with_interpolation(event.angular_vel)
|
105
|
+
obj.set_rotation(event.quat)
|
106
|
+
obj.set_acceleration(event.accel)
|
107
|
+
# obj.animation_info = event.animation_info
|
108
|
+
end
|
109
|
+
|
110
|
+
# called by Garden class.
|
111
|
+
# clear all managers.
|
112
|
+
def finalize()
|
113
|
+
@physics.finalize()
|
114
|
+
@objects = {}
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Teien
|
2
|
+
|
3
|
+
class RemoteInfo
|
4
|
+
@@total_cnt = 0
|
5
|
+
attr_accessor :id
|
6
|
+
attr_accessor :ip
|
7
|
+
attr_accessor :port
|
8
|
+
attr_accessor :connection
|
9
|
+
|
10
|
+
def initialize(con)
|
11
|
+
@ip = nil
|
12
|
+
@port = 0
|
13
|
+
@port, @ip = Socket.unpack_sockaddr_in(con.get_peername) if con.get_peername
|
14
|
+
@connection = con
|
15
|
+
@id = @@total_cnt
|
16
|
+
@@total_cnt += 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class SkyDome
|
2
|
+
attr_accessor :enable
|
3
|
+
attr_accessor :materialName
|
4
|
+
attr_accessor :curvature
|
5
|
+
attr_accessor :tiling
|
6
|
+
attr_accessor :distance
|
7
|
+
|
8
|
+
def initialize(enable, materialName, curvature = 10, tiling = 8, distance = 4000)
|
9
|
+
@enable = enable
|
10
|
+
@materialName = materialName
|
11
|
+
@curvature = curvature
|
12
|
+
@tiling = tiling
|
13
|
+
@distance = distance
|
14
|
+
end
|
15
|
+
end
|
data/lib/teien/smooth_mover.rb
CHANGED
@@ -3,22 +3,18 @@ class SmoothMover
|
|
3
3
|
TURN_SPEED = 500.0
|
4
4
|
|
5
5
|
attr_accessor :acceleration
|
6
|
-
attr_accessor :
|
6
|
+
attr_accessor :turn_speed
|
7
7
|
attr_accessor :movable
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@
|
11
|
-
|
9
|
+
def initialize(target_object)
|
10
|
+
@target_object = target_object
|
12
11
|
@acceleration = ACCELERATION
|
13
|
-
@
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
@turn_speed = TURN_SPEED
|
13
|
+
@move_dir = Ogre::Vector3.new(0, 0, 0)
|
14
|
+
@forward_dir = Ogre::Vector3.new(0, 0, 0)
|
15
|
+
@zero_vector = Vector3D.new(0, 0, 0)
|
16
|
+
clear_action()
|
17
17
|
@movable = true
|
18
|
-
|
19
|
-
@zeroVector = Bullet::BtVector3.new(0, 0, 0)
|
20
|
-
@moveDir = Ogre::Vector3.new(0, 0, 0)
|
21
|
-
@cameraDir = Ogre::Vector3.new(0, 0, 0)
|
22
18
|
end
|
23
19
|
|
24
20
|
def clear_action()
|
@@ -28,10 +24,17 @@ class SmoothMover
|
|
28
24
|
@right = false
|
29
25
|
end
|
30
26
|
|
31
|
-
def
|
27
|
+
def moving?()
|
32
28
|
return (@forward || @backward || @left || @right)
|
33
29
|
end
|
34
30
|
|
31
|
+
#
|
32
|
+
# This direction is the forward.
|
33
|
+
#
|
34
|
+
def set_forward_direction(forward_dir)
|
35
|
+
@forward_dir = forward_dir
|
36
|
+
end
|
37
|
+
|
35
38
|
def move_forward(bool)
|
36
39
|
@forward = bool
|
37
40
|
end
|
@@ -48,61 +51,47 @@ class SmoothMover
|
|
48
51
|
@right = bool
|
49
52
|
end
|
50
53
|
|
51
|
-
#
|
52
|
-
# This direction is the forward.
|
53
|
-
#
|
54
|
-
def move_camera_direction(cameraDir)
|
55
|
-
@cameraDir = cameraDir
|
56
|
-
end
|
57
54
|
|
58
55
|
def update_target(delta)
|
59
|
-
@
|
60
|
-
@
|
61
|
-
@
|
56
|
+
@move_dir.x = 0
|
57
|
+
@move_dir.y = 0
|
58
|
+
@move_dir.z = 0
|
62
59
|
|
63
60
|
# update target's acceleration
|
64
61
|
if (@forward)
|
65
|
-
@
|
62
|
+
@move_dir += Ogre::Vector3.new(@forward_dir.x, @forward_dir.y, @forward_dir.z)
|
66
63
|
end
|
67
64
|
if (@backward)
|
68
|
-
@
|
65
|
+
@move_dir += Ogre::Vector3.new(-@forward_dir.x, -@forward_dir.y, -@forward_dir.z)
|
69
66
|
end
|
70
67
|
if (@left)
|
71
|
-
@
|
68
|
+
@move_dir += Ogre::Vector3.new(@forward_dir.z, 0, -@forward_dir.x)
|
72
69
|
end
|
73
70
|
if (@right)
|
74
|
-
@
|
71
|
+
@move_dir += Ogre::Vector3.new(-@forward_dir.z, 0, @forward_dir.x)
|
75
72
|
end
|
76
73
|
|
77
|
-
@
|
78
|
-
@
|
74
|
+
@move_dir.y = 0
|
75
|
+
@move_dir.normalise()
|
79
76
|
|
80
77
|
if (@movable)
|
81
|
-
newAcc = @
|
82
|
-
@
|
78
|
+
newAcc = @move_dir * @acceleration
|
79
|
+
@target_object.set_acceleration(Vector3D.to_self(newAcc))
|
83
80
|
else
|
84
|
-
@
|
81
|
+
@target_object.set_acceleration(@zero_vector)
|
85
82
|
end
|
86
83
|
|
87
84
|
# update target's direction
|
88
|
-
=
|
89
|
-
ogreDir = -@targetObject.pivotSceneNode.getOrientation().zAxis()
|
90
|
-
bulletDir = -@targetObject.getOrientation().zAxis()
|
91
|
-
puts "OgreDir: (#{ogreDir.x}, #{ogreDir.y}, #{ogreDir.z})"
|
92
|
-
puts "BulletDir: (#{bulletDir.x}, #{bulletDir.y}, #{bulletDir.z})"
|
93
|
-
=end
|
94
|
-
|
95
|
-
toGoal = Vector3D.to_ogre(-@targetObject.get_orientation().z_axis()).get_rotation_to(@moveDir)
|
85
|
+
toGoal = Vector3D.to_ogre(-@target_object.get_orientation().z_axis()).get_rotation_to(@move_dir)
|
96
86
|
yawToGoal = toGoal.get_yaw().value_degrees()
|
97
|
-
yawAtSpeed = yawToGoal / yawToGoal.abs * delta * @
|
87
|
+
yawAtSpeed = yawToGoal / yawToGoal.abs * delta * @turn_speed
|
98
88
|
|
99
89
|
if (yawToGoal < 0)
|
100
90
|
yawToGoal = [0, [yawToGoal, yawAtSpeed].max].min
|
101
|
-
|
102
91
|
elsif (yawToGoal > 0)
|
103
92
|
yawToGoal = [0, [yawToGoal, yawAtSpeed].min].max
|
104
93
|
end
|
105
94
|
|
106
|
-
@
|
95
|
+
@target_object.yaw(Ogre::Degree.new(yawToGoal).value_radians())
|
107
96
|
end
|
108
97
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Teien
|
2
|
+
|
3
|
+
class Synchronizer
|
4
|
+
def initialize(garden, sync_period)
|
5
|
+
@garden = garden
|
6
|
+
@garden.register_receiver(self)
|
7
|
+
@sync_period = sync_period
|
8
|
+
@sync_timer = sync_period
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup(garden)
|
12
|
+
end
|
13
|
+
|
14
|
+
def update(delta)
|
15
|
+
@sync_timer += delta
|
16
|
+
if (@sync_timer > @sync_period)
|
17
|
+
@garden.notify_objects()
|
18
|
+
@sync_timer = 0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_actor(actor)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|