stride3d/stride · error · NotImplementedException

SoftBody processing is not yet available

Error message

SoftBody processing is not yet available

What it means

Stride's Simulation constructor maps PhysicsEngineFlags.SoftBodySupport to the creation of a Bullet soft-rigid dynamics world, but that code path was never implemented — the relevant lines are commented out and the constructor throws NotImplementedException. Requesting soft body support always fails.

Solutions

  1. Remove PhysicsEngineFlags.SoftBodySupport from the PhysicsEngineFlags in your PhysicsConfiguration
  2. Simulate soft bodies with rigid-body composites or other workarounds (e.g. many connected rigid colliders)
  3. Wait for/implement soft body support in the Stride.Physics engine binding (uncomment and complete the SoftRigidDynamicsWorld setup)

Example fix

// before
var config = new PhysicsConfiguration { Flags = PhysicsEngineFlags.SoftBodySupport };
var simulation = new Simulation(scene, config); // throws
// after
var config = new PhysicsConfiguration { Flags = PhysicsEngineFlags.DiscreteDynamicsWorld };
var simulation = new Simulation(scene, config);
Defensive patterns

Strategy: validation

Validate before calling

if (configuration.Flags.HasFlag(PhysicsEngineFlags.SoftBodySupport))
    throw new NotSupportedException("Stride does not implement SoftBody processing; remove the flag.");

Try / catch

try
{
    simulation = new Simulation(scene, configuration);
}
catch (NotImplementedException ex) when (ex.Message.Contains("SoftBody"))
{
    // retry without SoftBodySupport flag
    configuration.Flags &= ~PhysicsEngineFlags.SoftBodySupport;
    simulation = new Simulation(scene, configuration);
}

Prevention

When it happens

Trigger: Creating a Simulation (or running the Stride physics engine) with a PhysicsConfiguration whose Flags include PhysicsEngineFlags.SoftBodySupport.

Common situations: Enabling soft-body physics (cloth, ropes, deformables) via the physics engine flags; copying configuration from projects or Bullet samples that assumed soft body support exists in Stride.

Related errors


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/48a237286c84aa14. Report an issue: GitHub.

Appendix: source

Thrown at sources/engine/Stride.Physics/Simulation.cs:130

            dispatcher.RegisterCollisionCreateFunc(BulletSharp.BroadphaseNativeType.Convex2DShape, BulletSharp.BroadphaseNativeType.Convex2DShape, convexAlgo);
            //dispatcher.RegisterCollisionCreateFunc(BulletSharp.BroadphaseNativeType.Box2DShape, BulletSharp.BroadphaseNativeType.Convex2DShape, convexAlgo);
            //dispatcher.RegisterCollisionCreateFunc(BulletSharp.BroadphaseNativeType.Convex2DShape, BulletSharp.BroadphaseNativeType.Box2DShape, convexAlgo);
            //dispatcher.RegisterCollisionCreateFunc(BulletSharp.BroadphaseNativeType.Box2DShape, BulletSharp.BroadphaseNativeType.Box2DShape, new BulletSharp.Box2DBox2DCollisionAlgorithm.CreateFunc());
            //~2D pipeline

            //default solver
            var solver = new BulletSharp.SequentialImpulseConstraintSolver();

            if (configuration.Flags.HasFlag(PhysicsEngineFlags.CollisionsOnly))
            {
                collisionWorld = new BulletSharp.CollisionWorld(dispatcher, broadphase, collisionConfiguration);
            }
            else if (configuration.Flags.HasFlag(PhysicsEngineFlags.SoftBodySupport))
            {
                //mSoftRigidDynamicsWorld = new BulletSharp.SoftBody.SoftRigidDynamicsWorld(mDispatcher, mBroadphase, solver, mCollisionConf);
                //mDiscreteDynamicsWorld = mSoftRigidDynamicsWorld;
                //mCollisionWorld = mSoftRigidDynamicsWorld;
                throw new NotImplementedException("SoftBody processing is not yet available");
            }
            else
            {
                discreteDynamicsWorld = new BulletSharp.DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
                discreteDynamicsWorld.Gravity = configuration.Gravity;
                collisionWorld = discreteDynamicsWorld;
            }

            if (discreteDynamicsWorld != null)
            {
                solverInfo = discreteDynamicsWorld.SolverInfo; //we are required to keep this reference, or the GC will mess up
                dispatchInfo = discreteDynamicsWorld.DispatchInfo;

                solverInfo.SolverMode |= BulletSharp.SolverModes.CacheFriendly; //todo test if helps with performance or not

                if (configuration.Flags.HasFlag(PhysicsEngineFlags.ContinuousCollisionDetection))
                {
                    CanCcd = true;

View on GitHub (pinned to 96fad776d2)