// Select the connection to the actual Bullet implementation. // The main engine selection is the engineName up to the first hypen. // So "Bullet-2.80-OpenCL-Intel" specifies the 'bullet' class here and the whole name // is passed to the engine to do its special selection, etc. BSAPITemplate SelectUnderlyingBulletEngine(string engineName) { // For the moment, do a simple switch statement. // Someday do fancyness with looking up the interfaces in the assembly. BSAPITemplate ret = null; string selectionName = engineName.ToLower(); int hyphenIndex = engineName.IndexOf("-"); if (hyphenIndex > 0) { selectionName = engineName.ToLower().Substring(0, hyphenIndex - 1); } switch (selectionName) { case "bulletunmanaged": ret = new BSAPIUnman(engineName, this); break; case "bulletxna": ret = new BSAPIXNA(engineName, this); break; } if (ret == null) { MainConsole.Instance.ErrorFormat( "{0} COULD NOT SELECT BULLET ENGINE: '[BulletSim]PhysicsEngine' must be either 'BulletUnmanaged-*' or 'BulletXNA-*'", LogHeader); } else { //MainConsole.Instance.WarnFormat("{0} Selected bullet engine {1} -> {2}/{3}", LogHeader, engineName, // ret.BulletEngineName, ret.BulletEngineVersion); MainConsole.Instance.WarnFormat("{0} Selected bullet engine {1} -> {2}", LogHeader, engineName, ret.BulletEngineVersion); } return(ret); }
public override void Initialize(IMesher meshmerizer, IScene scene) { Scene = scene; mesher = meshmerizer; _taintOperations = new List<TaintCallbackEntry>(); _postTaintOperations = new Dictionary<string, TaintCallbackEntry>(); _postStepOperations = new List<TaintCallbackEntry>(); PhysObjects = new Dictionary<uint, BSPhysObject>(); Shapes = new BSShapeCollection(this); // some identifiers RegionName = scene.RegionInfo.RegionName; PhysicsSceneName = RegionName; // Allocate pinned memory to pass parameters. UnmanagedParams = new ConfigurationParameters[1]; // Set default values for physics parameters plus any overrides from the ini file GetInitialParameterValues(scene.Config); // Get the connection to the physics engine (could be native or one of many DLLs) PE = SelectUnderlyingBulletEngine(BulletEngineName); // Enable very detailed logging. // By creating an empty logger when not logging, the log message invocation code // can be left in and every call doesn't have to check for null. /*if (m_physicsLoggingEnabled) { PhysicsLogging = new Logging.LogWriter(m_physicsLoggingDir, m_physicsLoggingPrefix, m_physicsLoggingFileMinutes); PhysicsLogging.ErrorLogger = m_log; // for DEBUG. Let's the logger output error messages. } else { PhysicsLogging = new Logging.LogWriter(); }*/ // Allocate memory for returning of the updates and collisions from the physics engine m_collisionArray = new CollisionDesc[m_maxCollisionsPerFrame]; m_updateArray = new EntityProperties[m_maxUpdatesPerFrame]; // The bounding box for the simulated world. The origin is 0,0,0 unless we're // a child in a mega-region. // Bullet actually doesn't care about the extents of the simulated // area. It tracks active objects no matter where they are. Vector3 worldExtent = new Vector3(scene.RegionInfo.RegionSizeX, scene.RegionInfo.RegionSizeX, Constants.RegionHeight); // Vector3 worldExtent = regionExtent; World = PE.Initialize(worldExtent, Params, m_maxCollisionsPerFrame, ref m_collisionArray, m_maxUpdatesPerFrame, ref m_updateArray); Constraints = new BSConstraintCollection(World); TerrainManager = new BSTerrainManager(this); TerrainManager.CreateInitialGroundPlaneAndTerrain(); MainConsole.Instance.WarnFormat("{0} Linksets implemented with {1}", LogHeader, (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation); InTaintTime = false; m_initialized = true; }
public override void Initialize(IMesher meshmerizer, IScene scene) { Scene = scene; mesher = meshmerizer; _taintOperations = new List <TaintCallbackEntry>(); _postTaintOperations = new Dictionary <string, TaintCallbackEntry>(); _postStepOperations = new List <TaintCallbackEntry>(); PhysObjects = new Dictionary <uint, BSPhysObject>(); Shapes = new BSShapeCollection(this); // some identifiers RegionName = scene.RegionInfo.RegionName; PhysicsSceneName = RegionName; // Allocate pinned memory to pass parameters. UnmanagedParams = new ConfigurationParameters[1]; // Set default values for physics parameters plus any overrides from the ini file GetInitialParameterValues(scene.Config); // Get the connection to the physics engine (could be native or one of many DLLs) PE = SelectUnderlyingBulletEngine(BulletEngineName); if (PE == null) { MainConsole.Instance.Error("[BSScene]: Unable to select underlyin bullet engine!"); return; } // Enable very detailed logging. // By creating an empty logger when not logging, the log message invocation code // can be left in and every call doesn't have to check for null. /*if (m_physicsLoggingEnabled) * { * PhysicsLogging = new Logging.LogWriter(m_physicsLoggingDir, m_physicsLoggingPrefix, m_physicsLoggingFileMinutes); * PhysicsLogging.ErrorLogger = m_log; // for DEBUG. Let's the logger output error messages. * } * else * { * PhysicsLogging = new Logging.LogWriter(); * }*/ // Allocate memory for returning of the updates and collisions from the physics engine m_collisionArray = new CollisionDesc[m_maxCollisionsPerFrame]; m_updateArray = new EntityProperties[m_maxUpdatesPerFrame]; // The bounding box for the simulated world. The origin is 0,0,0 unless we're // a child in a mega-region. // Bullet actually doesn't care about the extents of the simulated // area. It tracks active objects no matter where they are. Vector3 worldExtent = new Vector3(scene.RegionInfo.RegionSizeX, scene.RegionInfo.RegionSizeX, Constants.RegionHeight); // Vector3 worldExtent = regionExtent; World = PE.Initialize(worldExtent, Params, m_maxCollisionsPerFrame, ref m_collisionArray, m_maxUpdatesPerFrame, ref m_updateArray); Constraints = new BSConstraintCollection(World); TerrainManager = new BSTerrainManager(this); TerrainManager.CreateInitialGroundPlaneAndTerrain(); MainConsole.Instance.WarnFormat("{0} Linksets implemented with {1}", LogHeader, (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation); InTaintTime = false; m_initialized = true; }