place blocks
This commit is contained in:
@ -4,7 +4,7 @@ package itype
|
||||
// This is the major way how complicated data is stored in blocks and entities.
|
||||
//
|
||||
// The empty interface should only hold these 4 types:
|
||||
// - int
|
||||
// - int64
|
||||
// - float64
|
||||
// - bool
|
||||
// - string
|
||||
|
@ -62,6 +62,10 @@ func (d Direction) Opposite() Direction {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (d Direction) String() string {
|
||||
return DirectionName[d]
|
||||
}
|
||||
|
||||
// DirectionIs returns X/Y/Z for 0/1/2, and +/- for #pos/neg.
|
||||
func DirectionIs(index int, positive bool) Direction {
|
||||
switch index {
|
||||
|
@ -1,6 +1,8 @@
|
||||
package itype
|
||||
|
||||
import "sort"
|
||||
import (
|
||||
"sort"
|
||||
)
|
||||
|
||||
// Recti is a 2D rectangle with int coordinates.
|
||||
type Recti struct {
|
||||
@ -113,6 +115,32 @@ func (b Boxd) Offsetv(x, y, z float64) Boxd {
|
||||
}
|
||||
}
|
||||
|
||||
// GrowEven grows the box on each axis by deltaSize,
|
||||
// not moving its center.
|
||||
func (b Boxd) GrowEven(deltaSize Vec3d) Boxd {
|
||||
return Boxd{
|
||||
OffX: b.OffX - deltaSize[0]/2,
|
||||
OffY: b.OffY - deltaSize[1]/2,
|
||||
OffZ: b.OffZ - deltaSize[2]/2,
|
||||
SizeX: b.SizeX + deltaSize[0],
|
||||
SizeY: b.SizeY + deltaSize[1],
|
||||
SizeZ: b.SizeZ + deltaSize[2],
|
||||
}
|
||||
}
|
||||
|
||||
// GrowOrigin grows the box on each axis by deltaSize,
|
||||
// not moving its origin.
|
||||
func (b Boxd) GrowOrigin(deltaSize Vec3d) Boxd {
|
||||
return Boxd{
|
||||
OffX: b.OffX,
|
||||
OffY: b.OffY,
|
||||
OffZ: b.OffZ,
|
||||
SizeX: b.SizeX + deltaSize[0],
|
||||
SizeY: b.SizeY + deltaSize[1],
|
||||
SizeZ: b.SizeZ + deltaSize[2],
|
||||
}
|
||||
}
|
||||
|
||||
func (b Boxd) MinPoint() Vec3d {
|
||||
return Vec3d{b.OffX, b.OffY, b.OffZ}
|
||||
}
|
||||
@ -121,9 +149,9 @@ func (b Boxd) MaxPoint() Vec3d {
|
||||
}
|
||||
|
||||
func (b Boxd) Contains(point Vec3d) bool {
|
||||
return point[0] >= b.OffX && point[0] <= b.OffX+b.SizeX &&
|
||||
point[1] >= b.OffY && point[1] <= b.OffY+b.SizeY &&
|
||||
point[2] >= b.OffZ && point[2] <= b.OffZ+b.SizeZ
|
||||
return point[0] > b.OffX && point[0] < b.OffX+b.SizeX &&
|
||||
point[1] > b.OffY && point[1] < b.OffY+b.SizeY &&
|
||||
point[2] > b.OffZ && point[2] < b.OffZ+b.SizeZ
|
||||
}
|
||||
|
||||
func pointIntersect(n, m, p, q float64) (min, len float64) {
|
||||
@ -157,7 +185,7 @@ func (box1 Boxd) Intersect(box2 Boxd) (ok bool, intersect Boxd) {
|
||||
}
|
||||
|
||||
func between(val, min, max float64) bool {
|
||||
return min <= val && val <= max
|
||||
return min < val && val < max
|
||||
}
|
||||
|
||||
// IntersectRay computes if a Box intersects with a ray.
|
||||
@ -174,14 +202,14 @@ func (box Boxd) IntersectRay(start, dir Vec3d, length float64) (ok bool, hitface
|
||||
for i := 0; i < 3; i++ {
|
||||
if dir[i] > 0 {
|
||||
t[i] = (min[i] - start[i]) / dir[i]
|
||||
} else {
|
||||
} else if dir[i] < 0 {
|
||||
t[i] = (max[i] - start[i]) / dir[i]
|
||||
}
|
||||
}
|
||||
|
||||
maxi := 0
|
||||
for i, ti := range t {
|
||||
if ti > t[maxi] {
|
||||
for i := range t {
|
||||
if t[i] > t[maxi] {
|
||||
maxi = i
|
||||
}
|
||||
}
|
||||
@ -190,7 +218,7 @@ func (box Boxd) IntersectRay(start, dir Vec3d, length float64) (ok bool, hitface
|
||||
pt := start.Add(dir.Multiply(t[maxi]))
|
||||
|
||||
o1 := (maxi + 1) % 3
|
||||
o2 := (maxi + 1) % 3
|
||||
o2 := (maxi + 2) % 3
|
||||
|
||||
if between(pt[o1], min[o1], max[o1]) && between(pt[o2], min[o2], max[o2]) {
|
||||
ok = true
|
||||
@ -201,5 +229,6 @@ func (box Boxd) IntersectRay(start, dir Vec3d, length float64) (ok bool, hitface
|
||||
}
|
||||
}
|
||||
|
||||
ok = false
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user