diff options
author | Teravus Ovares | 2009-04-05 08:43:29 +0000 |
---|---|---|
committer | Teravus Ovares | 2009-04-05 08:43:29 +0000 |
commit | cf1e8b17237a7e4e5367e7bde887f97eba2547d8 (patch) | |
tree | 0c0fcd4b5473fdc5fedbd1c756dddc509d3e416f /OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs | |
parent | * Committing what I have on the BulletDotNETPlugin that I have so far. (diff) | |
download | opensim-SC-cf1e8b17237a7e4e5367e7bde887f97eba2547d8.zip opensim-SC-cf1e8b17237a7e4e5367e7bde887f97eba2547d8.tar.gz opensim-SC-cf1e8b17237a7e4e5367e7bde887f97eba2547d8.tar.bz2 opensim-SC-cf1e8b17237a7e4e5367e7bde887f97eba2547d8.tar.xz |
* Fixing SVN properties
Diffstat (limited to 'OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs')
-rw-r--r-- | OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs | 1284 |
1 files changed, 642 insertions, 642 deletions
diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs index 4fcf035..f3fee33 100644 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs +++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs | |||
@@ -1,642 +1,642 @@ | |||
1 | using System; | 1 | using System; |
2 | using System.Collections.Generic; | 2 | using System.Collections.Generic; |
3 | using System.Reflection; | 3 | using System.Reflection; |
4 | using System.IO; | 4 | using System.IO; |
5 | using System.Diagnostics; | 5 | using System.Diagnostics; |
6 | using System.Threading; | 6 | using System.Threading; |
7 | using log4net; | 7 | using log4net; |
8 | using Nini.Config; | 8 | using Nini.Config; |
9 | using OpenSim.Framework; | 9 | using OpenSim.Framework; |
10 | using OpenSim.Region.Physics.Manager; | 10 | using OpenSim.Region.Physics.Manager; |
11 | using OpenMetaverse; | 11 | using OpenMetaverse; |
12 | using BulletDotNET; | 12 | using BulletDotNET; |
13 | 13 | ||
14 | namespace OpenSim.Region.Physics.BulletDotNETPlugin | 14 | namespace OpenSim.Region.Physics.BulletDotNETPlugin |
15 | { | 15 | { |
16 | public class BulletDotNETScene : PhysicsScene | 16 | public class BulletDotNETScene : PhysicsScene |
17 | { | 17 | { |
18 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 18 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
19 | 19 | ||
20 | private string m_sceneIdentifier = string.Empty; | 20 | private string m_sceneIdentifier = string.Empty; |
21 | 21 | ||
22 | private List<BulletDotNETCharacter> m_characters = new List<BulletDotNETCharacter>(); | 22 | private List<BulletDotNETCharacter> m_characters = new List<BulletDotNETCharacter>(); |
23 | private List<BulletDotNETPrim> m_prims = new List<BulletDotNETPrim>(); | 23 | private List<BulletDotNETPrim> m_prims = new List<BulletDotNETPrim>(); |
24 | private List<BulletDotNETPrim> m_activePrims = new List<BulletDotNETPrim>(); | 24 | private List<BulletDotNETPrim> m_activePrims = new List<BulletDotNETPrim>(); |
25 | private List<PhysicsActor> m_taintedActors = new List<PhysicsActor>(); | 25 | private List<PhysicsActor> m_taintedActors = new List<PhysicsActor>(); |
26 | private btDiscreteDynamicsWorld m_world; | 26 | private btDiscreteDynamicsWorld m_world; |
27 | private btAxisSweep3 m_broadphase; | 27 | private btAxisSweep3 m_broadphase; |
28 | private btCollisionConfiguration m_collisionConfiguration; | 28 | private btCollisionConfiguration m_collisionConfiguration; |
29 | private btConstraintSolver m_solver; | 29 | private btConstraintSolver m_solver; |
30 | private btCollisionDispatcher m_dispatcher; | 30 | private btCollisionDispatcher m_dispatcher; |
31 | private btHeightfieldTerrainShape m_terrainShape; | 31 | private btHeightfieldTerrainShape m_terrainShape; |
32 | public btRigidBody TerrainBody; | 32 | public btRigidBody TerrainBody; |
33 | private btVector3 m_terrainPosition; | 33 | private btVector3 m_terrainPosition; |
34 | private btVector3 m_gravity; | 34 | private btVector3 m_gravity; |
35 | public btMotionState m_terrainMotionState; | 35 | public btMotionState m_terrainMotionState; |
36 | public btTransform m_terrainTransform; | 36 | public btTransform m_terrainTransform; |
37 | public btVector3 VectorZero; | 37 | public btVector3 VectorZero; |
38 | public btQuaternion QuatIdentity; | 38 | public btQuaternion QuatIdentity; |
39 | public btTransform TransZero; | 39 | public btTransform TransZero; |
40 | 40 | ||
41 | public float geomDefaultDensity = 10.000006836f; | 41 | public float geomDefaultDensity = 10.000006836f; |
42 | 42 | ||
43 | private float avPIDD = 65f; | 43 | private float avPIDD = 65f; |
44 | private float avPIDP = 28f; | 44 | private float avPIDP = 28f; |
45 | private float avCapRadius = 0.37f; | 45 | private float avCapRadius = 0.37f; |
46 | private float avStandupTensor = 2000000f; | 46 | private float avStandupTensor = 2000000f; |
47 | private float avDensity = 80f; | 47 | private float avDensity = 80f; |
48 | private float avHeightFudgeFactor = 0.52f; | 48 | private float avHeightFudgeFactor = 0.52f; |
49 | private float avMovementDivisorWalk = 1.0f; | 49 | private float avMovementDivisorWalk = 1.0f; |
50 | private float avMovementDivisorRun = 0.75f; | 50 | private float avMovementDivisorRun = 0.75f; |
51 | 51 | ||
52 | private float minimumGroundFlightOffset = 3f; | 52 | private float minimumGroundFlightOffset = 3f; |
53 | 53 | ||
54 | public bool meshSculptedPrim = true; | 54 | public bool meshSculptedPrim = true; |
55 | 55 | ||
56 | public float meshSculptLOD = 32; | 56 | public float meshSculptLOD = 32; |
57 | public float MeshSculptphysicalLOD = 16; | 57 | public float MeshSculptphysicalLOD = 16; |
58 | 58 | ||
59 | public float bodyPIDD = 35f; | 59 | public float bodyPIDD = 35f; |
60 | public float bodyPIDG = 25; | 60 | public float bodyPIDG = 25; |
61 | internal int geomCrossingFailuresBeforeOutofbounds = 4; | 61 | internal int geomCrossingFailuresBeforeOutofbounds = 4; |
62 | 62 | ||
63 | public float bodyMotorJointMaxforceTensor = 2; | 63 | public float bodyMotorJointMaxforceTensor = 2; |
64 | 64 | ||
65 | public int bodyFramesAutoDisable = 20; | 65 | public int bodyFramesAutoDisable = 20; |
66 | 66 | ||
67 | public float WorldTimeStep = 10f/60f; | 67 | public float WorldTimeStep = 10f/60f; |
68 | public const float WorldTimeComp = 1/60f; | 68 | public const float WorldTimeComp = 1/60f; |
69 | public float gravityz = -9.8f; | 69 | public float gravityz = -9.8f; |
70 | 70 | ||
71 | private float[] _origheightmap; // Used for Fly height. Kitto Flora | 71 | private float[] _origheightmap; // Used for Fly height. Kitto Flora |
72 | private bool usingGImpactAlgorithm = false; | 72 | private bool usingGImpactAlgorithm = false; |
73 | 73 | ||
74 | private IConfigSource m_config; | 74 | private IConfigSource m_config; |
75 | private readonly btVector3 worldAabbMin = new btVector3(0, 0, 0); | 75 | private readonly btVector3 worldAabbMin = new btVector3(0, 0, 0); |
76 | private readonly btVector3 worldAabbMax = new btVector3(Constants.RegionSize, Constants.RegionSize , 9000); | 76 | private readonly btVector3 worldAabbMax = new btVector3(Constants.RegionSize, Constants.RegionSize , 9000); |
77 | 77 | ||
78 | public IMesher mesher; | 78 | public IMesher mesher; |
79 | 79 | ||
80 | public BulletDotNETScene(string sceneIdentifier) | 80 | public BulletDotNETScene(string sceneIdentifier) |
81 | { | 81 | { |
82 | m_sceneIdentifier = sceneIdentifier; | 82 | m_sceneIdentifier = sceneIdentifier; |
83 | VectorZero = new btVector3(0, 0, 0); | 83 | VectorZero = new btVector3(0, 0, 0); |
84 | QuatIdentity = new btQuaternion(0, 0, 0, 1); | 84 | QuatIdentity = new btQuaternion(0, 0, 0, 1); |
85 | TransZero = new btTransform(QuatIdentity, VectorZero); | 85 | TransZero = new btTransform(QuatIdentity, VectorZero); |
86 | m_gravity = new btVector3(0, 0, gravityz); | 86 | m_gravity = new btVector3(0, 0, gravityz); |
87 | _origheightmap = new float[(int)Constants.RegionSize * (int)Constants.RegionSize]; | 87 | _origheightmap = new float[(int)Constants.RegionSize * (int)Constants.RegionSize]; |
88 | } | 88 | } |
89 | 89 | ||
90 | public override void Initialise(IMesher meshmerizer, IConfigSource config) | 90 | public override void Initialise(IMesher meshmerizer, IConfigSource config) |
91 | { | 91 | { |
92 | mesher = meshmerizer; | 92 | mesher = meshmerizer; |
93 | m_config = config; | 93 | m_config = config; |
94 | if (Environment.OSVersion.Platform == PlatformID.Unix) | 94 | if (Environment.OSVersion.Platform == PlatformID.Unix) |
95 | { | 95 | { |
96 | m_log.Fatal("[BulletDotNET]: This configuration is not supported on *nix currently"); | 96 | m_log.Fatal("[BulletDotNET]: This configuration is not supported on *nix currently"); |
97 | Thread.Sleep(5000); | 97 | Thread.Sleep(5000); |
98 | Environment.Exit(0); | 98 | Environment.Exit(0); |
99 | } | 99 | } |
100 | m_broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, 16000); | 100 | m_broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, 16000); |
101 | m_collisionConfiguration = new btDefaultCollisionConfiguration(); | 101 | m_collisionConfiguration = new btDefaultCollisionConfiguration(); |
102 | m_solver = new btSequentialImpulseConstraintSolver(); | 102 | m_solver = new btSequentialImpulseConstraintSolver(); |
103 | m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); | 103 | m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); |
104 | m_world = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration); | 104 | m_world = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration); |
105 | m_world.setGravity(m_gravity); | 105 | m_world.setGravity(m_gravity); |
106 | } | 106 | } |
107 | 107 | ||
108 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) | 108 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) |
109 | { | 109 | { |
110 | BulletDotNETCharacter chr = new BulletDotNETCharacter(avName, this, position, size, avPIDD, avPIDP, | 110 | BulletDotNETCharacter chr = new BulletDotNETCharacter(avName, this, position, size, avPIDD, avPIDP, |
111 | avCapRadius, avStandupTensor, avDensity, | 111 | avCapRadius, avStandupTensor, avDensity, |
112 | avHeightFudgeFactor, avMovementDivisorWalk, | 112 | avHeightFudgeFactor, avMovementDivisorWalk, |
113 | avMovementDivisorRun); | 113 | avMovementDivisorRun); |
114 | m_characters.Add(chr); | 114 | m_characters.Add(chr); |
115 | AddPhysicsActorTaint(chr); | 115 | AddPhysicsActorTaint(chr); |
116 | return chr; | 116 | return chr; |
117 | } | 117 | } |
118 | 118 | ||
119 | public override void RemoveAvatar(PhysicsActor actor) | 119 | public override void RemoveAvatar(PhysicsActor actor) |
120 | { | 120 | { |
121 | BulletDotNETCharacter chr = (BulletDotNETCharacter) actor; | 121 | BulletDotNETCharacter chr = (BulletDotNETCharacter) actor; |
122 | 122 | ||
123 | m_characters.Remove(chr); | 123 | m_characters.Remove(chr); |
124 | m_world.removeRigidBody(chr.Body); | 124 | m_world.removeRigidBody(chr.Body); |
125 | m_world.removeCollisionObject(chr.Body); | 125 | m_world.removeCollisionObject(chr.Body); |
126 | 126 | ||
127 | chr.Remove(); | 127 | chr.Remove(); |
128 | AddPhysicsActorTaint(chr); | 128 | AddPhysicsActorTaint(chr); |
129 | //chr = null; | 129 | //chr = null; |
130 | } | 130 | } |
131 | 131 | ||
132 | public override void RemovePrim(PhysicsActor prim) | 132 | public override void RemovePrim(PhysicsActor prim) |
133 | { | 133 | { |
134 | if (prim is BulletDotNETPrim) | 134 | if (prim is BulletDotNETPrim) |
135 | { | 135 | { |
136 | 136 | ||
137 | BulletDotNETPrim p = (BulletDotNETPrim)prim; | 137 | BulletDotNETPrim p = (BulletDotNETPrim)prim; |
138 | 138 | ||
139 | p.setPrimForRemoval(); | 139 | p.setPrimForRemoval(); |
140 | AddPhysicsActorTaint(prim); | 140 | AddPhysicsActorTaint(prim); |
141 | //RemovePrimThreadLocked(p); | 141 | //RemovePrimThreadLocked(p); |
142 | 142 | ||
143 | } | 143 | } |
144 | } | 144 | } |
145 | 145 | ||
146 | private PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, Quaternion rotation, | 146 | private PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, Quaternion rotation, |
147 | IMesh mesh, PrimitiveBaseShape pbs, bool isphysical) | 147 | IMesh mesh, PrimitiveBaseShape pbs, bool isphysical) |
148 | { | 148 | { |
149 | PhysicsVector pos = new PhysicsVector(position.X, position.Y, position.Z); | 149 | PhysicsVector pos = new PhysicsVector(position.X, position.Y, position.Z); |
150 | //pos.X = position.X; | 150 | //pos.X = position.X; |
151 | //pos.Y = position.Y; | 151 | //pos.Y = position.Y; |
152 | //pos.Z = position.Z; | 152 | //pos.Z = position.Z; |
153 | PhysicsVector siz = new PhysicsVector(); | 153 | PhysicsVector siz = new PhysicsVector(); |
154 | siz.X = size.X; | 154 | siz.X = size.X; |
155 | siz.Y = size.Y; | 155 | siz.Y = size.Y; |
156 | siz.Z = size.Z; | 156 | siz.Z = size.Z; |
157 | Quaternion rot = rotation; | 157 | Quaternion rot = rotation; |
158 | 158 | ||
159 | BulletDotNETPrim newPrim; | 159 | BulletDotNETPrim newPrim; |
160 | 160 | ||
161 | newPrim = new BulletDotNETPrim(name, this, pos, siz, rot, mesh, pbs, isphysical); | 161 | newPrim = new BulletDotNETPrim(name, this, pos, siz, rot, mesh, pbs, isphysical); |
162 | 162 | ||
163 | lock (m_prims) | 163 | lock (m_prims) |
164 | m_prims.Add(newPrim); | 164 | m_prims.Add(newPrim); |
165 | 165 | ||
166 | 166 | ||
167 | return newPrim; | 167 | return newPrim; |
168 | } | 168 | } |
169 | 169 | ||
170 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation) | 170 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation) |
171 | { | 171 | { |
172 | return AddPrimShape(primName, pbs, position, size, rotation, false); | 172 | return AddPrimShape(primName, pbs, position, size, rotation, false); |
173 | } | 173 | } |
174 | 174 | ||
175 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation, bool isPhysical) | 175 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation, bool isPhysical) |
176 | { | 176 | { |
177 | PhysicsActor result; | 177 | PhysicsActor result; |
178 | IMesh mesh = null; | 178 | IMesh mesh = null; |
179 | 179 | ||
180 | //switch (pbs.ProfileShape) | 180 | //switch (pbs.ProfileShape) |
181 | //{ | 181 | //{ |
182 | // case ProfileShape.Square: | 182 | // case ProfileShape.Square: |
183 | // //support simple box & hollow box now; later, more shapes | 183 | // //support simple box & hollow box now; later, more shapes |
184 | // if (needsMeshing(pbs)) | 184 | // if (needsMeshing(pbs)) |
185 | // { | 185 | // { |
186 | // mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); | 186 | // mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); |
187 | // } | 187 | // } |
188 | 188 | ||
189 | // break; | 189 | // break; |
190 | //} | 190 | //} |
191 | 191 | ||
192 | if (needsMeshing(pbs)) | 192 | if (needsMeshing(pbs)) |
193 | mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); | 193 | mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); |
194 | 194 | ||
195 | result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); | 195 | result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); |
196 | 196 | ||
197 | return result; | 197 | return result; |
198 | } | 198 | } |
199 | 199 | ||
200 | public override void AddPhysicsActorTaint(PhysicsActor prim) | 200 | public override void AddPhysicsActorTaint(PhysicsActor prim) |
201 | { | 201 | { |
202 | lock (m_taintedActors) | 202 | lock (m_taintedActors) |
203 | { | 203 | { |
204 | if (!m_taintedActors.Contains(prim)) | 204 | if (!m_taintedActors.Contains(prim)) |
205 | { | 205 | { |
206 | m_taintedActors.Add(prim); | 206 | m_taintedActors.Add(prim); |
207 | } | 207 | } |
208 | } | 208 | } |
209 | } | 209 | } |
210 | internal void SetUsingGImpact() | 210 | internal void SetUsingGImpact() |
211 | { | 211 | { |
212 | if (!usingGImpactAlgorithm) | 212 | if (!usingGImpactAlgorithm) |
213 | btGImpactCollisionAlgorithm.registerAlgorithm(m_dispatcher); | 213 | btGImpactCollisionAlgorithm.registerAlgorithm(m_dispatcher); |
214 | usingGImpactAlgorithm = true; | 214 | usingGImpactAlgorithm = true; |
215 | } | 215 | } |
216 | 216 | ||
217 | public override float Simulate(float timeStep) | 217 | public override float Simulate(float timeStep) |
218 | { | 218 | { |
219 | lock (m_taintedActors) | 219 | lock (m_taintedActors) |
220 | { | 220 | { |
221 | foreach (PhysicsActor act in m_taintedActors) | 221 | foreach (PhysicsActor act in m_taintedActors) |
222 | { | 222 | { |
223 | if (act is BulletDotNETCharacter) | 223 | if (act is BulletDotNETCharacter) |
224 | ((BulletDotNETCharacter) act).ProcessTaints(timeStep); | 224 | ((BulletDotNETCharacter) act).ProcessTaints(timeStep); |
225 | if (act is BulletDotNETPrim) | 225 | if (act is BulletDotNETPrim) |
226 | ((BulletDotNETPrim)act).ProcessTaints(timeStep); | 226 | ((BulletDotNETPrim)act).ProcessTaints(timeStep); |
227 | } | 227 | } |
228 | m_taintedActors.Clear(); | 228 | m_taintedActors.Clear(); |
229 | } | 229 | } |
230 | 230 | ||
231 | lock (m_characters) | 231 | lock (m_characters) |
232 | { | 232 | { |
233 | foreach (BulletDotNETCharacter chr in m_characters) | 233 | foreach (BulletDotNETCharacter chr in m_characters) |
234 | { | 234 | { |
235 | chr.Move(timeStep); | 235 | chr.Move(timeStep); |
236 | } | 236 | } |
237 | } | 237 | } |
238 | 238 | ||
239 | lock (m_prims) | 239 | lock (m_prims) |
240 | { | 240 | { |
241 | foreach (BulletDotNETPrim prim in m_prims) | 241 | foreach (BulletDotNETPrim prim in m_prims) |
242 | { | 242 | { |
243 | prim.Move(timeStep); | 243 | prim.Move(timeStep); |
244 | } | 244 | } |
245 | } | 245 | } |
246 | float steps = m_world.stepSimulation(WorldTimeStep, 5, WorldTimeComp); | 246 | float steps = m_world.stepSimulation(WorldTimeStep, 5, WorldTimeComp); |
247 | 247 | ||
248 | foreach (BulletDotNETCharacter chr in m_characters) | 248 | foreach (BulletDotNETCharacter chr in m_characters) |
249 | { | 249 | { |
250 | chr.UpdatePositionAndVelocity(); | 250 | chr.UpdatePositionAndVelocity(); |
251 | } | 251 | } |
252 | 252 | ||
253 | foreach (BulletDotNETPrim prm in m_activePrims) | 253 | foreach (BulletDotNETPrim prm in m_activePrims) |
254 | { | 254 | { |
255 | prm.UpdatePositionAndVelocity(); | 255 | prm.UpdatePositionAndVelocity(); |
256 | } | 256 | } |
257 | 257 | ||
258 | return steps; | 258 | return steps; |
259 | } | 259 | } |
260 | 260 | ||
261 | public override void GetResults() | 261 | public override void GetResults() |
262 | { | 262 | { |
263 | 263 | ||
264 | } | 264 | } |
265 | 265 | ||
266 | public override void SetTerrain(float[] heightMap) | 266 | public override void SetTerrain(float[] heightMap) |
267 | { | 267 | { |
268 | if (m_terrainShape != null) | 268 | if (m_terrainShape != null) |
269 | DeleteTerrain(); | 269 | DeleteTerrain(); |
270 | 270 | ||
271 | float hfmax = -9000; | 271 | float hfmax = -9000; |
272 | float hfmin = 90000; | 272 | float hfmin = 90000; |
273 | 273 | ||
274 | for (int i = 0; i <heightMap.Length;i++) | 274 | for (int i = 0; i <heightMap.Length;i++) |
275 | { | 275 | { |
276 | if (Single.IsNaN(heightMap[i]) || Single.IsInfinity(heightMap[i])) | 276 | if (Single.IsNaN(heightMap[i]) || Single.IsInfinity(heightMap[i])) |
277 | { | 277 | { |
278 | heightMap[i] = 0f; | 278 | heightMap[i] = 0f; |
279 | } | 279 | } |
280 | 280 | ||
281 | hfmin = (heightMap[i] < hfmin) ? heightMap[i] : hfmin; | 281 | hfmin = (heightMap[i] < hfmin) ? heightMap[i] : hfmin; |
282 | hfmax = (heightMap[i] > hfmax) ? heightMap[i] : hfmax; | 282 | hfmax = (heightMap[i] > hfmax) ? heightMap[i] : hfmax; |
283 | } | 283 | } |
284 | // store this for later reference. | 284 | // store this for later reference. |
285 | // Note, we're storing it after we check it for anomolies above | 285 | // Note, we're storing it after we check it for anomolies above |
286 | _origheightmap = heightMap; | 286 | _origheightmap = heightMap; |
287 | 287 | ||
288 | hfmin = 0; | 288 | hfmin = 0; |
289 | hfmax = 256; | 289 | hfmax = 256; |
290 | 290 | ||
291 | m_terrainShape = new btHeightfieldTerrainShape((int)Constants.RegionSize, (int)Constants.RegionSize, heightMap, | 291 | m_terrainShape = new btHeightfieldTerrainShape((int)Constants.RegionSize, (int)Constants.RegionSize, heightMap, |
292 | 1.0f, hfmin, hfmax, (int)btHeightfieldTerrainShape.UPAxis.Z, | 292 | 1.0f, hfmin, hfmax, (int)btHeightfieldTerrainShape.UPAxis.Z, |
293 | (int)btHeightfieldTerrainShape.PHY_ScalarType.PHY_FLOAT, false); | 293 | (int)btHeightfieldTerrainShape.PHY_ScalarType.PHY_FLOAT, false); |
294 | float AabbCenterX = Constants.RegionSize/2f; | 294 | float AabbCenterX = Constants.RegionSize/2f; |
295 | float AabbCenterY = Constants.RegionSize/2f; | 295 | float AabbCenterY = Constants.RegionSize/2f; |
296 | 296 | ||
297 | float AabbCenterZ = 0; | 297 | float AabbCenterZ = 0; |
298 | float temphfmin, temphfmax; | 298 | float temphfmin, temphfmax; |
299 | 299 | ||
300 | temphfmin = hfmin; | 300 | temphfmin = hfmin; |
301 | temphfmax = hfmax; | 301 | temphfmax = hfmax; |
302 | 302 | ||
303 | if (temphfmin < 0) | 303 | if (temphfmin < 0) |
304 | { | 304 | { |
305 | temphfmax = 0 - temphfmin; | 305 | temphfmax = 0 - temphfmin; |
306 | temphfmin = 0 - temphfmin; | 306 | temphfmin = 0 - temphfmin; |
307 | } | 307 | } |
308 | else if (temphfmin > 0) | 308 | else if (temphfmin > 0) |
309 | { | 309 | { |
310 | temphfmax = temphfmax + (0 - temphfmin); | 310 | temphfmax = temphfmax + (0 - temphfmin); |
311 | //temphfmin = temphfmin + (0 - temphfmin); | 311 | //temphfmin = temphfmin + (0 - temphfmin); |
312 | } | 312 | } |
313 | AabbCenterZ = temphfmax/2f; | 313 | AabbCenterZ = temphfmax/2f; |
314 | 314 | ||
315 | if (m_terrainPosition == null) | 315 | if (m_terrainPosition == null) |
316 | { | 316 | { |
317 | m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); | 317 | m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); |
318 | } | 318 | } |
319 | else | 319 | else |
320 | { | 320 | { |
321 | try | 321 | try |
322 | { | 322 | { |
323 | m_terrainPosition.setValue(AabbCenterX, AabbCenterY, AabbCenterZ); | 323 | m_terrainPosition.setValue(AabbCenterX, AabbCenterY, AabbCenterZ); |
324 | } | 324 | } |
325 | catch (ObjectDisposedException) | 325 | catch (ObjectDisposedException) |
326 | { | 326 | { |
327 | m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); | 327 | m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); |
328 | } | 328 | } |
329 | } | 329 | } |
330 | if (m_terrainMotionState != null) | 330 | if (m_terrainMotionState != null) |
331 | { | 331 | { |
332 | m_terrainMotionState.Dispose(); | 332 | m_terrainMotionState.Dispose(); |
333 | m_terrainMotionState = null; | 333 | m_terrainMotionState = null; |
334 | } | 334 | } |
335 | m_terrainTransform = new btTransform(QuatIdentity, m_terrainPosition); | 335 | m_terrainTransform = new btTransform(QuatIdentity, m_terrainPosition); |
336 | m_terrainMotionState = new btDefaultMotionState(m_terrainTransform); | 336 | m_terrainMotionState = new btDefaultMotionState(m_terrainTransform); |
337 | TerrainBody = new btRigidBody(0, m_terrainMotionState, m_terrainShape); | 337 | TerrainBody = new btRigidBody(0, m_terrainMotionState, m_terrainShape); |
338 | m_world.addRigidBody(TerrainBody); | 338 | m_world.addRigidBody(TerrainBody); |
339 | 339 | ||
340 | 340 | ||
341 | } | 341 | } |
342 | 342 | ||
343 | public override void SetWaterLevel(float baseheight) | 343 | public override void SetWaterLevel(float baseheight) |
344 | { | 344 | { |
345 | 345 | ||
346 | } | 346 | } |
347 | 347 | ||
348 | public override void DeleteTerrain() | 348 | public override void DeleteTerrain() |
349 | { | 349 | { |
350 | if (TerrainBody != null) | 350 | if (TerrainBody != null) |
351 | { | 351 | { |
352 | m_world.removeRigidBody(TerrainBody); | 352 | m_world.removeRigidBody(TerrainBody); |
353 | } | 353 | } |
354 | 354 | ||
355 | if (m_terrainShape != null) | 355 | if (m_terrainShape != null) |
356 | { | 356 | { |
357 | m_terrainShape.Dispose(); | 357 | m_terrainShape.Dispose(); |
358 | m_terrainShape = null; | 358 | m_terrainShape = null; |
359 | } | 359 | } |
360 | 360 | ||
361 | if (m_terrainMotionState != null) | 361 | if (m_terrainMotionState != null) |
362 | { | 362 | { |
363 | m_terrainMotionState.Dispose(); | 363 | m_terrainMotionState.Dispose(); |
364 | m_terrainMotionState = null; | 364 | m_terrainMotionState = null; |
365 | } | 365 | } |
366 | 366 | ||
367 | if (m_terrainTransform != null) | 367 | if (m_terrainTransform != null) |
368 | { | 368 | { |
369 | m_terrainTransform.Dispose(); | 369 | m_terrainTransform.Dispose(); |
370 | m_terrainTransform = null; | 370 | m_terrainTransform = null; |
371 | } | 371 | } |
372 | 372 | ||
373 | if (m_terrainPosition != null) | 373 | if (m_terrainPosition != null) |
374 | { | 374 | { |
375 | m_terrainPosition.Dispose(); | 375 | m_terrainPosition.Dispose(); |
376 | m_terrainPosition = null; | 376 | m_terrainPosition = null; |
377 | } | 377 | } |
378 | } | 378 | } |
379 | 379 | ||
380 | public override void Dispose() | 380 | public override void Dispose() |
381 | { | 381 | { |
382 | disposeAllBodies(); | 382 | disposeAllBodies(); |
383 | m_world.Dispose(); | 383 | m_world.Dispose(); |
384 | m_broadphase.Dispose(); | 384 | m_broadphase.Dispose(); |
385 | ((btDefaultCollisionConfiguration) m_collisionConfiguration).Dispose(); | 385 | ((btDefaultCollisionConfiguration) m_collisionConfiguration).Dispose(); |
386 | ((btSequentialImpulseConstraintSolver) m_solver).Dispose(); | 386 | ((btSequentialImpulseConstraintSolver) m_solver).Dispose(); |
387 | worldAabbMax.Dispose(); | 387 | worldAabbMax.Dispose(); |
388 | worldAabbMin.Dispose(); | 388 | worldAabbMin.Dispose(); |
389 | VectorZero.Dispose(); | 389 | VectorZero.Dispose(); |
390 | QuatIdentity.Dispose(); | 390 | QuatIdentity.Dispose(); |
391 | m_gravity.Dispose(); | 391 | m_gravity.Dispose(); |
392 | VectorZero = null; | 392 | VectorZero = null; |
393 | QuatIdentity = null; | 393 | QuatIdentity = null; |
394 | } | 394 | } |
395 | 395 | ||
396 | public override Dictionary<uint, float> GetTopColliders() | 396 | public override Dictionary<uint, float> GetTopColliders() |
397 | { | 397 | { |
398 | return new Dictionary<uint, float>(); | 398 | return new Dictionary<uint, float>(); |
399 | } | 399 | } |
400 | 400 | ||
401 | public btDiscreteDynamicsWorld getBulletWorld() | 401 | public btDiscreteDynamicsWorld getBulletWorld() |
402 | { | 402 | { |
403 | return m_world; | 403 | return m_world; |
404 | } | 404 | } |
405 | 405 | ||
406 | private void disposeAllBodies() | 406 | private void disposeAllBodies() |
407 | { | 407 | { |
408 | lock (m_prims) | 408 | lock (m_prims) |
409 | { | 409 | { |
410 | foreach ( BulletDotNETPrim prim in m_prims) | 410 | foreach ( BulletDotNETPrim prim in m_prims) |
411 | { | 411 | { |
412 | if (prim.Body != null) | 412 | if (prim.Body != null) |
413 | m_world.removeRigidBody(prim.Body); | 413 | m_world.removeRigidBody(prim.Body); |
414 | 414 | ||
415 | prim.Dispose(); | 415 | prim.Dispose(); |
416 | } | 416 | } |
417 | m_prims.Clear(); | 417 | m_prims.Clear(); |
418 | 418 | ||
419 | foreach (BulletDotNETCharacter chr in m_characters) | 419 | foreach (BulletDotNETCharacter chr in m_characters) |
420 | { | 420 | { |
421 | if (chr.Body != null) | 421 | if (chr.Body != null) |
422 | m_world.removeRigidBody(chr.Body); | 422 | m_world.removeRigidBody(chr.Body); |
423 | chr.Dispose(); | 423 | chr.Dispose(); |
424 | } | 424 | } |
425 | m_characters.Clear(); | 425 | m_characters.Clear(); |
426 | } | 426 | } |
427 | } | 427 | } |
428 | 428 | ||
429 | public override bool IsThreaded | 429 | public override bool IsThreaded |
430 | { | 430 | { |
431 | get { return false; } | 431 | get { return false; } |
432 | } | 432 | } |
433 | 433 | ||
434 | internal void addCollisionEventReporting(PhysicsActor bulletDotNETCharacter) | 434 | internal void addCollisionEventReporting(PhysicsActor bulletDotNETCharacter) |
435 | { | 435 | { |
436 | //TODO: FIXME: | 436 | //TODO: FIXME: |
437 | } | 437 | } |
438 | 438 | ||
439 | internal void remCollisionEventReporting(PhysicsActor bulletDotNETCharacter) | 439 | internal void remCollisionEventReporting(PhysicsActor bulletDotNETCharacter) |
440 | { | 440 | { |
441 | //TODO: FIXME: | 441 | //TODO: FIXME: |
442 | } | 442 | } |
443 | 443 | ||
444 | internal void AddRigidBody(btRigidBody Body) | 444 | internal void AddRigidBody(btRigidBody Body) |
445 | { | 445 | { |
446 | m_world.addRigidBody(Body); | 446 | m_world.addRigidBody(Body); |
447 | } | 447 | } |
448 | [Obsolete("bad!")] | 448 | [Obsolete("bad!")] |
449 | internal void removeFromWorld(btRigidBody body) | 449 | internal void removeFromWorld(btRigidBody body) |
450 | { | 450 | { |
451 | 451 | ||
452 | m_world.removeRigidBody(body); | 452 | m_world.removeRigidBody(body); |
453 | } | 453 | } |
454 | 454 | ||
455 | internal void removeFromWorld(BulletDotNETPrim prm ,btRigidBody body) | 455 | internal void removeFromWorld(BulletDotNETPrim prm ,btRigidBody body) |
456 | { | 456 | { |
457 | lock (m_prims) | 457 | lock (m_prims) |
458 | { | 458 | { |
459 | if (m_prims.Contains(prm)) | 459 | if (m_prims.Contains(prm)) |
460 | { | 460 | { |
461 | m_world.removeRigidBody(body); | 461 | m_world.removeRigidBody(body); |
462 | } | 462 | } |
463 | m_prims.Remove(prm); | 463 | m_prims.Remove(prm); |
464 | } | 464 | } |
465 | 465 | ||
466 | } | 466 | } |
467 | 467 | ||
468 | internal float GetWaterLevel() | 468 | internal float GetWaterLevel() |
469 | { | 469 | { |
470 | throw new NotImplementedException(); | 470 | throw new NotImplementedException(); |
471 | } | 471 | } |
472 | 472 | ||
473 | // Recovered for use by fly height. Kitto Flora | 473 | // Recovered for use by fly height. Kitto Flora |
474 | public float GetTerrainHeightAtXY(float x, float y) | 474 | public float GetTerrainHeightAtXY(float x, float y) |
475 | { | 475 | { |
476 | // Teravus: Kitto, this code causes recurring errors that stall physics permenantly unless | 476 | // Teravus: Kitto, this code causes recurring errors that stall physics permenantly unless |
477 | // the values are checked, so checking below. | 477 | // the values are checked, so checking below. |
478 | // Is there any reason that we don't do this in ScenePresence? | 478 | // Is there any reason that we don't do this in ScenePresence? |
479 | // The only physics engine that benefits from it in the physics plugin is this one | 479 | // The only physics engine that benefits from it in the physics plugin is this one |
480 | 480 | ||
481 | if ((int)x > Constants.RegionSize || (int)y > Constants.RegionSize || | 481 | if ((int)x > Constants.RegionSize || (int)y > Constants.RegionSize || |
482 | (int)x < 0.001f || (int)y < 0.001f) | 482 | (int)x < 0.001f || (int)y < 0.001f) |
483 | return 0; | 483 | return 0; |
484 | 484 | ||
485 | return _origheightmap[(int)y * Constants.RegionSize + (int)x]; | 485 | return _origheightmap[(int)y * Constants.RegionSize + (int)x]; |
486 | } | 486 | } |
487 | // End recovered. Kitto Flora | 487 | // End recovered. Kitto Flora |
488 | 488 | ||
489 | /// <summary> | 489 | /// <summary> |
490 | /// Routine to figure out if we need to mesh this prim with our mesher | 490 | /// Routine to figure out if we need to mesh this prim with our mesher |
491 | /// </summary> | 491 | /// </summary> |
492 | /// <param name="pbs"></param> | 492 | /// <param name="pbs"></param> |
493 | /// <returns></returns> | 493 | /// <returns></returns> |
494 | public bool needsMeshing(PrimitiveBaseShape pbs) | 494 | public bool needsMeshing(PrimitiveBaseShape pbs) |
495 | { | 495 | { |
496 | // most of this is redundant now as the mesher will return null if it cant mesh a prim | 496 | // most of this is redundant now as the mesher will return null if it cant mesh a prim |
497 | // but we still need to check for sculptie meshing being enabled so this is the most | 497 | // but we still need to check for sculptie meshing being enabled so this is the most |
498 | // convenient place to do it for now... | 498 | // convenient place to do it for now... |
499 | 499 | ||
500 | // //if (pbs.PathCurve == (byte)Primitive.PathCurve.Circle && pbs.ProfileCurve == (byte)Primitive.ProfileCurve.Circle && pbs.PathScaleY <= 0.75f) | 500 | // //if (pbs.PathCurve == (byte)Primitive.PathCurve.Circle && pbs.ProfileCurve == (byte)Primitive.ProfileCurve.Circle && pbs.PathScaleY <= 0.75f) |
501 | // //m_log.Debug("needsMeshing: " + " pathCurve: " + pbs.PathCurve.ToString() + " profileCurve: " + pbs.ProfileCurve.ToString() + " pathScaleY: " + Primitive.UnpackPathScale(pbs.PathScaleY).ToString()); | 501 | // //m_log.Debug("needsMeshing: " + " pathCurve: " + pbs.PathCurve.ToString() + " profileCurve: " + pbs.ProfileCurve.ToString() + " pathScaleY: " + Primitive.UnpackPathScale(pbs.PathScaleY).ToString()); |
502 | int iPropertiesNotSupportedDefault = 0; | 502 | int iPropertiesNotSupportedDefault = 0; |
503 | 503 | ||
504 | if (pbs.SculptEntry && !meshSculptedPrim) | 504 | if (pbs.SculptEntry && !meshSculptedPrim) |
505 | { | 505 | { |
506 | #if SPAM | 506 | #if SPAM |
507 | m_log.Warn("NonMesh"); | 507 | m_log.Warn("NonMesh"); |
508 | #endif | 508 | #endif |
509 | return false; | 509 | return false; |
510 | } | 510 | } |
511 | 511 | ||
512 | // if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since ODE can use an internal representation for the prim | 512 | // if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since ODE can use an internal representation for the prim |
513 | if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) | 513 | if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) |
514 | || (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 | 514 | || (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 |
515 | && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z)) | 515 | && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z)) |
516 | { | 516 | { |
517 | 517 | ||
518 | if (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 | 518 | if (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 |
519 | && pbs.ProfileHollow == 0 | 519 | && pbs.ProfileHollow == 0 |
520 | && pbs.PathTwist == 0 && pbs.PathTwistBegin == 0 | 520 | && pbs.PathTwist == 0 && pbs.PathTwistBegin == 0 |
521 | && pbs.PathBegin == 0 && pbs.PathEnd == 0 | 521 | && pbs.PathBegin == 0 && pbs.PathEnd == 0 |
522 | && pbs.PathTaperX == 0 && pbs.PathTaperY == 0 | 522 | && pbs.PathTaperX == 0 && pbs.PathTaperY == 0 |
523 | && pbs.PathScaleX == 100 && pbs.PathScaleY == 100 | 523 | && pbs.PathScaleX == 100 && pbs.PathScaleY == 100 |
524 | && pbs.PathShearX == 0 && pbs.PathShearY == 0) | 524 | && pbs.PathShearX == 0 && pbs.PathShearY == 0) |
525 | { | 525 | { |
526 | #if SPAM | 526 | #if SPAM |
527 | m_log.Warn("NonMesh"); | 527 | m_log.Warn("NonMesh"); |
528 | #endif | 528 | #endif |
529 | return false; | 529 | return false; |
530 | } | 530 | } |
531 | } | 531 | } |
532 | 532 | ||
533 | if (pbs.ProfileHollow != 0) | 533 | if (pbs.ProfileHollow != 0) |
534 | iPropertiesNotSupportedDefault++; | 534 | iPropertiesNotSupportedDefault++; |
535 | 535 | ||
536 | if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0)) | 536 | if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0)) |
537 | iPropertiesNotSupportedDefault++; | 537 | iPropertiesNotSupportedDefault++; |
538 | 538 | ||
539 | if ((pbs.ProfileBegin != 0) || pbs.ProfileEnd != 0) | 539 | if ((pbs.ProfileBegin != 0) || pbs.ProfileEnd != 0) |
540 | iPropertiesNotSupportedDefault++; | 540 | iPropertiesNotSupportedDefault++; |
541 | 541 | ||
542 | if ((pbs.PathScaleX != 100) || (pbs.PathScaleY != 100)) | 542 | if ((pbs.PathScaleX != 100) || (pbs.PathScaleY != 100)) |
543 | iPropertiesNotSupportedDefault++; | 543 | iPropertiesNotSupportedDefault++; |
544 | 544 | ||
545 | if ((pbs.PathShearX != 0) || (pbs.PathShearY != 0)) | 545 | if ((pbs.PathShearX != 0) || (pbs.PathShearY != 0)) |
546 | iPropertiesNotSupportedDefault++; | 546 | iPropertiesNotSupportedDefault++; |
547 | 547 | ||
548 | if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight) | 548 | if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight) |
549 | iPropertiesNotSupportedDefault++; | 549 | iPropertiesNotSupportedDefault++; |
550 | 550 | ||
551 | if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 && (pbs.Scale.X != pbs.Scale.Y || pbs.Scale.Y != pbs.Scale.Z || pbs.Scale.Z != pbs.Scale.X)) | 551 | if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 && (pbs.Scale.X != pbs.Scale.Y || pbs.Scale.Y != pbs.Scale.Z || pbs.Scale.Z != pbs.Scale.X)) |
552 | iPropertiesNotSupportedDefault++; | 552 | iPropertiesNotSupportedDefault++; |
553 | 553 | ||
554 | if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1) | 554 | if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1) |
555 | iPropertiesNotSupportedDefault++; | 555 | iPropertiesNotSupportedDefault++; |
556 | 556 | ||
557 | // test for torus | 557 | // test for torus |
558 | if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Square) | 558 | if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Square) |
559 | { | 559 | { |
560 | if (pbs.PathCurve == (byte)Extrusion.Curve1) | 560 | if (pbs.PathCurve == (byte)Extrusion.Curve1) |
561 | { | 561 | { |
562 | iPropertiesNotSupportedDefault++; | 562 | iPropertiesNotSupportedDefault++; |
563 | } | 563 | } |
564 | } | 564 | } |
565 | else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Circle) | 565 | else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Circle) |
566 | { | 566 | { |
567 | if (pbs.PathCurve == (byte)Extrusion.Straight) | 567 | if (pbs.PathCurve == (byte)Extrusion.Straight) |
568 | { | 568 | { |
569 | iPropertiesNotSupportedDefault++; | 569 | iPropertiesNotSupportedDefault++; |
570 | } | 570 | } |
571 | 571 | ||
572 | // ProfileCurve seems to combine hole shape and profile curve so we need to only compare against the lower 3 bits | 572 | // ProfileCurve seems to combine hole shape and profile curve so we need to only compare against the lower 3 bits |
573 | else if (pbs.PathCurve == (byte)Extrusion.Curve1) | 573 | else if (pbs.PathCurve == (byte)Extrusion.Curve1) |
574 | { | 574 | { |
575 | iPropertiesNotSupportedDefault++; | 575 | iPropertiesNotSupportedDefault++; |
576 | } | 576 | } |
577 | } | 577 | } |
578 | else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle) | 578 | else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle) |
579 | { | 579 | { |
580 | if (pbs.PathCurve == (byte)Extrusion.Curve1 || pbs.PathCurve == (byte)Extrusion.Curve2) | 580 | if (pbs.PathCurve == (byte)Extrusion.Curve1 || pbs.PathCurve == (byte)Extrusion.Curve2) |
581 | { | 581 | { |
582 | iPropertiesNotSupportedDefault++; | 582 | iPropertiesNotSupportedDefault++; |
583 | } | 583 | } |
584 | } | 584 | } |
585 | else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle) | 585 | else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle) |
586 | { | 586 | { |
587 | if (pbs.PathCurve == (byte)Extrusion.Straight) | 587 | if (pbs.PathCurve == (byte)Extrusion.Straight) |
588 | { | 588 | { |
589 | iPropertiesNotSupportedDefault++; | 589 | iPropertiesNotSupportedDefault++; |
590 | } | 590 | } |
591 | else if (pbs.PathCurve == (byte)Extrusion.Curve1) | 591 | else if (pbs.PathCurve == (byte)Extrusion.Curve1) |
592 | { | 592 | { |
593 | iPropertiesNotSupportedDefault++; | 593 | iPropertiesNotSupportedDefault++; |
594 | } | 594 | } |
595 | } | 595 | } |
596 | 596 | ||
597 | 597 | ||
598 | if (iPropertiesNotSupportedDefault == 0) | 598 | if (iPropertiesNotSupportedDefault == 0) |
599 | { | 599 | { |
600 | #if SPAM | 600 | #if SPAM |
601 | m_log.Warn("NonMesh"); | 601 | m_log.Warn("NonMesh"); |
602 | #endif | 602 | #endif |
603 | return false; | 603 | return false; |
604 | } | 604 | } |
605 | #if SPAM | 605 | #if SPAM |
606 | m_log.Debug("Mesh"); | 606 | m_log.Debug("Mesh"); |
607 | #endif | 607 | #endif |
608 | return true; | 608 | return true; |
609 | } | 609 | } |
610 | 610 | ||
611 | internal void addActivePrim(BulletDotNETPrim pPrim) | 611 | internal void addActivePrim(BulletDotNETPrim pPrim) |
612 | { | 612 | { |
613 | lock (m_activePrims) | 613 | lock (m_activePrims) |
614 | { | 614 | { |
615 | if (!m_activePrims.Contains(pPrim)) | 615 | if (!m_activePrims.Contains(pPrim)) |
616 | { | 616 | { |
617 | m_activePrims.Add(pPrim); | 617 | m_activePrims.Add(pPrim); |
618 | } | 618 | } |
619 | } | 619 | } |
620 | } | 620 | } |
621 | 621 | ||
622 | public void remActivePrim(BulletDotNETPrim pDeactivatePrim) | 622 | public void remActivePrim(BulletDotNETPrim pDeactivatePrim) |
623 | { | 623 | { |
624 | lock (m_activePrims) | 624 | lock (m_activePrims) |
625 | { | 625 | { |
626 | m_activePrims.Remove(pDeactivatePrim); | 626 | m_activePrims.Remove(pDeactivatePrim); |
627 | } | 627 | } |
628 | } | 628 | } |
629 | 629 | ||
630 | internal void AddPrimToScene(BulletDotNETPrim pPrim) | 630 | internal void AddPrimToScene(BulletDotNETPrim pPrim) |
631 | { | 631 | { |
632 | lock (m_prims) | 632 | lock (m_prims) |
633 | { | 633 | { |
634 | if (!m_prims.Contains(pPrim)) | 634 | if (!m_prims.Contains(pPrim)) |
635 | { | 635 | { |
636 | m_prims.Add(pPrim); | 636 | m_prims.Add(pPrim); |
637 | m_world.addRigidBody(pPrim.Body); | 637 | m_world.addRigidBody(pPrim.Body); |
638 | } | 638 | } |
639 | } | 639 | } |
640 | } | 640 | } |
641 | } | 641 | } |
642 | } | 642 | } |