ubitode a bit more friendly for megas (still disabled)
parent
379362facf
commit
63f13b901a
|
@ -189,6 +189,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public float AvatarFriction = 0;// 0.9f * 0.5f;
|
public float AvatarFriction = 0;// 0.9f * 0.5f;
|
||||||
|
|
||||||
|
// this netx dimensions are only relevant for terrain partition (mega regions)
|
||||||
|
// WorldExtents below has the simulation dimensions
|
||||||
|
// they should be identical except on mega regions
|
||||||
private uint m_regionWidth = Constants.RegionSize;
|
private uint m_regionWidth = Constants.RegionSize;
|
||||||
private uint m_regionHeight = Constants.RegionSize;
|
private uint m_regionHeight = Constants.RegionSize;
|
||||||
|
|
||||||
|
@ -208,11 +211,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
private float waterlevel = 0f;
|
private float waterlevel = 0f;
|
||||||
private int framecount = 0;
|
private int framecount = 0;
|
||||||
|
|
||||||
private int m_meshExpireCntr;
|
// private int m_meshExpireCntr;
|
||||||
|
|
||||||
// private IntPtr WaterGeom = IntPtr.Zero;
|
|
||||||
// private IntPtr WaterHeightmapData = IntPtr.Zero;
|
|
||||||
// private GCHandle WaterMapHandler = new GCHandle();
|
|
||||||
|
|
||||||
private float avDensity = 3f;
|
private float avDensity = 3f;
|
||||||
private float avMovementDivisorWalk = 1.3f;
|
private float avMovementDivisorWalk = 1.3f;
|
||||||
|
@ -223,14 +222,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public float geomDefaultDensity = 10.000006836f;
|
public float geomDefaultDensity = 10.000006836f;
|
||||||
|
|
||||||
// public int geomContactPointsStartthrottle = 3;
|
|
||||||
// public int geomUpdatesPerThrottledUpdate = 15;
|
|
||||||
|
|
||||||
public float bodyPIDD = 35f;
|
public float bodyPIDD = 35f;
|
||||||
public float bodyPIDG = 25;
|
public float bodyPIDG = 25;
|
||||||
|
|
||||||
// public int geomCrossingFailuresBeforeOutofbounds = 6;
|
|
||||||
|
|
||||||
public int bodyFramesAutoDisable = 5;
|
public int bodyFramesAutoDisable = 5;
|
||||||
|
|
||||||
private d.NearCallback nearCallback;
|
private d.NearCallback nearCallback;
|
||||||
|
@ -293,7 +287,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// some speedup variables
|
// some speedup variables
|
||||||
private int spaceGridMaxX;
|
private int spaceGridMaxX;
|
||||||
private int spaceGridMaxY;
|
private int spaceGridMaxY;
|
||||||
private float spacesPerMeter;
|
private float spacesPerMeterX;
|
||||||
|
private float spacesPerMeterY;
|
||||||
|
|
||||||
// split static geometry collision into a grid as before
|
// split static geometry collision into a grid as before
|
||||||
private IntPtr[,] staticPrimspace;
|
private IntPtr[,] staticPrimspace;
|
||||||
|
@ -423,7 +418,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
public override void Initialise(IMesher meshmerizer, IConfigSource config, Vector3 regionExtent)
|
public override void Initialise(IMesher meshmerizer, IConfigSource config, Vector3 regionExtent)
|
||||||
{
|
{
|
||||||
WorldExtents.X = regionExtent.X;
|
WorldExtents.X = regionExtent.X;
|
||||||
|
m_regionWidth = (uint)regionExtent.X;
|
||||||
WorldExtents.Y = regionExtent.Y;
|
WorldExtents.Y = regionExtent.Y;
|
||||||
|
m_regionHeight = (uint)regionExtent.Y;
|
||||||
|
|
||||||
m_suportCombine = false;
|
m_suportCombine = false;
|
||||||
Initialise(meshmerizer, config);
|
Initialise(meshmerizer, config);
|
||||||
}
|
}
|
||||||
|
@ -446,14 +444,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if (region != null)
|
|
||||||
{
|
|
||||||
WorldExtents.X = region.RegionSizeX;
|
|
||||||
WorldExtents.Y = region.RegionSizeY;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Defaults
|
// Defaults
|
||||||
|
|
||||||
int contactsPerCollision = 80;
|
int contactsPerCollision = 80;
|
||||||
|
@ -474,7 +464,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer);
|
// contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer);
|
||||||
|
|
||||||
ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE);
|
ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE);
|
||||||
// m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", m_physicsiterations);
|
|
||||||
|
|
||||||
avDensity = physicsconfig.GetFloat("av_density", avDensity);
|
avDensity = physicsconfig.GetFloat("av_density", avDensity);
|
||||||
avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", avMovementDivisorWalk);
|
avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", avMovementDivisorWalk);
|
||||||
|
@ -482,10 +471,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", contactsPerCollision);
|
contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", contactsPerCollision);
|
||||||
|
|
||||||
// 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", geomDefaultDensity);
|
geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", geomDefaultDensity);
|
||||||
bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", bodyFramesAutoDisable);
|
bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", bodyFramesAutoDisable);
|
||||||
|
|
||||||
|
@ -562,14 +547,22 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
m_materialContactsData[(int)Material.light].bounce = 0.0f;
|
m_materialContactsData[(int)Material.light].bounce = 0.0f;
|
||||||
|
|
||||||
|
|
||||||
spacesPerMeter = 1 / metersInSpace;
|
spacesPerMeterX = 1.0f / metersInSpace;
|
||||||
spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter);
|
spacesPerMeterY = spacesPerMeterX;
|
||||||
spaceGridMaxY = (int)(WorldExtents.Y * spacesPerMeter);
|
spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeterX);
|
||||||
|
spaceGridMaxY = (int)(WorldExtents.Y * spacesPerMeterY);
|
||||||
|
|
||||||
if (spaceGridMaxX > 40)
|
if (spaceGridMaxX > 40)
|
||||||
|
{
|
||||||
spaceGridMaxX = 40;
|
spaceGridMaxX = 40;
|
||||||
|
spacesPerMeterX = WorldExtents.X / spaceGridMaxX;
|
||||||
|
}
|
||||||
|
|
||||||
if (spaceGridMaxY > 40)
|
if (spaceGridMaxY > 40)
|
||||||
|
{
|
||||||
spaceGridMaxY = 40;
|
spaceGridMaxY = 40;
|
||||||
|
spacesPerMeterY = WorldExtents.Y / spaceGridMaxY;
|
||||||
|
}
|
||||||
|
|
||||||
staticPrimspace = new IntPtr[spaceGridMaxX, spaceGridMaxY];
|
staticPrimspace = new IntPtr[spaceGridMaxX, spaceGridMaxY];
|
||||||
|
|
||||||
|
@ -596,7 +589,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
staticPrimspace[i, j] = newspace;
|
staticPrimspace[i, j] = newspace;
|
||||||
}
|
}
|
||||||
// let this now be real maximum values
|
|
||||||
|
// let this now be index limit
|
||||||
spaceGridMaxX--;
|
spaceGridMaxX--;
|
||||||
spaceGridMaxY--;
|
spaceGridMaxY--;
|
||||||
|
|
||||||
|
@ -1362,18 +1356,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
|
||||||
/// This is called from within simulate but outside the locked portion
|
|
||||||
/// We need to do our own locking here
|
|
||||||
/// (Note: As of 20110801 this no longer appears to be true - this is being called within lock (odeLock) in
|
|
||||||
/// Simulate() -- justincc).
|
|
||||||
///
|
|
||||||
/// Essentially, we need to remove the prim from our space segment, whatever segment it's in.
|
|
||||||
///
|
|
||||||
/// If there are no more prim in the segment, we need to empty (spacedestroy)the segment and reclaim memory
|
|
||||||
/// that the space was using.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="prim"></param>
|
|
||||||
public void RemovePrimThreadLocked(OdePrim prim)
|
public void RemovePrimThreadLocked(OdePrim prim)
|
||||||
{
|
{
|
||||||
//Console.WriteLine("RemovePrimThreadLocked " + prim.m_primName);
|
//Console.WriteLine("RemovePrimThreadLocked " + prim.m_primName);
|
||||||
|
@ -1496,11 +1479,11 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (pos.Y < 0)
|
if (pos.Y < 0)
|
||||||
return staticPrimspaceOffRegion[2];
|
return staticPrimspaceOffRegion[2];
|
||||||
|
|
||||||
x = (int)(pos.X * spacesPerMeter);
|
x = (int)(pos.X * spacesPerMeterX);
|
||||||
if (x > spaceGridMaxX)
|
if (x > spaceGridMaxX)
|
||||||
return staticPrimspaceOffRegion[1];
|
return staticPrimspaceOffRegion[1];
|
||||||
|
|
||||||
y = (int)(pos.Y * spacesPerMeter);
|
y = (int)(pos.Y * spacesPerMeterY);
|
||||||
if (y > spaceGridMaxY)
|
if (y > spaceGridMaxY)
|
||||||
return staticPrimspaceOffRegion[3];
|
return staticPrimspaceOffRegion[3];
|
||||||
|
|
||||||
|
@ -1694,10 +1677,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
aprim.Move();
|
aprim.Move();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//if ((framecount % m_randomizeWater) == 0)
|
|
||||||
// randomizeWater(waterlevel);
|
|
||||||
|
|
||||||
m_rayCastManager.ProcessQueuedRequests();
|
m_rayCastManager.ProcessQueuedRequests();
|
||||||
|
|
||||||
collision_optimized();
|
collision_optimized();
|
||||||
|
@ -1896,7 +1876,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public float GetTerrainHeightAtXY(float x, float y)
|
public float GetTerrainHeightAtXY(float x, float y)
|
||||||
{
|
{
|
||||||
IntPtr heightFieldGeom = IntPtr.Zero;
|
|
||||||
|
|
||||||
int offsetX = 0;
|
int offsetX = 0;
|
||||||
int offsetY = 0;
|
int offsetY = 0;
|
||||||
|
@ -1905,16 +1884,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
|
offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
|
||||||
offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
|
offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
|
||||||
// get region map
|
|
||||||
if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom))
|
|
||||||
return 0f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!RegionTerrain.TryGetValue(Vector3.Zero , out heightFieldGeom))
|
|
||||||
return 0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get region map
|
||||||
|
IntPtr heightFieldGeom = IntPtr.Zero;
|
||||||
|
if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom))
|
||||||
|
return 0f;
|
||||||
|
|
||||||
if (heightFieldGeom == IntPtr.Zero)
|
if (heightFieldGeom == IntPtr.Zero)
|
||||||
return 0f;
|
return 0f;
|
||||||
|
@ -1939,8 +1914,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
float dx;
|
float dx;
|
||||||
float dy;
|
float dy;
|
||||||
|
|
||||||
int regsizeX = (int)WorldExtents.X + 3; // map size see setterrain number of samples
|
int regsizeX = (int)m_regionWidth + 3; // map size see setterrain number of samples
|
||||||
int regsizeY = (int)WorldExtents.Y + 3; // map size see setterrain number of samples
|
int regsizeY = (int)m_regionHeight + 3; // map size see setterrain number of samples
|
||||||
int regsize = regsizeX;
|
int regsize = regsizeX;
|
||||||
|
|
||||||
if (OdeUbitLib)
|
if (OdeUbitLib)
|
||||||
|
@ -2040,9 +2015,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public Vector3 GetTerrainNormalAtXY(float x, float y)
|
public Vector3 GetTerrainNormalAtXY(float x, float y)
|
||||||
{
|
{
|
||||||
IntPtr heightFieldGeom = IntPtr.Zero;
|
|
||||||
Vector3 norm = new Vector3(0, 0, 1);
|
|
||||||
|
|
||||||
int offsetX = 0;
|
int offsetX = 0;
|
||||||
int offsetY = 0;
|
int offsetY = 0;
|
||||||
|
|
||||||
|
@ -2050,16 +2022,15 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
|
offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
|
||||||
offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
|
offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
|
||||||
// get region map
|
|
||||||
if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom))
|
|
||||||
return norm; ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!RegionTerrain.TryGetValue(Vector3.Zero, out heightFieldGeom))
|
|
||||||
return norm; ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get region map
|
||||||
|
IntPtr heightFieldGeom = IntPtr.Zero;
|
||||||
|
Vector3 norm = new Vector3(0, 0, 1);
|
||||||
|
|
||||||
|
if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom))
|
||||||
|
return norm; ;
|
||||||
|
|
||||||
if (heightFieldGeom == IntPtr.Zero)
|
if (heightFieldGeom == IntPtr.Zero)
|
||||||
return norm;
|
return norm;
|
||||||
|
|
||||||
|
@ -2083,8 +2054,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
float dx;
|
float dx;
|
||||||
float dy;
|
float dy;
|
||||||
|
|
||||||
int regsizeX = (int)WorldExtents.X + 3; // map size see setterrain number of samples
|
int regsizeX = (int)m_regionWidth + 3; // map size see setterrain number of samples
|
||||||
int regsizeY = (int)WorldExtents.Y + 3; // map size see setterrain number of samples
|
int regsizeY = (int)m_regionHeight + 3; // map size see setterrain number of samples
|
||||||
int regsize = regsizeX;
|
int regsize = regsizeX;
|
||||||
|
|
||||||
int xstep = 1;
|
int xstep = 1;
|
||||||
|
@ -2197,7 +2168,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public override void CombineTerrain(float[] heightMap, Vector3 pOffset)
|
public override void CombineTerrain(float[] heightMap, Vector3 pOffset)
|
||||||
{
|
{
|
||||||
SetTerrain(heightMap, pOffset);
|
if(m_suportCombine)
|
||||||
|
SetTerrain(heightMap, pOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetTerrain(float[] heightMap, Vector3 pOffset)
|
public void SetTerrain(float[] heightMap, Vector3 pOffset)
|
||||||
|
@ -2215,8 +2187,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
float[] _heightmap;
|
float[] _heightmap;
|
||||||
|
|
||||||
uint regionsizeX = (uint)WorldExtents.X;
|
uint regionsizeX = m_regionWidth;
|
||||||
uint regionsizeY = (uint)WorldExtents.Y;
|
uint regionsizeY = m_regionHeight;
|
||||||
|
|
||||||
// map is rotated
|
// map is rotated
|
||||||
uint heightmapWidth = regionsizeY + 2;
|
uint heightmapWidth = regionsizeY + 2;
|
||||||
|
@ -2326,7 +2298,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle);
|
d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle);
|
||||||
d.GeomSetRotation(GroundGeom, ref R);
|
d.GeomSetRotation(GroundGeom, ref R);
|
||||||
d.GeomSetPosition(GroundGeom, pOffset.X + WorldExtents.X * 0.5f, pOffset.Y + WorldExtents.Y * 0.5f, 0);
|
d.GeomSetPosition(GroundGeom, pOffset.X + m_regionWidth * 0.5f, pOffset.Y + m_regionHeight * 0.5f, 0);
|
||||||
RegionTerrain.Add(pOffset, GroundGeom);
|
RegionTerrain.Add(pOffset, GroundGeom);
|
||||||
TerrainHeightFieldHeights.Add(GroundGeom, _heightmap);
|
TerrainHeightFieldHeights.Add(GroundGeom, _heightmap);
|
||||||
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
|
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
|
||||||
|
@ -2341,8 +2313,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
float[] _heightmap;
|
float[] _heightmap;
|
||||||
|
|
||||||
uint regionsizeX = (uint)WorldExtents.X;
|
uint regionsizeX = m_regionWidth;
|
||||||
uint regionsizeY = (uint)WorldExtents.Y;
|
uint regionsizeY = m_regionHeight;
|
||||||
|
|
||||||
uint heightmapWidth = regionsizeX + 2;
|
uint heightmapWidth = regionsizeX + 2;
|
||||||
uint heightmapHeight = regionsizeY + 2;
|
uint heightmapHeight = regionsizeY + 2;
|
||||||
|
@ -2436,7 +2408,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
// geom_name_map[GroundGeom] = "Terrain";
|
// geom_name_map[GroundGeom] = "Terrain";
|
||||||
|
|
||||||
d.GeomSetPosition(GroundGeom, pOffset.X + WorldExtents.X * 0.5f, pOffset.Y + WorldExtents.Y * 0.5f, 0);
|
d.GeomSetPosition(GroundGeom, pOffset.X + m_regionWidth * 0.5f, pOffset.Y + m_regionHeight * 0.5f, 0);
|
||||||
RegionTerrain.Add(pOffset, GroundGeom);
|
RegionTerrain.Add(pOffset, GroundGeom);
|
||||||
TerrainHeightFieldHeights.Add(GroundGeom, _heightmap);
|
TerrainHeightFieldHeights.Add(GroundGeom, _heightmap);
|
||||||
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
|
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
|
||||||
|
@ -2521,90 +2493,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
public override void SetWaterLevel(float baseheight)
|
public override void SetWaterLevel(float baseheight)
|
||||||
{
|
{
|
||||||
waterlevel = baseheight;
|
waterlevel = baseheight;
|
||||||
// randomizeWater(waterlevel);
|
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
public void randomizeWater(float baseheight)
|
|
||||||
{
|
|
||||||
const uint heightmapWidth = Constants.RegionSize + 2;
|
|
||||||
const uint heightmapHeight = Constants.RegionSize + 2;
|
|
||||||
const uint heightmapWidthSamples = heightmapWidth + 1;
|
|
||||||
const uint heightmapHeightSamples = heightmapHeight + 1;
|
|
||||||
|
|
||||||
const float scale = 1.0f;
|
|
||||||
const float offset = 0.0f;
|
|
||||||
const int wrap = 0;
|
|
||||||
|
|
||||||
float[] _watermap = new float[heightmapWidthSamples * heightmapWidthSamples];
|
|
||||||
|
|
||||||
float maxheigh = float.MinValue;
|
|
||||||
float minheigh = float.MaxValue;
|
|
||||||
float val;
|
|
||||||
for (int i = 0; i < (heightmapWidthSamples * heightmapHeightSamples); i++)
|
|
||||||
{
|
|
||||||
|
|
||||||
val = (baseheight - 0.1f) + ((float)fluidRandomizer.Next(1, 9) / 10f);
|
|
||||||
_watermap[i] = val;
|
|
||||||
if (maxheigh < val)
|
|
||||||
maxheigh = val;
|
|
||||||
if (minheigh > val)
|
|
||||||
minheigh = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
float thickness = minheigh;
|
|
||||||
|
|
||||||
lock (OdeLock)
|
|
||||||
{
|
|
||||||
if (WaterGeom != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
actor_name_map.Remove(WaterGeom);
|
|
||||||
d.GeomDestroy(WaterGeom);
|
|
||||||
d.GeomHeightfieldDataDestroy(WaterHeightmapData);
|
|
||||||
WaterGeom = IntPtr.Zero;
|
|
||||||
WaterHeightmapData = IntPtr.Zero;
|
|
||||||
if(WaterMapHandler.IsAllocated)
|
|
||||||
WaterMapHandler.Free();
|
|
||||||
}
|
|
||||||
|
|
||||||
WaterHeightmapData = d.GeomHeightfieldDataCreate();
|
|
||||||
|
|
||||||
WaterMapHandler = GCHandle.Alloc(_watermap, GCHandleType.Pinned);
|
|
||||||
|
|
||||||
d.GeomHeightfieldDataBuildSingle(WaterHeightmapData, WaterMapHandler.AddrOfPinnedObject(), 0, heightmapWidth, heightmapHeight,
|
|
||||||
(int)heightmapWidthSamples, (int)heightmapHeightSamples, scale,
|
|
||||||
offset, thickness, wrap);
|
|
||||||
d.GeomHeightfieldDataSetBounds(WaterHeightmapData, minheigh, maxheigh);
|
|
||||||
WaterGeom = d.CreateHeightfield(StaticSpace, WaterHeightmapData, 1);
|
|
||||||
if (WaterGeom != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
d.GeomSetCategoryBits(WaterGeom, (uint)(CollisionCategories.Water));
|
|
||||||
d.GeomSetCollideBits(WaterGeom, 0);
|
|
||||||
|
|
||||||
|
|
||||||
PhysicsActor pa = new NullPhysicsActor();
|
|
||||||
pa.Name = "Water";
|
|
||||||
pa.PhysicsActorType = (int)ActorTypes.Water;
|
|
||||||
|
|
||||||
actor_name_map[WaterGeom] = pa;
|
|
||||||
// geom_name_map[WaterGeom] = "Water";
|
|
||||||
|
|
||||||
d.Matrix3 R = new d.Matrix3();
|
|
||||||
|
|
||||||
Quaternion q1 = Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), 1.5707f);
|
|
||||||
Quaternion q2 = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), 1.5707f);
|
|
||||||
|
|
||||||
q1 = q1 * q2;
|
|
||||||
Vector3 v3;
|
|
||||||
float angle;
|
|
||||||
q1.GetAxisAngle(out v3, out angle);
|
|
||||||
|
|
||||||
d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle);
|
|
||||||
d.GeomSetRotation(WaterGeom, ref R);
|
|
||||||
d.GeomSetPosition(WaterGeom, (float)Constants.RegionSize * 0.5f, (float)Constants.RegionSize * 0.5f, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
if (m_meshWorker != null)
|
if (m_meshWorker != null)
|
||||||
|
@ -2658,19 +2548,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
TerrainHeightFieldHeightsHandlers.Clear();
|
TerrainHeightFieldHeightsHandlers.Clear();
|
||||||
TerrainHeightFieldHeights.Clear();
|
TerrainHeightFieldHeights.Clear();
|
||||||
/*
|
|
||||||
if (WaterGeom != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
d.GeomDestroy(WaterGeom);
|
|
||||||
WaterGeom = IntPtr.Zero;
|
|
||||||
if (WaterHeightmapData != IntPtr.Zero)
|
|
||||||
d.GeomHeightfieldDataDestroy(WaterHeightmapData);
|
|
||||||
WaterHeightmapData = IntPtr.Zero;
|
|
||||||
|
|
||||||
if (WaterMapHandler.IsAllocated)
|
|
||||||
WaterMapHandler.Free();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if (ContactgeomsArray != IntPtr.Zero)
|
if (ContactgeomsArray != IntPtr.Zero)
|
||||||
Marshal.FreeHGlobal(ContactgeomsArray);
|
Marshal.FreeHGlobal(ContactgeomsArray);
|
||||||
if (GlobalContactsArray != IntPtr.Zero)
|
if (GlobalContactsArray != IntPtr.Zero)
|
||||||
|
|
Loading…
Reference in New Issue