Merge branch 'ubitwork' into avination
commit
7305d2e0ef
|
@ -33,45 +33,115 @@ using OpenSim.Framework;
|
||||||
|
|
||||||
namespace OpenSim.Region.Framework.Scenes
|
namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
|
public struct CollisionForSoundInfo
|
||||||
|
{
|
||||||
|
public uint colliderID;
|
||||||
|
public Vector3 position;
|
||||||
|
public float relativeVel;
|
||||||
|
}
|
||||||
|
|
||||||
public static class CollisionSounds
|
public static class CollisionSounds
|
||||||
{
|
{
|
||||||
// defines for cases
|
|
||||||
// only know one UUID for now (woodflesh)
|
|
||||||
|
|
||||||
private const int MaxMaterials = 7;
|
private const int MaxMaterials = 7;
|
||||||
// part part
|
// part part
|
||||||
private static UUID snd_StoneStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
/*
|
||||||
private static UUID snd_StoneMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_StoneStone = new UUID("be7295c0-a158-11e1-b3dd-0800200c9a66");
|
||||||
private static UUID snd_StoneGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_StoneMetal = new UUID("be7295c0-a158-11e1-b3dd-0800201c9a66");
|
||||||
private static UUID snd_StoneWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_StoneGlass = new UUID("be7295c0-a158-11e1-b3dd-0800202c9a66");
|
||||||
private static UUID snd_StoneFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_StoneWood = new UUID("be7295c0-a158-11e1-b3dd-0800203c9a66");
|
||||||
private static UUID snd_StonePlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_StoneFlesh = new UUID("be7295c0-a158-11e1-b3dd-0800204c9a66");
|
||||||
private static UUID snd_StoneRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_StonePlastic = new UUID("be7295c0-a158-11e1-b3dd-0800205c9a66");
|
||||||
|
private static UUID snd_StoneRubber = new UUID("be7295c0-a158-11e1-b3dd-0800206c9a66");
|
||||||
|
|
||||||
private static UUID snd_MetalMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_MetalStone = new UUID("be7295c0-a158-11e1-b3dd-0801200c9a66");
|
||||||
private static UUID snd_MetalGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_MetalMetal = new UUID("be7295c0-a158-11e1-b3dd-0801201c9a66");
|
||||||
private static UUID snd_MetalWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_MetalGlass = new UUID("be7295c0-a158-11e1-b3dd-0801202c9a66");
|
||||||
private static UUID snd_MetalFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_MetalWood = new UUID("be7295c0-a158-11e1-b3dd-0801203c9a66");
|
||||||
private static UUID snd_MetalPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_MetalFlesh = new UUID("be7295c0-a158-11e1-b3dd-0801204c9a66");
|
||||||
private static UUID snd_MetalRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_MetalPlastic = new UUID("be7295c0-a158-11e1-b3dd-0801205c9a66");
|
||||||
|
private static UUID snd_MetalRubber = new UUID("be7295c0-a158-11e1-b3dd-0801206c9a66");
|
||||||
|
|
||||||
private static UUID snd_GlassGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_GlassStone = new UUID("be7295c0-a158-11e1-b3dd-0802200c9a66");
|
||||||
private static UUID snd_GlassWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_GlassMetal = new UUID("be7295c0-a158-11e1-b3dd-0802201c9a66");
|
||||||
private static UUID snd_GlassFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_GlassGlass = new UUID("be7295c0-a158-11e1-b3dd-0802202c9a66");
|
||||||
private static UUID snd_GlassPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_GlassWood = new UUID("be7295c0-a158-11e1-b3dd-0802203c9a66");
|
||||||
private static UUID snd_GlassRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_GlassFlesh = new UUID("be7295c0-a158-11e1-b3dd-0802204c9a66");
|
||||||
|
private static UUID snd_GlassPlastic = new UUID("be7295c0-a158-11e1-b3dd-0802205c9a66");
|
||||||
|
private static UUID snd_GlassRubber = new UUID("be7295c0-a158-11e1-b3dd-0802206c9a66");
|
||||||
|
|
||||||
private static UUID snd_WoodWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_WoodStone = new UUID("be7295c0-a158-11e1-b3dd-0803200c9a66");
|
||||||
private static UUID snd_WoodFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_WoodMetal = new UUID("be7295c0-a158-11e1-b3dd-0803201c9a66");
|
||||||
private static UUID snd_WoodPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_WoodGlass = new UUID("be7295c0-a158-11e1-b3dd-0803202c9a66");
|
||||||
private static UUID snd_WoodRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_WoodWood = new UUID("be7295c0-a158-11e1-b3dd-0803203c9a66");
|
||||||
|
private static UUID snd_WoodFlesh = new UUID("be7295c0-a158-11e1-b3dd-0803204c9a66");
|
||||||
|
private static UUID snd_WoodPlastic = new UUID("be7295c0-a158-11e1-b3dd-0803205c9a66");
|
||||||
|
private static UUID snd_WoodRubber = new UUID("be7295c0-a158-11e1-b3dd-0803206c9a66");
|
||||||
|
|
||||||
private static UUID snd_FleshFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_FleshStone = new UUID("be7295c0-a158-11e1-b3dd-0804200c9a66");
|
||||||
private static UUID snd_FleshPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_FleshMetal = new UUID("be7295c0-a158-11e1-b3dd-0804201c9a66");
|
||||||
private static UUID snd_FleshRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_FleshGlass = new UUID("be7295c0-a158-11e1-b3dd-0804202c9a66");
|
||||||
|
private static UUID snd_FleshWood = new UUID("be7295c0-a158-11e1-b3dd-0804203c9a66");
|
||||||
|
private static UUID snd_FleshFlesh = new UUID("be7295c0-a158-11e1-b3dd-0804204c9a66");
|
||||||
|
private static UUID snd_FleshPlastic = new UUID("be7295c0-a158-11e1-b3dd-0804205c9a66");
|
||||||
|
private static UUID snd_FleshRubber = new UUID("be7295c0-a158-11e1-b3dd-0804206c9a66");
|
||||||
|
|
||||||
private static UUID snd_PlasticPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_PlasticStone = new UUID("be7295c0-a158-11e1-b3dd-0805200c9a66");
|
||||||
private static UUID snd_PlasticRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_PlasticMetal = new UUID("be7295c0-a158-11e1-b3dd-0805201c9a66");
|
||||||
|
private static UUID snd_PlasticGlass = new UUID("be7295c0-a158-11e1-b3dd-0805202c9a66");
|
||||||
|
private static UUID snd_PlasticWood = new UUID("be7295c0-a158-11e1-b3dd-0805203c9a66");
|
||||||
|
private static UUID snd_PlasticFlesh = new UUID("be7295c0-a158-11e1-b3dd-0805204c9a66");
|
||||||
|
private static UUID snd_PlasticPlastic = new UUID("be7295c0-a158-11e1-b3dd-0805205c9a66");
|
||||||
|
private static UUID snd_PlasticRubber = new UUID("be7295c0-a158-11e1-b3dd-0805206c9a66");
|
||||||
|
|
||||||
|
private static UUID snd_RubberStone = new UUID("be7295c0-a158-11e1-b3dd-0806200c9a66");
|
||||||
|
private static UUID snd_RubberMetal = new UUID("be7295c0-a158-11e1-b3dd-0806201c9a66");
|
||||||
|
private static UUID snd_RubberGlass = new UUID("be7295c0-a158-11e1-b3dd-0806202c9a66");
|
||||||
|
private static UUID snd_RubberWood = new UUID("be7295c0-a158-11e1-b3dd-0806203c9a66");
|
||||||
|
private static UUID snd_RubberFlesh = new UUID("be7295c0-a158-11e1-b3dd-0806204c9a66");
|
||||||
|
private static UUID snd_RubberPlastic = new UUID("be7295c0-a158-11e1-b3dd-0806205c9a66");
|
||||||
|
private static UUID snd_RubberRubber = new UUID("be7295c0-a158-11e1-b3dd-0806206c9a66");
|
||||||
|
|
||||||
|
// terrain part
|
||||||
|
private static UUID snd_TerrainStone = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
|
||||||
|
private static UUID snd_TerrainMetal = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
|
||||||
|
private static UUID snd_TerrainGlass = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
|
||||||
|
private static UUID snd_TerrainWood = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
|
||||||
|
private static UUID snd_TerrainFlesh = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
|
||||||
|
private static UUID snd_TerrainPlastic = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
|
||||||
|
private static UUID snd_TerrainRubber = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
|
||||||
|
*/
|
||||||
|
private static UUID snd_StoneStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_StoneMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_StoneGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_StoneWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_StoneFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_StonePlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_StoneRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
|
||||||
|
private static UUID snd_MetalMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_MetalGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_MetalWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_MetalFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_MetalPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_MetalRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
|
||||||
|
private static UUID snd_GlassGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_GlassWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_GlassFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_GlassPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_GlassRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
|
||||||
|
private static UUID snd_WoodWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_WoodFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_WoodPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_WoodRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
|
||||||
|
private static UUID snd_FleshFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_FleshPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_FleshRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
|
||||||
|
private static UUID snd_PlasticPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
private static UUID snd_PlasticRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
|
||||||
private static UUID snd_RubberRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
private static UUID snd_RubberRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
|
||||||
|
|
||||||
|
@ -93,7 +163,19 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
snd_TerrainPlastic,
|
snd_TerrainPlastic,
|
||||||
snd_TerrainRubber
|
snd_TerrainRubber
|
||||||
};
|
};
|
||||||
|
/*
|
||||||
|
//full assimetric sounds
|
||||||
|
public static UUID[] m_PartPart = {
|
||||||
|
snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber,
|
||||||
|
snd_MetalStone, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber,
|
||||||
|
snd_GlassStone, snd_GlassMetal, snd_GlassGlass, snd_GlassWood, snd_GlassFlesh, snd_GlassPlastic, snd_GlassRubber,
|
||||||
|
snd_WoodStone, snd_WoodMetal, snd_WoodGlass, snd_WoodWood, snd_WoodFlesh, snd_WoodPlastic, snd_WoodRubber,
|
||||||
|
snd_FleshStone, snd_FleshMetal, snd_FleshGlass, snd_FleshWood, snd_FleshFlesh, snd_FleshPlastic, snd_FleshRubber,
|
||||||
|
snd_PlasticStone, snd_PlasticMetal, snd_PlasticGlass, snd_PlasticWood, snd_PlasticFlesh, snd_PlasticPlastic, snd_PlasticRubber,
|
||||||
|
snd_RubberStone, snd_RubberMetal, snd_RubberGlass, snd_RubberWood, snd_RubberFlesh, snd_RubberPlastic, snd_RubberRubber
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
// simetric sounds
|
||||||
public static UUID[] m_PartPart = {
|
public static UUID[] m_PartPart = {
|
||||||
snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber,
|
snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber,
|
||||||
snd_StoneMetal, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber,
|
snd_StoneMetal, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber,
|
||||||
|
@ -104,12 +186,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
snd_StoneRubber, snd_MetalRubber, snd_GlassRubber, snd_WoodRubber, snd_FleshRubber, snd_PlasticRubber, snd_RubberRubber
|
snd_StoneRubber, snd_MetalRubber, snd_GlassRubber, snd_WoodRubber, snd_FleshRubber, snd_PlasticRubber, snd_RubberRubber
|
||||||
};
|
};
|
||||||
|
|
||||||
public static void PartCollisionSound(SceneObjectPart part,List<uint> Colliders)
|
public static void PartCollisionSound(SceneObjectPart part, List<CollisionForSoundInfo> collidersinfolist)
|
||||||
{
|
{
|
||||||
// temporary mute sounds
|
if (collidersinfolist.Count == 0 || part == null)
|
||||||
return;
|
|
||||||
|
|
||||||
if(Colliders.Count == 0 || part == null)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (part.VolumeDetectActive || (part.Flags & PrimFlags.Physics) == 0)
|
if (part.VolumeDetectActive || (part.Flags & PrimFlags.Physics) == 0)
|
||||||
|
@ -118,124 +197,161 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (part.ParentGroup == null)
|
if (part.ParentGroup == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (part.CollisionSound == part.invalidCollisionSoundUUID)
|
if (part.CollisionSoundType < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
UUID soundID;
|
float volume = 0.0f;
|
||||||
int otherMaterial;
|
bool HaveSound = false;
|
||||||
|
|
||||||
Vector3 position = part.AbsolutePosition;
|
UUID soundID = part.CollisionSound;
|
||||||
|
|
||||||
if (part.CollisionSound != UUID.Zero)
|
if (part.CollisionSoundType > 0)
|
||||||
{
|
{
|
||||||
if (part.CollisionSoundVolume > 0.0f)
|
// soundID = part.CollisionSound;
|
||||||
part.SendCollisionSound(part.CollisionSound, part.CollisionSoundVolume, position);
|
volume = part.CollisionSoundVolume;
|
||||||
return;
|
if (volume == 0.0f)
|
||||||
|
return;
|
||||||
|
HaveSound = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int thisMaterial = (int) part.Material;
|
|
||||||
if (thisMaterial >= MaxMaterials)
|
|
||||||
thisMaterial = 3;
|
|
||||||
|
|
||||||
int thisMatScaled = thisMaterial * MaxMaterials;
|
|
||||||
int index;
|
|
||||||
|
|
||||||
bool doneownsound = false;
|
bool doneownsound = false;
|
||||||
|
|
||||||
foreach (uint Id in Colliders)
|
int thisMaterial = (int)part.Material;
|
||||||
|
if (thisMaterial >= MaxMaterials)
|
||||||
|
thisMaterial = 3;
|
||||||
|
int thisMatScaled = thisMaterial * MaxMaterials;
|
||||||
|
|
||||||
|
CollisionForSoundInfo colInfo;
|
||||||
|
uint id;
|
||||||
|
|
||||||
|
for(int i = 0; i< collidersinfolist.Count; i++)
|
||||||
{
|
{
|
||||||
if (Id == 0)
|
colInfo = collidersinfolist[i];
|
||||||
|
|
||||||
|
id = colInfo.colliderID;
|
||||||
|
if (id == 0) // terrain collision
|
||||||
{
|
{
|
||||||
if (!doneownsound)
|
if (!doneownsound)
|
||||||
{
|
{
|
||||||
soundID = m_TerrainPart[thisMaterial];
|
if (!HaveSound)
|
||||||
part.SendCollisionSound(soundID, 1.0, position);
|
{
|
||||||
|
volume = Math.Abs(colInfo.relativeVel);
|
||||||
|
if (volume < 0.2f)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
volume *= volume * .0625f; // 4m/s == full volume
|
||||||
|
if (volume > 1.0f)
|
||||||
|
volume = 1.0f;
|
||||||
|
|
||||||
|
soundID = m_TerrainPart[thisMaterial];
|
||||||
|
}
|
||||||
|
part.SendCollisionSound(soundID, volume, colInfo.position);
|
||||||
doneownsound = true;
|
doneownsound = true;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SceneObjectPart otherPart = part.ParentGroup.Scene.GetSceneObjectPart(Id);
|
SceneObjectPart otherPart = part.ParentGroup.Scene.GetSceneObjectPart(id);
|
||||||
if (otherPart != null)
|
if (otherPart != null)
|
||||||
{
|
{
|
||||||
if (otherPart.CollisionSound == part.invalidCollisionSoundUUID || otherPart.VolumeDetectActive)
|
if (otherPart.CollisionSoundType < 0 || otherPart.VolumeDetectActive)
|
||||||
continue;
|
continue;
|
||||||
if (otherPart.CollisionSound != UUID.Zero)
|
|
||||||
otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, position);
|
if (!HaveSound)
|
||||||
else
|
|
||||||
{
|
{
|
||||||
otherMaterial = (int)otherPart.Material;
|
if (otherPart.CollisionSoundType > 0)
|
||||||
if (otherMaterial >= MaxMaterials)
|
{
|
||||||
otherMaterial = 3;
|
soundID = otherPart.CollisionSound;
|
||||||
index = thisMatScaled + otherMaterial;
|
volume = otherPart.CollisionSoundVolume;
|
||||||
soundID = m_PartPart[index];
|
if (volume == 0.0f)
|
||||||
if (doneownsound)
|
continue;
|
||||||
otherPart.SendCollisionSound(soundID, 1.0, position);
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
part.SendCollisionSound(soundID, 1.0, position);
|
volume = Math.Abs(colInfo.relativeVel);
|
||||||
doneownsound = true;
|
if (volume < 0.2f)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
volume *= volume * .0625f; // 4m/s == full volume
|
||||||
|
if (volume > 1.0f)
|
||||||
|
volume = 1.0f;
|
||||||
|
|
||||||
|
int otherMaterial = (int)otherPart.Material;
|
||||||
|
if (otherMaterial >= MaxMaterials)
|
||||||
|
otherMaterial = 3;
|
||||||
|
|
||||||
|
soundID = m_PartPart[thisMatScaled + otherMaterial];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/* avatars get notification let them trigger the sound
|
if (doneownsound)
|
||||||
else if (!doneownsound)
|
otherPart.SendCollisionSound(soundID, volume, colInfo.position);
|
||||||
{
|
else
|
||||||
ScenePresence av = part.ParentGroup.Scene.GetScenePresence(Id);
|
|
||||||
if (av != null && (!av.IsChildAgent))
|
|
||||||
{
|
{
|
||||||
index = thisMatScaled + 4; // flesh
|
part.SendCollisionSound(soundID, volume, colInfo.position);
|
||||||
soundID = m_PartPart[index];
|
|
||||||
part.SendCollisionSound(soundID, 1.0);
|
|
||||||
doneownsound = true;
|
doneownsound = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AvatarCollisionSound(ScenePresence av, List<uint> Colliders)
|
public static void AvatarCollisionSound(ScenePresence av, List<CollisionForSoundInfo> collidersinfolist)
|
||||||
{
|
{
|
||||||
// temporary mute sounds
|
if (collidersinfolist.Count == 0 || av == null)
|
||||||
return;
|
|
||||||
|
|
||||||
if (Colliders.Count == 0 || av == null)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
UUID soundID;
|
UUID soundID;
|
||||||
int otherMaterial;
|
int otherMaterial;
|
||||||
|
|
||||||
int thisMaterial = 3;
|
int thisMaterial = 4; // flesh
|
||||||
|
|
||||||
int thisMatScaled = thisMaterial * MaxMaterials;
|
int thisMatScaled = thisMaterial * MaxMaterials;
|
||||||
int index;
|
|
||||||
// bool doneownsound = false;
|
|
||||||
|
|
||||||
Vector3 position = av.AbsolutePosition;
|
// bool doneownsound = false;
|
||||||
|
|
||||||
foreach (uint Id in Colliders)
|
CollisionForSoundInfo colInfo;
|
||||||
|
uint id;
|
||||||
|
float volume;
|
||||||
|
|
||||||
|
for(int i = 0; i< collidersinfolist.Count; i++)
|
||||||
{
|
{
|
||||||
if (Id == 0)
|
colInfo = collidersinfolist[i];
|
||||||
|
|
||||||
|
id = colInfo.colliderID;
|
||||||
|
|
||||||
|
if (id == 0) // no terrain collision sounds for now
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
// volume = Math.Abs(colInfo.relativeVel);
|
||||||
|
// if (volume < 0.2f)
|
||||||
|
// continue;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SceneObjectPart otherPart = av.Scene.GetSceneObjectPart(Id);
|
SceneObjectPart otherPart = av.Scene.GetSceneObjectPart(id);
|
||||||
if (otherPart != null)
|
if (otherPart != null)
|
||||||
{
|
{
|
||||||
if (otherPart.CollisionSound == otherPart.invalidCollisionSoundUUID)
|
if (otherPart.CollisionSoundType < 0)
|
||||||
continue;
|
continue;
|
||||||
if (otherPart.CollisionSound != UUID.Zero)
|
if (otherPart.CollisionSoundType > 0 && otherPart.CollisionSoundVolume > 0f)
|
||||||
otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, position);
|
otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, colInfo.position);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
volume = Math.Abs(colInfo.relativeVel);
|
||||||
|
if (volume < 0.2f)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
volume *= volume * .0625f; // 4m/s == full volume
|
||||||
|
if (volume > 1.0f)
|
||||||
|
volume = 1.0f;
|
||||||
otherMaterial = (int)otherPart.Material;
|
otherMaterial = (int)otherPart.Material;
|
||||||
if (otherMaterial >= MaxMaterials)
|
if (otherMaterial >= MaxMaterials)
|
||||||
otherMaterial = 3;
|
otherMaterial = 3;
|
||||||
index = thisMatScaled + otherMaterial;
|
|
||||||
soundID = m_PartPart[index];
|
soundID = m_PartPart[thisMatScaled + otherMaterial];
|
||||||
otherPart.SendCollisionSound(soundID, 1.0, position);
|
otherPart.SendCollisionSound(soundID, volume, colInfo.position);
|
||||||
}
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
else if (!doneownsound)
|
else if (!doneownsound)
|
||||||
|
@ -251,6 +367,5 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -329,11 +329,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
private Vector3 m_cameraAtOffset;
|
private Vector3 m_cameraAtOffset;
|
||||||
private bool m_forceMouselook;
|
private bool m_forceMouselook;
|
||||||
|
|
||||||
// TODO: Collision sound should have default.
|
|
||||||
|
// 0 for default collision sounds, -1 for script disabled sound 1 for script defined sound
|
||||||
|
private sbyte m_collisionSoundType;
|
||||||
private UUID m_collisionSound;
|
private UUID m_collisionSound;
|
||||||
private float m_collisionSoundVolume;
|
private float m_collisionSoundVolume;
|
||||||
|
|
||||||
private DateTime LastColSoundSentTime;
|
private int LastColSoundSentTime;
|
||||||
|
|
||||||
|
|
||||||
private SOPVehicle m_vehicle = null;
|
private SOPVehicle m_vehicle = null;
|
||||||
|
@ -374,7 +376,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from
|
// this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from
|
||||||
// the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log
|
// the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log
|
||||||
m_inventory = new SceneObjectPartInventory(this);
|
m_inventory = new SceneObjectPartInventory(this);
|
||||||
LastColSoundSentTime = DateTime.UtcNow;
|
LastColSoundSentTime = Util.EnvironmentTickCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1342,12 +1344,39 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public UUID invalidCollisionSoundUUID = new UUID("ffffffff-ffff-ffff-ffff-ffffffffffff");
|
public UUID invalidCollisionSoundUUID = new UUID("ffffffff-ffff-ffff-ffff-ffffffffffff");
|
||||||
|
|
||||||
|
// 0 for default collision sounds, -1 for script disabled sound 1 for script defined sound
|
||||||
|
// runtime thing.. do not persist
|
||||||
|
[XmlIgnore]
|
||||||
|
public sbyte CollisionSoundType
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_collisionSoundType;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
m_collisionSoundType = value;
|
||||||
|
if (value == -1)
|
||||||
|
m_collisionSound = invalidCollisionSoundUUID;
|
||||||
|
else if (value == 0)
|
||||||
|
m_collisionSound = UUID.Zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UUID CollisionSound
|
public UUID CollisionSound
|
||||||
{
|
{
|
||||||
get { return m_collisionSound; }
|
get { return m_collisionSound; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
m_collisionSound = value;
|
m_collisionSound = value;
|
||||||
|
|
||||||
|
if (value == invalidCollisionSoundUUID)
|
||||||
|
m_collisionSoundType = -1;
|
||||||
|
else if (value == UUID.Zero)
|
||||||
|
m_collisionSoundType = 0;
|
||||||
|
else
|
||||||
|
m_collisionSoundType = 1;
|
||||||
|
|
||||||
aggregateScriptEvents();
|
aggregateScriptEvents();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1575,7 +1604,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (PhysActor == null)
|
else if (PhysActor == null)
|
||||||
|
{
|
||||||
ApplyPhysics((uint)Flags, VolumeDetectActive, false);
|
ApplyPhysics((uint)Flags, VolumeDetectActive, false);
|
||||||
|
UpdatePhysicsSubscribedEvents();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PhysActor.PhysicsShapeType = m_physicsShapeType;
|
PhysActor.PhysicsShapeType = m_physicsShapeType;
|
||||||
|
@ -2632,13 +2664,42 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>();
|
||||||
|
|
||||||
// calculate things that started colliding this time
|
// calculate things that started colliding this time
|
||||||
// and build up list of colliders this time
|
// and build up list of colliders this time
|
||||||
foreach (uint localid in collissionswith.Keys)
|
if (!VolumeDetectActive && CollisionSoundType >= 0)
|
||||||
{
|
{
|
||||||
thisHitColliders.Add(localid);
|
CollisionForSoundInfo soundinfo;
|
||||||
if (!m_lastColliders.Contains(localid))
|
ContactPoint curcontact;
|
||||||
startedColliders.Add(localid);
|
|
||||||
|
foreach (uint id in collissionswith.Keys)
|
||||||
|
{
|
||||||
|
thisHitColliders.Add(id);
|
||||||
|
if (!m_lastColliders.Contains(id))
|
||||||
|
{
|
||||||
|
startedColliders.Add(id);
|
||||||
|
|
||||||
|
curcontact = collissionswith[id];
|
||||||
|
if (Math.Abs(curcontact.RelativeSpeed) > 0.2)
|
||||||
|
{
|
||||||
|
soundinfo = new CollisionForSoundInfo();
|
||||||
|
soundinfo.colliderID = id;
|
||||||
|
soundinfo.position = curcontact.Position;
|
||||||
|
soundinfo.relativeVel = curcontact.RelativeSpeed;
|
||||||
|
soundinfolist.Add(soundinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (uint id in collissionswith.Keys)
|
||||||
|
{
|
||||||
|
thisHitColliders.Add(id);
|
||||||
|
if (!m_lastColliders.Contains(id))
|
||||||
|
startedColliders.Add(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate things that ended colliding
|
// calculate things that ended colliding
|
||||||
|
@ -2655,17 +2716,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// remove things that ended colliding from the last colliders list
|
// remove things that ended colliding from the last colliders list
|
||||||
foreach (uint localID in endedColliders)
|
foreach (uint localID in endedColliders)
|
||||||
m_lastColliders.Remove(localID);
|
m_lastColliders.Remove(localID);
|
||||||
|
|
||||||
|
// play sounds.
|
||||||
|
if (soundinfolist.Count > 0)
|
||||||
|
CollisionSounds.PartCollisionSound(this, soundinfolist);
|
||||||
}
|
}
|
||||||
|
|
||||||
// play the sound.
|
|
||||||
|
|
||||||
bool IsNotVolumeDtc = !VolumeDetectActive;
|
|
||||||
|
|
||||||
if (IsNotVolumeDtc && startedColliders.Count > 0 && CollisionSound != invalidCollisionSoundUUID)
|
|
||||||
CollisionSounds.PartCollisionSound(this, startedColliders);
|
|
||||||
|
|
||||||
SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart);
|
SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart);
|
||||||
if (IsNotVolumeDtc)
|
if (!VolumeDetectActive)
|
||||||
SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding);
|
SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding);
|
||||||
SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd);
|
SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd);
|
||||||
|
|
||||||
|
@ -3210,8 +3268,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (volume < 0)
|
if (volume < 0)
|
||||||
volume = 0;
|
volume = 0;
|
||||||
|
|
||||||
DateTime now = DateTime.UtcNow;
|
int now = Util.EnvironmentTickCount();
|
||||||
if((now - LastColSoundSentTime).Milliseconds < 200) // reduce rate to 5 per sec per part ??
|
if(Util.EnvironmentTickCountSubtract(now,LastColSoundSentTime) <200)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LastColSoundSentTime = now;
|
LastColSoundSentTime = now;
|
||||||
|
@ -4609,7 +4667,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public void RemoveFromPhysics()
|
public void RemoveFromPhysics()
|
||||||
{
|
{
|
||||||
ParentGroup.Scene.PhysicsScene.RemovePrim(PhysActor);
|
PhysicsActor pa = PhysActor;
|
||||||
|
if (pa != null)
|
||||||
|
{
|
||||||
|
pa.OnCollisionUpdate -= PhysicsCollision;
|
||||||
|
pa.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate;
|
||||||
|
pa.OnOutOfBounds -= PhysicsOutOfBounds;
|
||||||
|
|
||||||
|
ParentGroup.Scene.PhysicsScene.RemovePrim(pa);
|
||||||
|
}
|
||||||
PhysActor = null;
|
PhysActor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4778,7 +4844,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
pa.OnCollisionUpdate -= PhysicsCollision;
|
pa.OnCollisionUpdate -= PhysicsCollision;
|
||||||
|
|
||||||
bool hassound = ( CollisionSound != invalidCollisionSoundUUID);
|
bool hassound = (CollisionSoundType >= 0 && !VolumeDetectActive);
|
||||||
|
|
||||||
scriptEvents CombinedEvents = AggregateScriptEvents;
|
scriptEvents CombinedEvents = AggregateScriptEvents;
|
||||||
|
|
||||||
// merge with root part
|
// merge with root part
|
||||||
|
@ -4787,10 +4854,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
// submit to this part case
|
// submit to this part case
|
||||||
if (VolumeDetectActive)
|
if (VolumeDetectActive)
|
||||||
{
|
|
||||||
CombinedEvents &= PhyscicsVolumeDtcSubsEvents;
|
CombinedEvents &= PhyscicsVolumeDtcSubsEvents;
|
||||||
hassound = false;
|
|
||||||
}
|
|
||||||
else if ((Flags & PrimFlags.Phantom) != 0)
|
else if ((Flags & PrimFlags.Phantom) != 0)
|
||||||
CombinedEvents &= PhyscicsPhantonSubsEvents;
|
CombinedEvents &= PhyscicsPhantonSubsEvents;
|
||||||
else
|
else
|
||||||
|
|
|
@ -2032,7 +2032,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied);
|
// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied);
|
||||||
|
|
||||||
if (PhysicsActor != null)
|
if (PhysicsActor != null)
|
||||||
m_sitAvatarHeight = PhysicsActor.Size.Z;
|
m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f;
|
||||||
|
|
||||||
bool canSit = false;
|
bool canSit = false;
|
||||||
pos = part.AbsolutePosition + offset;
|
pos = part.AbsolutePosition + offset;
|
||||||
|
@ -4098,6 +4098,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata)
|
private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
lock(m_collisionEventLock)
|
lock(m_collisionEventLock)
|
||||||
{
|
{
|
||||||
if (m_collisionEventFlag)
|
if (m_collisionEventFlag)
|
||||||
|
@ -4107,76 +4108,106 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
Util.FireAndForget(delegate(object x)
|
Util.FireAndForget(delegate(object x)
|
||||||
{
|
{
|
||||||
|
*/
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List<uint> thisHitColliders = new List<uint>();
|
List<uint> thisHitColliders = new List<uint>();
|
||||||
List<uint> endedColliders = new List<uint>();
|
List<uint> endedColliders = new List<uint>();
|
||||||
List<uint> startedColliders = new List<uint>();
|
List<uint> startedColliders = new List<uint>();
|
||||||
|
List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>();
|
||||||
|
CollisionForSoundInfo soundinfo;
|
||||||
|
ContactPoint curcontact;
|
||||||
|
|
||||||
foreach (uint localid in coldata.Keys)
|
if (coldata.Count == 0)
|
||||||
{
|
{
|
||||||
thisHitColliders.Add(localid);
|
if (m_lastColliders.Count == 0)
|
||||||
if (!m_lastColliders.Contains(localid))
|
return; // nothing to do
|
||||||
{
|
|
||||||
startedColliders.Add(localid);
|
|
||||||
}
|
|
||||||
//m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculate things that ended colliding
|
foreach (uint localID in m_lastColliders)
|
||||||
foreach (uint localID in m_lastColliders)
|
|
||||||
{
|
|
||||||
if (!thisHitColliders.Contains(localID))
|
|
||||||
{
|
{
|
||||||
endedColliders.Add(localID);
|
endedColliders.Add(localID);
|
||||||
}
|
}
|
||||||
}
|
m_lastColliders.Clear();
|
||||||
//add the items that started colliding this time to the last colliders list.
|
|
||||||
foreach (uint localID in startedColliders)
|
|
||||||
{
|
|
||||||
m_lastColliders.Add(localID);
|
|
||||||
}
|
|
||||||
// remove things that ended colliding from the last colliders list
|
|
||||||
foreach (uint localID in endedColliders)
|
|
||||||
{
|
|
||||||
m_lastColliders.Remove(localID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// do event notification
|
else
|
||||||
if (startedColliders.Count > 0)
|
|
||||||
{
|
{
|
||||||
CollisionSounds.AvatarCollisionSound(this, startedColliders);
|
foreach (uint id in coldata.Keys)
|
||||||
|
|
||||||
ColliderArgs StartCollidingMessage = new ColliderArgs();
|
|
||||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
|
||||||
foreach (uint localId in startedColliders)
|
|
||||||
{
|
{
|
||||||
if (localId == 0)
|
thisHitColliders.Add(id);
|
||||||
continue;
|
if (!m_lastColliders.Contains(id))
|
||||||
|
|
||||||
SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
|
|
||||||
string data = "";
|
|
||||||
if (obj != null)
|
|
||||||
{
|
{
|
||||||
DetectedObject detobj = new DetectedObject();
|
startedColliders.Add(id);
|
||||||
detobj.keyUUID = obj.UUID;
|
curcontact = coldata[id];
|
||||||
detobj.nameStr = obj.Name;
|
if (Math.Abs(curcontact.RelativeSpeed) > 0.2)
|
||||||
detobj.ownerUUID = obj.OwnerID;
|
{
|
||||||
detobj.posVector = obj.AbsolutePosition;
|
soundinfo = new CollisionForSoundInfo();
|
||||||
detobj.rotQuat = obj.GetWorldRotation();
|
soundinfo.colliderID = id;
|
||||||
detobj.velVector = obj.Velocity;
|
soundinfo.position = curcontact.Position;
|
||||||
detobj.colliderType = 0;
|
soundinfo.relativeVel = curcontact.RelativeSpeed;
|
||||||
detobj.groupUUID = obj.GroupID;
|
soundinfolist.Add(soundinfo);
|
||||||
colliding.Add(detobj);
|
}
|
||||||
}
|
}
|
||||||
|
//m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (colliding.Count > 0)
|
// calculate things that ended colliding
|
||||||
|
foreach (uint localID in m_lastColliders)
|
||||||
{
|
{
|
||||||
StartCollidingMessage.Colliders = colliding;
|
if (!thisHitColliders.Contains(localID))
|
||||||
|
{
|
||||||
|
endedColliders.Add(localID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//add the items that started colliding this time to the last colliders list.
|
||||||
|
foreach (uint localID in startedColliders)
|
||||||
|
{
|
||||||
|
m_lastColliders.Add(localID);
|
||||||
|
}
|
||||||
|
// remove things that ended colliding from the last colliders list
|
||||||
|
foreach (uint localID in endedColliders)
|
||||||
|
{
|
||||||
|
m_lastColliders.Remove(localID);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (SceneObjectGroup att in GetAttachments())
|
if (soundinfolist.Count > 0)
|
||||||
Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
|
CollisionSounds.AvatarCollisionSound(this, soundinfolist);
|
||||||
|
|
||||||
|
// do event notification
|
||||||
|
if (startedColliders.Count > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
ColliderArgs StartCollidingMessage = new ColliderArgs();
|
||||||
|
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||||
|
foreach (uint localId in startedColliders)
|
||||||
|
{
|
||||||
|
if (localId == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
|
||||||
|
string data = "";
|
||||||
|
if (obj != null)
|
||||||
|
{
|
||||||
|
DetectedObject detobj = new DetectedObject();
|
||||||
|
detobj.keyUUID = obj.UUID;
|
||||||
|
detobj.nameStr = obj.Name;
|
||||||
|
detobj.ownerUUID = obj.OwnerID;
|
||||||
|
detobj.posVector = obj.AbsolutePosition;
|
||||||
|
detobj.rotQuat = obj.GetWorldRotation();
|
||||||
|
detobj.velVector = obj.Velocity;
|
||||||
|
detobj.colliderType = 0;
|
||||||
|
detobj.groupUUID = obj.GroupID;
|
||||||
|
colliding.Add(detobj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (colliding.Count > 0)
|
||||||
|
{
|
||||||
|
StartCollidingMessage.Colliders = colliding;
|
||||||
|
|
||||||
|
foreach (SceneObjectGroup att in GetAttachments())
|
||||||
|
Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4257,7 +4288,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
m_collisionEventFlag = false;
|
m_collisionEventFlag = false;
|
||||||
}
|
}
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TeleportFlagsDebug() {
|
private void TeleportFlagsDebug() {
|
||||||
|
|
|
@ -59,12 +59,14 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
public Vector3 Position;
|
public Vector3 Position;
|
||||||
public Vector3 SurfaceNormal;
|
public Vector3 SurfaceNormal;
|
||||||
public float PenetrationDepth;
|
public float PenetrationDepth;
|
||||||
|
public float RelativeSpeed;
|
||||||
|
|
||||||
public ContactPoint(Vector3 position, Vector3 surfaceNormal, float penetrationDepth)
|
public ContactPoint(Vector3 position, Vector3 surfaceNormal, float penetrationDepth)
|
||||||
{
|
{
|
||||||
Position = position;
|
Position = position;
|
||||||
SurfaceNormal = surfaceNormal;
|
SurfaceNormal = surfaceNormal;
|
||||||
PenetrationDepth = penetrationDepth;
|
PenetrationDepth = penetrationDepth;
|
||||||
|
RelativeSpeed = 0f; // for now let this one be set explicity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -128,9 +128,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
public d.Mass ShellMass;
|
public d.Mass ShellMass;
|
||||||
// public bool collidelock = false;
|
// public bool collidelock = false;
|
||||||
|
|
||||||
private bool m_haseventsubscription = false;
|
|
||||||
public int m_eventsubscription = 0;
|
public int m_eventsubscription = 0;
|
||||||
private CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate();
|
private int m_cureventsubscription = 0;
|
||||||
|
private CollisionEventUpdate CollisionEventsThisFrame = null;
|
||||||
|
private bool SentEmptyCollisionsEvent;
|
||||||
|
|
||||||
// unique UUID of this character object
|
// unique UUID of this character object
|
||||||
public UUID m_uuid;
|
public UUID m_uuid;
|
||||||
|
@ -239,7 +240,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public override bool IsPhysical
|
public override bool IsPhysical
|
||||||
{
|
{
|
||||||
get { return false; }
|
get { return m_isPhysical; }
|
||||||
set { return; }
|
set { return; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,8 +785,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// the Amotor still lets avatar rotation to drift during colisions
|
// the Amotor still lets avatar rotation to drift during colisions
|
||||||
// so force it back to identity
|
// so force it back to identity
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
d.Quaternion qtmp;
|
d.Quaternion qtmp;
|
||||||
qtmp.W = 1;
|
qtmp.W = 1;
|
||||||
qtmp.X = 0;
|
qtmp.X = 0;
|
||||||
|
@ -903,6 +902,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
contact.SurfaceNormal.X = 0f;
|
contact.SurfaceNormal.X = 0f;
|
||||||
contact.SurfaceNormal.Y = 0f;
|
contact.SurfaceNormal.Y = 0f;
|
||||||
contact.SurfaceNormal.Z = -1f;
|
contact.SurfaceNormal.Z = -1f;
|
||||||
|
contact.RelativeSpeed = -vel.Z;
|
||||||
AddCollisionEvent(0, contact);
|
AddCollisionEvent(0, contact);
|
||||||
|
|
||||||
vec.Z *= 0.5f;
|
vec.Z *= 0.5f;
|
||||||
|
@ -1119,47 +1119,71 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public override void SubscribeEvents(int ms)
|
public override void SubscribeEvents(int ms)
|
||||||
{
|
{
|
||||||
m_requestedUpdateFrequency = ms;
|
|
||||||
m_eventsubscription = ms;
|
m_eventsubscription = ms;
|
||||||
_parent_scene.AddCollisionEventReporting(this);
|
m_cureventsubscription = 0;
|
||||||
m_haseventsubscription = true;
|
if (CollisionEventsThisFrame == null)
|
||||||
|
CollisionEventsThisFrame = new CollisionEventUpdate();
|
||||||
|
SentEmptyCollisionsEvent = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void UnSubscribeEvents()
|
public override void UnSubscribeEvents()
|
||||||
{
|
{
|
||||||
m_haseventsubscription = false;
|
if (CollisionEventsThisFrame != null)
|
||||||
_parent_scene.RemoveCollisionEventReporting(this);
|
{
|
||||||
m_requestedUpdateFrequency = 0;
|
CollisionEventsThisFrame.Clear();
|
||||||
|
CollisionEventsThisFrame = null;
|
||||||
|
}
|
||||||
m_eventsubscription = 0;
|
m_eventsubscription = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
|
public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
|
||||||
{
|
{
|
||||||
if (m_haseventsubscription)
|
if (CollisionEventsThisFrame == null)
|
||||||
{
|
CollisionEventsThisFrame = new CollisionEventUpdate();
|
||||||
// m_log.DebugFormat(
|
CollisionEventsThisFrame.AddCollider(CollidedWith, contact);
|
||||||
// "[PHYSICS]: Adding collision event for {0}, collidedWith {1}, contact {2}", "", CollidedWith, contact);
|
|
||||||
|
|
||||||
CollisionEventsThisFrame.AddCollider(CollidedWith, contact);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendCollisions()
|
public void SendCollisions()
|
||||||
{
|
{
|
||||||
if (m_haseventsubscription && m_eventsubscription > m_requestedUpdateFrequency)
|
if (CollisionEventsThisFrame == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_cureventsubscription < m_eventsubscription)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_cureventsubscription = 0;
|
||||||
|
|
||||||
|
int ncolisions = CollisionEventsThisFrame.m_objCollisionList.Count;
|
||||||
|
|
||||||
|
if (!SentEmptyCollisionsEvent || ncolisions > 0)
|
||||||
{
|
{
|
||||||
if (CollisionEventsThisFrame != null)
|
base.SendCollisionUpdate(CollisionEventsThisFrame);
|
||||||
|
|
||||||
|
if (ncolisions == 0)
|
||||||
{
|
{
|
||||||
base.SendCollisionUpdate(CollisionEventsThisFrame);
|
SentEmptyCollisionsEvent = true;
|
||||||
|
_parent_scene.RemoveCollisionEventReporting(this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SentEmptyCollisionsEvent = false;
|
||||||
|
CollisionEventsThisFrame.Clear();
|
||||||
}
|
}
|
||||||
CollisionEventsThisFrame = new CollisionEventUpdate();
|
|
||||||
m_eventsubscription = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void AddCollisionFrameTime(int t)
|
||||||
|
{
|
||||||
|
// protect it from overflow crashing
|
||||||
|
if (m_cureventsubscription < 50000)
|
||||||
|
m_cureventsubscription += t;
|
||||||
|
}
|
||||||
|
|
||||||
public override bool SubscribedEvents()
|
public override bool SubscribedEvents()
|
||||||
{
|
{
|
||||||
return m_haseventsubscription;
|
if (m_eventsubscription > 0)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changePhysicsStatus(bool NewStatus)
|
private void changePhysicsStatus(bool NewStatus)
|
||||||
|
@ -1465,14 +1489,5 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
_parent_scene.AddChange((PhysicsActor)this, what, arg);
|
_parent_scene.AddChange((PhysicsActor)this, what, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal void AddCollisionFrameTime(int p)
|
|
||||||
{
|
|
||||||
// protect it from overflow crashing
|
|
||||||
if (m_eventsubscription + p >= int.MaxValue)
|
|
||||||
m_eventsubscription = 0;
|
|
||||||
m_eventsubscription += p;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -477,58 +477,58 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
// if(childPrim) we only know about physical linksets
|
// if(childPrim) we only know about physical linksets
|
||||||
return Ptot;
|
return Ptot;
|
||||||
/*
|
/*
|
||||||
float tmass = _mass;
|
float tmass = _mass;
|
||||||
Ptot *= tmass;
|
Ptot *= tmass;
|
||||||
|
|
||||||
float m;
|
float m;
|
||||||
|
|
||||||
foreach (OdePrim prm in childrenPrim)
|
foreach (OdePrim prm in childrenPrim)
|
||||||
{
|
{
|
||||||
m = prm._mass;
|
m = prm._mass;
|
||||||
Ptot += prm.CenterOfMass * m;
|
Ptot += prm.CenterOfMass * m;
|
||||||
tmass += m;
|
tmass += m;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tmass == 0)
|
if (tmass == 0)
|
||||||
tmass = 0;
|
tmass = 0;
|
||||||
else
|
else
|
||||||
tmass = 1.0f / tmass;
|
tmass = 1.0f / tmass;
|
||||||
|
|
||||||
Ptot *= tmass;
|
Ptot *= tmass;
|
||||||
return Ptot;
|
return Ptot;
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return _position;
|
return _position;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
public override Vector3 PrimOOBsize
|
public override Vector3 PrimOOBsize
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return primOOBsize;
|
return primOOBsize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Vector3 PrimOOBoffset
|
public override Vector3 PrimOOBoffset
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return primOOBoffset;
|
return primOOBoffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override float PrimOOBRadiusSQ
|
public override float PrimOOBRadiusSQ
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return primOOBradiusSQ;
|
return primOOBradiusSQ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
public override PrimitiveBaseShape Shape
|
public override PrimitiveBaseShape Shape
|
||||||
{
|
{
|
||||||
set
|
set
|
||||||
|
@ -582,7 +582,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (value.IsFinite())
|
if (value.IsFinite())
|
||||||
{
|
{
|
||||||
AddChange(changes.Velocity, value);
|
AddChange(changes.Velocity, value);
|
||||||
// _velocity = value;
|
// _velocity = value;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -937,12 +937,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (CollisionEventsThisFrame == null)
|
if (CollisionEventsThisFrame == null)
|
||||||
CollisionEventsThisFrame = new CollisionEventUpdate();
|
CollisionEventsThisFrame = new CollisionEventUpdate();
|
||||||
SentEmptyCollisionsEvent = false;
|
SentEmptyCollisionsEvent = false;
|
||||||
_parent_scene.AddCollisionEventReporting(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void UnSubscribeEvents()
|
public override void UnSubscribeEvents()
|
||||||
{
|
{
|
||||||
_parent_scene.RemoveCollisionEventReporting(this);
|
|
||||||
if (CollisionEventsThisFrame != null)
|
if (CollisionEventsThisFrame != null)
|
||||||
{
|
{
|
||||||
CollisionEventsThisFrame.Clear();
|
CollisionEventsThisFrame.Clear();
|
||||||
|
@ -975,7 +973,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
base.SendCollisionUpdate(CollisionEventsThisFrame);
|
base.SendCollisionUpdate(CollisionEventsThisFrame);
|
||||||
|
|
||||||
if (ncolisions == 0)
|
if (ncolisions == 0)
|
||||||
|
{
|
||||||
SentEmptyCollisionsEvent = true;
|
SentEmptyCollisionsEvent = true;
|
||||||
|
_parent_scene.RemoveCollisionEventReporting(this);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SentEmptyCollisionsEvent = false;
|
SentEmptyCollisionsEvent = false;
|
||||||
|
@ -986,11 +987,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
internal void AddCollisionFrameTime(int t)
|
internal void AddCollisionFrameTime(int t)
|
||||||
{
|
{
|
||||||
// protect it from overflow crashing
|
if (m_cureventsubscription < 50000)
|
||||||
if (m_cureventsubscription + t >= int.MaxValue)
|
m_cureventsubscription += t;
|
||||||
m_cureventsubscription = 0;
|
|
||||||
m_cureventsubscription += t;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool SubscribedEvents()
|
public override bool SubscribedEvents()
|
||||||
{
|
{
|
||||||
if (m_eventsubscription > 0)
|
if (m_eventsubscription > 0)
|
||||||
|
@ -1735,8 +1735,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
d.BodySetAutoDisableFlag(Body, true);
|
d.BodySetAutoDisableFlag(Body, true);
|
||||||
d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
|
d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
|
||||||
// d.BodySetLinearDampingThreshold(Body, 0.01f);
|
// d.BodySetLinearDampingThreshold(Body, 0.01f);
|
||||||
// d.BodySetAngularDampingThreshold(Body, 0.001f);
|
// d.BodySetAngularDampingThreshold(Body, 0.001f);
|
||||||
d.BodySetDamping(Body, .002f, .002f);
|
d.BodySetDamping(Body, .002f, .002f);
|
||||||
|
|
||||||
if (m_targetSpace != IntPtr.Zero)
|
if (m_targetSpace != IntPtr.Zero)
|
||||||
|
@ -2966,7 +2966,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
givefakepos--;
|
givefakepos--;
|
||||||
if (givefakepos < 0)
|
if (givefakepos < 0)
|
||||||
givefakepos = 0;
|
givefakepos = 0;
|
||||||
// changeSelectedStatus();
|
// changeSelectedStatus();
|
||||||
resetCollisionAccounting();
|
resetCollisionAccounting();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2981,14 +2981,14 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
_orientation = newOri;
|
_orientation = newOri;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
else if (m_forcePosOrRotation && _orientation != newOri && Body != IntPtr.Zero)
|
else if (m_forcePosOrRotation && _orientation != newOri && Body != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
FixInertia(_position, newOri);
|
FixInertia(_position, newOri);
|
||||||
if (!d.BodyIsEnabled(Body))
|
if (!d.BodyIsEnabled(Body))
|
||||||
d.BodyEnable(Body);
|
d.BodyEnable(Body);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3939,12 +3939,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
changevelocity((Vector3)arg);
|
changevelocity((Vector3)arg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// case changes.Acceleration:
|
// case changes.Acceleration:
|
||||||
// changeacceleration((Vector3)arg);
|
// changeacceleration((Vector3)arg);
|
||||||
// break;
|
// break;
|
||||||
// case changes.AngVelocity:
|
// case changes.AngVelocity:
|
||||||
// changeangvelocity((Vector3)arg);
|
// changeangvelocity((Vector3)arg);
|
||||||
// break;
|
// break;
|
||||||
|
|
||||||
case changes.Force:
|
case changes.Force:
|
||||||
changeForce((Vector3)arg);
|
changeForce((Vector3)arg);
|
||||||
|
|
|
@ -190,6 +190,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public float ODE_STEPSIZE = 0.020f;
|
public float ODE_STEPSIZE = 0.020f;
|
||||||
public float HalfOdeStep = 0.01f;
|
public float HalfOdeStep = 0.01f;
|
||||||
|
public int odetimestepMS = 20; // rounded
|
||||||
private float metersInSpace = 25.6f;
|
private float metersInSpace = 25.6f;
|
||||||
private float m_timeDilation = 1.0f;
|
private float m_timeDilation = 1.0f;
|
||||||
|
|
||||||
|
@ -247,6 +248,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
/// A list of actors that should receive collision events.
|
/// A list of actors that should receive collision events.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly List<PhysicsActor> _collisionEventPrim = new List<PhysicsActor>();
|
private readonly List<PhysicsActor> _collisionEventPrim = new List<PhysicsActor>();
|
||||||
|
private readonly List<PhysicsActor> _collisionEventPrimRemove = new List<PhysicsActor>();
|
||||||
|
|
||||||
private readonly HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>();
|
private readonly HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>();
|
||||||
public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>();
|
public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>();
|
||||||
|
@ -489,6 +491,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
HalfOdeStep = ODE_STEPSIZE * 0.5f;
|
HalfOdeStep = ODE_STEPSIZE * 0.5f;
|
||||||
|
odetimestepMS = (int)(1000.0f * ODE_STEPSIZE +0.5f);
|
||||||
|
|
||||||
ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf);
|
ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf);
|
||||||
GlobalContactsArray = GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf);
|
GlobalContactsArray = GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf);
|
||||||
|
@ -1073,6 +1076,21 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (!(p2events || p1events))
|
if (!(p2events || p1events))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (p1events)
|
||||||
|
AddCollisionEventReporting(p1);
|
||||||
|
|
||||||
|
if (p2events)
|
||||||
|
AddCollisionEventReporting(p2);
|
||||||
|
|
||||||
|
Vector3 vel = Vector3.Zero;
|
||||||
|
if (p2 != null && p2.IsPhysical)
|
||||||
|
vel = p2.Velocity;
|
||||||
|
|
||||||
|
if (p1 != null && p1.IsPhysical)
|
||||||
|
vel -= p1.Velocity;
|
||||||
|
|
||||||
|
contact.RelativeSpeed = Vector3.Dot(vel, contact.SurfaceNormal);
|
||||||
|
|
||||||
switch ((ActorTypes)p1.PhysicsActorType)
|
switch ((ActorTypes)p1.PhysicsActorType)
|
||||||
{
|
{
|
||||||
case ActorTypes.Agent:
|
case ActorTypes.Agent:
|
||||||
|
@ -1246,20 +1264,14 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add actor to the list that should receive collision events in the simulate loop.
|
/// Add actor to the list that should receive collision events in the simulate loop.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="obj"></param>
|
/// <param name="obj"></param>
|
||||||
public void AddCollisionEventReporting(PhysicsActor obj)
|
public void AddCollisionEventReporting(PhysicsActor obj)
|
||||||
{
|
{
|
||||||
lock (_collisionEventPrim)
|
if (!_collisionEventPrim.Contains(obj))
|
||||||
{
|
_collisionEventPrim.Add(obj);
|
||||||
if (!_collisionEventPrim.Contains(obj))
|
|
||||||
_collisionEventPrim.Add(obj);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1268,13 +1280,11 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
/// <param name="obj"></param>
|
/// <param name="obj"></param>
|
||||||
public void RemoveCollisionEventReporting(PhysicsActor obj)
|
public void RemoveCollisionEventReporting(PhysicsActor obj)
|
||||||
{
|
{
|
||||||
lock (_collisionEventPrim)
|
if (_collisionEventPrim.Contains(obj) && !_collisionEventPrimRemove.Contains(obj))
|
||||||
{
|
_collisionEventPrimRemove.Add(obj);
|
||||||
if (_collisionEventPrim.Contains(obj))
|
|
||||||
_collisionEventPrim.Remove(obj);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#region Add/Remove Entities
|
#region Add/Remove Entities
|
||||||
|
|
||||||
public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
|
public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
|
||||||
|
@ -1463,6 +1473,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
// lock (OdeLock)
|
// lock (OdeLock)
|
||||||
{
|
{
|
||||||
|
|
||||||
OdePrim p = (OdePrim)prim;
|
OdePrim p = (OdePrim)prim;
|
||||||
p.setPrimForRemoval();
|
p.setPrimForRemoval();
|
||||||
}
|
}
|
||||||
|
@ -1818,7 +1829,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
int ttmpstart = Util.EnvironmentTickCount();
|
int ttmpstart = Util.EnvironmentTickCount();
|
||||||
int ttmp;
|
int ttmp;
|
||||||
int ttmp2;
|
|
||||||
|
|
||||||
while(ChangesQueue.Dequeue(out item))
|
while(ChangesQueue.Dequeue(out item))
|
||||||
{
|
{
|
||||||
|
@ -1840,11 +1850,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (ttmp > 20)
|
if (ttmp > 20)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ttmp2 = Util.EnvironmentTickCountSubtract(ttmpstart);
|
|
||||||
if (ttmp2 > 50)
|
|
||||||
ttmp2 = 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move characters
|
// Move characters
|
||||||
|
@ -1881,53 +1886,55 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
collision_optimized();
|
collision_optimized();
|
||||||
|
|
||||||
lock (_collisionEventPrim)
|
foreach (PhysicsActor obj in _collisionEventPrim)
|
||||||
{
|
{
|
||||||
foreach (PhysicsActor obj in _collisionEventPrim)
|
if (obj == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch ((ActorTypes)obj.PhysicsActorType)
|
||||||
{
|
{
|
||||||
if (obj == null)
|
case ActorTypes.Agent:
|
||||||
continue;
|
OdeCharacter cobj = (OdeCharacter)obj;
|
||||||
|
cobj.AddCollisionFrameTime((int)(odetimestepMS));
|
||||||
|
cobj.SendCollisions();
|
||||||
|
break;
|
||||||
|
|
||||||
switch ((ActorTypes)obj.PhysicsActorType)
|
case ActorTypes.Prim:
|
||||||
{
|
OdePrim pobj = (OdePrim)obj;
|
||||||
case ActorTypes.Agent:
|
if (pobj.Body == IntPtr.Zero || (d.BodyIsEnabled(pobj.Body) && !pobj.m_outbounds))
|
||||||
OdeCharacter cobj = (OdeCharacter)obj;
|
{
|
||||||
cobj.AddCollisionFrameTime((int)(ODE_STEPSIZE*1000.0f));
|
pobj.AddCollisionFrameTime((int)(odetimestepMS));
|
||||||
cobj.SendCollisions();
|
pobj.SendCollisions();
|
||||||
break;
|
}
|
||||||
|
break;
|
||||||
case ActorTypes.Prim:
|
|
||||||
OdePrim pobj = (OdePrim)obj;
|
|
||||||
if (pobj.Body == IntPtr.Zero || (d.BodyIsEnabled(pobj.Body) && !pobj.m_outbounds))
|
|
||||||
{
|
|
||||||
pobj.AddCollisionFrameTime((int)(ODE_STEPSIZE * 1000.0f));
|
|
||||||
pobj.SendCollisions();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (PhysicsActor obj in _collisionEventPrimRemove)
|
||||||
|
_collisionEventPrim.Remove(obj);
|
||||||
|
|
||||||
|
_collisionEventPrimRemove.Clear();
|
||||||
|
|
||||||
// do a ode simulation step
|
// do a ode simulation step
|
||||||
d.WorldQuickStep(world, ODE_STEPSIZE);
|
d.WorldQuickStep(world, ODE_STEPSIZE);
|
||||||
d.JointGroupEmpty(contactgroup);
|
d.JointGroupEmpty(contactgroup);
|
||||||
|
|
||||||
// update managed ideia of physical data and do updates to core
|
// update managed ideia of physical data and do updates to core
|
||||||
/*
|
/*
|
||||||
lock (_characters)
|
lock (_characters)
|
||||||
{
|
{
|
||||||
foreach (OdeCharacter actor in _characters)
|
foreach (OdeCharacter actor in _characters)
|
||||||
{
|
{
|
||||||
if (actor != null)
|
if (actor != null)
|
||||||
{
|
{
|
||||||
if (actor.bad)
|
if (actor.bad)
|
||||||
m_log.WarnFormat("[PHYSICS]: BAD Actor {0} in _characters list was not removed?", actor.m_uuid);
|
m_log.WarnFormat("[PHYSICS]: BAD Actor {0} in _characters list was not removed?", actor.m_uuid);
|
||||||
|
|
||||||
actor.UpdatePositionAndVelocity();
|
actor.UpdatePositionAndVelocity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
lock (_activegroups)
|
lock (_activegroups)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue