// Initialization and simulation
 public abstract BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
                                             int maxCollisions, ref CollisionDesc[] collisionArray,
                                             int maxUpdates, ref EntityProperties[] updateArray
                                             );
Exemplo n.º 2
0
        // Initialization and simulation
        public override BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
                                                    int maxCollisions, ref CollisionDesc[] collisionArray,
                                                    int maxUpdates, ref EntityProperties[] updateArray
                                                    )
        {
            // Pin down the memory that will be used to pass object collisions and updates back from unmanaged code
            m_paramsHandle = GCHandle.Alloc(parms, GCHandleType.Pinned);
            m_collisionArrayPinnedHandle = GCHandle.Alloc(collisionArray, GCHandleType.Pinned);
            m_updateArrayPinnedHandle = GCHandle.Alloc(updateArray, GCHandleType.Pinned);

            // If Debug logging level, enable logging from the unmanaged code
            m_DebugLogCallbackHandle = null;
            if (MainConsole.Instance.IsDebugEnabled)
            {
                MainConsole.Instance.DebugFormat("{0}: Initialize: Setting debug callback for unmanaged code", BSScene.LogHeader);
                //if (PhysicsScene.PhysicsLogging.Enabled)
                // The handle is saved in a variable to make sure it doesn't get freed after this call
                //    m_DebugLogCallbackHandle = new BSAPICPP.DebugLogCallback(BulletLoggerPhysLog);
                //else
                m_DebugLogCallbackHandle = new BSAPICPP.DebugLogCallback(BulletLogger);
            }

            // Get the version of the DLL
            // TODO: this doesn't work yet. Something wrong with marshaling the returned string.
            // BulletEngineVersion = BulletSimAPI.GetVersion2();
            BulletEngineVersion = "";

            // Call the unmanaged code with the buffers and other information
            return new BulletWorldUnman(0, PhysicsScene, BSAPICPP.Initialize2(maxPosition, m_paramsHandle.AddrOfPinnedObject(),
                                            maxCollisions, m_collisionArrayPinnedHandle.AddrOfPinnedObject(),
                                            maxUpdates, m_updateArrayPinnedHandle.AddrOfPinnedObject(),
                                            m_DebugLogCallbackHandle));
        }
Exemplo n.º 3
0
        public override BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
                                            int maxCollisions, ref CollisionDesc[] collisionArray,
                                            int maxUpdates, ref EntityProperties[] updateArray
                                            )
        {
            UpdatedObjects = updateArray;
            UpdatedCollisions = collisionArray;
            /* TODO */
            ConfigurationParameters[] configparms = new ConfigurationParameters[1];
            configparms[0] = parms;
            Vector3 worldExtent = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight);
            m_maxCollisions = maxCollisions;
            m_maxUpdatesPerFrame = maxUpdates;
            specialCollisionObjects = new Dictionary<uint, GhostObject>();

            return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null));
        }
Exemplo n.º 4
0
        private static DiscreteDynamicsWorld Initialize2(Vector3 worldExtent, 
                        ConfigurationParameters[] o,
                        int mMaxCollisionsPerFrame, ref CollisionDesc[] collisionArray,
                        int mMaxUpdatesPerFrame, ref EntityProperties[] updateArray, 
                        object mDebugLogCallbackHandle)
        {
            CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData();

            p.angularDamping = BSParam.AngularDamping;
            p.defaultFriction = o[0].defaultFriction;
            p.defaultFriction = o[0].defaultFriction;
            p.defaultDensity = o[0].defaultDensity;
            p.defaultRestitution = o[0].defaultRestitution;
            p.collisionMargin = o[0].collisionMargin;
            p.gravity = o[0].gravity;

            p.linearDamping = BSParam.LinearDamping;
            p.angularDamping = BSParam.AngularDamping;
            p.deactivationTime = BSParam.DeactivationTime;
            p.linearSleepingThreshold = BSParam.LinearSleepingThreshold;
            p.angularSleepingThreshold = BSParam.AngularSleepingThreshold;
            p.ccdMotionThreshold = BSParam.CcdMotionThreshold;
            p.ccdSweptSphereRadius = BSParam.CcdSweptSphereRadius;
            p.contactProcessingThreshold = BSParam.ContactProcessingThreshold;

            p.terrainImplementation = BSParam.TerrainImplementation;
            p.terrainFriction = BSParam.TerrainFriction;

            p.terrainHitFraction = BSParam.TerrainHitFraction;
            p.terrainRestitution = BSParam.TerrainRestitution;
            p.terrainCollisionMargin = BSParam.TerrainCollisionMargin;

            p.avatarFriction = BSParam.AvatarFriction;
            p.avatarStandingFriction = BSParam.AvatarStandingFriction;
            p.avatarDensity = BSParam.AvatarDensity;
            p.avatarRestitution = BSParam.AvatarRestitution;
            p.avatarCapsuleWidth = BSParam.AvatarCapsuleWidth;
            p.avatarCapsuleDepth = BSParam.AvatarCapsuleDepth;
            p.avatarCapsuleHeight = BSParam.AvatarCapsuleHeight;
            p.avatarContactProcessingThreshold = BSParam.AvatarContactProcessingThreshold;

            p.vehicleAngularDamping = BSParam.VehicleAngularDamping;

            p.maxPersistantManifoldPoolSize = o[0].maxPersistantManifoldPoolSize;
            p.maxCollisionAlgorithmPoolSize = o[0].maxCollisionAlgorithmPoolSize;
            p.shouldDisableContactPoolDynamicAllocation = o[0].shouldDisableContactPoolDynamicAllocation;
            p.shouldForceUpdateAllAabbs = o[0].shouldForceUpdateAllAabbs;
            p.shouldRandomizeSolverOrder = o[0].shouldRandomizeSolverOrder;
            p.shouldSplitSimulationIslands = o[0].shouldSplitSimulationIslands;
            p.shouldEnableFrictionCaching = o[0].shouldEnableFrictionCaching;
            p.numberOfSolverIterations = o[0].numberOfSolverIterations;

            p.linksetImplementation = BSParam.LinksetImplementation;
            p.linkConstraintUseFrameOffset = BSParam.NumericBool(BSParam.LinkConstraintUseFrameOffset);
            p.linkConstraintEnableTransMotor = BSParam.NumericBool(BSParam.LinkConstraintEnableTransMotor);
            p.linkConstraintTransMotorMaxVel = BSParam.LinkConstraintTransMotorMaxVel;
            p.linkConstraintTransMotorMaxForce = BSParam.LinkConstraintTransMotorMaxForce;
            p.linkConstraintERP = BSParam.LinkConstraintERP;
            p.linkConstraintCFM = BSParam.LinkConstraintCFM;
            p.linkConstraintSolverIterations = BSParam.LinkConstraintSolverIterations;
            p.physicsLoggingFrames = o[0].physicsLoggingFrames;
            DefaultCollisionConstructionInfo ccci = new DefaultCollisionConstructionInfo();

            DefaultCollisionConfiguration cci = new DefaultCollisionConfiguration();
            CollisionDispatcher m_dispatcher = new CollisionDispatcher(cci);

            if (p.maxPersistantManifoldPoolSize > 0)
            cci.m_persistentManifoldPoolSize = (int)p.maxPersistantManifoldPoolSize;
            if (p.shouldDisableContactPoolDynamicAllocation !=0)
            m_dispatcher.SetDispatcherFlags(DispatcherFlags.CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION);
            //if (p.maxCollisionAlgorithmPoolSize >0 )

            DbvtBroadphase m_broadphase = new DbvtBroadphase();
            //IndexedVector3 aabbMin = new IndexedVector3(0, 0, 0);
            //IndexedVector3 aabbMax = new IndexedVector3(256, 256, 256);

            //AxisSweep3Internal m_broadphase2 = new AxisSweep3Internal(ref aabbMin, ref aabbMax, Convert.ToInt32(0xfffe), 0xffff, ushort.MaxValue/2, null, true);
            m_broadphase.GetOverlappingPairCache().SetInternalGhostPairCallback(new GhostPairCallback());

            SequentialImpulseConstraintSolver m_solver = new SequentialImpulseConstraintSolver();

            DiscreteDynamicsWorld world = new DiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, cci);

            world.LastCollisionDesc = 0;
            world.LastEntityProperty = 0;

            world.WorldSettings.Params = p;
            world.SetForceUpdateAllAabbs(p.shouldForceUpdateAllAabbs != 0);
            world.GetSolverInfo().m_solverMode = SolverMode.SOLVER_USE_WARMSTARTING | SolverMode.SOLVER_SIMD;
            if (p.shouldRandomizeSolverOrder != 0)
            world.GetSolverInfo().m_solverMode |= SolverMode.SOLVER_RANDMIZE_ORDER;

            world.GetSimulationIslandManager().SetSplitIslands(p.shouldSplitSimulationIslands != 0);
            //world.GetDispatchInfo().m_enableSatConvex Not implemented in C# port

            if (p.shouldEnableFrictionCaching != 0)
            world.GetSolverInfo().m_solverMode |= SolverMode.SOLVER_ENABLE_FRICTION_DIRECTION_CACHING;

            if (p.numberOfSolverIterations > 0)
            world.GetSolverInfo().m_numIterations = (int) p.numberOfSolverIterations;

            world.GetSolverInfo().m_damping = world.WorldSettings.Params.linearDamping;
            world.GetSolverInfo().m_restitution = world.WorldSettings.Params.defaultRestitution;
            world.GetSolverInfo().m_globalCfm = 0.0f;
            world.GetSolverInfo().m_tau = 0.6f;
            world.GetSolverInfo().m_friction = 0.3f;
            world.GetSolverInfo().m_maxErrorReduction = 20f;
            world.GetSolverInfo().m_numIterations = 10;
            world.GetSolverInfo().m_erp = 0.2f;
            world.GetSolverInfo().m_erp2 = 0.1f;
            world.GetSolverInfo().m_sor = 1.0f;
            world.GetSolverInfo().m_splitImpulse = false;
            world.GetSolverInfo().m_splitImpulsePenetrationThreshold = -0.02f;
            world.GetSolverInfo().m_linearSlop = 0.0f;
            world.GetSolverInfo().m_warmstartingFactor = 0.85f;
            world.GetSolverInfo().m_restingContactRestitutionThreshold = 2;
            world.SetForceUpdateAllAabbs(true);

            //BSParam.TerrainImplementation = 0;
            world.SetGravity(new IndexedVector3(0,0,p.gravity));

            return world;
        }
Exemplo n.º 5
0
        // All default parameter values are set here. There should be no values set in the
        // variable definitions.
        private void GetInitialParameterValues(IConfigSource config)
        {
            ConfigurationParameters parms = new ConfigurationParameters();
            UnmanagedParams[0] = parms;

            BSParam.SetParameterDefaultValues(this);

            if (config != null)
            {
            // If there are specifications in the ini file, use those values
            IConfig pConfig = config.Configs["BulletSim"];
            if (pConfig != null)
            {
                BSParam.SetParameterConfigurationValues(this, pConfig);

                // There are two Bullet implementations to choose from
                BulletEngineName = pConfig.GetString("BulletEngine", "BulletUnmanaged");

                // Very detailed logging for physics debugging
                // TODO: the boolean values can be moved to the normal parameter processing.
                m_physicsLoggingEnabled = pConfig.GetBoolean("PhysicsLoggingEnabled", false);
                m_physicsLoggingDir = pConfig.GetString("PhysicsLoggingDir", ".");
                m_physicsLoggingPrefix = pConfig.GetString("PhysicsLoggingPrefix", "physics-%REGIONNAME%-");
                m_physicsLoggingFileMinutes = pConfig.GetInt("PhysicsLoggingFileMinutes", 5);
                m_physicsLoggingDoFlush = pConfig.GetBoolean("PhysicsLoggingDoFlush", false);
                m_physicsPhysicalDumpEnabled = pConfig.GetBoolean("PhysicsPhysicalDumpEnabled", false);
                // Very detailed logging for vehicle debugging
                VehicleLoggingEnabled = pConfig.GetBoolean("VehicleLoggingEnabled", false);
                VehiclePhysicalLoggingEnabled = pConfig.GetBoolean("VehiclePhysicalLoggingEnabled", false);

                // Do any replacements in the parameters
                m_physicsLoggingPrefix = m_physicsLoggingPrefix.Replace("%REGIONNAME%", RegionName);
            }

            // The material characteristics.
            BSMaterials.InitializeFromDefaults(Params);
            if (pConfig != null)
            {
                // Let the user add new and interesting material property values.
                BSMaterials.InitializefromParameters(pConfig);
            }
            }
        }