130 lines
3.6 KiB
Go
130 lines
3.6 KiB
Go
package igwrap
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"edgaru089.ink/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]
|
|
}
|