aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/UbitOdePlugin
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs155
1 files changed, 101 insertions, 54 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index 2adbe01..f2b21a3 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -170,6 +170,8 @@ namespace OpenSim.Region.Physics.OdePlugin
170 // private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>(); 170 // private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>();
171 171
172 public bool OdeUbitLib = false; 172 public bool OdeUbitLib = false;
173 public bool m_suportCombine = false; // mega suport not tested
174
173// private int threadid = 0; 175// private int threadid = 0;
174// private Random fluidRandomizer = new Random(Environment.TickCount); 176// private Random fluidRandomizer = new Random(Environment.TickCount);
175 177
@@ -187,8 +189,8 @@ namespace OpenSim.Region.Physics.OdePlugin
187 189
188 public float AvatarFriction = 0;// 0.9f * 0.5f; 190 public float AvatarFriction = 0;// 0.9f * 0.5f;
189 191
190 private const uint m_regionWidth = Constants.RegionSize; 192 private uint m_regionWidth = Constants.RegionSize;
191 private const uint m_regionHeight = Constants.RegionSize; 193 private uint m_regionHeight = Constants.RegionSize;
192 194
193 public float ODE_STEPSIZE = 0.020f; 195 public float ODE_STEPSIZE = 0.020f;
194 public float HalfOdeStep = 0.01f; 196 public float HalfOdeStep = 0.01f;
@@ -418,8 +420,15 @@ namespace OpenSim.Region.Physics.OdePlugin
418 } 420 }
419 } 421 }
420 422
421 // Initialize the mesh plugin 423 public override void Initialise(IMesher meshmerizer, IConfigSource config, Vector3 regionExtent)
422// public override void Initialise(IMesher meshmerizer, IConfigSource config, RegionInfo region ) 424 {
425 WorldExtents.X = regionExtent.X;
426 WorldExtents.Y = regionExtent.Y;
427 m_suportCombine = false;
428 Initialise(meshmerizer, config);
429 }
430
431
423 public override void Initialise(IMesher meshmerizer, IConfigSource config) 432 public override void Initialise(IMesher meshmerizer, IConfigSource config)
424 { 433 {
425// checkThread(); 434// checkThread();
@@ -557,6 +566,11 @@ namespace OpenSim.Region.Physics.OdePlugin
557 spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter); 566 spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter);
558 spaceGridMaxY = (int)(WorldExtents.Y * spacesPerMeter); 567 spaceGridMaxY = (int)(WorldExtents.Y * spacesPerMeter);
559 568
569 if (spaceGridMaxX > 40)
570 spaceGridMaxX = 40;
571 if (spaceGridMaxY > 40)
572 spaceGridMaxY = 40;
573
560 staticPrimspace = new IntPtr[spaceGridMaxX, spaceGridMaxY]; 574 staticPrimspace = new IntPtr[spaceGridMaxX, spaceGridMaxY];
561 575
562 // create all spaces now 576 // create all spaces now
@@ -1882,17 +1896,25 @@ namespace OpenSim.Region.Physics.OdePlugin
1882 1896
1883 public float GetTerrainHeightAtXY(float x, float y) 1897 public float GetTerrainHeightAtXY(float x, float y)
1884 { 1898 {
1899 IntPtr heightFieldGeom = IntPtr.Zero;
1885 1900
1901 int offsetX = 0;
1902 int offsetY = 0;
1886 1903
1887 int offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize; 1904 if (m_suportCombine)
1888 int offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize; 1905 {
1889 1906 offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
1890 1907 offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
1891 IntPtr heightFieldGeom = IntPtr.Zero; 1908 // get region map
1909 if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom))
1910 return 0f;
1911 }
1912 else
1913 {
1914 if (!RegionTerrain.TryGetValue(Vector3.Zero , out heightFieldGeom))
1915 return 0f;
1916 }
1892 1917
1893 // get region map
1894 if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom))
1895 return 0f;
1896 1918
1897 if (heightFieldGeom == IntPtr.Zero) 1919 if (heightFieldGeom == IntPtr.Zero)
1898 return 0f; 1920 return 0f;
@@ -1917,28 +1939,30 @@ namespace OpenSim.Region.Physics.OdePlugin
1917 float dx; 1939 float dx;
1918 float dy; 1940 float dy;
1919 1941
1920 int regsize = (int)Constants.RegionSize + 3; // map size see setterrain number of samples 1942 int regsizeX = (int)WorldExtents.X + 3; // map size see setterrain number of samples
1943 int regsizeY = (int)WorldExtents.Y + 3; // map size see setterrain number of samples
1944 int regsize = regsizeX;
1921 1945
1922 if (OdeUbitLib) 1946 if (OdeUbitLib)
1923 { 1947 {
1924 if (x < regsize - 1) 1948 if (x < regsizeX - 1)
1925 { 1949 {
1926 ix = (int)x; 1950 ix = (int)x;
1927 dx = x - (float)ix; 1951 dx = x - (float)ix;
1928 } 1952 }
1929 else // out world use external height 1953 else // out world use external height
1930 { 1954 {
1931 ix = regsize - 2; 1955 ix = regsizeX - 2;
1932 dx = 0; 1956 dx = 0;
1933 } 1957 }
1934 if (y < regsize - 1) 1958 if (y < regsizeY - 1)
1935 { 1959 {
1936 iy = (int)y; 1960 iy = (int)y;
1937 dy = y - (float)iy; 1961 dy = y - (float)iy;
1938 } 1962 }
1939 else 1963 else
1940 { 1964 {
1941 iy = regsize - 2; 1965 iy = regsizeY - 2;
1942 dy = 0; 1966 dy = 0;
1943 } 1967 }
1944 } 1968 }
@@ -1948,24 +1972,26 @@ namespace OpenSim.Region.Physics.OdePlugin
1948 // also flip x and y because of how map is done for ODE fliped axis 1972 // also flip x and y because of how map is done for ODE fliped axis
1949 // so ix,iy,dx and dy are inter exchanged 1973 // so ix,iy,dx and dy are inter exchanged
1950 1974
1951 if (x < regsize - 1) 1975 regsize = regsizeY;
1976
1977 if (x < regsizeX - 1)
1952 { 1978 {
1953 iy = (int)x; 1979 iy = (int)x;
1954 dy = x - (float)iy; 1980 dy = x - (float)iy;
1955 } 1981 }
1956 else // out world use external height 1982 else // out world use external height
1957 { 1983 {
1958 iy = regsize - 2; 1984 iy = regsizeX - 2;
1959 dy = 0; 1985 dy = 0;
1960 } 1986 }
1961 if (y < regsize - 1) 1987 if (y < regsizeY - 1)
1962 { 1988 {
1963 ix = (int)y; 1989 ix = (int)y;
1964 dx = y - (float)ix; 1990 dx = y - (float)ix;
1965 } 1991 }
1966 else 1992 else
1967 { 1993 {
1968 ix = regsize - 2; 1994 ix = regsizeY - 2;
1969 dx = 0; 1995 dx = 0;
1970 } 1996 }
1971 } 1997 }
@@ -2014,15 +2040,25 @@ namespace OpenSim.Region.Physics.OdePlugin
2014 2040
2015 public Vector3 GetTerrainNormalAtXY(float x, float y) 2041 public Vector3 GetTerrainNormalAtXY(float x, float y)
2016 { 2042 {
2017 int offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
2018 int offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
2019
2020 IntPtr heightFieldGeom = IntPtr.Zero; 2043 IntPtr heightFieldGeom = IntPtr.Zero;
2021 Vector3 norm = new Vector3(0, 0, 1); 2044 Vector3 norm = new Vector3(0, 0, 1);
2022 2045
2023 // get region map 2046 int offsetX = 0;
2024 if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom)) 2047 int offsetY = 0;
2025 return norm; 2048
2049 if (m_suportCombine)
2050 {
2051 offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
2052 offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize;
2053 // get region map
2054 if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom))
2055 return norm; ;
2056 }
2057 else
2058 {
2059 if (!RegionTerrain.TryGetValue(Vector3.Zero, out heightFieldGeom))
2060 return norm; ;
2061 }
2026 2062
2027 if (heightFieldGeom == IntPtr.Zero) 2063 if (heightFieldGeom == IntPtr.Zero)
2028 return norm; 2064 return norm;
@@ -2047,32 +2083,34 @@ namespace OpenSim.Region.Physics.OdePlugin
2047 float dx; 2083 float dx;
2048 float dy; 2084 float dy;
2049 2085
2086 int regsizeX = (int)WorldExtents.X + 3; // map size see setterrain number of samples
2087 int regsizeY = (int)WorldExtents.Y + 3; // map size see setterrain number of samples
2088 int regsize = regsizeX;
2050 2089
2051 int regsize = (int)Constants.RegionSize + 3; // map size see setterrain number of samples
2052 int xstep = 1; 2090 int xstep = 1;
2053 int ystep = regsize; 2091 int ystep = regsizeX;
2054 bool firstTri = false; 2092 bool firstTri = false;
2055 2093
2056 if (OdeUbitLib) 2094 if (OdeUbitLib)
2057 { 2095 {
2058 if (x < regsize - 1) 2096 if (x < regsizeX - 1)
2059 { 2097 {
2060 ix = (int)x; 2098 ix = (int)x;
2061 dx = x - (float)ix; 2099 dx = x - (float)ix;
2062 } 2100 }
2063 else // out world use external height 2101 else // out world use external height
2064 { 2102 {
2065 ix = regsize - 2; 2103 ix = regsizeX - 2;
2066 dx = 0; 2104 dx = 0;
2067 } 2105 }
2068 if (y < regsize - 1) 2106 if (y < regsizeY - 1)
2069 { 2107 {
2070 iy = (int)y; 2108 iy = (int)y;
2071 dy = y - (float)iy; 2109 dy = y - (float)iy;
2072 } 2110 }
2073 else 2111 else
2074 { 2112 {
2075 iy = regsize - 2; 2113 iy = regsizeY - 2;
2076 dy = 0; 2114 dy = 0;
2077 } 2115 }
2078 firstTri = dy > dx; 2116 firstTri = dy > dx;
@@ -2080,29 +2118,31 @@ namespace OpenSim.Region.Physics.OdePlugin
2080 2118
2081 else 2119 else
2082 { 2120 {
2083 xstep = regsize; 2121 xstep = regsizeY;
2084 ystep = 1; 2122 ystep = 1;
2123 regsize = regsizeY;
2124
2085 // we still have square fixed size regions 2125 // we still have square fixed size regions
2086 // also flip x and y because of how map is done for ODE fliped axis 2126 // also flip x and y because of how map is done for ODE fliped axis
2087 // so ix,iy,dx and dy are inter exchanged 2127 // so ix,iy,dx and dy are inter exchanged
2088 if (x < regsize - 1) 2128 if (x < regsizeX - 1)
2089 { 2129 {
2090 iy = (int)x; 2130 iy = (int)x;
2091 dy = x - (float)iy; 2131 dy = x - (float)iy;
2092 } 2132 }
2093 else // out world use external height 2133 else // out world use external height
2094 { 2134 {
2095 iy = regsize - 2; 2135 iy = regsizeX - 2;
2096 dy = 0; 2136 dy = 0;
2097 } 2137 }
2098 if (y < regsize - 1) 2138 if (y < regsizeY - 1)
2099 { 2139 {
2100 ix = (int)y; 2140 ix = (int)y;
2101 dx = y - (float)ix; 2141 dx = y - (float)ix;
2102 } 2142 }
2103 else 2143 else
2104 { 2144 {
2105 ix = regsize - 2; 2145 ix = regsizeY - 2;
2106 dx = 0; 2146 dx = 0;
2107 } 2147 }
2108 firstTri = dx > dy; 2148 firstTri = dx > dy;
@@ -2175,8 +2215,12 @@ namespace OpenSim.Region.Physics.OdePlugin
2175 2215
2176 float[] _heightmap; 2216 float[] _heightmap;
2177 2217
2178 uint heightmapWidth = Constants.RegionSize + 2; 2218 uint regionsizeX = (uint)WorldExtents.X;
2179 uint heightmapHeight = Constants.RegionSize + 2; 2219 uint regionsizeY = (uint)WorldExtents.Y;
2220
2221 // map is rotated
2222 uint heightmapWidth = regionsizeY + 2;
2223 uint heightmapHeight = regionsizeX + 2;
2180 2224
2181 uint heightmapWidthSamples = heightmapWidth + 1; 2225 uint heightmapWidthSamples = heightmapWidth + 1;
2182 uint heightmapHeightSamples = heightmapHeight + 1; 2226 uint heightmapHeightSamples = heightmapHeight + 1;
@@ -2188,7 +2232,6 @@ namespace OpenSim.Region.Physics.OdePlugin
2188 const float thickness = 10f; 2232 const float thickness = 10f;
2189 const int wrap = 0; 2233 const int wrap = 0;
2190 2234
2191 uint regionsize = Constants.RegionSize;
2192 2235
2193 float hfmin = float.MaxValue; 2236 float hfmin = float.MaxValue;
2194 float hfmax = float.MinValue; 2237 float hfmax = float.MinValue;
@@ -2196,7 +2239,8 @@ namespace OpenSim.Region.Physics.OdePlugin
2196 uint xx; 2239 uint xx;
2197 uint yy; 2240 uint yy;
2198 2241
2199 uint maxXXYY = regionsize - 1; 2242 uint maxXX = regionsizeX - 1;
2243 uint maxYY = regionsizeY - 1;
2200 // flipping map adding one margin all around so things don't fall in edges 2244 // flipping map adding one margin all around so things don't fall in edges
2201 2245
2202 uint xt = 0; 2246 uint xt = 0;
@@ -2204,13 +2248,13 @@ namespace OpenSim.Region.Physics.OdePlugin
2204 2248
2205 for (uint x = 0; x < heightmapWidthSamples; x++) 2249 for (uint x = 0; x < heightmapWidthSamples; x++)
2206 { 2250 {
2207 if (x > 1 && xx < maxXXYY) 2251 if (x > 1 && xx < maxXX)
2208 xx++; 2252 xx++;
2209 yy = 0; 2253 yy = 0;
2210 for (uint y = 0; y < heightmapHeightSamples; y++) 2254 for (uint y = 0; y < heightmapHeightSamples; y++)
2211 { 2255 {
2212 if (y > 1 && y < maxXXYY) 2256 if (y > 1 && y < maxYY)
2213 yy += regionsize; 2257 yy += regionsizeX;
2214 2258
2215 val = heightMap[yy + xx]; 2259 val = heightMap[yy + xx];
2216 if (val < 0.0f) 2260 if (val < 0.0f)
@@ -2224,6 +2268,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2224 } 2268 }
2225 xt += heightmapHeightSamples; 2269 xt += heightmapHeightSamples;
2226 } 2270 }
2271
2227 lock (OdeLock) 2272 lock (OdeLock)
2228 { 2273 {
2229 IntPtr GroundGeom = IntPtr.Zero; 2274 IntPtr GroundGeom = IntPtr.Zero;
@@ -2296,8 +2341,11 @@ namespace OpenSim.Region.Physics.OdePlugin
2296 2341
2297 float[] _heightmap; 2342 float[] _heightmap;
2298 2343
2299 uint heightmapWidth = Constants.RegionSize + 2; 2344 uint regionsizeX = (uint)WorldExtents.X;
2300 uint heightmapHeight = Constants.RegionSize + 2; 2345 uint regionsizeY = (uint)WorldExtents.Y;
2346
2347 uint heightmapWidth = regionsizeX + 2;
2348 uint heightmapHeight = regionsizeY + 2;
2301 2349
2302 uint heightmapWidthSamples = heightmapWidth + 1; 2350 uint heightmapWidthSamples = heightmapWidth + 1;
2303 uint heightmapHeightSamples = heightmapHeight + 1; 2351 uint heightmapHeightSamples = heightmapHeight + 1;
@@ -2305,14 +2353,13 @@ namespace OpenSim.Region.Physics.OdePlugin
2305 _heightmap = new float[heightmapWidthSamples * heightmapHeightSamples]; 2353 _heightmap = new float[heightmapWidthSamples * heightmapHeightSamples];
2306 2354
2307 2355
2308 uint regionsize = Constants.RegionSize;
2309
2310 float hfmin = float.MaxValue; 2356 float hfmin = float.MaxValue;
2311// float hfmax = float.MinValue; 2357// float hfmax = float.MinValue;
2312 float val; 2358 float val;
2313 2359
2314 2360
2315 uint maxXXYY = regionsize - 1; 2361 uint maxXX = regionsizeX - 1;
2362 uint maxYY = regionsizeY - 1;
2316 // adding one margin all around so things don't fall in edges 2363 // adding one margin all around so things don't fall in edges
2317 2364
2318 uint xx; 2365 uint xx;
@@ -2321,12 +2368,12 @@ namespace OpenSim.Region.Physics.OdePlugin
2321 2368
2322 for (uint y = 0; y < heightmapHeightSamples; y++) 2369 for (uint y = 0; y < heightmapHeightSamples; y++)
2323 { 2370 {
2324 if (y > 1 && y < maxXXYY) 2371 if (y > 1 && y < maxYY)
2325 yy += regionsize; 2372 yy += regionsizeX;
2326 xx = 0; 2373 xx = 0;
2327 for (uint x = 0; x < heightmapWidthSamples; x++) 2374 for (uint x = 0; x < heightmapWidthSamples; x++)
2328 { 2375 {
2329 if (x > 1 && x < maxXXYY) 2376 if (x > 1 && x < maxXX)
2330 xx++; 2377 xx++;
2331 2378
2332 val = heightMap[yy + xx]; 2379 val = heightMap[yy + xx];
@@ -2409,7 +2456,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2409 2456
2410 public override bool SupportsCombining() 2457 public override bool SupportsCombining()
2411 { 2458 {
2412 return true; 2459 return m_suportCombine;
2413 } 2460 }
2414/* 2461/*
2415 public override void UnCombine(PhysicsScene pScene) 2462 public override void UnCombine(PhysicsScene pScene)