@@ -874,3 +874,113 @@ class Kinematic : public Sample
874874};
875875
876876static int sampleKinematic = RegisterSample( " Bodies" , " Kinematic" , Kinematic::Create );
877+
878+ // Motion locking can be a bit squishy
879+ class MixedLocks : public Sample
880+ {
881+ public:
882+ explicit MixedLocks ( SampleContext* context )
883+ : Sample( context )
884+ {
885+ if ( m_context->restart == false )
886+ {
887+ m_context->camera .m_center = { 0 .0f , 2 .5f };
888+ m_context->camera .m_zoom = 3 .5f ;
889+ }
890+
891+ {
892+ b2BodyDef bodyDef = b2DefaultBodyDef ();
893+ b2BodyId groundId = b2CreateBody ( m_worldId, &bodyDef );
894+
895+ b2ShapeDef shapeDef = b2DefaultShapeDef ();
896+ b2Segment segment = { { -40.0 , 0 .0f }, { 40 .0f , 0 .0f } };
897+ b2CreateSegmentShape ( groundId, &shapeDef, &segment );
898+ }
899+
900+ b2Polygon box = b2MakeSquare ( 0 .5f );
901+ b2ShapeDef shapeDef = b2DefaultShapeDef ();
902+
903+ {
904+ b2BodyDef bodyDef = b2DefaultBodyDef ();
905+ bodyDef.position = { 2 .0f , 1 .0f };
906+ bodyDef.name = " static" ;
907+
908+ b2BodyId bodyId = b2CreateBody ( m_worldId, &bodyDef );
909+ b2CreatePolygonShape ( bodyId, &shapeDef, &box );
910+ }
911+
912+ {
913+ b2BodyDef bodyDef = b2DefaultBodyDef ();
914+ bodyDef.type = b2_dynamicBody;
915+ bodyDef.position = { 1 .0f , 1 .0f };
916+ bodyDef.name = " free" ;
917+
918+ b2BodyId bodyId = b2CreateBody ( m_worldId, &bodyDef );
919+ b2CreatePolygonShape ( bodyId, &shapeDef, &box );
920+ }
921+
922+ {
923+ b2BodyDef bodyDef = b2DefaultBodyDef ();
924+ bodyDef.type = b2_dynamicBody;
925+ bodyDef.position = { 1 .0f , 3 .0f };
926+ bodyDef.name = " free" ;
927+
928+ b2BodyId bodyId = b2CreateBody ( m_worldId, &bodyDef );
929+ b2CreatePolygonShape ( bodyId, &shapeDef, &box );
930+ }
931+
932+ {
933+ b2BodyDef bodyDef = b2DefaultBodyDef ();
934+ bodyDef.type = b2_dynamicBody;
935+ bodyDef.position = { -1 .0f , 1 .0f };
936+ bodyDef.motionLocks .angularZ = true ;
937+ bodyDef.name = " angular z" ;
938+
939+ b2BodyId bodyId = b2CreateBody ( m_worldId, &bodyDef );
940+ b2CreatePolygonShape ( bodyId, &shapeDef, &box );
941+ }
942+
943+ {
944+ b2BodyDef bodyDef = b2DefaultBodyDef ();
945+ bodyDef.type = b2_dynamicBody;
946+ bodyDef.position = { -2 .0f , 2 .0f };
947+ bodyDef.motionLocks .linearX = true ;
948+ bodyDef.name = " linear x" ;
949+
950+ b2BodyId bodyId = b2CreateBody ( m_worldId, &bodyDef );
951+ b2CreatePolygonShape ( bodyId, &shapeDef, &box );
952+ }
953+
954+ {
955+ b2BodyDef bodyDef = b2DefaultBodyDef ();
956+ bodyDef.type = b2_dynamicBody;
957+ bodyDef.position = { -1 .0f , 2 .5f };
958+ bodyDef.motionLocks .linearY = true ;
959+ bodyDef.motionLocks .angularZ = true ;
960+ bodyDef.name = " lin y ang z" ;
961+
962+ b2BodyId bodyId = b2CreateBody ( m_worldId, &bodyDef );
963+ b2CreatePolygonShape ( bodyId, &shapeDef, &box );
964+ }
965+
966+ {
967+ b2BodyDef bodyDef = b2DefaultBodyDef ();
968+ bodyDef.type = b2_dynamicBody;
969+ bodyDef.position = { 0 .0f , 1 .0f };
970+ bodyDef.motionLocks .linearX = true ;
971+ bodyDef.motionLocks .linearY = true ;
972+ bodyDef.motionLocks .angularZ = true ;
973+ bodyDef.name = " full" ;
974+
975+ b2BodyId bodyId = b2CreateBody ( m_worldId, &bodyDef );
976+ b2CreatePolygonShape ( bodyId, &shapeDef, &box );
977+ }
978+ }
979+
980+ static Sample* Create ( SampleContext* context )
981+ {
982+ return new MixedLocks ( context );
983+ }
984+ };
985+
986+ static int sampleMixedLocks = RegisterSample( " Bodies" , " Mixed Locks" , MixedLocks::Create );
0 commit comments