teienlib 0.0.1-x86-linux → 0.0.2-x86-linux
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/lib/teienlib/version.rb +1 -1
- data/sample/hello/box.rb +68 -0
- data/sample/hello/camera_mover.rb +190 -0
- data/sample/hello/floor.rb +41 -0
- data/sample/hello/hello +6 -0
- data/sample/hello/hello.rb +300 -0
- data/sample/hello/ogre.cfg +11 -0
- data/sample/hello/plugins.cfg +17 -0
- data/sample/hello/resources.cfg +22 -0
- data/sample/hello/ui_listener.rb +65 -0
- data/teienlib.gemspec +3 -0
- metadata +14 -5
data/lib/teienlib/version.rb
CHANGED
data/sample/hello/box.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
class Box < Bullet::BtMotionState
|
2
|
+
@@cnt = 0
|
3
|
+
|
4
|
+
attr_accessor :id
|
5
|
+
|
6
|
+
def initialize(dynamics_world, scene_mgr, mass, x, y, z, color)
|
7
|
+
super() # needed by Bullet::BtMotionState
|
8
|
+
|
9
|
+
@dynamics_world = dynamics_world
|
10
|
+
@scene_mgr = scene_mgr
|
11
|
+
@x = x
|
12
|
+
@y = y
|
13
|
+
@z = z
|
14
|
+
@color = color
|
15
|
+
@@cnt += 1
|
16
|
+
@id = @@cnt
|
17
|
+
@name = "box_#{@id}"
|
18
|
+
|
19
|
+
# create a physics object.
|
20
|
+
@colObj = Bullet::BtBoxShape.new(Bullet::BtVector3.new(x, y, z))
|
21
|
+
inertia = Bullet::BtVector3.new()
|
22
|
+
@colObj.calculateLocalInertia(mass, inertia)
|
23
|
+
@rigid_body = Bullet::BtRigidBody.new(mass, self, @colObj, inertia)
|
24
|
+
dynamics_world.addRigidBody(@rigid_body)
|
25
|
+
|
26
|
+
# create a view object.
|
27
|
+
gen = Procedural::BoxGenerator.new()
|
28
|
+
gen.setSizeX(x * 2.0).setSizeY(y * 2.0).setSizeZ(z * 2.0)
|
29
|
+
gen.setNumSegX(1).setNumSegY(1).setNumSegZ(1)
|
30
|
+
gen.setUTile(1.0).setVTile(1.0).realizeMesh(@name)
|
31
|
+
@entity = scene_mgr.createEntity(@name)
|
32
|
+
@entity.setCastShadows(true)
|
33
|
+
@entity.setMaterialName("Examples/BumpyMetal")
|
34
|
+
@scene_node = scene_mgr.getRootSceneNode().createChildSceneNode()
|
35
|
+
@scene_node.attachObject(@entity)
|
36
|
+
|
37
|
+
# position/rotation
|
38
|
+
@transform = Bullet::BtTransform.new()
|
39
|
+
@transform.setIdentity()
|
40
|
+
end
|
41
|
+
|
42
|
+
# called through Bullet::BtMotionState when this rigid_body transform is changed
|
43
|
+
# on bullet simulation step.
|
44
|
+
def setWorldTransform(worldTrans)
|
45
|
+
@transform = Bullet::BtTransform.new(worldTrans)
|
46
|
+
newPos = @transform.getOrigin()
|
47
|
+
newRot = @transform.getRotation()
|
48
|
+
return if (newRot.x.nan?)
|
49
|
+
|
50
|
+
@scene_node.setPosition(newPos.x, newPos.y, newPos.z)
|
51
|
+
@scene_node.setOrientation(newRot.w, newRot.x, newRot.y, newRot.z)
|
52
|
+
end
|
53
|
+
|
54
|
+
# called by Bullet::BtMotionState
|
55
|
+
def getWorldTransform(worldTrans)
|
56
|
+
end
|
57
|
+
|
58
|
+
def set_position(x, y, z)
|
59
|
+
@scene_node.setPosition(x, y, z)
|
60
|
+
@transform.setOrigin(Bullet::BtVector3.new(x, y, z))
|
61
|
+
@rigid_body.setCenterOfMassTransform(@transform)
|
62
|
+
end
|
63
|
+
|
64
|
+
def apply_impulse(imp, rel = Bullet::BtVector3.new(0, 0, 0))
|
65
|
+
@rigid_body.activate(true)
|
66
|
+
@rigid_body.applyImpulse(imp, rel)
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
class CameraMover
|
2
|
+
CS_FREELOOK = 0
|
3
|
+
CS_ORBIT = 1
|
4
|
+
CS_MANUAL = 2
|
5
|
+
CS_TPS = 3
|
6
|
+
|
7
|
+
CAM_HEIGHT = 5.0
|
8
|
+
|
9
|
+
attr_accessor :height
|
10
|
+
attr_accessor :camera_pivot
|
11
|
+
attr_accessor :camera
|
12
|
+
|
13
|
+
def initialize(cam)
|
14
|
+
@camera = cam
|
15
|
+
@camera.setPosition(0, 0, 0)
|
16
|
+
@camera.setNearClipDistance(0.1)
|
17
|
+
|
18
|
+
@style = CS_FREELOOK
|
19
|
+
|
20
|
+
# CS_FREELOOK, CS_ORBIT, CS_MANUAL
|
21
|
+
@sdk_camera_man = OgreBites::SdkCameraMan.new(@camera)
|
22
|
+
@evt_frame = Ogre::FrameEvent.new
|
23
|
+
|
24
|
+
# CS_TPS
|
25
|
+
@height = CAM_HEIGHT
|
26
|
+
@camera_pivot = cam.getSceneManager().getRootSceneNode().createChildSceneNode()
|
27
|
+
@camera_goal = @camera_pivot.createChildSceneNode(Ogre::Vector3.new(0, 0, 5))
|
28
|
+
|
29
|
+
@camera_pivot.setFixedYawAxis(true)
|
30
|
+
@camera_goal.setFixedYawAxis(true)
|
31
|
+
|
32
|
+
@pivot_pitch = 0
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_style(style)
|
37
|
+
@style = style
|
38
|
+
case @style
|
39
|
+
when CS_FREELOOK
|
40
|
+
@sdk_camera_man.setStyle(OgreBites::CS_FREELOOK)
|
41
|
+
when CS_ORBIT
|
42
|
+
@sdk_camera_man.setStyle(OgreBites::CS_ORBIT)
|
43
|
+
else # CS_MANUAL, CS_TPS
|
44
|
+
@sdk_camera_man.setStyle(OgreBites::CS_MANUAL)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_target(target)
|
49
|
+
@target = target
|
50
|
+
if @style == CS_TPS
|
51
|
+
@camera.setAutoTracking(false)
|
52
|
+
@camera.moveRelative(Ogre::Vector3.new(0, 0, 0))
|
53
|
+
update_camera(1.0)
|
54
|
+
else
|
55
|
+
@sdk_camera_man.setTarget(target.pivotSceneNode)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_position(pos)
|
60
|
+
@camera.setPosition(pos) if @style == CS_FREELOOK
|
61
|
+
end
|
62
|
+
|
63
|
+
def look_at(pos)
|
64
|
+
@camera.lookAt(pos) if @style == CS_FREELOOK
|
65
|
+
end
|
66
|
+
|
67
|
+
def set_yaw_pitch_dist(yaw, pitch, dist)
|
68
|
+
@sdk_camera_man.setYawPitchDist(yaw, pitch, dist) if @style == CS_ORBIT
|
69
|
+
end
|
70
|
+
|
71
|
+
def move_forward(bl)
|
72
|
+
evt = OIS::KeyEvent.new(nil, OIS::KC_W, 0)
|
73
|
+
if bl
|
74
|
+
@sdk_camera_man.injectKeyDown(evt)
|
75
|
+
else
|
76
|
+
@sdk_camera_man.injectKeyUp(evt)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def move_backward(bl)
|
81
|
+
evt = OIS::KeyEvent.new(nil, OIS::KC_S, 0)
|
82
|
+
if bl
|
83
|
+
@sdk_camera_man.injectKeyDown(evt)
|
84
|
+
else
|
85
|
+
@sdk_camera_man.injectKeyUp(evt)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def move_left(bl)
|
90
|
+
evt = OIS::KeyEvent.new(nil, OIS::KC_A, 0)
|
91
|
+
if bl
|
92
|
+
@sdk_camera_man.injectKeyDown(evt)
|
93
|
+
else
|
94
|
+
@sdk_camera_man.injectKeyUp(evt)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def move_right(bl)
|
99
|
+
evt = OIS::KeyEvent.new(nil, OIS::KC_D, 0)
|
100
|
+
if bl
|
101
|
+
@sdk_camera_man.injectKeyDown(evt)
|
102
|
+
else
|
103
|
+
@sdk_camera_man.injectKeyUp(evt)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def update(delta)
|
109
|
+
if (@style == CS_TPS)
|
110
|
+
update_camera(delta)
|
111
|
+
else
|
112
|
+
@evt_frame.timeSinceLastFrame = delta
|
113
|
+
@sdk_camera_man.frameRenderingQueued(@evt_frame)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
# This method moves this camera position to the goal position smoothly.
|
119
|
+
# In general, should be called in the frameRenderingQueued handler.
|
120
|
+
#
|
121
|
+
def update_camera(deltaTime)
|
122
|
+
# place the camera pivot roughly at the character's shoulder
|
123
|
+
@camera_pivot.setPosition(@target.get_position() + Ogre::Vector3.UNIT_Y * @height)
|
124
|
+
# move the camera smoothly to the goal
|
125
|
+
goalOffset = @camera_goal._getDerivedPosition() - @camera.getPosition()
|
126
|
+
@camera.move(goalOffset * deltaTime * 9.0)
|
127
|
+
# always look at the pivot
|
128
|
+
@camera.lookAt(@camera_pivot._getDerivedPosition())
|
129
|
+
end
|
130
|
+
|
131
|
+
def mouse_moved(evt)
|
132
|
+
if @style == CS_TPS
|
133
|
+
|
134
|
+
# deal with a warp.
|
135
|
+
if evt.state.X.rel.abs > 300
|
136
|
+
#puts "#{evt.state.X.rel}, #{evt.state.X.abs}"
|
137
|
+
return true
|
138
|
+
end
|
139
|
+
|
140
|
+
update_camera_goal(-0.05 * evt.state.X.rel,
|
141
|
+
-0.05 * evt.state.Y.rel,
|
142
|
+
-0.0005 * evt.state.Z.rel)
|
143
|
+
else
|
144
|
+
@sdk_camera_man.injectMouseMove(evt)
|
145
|
+
end
|
146
|
+
return true
|
147
|
+
end
|
148
|
+
|
149
|
+
#
|
150
|
+
# This method updates the goal position, which this camera should be placed finally.
|
151
|
+
# In general, should be called when the mouse is moved.
|
152
|
+
# *deltaYaw*::_float_, degree value.
|
153
|
+
# *deltaPitch*::_float_, degree value.
|
154
|
+
# *deltaZoom*::_float_, zoom
|
155
|
+
#
|
156
|
+
def update_camera_goal(deltaYaw, deltaPitch, deltaZoom)
|
157
|
+
|
158
|
+
@camera_pivot.yaw(Ogre::Radian.new(Ogre::Degree.new(deltaYaw)), Ogre::Node::TS_WORLD);
|
159
|
+
|
160
|
+
# bound the pitch
|
161
|
+
if (!(@pivot_pitch + deltaPitch > 25 && deltaPitch > 0) &&
|
162
|
+
!(@pivot_pitch + deltaPitch < -60 && deltaPitch < 0))
|
163
|
+
@camera_pivot.pitch(Ogre::Radian.new(Ogre::Degree.new(deltaPitch)), Ogre::Node::TS_LOCAL)
|
164
|
+
@pivot_pitch += deltaPitch;
|
165
|
+
end
|
166
|
+
dist = @camera_goal._getDerivedPosition().distance(@camera_pivot._getDerivedPosition())
|
167
|
+
distChange = deltaZoom * dist;
|
168
|
+
|
169
|
+
# puts "dist: #{dist}:#{distChange}"
|
170
|
+
|
171
|
+
# bound the zoom
|
172
|
+
if (!(dist + distChange < 8 && distChange < 0) &&
|
173
|
+
!(dist + distChange > 25 && distChange > 0))
|
174
|
+
|
175
|
+
@camera_goal.translate(Ogre::Vector3.new(0, 0, distChange), Ogre::Node::TS_LOCAL)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def mouse_pressed(mouseEvent, mouseButtonID)
|
180
|
+
@sdk_camera_man.injectMouseDown(mouseEvent, mouseButtonID) if @style == CS_ORBIT
|
181
|
+
return true
|
182
|
+
end
|
183
|
+
|
184
|
+
def mouse_released(mouseEvent, mouseButtonID)
|
185
|
+
@sdk_camera_man.injectMouseUp(mouseEvent, mouseButtonID) if @style == CS_ORBIT
|
186
|
+
return true
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Floor < Bullet::BtMotionState
|
2
|
+
def initialize(dynamicsWorld, sceneMgr)
|
3
|
+
super()
|
4
|
+
|
5
|
+
x = 10 # width
|
6
|
+
y = 1 # depth
|
7
|
+
z = 10 # height
|
8
|
+
mass = 0.0
|
9
|
+
|
10
|
+
# create a physics object
|
11
|
+
@cshape = Bullet::BtBoxShape.new(Bullet::BtVector3.new(x, 1, z))
|
12
|
+
inertia = Bullet::BtVector3.new()
|
13
|
+
@cshape.calculateLocalInertia(mass, inertia)
|
14
|
+
@rigid_body = Bullet::BtRigidBody.new(mass, self, @cshape, inertia)
|
15
|
+
dynamicsWorld.addRigidBody(@rigid_body)
|
16
|
+
|
17
|
+
# create a floor mesh resource
|
18
|
+
Ogre::MeshManager::getSingleton().createPlane("floor",
|
19
|
+
Ogre::ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME,
|
20
|
+
Ogre::Plane.new(Ogre::Vector3.UNIT_Y, 0),
|
21
|
+
x * 2, z * 2, 10, 10, true, 1, 10, 10,
|
22
|
+
Ogre::Vector3.UNIT_Z)
|
23
|
+
@entity = sceneMgr.createEntity("Floor", "floor")
|
24
|
+
@entity.setMaterialName("Examples/Rockwall")
|
25
|
+
@entity.setCastShadows(false)
|
26
|
+
sceneMgr.getRootSceneNode().attachObject(@entity)
|
27
|
+
|
28
|
+
# set this object's position
|
29
|
+
@transform = Bullet::BtTransform.new()
|
30
|
+
@transform.setIdentity()
|
31
|
+
@transform.setOrigin(Bullet::BtVector3.new(0, -y, 0))
|
32
|
+
@rigid_body.setCenterOfMassTransform(@transform)
|
33
|
+
end
|
34
|
+
|
35
|
+
def setWorldTransform(worldTrans)
|
36
|
+
end
|
37
|
+
|
38
|
+
def getWorldTransform(worldTrans)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/sample/hello/hello
ADDED
@@ -0,0 +1,300 @@
|
|
1
|
+
|
2
|
+
$LOAD_PATH.push(File.dirname(File.expand_path(__FILE__)) + "/../../lib")
|
3
|
+
|
4
|
+
require "Ogre"
|
5
|
+
require "OIS"
|
6
|
+
require "OgreBites"
|
7
|
+
require "Procedural"
|
8
|
+
require "Bullet"
|
9
|
+
|
10
|
+
require "OgreConfig"
|
11
|
+
|
12
|
+
require_relative "ui_listener"
|
13
|
+
require_relative "camera_mover"
|
14
|
+
require_relative "box"
|
15
|
+
require_relative "floor"
|
16
|
+
|
17
|
+
class World < Ogre::FrameListener
|
18
|
+
def initialize()
|
19
|
+
super() # needed by Ogre::FrameListener
|
20
|
+
|
21
|
+
@delta_sum = 0
|
22
|
+
@quit = false
|
23
|
+
@info = {}
|
24
|
+
@info["Help"] =
|
25
|
+
" Use the ESDF keys to move the camera. \n" +
|
26
|
+
" Use the left mouse button to shot a box. \n" +
|
27
|
+
" Press Q to quit."
|
28
|
+
|
29
|
+
$file_path = File.dirname(File.expand_path(__FILE__))
|
30
|
+
|
31
|
+
# physics
|
32
|
+
initPhysics()
|
33
|
+
|
34
|
+
# view
|
35
|
+
initView()
|
36
|
+
end
|
37
|
+
|
38
|
+
def initPhysics()
|
39
|
+
# initialize bullet dynamics world.
|
40
|
+
@collision_config = Bullet::BtDefaultCollisionConfiguration.new();
|
41
|
+
@collision_dispatcher = Bullet::BtCollisionDispatcher.new(@collision_config)
|
42
|
+
world_aabb_min = Bullet::BtVector3.new(-3000.0,-500.0, -3000.0)
|
43
|
+
world_aabb_max = Bullet::BtVector3.new(3000.0, 500.0, 3000.0)
|
44
|
+
max_proxies = 1024 * 4
|
45
|
+
@aabb_cache = Bullet::BtAxisSweep3.new(world_aabb_min, world_aabb_max, max_proxies)
|
46
|
+
@solver = Bullet::BtSequentialImpulseConstraintSolver.new();
|
47
|
+
@dynamics_world = Bullet::BtDiscreteDynamicsWorld.new(@collision_dispatcher, @aabb_cache,
|
48
|
+
@solver, @collision_config)
|
49
|
+
|
50
|
+
gravity = Bullet::BtVector3.new(0.0, -9.8, 0.0)
|
51
|
+
@dynamics_world.setGravity(gravity)
|
52
|
+
end
|
53
|
+
|
54
|
+
def initView()
|
55
|
+
# initialize Root
|
56
|
+
@root = Ogre::Root.new("")
|
57
|
+
|
58
|
+
# load Plugins
|
59
|
+
cfg = Ogre::ConfigFile.new
|
60
|
+
cfg.load("#{$file_path}/plugins.cfg")
|
61
|
+
pluginDir = cfg.getSetting("PluginFolder")
|
62
|
+
pluginDir += "/" if (pluginDir.length > 0) && (pluginDir[-1] != '/')
|
63
|
+
cfg.each_Settings {|secName, keyName, valueName|
|
64
|
+
fullPath = pluginDir + valueName
|
65
|
+
fullPath.sub!("<SystemPluginFolder>", OgreConfig::getPluginFolder)
|
66
|
+
@root.loadPlugin(fullPath) if (keyName == "Plugin")
|
67
|
+
}
|
68
|
+
|
69
|
+
# initialize Resources
|
70
|
+
cfg = Ogre::ConfigFile.new
|
71
|
+
cfg.load("#{$file_path}/resources.cfg")
|
72
|
+
resourceDir = cfg.getSetting("ResourceFolder")
|
73
|
+
resourceDir += "/" if (resourceDir.length > 0) && (resourceDir[-1] != '/')
|
74
|
+
cfg.each_Settings {|secName, keyName, valueName|
|
75
|
+
next if (keyName == "ResourceFolder")
|
76
|
+
fullPath = resourceDir + valueName
|
77
|
+
fullPath.sub!("<SystemResourceFolder>", OgreConfig::getResourceFolder)
|
78
|
+
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(fullPath,
|
79
|
+
keyName,
|
80
|
+
secName)
|
81
|
+
}
|
82
|
+
|
83
|
+
# create a window to draw.
|
84
|
+
return false unless @root.showConfigDialog()
|
85
|
+
@window = @root.initialise(true, "Sinbad")
|
86
|
+
@root.addFrameListener(self)
|
87
|
+
|
88
|
+
# initialize Managers
|
89
|
+
## InputManager
|
90
|
+
windowHnd = Ogre::Intp.new
|
91
|
+
@window.getCustomAttribute("WINDOW", windowHnd)
|
92
|
+
windowHndStr = sprintf("%d", windowHnd.value())
|
93
|
+
pl = OIS::ParamList.new
|
94
|
+
pl["WINDOW"] = windowHndStr
|
95
|
+
@inputManager = OIS::InputManager::createInputSystem(pl)
|
96
|
+
@keyboard = @inputManager.createInputObject(OIS::OISKeyboard, true).toKeyboard()
|
97
|
+
@mouse = @inputManager.createInputObject(OIS::OISMouse, true).toMouse()
|
98
|
+
|
99
|
+
## TrayManager
|
100
|
+
Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("Essential")
|
101
|
+
@tray_mgr = OgreBites::SdkTrayManager.new("Base", @window, @mouse);
|
102
|
+
ms = @mouse.getMouseState()
|
103
|
+
ms.width = @window.getWidth()
|
104
|
+
ms.height = @window.getHeight()
|
105
|
+
|
106
|
+
## SceneMgr
|
107
|
+
@sceneMgr = @root.createSceneManager(Ogre::ST_GENERIC)
|
108
|
+
@sceneMgr.setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE)
|
109
|
+
|
110
|
+
# initialize Listeners
|
111
|
+
@keyListener = KeyListener.new(self)
|
112
|
+
@keyboard.setEventCallback(@keyListener)
|
113
|
+
|
114
|
+
@mouseListener = MouseListener.new(self)
|
115
|
+
@mouse.setEventCallback(@mouseListener)
|
116
|
+
|
117
|
+
@trayListener = TrayListener.new(self)
|
118
|
+
@tray_mgr.setListener(@trayListener)
|
119
|
+
|
120
|
+
# initialize Camera
|
121
|
+
@camera = @sceneMgr.createCamera("FixCamera")
|
122
|
+
# Create one viewport, entire window
|
123
|
+
@vp = @window.addViewport(@camera);
|
124
|
+
@vp.setBackgroundColour(Ogre::ColourValue.new(0, 0, 0))
|
125
|
+
# Alter the camera aspect ratio to match the viewport
|
126
|
+
@camera.setAspectRatio(Float(@vp.getActualWidth()) / Float(@vp.getActualHeight()))
|
127
|
+
|
128
|
+
# load "General" group resources into ResourceGroupManager.
|
129
|
+
@tray_mgr.showLoadingBar(1, 0)
|
130
|
+
Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("General")
|
131
|
+
@tray_mgr.hideLoadingBar()
|
132
|
+
Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5)
|
133
|
+
|
134
|
+
@tray_mgr.showFrameStats(OgreBites::TL_BOTTOMLEFT)
|
135
|
+
@tray_mgr.showLogo(OgreBites::TL_BOTTOMRIGHT)
|
136
|
+
@tray_mgr.hideCursor()
|
137
|
+
end
|
138
|
+
|
139
|
+
def run
|
140
|
+
# set background and some fog
|
141
|
+
@vp.setBackgroundColour(Ogre::ColourValue.new(1.0, 1.0, 0.8))
|
142
|
+
@sceneMgr.setFog(Ogre::FOG_LINEAR, Ogre::ColourValue.new(1.0, 1.0, 0.8), 0, 15, 100)
|
143
|
+
|
144
|
+
# set shadow properties
|
145
|
+
@sceneMgr.setShadowTechnique(Ogre::SHADOWTYPE_TEXTURE_MODULATIVE)
|
146
|
+
@sceneMgr.setShadowColour(Ogre::ColourValue.new(0.5, 0.5, 0.5))
|
147
|
+
@sceneMgr.setShadowTextureSize(1024)
|
148
|
+
@sceneMgr.setShadowTextureCount(1)
|
149
|
+
|
150
|
+
# use a small amount of ambient lighting
|
151
|
+
@sceneMgr.setAmbientLight(Ogre::ColourValue.new(0.3, 0.3, 0.3))
|
152
|
+
|
153
|
+
# add a bright light above the scene
|
154
|
+
@light = @sceneMgr.createLight()
|
155
|
+
@light.setType(Ogre::Light::LT_POINT)
|
156
|
+
@light.setPosition(-10, 40, 20)
|
157
|
+
@light.setSpecularColour(Ogre::ColourValue.White)
|
158
|
+
|
159
|
+
@camera_mover = CameraMover.new(@camera)
|
160
|
+
@camera_mover.set_position(Ogre::Vector3.new(20, 10, 20))
|
161
|
+
@camera_mover.look_at(Ogre::Vector3.new(0, 10, 0))
|
162
|
+
|
163
|
+
items = []
|
164
|
+
items.push("Help")
|
165
|
+
@help = @tray_mgr.createParamsPanel(OgreBites::TL_TOPLEFT, "HelpMessage", 100, items)
|
166
|
+
@help.setParamValue(Ogre::UTFString.new("Help"), Ogre::UTFString.new("H / F1"))
|
167
|
+
|
168
|
+
# creates objects
|
169
|
+
@floor = Floor.new(@dynamics_world, @sceneMgr)
|
170
|
+
|
171
|
+
@boxes = []
|
172
|
+
11.times {|x|
|
173
|
+
3.times {|y|
|
174
|
+
box = Box.new(@dynamics_world, @sceneMgr, 1.0, 1, 1, 1, 'blue')
|
175
|
+
box.set_position(-10 + x * 2, 5 + y * 2, 0)
|
176
|
+
@boxes.push(box)
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
@root.startRendering()
|
181
|
+
end
|
182
|
+
|
183
|
+
def shot_box()
|
184
|
+
cam_pos_ogre = @camera.getPosition()
|
185
|
+
cam_dir_ogre = @camera.getDirection()
|
186
|
+
|
187
|
+
cam_pos = Bullet::BtVector3.new(cam_pos_ogre.x, cam_pos_ogre.y, cam_pos_ogre.z)
|
188
|
+
cam_dir = Bullet::BtVector3.new(cam_dir_ogre.x, cam_dir_ogre.y, cam_dir_ogre.z)
|
189
|
+
|
190
|
+
box = Box.new(@dynamics_world, @sceneMgr, 1.0, 1, 1, 1, 'grey')
|
191
|
+
box_pos = cam_pos + (cam_dir * 5.0)
|
192
|
+
box.set_position(box_pos.x, box_pos.y, box_pos.z)
|
193
|
+
|
194
|
+
force = cam_dir * Bullet::BtVector3.new(100.0, 100.0, 100.0)
|
195
|
+
box.apply_impulse(force)
|
196
|
+
|
197
|
+
@boxes.push(box)
|
198
|
+
end
|
199
|
+
|
200
|
+
#
|
201
|
+
# Event handlers
|
202
|
+
#
|
203
|
+
|
204
|
+
# implementation of Ogre::FrameListener interface.
|
205
|
+
def frameRenderingQueued(evt)
|
206
|
+
# update bullet(physics)
|
207
|
+
@dynamics_world.stepSimulation(evt.timeSinceLastFrame)
|
208
|
+
|
209
|
+
# update ogre3d(view)
|
210
|
+
@keyboard.capture()
|
211
|
+
@mouse.capture()
|
212
|
+
@tray_mgr.frameRenderingQueued(evt)
|
213
|
+
|
214
|
+
# update model
|
215
|
+
@camera_mover.update(evt.timeSinceLastFrame)
|
216
|
+
|
217
|
+
@delta_sum += evt.timeSinceLastFrame
|
218
|
+
# create a new box per 3sec.
|
219
|
+
if (@delta_sum > 3.0)
|
220
|
+
box = Box.new(@dynamics_world, @sceneMgr, 1.0, 1, 1, 1, 'orange')
|
221
|
+
box.set_position(-10 + ((box.id - 1) % 11) * 2, 20, 0)
|
222
|
+
@boxes.push(box)
|
223
|
+
@delta_sum = 0
|
224
|
+
end
|
225
|
+
|
226
|
+
return !@quit
|
227
|
+
end
|
228
|
+
|
229
|
+
def key_pressed(keyEvent)
|
230
|
+
case keyEvent.key
|
231
|
+
when OIS::KC_ESCAPE
|
232
|
+
@quit =true
|
233
|
+
when OIS::KC_H, OIS::KC_F1
|
234
|
+
if (!@tray_mgr.isDialogVisible() && @info["Help"] != "")
|
235
|
+
@tray_mgr.showOkDialog(Ogre::UTFString.new("Help"), Ogre::UTFString.new(@info["Help"]))
|
236
|
+
else
|
237
|
+
@tray_mgr.closeDialog()
|
238
|
+
end
|
239
|
+
|
240
|
+
when OIS::KC_E
|
241
|
+
@camera_mover.move_forward(true)
|
242
|
+
when OIS::KC_D
|
243
|
+
@camera_mover.move_backward(true)
|
244
|
+
when OIS::KC_S
|
245
|
+
@camera_mover.move_left(true)
|
246
|
+
when OIS::KC_F
|
247
|
+
@camera_mover.move_right(true)
|
248
|
+
end
|
249
|
+
|
250
|
+
return true
|
251
|
+
end
|
252
|
+
|
253
|
+
def key_released(keyEvent)
|
254
|
+
case keyEvent.key
|
255
|
+
when OIS::KC_ESCAPE
|
256
|
+
@quit =true
|
257
|
+
when OIS::KC_E
|
258
|
+
@camera_mover.move_forward(false)
|
259
|
+
when OIS::KC_D
|
260
|
+
@camera_mover.move_backward(false)
|
261
|
+
when OIS::KC_S
|
262
|
+
@camera_mover.move_left(false)
|
263
|
+
when OIS::KC_F
|
264
|
+
@camera_mover.move_right(false)
|
265
|
+
end
|
266
|
+
|
267
|
+
return true
|
268
|
+
end
|
269
|
+
|
270
|
+
def mouse_moved(mouseEvent)
|
271
|
+
return true if @tray_mgr.injectMouseMove(mouseEvent)
|
272
|
+
@camera_mover.mouse_moved(mouseEvent)
|
273
|
+
return true
|
274
|
+
end
|
275
|
+
|
276
|
+
def mouse_pressed(mouseEvent, mouseButtonID)
|
277
|
+
return true if @tray_mgr.injectMouseDown(mouseEvent, mouseButtonID)
|
278
|
+
@camera_mover.mouse_pressed(mouseEvent, mouseButtonID)
|
279
|
+
|
280
|
+
if (mouseButtonID == OIS::MB_Left)
|
281
|
+
shot_box()
|
282
|
+
end
|
283
|
+
|
284
|
+
return true
|
285
|
+
end
|
286
|
+
|
287
|
+
def mouse_released(mouseEvent, mouseButtonID)
|
288
|
+
return true if @tray_mgr.injectMouseUp(mouseEvent, mouseButtonID)
|
289
|
+
@camera_mover.mouse_released(mouseEvent, mouseButtonID)
|
290
|
+
return true
|
291
|
+
end
|
292
|
+
|
293
|
+
def ok_dialog_closed(name)
|
294
|
+
return true
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
|
299
|
+
world = World.new()
|
300
|
+
world.run
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Defines plugins to load
|
2
|
+
|
3
|
+
# Define plugin folder
|
4
|
+
PluginFolder=<SystemPluginFolder>
|
5
|
+
|
6
|
+
# Define plugins
|
7
|
+
# Plugin=RenderSystem_Direct3D9
|
8
|
+
# Plugin=RenderSystem_Direct3D10
|
9
|
+
# Plugin=RenderSystem_Direct3D11
|
10
|
+
Plugin=RenderSystem_GL
|
11
|
+
# Plugin=RenderSystem_GLES
|
12
|
+
Plugin=Plugin_ParticleFX
|
13
|
+
Plugin=Plugin_BSPSceneManager
|
14
|
+
Plugin=Plugin_CgProgramManager
|
15
|
+
Plugin=Plugin_PCZSceneManager
|
16
|
+
Plugin=Plugin_OctreeZone
|
17
|
+
Plugin=Plugin_OctreeSceneManager
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Resources required by the sample browser and most samples.
|
2
|
+
ResourceFolder=<SystemResourceFolder>
|
3
|
+
|
4
|
+
[Essential]
|
5
|
+
Zip=packs/SdkTrays.zip
|
6
|
+
|
7
|
+
# Resource locations to be added to the default path
|
8
|
+
[General]
|
9
|
+
Zip=packs/skybox.zip
|
10
|
+
Zip=packs/Sinbad.zip
|
11
|
+
FileSystem=fonts
|
12
|
+
FileSystem=models/
|
13
|
+
FileSystem=materials/scripts/
|
14
|
+
FileSystem=materials/textures/
|
15
|
+
FileSystem=materials/textures/nvidia/
|
16
|
+
FileSystem=materials/programs/
|
17
|
+
FileSystem=particle
|
18
|
+
FileSystem=DeferredShadingMedia
|
19
|
+
FileSystem=PCZAppMedia
|
20
|
+
FileSystem=RTShaderLib
|
21
|
+
FileSystem=RTShaderLib/materials
|
22
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#
|
2
|
+
# Key Listener
|
3
|
+
#
|
4
|
+
class KeyListener < OIS::KeyListener
|
5
|
+
def initialize(listener)
|
6
|
+
super()
|
7
|
+
@listener = listener
|
8
|
+
end
|
9
|
+
|
10
|
+
def keyPressed(keyEvent)
|
11
|
+
return @listener.key_pressed(keyEvent)
|
12
|
+
end
|
13
|
+
|
14
|
+
def keyReleased(keyEvent)
|
15
|
+
return @listener.key_released(keyEvent)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# Mouse Listener
|
21
|
+
#
|
22
|
+
class MouseListener < OIS::MouseListener
|
23
|
+
def initialize(listener)
|
24
|
+
super()
|
25
|
+
@listener = listener
|
26
|
+
end
|
27
|
+
|
28
|
+
def mouseMoved(evt)
|
29
|
+
return @listener.mouse_moved(evt)
|
30
|
+
end
|
31
|
+
|
32
|
+
def mousePressed(mouseEvent, mouseButtonID)
|
33
|
+
return @listener.mouse_pressed(mouseEvent, mouseButtonID)
|
34
|
+
end
|
35
|
+
|
36
|
+
def mouseReleased(mouseEvent, mouseButtonID)
|
37
|
+
return @listener.mouse_released(mouseEvent, mouseButtonID)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# Tray Listener
|
43
|
+
#
|
44
|
+
class TrayListener < OgreBites::SdkTrayListener
|
45
|
+
def initialize(listener)
|
46
|
+
super()
|
47
|
+
@listener = listener
|
48
|
+
end
|
49
|
+
|
50
|
+
def buttonHit(button)
|
51
|
+
@listener.button_hit(button)
|
52
|
+
end
|
53
|
+
|
54
|
+
def itemSelected(menu)
|
55
|
+
@listener.item_selected(menu)
|
56
|
+
end
|
57
|
+
|
58
|
+
def yesNoDialogClosed(name, bl)
|
59
|
+
@listener.yes_no_dialog_closed(name, bl)
|
60
|
+
end
|
61
|
+
|
62
|
+
def okDialogClosed(name)
|
63
|
+
@listener.ok_dialog_closed(name)
|
64
|
+
end
|
65
|
+
end
|
data/teienlib.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: teienlib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: x86-linux
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-09-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ruby-ogre
|
16
|
-
requirement: &
|
16
|
+
requirement: &76100680 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *76100680
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ruby-bullet
|
27
|
-
requirement: &
|
27
|
+
requirement: &76100330 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *76100330
|
36
36
|
description: An extension library for Teien.
|
37
37
|
email:
|
38
38
|
- abexsoft@gmail.com
|
@@ -68,6 +68,15 @@ files:
|
|
68
68
|
- ext/teienlib/src/MeshStrider.h
|
69
69
|
- ext/teienlib/src/Vector3D.h
|
70
70
|
- ext/teienlib/src/DebugDrawer.h
|
71
|
+
- sample/hello/floor.rb
|
72
|
+
- sample/hello/ui_listener.rb
|
73
|
+
- sample/hello/hello.rb
|
74
|
+
- sample/hello/box.rb
|
75
|
+
- sample/hello/camera_mover.rb
|
76
|
+
- sample/hello/ogre.cfg
|
77
|
+
- sample/hello/resources.cfg
|
78
|
+
- sample/hello/plugins.cfg
|
79
|
+
- sample/hello/hello
|
71
80
|
- lib/teienlib/version.rb
|
72
81
|
- lib/Teienlib.so
|
73
82
|
- lib/teienlib.rb
|