package world

// VisibilityLevel controls whether a ViewLayer should use an entity's public visibility or force it
// visible or invisible for a viewer.
type VisibilityLevel struct {
	visibility
}

// PublicVisibility is the default visibility level where the entity is (in)visible
// depending on how it already is publicly viewed.
func PublicVisibility() VisibilityLevel {
	return VisibilityLevel{0}
}

// EnforceInvisible is the visibility level where the entity is always invisible to the viewer.
func EnforceInvisible() VisibilityLevel {
	return VisibilityLevel{1}
}

// EnforceVisible is the visibility level where the entity is always visible to the viewer.
func EnforceVisible() VisibilityLevel {
	return VisibilityLevel{2}
}

type visibility uint8

// EnforceVisibility returns whether metadata should be changed.
func (v visibility) EnforceVisibility() bool {
	return v > 0
}
