forked from MoonsideGames/MoonTools.Bonk
				
			optimize rectangle support function
							parent
							
								
									f9df547302
								
							
						
					
					
						commit
						9e7d16b0a9
					
				| 
						 | 
					@ -38,21 +38,36 @@ namespace MoonTools.Core.Bonk
 | 
				
			||||||
            AABB = new AABB(minX, minY, maxX, maxY);
 | 
					            AABB = new AABB(minX, minY, maxX, maxY);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private Vector2 Support(Vector2 direction)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (direction.X >= 0 && direction.Y >= 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return new Vector2(MaxX, MaxY);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (direction.X >= 0 && direction.Y < 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return new Vector2(MaxX, MinY);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (direction.X < 0 && direction.Y >= 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return new Vector2(MinX, MaxY);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (direction.X < 0 && direction.Y < 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return new Vector2(MinX, MinY);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                throw new ArgumentException("Support vector direction cannot be zero.");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public Vector2 Support(Vector2 direction, Transform2D transform)
 | 
					        public Vector2 Support(Vector2 direction, Transform2D transform)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var maxDotProduct = float.NegativeInfinity;
 | 
					            Matrix4x4 inverseTransform;
 | 
				
			||||||
            var maxVertex = new Vector2(MinX, MinY);
 | 
					            Matrix4x4.Invert(transform.TransformMatrix, out inverseTransform);
 | 
				
			||||||
            foreach (var vertex in Vertices)
 | 
					            var inverseDirection = Vector2.TransformNormal(direction, inverseTransform);
 | 
				
			||||||
            {
 | 
					            return Vector2.Transform(Support(inverseDirection), transform.TransformMatrix);
 | 
				
			||||||
                var transformed = Vector2.Transform(vertex, transform.TransformMatrix);
 | 
					 | 
				
			||||||
                var dot = Vector2.Dot(transformed, direction);
 | 
					 | 
				
			||||||
                if (dot > maxDotProduct)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    maxVertex = transformed;
 | 
					 | 
				
			||||||
                    maxDotProduct = dot;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return maxVertex;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public AABB TransformedAABB(Transform2D transform)
 | 
					        public AABB TransformedAABB(Transform2D transform)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue