* This finishes the ODE options section of the OpenSim.ini.example. I've added 44 configurable options!
* This includes if you want to mesh sculpties and the Level of detail on the sculptie meshing for non physical and a separate LOD on physical sculpties. * The options range from gravity.. to avatar movement speed, to friction management.. to object density.. to update throttling.0.6.0-stable
parent
f99b4cbe3b
commit
00a1f0bab0
|
@ -612,7 +612,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin
|
|||
}
|
||||
else
|
||||
{
|
||||
IMesh mesh = mesher.CreateMesh(primName, pbs, size);
|
||||
IMesh mesh = mesher.CreateMesh(primName, pbs, size, 32f);
|
||||
result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical);
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -33,7 +33,7 @@ namespace OpenSim.Region.Physics.Manager
|
|||
{
|
||||
public interface IMesher
|
||||
{
|
||||
IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size);
|
||||
IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod);
|
||||
}
|
||||
|
||||
public interface IVertex
|
||||
|
|
|
@ -60,7 +60,7 @@ namespace OpenSim.Region.Physics.Manager
|
|||
|
||||
public class ZeroMesher : IMesher
|
||||
{
|
||||
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size)
|
||||
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -1295,9 +1295,9 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
|
||||
return m;
|
||||
}
|
||||
private SculptMesh CreateSculptMesh(string primName, PrimitiveBaseShape primShape, PhysicsVector size)
|
||||
private SculptMesh CreateSculptMesh(string primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod)
|
||||
{
|
||||
SculptMesh sm = new SculptMesh(primShape.SculptData);
|
||||
SculptMesh sm = new SculptMesh(primShape.SculptData, lod);
|
||||
// Scale the mesh based on our prim scale
|
||||
foreach (Vertex v in sm.vertices)
|
||||
{
|
||||
|
@ -1422,12 +1422,13 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
}
|
||||
}
|
||||
|
||||
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size)
|
||||
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod)
|
||||
{
|
||||
Mesh mesh = null;
|
||||
if (primShape.SculptEntry && primShape.SculptType != (byte)0 && primShape.SculptData.Length > 0)
|
||||
{
|
||||
SculptMesh smesh = CreateSculptMesh(primName, primShape, size);
|
||||
|
||||
SculptMesh smesh = CreateSculptMesh(primName, primShape, size, lod);
|
||||
mesh = (Mesh)smesh;
|
||||
CalcNormals(mesh);
|
||||
}
|
||||
|
|
|
@ -48,8 +48,11 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
private int lod = 32;
|
||||
private const float RANGE = 128.0f;
|
||||
|
||||
public SculptMesh(byte[] jpegData)
|
||||
public SculptMesh(byte[] jpegData, float _lod)
|
||||
{
|
||||
if (_lod == 2f || _lod == 4f || _lod == 8f || _lod == 16f || _lod == 32f || _lod == 64f)
|
||||
lod = (int)_lod;
|
||||
|
||||
idata = OpenJPEG.DecodeToImage(jpegData);
|
||||
if (idata != null)
|
||||
{
|
||||
|
@ -61,6 +64,10 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
LoadPoles();
|
||||
|
||||
processSculptTexture();
|
||||
|
||||
bLOD.Dispose();
|
||||
bBitmap.Dispose();
|
||||
idata.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -65,6 +65,13 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
private PhysicsVector m_PIDTarget = new PhysicsVector(0, 0, 0);
|
||||
private float m_PIDTau = 0f;
|
||||
private float PID_D = 35f;
|
||||
private float PID_G = 25f;
|
||||
private float m_tensor = 5f;
|
||||
private int body_autodisable_frames = 20;
|
||||
|
||||
|
||||
|
||||
private bool m_usePID = false;
|
||||
|
||||
private const CollisionCategories m_default_collisionFlags = (CollisionCategories.Geom
|
||||
|
@ -94,7 +101,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
public uint m_localID = 0;
|
||||
|
||||
public GCHandle gc;
|
||||
//public GCHandle gc;
|
||||
private CollisionLocker ode;
|
||||
|
||||
private bool m_taintforce = false;
|
||||
|
@ -147,11 +154,16 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
{
|
||||
|
||||
_target_velocity = new PhysicsVector(0, 0, 0);
|
||||
gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned);
|
||||
//gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned);
|
||||
ode = dode;
|
||||
_velocity = new PhysicsVector();
|
||||
_position = pos;
|
||||
m_taintposition = pos;
|
||||
PID_D = parent_scene.bodyPIDD;
|
||||
PID_G = parent_scene.bodyPIDG;
|
||||
m_density = parent_scene.geomDefaultDensity;
|
||||
m_tensor = parent_scene.bodyMotorJointMaxforceTensor;
|
||||
body_autodisable_frames = parent_scene.bodyFramesAutoDisable;
|
||||
//if (_position.X > 257)
|
||||
//{
|
||||
//_position.X = 257;
|
||||
|
@ -306,7 +318,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
|
||||
d.BodySetAutoDisableFlag(Body, true);
|
||||
d.BodySetAutoDisableSteps(Body, 20);
|
||||
d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
|
||||
|
||||
m_interpenetrationcount = 0;
|
||||
m_collisionscore = 0;
|
||||
|
@ -677,6 +689,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
Thread.Sleep(10);
|
||||
|
||||
|
||||
//Kill Body so that mesh can re-make the geom
|
||||
if (IsPhysical && Body != (IntPtr) 0)
|
||||
{
|
||||
|
@ -799,7 +812,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
{
|
||||
d.JointDestroy(Amotor);
|
||||
Amotor = (IntPtr)0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -951,7 +964,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
if (_parent_scene.needsMeshing(_pbs))
|
||||
{
|
||||
// Don't need to re-enable body.. it's done in SetMesh
|
||||
_mesh = _parent_scene.mesher.CreateMesh(m_primName, _pbs, _size);
|
||||
_mesh = _parent_scene.mesher.CreateMesh(m_primName, _pbs, _size, _parent_scene.meshSculptLOD);
|
||||
// createmesh returns null when it's a shape that isn't a cube.
|
||||
}
|
||||
}
|
||||
|
@ -1138,7 +1151,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
if (IsPhysical && Body != (IntPtr)0 && !m_isSelected)
|
||||
{
|
||||
float PID_D = 2200.0f;
|
||||
|
||||
//float PID_P = 900.0f;
|
||||
|
||||
|
||||
|
@ -1177,21 +1190,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
// If the PID Controller isn't active then we set our force
|
||||
// calculating base velocity to the current position
|
||||
if (Environment.OSVersion.Platform == PlatformID.Unix)
|
||||
{
|
||||
PID_D = 3200.0f;
|
||||
//PID_P = 1400.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
PID_D = 2200.0f;
|
||||
//PID_P = 900.0f;
|
||||
}
|
||||
PID_D = 35f;
|
||||
|
||||
|
||||
//PID_P = 1.0f;
|
||||
float PID_G = 25;
|
||||
|
||||
|
||||
|
||||
if ((m_PIDTau < 1))
|
||||
{
|
||||
|
@ -1333,13 +1333,27 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
{
|
||||
if (Body == (IntPtr)0)
|
||||
{
|
||||
enableBody();
|
||||
if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
|
||||
{
|
||||
changeshape(2f);
|
||||
}
|
||||
else
|
||||
{
|
||||
enableBody();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Body != (IntPtr)0)
|
||||
{
|
||||
if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
|
||||
{
|
||||
if (prim_geom != IntPtr.Zero)
|
||||
d.GeomDestroy(prim_geom);
|
||||
|
||||
changeadd(2f);
|
||||
}
|
||||
disableBody();
|
||||
}
|
||||
}
|
||||
|
@ -1386,8 +1400,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
// Construction of new prim
|
||||
if (_parent_scene.needsMeshing(_pbs))
|
||||
{
|
||||
float meshlod = _parent_scene.meshSculptLOD;
|
||||
|
||||
if (IsPhysical)
|
||||
meshlod = _parent_scene.MeshSculptphysicalLOD;
|
||||
// Don't need to re-enable body.. it's done in SetMesh
|
||||
IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size);
|
||||
IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod);
|
||||
// createmesh returns null when it's a shape that isn't a cube.
|
||||
if (mesh != null)
|
||||
{
|
||||
|
@ -1556,10 +1574,16 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
if (_size.Y <= 0) _size.Y = 0.01f;
|
||||
if (_size.Z <= 0) _size.Z = 0.01f;
|
||||
// Construction of new prim
|
||||
|
||||
if (_parent_scene.needsMeshing(_pbs))
|
||||
{
|
||||
// Don't need to re-enable body.. it's done in SetMesh
|
||||
IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size);
|
||||
float meshlod = _parent_scene.meshSculptLOD;
|
||||
|
||||
if (IsPhysical)
|
||||
meshlod = _parent_scene.MeshSculptphysicalLOD;
|
||||
|
||||
IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod);
|
||||
// createmesh returns null when it's a shape that isn't a cube.
|
||||
if (mesh != null)
|
||||
{
|
||||
|
@ -1910,12 +1934,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
public override void CrossingFailure()
|
||||
{
|
||||
m_crossingfailures++;
|
||||
if (m_crossingfailures > 5)
|
||||
if (m_crossingfailures > _parent_scene.geomCrossingFailuresBeforeOutofbounds)
|
||||
{
|
||||
base.RaiseOutOfBounds(_position);
|
||||
return;
|
||||
}
|
||||
else if (m_crossingfailures == 5)
|
||||
else if (m_crossingfailures == _parent_scene.geomCrossingFailuresBeforeOutofbounds)
|
||||
{
|
||||
m_log.Warn("[PHYSICS]: Too many crossing failures for: " + m_primName);
|
||||
}
|
||||
|
@ -1982,7 +2006,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
{
|
||||
//base.RaiseOutOfBounds(l_position);
|
||||
|
||||
if (m_crossingfailures < 5)
|
||||
if (m_crossingfailures < _parent_scene.geomCrossingFailuresBeforeOutofbounds)
|
||||
{
|
||||
_position = l_position;
|
||||
//_parent_scene.remActivePrim(this);
|
||||
|
@ -2107,7 +2131,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
_orientation.y = ori.Y;
|
||||
_orientation.z = ori.Z;
|
||||
m_lastUpdateSent = false;
|
||||
if (!m_throttleUpdates || throttleCounter > 15)
|
||||
if (!m_throttleUpdates || throttleCounter > _parent_scene.geomUpdatesPerThrottledUpdate)
|
||||
{
|
||||
if (_parent == null)
|
||||
base.RequestPhysicsterseUpdate();
|
||||
|
@ -2164,15 +2188,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
Amotor = IntPtr.Zero;
|
||||
}
|
||||
|
||||
float m_tensor = 0f;
|
||||
if (Environment.OSVersion.Platform == PlatformID.Unix)
|
||||
{
|
||||
m_tensor = 2f;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_tensor = 5f;
|
||||
}
|
||||
|
||||
|
||||
float axisnum = 3;
|
||||
|
||||
|
|
|
@ -171,6 +171,25 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
private float avMovementDivisorWalk = 1.3f;
|
||||
private float avMovementDivisorRun = 0.8f;
|
||||
|
||||
public bool meshSculptedPrim = true;
|
||||
|
||||
public float meshSculptLOD = 32;
|
||||
public float MeshSculptphysicalLOD = 16;
|
||||
|
||||
public float geomDefaultDensity = 10.000006836f;
|
||||
|
||||
public int geomContactPointsStartthrottle = 3;
|
||||
public int geomUpdatesPerThrottledUpdate = 15;
|
||||
|
||||
public float bodyPIDD = 35f;
|
||||
public float bodyPIDG = 25;
|
||||
|
||||
public int geomCrossingFailuresBeforeOutofbounds = 5;
|
||||
|
||||
public float bodyMotorJointMaxforceTensor = 2;
|
||||
|
||||
public int bodyFramesAutoDisable = 20;
|
||||
|
||||
private float[] _heightmap;
|
||||
|
||||
private float[] _watermap;
|
||||
|
@ -320,17 +339,35 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", 0.8f);
|
||||
avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f);
|
||||
|
||||
geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
|
||||
geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
|
||||
geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_faiures_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);
|
||||
|
||||
meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true);
|
||||
meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f);
|
||||
MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f);
|
||||
|
||||
|
||||
if (Environment.OSVersion.Platform == PlatformID.Unix)
|
||||
{
|
||||
avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", 3200.0f);
|
||||
avPIDP = physicsconfig.GetFloat("av_pid_proportional_linux", 1400.0f);
|
||||
avStandupTensor = physicsconfig.GetFloat("av_capsule_standup_tensor_linux", 2000000f);
|
||||
bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_linux", 2f);
|
||||
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -765,7 +802,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
d.JointAttach(joint, b1, b2);
|
||||
}
|
||||
collision_accounting_events(p1, p2, max_collision_depth);
|
||||
if (count > 3)
|
||||
if (count > geomContactPointsStartthrottle)
|
||||
{
|
||||
// If there are more then 3 contact points, it's likely
|
||||
// that we've got a pile of objects
|
||||
|
@ -1117,7 +1154,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
/// support simple box & hollow box now; later, more shapes
|
||||
if (needsMeshing(pbs))
|
||||
{
|
||||
mesh = mesher.CreateMesh(primName, pbs, size);
|
||||
mesh = mesher.CreateMesh(primName, pbs, size, 32f);
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -1474,6 +1511,11 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
/// <returns></returns>
|
||||
public bool needsMeshing(PrimitiveBaseShape pbs)
|
||||
{
|
||||
if (pbs.SculptEntry && !meshSculptedPrim)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pbs.ProfileHollow != 0)
|
||||
return true;
|
||||
|
||||
|
@ -1495,7 +1537,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
return true;
|
||||
|
||||
if (pbs.ProfileShape == ProfileShape.EquilateralTriangle)
|
||||
return true;
|
||||
return true;
|
||||
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -242,6 +242,40 @@ av_movement_divisor_walk = 1.3
|
|||
; speed of movement with Always Run on
|
||||
av_movement_divisor_run = 0.8
|
||||
|
||||
; # Object options
|
||||
; used in the mass calculation.
|
||||
geometry_default_density = 10.000006836
|
||||
|
||||
; amount of ODE steps where object is non moving for ODE to automatically put it to sleep
|
||||
body_frames_auto_disable = 20
|
||||
|
||||
; used to control llMove2Target
|
||||
body_pid_derivative = 35
|
||||
body_pid_gain = 25
|
||||
|
||||
; amount of time a geom/body will try to cross a region border before it gets disabled
|
||||
geom_crossing_faiures_before_outofbounds = 5
|
||||
|
||||
; start throttling the object updates if object comes in contact with 3 or more other objects
|
||||
geom_contactpoints_start_throttling = 3
|
||||
|
||||
; send 1 update for every x updates below when throttled
|
||||
geom_updates_before_throttled_update = 15
|
||||
|
||||
; Used for llSetStatus. How rigid the object rotation is held on the axis specified
|
||||
body_motor_joint_maxforce_tensor_linux = 2
|
||||
body_motor_joint_maxforce_tensor_win = 5
|
||||
|
||||
; # Sculpted Prim settings
|
||||
|
||||
; Do we want to mesh sculpted prim to collide like they look?
|
||||
mesh_sculpted_prim = true
|
||||
|
||||
; number^2 non-physical level of detail of the sculpt texture. 32x32 - 1024 verticies
|
||||
mesh_lod = 32
|
||||
|
||||
; number^2 physical level of detail of the sculpt texture. 16x16 - 256 verticies
|
||||
mesh_physical_lod = 16
|
||||
|
||||
[RemoteAdmin]
|
||||
enabled = false
|
||||
|
|
Loading…
Reference in New Issue