108 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package shape
 | 
						|
 | 
						|
import (
 | 
						|
	"zworld/plugin/math/mat4"
 | 
						|
	"zworld/plugin/math/vec3"
 | 
						|
)
 | 
						|
 | 
						|
type Plane struct {
 | 
						|
	Normal   vec3.T
 | 
						|
	Distance float32
 | 
						|
}
 | 
						|
 | 
						|
func (p *Plane) normalize() {
 | 
						|
	length := p.Normal.LengthSqr() + p.Distance*p.Distance
 | 
						|
	p.Normal = p.Normal.Scaled(1 / length)
 | 
						|
	p.Distance /= length
 | 
						|
}
 | 
						|
 | 
						|
func (p *Plane) DistanceToPoint(point vec3.T) float32 {
 | 
						|
	return vec3.Dot(p.Normal, point) + p.Distance
 | 
						|
}
 | 
						|
 | 
						|
type Frustum struct {
 | 
						|
	Front, Back, Left, Right, Top, Bottom Plane
 | 
						|
}
 | 
						|
 | 
						|
func (f *Frustum) IntersectsSphere(s *Sphere) bool {
 | 
						|
	if f.Left.DistanceToPoint(s.Center) <= -s.Radius {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	if f.Right.DistanceToPoint(s.Center) <= -s.Radius {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	if f.Top.DistanceToPoint(s.Center) <= -s.Radius {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	if f.Bottom.DistanceToPoint(s.Center) <= -s.Radius {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	if f.Front.DistanceToPoint(s.Center) <= -s.Radius {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	if f.Back.DistanceToPoint(s.Center) <= -s.Radius {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
func FrustumFromMatrix(vp mat4.T) Frustum {
 | 
						|
	f := Frustum{
 | 
						|
		Left: Plane{
 | 
						|
			Normal: vec3.T{
 | 
						|
				X: vp[0+3] + vp[0+0],
 | 
						|
				Y: vp[4+3] + vp[4+0],
 | 
						|
				Z: vp[8+3] + vp[8+0],
 | 
						|
			},
 | 
						|
			Distance: vp[12+3] + vp[12+0],
 | 
						|
		},
 | 
						|
		Right: Plane{
 | 
						|
			Normal: vec3.T{
 | 
						|
				X: vp[0+3] - vp[0+0],
 | 
						|
				Y: vp[4+3] - vp[4+0],
 | 
						|
				Z: vp[8+3] - vp[8+0],
 | 
						|
			},
 | 
						|
			Distance: vp[12+3] - vp[12+0],
 | 
						|
		},
 | 
						|
		Top: Plane{
 | 
						|
			Normal: vec3.T{
 | 
						|
				X: vp[0+3] - vp[0+1],
 | 
						|
				Y: vp[4+3] - vp[4+1],
 | 
						|
				Z: vp[8+3] - vp[8+1],
 | 
						|
			},
 | 
						|
			Distance: vp[12+3] - vp[12+1],
 | 
						|
		},
 | 
						|
		Bottom: Plane{
 | 
						|
			Normal: vec3.T{
 | 
						|
				X: vp[0+3] + vp[0+1],
 | 
						|
				Y: vp[4+3] + vp[4+1],
 | 
						|
				Z: vp[8+3] + vp[8+1],
 | 
						|
			},
 | 
						|
			Distance: vp[12+3] + vp[12+1],
 | 
						|
		},
 | 
						|
		Back: Plane{
 | 
						|
			Normal: vec3.T{
 | 
						|
				X: vp[0+3] + vp[0+2],
 | 
						|
				Y: vp[4+3] + vp[4+2],
 | 
						|
				Z: vp[8+3] + vp[8+2],
 | 
						|
			},
 | 
						|
			Distance: vp[12+3] + vp[12+2],
 | 
						|
		},
 | 
						|
		Front: Plane{
 | 
						|
			Normal: vec3.T{
 | 
						|
				X: vp[0+3] - vp[0+2],
 | 
						|
				Y: vp[4+3] - vp[4+2],
 | 
						|
				Z: vp[8+3] - vp[8+2],
 | 
						|
			},
 | 
						|
			Distance: vp[12+3] - vp[12+2],
 | 
						|
		},
 | 
						|
	}
 | 
						|
	f.Front.normalize()
 | 
						|
	f.Back.normalize()
 | 
						|
	f.Top.normalize()
 | 
						|
	f.Bottom.normalize()
 | 
						|
	f.Left.normalize()
 | 
						|
	f.Right.normalize()
 | 
						|
	return f
 | 
						|
}
 |