Controller::Controller(const ControllerResource* cr, SceneGraph& sg, UnitId id, PxPhysics* physics, PxControllerManager* manager) : m_resource(cr) , m_scene_graph(sg) , _unit_id(id) , m_manager(manager) , m_controller(NULL) { TransformInstance ti = sg.get(id); const Vector3 pos = sg.world_position(ti); PxCapsuleControllerDesc desc; desc.climbingMode = PxCapsuleClimbingMode::eCONSTRAINED; desc.nonWalkableMode = PxCCTNonWalkableMode::eFORCE_SLIDING; desc.radius = cr->radius; desc.height = cr->height; desc.slopeLimit = cos(cr->slope_limit); desc.stepOffset = cr->step_offset; desc.contactOffset = cr->contact_offset; desc.upDirection = PxVec3(0.0, 1.0, 0.0); desc.material = physics->createMaterial(0.5f, 0.5f, 0.5f); desc.position = PxExtendedVec3(pos.x, pos.y, pos.z); desc.reportCallback = &m_callback; CE_ASSERT(desc.isValid(), "Capsule is not valid"); m_controller = manager->createController(desc); CE_ASSERT(m_controller, "Failed to create controller"); }