public void Clear() { size_of_obj = (uint)Marshal.SizeOf <crn_comp_params>(); file_type = crn_file_type.FileTypeCRN; faces = 1; width = 0; height = 0; levels = 1; format = crn_format.DXT1; flags = crn_comp_flags.Perceptual | crn_comp_flags.UseBothBlockTypes; images = new IntPtr[Constants.MAX_FACES, Constants.MAX_LEVELS]; target_bitrate = 0f; quality_level = Constants.MAX_QUALITY_LEVEL; dxt1_alpha_threshold = 128; dxt_quality = crn_dxt_quality.QualityUber; dxt_compressor_type = crn_dxt_compressor_type.CompressorCRN; alpha_component = 3; crn_adaptive_tile_color_psnr_derating = 2; crn_adaptive_tile_alpha_psnr_derating = 2; crn_color_endpoint_palette_size = 0; crn_color_selector_palette_size = 0; crn_alpha_endpoint_palette_size = 0; crn_alpha_selector_palette_size = 0; num_helper_threads = 0; userdata0 = 0; userdata1 = 0; progress_func = IntPtr.Zero; progress_func_data = IntPtr.Zero; }
private static IntPtr HitTestNCA(IntPtr hWnd) { // Get the point coordinates for the hit test. //POINT ptMouse = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; Point ptMouse = Control.MousePosition; // Get the window rectangle. RECT rcWindow = new RECT(); NativeMethods.GetWindowRect(hWnd, ref rcWindow); // this.Handle // Get the frame rectangle, adjusted for the style without a caption. RECT rcFrame = new RECT(); NativeMethods.AdjustWindowRectEx(ref rcFrame, WindowStyles.OVERLAPPEDWINDOW & ~WindowStyles.CAPTION, false, 0); // The last is supposed to be NULL // Determine if the hit test is for resizing. Default middle (1,1). int uRow = 1; int uCol = 1; //bool fOnResizeBorder = false; // Determine if the point is at the left or right of the window. if (ptMouse.X >= rcWindow.Left && ptMouse.X < rcWindow.Left + EDGEGRIPWIDTH) { uCol = 0; // left side } else if (ptMouse.X < rcWindow.Right && ptMouse.X >= rcWindow.Right - EDGEGRIPWIDTH) { uCol = 2; // right side } // Determine if the point is at the top or bottom of the window. if (ptMouse.Y >= rcWindow.Top && ptMouse.Y < rcWindow.Top + TOPEXTENDWIDTH) { if (ptMouse.Y < (rcWindow.Top - rcFrame.Top)) { uRow = 0; } else if (uCol == 1) { return(NCHITTEST.CAPTION); } } else if (ptMouse.Y < rcWindow.Bottom && ptMouse.Y >= rcWindow.Bottom - EDGEGRIPWIDTH) { uRow = 2; } IntPtr[,] hitTests = { { NCHITTEST.TOPLEFT, NCHITTEST.TOP, NCHITTEST.TOPRIGHT }, { NCHITTEST.LEFT, NCHITTEST.NOWHERE, NCHITTEST.RIGHT }, { NCHITTEST.BOTTOMLEFT, NCHITTEST.BOTTOM, NCHITTEST.BOTTOMRIGHT } }; return(hitTests[uRow, uCol]); }
public override void PostInitialize(IConfigSource config) { m_rayCastManager = new ODERayCastRequestManager(this); m_config = config; PID_D = 2200.0f; PID_P = 900.0f; if (m_config != null) { IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; if (physicsconfig != null) { gravityx = physicsconfig.GetFloat("world_gravityx", 0f); gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); //Set the vectors as well gravityVector = new Vector3(gravityx, gravityy, gravityz); gravityVectorNormalized = gravityVector; gravityVectorNormalized.Normalize(); AvDecayTime = physicsconfig.GetFloat("avDecayTime", AvDecayTime); AllowUnderwaterPhysics = physicsconfig.GetBoolean("useUnderWaterPhysics", false); AllowAvGravity = physicsconfig.GetBoolean("useAvGravity", true); AvGravityHeight = physicsconfig.GetInt("avGravityHeight", 4096); AllowAvsToEscapeGravity = physicsconfig.GetBoolean("aviesCanEscapeGravity", true); m_AvFlySpeed = physicsconfig.GetFloat("AvFlySpeed", m_AvFlySpeed); m_allowJump = physicsconfig.GetBoolean("AllowJump", m_allowJump); m_usepreJump = physicsconfig.GetBoolean("UsePreJump", m_usepreJump); m_preJumpTime = physicsconfig.GetInt("PreJumpTime", m_preJumpTime); m_preJumpForceMultiplierX = physicsconfig.GetFloat("PreJumpMultiplierX", m_preJumpForceMultiplierX); m_preJumpForceMultiplierY = physicsconfig.GetFloat("PreJumpMultiplierY", m_preJumpForceMultiplierY); m_preJumpForceMultiplierZ = physicsconfig.GetFloat("PreJumpMultiplierZ", m_preJumpForceMultiplierZ); contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", 0.001f); AvatarContactBounce = physicsconfig.GetFloat("AvatarContactBounce", AvatarContactBounce); FrictionMovementMultiplier = physicsconfig.GetFloat("FrictionMovementMultiplier", FrictionMovementMultiplier); FrictionScale = physicsconfig.GetFloat("FrictionMovementMultiplier", FrictionScale); ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); avDensity = physicsconfig.GetFloat("av_density", 80f); avHeightFudgeFactor = physicsconfig.GetFloat("av_height_fudge_factor", 0.52f); avMovementDivisorWalk = (physicsconfig.GetFloat("WalkSpeed", 1.3f)*2); avMovementDivisorRun = (physicsconfig.GetFloat("RunSpeed", 0.8f)*2); avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 10); forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); m_filterCollisions = physicsconfig.GetBoolean("filter_collisions", false); PID_D = physicsconfig.GetFloat("av_pid_derivative", PID_D); PID_P = physicsconfig.GetFloat("av_pid_proportional", PID_P); m_useFlightCeilingHeight = physicsconfig.GetBoolean("Use_Flight_Ceiling_Height_Max", m_useFlightCeilingHeight); m_flightCeilingHeight = physicsconfig.GetFloat("Flight_Ceiling_Height_Max", m_flightCeilingHeight); //Rex minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 6f); maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 100000.01f); DoPhyWind = physicsconfig.GetBoolean("do_physics_wind", false); } } // alloc unmanaged memory to receive information from colision contact joints ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision*d.ContactGeom.unmanagedSizeOf); // alloc unmanaged memory to pass information to colision contact joints GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath*d.Contact.unmanagedSizeOf); //UnmanagedODE.UnmanagedODEPhysics.Initialize(world, m_currentmaxContactsbeforedeath, ContactgeomsArray, GlobalContactsArray, contactgroup); newGlobalcontact.surface.mode = CommumContactFlags; newGlobalcontact.surface.soft_cfm = 0.0001f; newGlobalcontact.surface.soft_erp = 0.6f; // Set the gravity,, don't disable things automatically (we set it explicitly on some things) d.WorldSetGravity(world, gravityx, gravityy, gravityz); d.WorldSetContactSurfaceLayer(world, contactsurfacelayer); d.WorldSetLinearDamping(world, 0.001f); d.WorldSetAngularDamping(world, 0.001f); d.WorldSetAngularDampingThreshold(world, 0f); d.WorldSetLinearDampingThreshold(world, 0f); d.WorldSetMaxAngularSpeed(world, 256f); d.WorldSetCFM(world, 1e-6f); // a bit harder than default d.WorldSetERP(world, 0.6f); // higher than original d.WorldSetContactMaxCorrectingVel(world, 30.0f); // Set how many steps we go without running collision testing // This is in addition to the step size. // Essentially Steps * m_physicsiterations d.WorldSetQuickStepNumIterations(world, m_physicsiterations); //d.WorldSetContactMaxCorrectingVel(world, 1000.0f); if (staticPrimspace != null) return; //Reloading config, don't mess with this stuff d.HashSpaceSetLevels(space, HashspaceLow, HashspaceHigh); // spaces grid for static objects if (WorldExtents.X < WorldExtents.Y) // // constant is 1/log(2), -3 for division by 8 plus 0.5 for rounding GridSpaceScaleBits = (int) (Math.Log(WorldExtents.X)*1.4426950f - 2.5f); else GridSpaceScaleBits = (int) (Math.Log(WorldExtents.Y)*1.4426950f - 2.5f); if (GridSpaceScaleBits < 4) // no less than 16m side GridSpaceScaleBits = 4; else if (GridSpaceScaleBits > 10) GridSpaceScaleBits = 10; // no more than 1Km side int nspacesPerSideX2 = (int) (WorldExtents.X) >> GridSpaceScaleBits; int nspacesPerSideY2 = (int) (WorldExtents.Y) >> GridSpaceScaleBits; if ((int) (WorldExtents.X) > nspacesPerSideX2 << GridSpaceScaleBits) nspacesPerSideX2++; if ((int) (WorldExtents.Y) > nspacesPerSideY2 << GridSpaceScaleBits) nspacesPerSideY2++; staticPrimspace = new IntPtr[nspacesPerSideX2,nspacesPerSideY2]; IntPtr aSpace; for (int i = 0; i < nspacesPerSideX2; i++) { for (int j = 0; j < nspacesPerSideY2; j++) { aSpace = d.HashSpaceCreate(space); staticPrimspace[i, j] = aSpace; d.GeomSetCategoryBits(aSpace, (int) CollisionCategories.Space); d.HashSpaceSetLevels(aSpace, -2, 8); d.SpaceSetSublevel(aSpace, 1); } } }
public override void PostInitialise(IConfigSource config) { m_rayCastManager = new AuroraODERayCastRequestManager(this); RemoveQueue = new List<PhysicsActor>(); m_config = config; // Defaults if (Environment.OSVersion.Platform == PlatformID.Unix) { PID_D = 3200.0f; PID_P = 1400.0f; } else { PID_D = 2200.0f; PID_P = 900.0f; } if (m_config != null) { IConfig physicsconfig = m_config.Configs["AuroraODEPhysicsSettings"]; if (physicsconfig != null) { gravityx = physicsconfig.GetFloat("world_gravityx", 0f); gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); m_avDecayTime = physicsconfig.GetFloat("avDecayTime", m_avDecayTime); m_avStopDecaying = physicsconfig.GetFloat("avStopDecaying", m_avStopDecaying); AllowUnderwaterPhysics = physicsconfig.GetBoolean("useUnderWaterPhysics", false); AllowAvGravity = physicsconfig.GetBoolean("useAvGravity", true); AvGravityHeight = physicsconfig.GetInt("avGravityHeight", 4096); AllowAvsToEscapeGravity = physicsconfig.GetBoolean("aviesCanEscapeGravity", true); m_AvFlySpeed = physicsconfig.GetFloat("AvFlySpeed", m_AvFlySpeed); m_allowJump = physicsconfig.GetBoolean("AllowJump", m_allowJump); m_usepreJump = physicsconfig.GetBoolean("UsePreJump", m_usepreJump); m_preJumpTime = physicsconfig.GetInt("PreJumpTime", m_preJumpTime); m_preJumpForceMultiplier = physicsconfig.GetFloat("PreJumpMultiplier", m_preJumpForceMultiplier); contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", 0.001f); nmAvatarObjectContactFriction = physicsconfig.GetFloat("objectcontact_friction", 250f); nmAvatarObjectContactBounce = physicsconfig.GetFloat("objectcontact_bounce", 0.2f); mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f); mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f); ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); avDensity = physicsconfig.GetFloat("av_density", 80f); avHeightFudgeFactor = physicsconfig.GetFloat("av_height_fudge_factor", 0.52f); avMovementDivisorWalk = (physicsconfig.GetFloat("WalkSpeed", 1.3f) * 2); avMovementDivisorRun = (physicsconfig.GetFloat("RunSpeed", 0.8f) * 2); avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 10); bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", 35f); bodyPIDG = physicsconfig.GetFloat("body_pid_gain", 25f); forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); m_filterCollisions = physicsconfig.GetBoolean("filter_collisions", false); if (Environment.OSVersion.Platform == PlatformID.Unix) { PID_D = physicsconfig.GetFloat("av_pid_derivative_linux", 2200.0f); PID_P = physicsconfig.GetFloat("av_pid_proportional_linux", 900.0f); } else { PID_D = physicsconfig.GetFloat("av_pid_derivative_win", 2200.0f); PID_P = physicsconfig.GetFloat("av_pid_proportional_win", 900.0f); } physics_logging = physicsconfig.GetBoolean("physics_logging", false); physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0); physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false); m_useFlightCeilingHeight = physicsconfig.GetBoolean("Use_Flight_Ceiling_Height_Max", m_useFlightCeilingHeight); m_flightCeilingHeight = physicsconfig.GetFloat("Flight_Ceiling_Height_Max", m_flightCeilingHeight); //Rex minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 100000.01f); } } lock (OdeLock) { contacts = new d.ContactGeom[contactsPerCollision]; // Centeral contact friction and bounce // ckrinke 11/10/08 Enabling soft_erp but not soft_cfm until I figure out why // an avatar falls through in Z but not in X or Y when walking on a prim. contact.surface.mode |= d.ContactFlags.SoftERP; contact.surface.mu = nmAvatarObjectContactFriction; contact.surface.bounce = nmAvatarObjectContactBounce; contact.surface.soft_cfm = 0.010f; contact.surface.soft_erp = 0.010f; // Prim contact friction and bounce // THis is the *non* moving version of friction and bounce // Use this when an avatar comes in contact with a prim // and is moving AvatarMovementprimContact.surface.mu = mAvatarObjectContactFriction; AvatarMovementprimContact.surface.bounce = mAvatarObjectContactBounce; // Set the gravity,, don't disable things automatically (we set it explicitly on some things) d.WorldSetGravity (world, gravityx, gravityy, gravityz); d.WorldSetContactSurfaceLayer (world, contactsurfacelayer); d.WorldSetLinearDamping (world, 256f); d.WorldSetAngularDamping (world, 256f); d.WorldSetAngularDampingThreshold (world, 256f); d.WorldSetLinearDampingThreshold (world, 256f); d.WorldSetMaxAngularSpeed (world, 256f); // Set how many steps we go without running collision testing // This is in addition to the step size. // Essentially Steps * m_physicsiterations d.WorldSetQuickStepNumIterations (world, m_physicsiterations); //d.WorldSetContactMaxCorrectingVel(world, 1000.0f); if (staticPrimspace != null) return;//Reloading config, don't mess with this stuff d.HashSpaceSetLevels (space, HashspaceLow, HashspaceHigh); // spaces grid for static objects if (WorldExtents.X < WorldExtents.Y) // // constant is 1/log(2), -3 for division by 8 plus 0.5 for rounding GridSpaceScaleBits = (int)(Math.Log ((double)WorldExtents.X) * 1.4426950f - 2.5f); else GridSpaceScaleBits = (int)(Math.Log ((double)WorldExtents.Y) * 1.4426950f - 2.5f); if (GridSpaceScaleBits < 4) // no less than 16m side GridSpaceScaleBits = 4; else if (GridSpaceScaleBits > 10) GridSpaceScaleBits = 10; // no more than 1Km side int nspacesPerSideX = (int)(WorldExtents.X) >> GridSpaceScaleBits; int nspacesPerSideY = (int)(WorldExtents.Y) >> GridSpaceScaleBits; if ((int)(WorldExtents.X) > nspacesPerSideX << GridSpaceScaleBits) nspacesPerSideX++; if ((int)(WorldExtents.Y) > nspacesPerSideY << GridSpaceScaleBits) nspacesPerSideY++; staticPrimspace = new IntPtr[nspacesPerSideX, nspacesPerSideY]; IntPtr aSpace; for (int i = 0; i < nspacesPerSideX; i++) { for (int j = 0; j < nspacesPerSideY; j++) { aSpace = d.HashSpaceCreate (IntPtr.Zero); staticPrimspace[i, j] = aSpace; d.GeomSetCategoryBits (aSpace, (int)CollisionCategories.Space); waitForSpaceUnlock (aSpace); d.SpaceSetSublevel (aSpace, 1); d.SpaceAdd (space, aSpace); } } } }
// Initialize the mesh plugin public override void Initialise(IMesher meshmerizer, IConfigSource config, RegionInfo region ) { // checkThread(); mesher = meshmerizer; m_config = config; // m_log.WarnFormat("ODE configuration: {0}", d.GetConfiguration("ODE")); if (region != null) { WorldExtents.X = region.RegionSizeX; WorldExtents.Y = region.RegionSizeY; } // Defaults avPIDD = 2200.0f; avPIDP = 900.0f; int contactsPerCollision = 80; if (m_config != null) { IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; if (physicsconfig != null) { gravityx = physicsconfig.GetFloat("world_gravityx", 0f); gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); metersInSpace = physicsconfig.GetFloat("meters_in_small_space", 29.9f); contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer); ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); avDensity = physicsconfig.GetFloat("av_density", avDensity); avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", 1.3f); avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", 0.8f); avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", 35f); bodyPIDG = physicsconfig.GetFloat("body_pid_gain", 25f); forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); m_filterCollisions = physicsconfig.GetBoolean("filter_collisions", false); if (Environment.OSVersion.Platform == PlatformID.Unix) { avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", 2200.0f); avPIDP = physicsconfig.GetFloat("av_pid_proportional_linux", 900.0f); bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_linux", 5f); } else { avPIDD = physicsconfig.GetFloat("av_pid_derivative_win", 2200.0f); avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", 900.0f); bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_win", 5f); } physics_logging = physicsconfig.GetBoolean("physics_logging", false); physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0); physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false); m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false); minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 10000.01f); } } ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf); GlobalContactsArray = GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf); m_materialContactsData[(int)Material.Stone].mu = frictionScale * 0.8f; m_materialContactsData[(int)Material.Stone].bounce = 0.4f; m_materialContactsData[(int)Material.Metal].mu = frictionScale * 0.3f; m_materialContactsData[(int)Material.Metal].bounce = 0.4f; m_materialContactsData[(int)Material.Glass].mu = frictionScale * 0.2f; m_materialContactsData[(int)Material.Glass].bounce = 0.7f; m_materialContactsData[(int)Material.Wood].mu = frictionScale * 0.6f; m_materialContactsData[(int)Material.Wood].bounce = 0.5f; m_materialContactsData[(int)Material.Flesh].mu = frictionScale * 0.9f; m_materialContactsData[(int)Material.Flesh].bounce = 0.3f; m_materialContactsData[(int)Material.Plastic].mu = frictionScale * 0.4f; m_materialContactsData[(int)Material.Plastic].bounce = 0.7f; m_materialContactsData[(int)Material.Rubber].mu = frictionScale * 0.9f; m_materialContactsData[(int)Material.Rubber].bounce = 0.95f; m_materialContactsData[(int)Material.light].mu = 0.0f; m_materialContactsData[(int)Material.light].bounce = 0.0f; TerrainFriction *= frictionScale; // AvatarFriction *= frictionScale; // Set the gravity,, don't disable things automatically (we set it explicitly on some things) d.WorldSetGravity(world, gravityx, gravityy, gravityz); d.WorldSetContactSurfaceLayer(world, contactsurfacelayer); d.WorldSetLinearDamping(world, 0.002f); d.WorldSetAngularDamping(world, 0.002f); d.WorldSetAngularDampingThreshold(world, 0f); d.WorldSetLinearDampingThreshold(world, 0f); d.WorldSetMaxAngularSpeed(world, 256f); d.WorldSetCFM(world,1e-6f); // a bit harder than default //d.WorldSetCFM(world, 1e-4f); // a bit harder than default d.WorldSetERP(world, 0.6f); // higher than original // Set how many steps we go without running collision testing // This is in addition to the step size. // Essentially Steps * m_physicsiterations d.WorldSetQuickStepNumIterations(world, m_physicsiterations); d.WorldSetContactMaxCorrectingVel(world, 100.0f); spacesPerMeter = 1 / metersInSpace; spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter); spaceGridMaxY = (int)(WorldExtents.Y * spacesPerMeter); staticPrimspace = new IntPtr[spaceGridMaxX, spaceGridMaxY]; // create all spaces now int i, j; IntPtr newspace; for (i = 0; i < spaceGridMaxX; i++) for (j = 0; j < spaceGridMaxY; j++) { newspace = d.HashSpaceCreate(StaticSpace); d.GeomSetCategoryBits(newspace, (int)CollisionCategories.Space); waitForSpaceUnlock(newspace); d.SpaceSetSublevel(newspace, 2); d.HashSpaceSetLevels(newspace, -2, 8); staticPrimspace[i, j] = newspace; } // let this now be real maximum values spaceGridMaxX--; spaceGridMaxY--; }
// Initialize the mesh plugin public override void Initialise(IMesher meshmerizer, IConfigSource config) { mesher = meshmerizer; m_config = config; // Defaults if (Environment.OSVersion.Platform == PlatformID.Unix) { avPIDD = 3200.0f; avPIDP = 1400.0f; avStandupTensor = 2000000f; } else { avPIDD = 2200.0f; avPIDP = 900.0f; avStandupTensor = 550000f; } int contactsPerCollision = 80; if (m_config != null) { IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; if (physicsconfig != null) { gravityx = physicsconfig.GetFloat("world_gravityx", 0f); gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); worldHashspaceLow = physicsconfig.GetInt("world_hashspace_size_low", -4); worldHashspaceHigh = physicsconfig.GetInt("world_hashspace_size_high", 128); metersInSpace = physicsconfig.GetFloat("meters_in_small_space", 29.9f); smallHashspaceLow = physicsconfig.GetInt("small_hashspace_size_low", -4); smallHashspaceHigh = physicsconfig.GetInt("small_hashspace_size_high", 66); contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", 0.001f); nmTerrainContactFriction = physicsconfig.GetFloat("nm_terraincontact_friction", 255.0f); nmTerrainContactBounce = physicsconfig.GetFloat("nm_terraincontact_bounce", 0.1f); nmTerrainContactERP = physicsconfig.GetFloat("nm_terraincontact_erp", 0.1025f); mTerrainContactFriction = physicsconfig.GetFloat("m_terraincontact_friction", 75f); mTerrainContactBounce = physicsconfig.GetFloat("m_terraincontact_bounce", 0.05f); mTerrainContactERP = physicsconfig.GetFloat("m_terraincontact_erp", 0.05025f); nmAvatarObjectContactFriction = physicsconfig.GetFloat("objectcontact_friction", 250f); nmAvatarObjectContactBounce = physicsconfig.GetFloat("objectcontact_bounce", 0.2f); mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f); mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f); ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); avDensity = physicsconfig.GetFloat("av_density", 80f); avHeightFudgeFactor = physicsconfig.GetFloat("av_height_fudge_factor", 0.52f); avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", 1.3f); avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", 0.8f); avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", false); contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", 35f); bodyPIDG = physicsconfig.GetFloat("body_pid_gain", 25f); forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); m_filterCollisions = physicsconfig.GetBoolean("filter_collisions", false); if (Environment.OSVersion.Platform == PlatformID.Unix) { avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", 2200.0f); avPIDP = physicsconfig.GetFloat("av_pid_proportional_linux", 900.0f); avStandupTensor = physicsconfig.GetFloat("av_capsule_standup_tensor_linux", 550000f); bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_linux", 5f); } else { avPIDD = physicsconfig.GetFloat("av_pid_derivative_win", 2200.0f); avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", 900.0f); avStandupTensor = physicsconfig.GetFloat("av_capsule_standup_tensor_win", 550000f); bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_win", 5f); } physics_logging = physicsconfig.GetBoolean("physics_logging", false); physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0); physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false); m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false); minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 10000.01f); } } contacts = new d.ContactGeom[contactsPerCollision]; staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)]; // Centeral contact friction and bounce // ckrinke 11/10/08 Enabling soft_erp but not soft_cfm until I figure out why // an avatar falls through in Z but not in X or Y when walking on a prim. contact.surface.mode |= d.ContactFlags.SoftERP; contact.surface.mu = nmAvatarObjectContactFriction; contact.surface.bounce = nmAvatarObjectContactBounce; contact.surface.soft_cfm = 0.010f; contact.surface.soft_erp = 0.010f; // Terrain contact friction and Bounce // This is the *non* moving version. Use this when an avatar // isn't moving to keep it in place better TerrainContact.surface.mode |= d.ContactFlags.SoftERP; TerrainContact.surface.mu = nmTerrainContactFriction; TerrainContact.surface.bounce = nmTerrainContactBounce; TerrainContact.surface.soft_erp = nmTerrainContactERP; WaterContact.surface.mode |= (d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM); WaterContact.surface.mu = 0f; // No friction WaterContact.surface.bounce = 0.0f; // No bounce WaterContact.surface.soft_cfm = 0.010f; WaterContact.surface.soft_erp = 0.010f; // Prim contact friction and bounce // THis is the *non* moving version of friction and bounce // Use this when an avatar comes in contact with a prim // and is moving AvatarMovementprimContact.surface.mu = mAvatarObjectContactFriction; AvatarMovementprimContact.surface.bounce = mAvatarObjectContactBounce; // Terrain contact friction bounce and various error correcting calculations // Use this when an avatar is in contact with the terrain and moving. AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP; AvatarMovementTerrainContact.surface.mu = mTerrainContactFriction; AvatarMovementTerrainContact.surface.bounce = mTerrainContactBounce; AvatarMovementTerrainContact.surface.soft_erp = mTerrainContactERP; /* <summary></summary> Stone = 0, /// <summary></summary> Metal = 1, /// <summary></summary> Glass = 2, /// <summary></summary> Wood = 3, /// <summary></summary> Flesh = 4, /// <summary></summary> Plastic = 5, /// <summary></summary> Rubber = 6 */ m_materialContacts = new d.Contact[7,2]; m_materialContacts[(int)Material.Stone, 0] = new d.Contact(); m_materialContacts[(int)Material.Stone, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Stone, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Stone, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Stone, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Stone, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Stone, 1] = new d.Contact(); m_materialContacts[(int)Material.Stone, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Stone, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Stone, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Stone, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Stone, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Metal, 0] = new d.Contact(); m_materialContacts[(int)Material.Metal, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Metal, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Metal, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Metal, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Metal, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Metal, 1] = new d.Contact(); m_materialContacts[(int)Material.Metal, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Metal, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Metal, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Metal, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Metal, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Glass, 0] = new d.Contact(); m_materialContacts[(int)Material.Glass, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Glass, 0].surface.mu = 1f; m_materialContacts[(int)Material.Glass, 0].surface.bounce = 0.5f; m_materialContacts[(int)Material.Glass, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Glass, 0].surface.soft_erp = 0.010f; /* private float nmAvatarObjectContactFriction = 250f; private float nmAvatarObjectContactBounce = 0.1f; private float mAvatarObjectContactFriction = 75f; private float mAvatarObjectContactBounce = 0.1f; */ m_materialContacts[(int)Material.Glass, 1] = new d.Contact(); m_materialContacts[(int)Material.Glass, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Glass, 1].surface.mu = 1f; m_materialContacts[(int)Material.Glass, 1].surface.bounce = 0.5f; m_materialContacts[(int)Material.Glass, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Glass, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Wood, 0] = new d.Contact(); m_materialContacts[(int)Material.Wood, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Wood, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Wood, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Wood, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Wood, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Wood, 1] = new d.Contact(); m_materialContacts[(int)Material.Wood, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Wood, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Wood, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Wood, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Wood, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Flesh, 0] = new d.Contact(); m_materialContacts[(int)Material.Flesh, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Flesh, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Flesh, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Flesh, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Flesh, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Flesh, 1] = new d.Contact(); m_materialContacts[(int)Material.Flesh, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Flesh, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Flesh, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Flesh, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Flesh, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Plastic, 0] = new d.Contact(); m_materialContacts[(int)Material.Plastic, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Plastic, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Plastic, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Plastic, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Plastic, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Plastic, 1] = new d.Contact(); m_materialContacts[(int)Material.Plastic, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Plastic, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Plastic, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Plastic, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Plastic, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Rubber, 0] = new d.Contact(); m_materialContacts[(int)Material.Rubber, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Rubber, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Rubber, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Rubber, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Rubber, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Rubber, 1] = new d.Contact(); m_materialContacts[(int)Material.Rubber, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Rubber, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Rubber, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Rubber, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Rubber, 1].surface.soft_erp = 0.010f; d.HashSpaceSetLevels(space, worldHashspaceLow, worldHashspaceHigh); // Set the gravity,, don't disable things automatically (we set it explicitly on some things) d.WorldSetGravity(world, gravityx, gravityy, gravityz); d.WorldSetContactSurfaceLayer(world, contactsurfacelayer); d.WorldSetLinearDamping(world, 256f); d.WorldSetAngularDamping(world, 256f); d.WorldSetAngularDampingThreshold(world, 256f); d.WorldSetLinearDampingThreshold(world, 256f); d.WorldSetMaxAngularSpeed(world, 256f); // Set how many steps we go without running collision testing // This is in addition to the step size. // Essentially Steps * m_physicsiterations d.WorldSetQuickStepNumIterations(world, m_physicsiterations); //d.WorldSetContactMaxCorrectingVel(world, 1000.0f); for (int i = 0; i < staticPrimspace.GetLength(0); i++) { for (int j = 0; j < staticPrimspace.GetLength(1); j++) { staticPrimspace[i, j] = IntPtr.Zero; } } }
public override void PostInitialise(IConfigSource config) { m_rayCastManager = new AuroraODERayCastRequestManager(this); RemoveQueue = new List<PhysicsActor>(); m_config = config; // Defaults if (Environment.OSVersion.Platform == PlatformID.Unix) { PID_D = 3200.0f; PID_P = 1400.0f; avStandupTensor = 2000000f; } else { PID_D = 2200.0f; PID_P = 900.0f; avStandupTensor = 550000f; } if (m_config != null) { IConfig physicsconfig = m_config.Configs["AuroraODEPhysicsSettings"]; if (physicsconfig != null) { gravityx = physicsconfig.GetFloat("world_gravityx", 0f); gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); m_avDecayTime = physicsconfig.GetFloat("avDecayTime", m_avDecayTime); m_avStopDecaying = physicsconfig.GetFloat("avStopDecaying", m_avStopDecaying); AllowUnderwaterPhysics = physicsconfig.GetBoolean("useUnderWaterPhysics", false); AllowAvGravity = physicsconfig.GetBoolean("useAvGravity", true); AvGravityHeight = physicsconfig.GetInt("avGravityHeight", 4096); AllowAvsToEscapeGravity = physicsconfig.GetBoolean("aviesCanEscapeGravity", true); UsePointGravity = physicsconfig.GetBoolean("usePointGravity", false); m_PointOfGravity.X = physicsconfig.GetFloat("point_gravityx", 0); m_PointOfGravity.Y = physicsconfig.GetFloat("point_gravityy", 0); m_PointOfGravity.Z = physicsconfig.GetFloat("point_gravityz", 0); contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", 0.001f); nmTerrainContactFriction = physicsconfig.GetFloat("nm_terraincontact_friction", 255.0f); nmTerrainContactBounce = physicsconfig.GetFloat("nm_terraincontact_bounce", 0.1f); nmTerrainContactERP = physicsconfig.GetFloat("nm_terraincontact_erp", 0.1025f); mTerrainContactFriction = physicsconfig.GetFloat("m_terraincontact_friction", 75f); mTerrainContactBounce = physicsconfig.GetFloat("m_terraincontact_bounce", 0.05f); mTerrainContactERP = physicsconfig.GetFloat("m_terraincontact_erp", 0.05025f); nmAvatarObjectContactFriction = physicsconfig.GetFloat("objectcontact_friction", 250f); nmAvatarObjectContactBounce = physicsconfig.GetFloat("objectcontact_bounce", 0.2f); mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f); mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f); ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); avDensity = physicsconfig.GetFloat("av_density", 80f); avHeightFudgeFactor = physicsconfig.GetFloat("av_height_fudge_factor", 0.52f); avMovementDivisorWalk = (physicsconfig.GetFloat("av_movement_divisor_walk", 1.3f) * 2); avMovementDivisorRun = (physicsconfig.GetFloat("av_movement_divisor_run", 0.8f) * 2); avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", true); contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", 35f); bodyPIDG = physicsconfig.GetFloat("body_pid_gain", 25f); forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); m_filterCollisions = physicsconfig.GetBoolean("filter_collisions", false); if (Environment.OSVersion.Platform == PlatformID.Unix) { PID_D = physicsconfig.GetFloat("av_pid_derivative_linux", 2200.0f); PID_P = physicsconfig.GetFloat("av_pid_proportional_linux", 900.0f); avStandupTensor = physicsconfig.GetFloat("av_capsule_standup_tensor_linux", 550000f); bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_linux", 5f); } else { PID_D = physicsconfig.GetFloat("av_pid_derivative_win", 2200.0f); PID_P = physicsconfig.GetFloat("av_pid_proportional_win", 900.0f); avStandupTensor = physicsconfig.GetFloat("av_capsule_standup_tensor_win", 550000f); bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_win", 5f); } physics_logging = physicsconfig.GetBoolean("physics_logging", false); physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0); physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false); m_useFlightCeilingHeight = physicsconfig.GetBoolean("Use_Flight_Ceiling_Height_Max", m_useFlightCeilingHeight); m_flightCeilingHeight = physicsconfig.GetFloat("Flight_Ceiling_Height_Max", m_flightCeilingHeight); //Rex m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false); minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 10000.01f); } } contacts = new d.ContactGeom[contactsPerCollision]; // Centeral contact friction and bounce // ckrinke 11/10/08 Enabling soft_erp but not soft_cfm until I figure out why // an avatar falls through in Z but not in X or Y when walking on a prim. contact.surface.mode |= d.ContactFlags.SoftERP; contact.surface.mu = nmAvatarObjectContactFriction; contact.surface.bounce = nmAvatarObjectContactBounce; contact.surface.soft_cfm = 0.010f; contact.surface.soft_erp = 0.010f; // Terrain contact friction and Bounce // This is the *non* moving version. Use this when an avatar // isn't moving to keep it in place better TerrainContact.surface.mode |= d.ContactFlags.SoftERP; TerrainContact.surface.mu = nmTerrainContactFriction; TerrainContact.surface.bounce = nmTerrainContactBounce; TerrainContact.surface.soft_erp = nmTerrainContactERP; WaterContact.surface.mode |= (d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM); WaterContact.surface.mu = 0f; // No friction WaterContact.surface.bounce = 0.0f; // No bounce WaterContact.surface.soft_cfm = 0.010f; WaterContact.surface.soft_erp = 0.010f; // Prim contact friction and bounce // This is the *non* moving version of friction and bounce // Use this when an avatar comes in contact with a prim // and is moving AvatarMovementprimContact.surface.mu = mAvatarObjectContactFriction; AvatarMovementprimContact.surface.bounce = mAvatarObjectContactBounce; // Terrain contact friction bounce and various error correcting calculations // Use this when an avatar is in contact with the terrain and moving. AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP; AvatarMovementTerrainContact.surface.mu = mTerrainContactFriction; AvatarMovementTerrainContact.surface.bounce = mTerrainContactBounce; AvatarMovementTerrainContact.surface.soft_erp = mTerrainContactERP; /* <summary></summary> Stone = 0, /// <summary></summary> Metal = 1, /// <summary></summary> Glass = 2, /// <summary></summary> Wood = 3, /// <summary></summary> Flesh = 4, /// <summary></summary> Plastic = 5, /// <summary></summary> Rubber = 6 */ m_materialContacts = new d.Contact[7, 2]; m_materialContacts[(int)Material.Stone, 0] = new d.Contact(); m_materialContacts[(int)Material.Stone, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Stone, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Stone, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Stone, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Stone, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Stone, 1] = new d.Contact(); m_materialContacts[(int)Material.Stone, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Stone, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Stone, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Stone, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Stone, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Metal, 0] = new d.Contact(); m_materialContacts[(int)Material.Metal, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Metal, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Metal, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Metal, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Metal, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Metal, 1] = new d.Contact(); m_materialContacts[(int)Material.Metal, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Metal, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Metal, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Metal, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Metal, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Glass, 0] = new d.Contact(); m_materialContacts[(int)Material.Glass, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Glass, 0].surface.mu = 1f; m_materialContacts[(int)Material.Glass, 0].surface.bounce = 0.5f; m_materialContacts[(int)Material.Glass, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Glass, 0].surface.soft_erp = 0.010f; /* private float nmAvatarObjectContactFriction = 250f; private float nmAvatarObjectContactBounce = 0.1f; private float mAvatarObjectContactFriction = 75f; private float mAvatarObjectContactBounce = 0.1f; */ m_materialContacts[(int)Material.Glass, 1] = new d.Contact(); m_materialContacts[(int)Material.Glass, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Glass, 1].surface.mu = 1f; m_materialContacts[(int)Material.Glass, 1].surface.bounce = 0.5f; m_materialContacts[(int)Material.Glass, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Glass, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Wood, 0] = new d.Contact(); m_materialContacts[(int)Material.Wood, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Wood, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Wood, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Wood, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Wood, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Wood, 1] = new d.Contact(); m_materialContacts[(int)Material.Wood, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Wood, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Wood, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Wood, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Wood, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Flesh, 0] = new d.Contact(); m_materialContacts[(int)Material.Flesh, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Flesh, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Flesh, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Flesh, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Flesh, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Flesh, 1] = new d.Contact(); m_materialContacts[(int)Material.Flesh, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Flesh, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Flesh, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Flesh, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Flesh, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Plastic, 0] = new d.Contact(); m_materialContacts[(int)Material.Plastic, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Plastic, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Plastic, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Plastic, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Plastic, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Plastic, 1] = new d.Contact(); m_materialContacts[(int)Material.Plastic, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Plastic, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Plastic, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Plastic, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Plastic, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Rubber, 0] = new d.Contact(); m_materialContacts[(int)Material.Rubber, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Rubber, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Rubber, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Rubber, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Rubber, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Rubber, 1] = new d.Contact(); m_materialContacts[(int)Material.Rubber, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Rubber, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Rubber, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Rubber, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Rubber, 1].surface.soft_erp = 0.010f; // Set the gravity,, don't disable things automatically (we set it explicitly on some things) d.WorldSetGravity(world, gravityx, gravityy, gravityz); d.WorldSetContactSurfaceLayer(world, contactsurfacelayer); d.WorldSetLinearDamping(world, 256f); d.WorldSetAngularDamping(world, 256f); d.WorldSetAngularDampingThreshold(world, 256f); d.WorldSetLinearDampingThreshold(world, 256f); d.WorldSetMaxAngularSpeed(world, 256f); // Set how many steps we go without running collision testing // This is in addition to the step size. // Essentially Steps * m_physicsiterations d.WorldSetQuickStepNumIterations(world, m_physicsiterations); //d.WorldSetContactMaxCorrectingVel(world, 1000.0f); d.HashSpaceSetLevels(space, HashspaceLow, HashspaceHigh); // spaces grid for static objects // get area in 8m multiples and in parts so it fits in integer and scales so 256m get similar sizes as previus GridSpaceScaleBits = (int)WorldExtents.X / 8; GridSpaceScaleBits *= (int)WorldExtents.Y / 8; // // constant is 1/log(2), plus 0.5 for rounding GridSpaceScaleBits = (int)(Math.Log((double)GridSpaceScaleBits) * 1.4426950f - 0.5f); GridSpaceScaleBits /= 2; // side take half as many bits if (GridSpaceScaleBits < 4) // no less than 16m side GridSpaceScaleBits = 4; else if (GridSpaceScaleBits > 8) GridSpaceScaleBits = 8; // no more than 256m side int nspacesPerSideX = (int)(WorldExtents.X) >> GridSpaceScaleBits; int nspacesPerSideY = (int)(WorldExtents.Y) >> GridSpaceScaleBits; staticPrimspace = new IntPtr[nspacesPerSideX, nspacesPerSideY]; IntPtr aSpace; for (int i = 0; i < nspacesPerSideX; i++) { for (int j = 0; j < nspacesPerSideY; j++) { aSpace = d.HashSpaceCreate(IntPtr.Zero); staticPrimspace[i, j] = aSpace; d.GeomSetCategoryBits(aSpace, (int)CollisionCategories.Space); waitForSpaceUnlock(aSpace); d.SpaceSetSublevel(aSpace, 1); d.SpaceAdd(space, aSpace); } } }
/// <summary> /// Initiailizes the scene /// Sets many properties that ODE requires to be stable /// These settings need to be tweaked 'exactly' right or weird stuff happens. /// </summary> private void Initialization() { d.AllocateODEDataForThread(~0U); SimulationLock = new Object(); nearCallback = near; m_rayCastManager = new ODERayCastRequestManager(this); WorldExtents.X = m_frameWorkScene.RegionInfo.RegionSizeX; m_regionWidth = (uint)WorldExtents.X; WorldExtents.Y = m_frameWorkScene.RegionInfo.RegionSizeY; m_regionHeight = (uint)WorldExtents.Y; m_suportCombine = false; lock (OdeLock) { // Create the world and the first space try { world = d.WorldCreate(); TopSpace = d.HashSpaceCreate(IntPtr.Zero); // now the major subspaces ActiveSpace = d.HashSpaceCreate(TopSpace); CharsSpace = d.HashSpaceCreate(TopSpace); StaticSpace = d.HashSpaceCreate(TopSpace); GroundSpace = d.HashSpaceCreate(TopSpace); } catch { // i must RtC#FM // i did! } d.HashSpaceSetLevels(TopSpace, -5, 12); d.HashSpaceSetLevels(ActiveSpace, -5, 10); d.HashSpaceSetLevels(CharsSpace, -4, 3); d.HashSpaceSetLevels(StaticSpace, -5, 12); d.HashSpaceSetLevels(GroundSpace, 0, 8); // demote to second level d.SpaceSetSublevel(ActiveSpace, 1); d.SpaceSetSublevel(CharsSpace, 1); d.SpaceSetSublevel(StaticSpace, 1); d.SpaceSetSublevel(GroundSpace, 1); d.GeomSetCategoryBits(ActiveSpace, (uint)(CollisionCategories.Space | CollisionCategories.Geom | CollisionCategories.Character | CollisionCategories.Phantom | CollisionCategories.VolumeDtc )); d.GeomSetCollideBits(ActiveSpace, (uint)(CollisionCategories.Space | CollisionCategories.Geom | CollisionCategories.Character | CollisionCategories.Phantom | CollisionCategories.VolumeDtc )); d.GeomSetCategoryBits(CharsSpace, (uint)(CollisionCategories.Space | CollisionCategories.Geom | CollisionCategories.Character | CollisionCategories.Phantom | CollisionCategories.VolumeDtc )); d.GeomSetCollideBits(CharsSpace, 0); d.GeomSetCategoryBits(StaticSpace, (uint)(CollisionCategories.Space | CollisionCategories.Geom | // CollisionCategories.Land | // CollisionCategories.Water | CollisionCategories.Phantom | CollisionCategories.VolumeDtc )); d.GeomSetCollideBits(StaticSpace, 0); d.GeomSetCategoryBits(GroundSpace, (uint)(CollisionCategories.Land)); d.GeomSetCollideBits(GroundSpace, 0); contactgroup = d.JointGroupCreate(maxContactsbeforedeath + 1); //contactgroup d.WorldSetAutoDisableFlag(world, false); } // checkThread(); // Defaults int contactsPerCollision = 80; physicsconfig = null; if (m_config != null) { physicsconfig = m_config.Configs["ODEPhysicsSettings"]; if (physicsconfig != null) { gravityx = physicsconfig.GetFloat("world_gravityx", gravityx); gravityy = physicsconfig.GetFloat("world_gravityy", gravityy); gravityz = physicsconfig.GetFloat("world_gravityz", gravityz); metersInSpace = physicsconfig.GetFloat("meters_in_small_space", metersInSpace); // contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer); ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE); avDensity = physicsconfig.GetFloat("av_density", avDensity); avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", avMovementDivisorWalk); avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", avMovementDivisorRun); contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", contactsPerCollision); geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", geomDefaultDensity); bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", bodyFramesAutoDisable); physics_logging = physicsconfig.GetBoolean("physics_logging", false); physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0); physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false); minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", minimumGroundFlightOffset); maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", maximumMassObject); avDensity *= 3f / 80f; // scale other engines density option to this } } float heartbeat = 1/m_frameWorkScene.FrameTime; maximumAngularVelocity = 0.49f * heartbeat *(float)Math.PI; maxAngVelocitySQ = maximumAngularVelocity * maximumAngularVelocity; d.WorldSetCFM(world, comumContactCFM); d.WorldSetERP(world, comumContactERP); d.WorldSetGravity(world, gravityx, gravityy, gravityz); d.WorldSetLinearDamping(world, 0.002f); d.WorldSetAngularDamping(world, 0.002f); d.WorldSetAngularDampingThreshold(world, 0f); d.WorldSetLinearDampingThreshold(world, 0f); d.WorldSetMaxAngularSpeed(world, maximumAngularVelocity); d.WorldSetQuickStepNumIterations(world, m_physicsiterations); d.WorldSetContactSurfaceLayer(world, contactsurfacelayer); d.WorldSetContactMaxCorrectingVel(world, 60.0f); HalfOdeStep = ODE_STEPSIZE * 0.5f; odetimestepMS = (int)(1000.0f * ODE_STEPSIZE + 0.5f); ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf); GlobalContactsArray = Marshal.AllocHGlobal((maxContactsbeforedeath + 100) * d.Contact.unmanagedSizeOf); SharedTmpcontact.geom.g1 = IntPtr.Zero; SharedTmpcontact.geom.g2 = IntPtr.Zero; SharedTmpcontact.geom.side1 = -1; SharedTmpcontact.geom.side2 = -1; SharedTmpcontact.surface.mode = comumContactFlags; SharedTmpcontact.surface.mu = 0; SharedTmpcontact.surface.bounce = 0; SharedTmpcontact.surface.soft_cfm = comumContactCFM; SharedTmpcontact.surface.soft_erp = comumContactERP; SharedTmpcontact.surface.slip1 = comumContactSLIP; SharedTmpcontact.surface.slip2 = comumContactSLIP; m_materialContactsData[(int)Material.Stone].mu = 0.8f; m_materialContactsData[(int)Material.Stone].bounce = 0.4f; m_materialContactsData[(int)Material.Metal].mu = 0.3f; m_materialContactsData[(int)Material.Metal].bounce = 0.4f; m_materialContactsData[(int)Material.Glass].mu = 0.2f; m_materialContactsData[(int)Material.Glass].bounce = 0.7f; m_materialContactsData[(int)Material.Wood].mu = 0.6f; m_materialContactsData[(int)Material.Wood].bounce = 0.5f; m_materialContactsData[(int)Material.Flesh].mu = 0.9f; m_materialContactsData[(int)Material.Flesh].bounce = 0.3f; m_materialContactsData[(int)Material.Plastic].mu = 0.4f; m_materialContactsData[(int)Material.Plastic].bounce = 0.7f; m_materialContactsData[(int)Material.Rubber].mu = 0.9f; m_materialContactsData[(int)Material.Rubber].bounce = 0.95f; m_materialContactsData[(int)Material.light].mu = 0.0f; m_materialContactsData[(int)Material.light].bounce = 0.0f; spacesPerMeterX = 1.0f / metersInSpace; spacesPerMeterY = spacesPerMeterX; spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeterX); spaceGridMaxY = (int)(WorldExtents.Y * spacesPerMeterY); if (spaceGridMaxX > 24) { spaceGridMaxX = 24; spacesPerMeterX = spaceGridMaxX / WorldExtents.X; } if (spaceGridMaxY > 24) { spaceGridMaxY = 24; spacesPerMeterY = spaceGridMaxY / WorldExtents.Y; } staticPrimspace = new IntPtr[spaceGridMaxX, spaceGridMaxY]; // create all spaces now int i, j; IntPtr newspace; for (i = 0; i < spaceGridMaxX; i++) for (j = 0; j < spaceGridMaxY; j++) { newspace = d.HashSpaceCreate(StaticSpace); d.GeomSetCategoryBits(newspace, (int)CollisionCategories.Space); waitForSpaceUnlock(newspace); d.SpaceSetSublevel(newspace, 2); d.HashSpaceSetLevels(newspace, -2, 8); d.GeomSetCategoryBits(newspace, (uint)(CollisionCategories.Space | CollisionCategories.Geom | CollisionCategories.Land | CollisionCategories.Water | CollisionCategories.Phantom | CollisionCategories.VolumeDtc )); d.GeomSetCollideBits(newspace, 0); staticPrimspace[i, j] = newspace; } // let this now be index limit spaceGridMaxX--; spaceGridMaxY--; // create 4 off world spaces (x<0,x>max,y<0,y>max) staticPrimspaceOffRegion = new IntPtr[4]; for (i = 0; i < 4; i++) { newspace = d.HashSpaceCreate(StaticSpace); d.GeomSetCategoryBits(newspace, (int)CollisionCategories.Space); waitForSpaceUnlock(newspace); d.SpaceSetSublevel(newspace, 2); d.HashSpaceSetLevels(newspace, -2, 8); d.GeomSetCategoryBits(newspace, (uint)(CollisionCategories.Space | CollisionCategories.Geom | CollisionCategories.Land | CollisionCategories.Water | CollisionCategories.Phantom | CollisionCategories.VolumeDtc )); d.GeomSetCollideBits(newspace, 0); staticPrimspaceOffRegion[i] = newspace; } m_lastframe = DateTime.UtcNow; m_lastMeshExpire = m_lastframe; }
// Initialize from configs private void InitialiseFromConfig(IConfigSource config) { InitializeExtraStats(); m_config = config; // Defaults avPIDD = 2200.0f; avPIDP = 900.0f; avStandupTensor = 550000f; int contactsPerCollision = 80; if (m_config != null) { IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; if (physicsconfig != null) { CollectStats = physicsconfig.GetBoolean("collect_stats", false); gravityx = physicsconfig.GetFloat("world_gravityx", 0f); gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); float avatarTerminalVelocity = physicsconfig.GetFloat("avatar_terminal_velocity", 54f); AvatarTerminalVelocity = Util.Clamp<float>(avatarTerminalVelocity, 0, 255f); if (AvatarTerminalVelocity != avatarTerminalVelocity) { m_log.WarnFormat( "[ODE SCENE]: avatar_terminal_velocity of {0} is invalid. Clamping to {1}", avatarTerminalVelocity, AvatarTerminalVelocity); } HashspaceLow = physicsconfig.GetInt("world_hashspace_level_low", -5); HashspaceHigh = physicsconfig.GetInt("world_hashspace_level_high", 12); metersInSpace = physicsconfig.GetFloat("meters_in_small_space", 29.9f); contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", 0.001f); nmTerrainContactFriction = physicsconfig.GetFloat("nm_terraincontact_friction", 255.0f); nmTerrainContactBounce = physicsconfig.GetFloat("nm_terraincontact_bounce", 0.1f); nmTerrainContactERP = physicsconfig.GetFloat("nm_terraincontact_erp", 0.1025f); mTerrainContactFriction = physicsconfig.GetFloat("m_terraincontact_friction", 75f); mTerrainContactBounce = physicsconfig.GetFloat("m_terraincontact_bounce", 0.05f); mTerrainContactERP = physicsconfig.GetFloat("m_terraincontact_erp", 0.05025f); nmAvatarObjectContactFriction = physicsconfig.GetFloat("objectcontact_friction", 250f); nmAvatarObjectContactBounce = physicsconfig.GetFloat("objectcontact_bounce", 0.2f); mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f); mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f); ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE); m_physicsiterations = physicsconfig.GetInt("world_solver_iterations", 10); avDensity = physicsconfig.GetFloat("av_density", 80f); // avHeightFudgeFactor = physicsconfig.GetFloat("av_height_fudge_factor", 0.52f); avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", 1.3f); avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", 0.8f); avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); avplanted = physicsconfig.GetBoolean("av_planted", false); av_av_collisions_off = physicsconfig.GetBoolean("av_av_collisions_off", false); IsAvCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", false); contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 5); geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", 35f); bodyPIDG = physicsconfig.GetFloat("body_pid_gain", 25f); forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); m_filterCollisions = physicsconfig.GetBoolean("filter_collisions", false); avPIDD = physicsconfig.GetFloat("av_pid_derivative", 2200.0f); avPIDP = physicsconfig.GetFloat("av_pid_proportional", 900.0f); avStandupTensor = physicsconfig.GetFloat("av_capsule_standup_tensor", 550000f); physics_logging = physicsconfig.GetBoolean("physics_logging", false); physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0); physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false); // m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false); minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 10000.01f); } } contacts = new d.ContactGeom[contactsPerCollision]; spacesPerMeterX = 1.0f / metersInSpace; spacesPerMeterY = 1.0f / metersInSpace; spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeterX); spaceGridMaxY = (int)(WorldExtents.Y * spacesPerMeterY); // note: limit number of spaces if (spaceGridMaxX > 24) { spaceGridMaxX = 24; spacesPerMeterX = spaceGridMaxX / WorldExtents.X; } if (spaceGridMaxY > 24) { spaceGridMaxY = 24; spacesPerMeterY = spaceGridMaxY / WorldExtents.Y; } staticPrimspace = new IntPtr[spaceGridMaxX, spaceGridMaxY]; // make this index limits spaceGridMaxX--; spaceGridMaxY--; // Centeral contact friction and bounce // ckrinke 11/10/08 Enabling soft_erp but not soft_cfm until I figure out why // an avatar falls through in Z but not in X or Y when walking on a prim. contact.surface.mode |= d.ContactFlags.SoftERP; contact.surface.mu = nmAvatarObjectContactFriction; contact.surface.bounce = nmAvatarObjectContactBounce; contact.surface.soft_cfm = 0.010f; contact.surface.soft_erp = 0.010f; // Terrain contact friction and Bounce // This is the *non* moving version. Use this when an avatar // isn't moving to keep it in place better TerrainContact.surface.mode |= d.ContactFlags.SoftERP; TerrainContact.surface.mu = nmTerrainContactFriction; TerrainContact.surface.bounce = nmTerrainContactBounce; TerrainContact.surface.soft_erp = nmTerrainContactERP; WaterContact.surface.mode |= (d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM); WaterContact.surface.mu = 0f; // No friction WaterContact.surface.bounce = 0.0f; // No bounce WaterContact.surface.soft_cfm = 0.010f; WaterContact.surface.soft_erp = 0.010f; // Prim contact friction and bounce // THis is the *non* moving version of friction and bounce // Use this when an avatar comes in contact with a prim // and is moving AvatarMovementprimContact.surface.mu = mAvatarObjectContactFriction; AvatarMovementprimContact.surface.bounce = mAvatarObjectContactBounce; // Terrain contact friction bounce and various error correcting calculations // Use this when an avatar is in contact with the terrain and moving. AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP; AvatarMovementTerrainContact.surface.mu = mTerrainContactFriction; AvatarMovementTerrainContact.surface.bounce = mTerrainContactBounce; AvatarMovementTerrainContact.surface.soft_erp = mTerrainContactERP; /* <summary></summary> Stone = 0, /// <summary></summary> Metal = 1, /// <summary></summary> Glass = 2, /// <summary></summary> Wood = 3, /// <summary></summary> Flesh = 4, /// <summary></summary> Plastic = 5, /// <summary></summary> Rubber = 6 */ m_materialContacts = new d.Contact[7,2]; m_materialContacts[(int)Material.Stone, 0] = new d.Contact(); m_materialContacts[(int)Material.Stone, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Stone, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Stone, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Stone, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Stone, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Stone, 1] = new d.Contact(); m_materialContacts[(int)Material.Stone, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Stone, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Stone, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Stone, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Stone, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Metal, 0] = new d.Contact(); m_materialContacts[(int)Material.Metal, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Metal, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Metal, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Metal, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Metal, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Metal, 1] = new d.Contact(); m_materialContacts[(int)Material.Metal, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Metal, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Metal, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Metal, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Metal, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Glass, 0] = new d.Contact(); m_materialContacts[(int)Material.Glass, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Glass, 0].surface.mu = 1f; m_materialContacts[(int)Material.Glass, 0].surface.bounce = 0.5f; m_materialContacts[(int)Material.Glass, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Glass, 0].surface.soft_erp = 0.010f; /* private float nmAvatarObjectContactFriction = 250f; private float nmAvatarObjectContactBounce = 0.1f; private float mAvatarObjectContactFriction = 75f; private float mAvatarObjectContactBounce = 0.1f; */ m_materialContacts[(int)Material.Glass, 1] = new d.Contact(); m_materialContacts[(int)Material.Glass, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Glass, 1].surface.mu = 1f; m_materialContacts[(int)Material.Glass, 1].surface.bounce = 0.5f; m_materialContacts[(int)Material.Glass, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Glass, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Wood, 0] = new d.Contact(); m_materialContacts[(int)Material.Wood, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Wood, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Wood, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Wood, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Wood, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Wood, 1] = new d.Contact(); m_materialContacts[(int)Material.Wood, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Wood, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Wood, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Wood, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Wood, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Flesh, 0] = new d.Contact(); m_materialContacts[(int)Material.Flesh, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Flesh, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Flesh, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Flesh, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Flesh, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Flesh, 1] = new d.Contact(); m_materialContacts[(int)Material.Flesh, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Flesh, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Flesh, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Flesh, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Flesh, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Plastic, 0] = new d.Contact(); m_materialContacts[(int)Material.Plastic, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Plastic, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Plastic, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Plastic, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Plastic, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Plastic, 1] = new d.Contact(); m_materialContacts[(int)Material.Plastic, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Plastic, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Plastic, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Plastic, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Plastic, 1].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Rubber, 0] = new d.Contact(); m_materialContacts[(int)Material.Rubber, 0].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Rubber, 0].surface.mu = nmAvatarObjectContactFriction; m_materialContacts[(int)Material.Rubber, 0].surface.bounce = nmAvatarObjectContactBounce; m_materialContacts[(int)Material.Rubber, 0].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Rubber, 0].surface.soft_erp = 0.010f; m_materialContacts[(int)Material.Rubber, 1] = new d.Contact(); m_materialContacts[(int)Material.Rubber, 1].surface.mode |= d.ContactFlags.SoftERP; m_materialContacts[(int)Material.Rubber, 1].surface.mu = mAvatarObjectContactFriction; m_materialContacts[(int)Material.Rubber, 1].surface.bounce = mAvatarObjectContactBounce; m_materialContacts[(int)Material.Rubber, 1].surface.soft_cfm = 0.010f; m_materialContacts[(int)Material.Rubber, 1].surface.soft_erp = 0.010f; d.HashSpaceSetLevels(space, HashspaceLow, HashspaceHigh); // Set the gravity,, don't disable things automatically (we set it explicitly on some things) d.WorldSetGravity(world, gravityx, gravityy, gravityz); d.WorldSetContactSurfaceLayer(world, contactsurfacelayer); d.WorldSetLinearDamping(world, 256f); d.WorldSetAngularDamping(world, 256f); d.WorldSetAngularDampingThreshold(world, 256f); d.WorldSetLinearDampingThreshold(world, 256f); d.WorldSetMaxAngularSpeed(world, 256f); d.WorldSetQuickStepNumIterations(world, m_physicsiterations); //d.WorldSetContactMaxCorrectingVel(world, 1000.0f); for (int i = 0; i < staticPrimspace.GetLength(0); i++) { for (int j = 0; j < staticPrimspace.GetLength(1); j++) { staticPrimspace[i, j] = IntPtr.Zero; } } _worldInitialized = true; }