public Shape(SchemaShape2D shapeScheme) { Vertices = shapeScheme.Vertices; Edges = shapeScheme.Edges; CreateBounds(); }
public override void UpdateEntity(int entity) { CPosition position = (CPosition)positions[entity]; CDimension dimension = (CDimension)dimensions[entity]; CTransform transform = (CTransform)transforms[entity]; List <int> queryResult = binPartitioner.Query(CreateQueryBounds()); if (queryResult.Count == 0) { return; } SchemaShape2D collisionInformation = SchemaShape2DHelper.CreateShapeSchema(CBoxColliderHelper.ShapeData, position, dimension, transform); Shape shape = new Shape(collisionInformation); SchemaShape2D theirCollisionInformation; Shape theirShape; CPosition theirPosition; CDimension theirDimension; CTransform theirTransform; for (int i = 0; i < queryResult.Count; i++) { if (!scene.EntityContains(queryResult[i], typeof(CTransform), typeof(CBoxCollider))) { continue; } if (entity == queryResult[i]) { continue; } theirPosition = (CPosition)positions[queryResult[i]]; theirDimension = (CDimension)dimensions[queryResult[i]]; theirTransform = (CTransform)transforms[queryResult[i]]; theirCollisionInformation = SchemaShape2DHelper.CreateShapeSchema(CBoxColliderHelper.ShapeData, theirPosition, theirDimension, theirTransform); theirShape = new Shape(theirCollisionInformation); ProcessResolution(CollisionHelper.GetResolution(shape, theirShape)); } RectangleF CreateQueryBounds() { return(new RectangleF(position.X - queryBuffer, position.Y - queryBuffer, dimension.Width + queryBuffer * 2, dimension.Height + queryBuffer * 2)); } void ProcessResolution(Vector2 resolution) { position.X += resolution.X; position.Y += resolution.Y; } }
private void HandleRotation() { if (Rotation == 0) { return; } exactBounds.RotationOffset = new Vector2(Width / 2, Height / 2); exactBounds.Rotation = Rotation; SchemaShape2D collisionInformation = exactBounds.GetCollisionInformation(); float xMin = VertexFinder(collisionInformation.Vertices, "x", "minimum"); float xMax = VertexFinder(collisionInformation.Vertices, "x", "maximum"); float yMin = VertexFinder(collisionInformation.Vertices, "y", "minimum"); float yMax = VertexFinder(collisionInformation.Vertices, "y", "maximum"); float width = xMax - xMin; float height = yMax - yMin; broadBounds.SetBounds(xMin, yMin, width, height); }