mirror of
https://codeberg.org/scip/kageviewer.git
synced 2025-12-16 12:10:59 +01:00
Changes:
- renamed to kageviewer to match with repository name - automatically determine shader size when needed - added Time uniform - don't provide binary releases anymore
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,2 @@
|
|||||||
releases
|
releases
|
||||||
kage-viewer
|
kageviewer
|
||||||
|
|||||||
10
Makefile
10
Makefile
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
#
|
#
|
||||||
# no need to modify anything below
|
# no need to modify anything below
|
||||||
tool = kage-viewer
|
tool = kageviewer
|
||||||
VERSION = $(shell grep VERSION config.go | head -1 | cut -d '"' -f2)
|
VERSION = $(shell grep VERSION config.go | head -1 | cut -d '"' -f2)
|
||||||
archs = darwin freebsd linux windows
|
archs = darwin freebsd linux windows
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
@@ -44,7 +44,7 @@ shader-destruct: buildlocal
|
|||||||
./$(tool) -g 32x32 -i example/wall.png -i example/damage.png --map-ticks Time -s example/destruct.kage
|
./$(tool) -g 32x32 -i example/wall.png -i example/damage.png --map-ticks Time -s example/destruct.kage
|
||||||
|
|
||||||
shader-ebiten: buildlocal
|
shader-ebiten: buildlocal
|
||||||
./$(tool) -g 640x480 --map-ticks Time --map-mouse Cursor -s example/ebiten.kage
|
./$(tool) -g 640x480 --map-mouse Cursor -s example/ebiten.kage
|
||||||
|
|
||||||
test: clean
|
test: clean
|
||||||
mkdir -p t/out
|
mkdir -p t/out
|
||||||
@@ -75,12 +75,12 @@ goupdate:
|
|||||||
buildall:
|
buildall:
|
||||||
./mkrel.sh $(tool) $(VERSION)
|
./mkrel.sh $(tool) $(VERSION)
|
||||||
|
|
||||||
release: buildall
|
release:
|
||||||
gh release create v$(VERSION) --generate-notes releases/*
|
gh release create v$(VERSION) --generate-notes releases/*
|
||||||
|
|
||||||
show-versions: buildlocal
|
show-versions: buildlocal
|
||||||
@echo "### kage-viewer version:"
|
@echo "### kageviewer version:"
|
||||||
@./kage-viewer -V
|
@./kageviewer -V
|
||||||
|
|
||||||
@echo
|
@echo
|
||||||
@echo "### go module versions:"
|
@echo "### go module versions:"
|
||||||
|
|||||||
70
README.md
70
README.md
@@ -1,14 +1,14 @@
|
|||||||
# kage-viewer - Viewer for shaders written in Kage, similar to glslviewer
|
# kageviewer - Viewer for shaders written in Kage, similar to glslviewer
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
[](https://github.com/tlinden/kage-viewer/blob/master/LICENSE)
|
[](https://github.com/tlinden/kageviewer/blob/master/LICENSE)
|
||||||
[](https://goreportcard.com/report/github.com/tlinden/kage-viewer)
|
[](https://goreportcard.com/report/github.com/tlinden/kageviewer)
|
||||||
|
|
||||||
This little tool can be used to test shaders written in
|
This little tool can be used to test shaders written in
|
||||||
[Kage](https://ebitengine.org/en/documents/shader.html), a shader meta
|
[Kage](https://ebitengine.org/en/documents/shader.html), a shader meta
|
||||||
language for
|
language for
|
||||||
[Ebitengine](https://github.com/hajimehoshi/ebiten). kage-viewer
|
[Ebitengine](https://github.com/hajimehoshi/ebiten). kageviewer
|
||||||
reloads changed assets, which allows you to develop your shader and
|
reloads changed assets, which allows you to develop your shader and
|
||||||
see live, how it responds to your changes. If loading fails, an error
|
see live, how it responds to your changes. If loading fails, an error
|
||||||
will be printed to STDOUT. The same applies for images.
|
will be printed to STDOUT. The same applies for images.
|
||||||
@@ -19,35 +19,13 @@ will be printed to STDOUT. The same applies for images.
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
The tool does not have any dependencies. Just download the binary for
|
Since `kageviewer` is primarily aimed at golang game developers, no
|
||||||
your platform from the releases page and you're good to go.
|
pre built binaries are provided.
|
||||||
|
|
||||||
### Installation using a pre-compiled binary
|
### Installation with go
|
||||||
|
|
||||||
Go to the [latest release page](https://github.com/TLINDEN/kage-viewer/releases/latest)
|
|
||||||
and look for your OS and platform. There are two options to install the binary:
|
|
||||||
|
|
||||||
Directly download the binary for your platform,
|
|
||||||
e.g. `kage-viewer-linux-amd64-0.0.2`, rename it to `kage-viewer` (or whatever
|
|
||||||
you like more!) and put it into your bin dir (e.g. `$HOME/bin` or as
|
|
||||||
root to `/usr/local/bin`).
|
|
||||||
|
|
||||||
Be sure to verify the signature of the binary file. For this also
|
|
||||||
download the matching `kage-viewer-linux-amd64-0.0.2.sha256` file and:
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
cat kage-viewer-linux-amd64-0.0.2.sha25 && sha256sum kage-viewer-linux-amd64-0.0.2
|
go install github.com/tlinden/kageviewer@latest
|
||||||
```
|
|
||||||
You should see the same SHA256 hash.
|
|
||||||
|
|
||||||
You may also download a binary tarball for your platform, e.g.
|
|
||||||
`kage-viewer-linux-amd64-0.0.2.tar.gz`, unpack and install it. GNU Make is
|
|
||||||
required for this:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
tar xvfz kage-viewer-linux-amd64-0.0.2.tar.gz
|
|
||||||
cd kage-viewer-linux-amd64-0.0.2
|
|
||||||
sudo make install
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Installation from source
|
### Installation from source
|
||||||
@@ -66,10 +44,10 @@ install`.
|
|||||||
# Usage
|
# Usage
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
kage-viewer -h
|
kageviewer -h
|
||||||
This is kage-viewer, a shader viewer.
|
This is kageviewer, a shader viewer.
|
||||||
|
|
||||||
Usage: kage-viewer [-vd] [-c <config file>] [-g geom] [-p geom] \
|
Usage: kageviewer [-vd] [-c <config file>] [-g geom] [-p geom] \
|
||||||
-i <image0.png> -i <image1.png> -s <shader.kage>
|
-i <image0.png> -i <image1.png> -s <shader.kage>
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
@@ -81,9 +59,10 @@ Options:
|
|||||||
-b --background <png file> Image to load as background
|
-b --background <png file> Image to load as background
|
||||||
-t --tps <ticks/s> At how many ticks per second to run
|
-t --tps <ticks/s> At how many ticks per second to run
|
||||||
--map-flag <name> Map Flag uniform to <name>
|
--map-flag <name> Map Flag uniform to <name>
|
||||||
--map-ticks <name> Map Flag uniform to <name>
|
--map-ticks <name> Map Ticks uniform to <name>
|
||||||
--map-slider <name> Map Flag uniform to <name>
|
--map-time <name> Map Time uniform to <name>
|
||||||
--map-mouse <name> Map Flag uniform to <name>
|
--map-slider <name> Map Slider uniform to <name>
|
||||||
|
--map-mouse <name> Map Mouse uniform to <name>
|
||||||
-d --debug Show debugging output
|
-d --debug Show debugging output
|
||||||
-v --version Show program version
|
-v --version Show program version
|
||||||
```
|
```
|
||||||
@@ -91,7 +70,7 @@ Options:
|
|||||||
Example usage using the provided example:
|
Example usage using the provided example:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
kage-viewer -g 32x32 -i example/wall.png -i example/damage.png -s example/destruct.kg
|
kageviewer -g 32x32 -i example/wall.png -i example/damage.png -s example/destruct.kg
|
||||||
```
|
```
|
||||||
|
|
||||||
Hit `SPACE` or press the left mouse button to toggle the damage
|
Hit `SPACE` or press the left mouse button to toggle the damage
|
||||||
@@ -108,15 +87,16 @@ Uniforms supported so far:
|
|||||||
`SPACE` or pusing the left mouse button
|
`SPACE` or pusing the left mouse button
|
||||||
- `var Slider float`: a normalized float value, you can increment it
|
- `var Slider float`: a normalized float value, you can increment it
|
||||||
with `UP` or `DOWN`
|
with `UP` or `DOWN`
|
||||||
- `var Ticks float`: the time the game runs (ticks, not seconds!)
|
- `var Time float`: the time the game runs (ticks / TPS)
|
||||||
|
- `var Ticks float`: the number of updates happened so far
|
||||||
- `var Mouse vec2`: the current mouse position
|
- `var Mouse vec2`: the current mouse position
|
||||||
|
|
||||||
If you want to test an existing shader and don't want to rename the
|
If you want to test an existing shader and don't want to rename the
|
||||||
uniforms, you can map the ones provided by **kage-viewer** to custom
|
uniforms, you can map the ones provided by **kageviewer** to custom
|
||||||
names using the `--map-*` options. For example:
|
names using the `--map-*` options. For example:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
kage-viewer -g 640x480 --map-ticks Time --map-mouse Cursor examples/shader/default.go
|
kageviewer -g 640x480 --map-ticks Time --map-mouse Cursor examples/shader/default.go
|
||||||
```
|
```
|
||||||
|
|
||||||
This executes the example shader in the ebitenging source repository.
|
This executes the example shader in the ebitenging source repository.
|
||||||
@@ -126,10 +106,10 @@ This executes the example shader in the ebitenging source repository.
|
|||||||
You can use a config file to store your own codes, once you found one
|
You can use a config file to store your own codes, once you found one
|
||||||
you like. A configfile is searched in these locations in this order:
|
you like. A configfile is searched in these locations in this order:
|
||||||
|
|
||||||
* `/etc/kage-viewer.conf`
|
* `/etc/kageviewer.conf`
|
||||||
* `/usr/local/etc/kage-viewer.conf`
|
* `/usr/local/etc/kageviewer.conf`
|
||||||
* `$HOME/.config/kage-viewer/config`
|
* `$HOME/.config/kageviewer/config`
|
||||||
* `$HOME/.kage-viewer`
|
* `$HOME/.kageviewer`
|
||||||
|
|
||||||
You may also specify a config file on the commandline using the `-c`
|
You may also specify a config file on the commandline using the `-c`
|
||||||
flag.
|
flag.
|
||||||
@@ -148,7 +128,7 @@ Possible parameters equal the long command line options.
|
|||||||
|
|
||||||
# Report bugs
|
# Report bugs
|
||||||
|
|
||||||
[Please open an issue](https://github.com/TLINDEN/kage-viewer/issues). Thanks!
|
[Please open an issue](https://github.com/TLINDEN/kageviewer/issues). Thanks!
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
|
|||||||
23
config.go
23
config.go
@@ -32,10 +32,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
VERSION string = "0.0.4"
|
VERSION string = "0.0.5"
|
||||||
Usage string = `This is kage-viewer, a shader viewer.
|
Usage string = `This is kageviewer, a shader viewer.
|
||||||
|
|
||||||
Usage: kage-viewer [-vd] [-c <config file>] [-g geom] [-p geom] \
|
Usage: kageviewer [-vd] [-c <config file>] [-g geom] [-p geom] \
|
||||||
-i <image0.png> -i <image1.png> -s <shader.kage>
|
-i <image0.png> -i <image1.png> -s <shader.kage>
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
@@ -47,9 +47,10 @@ Options:
|
|||||||
-b --background <png file> Image to load as background
|
-b --background <png file> Image to load as background
|
||||||
-t --tps <ticks/s> At how many ticks per second to run
|
-t --tps <ticks/s> At how many ticks per second to run
|
||||||
--map-flag <name> Map Flag uniform to <name>
|
--map-flag <name> Map Flag uniform to <name>
|
||||||
--map-ticks <name> Map Flag uniform to <name>
|
--map-ticks <name> Map Ticks uniform to <name>
|
||||||
--map-slider <name> Map Flag uniform to <name>
|
--map-time <name> Map Time uniform to <name>
|
||||||
--map-mouse <name> Map Flag uniform to <name>
|
--map-slider <name> Map Slider uniform to <name>
|
||||||
|
--map-mouse <name> Map Mouse uniform to <name>
|
||||||
-d --debug Show debugging output
|
-d --debug Show debugging output
|
||||||
-v --version Show program version
|
-v --version Show program version
|
||||||
`
|
`
|
||||||
@@ -69,6 +70,7 @@ type Config struct {
|
|||||||
Ticks string `koanf:"map-ticks"`
|
Ticks string `koanf:"map-ticks"`
|
||||||
Mouse string `koanf:"map-mouse"`
|
Mouse string `koanf:"map-mouse"`
|
||||||
Slider string `koanf:"map-slider"`
|
Slider string `koanf:"map-slider"`
|
||||||
|
Time string `koanf:"map-time"`
|
||||||
|
|
||||||
X, Y, Width, Height int // feed from -g + -p
|
X, Y, Width, Height int // feed from -g + -p
|
||||||
}
|
}
|
||||||
@@ -93,6 +95,7 @@ func InitConfig() (*Config, error) {
|
|||||||
flagset.StringP("shader", "s", "", "shader file")
|
flagset.StringP("shader", "s", "", "shader file")
|
||||||
flagset.StringP("map-flag", "", "Flag", "map flag uniform")
|
flagset.StringP("map-flag", "", "Flag", "map flag uniform")
|
||||||
flagset.StringP("map-ticks", "", "Ticks", "map ticks uniform")
|
flagset.StringP("map-ticks", "", "Ticks", "map ticks uniform")
|
||||||
|
flagset.StringP("map-time", "", "Time", "map time uniform")
|
||||||
flagset.StringP("map-mouse", "", "Mouse", "map mouse uniform")
|
flagset.StringP("map-mouse", "", "Mouse", "map mouse uniform")
|
||||||
flagset.StringP("map-slider", "", "Slider", "map slider uniform")
|
flagset.StringP("map-slider", "", "Slider", "map slider uniform")
|
||||||
flagset.StringP("background", "b", "", "background image")
|
flagset.StringP("background", "b", "", "background image")
|
||||||
@@ -113,10 +116,10 @@ func InitConfig() (*Config, error) {
|
|||||||
configfiles = []string{configfile}
|
configfiles = []string{configfile}
|
||||||
} else {
|
} else {
|
||||||
configfiles = []string{
|
configfiles = []string{
|
||||||
"/etc/kage-viewer.conf", "/usr/local/etc/kage-viewer.conf", // unix variants
|
"/etc/kageviewer.conf", "/usr/local/etc/kageviewer.conf", // unix variants
|
||||||
filepath.Join(home, ".config", "kage-viewer", "config"),
|
filepath.Join(home, ".config", "kageviewer", "config"),
|
||||||
filepath.Join(home, ".kage-viewer"),
|
filepath.Join(home, ".kageviewer"),
|
||||||
"kage-viewer.conf",
|
"kageviewer.conf",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
51
game.go
51
game.go
@@ -30,14 +30,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Game struct {
|
type Game struct {
|
||||||
Conf *Config
|
Conf *Config
|
||||||
Images []*asset.LiveAsset[*ebiten.Image]
|
Images []*asset.LiveAsset[*ebiten.Image]
|
||||||
Shader *asset.LiveAsset[*ebiten.Shader]
|
Shader *asset.LiveAsset[*ebiten.Shader]
|
||||||
Cursor []float64
|
ShaderBounds image.Rectangle
|
||||||
Ticks int
|
Cursor []float64
|
||||||
Slider float64
|
Ticks float64
|
||||||
Flag int
|
Slider float64
|
||||||
Background *asset.LiveAsset[*ebiten.Image]
|
Flag int
|
||||||
|
Background *asset.LiveAsset[*ebiten.Image]
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadImage(name string) (*ebiten.Image, error) {
|
func LoadImage(name string) (*ebiten.Image, error) {
|
||||||
@@ -56,6 +57,7 @@ func LoadImage(name string) (*ebiten.Image, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (game *Game) Init() error {
|
func (game *Game) Init() error {
|
||||||
|
// preload images
|
||||||
for _, image := range game.Conf.Image {
|
for _, image := range game.Conf.Image {
|
||||||
slog.Debug("Loading images", "image", image)
|
slog.Debug("Loading images", "image", image)
|
||||||
//img, err := LoadImage(image)
|
//img, err := LoadImage(image)
|
||||||
@@ -67,6 +69,7 @@ func (game *Game) Init() error {
|
|||||||
game.Images = append(game.Images, img)
|
game.Images = append(game.Images, img)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// preload shader
|
||||||
shader, err := asset.NewLiveAsset[*ebiten.Shader](game.Conf.Shader)
|
shader, err := asset.NewLiveAsset[*ebiten.Shader](game.Conf.Shader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to load shader %s: %s", game.Conf.Shader, err)
|
return fmt.Errorf("failed to load shader %s: %s", game.Conf.Shader, err)
|
||||||
@@ -85,8 +88,31 @@ func (game *Game) Init() error {
|
|||||||
|
|
||||||
game.Shader = shader
|
game.Shader = shader
|
||||||
|
|
||||||
|
// user can customize TPS
|
||||||
ebiten.SetMaxTPS(game.Conf.TPS)
|
ebiten.SetMaxTPS(game.Conf.TPS)
|
||||||
|
|
||||||
|
// setup shader bounds, by default we use window size
|
||||||
|
game.ShaderBounds = image.Rect(0, 0, game.Conf.Width, game.Conf.Height)
|
||||||
|
|
||||||
|
if len(game.Images) > 0 {
|
||||||
|
if game.Conf.Width < game.Images[0].Value().Bounds().Max.X {
|
||||||
|
// setup geom. Shader might be smaller than window, we use the
|
||||||
|
// first image - if any - to determine its size. We also enlarge
|
||||||
|
// the window if the first image is larger than the window.
|
||||||
|
game.Conf.Width = game.Images[0].Value().Bounds().Max.X
|
||||||
|
game.Conf.Height = game.Images[0].Value().Bounds().Max.Y
|
||||||
|
}
|
||||||
|
|
||||||
|
// adjust shader size by first image as well
|
||||||
|
game.ShaderBounds = game.Images[0].Value().Bounds()
|
||||||
|
} else {
|
||||||
|
// there might be no shader image but a background image, check it
|
||||||
|
if game.Background != nil {
|
||||||
|
game.Conf.Width = game.Background.Value().Bounds().Max.X
|
||||||
|
game.Conf.Height = game.Background.Value().Bounds().Max.Y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,8 +202,9 @@ func (game *Game) Draw(screen *ebiten.Image) {
|
|||||||
op.Uniforms = map[string]any{
|
op.Uniforms = map[string]any{
|
||||||
game.Conf.Flag: game.Flag,
|
game.Conf.Flag: game.Flag,
|
||||||
game.Conf.Slider: game.Slider,
|
game.Conf.Slider: game.Slider,
|
||||||
game.Conf.Ticks: float64(game.Ticks) / 60,
|
game.Conf.Time: game.Ticks / float64(ebiten.TPS()),
|
||||||
game.Conf.Mouse: game.Cursor,
|
game.Conf.Mouse: game.Cursor,
|
||||||
|
game.Conf.Ticks: game.Ticks,
|
||||||
}
|
}
|
||||||
|
|
||||||
for idx, image := range game.Images {
|
for idx, image := range game.Images {
|
||||||
@@ -186,7 +213,11 @@ func (game *Game) Draw(screen *ebiten.Image) {
|
|||||||
|
|
||||||
op.GeoM.Translate(float64(game.Conf.X), float64(game.Conf.Y))
|
op.GeoM.Translate(float64(game.Conf.X), float64(game.Conf.Y))
|
||||||
|
|
||||||
screen.DrawRectShader(game.Conf.Width, game.Conf.Height, game.Shader.Value(), op)
|
screen.DrawRectShader(
|
||||||
|
game.ShaderBounds.Dx(),
|
||||||
|
game.ShaderBounds.Dy(),
|
||||||
|
game.Shader.Value(),
|
||||||
|
op)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (game *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
|
func (game *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -1,4 +1,4 @@
|
|||||||
module github.com/TLINDEN/kage-viewer
|
module github.com/TLINDEN/kageviewer
|
||||||
|
|
||||||
go 1.22
|
go 1.22
|
||||||
|
|
||||||
|
|||||||
2
main.go
2
main.go
@@ -36,7 +36,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if conf.Showversion {
|
if conf.Showversion {
|
||||||
fmt.Printf("This is kage-viewer version %s\n", VERSION)
|
fmt.Printf("This is kageviewer version %s\n", VERSION)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
mkrel.sh
2
mkrel.sh
@@ -61,7 +61,7 @@ for D in $DIST; do
|
|||||||
GOOS=${os} GOARCH=${arch} go build -o ${binfile}
|
GOOS=${os} GOARCH=${arch} go build -o ${binfile}
|
||||||
mkdir -p ${tardir}
|
mkdir -p ${tardir}
|
||||||
cp ${binfile} README.md LICENSE ${tardir}/
|
cp ${binfile} README.md LICENSE ${tardir}/
|
||||||
echo 'tool = kage-viewer
|
echo 'tool = kageviewer
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
UID = root
|
UID = root
|
||||||
GID = 0
|
GID = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user