Inheritance: IDisposable
        public override void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true)
        {
            if (this.Disposed == true)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            if (model.IsTraceModel == false)
            {
                throw new ArgumentException("model should be a trace model");
            }

            if (density <= 0.0f)
            {
                throw new ArgumentException("density must be valid");
            }

            if ((_clipModel != null) && (_clipModel != model) && (disposeOld == true))
            {
                _clipModel.Dispose();
            }

            _clipModel = model;
            _clipModel.Link(idR.Game.Clip, this.Self, 0, _clipModel.Origin, _clipModelAxis);
        }
Beispiel #2
0
 public override void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true)
 {
     if (this.Disposed == true)
     {
         throw new ObjectDisposedException(this.GetType().Name);
     }
 }
Beispiel #3
0
        public idClipModel(idClipModel model)
        {
            _id    = model.ID;
            _owner = model.Owner;

            _enabled = model.Enabled;
            _entity  = model.Entity;

            _origin    = model.Origin;
            _axis      = model.Axis;
            _bounds    = model.Bounds;
            _absBounds = model.AbsoluteBounds;

            _material             = model.Material;
            _contents             = model.Contents;
            _collisionModelHandle = model.CollisionModelHandle;
            _traceModelCache      = null;

            if (model.TraceModelCache != null)
            {
                idConsole.Warning("TODO: LoadModel( *GetCachedTraceModel( model->traceModelIndex ) );");
            }

            _renderModelHandle = model.RenderModelHandle;
            _touchCount        = -1;
        }
Beispiel #4
0
        public ContentFlags ContentsModel(Vector3 start, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, object modelHandle, Vector3 modelOrigin, Matrix modelAxis)
        {
            idConsole.Warning("TODO: idClip.ContentsModel");
            _contentCount++;

            // TODO: NEED ENGINE SOURCE return idR.CollisionModelManager.Contents(start, TraceModelForClipModel(model), traceModelAxis, contentMask, modelHandle, modelOrigin, modelAxis);
            return(ContentFlags.None);
        }
Beispiel #5
0
        public override TraceResult ClipRotation(idRotation rotation, idClipModel model)
        {
            if (this.Disposed == true)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            return(new TraceResult());
        }
Beispiel #6
0
        public override ContentFlags ClipContents(idClipModel model)
        {
            if (this.Disposed == true)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            return(ContentFlags.None);
        }
Beispiel #7
0
        public TraceResult RotationModel(Vector3 start, idRotation rotation, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, int modelHandle, Vector3 modelOrigin, Matrix modelAxis)
        {
            idConsole.Warning("TODO: idClip.RotationModel");
            // TODO: idTraceModel traceModel = TraceModelForClipModel(model);

            _rotationCount++;

            // TODO: return idR.CollisionModelManager.Rotation(start, rotation, traceModel, traceModelAxis, contentMask, modelHandle, modelOrigin, modelAxis);
            return(new TraceResult());
        }
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            if (_clipModel != null)
            {
                _clipModel.Dispose();
                _clipModel = null;
            }
        }
Beispiel #9
0
        /// <summary>
        /// Add ground contacts for the clip model.
        /// </summary>
        /// <param name="clipModel"></param>
        protected void AddGroupContacts(idClipModel clipModel)
        {
            idConsole.Warning("idPhysics_Base.AddGroupContacts");

            /*idVec6 dir;
             * int index, num;
             *
             * index = contacts.Num();
             * contacts.SetNum( index + 10, false );
             *
             * dir.SubVec3(0) = gravityNormal;
             * dir.SubVec3(1) = vec3_origin;
             * num = gameLocal.clip.Contacts( &contacts[index], 10, clipModel->GetOrigin(),
             *                              dir, CONTACT_EPSILON, clipModel, clipModel->GetAxis(), clipMask, self );
             * contacts.SetNum( index + num, false );*/
        }
Beispiel #10
0
		protected void AddGroundContacts(idClipModel clipModel)
		{
			idConsole.Warning("TODO: idPhysics_Base.AddGroundContacts");

			/*idVec6 dir;
			int index, num;

			index = contacts.Num();
			contacts.SetNum(index + 10, false);

			dir.SubVec3(0) = gravityNormal;
			dir.SubVec3(1) = vec3_origin;
			num = gameLocal.clip.Contacts(&contacts[index], 10, clipModel->GetOrigin(),
							dir, CONTACT_EPSILON, clipModel, clipModel->GetAxis(), clipMask, self);
			contacts.SetNum(index + num, false);*/
		}
Beispiel #11
0
        public override ContentFlags ClipContents(idClipModel model)
        {
            if (this.Disposed == true)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            if (model != null)
            {
                return(idR.Game.Clip.ContentsModel(_clipModel.Origin, _clipModel, _clipModel.Axis, ContentFlags.None, model, model.Origin, model.Axis));
            }
            else
            {
                return(idR.Game.Clip.Contents(_clipModel.Origin, _clipModel, _clipModel.Axis, ContentFlags.None, null));
            }
        }
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            if ((_self != null) && (_self.Physics == this))
            {
                idConsole.Warning("TODO: _self.Physics = null;");
            }

            idConsole.Warning("TODO: idForce::DeletePhysics( this );");

            if (_clipModel != null)
            {
                _clipModel.Dispose();
                _clipModel = null;
            }
        }
Beispiel #13
0
        public override TraceResult ClipRotation(idRotation rotation, idClipModel model)
        {
            if (this.Disposed == true)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            if (model != null)
            {
                idConsole.Warning("TODO: return idR.Game.Clip.RotationModel(_clipModel.Origin, rotation, _clipModel, _clipModel.Axis, _clipMask, model, model.Origin, model.Axis);");
            }
            else
            {
                idConsole.Warning("TODO: return idR.Game.Clip.Rotation(_clipModel.Origin, rotation, _clipModel, _clipModel.Axis, _clipMask, _self);");
            }

            return(new TraceResult());
        }
        public override void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true)
        {
            if (this.Disposed == true)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            if ((_clipModel != null) && (_clipModel != model) && (disposeOld == true))
            {
                _clipModel.Dispose();
            }

            _clipModel = model;

            if (_clipModel != null)
            {
                _clipModel.Link(idR.Game.Clip, _self, 0, _origin, _axis);
            }
        }
        public override TraceResult ClipRotation(idRotation rotation, idClipModel model)
        {
            if (this.Disposed == true)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            TraceResult result;

            if (model != null)
            {
                result = idR.Game.Clip.RotationModel(_origin, rotation, _clipModel, _axis, ContentFlags.MaskSolid,
                                                     model.Handle, model.Origin, model.Axis);
            }
            else
            {
                idR.Game.Clip.Rotation(out result, _origin, rotation, _clipModel, _axis, ContentFlags.MaskSolid, _self);
            }

            return(result);
        }
Beispiel #16
0
        public void Init()
        {
            Vector3 maxSector = Vector3.Zero;

            // clear clip sectors
            _clipSectors     = new ClipSector[MaxSectors];
            _clipSectorCount = 0;
            _touchCount      = -1;

            // get world map bounds
            CollisionModel collisionModel = idR.CollisionModelManager.LoadModel("worldMap", false);

            if (collisionModel != null)
            {
                _worldBounds = collisionModel.Bounds;
            }

            // create world sectors
            CreateClipSectors(0, _worldBounds, ref maxSector);

            Vector3 size = _worldBounds.Max - _worldBounds.Min;

            idConsole.WriteLine("map bounds are ({0})", size);
            idConsole.WriteLine("max clip sector is ({0})", maxSector);

            // initialize a default clip model
            _defaultClipModel = new idClipModel();
            _defaultClipModel.LoadModel(new idTraceModel(idBounds.Expand(8)));

            // set counters to zero
            _rotationCount         = 0;
            _translationCount      = 0;
            _motionCount           = 0;
            _renderModelTraceCount = 0;
            _contentCount          = 0;
            _contactCount          = 0;
        }
Beispiel #17
0
        public bool Translation(out TraceResult result, Vector3 start, Vector3 end, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, idEntity passEntity)
        {
            idConsole.Warning("TODO: idClip.Translation");
            // TODO

            /*if(TestHugeTranslation(result, model, start, end, traceModelAxis) == true)
             * {
             *      return true;
             * }*/

            // TODO

            /*idTraceModel traceModel = TraceModelForClipModel(model);
             * idBounds traceBounds = new idBounds();
             * TraceResult traceResult;
             * float radius = 0;
             *
             * if((passEntity == null) || (passEntity.Index != idR.EntityIndexWorld))
             * {
             *      // test world
             *      _translationCount++;
             *
             *      // TODO: idR.CollisionModelManager.Translation(out result, start, end, traceModel, traceModelAxis, contentMask, 0, Vector3.Zero, Matrix.Identity);
             *      result.ContactInformation.EntityIndex = (result.Fraction != 1.0f) ? idR.EntityIndexWorld : idR.EntityIndexNone;
             *
             *      if(result.Fraction == 0.0f)
             *      {
             *              return true; // blocked immediately by the world
             *      }
             * }
             * else
             * {
             *      result = new TraceResult();
             *      result.Fraction = 1.0f;
             *      result.EndPosition = end;
             *      result.EndAxis = traceModelAxis;
             * }
             *
             * if(traceModel == null)
             * {
             *      traceBounds = idBounds.FromPointTranslation(start, result.EndPosition - start);
             *      radius = 0.0f;
             * }
             * else
             * {
             *      traceBounds = idBounds.FromBoundsTranslation(traceModel.Bounds, start, traceModelAxis, result.EndPosition - start);
             *      radius = traceModel.Bounds.GetRadius();
             * }
             *
             * idClipModel[] clipModelList = GetTraceClipModels(traceBounds, contentMask, passEntity);
             *
             * foreach(idClipModel touch in clipModelList)
             * {
             *      if(touch == null)
             *      {
             *              continue;
             *      }
             *
             *      if(touch.RenderModelHandle != -1)
             *      {
             *              _renderModelTraceCount++;
             *              traceResult = TraceRenderModel(start, end, radius, traceModelAxis, touch);
             *      }
             *      else
             *      {
             *              _translationCount++;
             *              // TODO: traceResult = idR.CollisionModelManager.Translation(start, end, traceModel, traceModelAxis, contentMask, touch.Handle, touch.Origin, touch.Axis);
             *      }
             *
             *      if(traceResult.Fraction < result.Fraction)
             *      {
             *              result = traceResult;
             *              result.ContactInformation.EntityIndex = touch.Entity.Index;
             *              result.ContactInformation.ID = touch.ID;
             *
             *              if(result.Fraction == 0.0f)
             *              {
             *                      break;
             *              }
             *      }
             * }
             *
             * return (result.Fraction < 1.0f);*/
            result = new TraceResult();
            return(false);
        }
Beispiel #18
0
		public abstract TraceResult ClipRotation(idRotation rotation, idClipModel model);
		public override void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true)
		{
			if(this.Disposed == true)
			{
				throw new ObjectDisposedException(this.GetType().Name);
			}

			if((_clipModel != null) && (_clipModel != model) && (disposeOld == true))
			{
				_clipModel.Dispose();
			}

			_clipModel = model;

			if(_clipModel != null)
			{
				_clipModel.Link(idR.Game.Clip, _self, 0, _origin, _axis);
			}
		}
		public override ContentFlags ClipContents(idClipModel model)
		{
			if(this.Disposed == true)
			{
				throw new ObjectDisposedException(this.GetType().Name);
			}

			if(model != null)
			{
				return idR.Game.Clip.ContentsModel(_clipModel.Origin, _clipModel, _clipModel.Axis, ContentFlags.None, model, model.Origin, model.Axis);
			}
			else
			{
				return idR.Game.Clip.Contents(_clipModel.Origin, _clipModel, _clipModel.Axis, ContentFlags.None, null);
			}
		}
		public override void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true)
		{
			if(this.Disposed == true)
			{
				throw new ObjectDisposedException(this.GetType().Name);
			}

			if(model.IsTraceModel == false)
			{
				throw new ArgumentException("model should be a trace model");
			}

			if(density <= 0.0f)
			{
				throw new ArgumentException("density must be valid");
			}

			if((_clipModel != null) && (_clipModel != model) && (disposeOld == true))
			{
				_clipModel.Dispose();
			}

			_clipModel = model;
			_clipModel.Link(idR.Game.Clip, this.Self, 0, _clipModel.Origin, _clipModelAxis);
		}
Beispiel #22
0
		public TraceResult RotationModel(Vector3 start, idRotation rotation, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, int modelHandle, Vector3 modelOrigin, Matrix modelAxis)
		{
			idConsole.Warning("TODO: idClip.RotationModel");
			// TODO: idTraceModel traceModel = TraceModelForClipModel(model);

			_rotationCount++;

			// TODO: return idR.CollisionModelManager.Rotation(start, rotation, traceModel, traceModelAxis, contentMask, modelHandle, modelOrigin, modelAxis);
			return new TraceResult();
		}
Beispiel #23
0
		public ContentFlags Contents(Vector3 start, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, idEntity passEntity)
		{
			idConsole.Warning("TODO: idClip.Contents");
			ContentFlags contents = ContentFlags.None;
			idBounds traceModelBounds = new idBounds();
			
			// TODO
			/*idTraceModel traceModel = TraceModelForClipModel(model);

			if((passEntity == null) || (passEntity.Index != idR.EntityIndexWorld))
			{
				// test world
				_contentCount++;
				// TODO: NEED ENGINE SOURCE contents = idR.CollisionModelManager.Contents(start, traceModel, traceModelAxis, contentMask, 0, Vector3.Zero, Matrix.Identity);
			}
			else
			{
				contents = ContentFlags.None;
			}

			if(traceModel == null)
			{
				traceModelBounds.Min = start;
				traceModelBounds.Max = start;
			}
			else if(traceModelAxis != Matrix.Identity)
			{
				traceModelBounds = idBounds.FromTransformedBounds(traceModel.Bounds, start, traceModelAxis);
			}
			else
			{
				traceModelBounds.Min = traceModel.Bounds.Min + start;
				traceModelBounds.Max = traceModel.Bounds.Max + start;
			}

			idClipModel[] traceModelList = GetTraceClipModels(traceModelBounds, -1, passEntity);

			foreach(idClipModel touch in traceModelList)
			{
				if(touch == null)
				{
					continue;
				}

				// no contents test with render models
				if(touch.RenderModelHandle != -1)
				{
					continue;
				}

				// if the entity does not have any contents we are looking for
				if((touch.Contents & contentMask) == ContentFlags.None)
				{
					continue;
				}

				// if the entity has no new contents flags
				if((touch.Contents & contents) == touch.Contents)
				{
					continue;
				}

				_contentCount++;

				// TODO
				/*if(idR.CollisionModelManager.Contents(start, traceModel, traceModelAxis, contentMask, touch.Handle, touch.Origin, touch.Axis) > 0)
				{
					contents |= (touch.Contents & contentMask);
				}*/
			/*}*/

			return contents;
		}
Beispiel #24
0
		public bool Translation(out TraceResult result, Vector3 start, Vector3 end, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, idEntity passEntity)
		{
			idConsole.Warning("TODO: idClip.Translation");
			// TODO
			/*if(TestHugeTranslation(result, model, start, end, traceModelAxis) == true)
			{
				return true;
			}*/

			// TODO
			/*idTraceModel traceModel = TraceModelForClipModel(model);
			idBounds traceBounds = new idBounds();
			TraceResult traceResult;
			float radius = 0;

			if((passEntity == null) || (passEntity.Index != idR.EntityIndexWorld))
			{
				// test world
				_translationCount++;

				// TODO: idR.CollisionModelManager.Translation(out result, start, end, traceModel, traceModelAxis, contentMask, 0, Vector3.Zero, Matrix.Identity);
				result.ContactInformation.EntityIndex = (result.Fraction != 1.0f) ? idR.EntityIndexWorld : idR.EntityIndexNone;

				if(result.Fraction == 0.0f)
				{
					return true; // blocked immediately by the world
				}
			}
			else
			{
				result = new TraceResult();
				result.Fraction = 1.0f;
				result.EndPosition = end;
				result.EndAxis = traceModelAxis;
			}

			if(traceModel == null)
			{
				traceBounds = idBounds.FromPointTranslation(start, result.EndPosition - start);
				radius = 0.0f;
			}
			else
			{
				traceBounds = idBounds.FromBoundsTranslation(traceModel.Bounds, start, traceModelAxis, result.EndPosition - start);
				radius = traceModel.Bounds.GetRadius();
			}

			idClipModel[] clipModelList = GetTraceClipModels(traceBounds, contentMask, passEntity);

			foreach(idClipModel touch in clipModelList)
			{
				if(touch == null)
				{
					continue;
				}

				if(touch.RenderModelHandle != -1)
				{
					_renderModelTraceCount++;
					traceResult = TraceRenderModel(start, end, radius, traceModelAxis, touch);
				}
				else
				{
					_translationCount++;
					// TODO: traceResult = idR.CollisionModelManager.Translation(start, end, traceModel, traceModelAxis, contentMask, touch.Handle, touch.Origin, touch.Axis);
				}

				if(traceResult.Fraction < result.Fraction)
				{
					result = traceResult;
					result.ContactInformation.EntityIndex = touch.Entity.Index;
					result.ContactInformation.ID = touch.ID;

					if(result.Fraction == 0.0f)
					{
						break;
					}
				}
			}

			return (result.Fraction < 1.0f);*/
			result = new TraceResult();
			return false;
		}
Beispiel #25
0
 public abstract TraceResult ClipRotation(idRotation rotation, idClipModel model);
		protected override void Dispose(bool disposing)
		{
			base.Dispose(disposing);

			if((_self != null) && (_self.Physics == this))
			{
				idConsole.Warning("TODO: _self.Physics = null;");
			}

			idConsole.Warning("TODO: idForce::DeletePhysics( this );");

			if(_clipModel != null)
			{
				_clipModel.Dispose();
				_clipModel = null;
			}			
		}
Beispiel #27
0
        public ContentFlags Contents(Vector3 start, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, idEntity passEntity)
        {
            idConsole.Warning("TODO: idClip.Contents");
            ContentFlags contents         = ContentFlags.None;
            idBounds     traceModelBounds = new idBounds();

            // TODO

            /*idTraceModel traceModel = TraceModelForClipModel(model);
             *
             * if((passEntity == null) || (passEntity.Index != idR.EntityIndexWorld))
             * {
             *      // test world
             *      _contentCount++;
             *      // TODO: NEED ENGINE SOURCE contents = idR.CollisionModelManager.Contents(start, traceModel, traceModelAxis, contentMask, 0, Vector3.Zero, Matrix.Identity);
             * }
             * else
             * {
             *      contents = ContentFlags.None;
             * }
             *
             * if(traceModel == null)
             * {
             *      traceModelBounds.Min = start;
             *      traceModelBounds.Max = start;
             * }
             * else if(traceModelAxis != Matrix.Identity)
             * {
             *      traceModelBounds = idBounds.FromTransformedBounds(traceModel.Bounds, start, traceModelAxis);
             * }
             * else
             * {
             *      traceModelBounds.Min = traceModel.Bounds.Min + start;
             *      traceModelBounds.Max = traceModel.Bounds.Max + start;
             * }
             *
             * idClipModel[] traceModelList = GetTraceClipModels(traceModelBounds, -1, passEntity);
             *
             * foreach(idClipModel touch in traceModelList)
             * {
             *      if(touch == null)
             *      {
             *              continue;
             *      }
             *
             *      // no contents test with render models
             *      if(touch.RenderModelHandle != -1)
             *      {
             *              continue;
             *      }
             *
             *      // if the entity does not have any contents we are looking for
             *      if((touch.Contents & contentMask) == ContentFlags.None)
             *      {
             *              continue;
             *      }
             *
             *      // if the entity has no new contents flags
             *      if((touch.Contents & contents) == touch.Contents)
             *      {
             *              continue;
             *      }
             *
             *      _contentCount++;
             *
             *      // TODO
             *      /*if(idR.CollisionModelManager.Contents(start, traceModel, traceModelAxis, contentMask, touch.Handle, touch.Origin, touch.Axis) > 0)
             *      {
             *              contents |= (touch.Contents & contentMask);
             *      }*/
            /*}*/

            return(contents);
        }
Beispiel #28
0
        public bool Rotation(out TraceResult result, Vector3 start, idRotation rotation, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, idEntity passEntity)
        {
            idConsole.Warning("TODO: idClip.Rotation");

            /*idTraceModel traceModel = TraceModelForClipModel(model);
             * idBounds traceBounds = new idBounds();
             * TraceResult traceResult;
             *
             * if((passEntity == null) || (passEntity.Index != idR.EntityIndexWorld))
             * {
             *      // test world
             *      _rotationCount++;
             *
             *      // TODO: NEED ENGINE SOURCE idR.CollisionModelManager.Rotation(out result, start, rotation, traceModel, traceModelAxis, contentMask, 0, Vector3.Zero, Matrix.Identity);
             *      result.ContactInformation.EntityIndex = (result.Fraction != 1.0f) ? idR.EntityIndexWorld : idR.EntityIndexNone;
             *
             *      if(result.Fraction == 0.0f)
             *      {
             *              return true; // blocked immediately by the world
             *      }
             * }
             * else
             * {
             *      result = new TraceResult();
             *      result.Fraction = 1.0f;
             *      result.EndPosition = start;
             *      result.EndAxis = traceModelAxis * rotation.ToMatrix();
             * }
             *
             * if(traceModel == null)
             * {
             *      traceBounds = idBounds.FromPointRotation(start, rotation);
             * }
             * else
             * {
             *      traceBounds = idBounds.FromBoundsRotation(traceModel.Bounds, start, traceModelAxis, rotation);
             * }
             *
             * idClipModel[] clipModelList = GetTraceClipModels(traceBounds, contentMask, passEntity);
             *
             * foreach(idClipModel touch in clipModelList)
             * {
             *      if(touch == null)
             *      {
             *              continue;
             *      }
             *
             *      if(touch.RenderModelHandle != -1)
             *      {
             *              continue;
             *      }
             *
             *      _rotationCount++;
             *      // TODO: traceResult = idR.CollisionModelManager.Rotation(start, rotation, traceModel, traceModelAxis, contentMask, touch.Handle, touch.Origin, touch.Axis);
             *
             *      if(traceResult.Fraction < result.Fraction)
             *      {
             *              result = traceResult;
             *              result.ContactInformation.EntityIndex = touch.Entity.Index;
             *              result.ContactInformation.ID = touch.ID;
             *
             *              if(result.Fraction == 0.0f)
             *              {
             *                      break;
             *              }
             *      }
             * }
             *
             * return (result.Fraction < 1.0f);*/
            result = new TraceResult();
            return(false);
        }
Beispiel #29
0
 public abstract ContentFlags ClipContents(idClipModel model);
		public override TraceResult ClipRotation(idRotation rotation, idClipModel model)
		{
			if(this.Disposed == true)
			{
				throw new ObjectDisposedException(this.GetType().Name);
			}

			TraceResult result;

			if(model != null)
			{
				result = idR.Game.Clip.RotationModel(_origin, rotation, _clipModel, _axis, ContentFlags.MaskSolid,
					model.Handle, model.Origin, model.Axis);
			}
			else
			{
				idR.Game.Clip.Rotation(out result, _origin, rotation, _clipModel, _axis, ContentFlags.MaskSolid, _self);
			}

			return result;
		}
Beispiel #31
0
		public bool Rotation(out TraceResult result, Vector3 start, idRotation rotation, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, idEntity passEntity)
		{
			idConsole.Warning("TODO: idClip.Rotation");
			/*idTraceModel traceModel = TraceModelForClipModel(model);
			idBounds traceBounds = new idBounds();
			TraceResult traceResult;

			if((passEntity == null) || (passEntity.Index != idR.EntityIndexWorld))
			{
				// test world
				_rotationCount++;

				// TODO: NEED ENGINE SOURCE idR.CollisionModelManager.Rotation(out result, start, rotation, traceModel, traceModelAxis, contentMask, 0, Vector3.Zero, Matrix.Identity);
				result.ContactInformation.EntityIndex = (result.Fraction != 1.0f) ? idR.EntityIndexWorld : idR.EntityIndexNone;

				if(result.Fraction == 0.0f)
				{
					return true; // blocked immediately by the world
				}
			}
			else
			{
				result = new TraceResult();
				result.Fraction = 1.0f;
				result.EndPosition = start;
				result.EndAxis = traceModelAxis * rotation.ToMatrix();
			}

			if(traceModel == null)
			{
				traceBounds = idBounds.FromPointRotation(start, rotation);
			}
			else
			{
				traceBounds = idBounds.FromBoundsRotation(traceModel.Bounds, start, traceModelAxis, rotation);
			}

			idClipModel[] clipModelList = GetTraceClipModels(traceBounds, contentMask, passEntity);

			foreach(idClipModel touch in clipModelList)
			{
				if(touch == null)
				{
					continue;
				}

				if(touch.RenderModelHandle != -1)
				{
					continue;
				}

				_rotationCount++;
				// TODO: traceResult = idR.CollisionModelManager.Rotation(start, rotation, traceModel, traceModelAxis, contentMask, touch.Handle, touch.Origin, touch.Axis);

				if(traceResult.Fraction < result.Fraction)
				{
					result = traceResult;
					result.ContactInformation.EntityIndex = touch.Entity.Index;
					result.ContactInformation.ID = touch.ID;

					if(result.Fraction == 0.0f)
					{
						break;
					}
				}
			}

			return (result.Fraction < 1.0f);*/
			result = new TraceResult();
			return false;
		}
Beispiel #32
0
		public idClipModel(idClipModel model)
		{
			_id = model.ID;
			_owner = model.Owner;
			
			_enabled = model.Enabled;
			_entity = model.Entity;

			_origin = model.Origin;
			_axis = model.Axis;
			_bounds = model.Bounds;
			_absBounds = model.AbsoluteBounds;

			_material = model.Material;
			_contents = model.Contents;
			_collisionModelHandle = model.CollisionModelHandle;
			_traceModelCache = null;

			if(model.TraceModelCache != null)
			{
				idConsole.Warning("TODO: LoadModel( *GetCachedTraceModel( model->traceModelIndex ) );");
			}

			_renderModelHandle = model.RenderModelHandle;
			_touchCount = -1;
		}
Beispiel #33
0
		public ContentFlags ContentsModel(Vector3 start, idClipModel model, Matrix traceModelAxis, ContentFlags contentMask, object modelHandle, Vector3 modelOrigin, Matrix modelAxis)
		{
			idConsole.Warning("TODO: idClip.ContentsModel");
			_contentCount++;

			// TODO: NEED ENGINE SOURCE return idR.CollisionModelManager.Contents(start, TraceModelForClipModel(model), traceModelAxis, contentMask, modelHandle, modelOrigin, modelAxis);
			return ContentFlags.None;
		}
Beispiel #34
0
		private void InitDefaultPhysics(Vector3 origin, Matrix axis)
		{
			string temp = _spawnArgs.GetString("clipmodel", "");
			idClipModel clipModel = null;

			// check if a clipmodel key/value pair is set
			if(temp != string.Empty)
			{
				if(idClipModel.CheckModel(temp) != null)
				{
					clipModel = new idClipModel(temp);
				}
			}

			if(_spawnArgs.GetBool("noclipmodel", false) == false)
			{
				// check if mins/maxs or size key/value pairs are set
				if(clipModel == null)
				{
					idBounds bounds = idBounds.Zero;
					bool setClipModel = false;

					if((_spawnArgs.ContainsKey("mins") == true)
						&& (_spawnArgs.ContainsKey("maxs") == true))
					{
						bounds = new idBounds(_spawnArgs.GetVector3("mins"), _spawnArgs.GetVector3("maxs"));
						setClipModel = true;

						if((bounds.Min.X > bounds.Max.X)
							|| (bounds.Min.Y > bounds.Max.Y)
							|| (bounds.Min.Z > bounds.Max.Z))
						{
							idConsole.Error("Invalid bounds '{0}'-'{1}' on entity '{2}'", bounds.Min, bounds.Max, this.Name);
						}
					}
					else if(_spawnArgs.ContainsKey("size") == true)
					{
						Vector3 size = _spawnArgs.GetVector3("size");

						if((size.X < 0.0f)
							|| (size.Y < 0.0f)
							|| (size.Z < 0.0f))
						{
							idConsole.Error("Invalid size '{0}' on entity '{1}'", size, this.Name);
						}

						setClipModel = true;
						bounds = new idBounds(
									new Vector3(size.X * -0.5f, size.Y * -0.5f, 0.0f),
									new Vector3(size.X * 0.5f, size.Y * 0.5f, size.Z)
								);
					}

					if(setClipModel == true)
					{
						int sideCount = _spawnArgs.GetInteger("cyclinder", 0);

						idTraceModel traceModel = new idTraceModel();

						if(sideCount > 0)
						{
							idConsole.Warning("TODO: traceModel.SetupCyclinder(bounds, (sideCount < 3) ? 3 : sideCount);");
						}
						else if((sideCount = _spawnArgs.GetInteger("cone", 0)) > 0)
						{
							idConsole.Warning("TODO: traceModel.SetupCone(bounds, (sideCount < 3) ? 3 : sideCount);");
						}
						else
						{
							traceModel.SetupBox(bounds);
						}

						clipModel = new idClipModel(traceModel);
					}
				}

				// check if the visual model can be used as collision model
				if(clipModel == null)
				{
					temp = _spawnArgs.GetString("model");

					if(temp != string.Empty)
					{
						if(idClipModel.CheckModel(temp) != null)
						{
							clipModel = new idClipModel(temp);
						}
					}
				}
			}

			_defaultPhysicsObject.Self = this;
			_defaultPhysicsObject.SetClipModel(clipModel, 1.0f);
			_defaultPhysicsObject.SetOrigin(origin);
			_defaultPhysicsObject.SetAxis(axis);

			_physics = _defaultPhysicsObject;
		}
Beispiel #35
0
		public void Init()
		{
			Vector3 maxSector = Vector3.Zero;

			// clear clip sectors
			_clipSectors = new ClipSector[MaxSectors];
			_clipSectorCount = 0;
			_touchCount = -1;
			
			// get world map bounds
			CollisionModel collisionModel = idR.CollisionModelManager.LoadModel("worldMap", false);

			if(collisionModel != null)
			{
				_worldBounds = collisionModel.Bounds;
			}

			// create world sectors
			CreateClipSectors(0, _worldBounds, ref maxSector);

			Vector3 size = _worldBounds.Max - _worldBounds.Min;

			idConsole.WriteLine("map bounds are ({0})", size);
			idConsole.WriteLine("max clip sector is ({0})", maxSector);

			// initialize a default clip model
			_defaultClipModel = new idClipModel();
			_defaultClipModel.LoadModel(new idTraceModel(idBounds.Expand(8)));

			// set counters to zero
			_rotationCount = 0;
			_translationCount = 0;
			_motionCount = 0;
			_renderModelTraceCount = 0;
			_contentCount = 0;
			_contactCount = 0;
		}
Beispiel #36
0
		public abstract TraceResult ClipTranslation(Vector3 translation, idClipModel model);
		public override TraceResult ClipRotation(idRotation rotation, idClipModel model)
		{
			if(this.Disposed == true)
			{
				throw new ObjectDisposedException(this.GetType().Name);
			}

			if(model != null)
			{
				idConsole.Warning("TODO: return idR.Game.Clip.RotationModel(_clipModel.Origin, rotation, _clipModel, _clipModel.Axis, _clipMask, model, model.Origin, model.Axis);");
			}
			else
			{
				idConsole.Warning("TODO: return idR.Game.Clip.Rotation(_clipModel.Origin, rotation, _clipModel, _clipModel.Axis, _clipMask, _self);");
			}

			return new TraceResult();
		}
Beispiel #38
0
		public override TraceResult ClipRotation(idRotation rotation, idClipModel model)
		{
			if(this.Disposed == true)
			{
				throw new ObjectDisposedException(this.GetType().Name);
			}

			return new TraceResult();
		}
		protected override void Dispose(bool disposing)
		{
			base.Dispose(disposing);

			if(_clipModel != null)
			{
				_clipModel.Dispose();
				_clipModel = null;
			}
		}
Beispiel #40
0
		public override ContentFlags ClipContents(idClipModel model)
		{
			if(this.Disposed == true)
			{
				throw new ObjectDisposedException(this.GetType().Name);
			}

			return ContentFlags.None;
		}
Beispiel #41
0
		public abstract ContentFlags ClipContents(idClipModel model);
Beispiel #42
0
 public abstract void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true);
Beispiel #43
0
		public override void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true)
		{
			if(this.Disposed == true)
			{
				throw new ObjectDisposedException(this.GetType().Name);
			}
		}
Beispiel #44
0
 public abstract TraceResult ClipTranslation(Vector3 translation, idClipModel model);
Beispiel #45
0
		private void SetClipModel()
		{
			idBounds bounds;

			if(_spectating == true)
			{
				bounds = idBounds.Expand(idE.CvarSystem.GetFloat("pm_spectatebbox") * 0.5f);
			}
			else
			{
				float width = idE.CvarSystem.GetFloat("pm_bboxwidth");

				bounds.Min = new Vector3(-width * 0.5f, -width * 0.5f, 0);
				bounds.Max = new Vector3(width * 0.5f, width * 0.5f, idE.CvarSystem.GetFloat("pm_normalheight"));
			}

			// the origin of the clip model needs to be set before calling SetClipModel
			// otherwise our physics object's current origin value gets reset to 0
			idClipModel clipModel;

			if(idE.CvarSystem.GetBool("pm_usecylinder") == true)
			{
				clipModel = new idClipModel(new idTraceModel(bounds, 8));
				clipModel.Translate(_physicsObject.PlayerOrigin);
			}
			else
			{
				clipModel = new idClipModel(new idTraceModel(bounds));
				clipModel.Translate(_physicsObject.PlayerOrigin);
			}

			_physicsObject.SetClipModel(clipModel, 1.0f);
		}
Beispiel #46
0
		public abstract void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true);