29 void PhysxController::
32 nassertv(_error_type == ET_ok);
36 cm->releaseController(*ptr());
43 factory(NxControllerType controllerType) {
45 switch (controllerType) {
47 case NX_CONTROLLER_BOX:
50 case NX_CONTROLLER_CAPSULE:
57 physx_cat.error() <<
"Unknown controller type.\n";
68 nassertr(_error_type == ET_ok,
nullptr);
69 return (
PhysxActor *)(ptr()->getActor()->userData);
79 nassertv(_error_type == ET_ok);
89 nassertr(_error_type == ET_ok, LPoint3f::zero());
102 nassertv(_error_type == ET_ok);
103 nassertv(sharpness > 0.0f);
104 nassertv(sharpness <= 1.0f);
106 _sharpness = sharpness;
116 nassertr(_error_type == ET_ok, 0.0f);
126 nassertv(_error_type == ET_ok);
127 ptr()->setCollision(enable);
139 nassertv(_error_type == ET_ok);
140 nassertv(min_dist > 0.0f);
142 _min_dist = min_dist;
151 nassertv(_error_type == ET_ok);
152 nassertv(offset > 0.0f);
154 ptr()->setStepOffset(offset);
163 nassertv(_error_type == ET_ok);
164 nassertv_always(!speed.is_nan());
166 _speed = NxVec3(speed.get_x(), speed.get_y(), speed.get_z());
175 nassertv(_error_type == ET_ok);
176 nassertv_always(!speed.is_nan());
181 NxQuat q = ptr()->getActor()->getGlobalOrientationQuat();
182 NxVec3 s = NxVec3(speed.get_x(), speed.get_y(), speed.get_z());
183 _speed = (q * _up_quat_inv).rot(s);
194 nassertv(_error_type == ET_ok);
204 set_h(
float heading) {
206 nassertv(_error_type == ET_ok);
209 NxQuat q(_heading, _up_vector);
210 ptr()->getActor()->moveGlobalOrientationQuat(_up_quat * q);
219 nassertr(_error_type == ET_ok, 0.0f);
231 nassertv(_error_type == ET_ok);
232 ptr()->reportSceneChanged();
238 void PhysxController::
239 update_controller(
float dt) {
241 nassertv(_error_type == ET_ok);
244 NxU32 mask = 0xFFFFFFFF;
245 NxU32 collision_flags;
248 ptr()->getActor()->getScene().getGravity(gravity);
250 NxVec3 d = (_speed + gravity) * dt;
252 NxReal heightDelta = get_jump_height(dt, gravity);
253 if (heightDelta != 0.0f) {
254 ((_up_axis == NX_Z) ? d.z : d.y) += heightDelta;
257 ptr()->move(d, mask, _min_dist, collision_flags, _sharpness);
259 if (collision_flags & NXCC_COLLISION_DOWN) {
264 if (_omega != 0.0f) {
265 NxReal delta = _omega * dt;
267 NxQuat q(_heading, _up_vector);
268 ptr()->getActor()->moveGlobalOrientationQuat(_up_quat * q);
279 NxReal PhysxController::
280 get_jump_height(
float dt, NxVec3 &gravity) {
282 if (_jumping ==
false) {
288 float G = (_up_axis == NX_Z) ? gravity.z : gravity.y;
289 float h = 2.0f * G * _jump_time * _jump_time + _jump_v0 * _jump_time;
300 nassertv(_error_type == ET_ok);
302 if (_jumping ==
true) {
318 nassertv(_error_type == ET_ok);
320 if (_jumping ==
false) {
329 Event *
event =
new Event(
"physx-controller-down");