// 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); // Very detailed logging for physics debugging 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); // 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); } } }
public static object Initialize2(Vector3 worldExtent, ConfigurationParameters[] o, int mMaxCollisionsPerFrame, ref List<BulletXNA.CollisionDesc> collisionArray, int mMaxUpdatesPerFrame, ref List<BulletXNA.EntityProperties> updateArray, object mDebugLogCallbackHandle) { CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData(); p.angularDamping = o[0].XangularDamping; 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 = o[0].XlinearDamping; p.angularDamping = o[0].XangularDamping; p.deactivationTime = o[0].XdeactivationTime; p.linearSleepingThreshold = o[0].XlinearSleepingThreshold; p.angularSleepingThreshold = o[0].XangularSleepingThreshold; p.ccdMotionThreshold = o[0].XccdMotionThreshold; p.ccdSweptSphereRadius = o[0].XccdSweptSphereRadius; p.contactProcessingThreshold = o[0].XcontactProcessingThreshold; p.terrainImplementation = o[0].XterrainImplementation; p.terrainFriction = o[0].XterrainFriction; p.terrainHitFraction = o[0].XterrainHitFraction; p.terrainRestitution = o[0].XterrainRestitution; p.terrainCollisionMargin = o[0].XterrainCollisionMargin; p.avatarFriction = o[0].XavatarFriction; p.avatarStandingFriction = o[0].XavatarStandingFriction; p.avatarDensity = o[0].XavatarDensity; p.avatarRestitution = o[0].XavatarRestitution; p.avatarCapsuleWidth = o[0].XavatarCapsuleWidth; p.avatarCapsuleDepth = o[0].XavatarCapsuleDepth; p.avatarCapsuleHeight = o[0].XavatarCapsuleHeight; p.avatarContactProcessingThreshold = o[0].XavatarContactProcessingThreshold; p.vehicleAngularDamping = o[0].XvehicleAngularDamping; 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 = o[0].XlinksetImplementation; p.linkConstraintUseFrameOffset = o[0].XlinkConstraintUseFrameOffset; p.linkConstraintEnableTransMotor = o[0].XlinkConstraintEnableTransMotor; p.linkConstraintTransMotorMaxVel = o[0].XlinkConstraintTransMotorMaxVel; p.linkConstraintTransMotorMaxForce = o[0].XlinkConstraintTransMotorMaxForce; p.linkConstraintERP = o[0].XlinkConstraintERP; p.linkConstraintCFM = o[0].XlinkConstraintCFM; p.linkConstraintSolverIterations = o[0].XlinkConstraintSolverIterations; 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.UpdatedObjects = updateArray; world.UpdatedCollisions = collisionArray; 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); world.SetGravity(new IndexedVector3(0,0,p.gravity)); return world; }
// This is where all the default material attributes are defined. public static void InitializeFromDefaults(ConfigurationParameters parms) { // Values from http://wiki.secondlife.com/wiki/PRIM_MATERIAL float dDensity = parms.defaultDensity; float dFriction = parms.defaultFriction; float dRestitution = parms.defaultRestitution; Attributes[(int)MaterialAttributes.Material.Stone] = new MaterialAttributes("stone",dDensity, 0.8f, 0.4f); Attributes[(int)MaterialAttributes.Material.Metal] = new MaterialAttributes("metal",dDensity, 0.3f, 0.4f); Attributes[(int)MaterialAttributes.Material.Glass] = new MaterialAttributes("glass",dDensity, 0.2f, 0.7f); Attributes[(int)MaterialAttributes.Material.Wood] = new MaterialAttributes("wood",dDensity, 0.6f, 0.5f); Attributes[(int)MaterialAttributes.Material.Flesh] = new MaterialAttributes("flesh",dDensity, 0.9f, 0.3f); Attributes[(int)MaterialAttributes.Material.Plastic] = new MaterialAttributes("plastic",dDensity, 0.4f, 0.7f); Attributes[(int)MaterialAttributes.Material.Rubber] = new MaterialAttributes("rubber",dDensity, 0.9f, 0.9f); Attributes[(int)MaterialAttributes.Material.Light] = new MaterialAttributes("light",dDensity, dFriction, dRestitution); Attributes[(int)MaterialAttributes.Material.Avatar] = new MaterialAttributes("avatar",3.5f, 0.2f, 0f); Attributes[(int)MaterialAttributes.Material.Stone + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("stonePhysical",dDensity, 0.8f, 0.4f); Attributes[(int)MaterialAttributes.Material.Metal + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("metalPhysical",dDensity, 0.3f, 0.4f); Attributes[(int)MaterialAttributes.Material.Glass + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("glassPhysical",dDensity, 0.2f, 0.7f); Attributes[(int)MaterialAttributes.Material.Wood + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("woodPhysical",dDensity, 0.6f, 0.5f); Attributes[(int)MaterialAttributes.Material.Flesh + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("fleshPhysical",dDensity, 0.9f, 0.3f); Attributes[(int)MaterialAttributes.Material.Plastic + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("plasticPhysical",dDensity, 0.4f, 0.7f); Attributes[(int)MaterialAttributes.Material.Rubber + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("rubberPhysical",dDensity, 0.9f, 0.9f); Attributes[(int)MaterialAttributes.Material.Light + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("lightPhysical",dDensity, dFriction, dRestitution); Attributes[(int)MaterialAttributes.Material.Avatar + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("avatarPhysical",3.5f, 0.2f, 0f); }