mirror of
https://github.com/genxium/DelayNoMore
synced 2024-12-26 11:48:56 +00:00
83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
|
package dnmshared
|
||
|
|
||
|
import (
|
||
|
"github.com/kvartborg/vector"
|
||
|
"github.com/solarlune/resolv"
|
||
|
"math"
|
||
|
)
|
||
|
|
||
|
func GenerateRectCollider(origX, origY, w, h, spaceOffsetX, spaceOffsetY float64, tag string) *resolv.Object {
|
||
|
collider := resolv.NewObject(origX-w*0.5+spaceOffsetX, origY-h*0.5+spaceOffsetY, w, h, tag)
|
||
|
shape := resolv.NewRectangle(0, 0, w, h)
|
||
|
collider.SetShape(shape)
|
||
|
return collider
|
||
|
}
|
||
|
|
||
|
func GenerateConvexPolygonCollider(unalignedSrc *Polygon2D, spaceOffsetX, spaceOffsetY float64, tag string) *resolv.Object {
|
||
|
aligned := AlignPolygon2DToBoundingBox(unalignedSrc)
|
||
|
var w, h float64 = 0, 0
|
||
|
|
||
|
shape := resolv.NewConvexPolygon()
|
||
|
for i, pi := range aligned.Points {
|
||
|
for j, pj := range aligned.Points {
|
||
|
if i == j {
|
||
|
continue
|
||
|
}
|
||
|
if math.Abs(pj.X-pi.X) > w {
|
||
|
w = math.Abs(pj.X - pi.X)
|
||
|
}
|
||
|
if math.Abs(pj.Y-pi.Y) > h {
|
||
|
h = math.Abs(pj.Y - pi.Y)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for i := 0; i < len(aligned.Points); i++ {
|
||
|
p := aligned.Points[i]
|
||
|
shape.AddPoints(p.X, p.Y)
|
||
|
}
|
||
|
|
||
|
collider := resolv.NewObject(aligned.Anchor.X+spaceOffsetX, aligned.Anchor.Y+spaceOffsetY, w, h, tag)
|
||
|
collider.SetShape(shape)
|
||
|
|
||
|
return collider
|
||
|
}
|
||
|
|
||
|
func CalculateMTVForConvexPolygon(cp *resolv.ConvexPolygon, other *resolv.ConvexPolygon) vector.Vector {
|
||
|
delta := vector.Vector{0, 0}
|
||
|
|
||
|
smallest := vector.Vector{math.MaxFloat64, 0}
|
||
|
|
||
|
for _, axis := range cp.SATAxes() {
|
||
|
if !cp.Project(axis).Overlapping(other.Project(axis)) {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
overlap := cp.Project(axis).Overlap(other.Project(axis))
|
||
|
|
||
|
if smallest.Magnitude() > overlap {
|
||
|
smallest = axis.Scale(overlap)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
for _, axis := range other.SATAxes() {
|
||
|
|
||
|
if !cp.Project(axis).Overlapping(other.Project(axis)) {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
overlap := cp.Project(axis).Overlap(other.Project(axis))
|
||
|
|
||
|
if smallest.Magnitude() > overlap {
|
||
|
smallest = axis.Scale(overlap)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
delta[0] = smallest[0]
|
||
|
delta[1] = smallest[1]
|
||
|
|
||
|
return delta
|
||
|
}
|