10 Commits

Author SHA1 Message Date
3c93fde441 not needed 2025-11-26 20:58:38 +01:00
T. von Dein
3aee72e78d move to codeberg (#2) 2025-11-26 20:51:45 +01:00
a3c1a80e15 fixed code spacing 2024-04-08 10:29:27 +02:00
868ad2c32d bump version 2024-03-26 18:40:01 +01:00
fb70f8284c fixed github path, rm mkrel 2024-03-26 18:35:11 +01:00
f5899ac72f Changes:
- renamed to kageviewer to match with repository name
- automatically determine shader size when needed
- added Time uniform
- don't provide binary releases anymore
2024-03-26 18:22:48 +01:00
b384795e53 added --tps and --background 2024-03-25 20:32:09 +01:00
b41d23a2fd + screenshot 2024-03-25 18:33:02 +01:00
dacbb5567c +logo 2024-03-25 18:26:53 +01:00
6cb30560d0 added Zyko0/Ebiary/asset for live reloading 2024-03-25 18:09:06 +01:00
14 changed files with 302 additions and 203 deletions

BIN
.github/assets/logo.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
.github/assets/screenshot.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

2
.gitignore vendored
View File

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

65
.goreleaser.yaml Normal file
View File

@@ -0,0 +1,65 @@
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
version: 2
before:
hooks:
- go mod tidy
gitea_urls:
api: https://codeberg.org/api/v1
download: https://codeberg.org
builds:
- env:
- CGO_ENABLED=0
goos:
- linux
- freebsd
archives:
- formats: [tar.gz]
# this name template makes the OS and Arch compatible with the results of `uname`.
name_template: >-
{{ .ProjectName }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
{{- if .Arm }}v{{ .Arm }}{{ end }}_{{ .Tag }}
# use zip for windows archives
format_overrides:
- goos: windows
formats: [zip]
- goos: linux
formats: [tar.gz,binary]
files:
- src: "*.md"
strip_parent: true
- src: Makefile.dist
dst: Makefile
wrap_in_directory: true
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
groups:
- title: Improved
regexp: '^.*?(feat|add|new)(\([[:word:]]+\))??!?:.+$'
order: 0
- title: Fixed
regexp: '^.*?(bug|fix)(\([[:word:]]+\))??!?:.+$'
order: 1
- title: Changed
order: 999
release:
header: "# Release Notes"
footer: >-
---
Full Changelog: [{{ .PreviousTag }}...{{ .Tag }}](https://codeberg.org/scip/kageviewer/compare/{{ .PreviousTag }}...{{ .Tag }})

31
.woodpecker/build.yaml Normal file
View File

@@ -0,0 +1,31 @@
matrix:
platform:
- linux/amd64
goversion:
- 1.24
labels:
platform: ${platform}
steps:
build:
when:
event: [push]
image: golang:${goversion}
commands:
- apt-get update
- apt-get install -y libasound2-dev libgl1-mesa-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev libxxf86vm-dev
- go get
- go build
linter:
when:
event: [push]
image: golang:${goversion}
commands:
- apt-get update
- apt-get install -y libasound2-dev libgl1-mesa-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev libxxf86vm-dev
- curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.5.0
- golangci-lint --version
- golangci-lint run ./...
depends_on: [build]

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
@@ -72,15 +72,12 @@ cover-report:
goupdate: goupdate:
go get -t -u=patch ./... go get -t -u=patch ./...
buildall: release:
./mkrel.sh $(tool) $(VERSION) gh release create v$(VERSION) --generate-notes
release: buildall
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:"

18
Makefile.dist Normal file
View File

@@ -0,0 +1,18 @@
# -*-make-*-
.PHONY: install all
tool = rpn
PREFIX = /usr/local
UID = root
GID = 0
all:
@echo "Type 'sudo make install' to install the tool."
@echo "To change prefix, type 'sudo make install PREFIX=/opt'"
install:
install -d -o $(UID) -g $(GID) $(PREFIX)/bin
install -d -o $(UID) -g $(GID) $(PREFIX)/share/doc
install -o $(UID) -g $(GID) -m 555 $(tool) $(PREFIX)/sbin/
install -o $(UID) -g $(GID) -m 444 *.md $(PREFIX)/share/doc/

View File

@@ -1,41 +1,32 @@
# kage-viewer - Viewer for shaders written in Kage, similar to glslviewer # kageviewer - Viewer for shaders written in Kage, similar to glslviewer
[![License](https://img.shields.io/badge/license-GPL-blue.svg)](https://github.com/tlinden/kage-viewer/blob/master/LICENSE) ![Logo](https://codeberg.org/scip/kageviewer/raw/branch/main/.github/assets/logo.png)
[![Go Report Card](https://goreportcard.com/badge/github.com/tlinden/kage-viewer)](https://goreportcard.com/report/github.com/tlinden/kage-viewer)
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). [![License](https://img.shields.io/badge/license-GPL-blue.svg)](https://codeberg.org/scip/kageviewer/raw/branch/main/LICENSE)
[![Go Report Card](https://goreportcard.com/badge/codeberg.org/scip/kageviewer)](https://goreportcard.com/report/codeberg.org/scip/kageviewer)
[![status-badge](https://ci.codeberg.org/api/badges/15617/status.svg)](https://ci.codeberg.org/repos/15617)
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). 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.
## Screenshot
![Screenshot](https://codeberg.org/scip/kageviewer/raw/branch/main/.github/assets/screenshot.png)
## 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 codeberg.org/scip/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
@@ -44,8 +35,8 @@ You will need the Golang toolchain in order to build from source. GNU
Make will also help but is not strictly neccessary. Make will also help but is not strictly neccessary.
If you want to compile the tool yourself, use `git clone` to clone the If you want to compile the tool yourself, use `git clone` to clone the
repository. Then execute `go mod tidy` to install all repository. Then execute `go mod tidy` to install all
dependencies. Then just enter `go build` or - if you have GNU Make dependencies. Then just enter `go build` or - if you have GNU Make
installed - `make`. installed - `make`.
To install after building either copy the binary or execute `sudo make To install after building either copy the binary or execute `sudo make
@@ -54,10 +45,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:
@@ -66,10 +57,13 @@ Options:
-s --shader <kage file> Shader to run -s --shader <kage file> Shader to run
-g --geometry <WIDTHxHEIGHT> Window size -g --geometry <WIDTHxHEIGHT> Window size
-p --position <XxY> Position of image0 -p --position <XxY> Position of image0
-b --background <png file> Image to load as background
-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
``` ```
@@ -77,7 +71,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
@@ -94,15 +88,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.
@@ -112,10 +107,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.
@@ -129,12 +124,12 @@ Possible parameters equal the long command line options.
- [X] Implement loading of images and shader files - [X] Implement loading of images and shader files
- [X] Implement basic shader rendering and user input - [X] Implement basic shader rendering and user input
- [ ] Add custom uniforms (maybe using lua code?) - [ ] Add custom uniforms (maybe using lua code?)
- [ ] Provide a way to respond live to shader code changes (use lua as - [x] Provide a way to respond live to shader code changes (use lua as
well?) well?)
# Report bugs # Report bugs
[Please open an issue](https://github.com/TLINDEN/kage-viewer/issues). Thanks! [Please open an issue](https://codeberg.org/scip/kageviewer/issues). Thanks!
# License # License

View File

@@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package main package main
import ( import (
"errors"
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
@@ -32,10 +33,10 @@ import (
) )
const ( const (
VERSION string = "0.0.2" VERSION string = "0.0.6"
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:
@@ -44,27 +45,32 @@ Options:
-s --shader <kage file> Shader to run -s --shader <kage file> Shader to run
-g --geometry <WIDTHxHEIGHT> Window size -g --geometry <WIDTHxHEIGHT> Window size
-p --position <XxY> Position of image0 -p --position <XxY> Position of image0
-b --background <png file> Image to load as background
-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`
`
) )
type Config struct { type Config struct {
Showversion bool `koanf:"version"` // -v Showversion bool `koanf:"version"` // -v
Debug bool `koanf:"debug"` // -d Debug bool `koanf:"debug"` // -d
Config string `koanf:"config"` // -c Config string `koanf:"config"` // -c
Image []string `koanf:"image"` // -i Image []string `koanf:"image"` // -i
Shader string `koanf:"shader"` // -s Shader string `koanf:"shader"` // -s
Geo string `koanf:"geometry"` // -g Background string `koanf:"background"` // -b
Posision string `koanf:"position"` // -p TPS int `koanf:"tps"` // -t
Geo string `koanf:"geometry"` // -g
Posision string `koanf:"position"` // -p
Flag string `koanf:"map-flag"` Flag string `koanf:"map-flag"`
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
} }
@@ -75,7 +81,7 @@ func InitConfig() (*Config, error) {
// setup custom usage // setup custom usage
flagset := flag.NewFlagSet("config", flag.ContinueOnError) flagset := flag.NewFlagSet("config", flag.ContinueOnError)
flagset.Usage = func() { flagset.Usage = func() {
fmt.Println(Usage) _, _ = fmt.Println(Usage)
os.Exit(0) os.Exit(0)
} }
@@ -89,8 +95,11 @@ 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.IntP("tps", "t", 60, "ticks per second")
if err := flagset.Parse(os.Args[1:]); err != nil { if err := flagset.Parse(os.Args[1:]); err != nil {
return nil, fmt.Errorf("failed to parse program arguments: %w", err) return nil, fmt.Errorf("failed to parse program arguments: %w", err)
@@ -107,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",
} }
} }
@@ -156,13 +165,13 @@ func SanitiyCheck(conf *Config) error {
geo := strings.Split(conf.Geo, "x") geo := strings.Split(conf.Geo, "x")
if len(geo) != 2 { if len(geo) != 2 {
return fmt.Errorf(geoerr) return errors.New(geoerr)
} }
w, errw := strconv.Atoi(geo[0]) w, errw := strconv.Atoi(geo[0])
h, errh := strconv.Atoi(geo[1]) h, errh := strconv.Atoi(geo[1])
if errw != nil || errh != nil { if errw != nil || errh != nil {
return fmt.Errorf(geoerr) return errors.New(geoerr)
} }
conf.Width = w conf.Width = w
@@ -172,13 +181,13 @@ func SanitiyCheck(conf *Config) error {
pos := strings.Split(conf.Posision, "x") pos := strings.Split(conf.Posision, "x")
if len(geo) != 2 { if len(geo) != 2 {
return fmt.Errorf(poserr) return errors.New(poserr)
} }
x, errx := strconv.Atoi(pos[0]) x, errx := strconv.Atoi(pos[0])
y, erry := strconv.Atoi(pos[1]) y, erry := strconv.Atoi(pos[1])
if errx != nil || erry != nil { if errx != nil || erry != nil {
return fmt.Errorf(poserr) return errors.New(poserr)
} }
conf.X = x conf.X = x
@@ -186,11 +195,3 @@ func SanitiyCheck(conf *Config) error {
return nil return nil
} }
func fileExists(filename string) bool {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return false
}
return !info.IsDir()
}

116
game.go
View File

@@ -24,17 +24,21 @@ import (
"log/slog" "log/slog"
"os" "os"
"github.com/Zyko0/Ebiary/asset"
"github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/inpututil" "github.com/hajimehoshi/ebiten/v2/inpututil"
) )
type Game struct { type Game struct {
Conf *Config Conf *Config
Images []*ebiten.Image Images []*asset.LiveAsset[*ebiten.Image]
Shader *ebiten.Shader Shader *asset.LiveAsset[*ebiten.Shader]
Ticks int ShaderBounds image.Rectangle
Slider float64 Cursor []float64
Flag int Ticks float64
Slider float64
Flag int
Background *asset.LiveAsset[*ebiten.Image]
} }
func LoadImage(name string) (*ebiten.Image, error) { func LoadImage(name string) (*ebiten.Image, error) {
@@ -42,7 +46,9 @@ func LoadImage(name string) (*ebiten.Image, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer fd.Close() defer func() {
_ = fd.Close()
}()
img, _, err := image.Decode(fd) img, _, err := image.Decode(fd)
if err != nil { if err != nil {
@@ -53,28 +59,62 @@ 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)
img, err := asset.NewLiveAsset[*ebiten.Image](image)
if err != nil { if err != nil {
return err return fmt.Errorf("failed to load image %s: %s", image, err)
} }
game.Images = append(game.Images, img) game.Images = append(game.Images, img)
} }
data, err := os.ReadFile(game.Conf.Shader) // preload 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)
} }
shader, err := ebiten.NewShader(data) if game.Conf.Background != "" {
if err != nil { slog.Debug("Loading background", "image", game.Conf.Background)
return fmt.Errorf("failed to create new shader %s: %s", game.Conf.Shader, err)
img, err := asset.NewLiveAsset[*ebiten.Image](game.Conf.Background)
if err != nil {
return fmt.Errorf("failed to load image %s: %s", game.Conf.Background, err)
}
game.Background = img
} }
game.Shader = shader game.Shader = shader
// user can customize TPS
ebiten.SetTPS(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
} }
@@ -120,32 +160,66 @@ func (g *Game) Down() {
} }
func (game *Game) Update() error { func (game *Game) Update() error {
if game.CheckInput() { for _, image := range game.Images {
slog.Debug("Key pressed", "Slider", game.Slider, "Flag", game.Flag) if image.Error() != nil {
fmt.Println("warn: image reloading error:", image.Error())
}
} }
if game.Shader.Error() != nil {
fmt.Println("warn: shader reloading error:", game.Shader.Error())
}
if game.Background != nil {
if game.Background.Error() != nil {
fmt.Println("warn: background image reloading error:", game.Background.Error())
}
}
if game.CheckInput() {
slog.Debug("Key pressed",
game.Conf.Flag, game.Flag,
game.Conf.Slider, game.Slider,
game.Conf.Ticks, fmt.Sprintf("%.02f", float64(game.Ticks)/60),
game.Conf.Mouse, fmt.Sprintf("%.02f, %.02f", game.Cursor[0], game.Cursor[1]),
)
}
mousex, mousey := ebiten.CursorPosition()
game.Cursor = []float64{float64(mousex), float64(mousey)}
game.Ticks++ game.Ticks++
return nil return nil
} }
func (game *Game) Draw(screen *ebiten.Image) { func (game *Game) Draw(screen *ebiten.Image) {
op := &ebiten.DrawRectShaderOptions{} if game.Background != nil {
op := &ebiten.DrawImageOptions{}
screen.DrawImage(game.Background.Value(), op)
}
mousex, mousey := ebiten.CursorPosition() op := &ebiten.DrawRectShaderOptions{}
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: []float64{float64(mousex), float64(mousey)}, game.Conf.Mouse: game.Cursor,
game.Conf.Ticks: game.Ticks,
} }
copy(op.Images[:3], game.Images) for idx, image := range game.Images {
op.Images[idx] = image.Value()
}
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, 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) {

5
go.mod
View File

@@ -1,11 +1,12 @@
module github.com/TLINDEN/kage-viewer module codeberg.org/scip/kageviewer
go 1.22 go 1.22
require ( require (
github.com/Zyko0/Ebiary/asset v0.0.0-20240304185439-be56fe8a2a6a // indirect
github.com/ebitengine/purego v0.6.0 // indirect github.com/ebitengine/purego v0.6.0 // indirect
github.com/fatih/color v1.16.0 // indirect github.com/fatih/color v1.16.0 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect
github.com/hajimehoshi/ebiten/v2 v2.6.7 // indirect github.com/hajimehoshi/ebiten/v2 v2.6.7 // indirect
github.com/jezek/xgb v1.1.0 // indirect github.com/jezek/xgb v1.1.0 // indirect

4
go.sum
View File

@@ -1,9 +1,13 @@
github.com/Zyko0/Ebiary/asset v0.0.0-20240304185439-be56fe8a2a6a h1:kn4fhGvVA6T1lK7qWujIj3m7e9imCZe4MHBuBeflKgU=
github.com/Zyko0/Ebiary/asset v0.0.0-20240304185439-be56fe8a2a6a/go.mod h1:4CqqwHRUbvGBpBd5ye4MxDA4k/XtZqrAD1sg9uxmcYI=
github.com/ebitengine/purego v0.6.0 h1:Yo9uBc1x+ETQbfEaf6wcBsjrQfCEnh/gaGUg7lguEJY= github.com/ebitengine/purego v0.6.0 h1:Yo9uBc1x+ETQbfEaf6wcBsjrQfCEnh/gaGUg7lguEJY=
github.com/ebitengine/purego v0.6.0/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= github.com/ebitengine/purego v0.6.0/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c=
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/hajimehoshi/ebiten/v2 v2.6.7 h1:rxlMxu487wZN/JteykmuGdO1qotOolL8vJDU85lPh7A= github.com/hajimehoshi/ebiten/v2 v2.6.7 h1:rxlMxu487wZN/JteykmuGdO1qotOolL8vJDU85lPh7A=

13
main.go
View File

@@ -21,7 +21,6 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"runtime/debug"
"log/slog" "log/slog"
@@ -37,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
} }
@@ -46,7 +45,6 @@ func main() {
if conf.Debug { if conf.Debug {
logLevel := &slog.LevelVar{} logLevel := &slog.LevelVar{}
// we're using a more verbose logger in debug mode // we're using a more verbose logger in debug mode
buildInfo, _ := debug.ReadBuildInfo()
opts := &yadu.Options{ opts := &yadu.Options{
Level: logLevel, Level: logLevel,
AddSource: true, AddSource: true,
@@ -55,12 +53,7 @@ func main() {
logLevel.Set(slog.LevelDebug) logLevel.Set(slog.LevelDebug)
handler := yadu.NewHandler(os.Stdout, opts) handler := yadu.NewHandler(os.Stdout, opts)
debuglogger := slog.New(handler).With( debuglogger := slog.New(handler)
slog.Group("program_info",
slog.Int("pid", os.Getpid()),
slog.String("go_version", buildInfo.GoVersion),
),
)
slog.SetDefault(debuglogger) slog.SetDefault(debuglogger)
} }
@@ -71,7 +64,7 @@ func main() {
ebiten.SetWindowSize(game.Conf.Width, game.Conf.Height) ebiten.SetWindowSize(game.Conf.Width, game.Conf.Height)
ebiten.SetWindowTitle("Kage shader viewer") ebiten.SetWindowTitle("Kage shader viewer")
ebiten.SetWindowResizable(true) ebiten.SetWindowResizingMode(ebiten.WindowResizingModeEnabled)
if err := ebiten.RunGame(game); err != nil { if err := ebiten.RunGame(game); err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -1,80 +0,0 @@
#!/bin/bash
# Copyright © 2024 Thomas von Dein
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# get list with: go tool dist list
DIST="darwin/amd64
freebsd/amd64
linux/amd64
netbsd/amd64
openbsd/amd64
windows/amd64
freebsd/arm64
linux/arm64
netbsd/arm64
openbsd/arm64
windows/arm64"
DIST="linux/amd64
windows/amd64
windows/arm64"
tool="$1"
version="$2"
if test -z "$version"; then
echo "Usage: $0 <tool name> <release version>"
exit 1
fi
rm -rf releases
mkdir -p releases
for D in $DIST; do
os=${D/\/*/}
arch=${D/*\//}
binfile="releases/${tool}-${os}-${arch}-${version}"
if test "$os" = "windows"; then
binfile="${binfile}.exe"
fi
tardir="${tool}-${os}-${arch}-${version}"
tarfile="releases/${tool}-${os}-${arch}-${version}.tar.gz"
set -x
#GOOS=${os} GOARCH=${arch} go build -tags osusergo,netgo -ldflags "-extldflags=-static" -o ${binfile}
GOOS=${os} GOARCH=${arch} go build -o ${binfile}
mkdir -p ${tardir}
cp ${binfile} README.md LICENSE ${tardir}/
echo 'tool = kage-viewer
PREFIX = /usr/local
UID = root
GID = 0
install:
install -d -o $(UID) -g $(GID) $(PREFIX)/bin
install -d -o $(UID) -g $(GID) $(PREFIX)/man/man1
install -o $(UID) -g $(GID) -m 555 $(tool) $(PREFIX)/sbin/
install -o $(UID) -g $(GID) -m 444 $(tool).1 $(PREFIX)/man/man1/' > ${tardir}/Makefile
tar cpzf ${tarfile} ${tardir}
sha256sum ${binfile} | cut -d' ' -f1 > ${binfile}.sha256
sha256sum ${tarfile} | cut -d' ' -f1 > ${tarfile}.sha256
rm -rf ${tardir}
set +x
done