gg/cx/collider.go

110 lines
2.3 KiB
Go
Raw Permalink Normal View History

2024-05-28 11:24:12 +03:00
package cx
// Implementing the interface lets
// the engine to work faster about
// collisions because it first checks
// if the the bigger collider that
// contains more complicated (accurate) structure
// do collide.
//type ColliderSimplifier interface {
//ColliderSimplify() Triangle
//}
type CollisionMap map[CollisionType] []Collision
type CollisionType int
const (
CollisionNo CollisionType = iota
CollisionStaticPhysics
CollisionTrigger
CollisionLast
)
// The structure contains collision information.
type Collision struct {
Type CollisionType
What, With Collider
// Points of Self contained in
Points Points
Crosses []LineCross
}
// Implementing the interface lets the engine
// to determine if the object collides with anything.
type Collider interface {
// Checks whether the object is collidable
CollisionType() CollisionType
IsCollidable() bool
Verticer
Edger
PointContainer
}
type Collidability struct {
Type CollisionType
Collidable bool
}
func (c Collidability) CollisionType() CollisionType {
return c.Type
}
func (c Collidability) IsCollidable() bool {
return c.Collidable
}
type PointContainer interface {
ContainedPoints(Points) Points
}
type Verticer interface {
Vertices() Vertices
}
type Edger interface {
Edges() Edges
}
// Implementing the type provides way
// to resolve collisions and other problems.
// The Resolve() is called right after the Update() of Updater.
type Resolver interface {
IsResolvable() bool
Resolve(c *Context)
GetCollisionInterest() []CollisionType
Collider
}
type Resolvability struct {
Resolvable bool
CollisionInterest []CollisionType
}
func (r Resolvability) IsResolvable() bool {
return r.Resolvable
}
func (r Resolvability) GetCollisionInterest() []CollisionType {
return r.CollisionInterest
}
func Collide(c1, c2 Collider) (Collision, bool) {
vertices := c1.Vertices()
es1, es2 := c1.Edges(), c2.Edges()
crosses, doCross := es1.CrossWithEdges(es2)
pts := c2.ContainedPoints(vertices)
return Collision{
Type: c2.CollisionType(),
What: c1,
With: c2,
Points: pts,
Crosses: crosses,
}, len(pts) > 0 || doCross
}
func GetCollisions(c Collider, cs []Collider) []Collision {
ret := []Collision{}
for _, ic := range cs {
if ic == c {
continue
}
col, has := Collide(c, ic)
if has {
ret = append(ret, col)
}
}
return ret
}