From e42df9080ff4503f88e44813c541186c13209663 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Mon, 25 Mar 2024 15:41:51 +0100 Subject: [PATCH] various changes: - renamed example shaders to .kage - added --map-* options to map builtin uniforms to custom names - added ebitengine sample shader with mapping (run `make shader-ebiten`) - fixed bug: shaders with 0 images are allowed now --- .gitignore | 1 + Makefile | 6 ++++ README.md | 30 +++++++++++++------ config.go | 40 +++++++++++++------------- example/{destruct.kg => destruct.kage} | 2 +- example/ebiten.kage | 33 +++++++++++++++++++++ game.go | 8 +++--- 7 files changed, 87 insertions(+), 33 deletions(-) rename example/{destruct.kg => destruct.kage} (98%) create mode 100644 example/ebiten.kage diff --git a/.gitignore b/.gitignore index b8c14be..396663f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ releases +kage-viewer diff --git a/Makefile b/Makefile index cb50fe9..e9d8af3 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,12 @@ install: buildlocal clean: rm -rf $(tool) coverage.out testdata t/out +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 + test: clean mkdir -p t/out go test ./... $(ARGS) diff --git a/README.md b/README.md index 4a3914c..cdf1f42 100644 --- a/README.md +++ b/README.md @@ -61,13 +61,17 @@ Usage: kage-viewer [-vd] [-c ] [-g geom] [-p geom] \ -i -i -s Options: --c --config Config file to use (optional) --i --image Image to load (multiple times allowed, up to 4) --s --shader Shader to run --g --geometry Window size --p --position Position of image0 --d --debug Show debugging output --v --version Show program version +-c --config Config file to use (optional) +-i --image Image to load (multiple times allowed, up to 4) +-s --shader Shader to run +-g --geometry Window size +-p --position Position of image0 + --map-flag Map Flag uniform to + --map-ticks Map Flag uniform to + --map-slider Map Flag uniform to + --map-mouse Map Flag uniform to +-d --debug Show debugging output +-v --version Show program version ``` Example usage using the provided example: @@ -90,9 +94,19 @@ 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 int`: the time the game runs (ticks, not seconds!) +- `var Ticks float`: the time the game runs (ticks, not seconds!) - `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 +names using the `--map-*` options. For example: + +```shell +kage-viewer -g 640x480 --map-ticks Time --map-mouse Cursor examples/shader/default.go +``` + +This executes the example shader in the ebitenging source repository. + # Config File You can use a config file to store your own codes, once you found one diff --git a/config.go b/config.go index 7386eb7..81cb3a2 100644 --- a/config.go +++ b/config.go @@ -32,20 +32,24 @@ import ( ) const ( - VERSION string = "0.0.1" + VERSION string = "0.0.2" Usage string = `This is kage-viewer, a shader viewer. Usage: kage-viewer [-vd] [-c ] [-g geom] [-p geom] \ -i -i -s Options: --c --config Config file to use (optional) --i --image Image to load (multiple times allowed, up to 4) --s --shader Shader to run --g --geometry Window size --p --position Position of image0 --d --debug Show debugging output --v --version Show program version +-c --config Config file to use (optional) +-i --image Image to load (multiple times allowed, up to 4) +-s --shader Shader to run +-g --geometry Window size +-p --position Position of image0 + --map-flag Map Flag uniform to + --map-ticks Map Flag uniform to + --map-slider Map Flag uniform to + --map-mouse Map Flag uniform to +-d --debug Show debugging output +-v --version Show program version ` ) @@ -57,6 +61,10 @@ type Config struct { Shader string `koanf:"shader"` // -s Geo string `koanf:"geometry"` // -g Posision string `koanf:"position"` // -p + Flag string `koanf:"map-flag"` + Ticks string `koanf:"map-ticks"` + Mouse string `koanf:"map-mouse"` + Slider string `koanf:"map-slider"` X, Y, Width, Height int // feed from -g + -p } @@ -64,14 +72,6 @@ type Config struct { func InitConfig() (*Config, error) { var kloader = koanf.New(".") - // Load default values using the confmap provider. - /* not needed yet - if err := kloader.Load(confmap.Provider(map[string]interface{}{ - }, "."), nil); err != nil { - return nil, fmt.Errorf("failed to load default values into koanf: %w", err) - } - */ - // setup custom usage flagset := flag.NewFlagSet("config", flag.ContinueOnError) flagset.Usage = func() { @@ -87,6 +87,10 @@ func InitConfig() (*Config, error) { flagset.StringP("position", "p", "0x0", "position of shader") flagset.StringArrayP("image", "i", nil, "image file") 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-mouse", "", "Mouse", "map mouse uniform") + flagset.StringP("map-slider", "", "Slider", "map slider uniform") if err := flagset.Parse(os.Args[1:]); err != nil { return nil, fmt.Errorf("failed to parse program arguments: %w", err) @@ -140,10 +144,6 @@ func InitConfig() (*Config, error) { } func SanitiyCheck(conf *Config) error { - if len(conf.Image) < 1 { - return fmt.Errorf("at least 1 image must be specified") - } - if len(conf.Image) > 4 { return fmt.Errorf("only 4 images can be specified") } diff --git a/example/destruct.kg b/example/destruct.kage similarity index 98% rename from example/destruct.kg rename to example/destruct.kage index 603aca9..c2cd3b4 100644 --- a/example/destruct.kg +++ b/example/destruct.kage @@ -20,7 +20,7 @@ package main var Flag int var Slider float -var Time int +var Time float var Mouse vec2 func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 { diff --git a/example/ebiten.kage b/example/ebiten.kage new file mode 100644 index 0000000..1c7f701 --- /dev/null +++ b/example/ebiten.kage @@ -0,0 +1,33 @@ +// Copyright 2020 The Ebiten Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build ignore + +//kage:unit pixels + +package main + +var Time float +var Cursor vec2 + +func Fragment(dstPos vec4, srcPos vec2, color vec4) vec4 { + pos := (dstPos.xy - imageDstOrigin()) / imageDstSize() + pos += Cursor / imageDstSize() / 4 + clr := 0.0 + clr += sin(pos.x*cos(Time/15)*80) + cos(pos.y*cos(Time/15)*10) + clr += sin(pos.y*sin(Time/10)*40) + cos(pos.x*sin(Time/25)*40) + clr += sin(pos.x*sin(Time/5)*10) + sin(pos.y*sin(Time/35)*80) + clr *= sin(Time/10) * 0.5 + return vec4(clr, clr*0.5, sin(clr+Time/3)*0.75, 1) +} diff --git a/game.go b/game.go index d8df4ee..a7a0180 100644 --- a/game.go +++ b/game.go @@ -135,10 +135,10 @@ func (game *Game) Draw(screen *ebiten.Image) { mousex, mousey := ebiten.CursorPosition() op.Uniforms = map[string]any{ - "Flag": game.Flag, - "Slider": game.Slider, - "Ticks": game.Ticks, - "Mouse": []float64{float64(mousex), float64(mousey)}, + game.Conf.Flag: game.Flag, + game.Conf.Slider: game.Slider, + game.Conf.Ticks: float64(game.Ticks) / 60, + game.Conf.Mouse: []float64{float64(mousex), float64(mousey)}, } copy(op.Images[:3], game.Images)