110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
|
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
|
||
|
}
|