avinationmerge
UbitUmarov 2012-10-16 11:26:05 +01:00
parent 1e03344411
commit 91b83fd45e
3 changed files with 82 additions and 67 deletions

View File

@ -32,7 +32,9 @@ namespace OpenSim.Region.Physics.OdePlugin
FailMask = 0xC0, // 11000000
AssetFailed = 0x40, // 01000000
MeshFailed = 0x80 // 10000000
MeshFailed = 0x80, // 10000000
MeshNoColide = FailMask | needAsset
}
public enum meshWorkerCmnds : byte
@ -119,13 +121,10 @@ namespace OpenSim.Region.Physics.OdePlugin
case meshWorkerCmnds.changefull:
case meshWorkerCmnds.changeshapetype:
case meshWorkerCmnds.changesize:
GetMesh(nextRep);
if (CreateActorPhysRep(nextRep) && m_scene.haveActor(nextRep.actor))
m_scene.AddChange(nextRep.actor, changes.PhysRepData, nextRep);
break;
case meshWorkerCmnds.addnew:
if (CreateActorPhysRep(nextRep))
m_scene.AddChange(nextRep.actor, changes.AddPhysRep, nextRep);
break;
case meshWorkerCmnds.getmesh:
DoRepDataGetMesh(nextRep);
break;
@ -155,13 +154,13 @@ namespace OpenSim.Region.Physics.OdePlugin
repData.size = size;
repData.shapetype = shapetype;
CheckMeshDone(repData);
CheckMesh(repData);
CalcVolumeData(repData);
m_scene.AddChange(actor, changes.PhysRepData, repData);
return;
}
public void NewActorPhysRep(PhysicsActor actor, PrimitiveBaseShape pbs,
public ODEPhysRepData NewActorPhysRep(PhysicsActor actor, PrimitiveBaseShape pbs,
Vector3 size, byte shapetype)
{
ODEPhysRepData repData = new ODEPhysRepData();
@ -170,21 +169,17 @@ namespace OpenSim.Region.Physics.OdePlugin
repData.size = size;
repData.shapetype = shapetype;
CheckMeshDone(repData);
CheckMesh(repData);
CalcVolumeData(repData);
m_scene.AddChange(actor, changes.AddPhysRep, repData);
return repData;
}
public void RequestMesh(ODEPhysRepData repData)
{
repData.mesh = null;
if (repData.meshState == MeshState.needMesh)
{
repData.comand = meshWorkerCmnds.changefull;
createqueue.Enqueue(repData);
}
else if (repData.meshState == MeshState.needAsset)
if (repData.meshState == MeshState.needAsset)
{
PrimitiveBaseShape pbs = repData.pbs;
@ -196,9 +191,7 @@ namespace OpenSim.Region.Physics.OdePlugin
return;
}
if (pbs.SculptTexture != repData.assetID)
return;
repData.assetID = pbs.SculptTexture;
repData.meshState = MeshState.loadingAsset;
repData.comand = meshWorkerCmnds.getmesh;
@ -209,7 +202,6 @@ namespace OpenSim.Region.Physics.OdePlugin
// creates and prepares a mesh to use and calls parameters estimation
public bool CreateActorPhysRep(ODEPhysRepData repData)
{
getMesh(repData);
IMesh mesh = repData.mesh;
if (mesh != null)
@ -270,6 +262,15 @@ namespace OpenSim.Region.Physics.OdePlugin
if (repData.assetID != repData.pbs.SculptTexture)
return;
// check if it is in cache
GetMesh(repData);
if (repData.meshState != MeshState.needAsset)
{
CreateActorPhysRep(repData);
m_scene.AddChange(repData.actor, changes.PhysRepData, repData);
return;
}
RequestAssetDelegate assetProvider = m_scene.RequestAssetMethod;
if (assetProvider == null)
return;
@ -400,7 +401,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// see if we need a mesh and if so if we have a cached one
// called with a new repData
public bool CheckMeshDone(ODEPhysRepData repData)
public void CheckMesh(ODEPhysRepData repData)
{
PhysicsActor actor = repData.actor;
PrimitiveBaseShape pbs = repData.pbs;
@ -408,7 +409,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (!needsMeshing(pbs))
{
repData.meshState = MeshState.noNeed;
return true;
return;
}
IMesh mesh = null;
@ -437,29 +438,38 @@ namespace OpenSim.Region.Physics.OdePlugin
if (pbs.SculptTexture != null && pbs.SculptTexture != UUID.Zero)
{
repData.assetID = pbs.SculptTexture;
repData.meshState = MeshState.needAsset;
repData.meshState = MeshState.needAsset;
}
else
repData.meshState = MeshState.MeshFailed;
return;
}
else
{
repData.meshState = MeshState.needMesh;
return false;
mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, convex, true);
if (mesh == null)
{
repData.meshState = MeshState.MeshFailed;
return;
}
}
}
repData.meshState = MeshState.AssetOK;
repData.mesh = mesh;
if (pbs.SculptEntry)
{
repData.meshState = MeshState.AssetOK;
repData.assetID = pbs.SculptTexture;
}
pbs.SculptData = Utils.EmptyBytes;
return true;
return ;
}
public bool getMesh(ODEPhysRepData repData)
public void GetMesh(ODEPhysRepData repData)
{
PhysicsActor actor = repData.actor;
@ -469,17 +479,20 @@ namespace OpenSim.Region.Physics.OdePlugin
repData.hasOBB = false;
if (!needsMeshing(pbs))
return false;
{
repData.meshState = MeshState.noNeed;
return;
}
if (repData.meshState == MeshState.MeshFailed)
return false;
return;
if (pbs.SculptEntry)
{
if (repData.meshState == MeshState.AssetFailed)
{
if (pbs.SculptTexture == repData.assetID)
return true;
return;
}
}
@ -500,27 +513,23 @@ namespace OpenSim.Region.Physics.OdePlugin
clod = (int)LevelOfDetail.Low;
}
// check cached
mesh = m_mesher.GetMesh(actor.Name, pbs, size, clod, true, convex);
mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, convex, true);
if (mesh == null)
{
if (pbs.SculptEntry)
{
if (pbs.SculptTexture == UUID.Zero)
return false;
return;
repData.assetID = pbs.SculptTexture;
repData.meshState = MeshState.AssetOK;
if (pbs.SculptData == null || pbs.SculptData.Length == 0)
{
repData.meshState = MeshState.needAsset;
return false;
return;
}
}
mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, convex,true);
}
repData.mesh = mesh;
@ -533,12 +542,12 @@ namespace OpenSim.Region.Physics.OdePlugin
else
repData.meshState = MeshState.MeshFailed;
return false;
return;
}
repData.meshState = MeshState.AssetOK;
return true;
return;
}
private void CalculateBasicPrimVolume(ODEPhysRepData repData)

View File

@ -1104,7 +1104,12 @@ namespace OpenSim.Region.Physics.OdePlugin
m_building = true; // control must set this to false when done
_parent_scene.m_meshWorker.NewActorPhysRep(this, _pbs, _size, m_shapetype);
// get basic mass parameters
ODEPhysRepData repData = _parent_scene.m_meshWorker.NewActorPhysRep(this, _pbs, _size, m_shapetype);
primVolume = repData.volume;
UpdatePrimBodyData();
}
private void resetCollisionAccounting()
@ -1466,7 +1471,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_NoColide = false;
if ((m_meshState & MeshState.FailMask) != 0)
if ((m_meshState & MeshState.MeshNoColide) != 0)
m_NoColide = true;
else if(m_mesh != null)

View File

@ -1729,33 +1729,7 @@ namespace OpenSim.Region.Physics.OdePlugin
ODEchangeitem item;
if (ChangesQueue.Count > 0)
{
int ttmpstart = Util.EnvironmentTickCount();
int ttmp;
while (ChangesQueue.Dequeue(out item))
{
if (item.actor != null)
{
try
{
if (item.actor is OdeCharacter)
((OdeCharacter)item.actor).DoAChange(item.what, item.arg);
else if (((OdePrim)item.actor).DoAChange(item.what, item.arg))
RemovePrimThreadLocked((OdePrim)item.actor);
}
catch
{
m_log.WarnFormat("[PHYSICS]: doChange failed for a actor {0} {1}",
item.actor.Name, item.what.ToString());
}
}
ttmp = Util.EnvironmentTickCountSubtract(ttmpstart);
if (ttmp > 20)
break;
}
}
d.WorldSetQuickStepNumIterations(world, curphysiteractions);
@ -1766,6 +1740,33 @@ namespace OpenSim.Region.Physics.OdePlugin
// clear pointer/counter to contacts to pass into joints
m_global_contactcount = 0;
if (ChangesQueue.Count > 0)
{
int ttmpstart = Util.EnvironmentTickCount();
int ttmp;
while (ChangesQueue.Dequeue(out item))
{
if (item.actor != null)
{
try
{
if (item.actor is OdeCharacter)
((OdeCharacter)item.actor).DoAChange(item.what, item.arg);
else if (((OdePrim)item.actor).DoAChange(item.what, item.arg))
RemovePrimThreadLocked((OdePrim)item.actor);
}
catch
{
m_log.WarnFormat("[PHYSICS]: doChange failed for a actor {0} {1}",
item.actor.Name, item.what.ToString());
}
}
ttmp = Util.EnvironmentTickCountSubtract(ttmpstart);
if (ttmp > 20)
break;
}
}
// Move characters
lock (_characters)