diff --git a/.gitignore b/.gitignore index 396663f..dd8df20 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ releases -kage-viewer +kageviewer diff --git a/Makefile b/Makefile index e9d8af3..04ffa9e 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ # # no need to modify anything below -tool = kage-viewer +tool = kageviewer VERSION = $(shell grep VERSION config.go | head -1 | cut -d '"' -f2) archs = darwin freebsd linux windows 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 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 mkdir -p t/out @@ -75,12 +75,12 @@ goupdate: buildall: ./mkrel.sh $(tool) $(VERSION) -release: buildall +release: gh release create v$(VERSION) --generate-notes releases/* show-versions: buildlocal - @echo "### kage-viewer version:" - @./kage-viewer -V + @echo "### kageviewer version:" + @./kageviewer -V @echo @echo "### go module versions:" diff --git a/README.md b/README.md index 998a0e1..831a9fa 100644 --- a/README.md +++ b/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 ![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) -[![Go Report Card](https://goreportcard.com/badge/github.com/tlinden/kage-viewer)](https://goreportcard.com/report/github.com/tlinden/kage-viewer) +[![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/kageviewer)](https://goreportcard.com/report/github.com/tlinden/kageviewer) This little tool can be used to test shaders written in [Kage](https://ebitengine.org/en/documents/shader.html), a shader meta 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 see live, how it responds to your changes. If loading fails, an error 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 -The tool does not have any dependencies. Just download the binary for -your platform from the releases page and you're good to go. +Since `kageviewer` is primarily aimed at golang game developers, no +pre built binaries are provided. -### Installation using a pre-compiled binary - -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: +### Installation with go ```shell -cat kage-viewer-linux-amd64-0.0.2.sha25 && sha256sum kage-viewer-linux-amd64-0.0.2 -``` -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 +go install github.com/tlinden/kageviewer@latest ``` ### Installation from source @@ -66,10 +44,10 @@ install`. # Usage ```shell -kage-viewer -h -This is kage-viewer, a shader viewer. +kageviewer -h +This is kageviewer, a shader viewer. -Usage: kage-viewer [-vd] [-c ] [-g geom] [-p geom] \ +Usage: kageviewer [-vd] [-c ] [-g geom] [-p geom] \ -i -i -s Options: @@ -81,9 +59,10 @@ Options: -b --background Image to load as background -t --tps At how many ticks per second to run --map-flag Map Flag uniform to - --map-ticks Map Flag uniform to - --map-slider Map Flag uniform to - --map-mouse Map Flag uniform to + --map-ticks Map Ticks uniform to + --map-time Map Time uniform to + --map-slider Map Slider uniform to + --map-mouse Map Mouse uniform to -d --debug Show debugging output -v --version Show program version ``` @@ -91,7 +70,7 @@ Options: Example usage using the provided example: ```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 @@ -108,15 +87,16 @@ Uniforms supported so far: `SPACE` or pusing the left mouse button - `var Slider float`: a normalized float value, you can increment it 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 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: ```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. @@ -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 like. A configfile is searched in these locations in this order: -* `/etc/kage-viewer.conf` -* `/usr/local/etc/kage-viewer.conf` -* `$HOME/.config/kage-viewer/config` -* `$HOME/.kage-viewer` +* `/etc/kageviewer.conf` +* `/usr/local/etc/kageviewer.conf` +* `$HOME/.config/kageviewer/config` +* `$HOME/.kageviewer` You may also specify a config file on the commandline using the `-c` flag. @@ -148,7 +128,7 @@ Possible parameters equal the long command line options. # 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 diff --git a/config.go b/config.go index 86bfe7c..f5cd7c5 100644 --- a/config.go +++ b/config.go @@ -32,10 +32,10 @@ import ( ) const ( - VERSION string = "0.0.4" - Usage string = `This is kage-viewer, a shader viewer. + VERSION string = "0.0.5" + Usage string = `This is kageviewer, a shader viewer. -Usage: kage-viewer [-vd] [-c ] [-g geom] [-p geom] \ +Usage: kageviewer [-vd] [-c ] [-g geom] [-p geom] \ -i -i -s Options: @@ -47,9 +47,10 @@ Options: -b --background Image to load as background -t --tps At how many ticks per second to run --map-flag Map Flag uniform to - --map-ticks Map Flag uniform to - --map-slider Map Flag uniform to - --map-mouse Map Flag uniform to + --map-ticks Map Ticks uniform to + --map-time Map Time uniform to + --map-slider Map Slider uniform to + --map-mouse Map Mouse uniform to -d --debug Show debugging output -v --version Show program version ` @@ -69,6 +70,7 @@ type Config struct { Ticks string `koanf:"map-ticks"` Mouse string `koanf:"map-mouse"` Slider string `koanf:"map-slider"` + Time string `koanf:"map-time"` 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("map-flag", "", "Flag", "map flag 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-slider", "", "Slider", "map slider uniform") flagset.StringP("background", "b", "", "background image") @@ -113,10 +116,10 @@ func InitConfig() (*Config, error) { configfiles = []string{configfile} } else { configfiles = []string{ - "/etc/kage-viewer.conf", "/usr/local/etc/kage-viewer.conf", // unix variants - filepath.Join(home, ".config", "kage-viewer", "config"), - filepath.Join(home, ".kage-viewer"), - "kage-viewer.conf", + "/etc/kageviewer.conf", "/usr/local/etc/kageviewer.conf", // unix variants + filepath.Join(home, ".config", "kageviewer", "config"), + filepath.Join(home, ".kageviewer"), + "kageviewer.conf", } } diff --git a/game.go b/game.go index ca3e5ac..a8023d8 100644 --- a/game.go +++ b/game.go @@ -30,14 +30,15 @@ import ( ) type Game struct { - Conf *Config - Images []*asset.LiveAsset[*ebiten.Image] - Shader *asset.LiveAsset[*ebiten.Shader] - Cursor []float64 - Ticks int - Slider float64 - Flag int - Background *asset.LiveAsset[*ebiten.Image] + Conf *Config + Images []*asset.LiveAsset[*ebiten.Image] + Shader *asset.LiveAsset[*ebiten.Shader] + ShaderBounds image.Rectangle + Cursor []float64 + Ticks float64 + Slider float64 + Flag int + Background *asset.LiveAsset[*ebiten.Image] } func LoadImage(name string) (*ebiten.Image, error) { @@ -56,6 +57,7 @@ func LoadImage(name string) (*ebiten.Image, error) { } func (game *Game) Init() error { + // preload images for _, image := range game.Conf.Image { slog.Debug("Loading images", "image", image) //img, err := LoadImage(image) @@ -67,6 +69,7 @@ func (game *Game) Init() error { game.Images = append(game.Images, img) } + // preload shader shader, err := asset.NewLiveAsset[*ebiten.Shader](game.Conf.Shader) if err != nil { 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 + // user can customize 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 } @@ -176,8 +202,9 @@ func (game *Game) Draw(screen *ebiten.Image) { op.Uniforms = map[string]any{ game.Conf.Flag: game.Flag, 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.Ticks: game.Ticks, } 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)) - 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) { diff --git a/go.mod b/go.mod index 4991cbf..566180d 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/TLINDEN/kage-viewer +module github.com/TLINDEN/kageviewer go 1.22 diff --git a/main.go b/main.go index b211bd5..5cfe6ec 100644 --- a/main.go +++ b/main.go @@ -36,7 +36,7 @@ func main() { } if conf.Showversion { - fmt.Printf("This is kage-viewer version %s\n", VERSION) + fmt.Printf("This is kageviewer version %s\n", VERSION) return } diff --git a/mkrel.sh b/mkrel.sh index 9e75b40..53adb5f 100755 --- a/mkrel.sh +++ b/mkrel.sh @@ -61,7 +61,7 @@ for D in $DIST; do GOOS=${os} GOARCH=${arch} go build -o ${binfile} mkdir -p ${tardir} cp ${binfile} README.md LICENSE ${tardir}/ - echo 'tool = kage-viewer + echo 'tool = kageviewer PREFIX = /usr/local UID = root GID = 0