Skip to content
interface.go 2.56 KiB
Newer Older
faiface's avatar
faiface committed
package pixel

faiface's avatar
faiface committed

// Target is something that can be drawn onto, such as a window, a canvas, and so on.
//
// You can notice, that there are no "drawing" methods in a Target. That's because all drawing
// happens indirectly through Triangles instance generated via MakeTriangles method.
faiface's avatar
faiface committed
type Target interface {
	// MakeTriangles generates a specialized copy of the provided Triangles.
	//
	// When calling Draw method on the returned Triangles, the Triangles will be drawn onto the
	// target that generated them.
	//
	// Note, that not every Target has to recognize all possible types of triangles. Some may
	// only recognize TrianglesPosition and TrianglesColor and ignore all other properties (if
	// present) when making new Triangles. This varies from Target to Target.
	MakeTriangles(Triangles) Triangles
faiface's avatar
faiface committed

	// These are the most basic Target "adjustment" methods.
	SetPicture(*Picture)
	SetTransform(...Transform)
	SetMaskColor(color.Color)
faiface's avatar
faiface committed
}

// Triangles represents a list of vertices, where each three vertices form a triangle. (First,
// second and third is the first triangle, fourth, fifth and sixth is the second triangle, etc.)
type Triangles interface {
	// Len returns the number of vertices. The number of triangles is the number of vertices
	// divided by 3.
	Len() int

	// Draw draws Triangles onto an associated Target (if any).
	//
	// Note, that this method does not have to be implemented, however it is always implemented
	// for Triangles generated by a Target.
	Draw()

	// Update copies vertex properties from the supplied Triangles into this Triangles.
	//
	// Properies not supported by these Triangles should be ignored. Properties not supported by
	// the supplied Triangles should be left untouched.
	//
	// If these Triangles and supplied Triangles have different lengths, these Triangles should
	// be resized.
	Update(Triangles)

	// Append adds supplied Triangles to the end of these Triangles.
	//
	// Behavior regarding unsupported properties should be same as with Update.
	Append(Triangles)
}

// Drawer is something that can be drawn onto any Target.
faiface's avatar
faiface committed
type Drawer interface {
	Draw(Target)
}

// TrianglesPosition specifies Triangles with Position property.
type TrianglesPosition interface {
	Triangles
	Position(i int) Vec
}

// TrianglesColor specifies Triangles with Color property.
type TrianglesColor interface {
	Triangles
	Color(i int) color.Color
}

// TrianglesTexture specifies Triangles with Texture propery.
//
// Note that this represents texture coordinates, not an actual texture.
type TrianglesTexture interface {
	Triangles
	Texture(i int) Vec
faiface's avatar
faiface committed
}