Files
mc/server/player/debug/shape.go
T
TarnaWijaya 26ed99fda6
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
up3
2026-07-09 08:33:57 +08:00

256 lines
11 KiB
Go

package debug
import (
"image/color"
"sync/atomic"
"github.com/df-mc/dragonfly/server/world"
"github.com/go-gl/mathgl/mgl64"
)
var nextShapeID atomic.Int32
// Shape represents a shape that can be drawn to a player from any point in the world.
type Shape interface {
// ShapeID returns the unique identifier of the shape. This is used to either update or remove the shape
// after it has been sent to the player.
ShapeID() int
}
// shape is a base type for all shapes that implements the Shape interface. It contains a unique identifier
// that is lazily initialised when the ShapeID method is called for the first time.
type shape struct {
id atomic.Int32
}
// ShapeID ...
func (s *shape) ShapeID() int {
if id := s.id.Load(); id != 0 {
return int(id)
}
s.id.CompareAndSwap(0, nextShapeID.Add(1))
return int(s.id.Load())
}
// Arrow represents an arrow shape that can be drawn at any point in the world. It has a head which can also
// be positioned anywhere, and the length, radius and number of segments can be changed.
type Arrow struct {
shape
// Colour is the colour that will be used for the line and head. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// EndPosition is the end position of the arrow in the world. The arrow will be drawn from Position to
// EndPosition, with the head being drawn at EndPosition.
EndPosition mgl64.Vec3
// HeadLength is the length of the head to be drawn at the end of the arrow. If zero, it will default
// to 1.0.
HeadLength float64
// HeadRadius is the radius of the head to be drawn at the end of the arrow. If zero, it will default
// to 0.5.
HeadRadius float64
// HeadSegments is the number of segments that the head of the arrow will be drawn with. The more
// segments, the smoother the head will look. If zero, it will default to 4.
HeadSegments int
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Box represents a hollow box that can be drawn at any point in the world, with a bounds that can be set.
type Box struct {
shape
// Colour is the colour that will be used for the outline. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// Scale is the rate to scale the shape from its origin point. If zero, it will default to 1.0.
Scale float64
// Bounds is the size of the box in the world, acting as an offset from the Position. If empty,
// it will default to a 1x1x1 box.
Bounds mgl64.Vec3
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Circle represents a hollow circle that can be drawn at any point in the world, with the scale being used
// to control the radius.
type Circle struct {
shape
// Colour is the colour that will be used for the outline. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// Scale is the radius of the circle. If zero, it will default to 1.0.
Scale float64
// Segments is the number of segments that the circle will be drawn with. The more segments, the smoother
// the circle will look. If empty, it will default to 20.
Segments int
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Line represents a line that can be drawn at any point in the world, with a start and end position.
type Line struct {
shape
// Colour is the colour that will be used for the line. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// EndPosition is the end position of the line in the world. The line will be drawn from Position to
// EndPosition.
EndPosition mgl64.Vec3
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Sphere represents a hollow sphere that can be drawn at any point in the world, with one line in each axis.
// The scale is used to control the radius of the sphere.
type Sphere struct {
shape
// Colour is the colour that will be used for the outline. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// Scale is the radius of the sphere. If zero, it will default to 1.0.
Scale float64
// Segments is the number of segments that the circle will be drawn with. The more segments, the smoother
// the circle will look. If empty, it will default to 20.
Segments int
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Text represents text that can be drawn at any point in the world, looking like a normal entity nametag
// without actually being attached to an entity.
type Text struct {
shape
// Colour is the colour that will be used for the actual text. If empty, the text will default to white.
Colour color.RGBA
// BackgroundColour is the colour used for the text background. If empty, it will default to a
// translucent black.
BackgroundColour color.RGBA
// HideBackground specifies whether the text background should be hidden entirely. Takes precedence
// over BackgroundColour when set.
HideBackground bool
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// Rotation is the rotation of the shape, applied only when LockRotation is set.
Rotation mgl64.Vec3
// Scale is the size of the text. If zero, it will default to 1.0.
Scale float64
// Text is the text to be displayed on the shape. The background automatically scales to fit the text.
Text string
// LockRotation specifies whether the text should be locked to the orientation set by Rotation.
// If false, the text will rotate to always face the camera.
LockRotation bool
// DisableDepthTest specifies whether the text should show through walls. If false, the text
// will be occluded by geometry in front of it.
DisableDepthTest bool
// HideBackface specifies whether the background should be hidden on the back side of the shape.
// Has no visible effect unless LockRotation is also set.
HideBackface bool
// HideBackfaceText specifies whether the text should be hidden on the back side of the shape.
// Has no visible effect unless LockRotation is also set.
HideBackfaceText bool
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Cylinder represents a hollow cylinder, or frustum, that can be drawn at any point in the world, with a
// height running up the Y axis. The base and top each have their own radius on the X and Z axes, allowing
// for tapered and elliptical cylinders. A Cone is the special case of a Cylinder with a zero top radius.
type Cylinder struct {
shape
// Colour is the colour that will be used for the outline. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// Scale is the rate to scale the shape from its origin point. If zero, it will default to 1.0.
Scale float64
// BaseRadius is the radius of the cylinder's base along the X and Z axes. If empty, it will default to a
// radius of 1.0 on each axis. Differing X and Z radii produce an elliptical cylinder.
BaseRadius mgl64.Vec2
// TopRadius is the radius of the cylinder's top along the X and Z axes. If empty, it will default to
// BaseRadius, producing a straight cylinder. A smaller TopRadius tapers the cylinder into a frustum.
TopRadius mgl64.Vec2
// Height is the height of the cylinder. If zero, it will default to 1.0.
Height float64
// Segments is the number of segments that the cylinder will be drawn with. The more segments, the
// smoother the cylinder will look. If zero, it will default to 20.
Segments int
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Pyramid represents a pyramid that can be drawn at any point in the world, with a base on the X and Z axes
// and a height running up the Y axis to a single apex.
type Pyramid struct {
shape
// Colour is the colour that will be used for the outline. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// Scale is the rate to scale the shape from its origin point. If zero, it will default to 1.0.
Scale float64
// Width is the width along the X axis of the pyramid base. If zero, it will default to 1.0.
Width float64
// Depth is the depth along the Z axis of the pyramid base. If zero, it will default to Width.
Depth float64
// Height is the height of the pyramid. If zero, it will default to 1.0.
Height float64
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Ellipsoid represents a hollow ellipsoid that can be drawn at any point in the world, with a radius along
// each of the X, Y and Z axes.
type Ellipsoid struct {
shape
// Colour is the colour that will be used for the outline. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// Scale is the rate to scale the shape from its origin point. If zero, it will default to 1.0.
Scale float64
// Radii are the radii of the ellipsoid along the X, Y and Z axes. If empty, it will default to a radius
// of 1.0 on each axis.
Radii mgl64.Vec3
// SegmentsPerAxis is the number of segments that the ellipsoid will be drawn with per axis. The more
// segments, the smoother the ellipsoid will look. If zero, it will default to 20.
SegmentsPerAxis int
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}
// Cone represents a cone that can be drawn at any point in the world, with a base on the X and Z axes and a
// height running up the Y axis to a single apex.
type Cone struct {
shape
// Colour is the colour that will be used for the outline. If empty, it will default to white.
Colour color.RGBA
// Position is the origin position of the shape in the world.
Position mgl64.Vec3
// Scale is the rate to scale the shape from its origin point. If zero, it will default to 1.0.
Scale float64
// Radii are the radii along the X and Z axes of the cone base. If empty, it will default to a radius of
// 1.0 on each axis.
Radii mgl64.Vec2
// Height is the height of the cone. If zero, it will default to 1.0.
Height float64
// Segments is the number of segments that the cone will be drawn with. The more segments, the smoother
// the cone will look. If zero, it will default to 20.
Segments int
// Entity is an optional entity handle to attach the shape to.
Entity *world.EntityHandle
}