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); }
public override void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true) { if (this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } }
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; }
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); }
public override TraceResult ClipRotation(idRotation rotation, idClipModel model) { if (this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } return(new TraceResult()); }
public override ContentFlags ClipContents(idClipModel model) { if (this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } return(ContentFlags.None); }
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; } }
/// <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 );*/ }
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);*/ }
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; } }
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); }
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; }
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); }
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); }
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(); }
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; }
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; }
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; } }
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); }
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); }
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; }
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; }
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; }
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; }
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; }
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; }
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(); }
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; } }
public override ContentFlags ClipContents(idClipModel model) { if(this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } return ContentFlags.None; }
public abstract void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true);
public override void SetClipModel(idClipModel model, float density, int id = 0, bool disposeOld = true) { if(this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } }
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); }