gl01/internal/igwrap/imagewrap.go
2022-02-24 20:20:33 +08:00

130 lines
3.6 KiB
Go

package igwrap
import (
"sync"
"edgaru089.ml/go/gl01/internal/util/itype"
"github.com/inkyblackness/imgui-go/v4"
)
// Image creates a ImGUI image based on the given texture.
// For *render.Texture, use tex.Handle().
//
// size is in pixels. texRange is in [0, 1].
func Image(tex uint32, size itype.Vec2f, texRange itype.Rectf) {
min, max := texRange.MinPoint(), texRange.MaxPoint()
if GetTextureFlag(tex)&TextureFlag_FlipY == 0 {
min[1], max[1] = max[1], min[1] // swap minY/maxY
}
imgui.ImageV(
imgui.TextureID(tex),
Vec2(size),
Vec2(min), Vec2(max),
Color(255, 255, 255, 255),
imgui.Vec4{},
)
}
// ImageV creates a ImGUI image based on the given texture.
// For *render.Texture, use tex.Handle().
//
// size is in pixels. texRange is in [0, 1].
func ImageV(tex uint32, size itype.Vec2f, texRange itype.Rectf, texColor itype.Vec4f, borderColor itype.Vec4f) {
min, max := texRange.MinPoint(), texRange.MaxPoint()
if GetTextureFlag(tex)&TextureFlag_FlipY == 0 {
min[1], max[1] = max[1], min[1] // swap minY/maxY
}
imgui.ImageV(
imgui.TextureID(tex),
Vec2(size),
Vec2(min), Vec2(max),
Vec4(texColor),
Vec4(borderColor),
)
}
func ImageButton(tex uint32, size itype.Vec2f, texRange itype.Rectf) bool {
min, max := texRange.MinPoint(), texRange.MaxPoint()
if GetTextureFlag(tex)&TextureFlag_FlipY == 0 {
min[1], max[1] = max[1], min[1] // swap minY/maxY
}
return imgui.ImageButtonV(
imgui.TextureID(tex),
Vec2(size),
Vec2(min), Vec2(max),
-1,
imgui.Vec4{},
imgui.Vec4{1, 1, 1, 1},
)
}
func ImageButtonV(tex uint32, size itype.Vec2f, texRange itype.Rectf, padding int, bgCol, tintCol itype.Vec4f) bool {
min, max := texRange.MinPoint(), texRange.MaxPoint()
if GetTextureFlag(tex)&TextureFlag_FlipY == 0 {
min[1], max[1] = max[1], min[1] // swap minY/maxY
}
return imgui.ImageButtonV(
imgui.TextureID(tex),
Vec2(size),
Vec2(min), Vec2(max),
padding,
Vec4(bgCol),
Vec4(tintCol),
)
}
// Per-texture flags. This is passed to the shader as-is.
//
// FilpY is handled by the ImageXXX() call.
type TextureFlag int
const (
TextureFlag_Red TextureFlag = 1 << iota // Renders the Red channel.
TextureFlag_Green // Renders the Green channel.
TextureFlag_Blue // Renders the Blue channel.
TextureFlag_Alpha // Renders the Alpha channel.
TextureFlag_Linear // Linear source data, requires gamma correction.
TextureFlag_ImGUIFont // This is a font texture from ImGUI, with a single red channel.
TextureFlag_FlipY // The render should flip the Y axis of the texture. By default ImageXXX()s render textures with (0,0) at the bottom left, and this is for in case you want to flip them.
TextureFlag_RGB = TextureFlag_Red | TextureFlag_Green | TextureFlag_Blue
TextureFlag_RGBA = TextureFlag_Red | TextureFlag_Green | TextureFlag_Blue | TextureFlag_Alpha
)
var (
texflags map[uint32]TextureFlag = make(map[uint32]TextureFlag)
texflagslock sync.RWMutex
)
// SetTextureFlag changes the flag of a texture to the given flags combined.
func SetTextureFlag(tex uint32, flags ...TextureFlag) {
var f TextureFlag
for _, f0 := range flags {
f |= f0
}
texflagslock.Lock()
defer texflagslock.Unlock()
texflags[tex] = f
}
// AddTextureFlag adds the given flags to the texture.
func AddTextureFlag(tex uint32, flags ...TextureFlag) {
var f TextureFlag
for _, f0 := range flags {
f |= f0
}
texflagslock.Lock()
defer texflagslock.Unlock()
texflags[tex] |= f
}
// TextureFlag returns the flags of a given texture.
func GetTextureFlag(tex uint32) TextureFlag {
texflagslock.RLock()
defer texflagslock.RUnlock()
return texflags[tex]
}