- 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:
2024-03-26 18:22:48 +01:00
parent b384795e53
commit f5899ac72f
8 changed files with 88 additions and 74 deletions

2
.gitignore vendored
View File

@@ -1,2 +1,2 @@
releases releases
kage-viewer kageviewer

View File

@@ -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:"

View File

@@ -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
![Logo](https://github.com/TLINDEN/kageviewer/blob/main/.github/assets/logo.png) ![Logo](https://github.com/TLINDEN/kageviewer/blob/main/.github/assets/logo.png)
[![License](https://img.shields.io/badge/license-GPL-blue.svg)](https://github.com/tlinden/kage-viewer/blob/master/LICENSE) [![License](https://img.shields.io/badge/license-GPL-blue.svg)](https://github.com/tlinden/kageviewer/blob/master/LICENSE)
[![Go Report Card](https://goreportcard.com/badge/github.com/tlinden/kage-viewer)](https://goreportcard.com/report/github.com/tlinden/kage-viewer) [![Go Report Card](https://goreportcard.com/badge/github.com/tlinden/kageviewer)](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

View File

@@ -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",
} }
} }

37
game.go
View File

@@ -33,8 +33,9 @@ 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]
ShaderBounds image.Rectangle
Cursor []float64 Cursor []float64
Ticks int Ticks float64
Slider float64 Slider float64
Flag int Flag int
Background *asset.LiveAsset[*ebiten.Image] Background *asset.LiveAsset[*ebiten.Image]
@@ -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
View File

@@ -1,4 +1,4 @@
module github.com/TLINDEN/kage-viewer module github.com/TLINDEN/kageviewer
go 1.22 go 1.22

View File

@@ -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
} }

View File

@@ -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