Class: Teien::BaseObject

Inherits:
Bullet::BtMotionState
  • Object
show all
Includes:
Dispatcher
Defined in:
lib/teien/base_object/base_object.rb

Constant Summary collapse

MODE_FREE =
0
MODE_ATTACHED =
1

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Dispatcher

#notify, #notify_reversely, #register_receiver

Constructor Details

#initializeBaseObject

Returns a new instance of BaseObject.



27
28
29
30
31
32
33
34
35
36
# File 'lib/teien/base_object/base_object.rb', line 27

def initialize()
  super()
  @id = -1
  @mode = MODE_FREE
  @attached_objects = Hash.new

  @manager = nil
  @physics_object = nil
#    @animation_info = Animation.new
end

Instance Attribute Details

#attached_objectsObject

Returns the value of attribute attached_objects.



19
20
21
# File 'lib/teien/base_object/base_object.rb', line 19

def attached_objects
  @attached_objects
end

#idObject

object ID



12
13
14
# File 'lib/teien/base_object/base_object.rb', line 12

def id
  @id
end

#managerObject

Returns the value of attribute manager.



21
22
23
# File 'lib/teien/base_object/base_object.rb', line 21

def manager
  @manager
end

#modeObject

Returns the value of attribute mode.



14
15
16
# File 'lib/teien/base_object/base_object.rb', line 14

def mode
  @mode
end

#nameObject

Returns the value of attribute name.



13
14
15
# File 'lib/teien/base_object/base_object.rb', line 13

def name
  @name
end

#object_infoObject

Returns the value of attribute object_info.



16
17
18
# File 'lib/teien/base_object/base_object.rb', line 16

def object_info
  @object_info
end

#physics_infoObject

Returns the value of attribute physics_info.



17
18
19
# File 'lib/teien/base_object/base_object.rb', line 17

def physics_info
  @physics_info
end

#physics_objectObject

Returns the value of attribute physics_object.



22
23
24
# File 'lib/teien/base_object/base_object.rb', line 22

def physics_object
  @physics_object
end

Instance Method Details

#apply_impulse(imp, rel = Vector3D.new(0, 0, 0)) ⇒ Object



226
227
228
229
# File 'lib/teien/base_object/base_object.rb', line 226

def apply_impulse(imp, rel = Vector3D.new(0, 0, 0))
  @physics_object.rigid_body.activate(true)
  @physics_object.rigid_body.apply_impulse(imp, rel)
end

#attach_object_to_bone(bone_name, obj, offset_quat = Quaternion.new(1, 0, 0, 0), offset_pos = Vector3D.new(0, 0, 0)) ⇒ Object



252
253
254
255
256
257
258
# File 'lib/teien/base_object/base_object.rb', line 252

def attach_object_to_bone(bone_name, obj, 
                          offset_quat = Quaternion.new(1, 0, 0, 0), 
                          offset_pos = Vector3D.new(0, 0, 0))

  attached_objects[bone_name] = AttachmentInfo.new(bone_name, obj.name, offset_quat, offset_pos)
  obj.mode = MODE_ATTACHED
end

#finalizeObject



38
39
40
41
# File 'lib/teien/base_object/base_object.rb', line 38

def finalize()
  notify(:finalize)
  @physics_object.finalize()
end

#get_accelerationObject



191
192
193
# File 'lib/teien/base_object/base_object.rb', line 191

def get_acceleration()
  return @physics_object.acceleration
end

#get_activation_stateObject



162
163
164
# File 'lib/teien/base_object/base_object.rb', line 162

def get_activation_state()
  @physics_object.rigid_body.get_activation_state()
end

#get_angular_velocityObject



187
188
189
# File 'lib/teien/base_object/base_object.rb', line 187

def get_angular_velocity()
  return @physics_object.rigid_body.get_angular_velocity()
end

#get_collision_maskObject



174
175
176
# File 'lib/teien/base_object/base_object.rb', line 174

def get_collision_mask()
  @physics_object.rigid_body.get_broadphase_handle().m_collisionFilterMask
end

#get_gravityObject



195
196
197
# File 'lib/teien/base_object/base_object.rb', line 195

def get_gravity()
  return @physics_object.rigid_body.get_gravity()
end

#get_inv_massObject



170
171
172
# File 'lib/teien/base_object/base_object.rb', line 170

def get_inv_mass()
  return @physics_object.rigid_body.get_inv_mass()
end

#get_linear_velocityObject



183
184
185
# File 'lib/teien/base_object/base_object.rb', line 183

def get_linear_velocity()
  return @physics_object.rigid_body.get_linear_velocity()
end

#get_massObject



166
167
168
# File 'lib/teien/base_object/base_object.rb', line 166

def get_mass()
  return 1.0 / @physics_object.rigid_body.get_inv_mass()
end

#get_orientationObject



203
204
205
# File 'lib/teien/base_object/base_object.rb', line 203

def get_orientation()
  return @physics_object.transform.get_rotation()
end

#get_positionObject



178
179
180
181
# File 'lib/teien/base_object/base_object.rb', line 178

def get_position()
  newPos = @physics_object.transform.get_origin()
  return newPos
end

#get_rotationObject



199
200
201
# File 'lib/teien/base_object/base_object.rb', line 199

def get_rotation()
  return @physics_object.transform.get_rotation()
end

#get_world_transform(worldTrans) ⇒ Object



158
159
160
# File 'lib/teien/base_object/base_object.rb', line 158

def get_world_transform(worldTrans)
#    puts "getWorldTransform"
end

#limit_velocity(vel) ⇒ Object



207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/teien/base_object/base_object.rb', line 207

def limit_velocity(vel)
  newVel = Bullet::BtVector3.new(vel.x, vel.y, vel.z)

  hLen = Math::sqrt(vel.x * vel.x + vel.z * vel.z)
  if (@physics_object.maxHorizontalVelocity != 0 && hLen > @physics_object.maxHorizontalVelocity)
    newVel.x = vel.x / hLen * @physics_object.maxHorizontalVelocity
    newVel.z = vel.z / hLen * @physics_object.maxHorizontalVelocity
  end

  vLen = vel.y
  if (@physics_object.maxVerticalVelocity != 0 && vLen > @physics_object.maxVerticalVelocity)
    newVel.y = @physics_object.maxVerticalVelocity
  end

#    puts "newVel: (#{newVel.x}, #{newVel.y}, #{newVel.z})"
  
  return newVel
end

#rotate(quat) ⇒ Object



239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/teien/base_object/base_object.rb', line 239

def rotate(quat)
  qnorm = Quaternion.new()
  qnorm.copy(quat)
  qnorm.normalize()
  transform = @physics_object.rigid_body.get_center_of_mass_transform()
  curRot = transform.get_rotation()
  @newRot = curRot * qnorm
  transform.set_rotation(@newRot)
  @physics_object.rigid_body.set_center_of_mass_transform(transform)

  notify(:set_rotation, @newRot)
end

#set_acceleration(acc) ⇒ Object

Set the object’s acceleration.



115
116
117
# File 'lib/teien/base_object/base_object.rb', line 115

def set_acceleration(acc)
  @physics_object.acceleration = acc
end

#set_activation_state(state) ⇒ Object



43
44
45
# File 'lib/teien/base_object/base_object.rb', line 43

def set_activation_state(state)
  @physics_object.rigid_body.set_activation_state(state)
end

#set_angular_velocity(vel) ⇒ Object

Set an angular velocity.

Args

vel: Vector3D


87
88
89
90
# File 'lib/teien/base_object/base_object.rb', line 87

def set_angular_velocity(vel)
  @physics_object.rigid_body.activate(true)
  @physics_object.rigid_body.set_angular_velocity(vel)
end

#set_angular_velocity_with_interpolation(vel) ⇒ Object



92
93
94
95
96
# File 'lib/teien/base_object/base_object.rb', line 92

def set_angular_velocity_with_interpolation(vel)
  @physics_object.rigid_body.activate(true)
  ip_vel = (get_angular_velocity() + Vector3D.to_bullet(vel)) / 2
  @physics_object.rigid_body.set_angular_velocity(ip_vel)
end

#set_collision_filter(filter) ⇒ Object



145
146
147
148
149
# File 'lib/teien/base_object/base_object.rb', line 145

def set_collision_filter(filter)
  @manager.physics.dynamicsWorld.remove_rigid_body(@physics_object.rigid_body)
  @manager.physics.dynamicsWorld.add_rigid_body(@physics_object.rigid_body, filter.group, filter.mask)
  physics_info.collisionFilter = filter
end

#set_damping(linear_damping, angular_damping) ⇒ Object



123
124
125
126
127
128
# File 'lib/teien/base_object/base_object.rb', line 123

def set_damping(linear_damping, angular_damping)
  @physics_object.rigid_body.set_damping(linear_damping, angular_damping)
  @physics_info.linear_damping = linear_damping
  @physics_info.angular_damping = angular_damping
  # notify?
end

#set_gravity(grav) ⇒ Object



119
120
121
# File 'lib/teien/base_object/base_object.rb', line 119

def set_gravity(grav)
  @physics_object.rigid_body.set_gravity(grav)
end

#set_linear_velocity(aVel) ⇒ Object

Set a linear velocity.

Args

aVel: Vector3D


72
73
74
75
# File 'lib/teien/base_object/base_object.rb', line 72

def set_linear_velocity(aVel)
  @physics_object.rigid_body.activate(true)
  @physics_object.rigid_body.set_linear_velocity(aVel)
end

#set_linear_velocity_with_interpolation(vel) ⇒ Object



77
78
79
80
81
# File 'lib/teien/base_object/base_object.rb', line 77

def set_linear_velocity_with_interpolation(vel)
  ip_vel = (get_linear_velocity() + Vector3D.to_bullet(vel)) / 2
  @physics_object.rigid_body.activate(true)
  @physics_object.rigid_body.set_linear_velocity(ip_vel)
end

#set_max_horizontal_velocity(vel_len) ⇒ Object

Set a max horizontal velocity.

Args

vel: Vector3D

vel is the max velocity. 0 means there is no limit.



102
103
104
# File 'lib/teien/base_object/base_object.rb', line 102

def set_max_horizontal_velocity(vel_len)
  @physics_object.maxHorizontalVelocity = vel_len
end

#set_max_vertical_velocity(vel_le) ⇒ Object

Set a max vertical velocity.

Args

vel: Vector3D

vel is the max velocity. 0 means there is no limit.



110
111
112
# File 'lib/teien/base_object/base_object.rb', line 110

def set_max_vertical_velocity(vel_le)
  @physics_object.maxVerticalVelocity = vel_len
end

#set_position(aPos) ⇒ Object

Set a position.

Args

aPos: Vector3D


51
52
53
54
55
56
57
58
# File 'lib/teien/base_object/base_object.rb', line 51

def set_position(aPos)
  @physics_object.transform.set_origin(Bullet::BtVector3.new(aPos.x, aPos.y, aPos.z))
  if @physics_object.rigid_body != nil
    @physics_object.rigid_body.set_center_of_mass_transform(@physics_object.transform) 
  end

  notify(:set_position, aPos)
end

#set_position_with_interpolation(pos) ⇒ Object



60
61
62
63
64
65
66
# File 'lib/teien/base_object/base_object.rb', line 60

def set_position_with_interpolation(pos)
  ip_pos = (get_position() + Vector3D.to_bullet(pos)) / 2
  @physics_object.transform.set_origin(ip_pos)
  if @physics_object.rigid_body != nil
    @physics_object.rigid_body.set_center_of_mass_transform(@physics_object.transform) 
  end
end

#set_rotation(quad) ⇒ Object



130
131
132
133
134
135
# File 'lib/teien/base_object/base_object.rb', line 130

def set_rotation(quad)
  @physics_object.rigid_body.activate(true)
  @physics_object.transform = @physics_object.rigid_body.get_center_of_mass_transform()
  @physics_object.transform.set_rotation(quad)
  @physics_object.rigid_body.set_center_of_mass_transform(@physics_object.transform)
end

#set_rotation_with_interpolation(quad) ⇒ Object



137
138
139
140
141
142
143
# File 'lib/teien/base_object/base_object.rb', line 137

def set_rotation_with_interpolation(quad)
  @physics_object.rigid_body.activate(true)
  ip_quad = get_rotation().slerp(Quaternion.to_bullet(quad), 0.5)
  @physics_object.transform = @physics_object.rigid_body.get_center_of_mass_transform()
  @physics_object.transform.set_rotation(ip_quad)
  @physics_object.rigid_body.set_center_of_mass_transform(@physics_object.transform)
end

#set_world_transform(worldTrans) ⇒ Object



151
152
153
154
155
156
# File 'lib/teien/base_object/base_object.rb', line 151

def set_world_transform(worldTrans)
#    @physics_object.transform = Bullet::BtTransform.new(worldTrans) if (@mode == MODE_FREE)
  @physics_object.transform = Bullet::BtTransform.new(worldTrans)

  notify(:set_world_transform, @physics_object.transform)
end

#yaw(angle) ⇒ Object

def yaw(angle, relativeTo=Ogre::Node::TS_LOCAL)



235
236
237
# File 'lib/teien/base_object/base_object.rb', line 235

def yaw(angle)
  rotate(Quaternion.new(Vector3D.new(0, 1.0, 0), angle))
end