protected btSolverBody getOrInitSolverBody( btCollisionObject body, double timeStep ) { btSolverBody solverBodyA = null; if( body.getCompanionBody() != null ) { //body has already been converted solverBodyA = body.getCompanionBody(); //Debug.Assert( solverBodyIdA < m_tmpSolverBodyPool.Count ); } else { btRigidBody rb = btRigidBody.upcast( body ); //convert both active and kinematic objects (for their velocity) if( rb != null && ( rb.getInvMass() != 0 || rb.isKinematicObject() ) ) { //solverBodyA = m_tmpSolverBodyPool.Count; //btSolverBody solverBodyA; m_tmpSolverBodyPool.Add( solverBodyA = BulletGlobals.SolverBodyPool.Get() ); initSolverBody( solverBodyA, rb, timeStep ); body.setCompanionBody( solverBodyA ); } else { if( m_fixedBody == null ) { //m_fixedBodyId = m_tmpSolverBodyPool.Count; //btSolverBody fixedBody; m_tmpSolverBodyPool.Add( m_fixedBody = BulletGlobals.SolverBodyPool.Get() ); initSolverBody( m_fixedBody, null, timeStep ); } return m_fixedBody; // return 0;//assume first one is a fixed solver body } } return solverBodyA; }