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
This commit is contained in:
2024-03-25 15:41:51 +01:00
parent 8cd2d74a8b
commit e42df9080f
7 changed files with 87 additions and 33 deletions

1
.gitignore vendored
View File

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

View File

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

View File

@@ -61,13 +61,17 @@ Usage: kage-viewer [-vd] [-c <config file>] [-g geom] [-p geom] \
-i <image0.png> -i <image1.png> -s <shader.kage>
Options:
-c --config <toml file> Config file to use (optional)
-i --image <png file> Image to load (multiple times allowed, up to 4)
-s --shader <kage file> Shader to run
-g --geometry <WIDTHxHEIGHT> Window size
-p --position <XxY> Position of image0
-d --debug Show debugging output
-v --version Show program version
-c --config <toml file> Config file to use (optional)
-i --image <png file> Image to load (multiple times allowed, up to 4)
-s --shader <kage file> Shader to run
-g --geometry <WIDTHxHEIGHT> Window size
-p --position <XxY> Position of image0
--map-flag <name> Map Flag uniform to <name>
--map-ticks <name> Map Flag uniform to <name>
--map-slider <name> Map Flag uniform to <name>
--map-mouse <name> Map Flag uniform to <name>
-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

View File

@@ -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 <config file>] [-g geom] [-p geom] \
-i <image0.png> -i <image1.png> -s <shader.kage>
Options:
-c --config <toml file> Config file to use (optional)
-i --image <png file> Image to load (multiple times allowed, up to 4)
-s --shader <kage file> Shader to run
-g --geometry <WIDTHxHEIGHT> Window size
-p --position <XxY> Position of image0
-d --debug Show debugging output
-v --version Show program version
-c --config <toml file> Config file to use (optional)
-i --image <png file> Image to load (multiple times allowed, up to 4)
-s --shader <kage file> Shader to run
-g --geometry <WIDTHxHEIGHT> Window size
-p --position <XxY> Position of image0
--map-flag <name> Map Flag uniform to <name>
--map-ticks <name> Map Flag uniform to <name>
--map-slider <name> Map Flag uniform to <name>
--map-mouse <name> Map Flag uniform to <name>
-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")
}

View File

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

33
example/ebiten.kage Normal file
View File

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

View File

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