teien 0.0.2 → 0.0.3
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 +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/tools.rb
CHANGED
@@ -51,9 +51,19 @@ class Vector3D < Bullet::BtVector3
|
|
51
51
|
return sprintf("(%f, %f, %f)", vec.x, vec.y, vec.z)
|
52
52
|
end
|
53
53
|
|
54
|
+
def _dump(limit)
|
55
|
+
return [x(), y(), z()].pack("fff")
|
56
|
+
end
|
57
|
+
|
58
|
+
def self._load(source)
|
59
|
+
array = source.unpack("fff")
|
60
|
+
return Vector3D.new(array[0], array[1], array[2])
|
61
|
+
end
|
62
|
+
|
54
63
|
def copy(vec)
|
55
|
-
|
64
|
+
set_value(vec.x, vec.y, vec.z)
|
56
65
|
end
|
66
|
+
|
57
67
|
end
|
58
68
|
|
59
69
|
|
@@ -74,13 +84,31 @@ class Quaternion < Bullet::BtQuaternion
|
|
74
84
|
return sprintf("(%f, %f, %f, %f)", qt.x, qt.y, qt.z, qt.w)
|
75
85
|
end
|
76
86
|
|
87
|
+
def _dump(limit)
|
88
|
+
return [x(), y(), z(), w()].pack("ffff")
|
89
|
+
end
|
90
|
+
|
91
|
+
def self._load(source)
|
92
|
+
array = source.unpack("ffff")
|
93
|
+
return Quaternion.new(array[0], array[1], array[2], array[3])
|
94
|
+
end
|
95
|
+
|
77
96
|
def copy(qt)
|
78
|
-
|
97
|
+
set_value(qt.x, qt.y, qt.z, qt.w)
|
79
98
|
end
|
80
99
|
|
81
100
|
end
|
82
101
|
|
83
102
|
class Color < Ogre::ColourValue
|
103
|
+
def _dump(limit)
|
104
|
+
return [r(), g(), b(), a()].pack("ffff")
|
105
|
+
end
|
106
|
+
|
107
|
+
def self._load(source)
|
108
|
+
array = source.unpack("ffff")
|
109
|
+
return Color.new(array[0], array[1], array[2], array[3])
|
110
|
+
end
|
111
|
+
|
84
112
|
end
|
85
113
|
|
86
114
|
class Radian < Ogre::Radian
|
data/lib/teien/user_interface.rb
CHANGED
@@ -1,18 +1,41 @@
|
|
1
1
|
require 'teien/camera'
|
2
|
+
require 'teien/view'
|
3
|
+
require "teien/dispatcher.rb"
|
2
4
|
|
3
5
|
module Teien
|
4
6
|
|
5
7
|
class UserInterface
|
6
|
-
|
7
|
-
|
8
|
-
|
8
|
+
# include Dispatcher
|
9
|
+
|
10
|
+
attr_accessor :garden
|
11
|
+
attr_accessor :debug_draw
|
12
|
+
|
13
|
+
def initialize(garden)
|
14
|
+
super()
|
15
|
+
|
16
|
+
@garden = garden
|
17
|
+
@garden.register_receiver(self)
|
18
|
+
|
19
|
+
@view = View.new()
|
20
|
+
@camera = nil
|
21
|
+
|
22
|
+
@debug_draw = false
|
9
23
|
end
|
10
24
|
|
11
|
-
def
|
12
|
-
@view.
|
25
|
+
def set_window_title(title)
|
26
|
+
@view.window_title = title
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_debug_draw(bl)
|
30
|
+
@debug_draw = bl
|
31
|
+
if (bl)
|
32
|
+
@debug_drawer = Teienlib::DebugDrawer.new(@view.scene_mgr)
|
33
|
+
@garden.physics.dynamics_world.set_debug_drawer(@debug_drawer)
|
34
|
+
end
|
13
35
|
end
|
14
36
|
|
15
37
|
def get_camera()
|
38
|
+
@camera = Camera.new(@view.camera) if @camera == nil
|
16
39
|
return @camera
|
17
40
|
end
|
18
41
|
|
@@ -32,6 +55,36 @@ class UserInterface
|
|
32
55
|
@view.tray_mgr.hide_cursor()
|
33
56
|
end
|
34
57
|
|
58
|
+
def register_receiver(recv)
|
59
|
+
@view.register_receiver(recv)
|
60
|
+
end
|
61
|
+
|
62
|
+
# called as a receiver by a dispatcher.
|
63
|
+
|
64
|
+
#
|
65
|
+
# By Garden/GardenBase
|
66
|
+
#
|
67
|
+
|
68
|
+
def set_ambient_light(color)
|
69
|
+
@view.set_ambient_light(color)
|
70
|
+
end
|
71
|
+
|
72
|
+
def set_sky_dome(enable, materialName, curvature = 10, tiling = 8, distance = 4000)
|
73
|
+
@view.scene_mgr.set_sky_dome(enable, materialName, curvature, tiling, distance)
|
74
|
+
end
|
75
|
+
|
76
|
+
def setup(garden)
|
77
|
+
@view.setup(garden)
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_object(obj)
|
81
|
+
@view.add_view_object(obj)
|
82
|
+
end
|
83
|
+
|
84
|
+
def update(delta)
|
85
|
+
@garden.physics.dynamics_world.debug_draw_world() if @debug_draw
|
86
|
+
@view.update(delta)
|
87
|
+
end
|
35
88
|
end
|
36
89
|
|
37
90
|
class UI < UserInterface
|
data/lib/teien/version.rb
CHANGED
data/lib/teien/view.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
require 'teien/ui_listener'
|
2
|
+
require "teien/view_object_factory.rb"
|
3
|
+
require "teien/dispatcher.rb"
|
2
4
|
|
3
5
|
module Teien
|
4
6
|
|
5
7
|
class View < Ogre::FrameListener
|
8
|
+
include Dispatcher
|
9
|
+
|
6
10
|
attr_accessor :root
|
7
11
|
attr_accessor :camera
|
8
12
|
attr_accessor :window
|
@@ -13,29 +17,28 @@ class View < Ogre::FrameListener
|
|
13
17
|
attr_accessor :window_title
|
14
18
|
|
15
19
|
|
16
|
-
def initialize(
|
20
|
+
def initialize()
|
17
21
|
super()
|
18
|
-
|
22
|
+
|
19
23
|
@adjustFlag = false
|
20
24
|
@root = nil
|
21
25
|
@camera = nil
|
22
26
|
@window = nil
|
23
27
|
@mouse = nil
|
24
28
|
@keyboard = nil
|
25
|
-
@controller = nil
|
26
29
|
@scene_mgr = nil
|
27
30
|
@tray_mgr = nil
|
28
31
|
@inputManager = nil
|
29
32
|
@window_title = ""
|
30
|
-
end
|
31
33
|
|
32
|
-
|
33
|
-
@controller = controller
|
34
|
+
@object_factory = ViewObjectFactory.new(self)
|
34
35
|
end
|
35
36
|
|
36
|
-
def setup
|
37
|
-
|
38
|
-
@
|
37
|
+
def setup(garden)
|
38
|
+
puts "view setup"
|
39
|
+
@garden = garden
|
40
|
+
@plugins_cfg = @garden.plugins_cfg ? @garden.plugins_cfg : "config/plugins.cfg"
|
41
|
+
@resources_cfg = @garden.resources_cfg ? @garden.resources_cfg : "config/resources.cfg"
|
39
42
|
|
40
43
|
@root = Ogre::Root.new("")
|
41
44
|
load_plugins()
|
@@ -48,6 +51,9 @@ class View < Ogre::FrameListener
|
|
48
51
|
init_resources()
|
49
52
|
init_managers()
|
50
53
|
|
54
|
+
start()
|
55
|
+
prepare_render_loop()
|
56
|
+
|
51
57
|
return true
|
52
58
|
end
|
53
59
|
|
@@ -114,9 +120,7 @@ class View < Ogre::FrameListener
|
|
114
120
|
ms.height = @window.get_height()
|
115
121
|
end
|
116
122
|
|
117
|
-
def start(
|
118
|
-
@script = script
|
119
|
-
|
123
|
+
def start()
|
120
124
|
# initialize scene_mgr
|
121
125
|
@scene_mgr = @root.create_scene_manager(Ogre::ST_GENERIC)
|
122
126
|
@scene_mgr.set_shadow_technique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE)
|
@@ -134,7 +138,7 @@ class View < Ogre::FrameListener
|
|
134
138
|
@keyboard.set_event_callback(@keyListener)
|
135
139
|
@mouseListener = MouseListener.new(self)
|
136
140
|
@mouse.set_event_callback(@mouseListener)
|
137
|
-
@trayListener = TrayListener.new(
|
141
|
+
@trayListener = TrayListener.new(self)
|
138
142
|
@tray_mgr.set_listener(@trayListener)
|
139
143
|
|
140
144
|
# load resources into ResourceGroupManager.
|
@@ -167,13 +171,12 @@ class View < Ogre::FrameListener
|
|
167
171
|
@root.shutdown()
|
168
172
|
end
|
169
173
|
|
170
|
-
def
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
return scene_node
|
174
|
+
def set_ambient_light(color)
|
175
|
+
@scene_mgr.set_ambient_light(color)
|
176
|
+
end
|
177
|
+
|
178
|
+
def add_view_object(obj)
|
179
|
+
obj.view_object = @object_factory.create_object(obj)
|
177
180
|
end
|
178
181
|
|
179
182
|
# Takes a screen shot.
|
@@ -200,7 +203,10 @@ class View < Ogre::FrameListener
|
|
200
203
|
def frame_rendering_queued(evt)
|
201
204
|
@keyboard.capture()
|
202
205
|
@mouse.capture()
|
203
|
-
|
206
|
+
|
207
|
+
@garden.objects.each_value {|obj|
|
208
|
+
obj.view_object.update_animation(evt.timeSinceLastFrame, obj.animation_info)
|
209
|
+
}
|
204
210
|
|
205
211
|
@tray_mgr.frame_rendering_queued(evt)
|
206
212
|
if (@adjustFlag != true)
|
@@ -208,37 +214,50 @@ class View < Ogre::FrameListener
|
|
208
214
|
@adjustFlag = true
|
209
215
|
end
|
210
216
|
|
211
|
-
return
|
217
|
+
return true
|
212
218
|
end
|
213
219
|
|
214
220
|
def key_pressed(keyEvent)
|
215
|
-
|
216
|
-
return
|
221
|
+
notify(:key_pressed, keyEvent)
|
222
|
+
return true
|
217
223
|
end
|
218
224
|
|
219
225
|
def key_released(keyEvent)
|
220
|
-
|
221
|
-
return
|
226
|
+
notify(:key_released, keyEvent)
|
227
|
+
return true
|
222
228
|
end
|
223
229
|
|
224
230
|
def mouse_moved(evt)
|
225
231
|
return true if @tray_mgr.inject_mouse_move(evt)
|
226
|
-
|
227
|
-
return
|
232
|
+
notify(:mouse_moved, evt)
|
233
|
+
return true
|
228
234
|
end
|
229
235
|
|
230
236
|
def mouse_pressed(mouseEvent, mouseButtonID)
|
231
237
|
return true if @tray_mgr.inject_mouse_down(mouseEvent, mouseButtonID)
|
232
|
-
|
233
|
-
return
|
238
|
+
notify(:mouse_pressed, mouseEvent, mouseButtonID)
|
239
|
+
return true
|
234
240
|
end
|
235
241
|
|
236
242
|
def mouse_released(mouseEvent, mouseButtonID)
|
237
243
|
return true if @tray_mgr.inject_mouse_up(mouseEvent, mouseButtonID)
|
238
|
-
|
239
|
-
return
|
244
|
+
notify(:mouse_released, mouseEvent, mouseButtonID)
|
245
|
+
return true
|
240
246
|
end
|
241
|
-
|
242
247
|
end
|
243
248
|
|
244
249
|
end # module
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
=begin
|
254
|
+
def create_scene_node(parent = nil)
|
255
|
+
if (parent == nil)
|
256
|
+
scene_node = @scene_mgr.get_root_scene_node().create_child_scene_node()
|
257
|
+
else
|
258
|
+
scene_node = parent.create_child_scene_node()
|
259
|
+
end
|
260
|
+
return scene_node
|
261
|
+
end
|
262
|
+
=end
|
263
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "teien/animation_operator.rb"
|
2
|
+
|
3
|
+
module Teien
|
4
|
+
|
5
|
+
class ViewObject
|
6
|
+
# Ogre3D accessor
|
7
|
+
## center of view objects(sceneNode) and kept to equal with the rigid_body position.
|
8
|
+
attr_accessor :pivot_scene_node
|
9
|
+
attr_accessor :scene_node
|
10
|
+
attr_accessor :entity
|
11
|
+
attr_accessor :animation_operators
|
12
|
+
|
13
|
+
def initialize(view)
|
14
|
+
@view = view
|
15
|
+
@pivot_scene_node = nil
|
16
|
+
@scene_node = nil
|
17
|
+
@entity = nil
|
18
|
+
@animation_operators = Hash.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def finalize()
|
22
|
+
@pivot_scene_node.remove_child(@scene_node)
|
23
|
+
@view.scene_mgr.destroySceneNode(@scene_node)
|
24
|
+
@view.scene_mgr.get_root_scene_node.remove_child(@pivot_scene_node)
|
25
|
+
@view.scene_mgr.destroySceneNode(@pivot_scene_node)
|
26
|
+
@view.scene_mgr.destroyEntity(@entity)
|
27
|
+
end
|
28
|
+
|
29
|
+
def update_animation(delta, animation)
|
30
|
+
animation.operators.each_pair{|key, value|
|
31
|
+
unless @animation_operators[key]
|
32
|
+
@entity.get_skeleton().set_blend_mode(animation.blend_mode)
|
33
|
+
ani_ope = AnimationOperator.new(@entity)
|
34
|
+
ani_ope.init(value.name, value.loop)
|
35
|
+
@animation_operators[key] = ani_ope
|
36
|
+
end
|
37
|
+
|
38
|
+
if (value.name != @animation_operators[key].name ||
|
39
|
+
value.loop != @animation_operators[key].loop)
|
40
|
+
@animation_operators[key].play(value.name, value.loop)
|
41
|
+
end
|
42
|
+
@animation_operators[key].add_time(delta * value.speed)
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# The offset changes the local position of the created scene_node in Object.
|
48
|
+
#
|
49
|
+
def set_scene_node(entity, offset = Vector3D.new(0, 0, 0), rotate = Quaternion.new(0, 0, 0, 1.0))
|
50
|
+
if (@pivot_scene_node == nil)
|
51
|
+
@pivot_scene_node = @view.scene_mgr.get_root_scene_node().create_child_scene_node()
|
52
|
+
end
|
53
|
+
@scene_node = @pivot_scene_node.create_child_scene_node(Vector3D.to_ogre(offset),
|
54
|
+
Quaternion.to_ogre(rotate))
|
55
|
+
@pivot_scene_node.instance_variable_set(:@child, @scene_node) # prevent this from GC.
|
56
|
+
|
57
|
+
if entity
|
58
|
+
@scene_node.attach_object(entity)
|
59
|
+
@entity = entity
|
60
|
+
end
|
61
|
+
|
62
|
+
return @scene_node
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,210 @@
|
|
1
|
+
require 'teien/garden_object'
|
2
|
+
|
3
|
+
module Teien
|
4
|
+
|
5
|
+
class ViewObjectFactory
|
6
|
+
def initialize(view)
|
7
|
+
@view = view
|
8
|
+
end
|
9
|
+
|
10
|
+
# def create_object(name, object_info, physics_info)
|
11
|
+
def create_object(obj)
|
12
|
+
case obj.object_info
|
13
|
+
when LightObjectInfo
|
14
|
+
return create_light_object(obj)
|
15
|
+
when FloorObjectInfo
|
16
|
+
return create_floor_object(obj)
|
17
|
+
when BoxObjectInfo
|
18
|
+
return create_box_object(obj)
|
19
|
+
when SphereObjectInfo
|
20
|
+
return create_sphere_object(obj)
|
21
|
+
when CapsuleObjectInfo
|
22
|
+
return create_capsule_object(obj)
|
23
|
+
when ConeObjectInfo
|
24
|
+
return create_cone_object(obj)
|
25
|
+
when CylinderObjectInfo
|
26
|
+
return create_cylinder_object(obj)
|
27
|
+
when MeshBBObjectInfo
|
28
|
+
return create_meshBB_object(obj)
|
29
|
+
when MeshObjectInfo
|
30
|
+
return create_mesh_object(obj)
|
31
|
+
else
|
32
|
+
puts "Error: passed no supported object_info."
|
33
|
+
return nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_light_object(obj)
|
38
|
+
entity = @view.scene_mgr.create_light(obj.name)
|
39
|
+
entity.set_type(obj.object_info.type)
|
40
|
+
entity.set_diffuse_colour(obj.object_info.diffuse_color)
|
41
|
+
entity.set_specular_colour(obj.object_info.specular_color)
|
42
|
+
entity.set_direction(Vector3D.to_ogre(obj.object_info.direction))
|
43
|
+
|
44
|
+
view_object = ViewObject.new(@view)
|
45
|
+
view_object.entity = entity
|
46
|
+
return view_object
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Floor Object
|
51
|
+
#
|
52
|
+
|
53
|
+
# Setting an entity and a node of Ogre3d.
|
54
|
+
def create_floor_object(obj)
|
55
|
+
normal = Ogre::Vector3.new(0, 1, 0)
|
56
|
+
up = Ogre::Vector3.new(0, 0, 1)
|
57
|
+
Ogre::MeshManager::get_singleton().create_plane(obj.name,
|
58
|
+
Ogre::ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME,
|
59
|
+
Ogre::Plane.new(normal, 0),
|
60
|
+
obj.object_info.width * 2.0,
|
61
|
+
obj.object_info.height * 2.0,
|
62
|
+
obj.object_info.num_seg_x,
|
63
|
+
obj.object_info.num_seg_y,
|
64
|
+
true, 1,
|
65
|
+
obj.object_info.u_tile,
|
66
|
+
obj.object_info.v_tile, up)
|
67
|
+
entity = @view.scene_mgr.create_entity(obj.name, obj.name)
|
68
|
+
entity.set_cast_shadows(true)
|
69
|
+
entity.set_material_name(obj.object_info.material_name)
|
70
|
+
|
71
|
+
view_object = ViewObject.new(@view)
|
72
|
+
view_object.set_scene_node(entity)
|
73
|
+
return view_object
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# Box Object
|
78
|
+
#
|
79
|
+
|
80
|
+
def create_box_object(obj)
|
81
|
+
gen = Procedural::BoxGenerator.new()
|
82
|
+
gen.set_size_x(obj.object_info.size.x * 2.0)
|
83
|
+
gen.set_size_y(obj.object_info.size.y * 2.0)
|
84
|
+
gen.set_size_z(obj.object_info.size.z * 2.0)
|
85
|
+
gen.set_num_seg_x(obj.object_info.num_seg_x)
|
86
|
+
gen.set_num_seg_y(obj.object_info.num_seg_y)
|
87
|
+
gen.set_num_seg_z(obj.object_info.num_seg_z)
|
88
|
+
gen.set_utile(obj.object_info.u_tile).set_vtile(obj.object_info.v_tile).realize_mesh(obj.name)
|
89
|
+
entity = @view.scene_mgr.create_entity(obj.name)
|
90
|
+
entity.set_cast_shadows(true)
|
91
|
+
entity.set_material_name(obj.object_info.material_name)
|
92
|
+
|
93
|
+
view_object = ViewObject.new(@view)
|
94
|
+
view_object.set_scene_node(entity)
|
95
|
+
return view_object
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Sphere Object
|
100
|
+
#
|
101
|
+
|
102
|
+
def create_sphere_object(obj)
|
103
|
+
gen = Procedural::SphereGenerator.new()
|
104
|
+
gen.set_radius(obj.object_info.radius)
|
105
|
+
gen.set_num_rings(obj.object_info.num_rings)
|
106
|
+
gen.set_num_segments(obj.object_info.num_segments)
|
107
|
+
gen.set_vtile(obj.object_info.u_tile).set_vtile(obj.object_info.v_tile).realize_mesh(obj.name)
|
108
|
+
entity = @view.scene_mgr.create_entity(obj.name)
|
109
|
+
entity.set_cast_shadows(true)
|
110
|
+
entity.set_material_name(obj.object_info.material_name)
|
111
|
+
|
112
|
+
view_object = ViewObject.new(@view)
|
113
|
+
view_object.set_scene_node(entity)
|
114
|
+
return view_object
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
# Capsule Object
|
119
|
+
#
|
120
|
+
|
121
|
+
def create_capsule_object(obj)
|
122
|
+
gen = Procedural::CapsuleGenerator.new()
|
123
|
+
gen.set_radius(obj.object_info.radius).set_height(obj.object_info.height)
|
124
|
+
gen.set_num_rings(obj.object_info.num_rings)
|
125
|
+
gen.set_num_segments(obj.object_info.num_segments)
|
126
|
+
gen.set_num_seg_height(obj.object_info.num_seg_height)
|
127
|
+
gen.set_vtile(obj.object_info.u_tile).set_vtile(obj.object_info.v_tile).realize_mesh(obj.name)
|
128
|
+
entity = @view.scene_mgr.create_entity(obj.name)
|
129
|
+
entity.set_cast_shadows(true)
|
130
|
+
entity.set_material_name(obj.object_info.material_name)
|
131
|
+
|
132
|
+
view_object = ViewObject.new(@view)
|
133
|
+
view_object.set_scene_node(entity)
|
134
|
+
return view_object
|
135
|
+
end
|
136
|
+
|
137
|
+
#
|
138
|
+
# Cone Object
|
139
|
+
#
|
140
|
+
|
141
|
+
def create_cone_object(obj)
|
142
|
+
gen = Procedural::ConeGenerator.new
|
143
|
+
gen.set_radius(obj.object_info.radius).set_height(obj.object_info.height)
|
144
|
+
gen.set_num_seg_base(obj.object_info.num_seg_base).set_num_seg_height(obj.object_info.num_seg_height)
|
145
|
+
gen.set_utile(obj.object_info.u_tile).set_vtile(obj.object_info.v_tile).realize_mesh(obj.name)
|
146
|
+
entity = @view.scene_mgr.create_entity(obj.name)
|
147
|
+
entity.set_cast_shadows(true)
|
148
|
+
entity.set_material_name(obj.object_info.material_name)
|
149
|
+
|
150
|
+
view_object = ViewObject.new(@view)
|
151
|
+
view_object.set_scene_node(entity)
|
152
|
+
return view_object
|
153
|
+
end
|
154
|
+
|
155
|
+
#
|
156
|
+
# Cylinder Object
|
157
|
+
#
|
158
|
+
|
159
|
+
def create_cylinder_object(obj)
|
160
|
+
gen = Procedural::CylinderGenerator.new
|
161
|
+
gen.set_radius(obj.object_info.radius).set_height(obj.object_info.height).set_capped(obj.object_info.capped)
|
162
|
+
gen.set_num_seg_base(obj.object_info.num_seg_base).set_num_seg_height(obj.object_info.num_seg_height)
|
163
|
+
gen.set_utile(obj.object_info.u_tile).set_vtile(obj.object_info.v_tile).realize_mesh(obj.name)
|
164
|
+
entity = @view.scene_mgr.create_entity(obj.name)
|
165
|
+
entity.set_cast_shadows(true)
|
166
|
+
entity.set_material_name(obj.object_info.material_name)
|
167
|
+
|
168
|
+
view_object = ViewObject.new(@view)
|
169
|
+
view_object.set_scene_node(entity,
|
170
|
+
Vector3D.new(0, -obj.object_info.height / 2, 0))
|
171
|
+
return view_object
|
172
|
+
end
|
173
|
+
|
174
|
+
#
|
175
|
+
# MeshBB Object
|
176
|
+
#
|
177
|
+
|
178
|
+
def create_meshBB_object(obj)
|
179
|
+
entity = @view.scene_mgr.create_entity(obj.name, obj.object_info.mesh_path)
|
180
|
+
entity.set_cast_shadows(true)
|
181
|
+
entity.set_material_name(obj.object_info.material_name) if obj.object_info.material_name
|
182
|
+
|
183
|
+
view_object = ViewObject.new(@view)
|
184
|
+
node = view_object.set_scene_node(entity, obj.object_info.view_offset, obj.object_info.view_rotation)
|
185
|
+
node.set_scale(obj.object_info.size.x * obj.object_info.scale.x,
|
186
|
+
obj.object_info.size.y * obj.object_info.scale.y,
|
187
|
+
obj.object_info.size.z * obj.object_info.scale.z)
|
188
|
+
return view_object
|
189
|
+
end
|
190
|
+
|
191
|
+
#
|
192
|
+
# Mesh Object
|
193
|
+
#
|
194
|
+
|
195
|
+
def create_mesh_object(obj)
|
196
|
+
entity = @view.scene_mgr.create_entity(obj.name, obj.object_info.mesh_path)
|
197
|
+
entity.set_cast_shadows(true)
|
198
|
+
entity.set_material_name(obj.object_info.material_name) if obj.object_info.material_name
|
199
|
+
|
200
|
+
view_object = ViewObject.new(@view)
|
201
|
+
node = view_object.set_scene_node(entity, obj.object_info.view_offset)
|
202
|
+
node.set_scale(obj.object_info.scale.x,
|
203
|
+
obj.object_info.scale.y,
|
204
|
+
obj.object_info.scale.z)
|
205
|
+
return view_object
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
end
|
data/lib/teien.rb
CHANGED
@@ -8,33 +8,81 @@ require "ogrebites.so"
|
|
8
8
|
require "teienlib.so"
|
9
9
|
|
10
10
|
require "teien/tools.rb"
|
11
|
-
require 'teien/light_object'
|
12
11
|
require 'teien/object_info'
|
13
12
|
require 'teien/physics_info'
|
14
|
-
require 'teien/
|
13
|
+
require 'teien/animation'
|
14
|
+
require 'teien/smooth_mover'
|
15
|
+
require "teien/garden.rb"
|
16
|
+
require "teien/model.rb"
|
17
|
+
require "teien/controller.rb"
|
18
|
+
require "teien/ai.rb"
|
15
19
|
|
16
20
|
module Teien
|
17
21
|
|
18
|
-
def
|
19
|
-
require "teien/
|
22
|
+
def self.start_server_garden(ip, port, sync_period = 0.5)
|
23
|
+
require "teien/synchronizer"
|
20
24
|
|
21
|
-
|
25
|
+
cwd = Dir.getwd
|
26
|
+
Dir.glob("#{cwd}/app/models/*.rb") {|file|
|
27
|
+
require "#{file}"
|
28
|
+
}
|
29
|
+
|
30
|
+
garden = Teien::Garden.new()
|
31
|
+
Teien::Model::load(garden)
|
32
|
+
# garden_script = garden_script_klass.new(garden)
|
33
|
+
sync = Synchronizer.new(garden, sync_period)
|
34
|
+
garden.run(ip, port)
|
22
35
|
end
|
23
36
|
|
24
|
-
|
25
|
-
|
26
|
-
require
|
27
|
-
|
37
|
+
def self.start_client_garden(ip, port)
|
38
|
+
require "teien/proxy_garden.rb"
|
39
|
+
require 'teien/user_interface'
|
40
|
+
|
41
|
+
cwd = Dir.getwd
|
42
|
+
Dir.glob("#{cwd}/app/controllers/*.rb") {|file|
|
43
|
+
require "#{file}"
|
44
|
+
}
|
28
45
|
|
29
|
-
|
46
|
+
garden = Teien::ProxyGarden.new()
|
47
|
+
ui = Teien::UserInterface.new(garden)
|
48
|
+
Teien::Controller::load(garden, ui)
|
49
|
+
# controller_script = controller_script_klass.new(garden, ui)
|
50
|
+
garden.run(ip, port)
|
30
51
|
end
|
31
52
|
|
32
|
-
def
|
33
|
-
require "teien/
|
34
|
-
require "ENet.so"
|
53
|
+
def self.start_ai_garden(ip, port)
|
54
|
+
require "teien/proxy_garden.rb"
|
35
55
|
|
36
|
-
|
56
|
+
cwd = Dir.getwd
|
57
|
+
Dir.glob("#{cwd}/app/ais/*.rb") {|file|
|
58
|
+
require "#{file}"
|
59
|
+
}
|
60
|
+
|
61
|
+
garden = Teien::ProxyGarden.new()
|
62
|
+
Teien::Ai::load(garden)
|
63
|
+
garden.run(ip, port)
|
37
64
|
end
|
65
|
+
|
66
|
+
|
67
|
+
def self.start_local_garden()
|
68
|
+
require_relative 'teien/user_interface'
|
69
|
+
|
70
|
+
pid = Process.fork {
|
71
|
+
start_server_garden("0.0.0.0", 11922, 0.1)
|
72
|
+
}
|
73
|
+
begin
|
74
|
+
start_client_garden("0.0.0.0", 11922)
|
75
|
+
ensure
|
76
|
+
Process.kill("TERM", pid)
|
77
|
+
end
|
78
|
+
|
79
|
+
=begin
|
80
|
+
garden = Teien::Garden.new()
|
81
|
+
ui = Teien::UserInterface.new(garden)
|
82
|
+
garden_script = garden_script_klass.new(garden)
|
83
|
+
controller_script = controller_script_klass.new(garden, ui)
|
84
|
+
garden.run
|
38
85
|
=end
|
86
|
+
end
|
39
87
|
|
40
88
|
end
|