mirror of
https://codeberg.org/scip/kageviewer.git
synced 2025-12-18 21:11:05 +01:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3c93fde441 | |||
|
|
3aee72e78d | ||
| a3c1a80e15 | |||
| 868ad2c32d | |||
| fb70f8284c | |||
| f5899ac72f | |||
| b384795e53 | |||
| b41d23a2fd | |||
| dacbb5567c | |||
| 6cb30560d0 | |||
| e42df9080f | |||
| 8cd2d74a8b | |||
| 490afb1d76 |
BIN
.github/assets/logo.png
vendored
Normal file
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
BIN
.github/assets/screenshot.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 253 KiB |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
releases
|
releases
|
||||||
|
kageviewer
|
||||||
|
|||||||
65
.goreleaser.yaml
Normal file
65
.goreleaser.yaml
Normal 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
31
.woodpecker/build.yaml
Normal 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]
|
||||||
19
Makefile
19
Makefile
@@ -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
|
||||||
@@ -40,6 +40,12 @@ install: buildlocal
|
|||||||
clean:
|
clean:
|
||||||
rm -rf $(tool) coverage.out testdata t/out
|
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-mouse Cursor -s example/ebiten.kage
|
||||||
|
|
||||||
test: clean
|
test: clean
|
||||||
mkdir -p t/out
|
mkdir -p t/out
|
||||||
go test ./... $(ARGS)
|
go test ./... $(ARGS)
|
||||||
@@ -66,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
18
Makefile.dist
Normal 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/
|
||||||
109
README.md
109
README.md
@@ -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
|
||||||
|
|
||||||
[](https://github.com/tlinden/kage-viewer/blob/master/LICENSE)
|

|
||||||
[](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).
|
[](https://codeberg.org/scip/kageviewer/raw/branch/main/LICENSE)
|
||||||
|
[](https://goreportcard.com/report/codeberg.org/scip/kageviewer)
|
||||||
|
[](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
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## 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,26 +45,33 @@ 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:
|
||||||
-c --config <toml file> Config file to use (optional)
|
-c --config <toml file> Config file to use (optional)
|
||||||
-i --image <png file> Image to load (multiple times allowed, up to 4)
|
-i --image <png file> Image to load (multiple times allowed, up to 4)
|
||||||
-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
|
||||||
-d --debug Show debugging output
|
-b --background <png file> Image to load as background
|
||||||
-v --version Show program version
|
-t --tps <ticks/s> At how many ticks per second to run
|
||||||
|
--map-flag <name> Map Flag uniform to <name>
|
||||||
|
--map-ticks <name> Map Ticks uniform to <name>
|
||||||
|
--map-time <name> Map Time uniform to <name>
|
||||||
|
--map-slider <name> Map Slider uniform to <name>
|
||||||
|
--map-mouse <name> Map Mouse uniform to <name>
|
||||||
|
-d --debug Show debugging output
|
||||||
|
-v --version Show program version
|
||||||
```
|
```
|
||||||
|
|
||||||
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
|
||||||
@@ -90,18 +88,29 @@ 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 int`: 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
|
||||||
|
uniforms, you can map the ones provided by **kageviewer** to custom
|
||||||
|
names using the `--map-*` options. For example:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
kageviewer -g 640x480 --map-ticks Time --map-mouse Cursor examples/shader/default.go
|
||||||
|
```
|
||||||
|
|
||||||
|
This executes the example shader in the ebitenging source repository.
|
||||||
|
|
||||||
# Config File
|
# Config File
|
||||||
|
|
||||||
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.
|
||||||
@@ -115,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
|
||||||
|
|
||||||
|
|||||||
95
config.go
95
config.go
@@ -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,31 +33,44 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
VERSION string = "0.0.1"
|
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:
|
||||||
-c --config <toml file> Config file to use (optional)
|
-c --config <toml file> Config file to use (optional)
|
||||||
-i --image <png file> Image to load (multiple times allowed, up to 4)
|
-i --image <png file> Image to load (multiple times allowed, up to 4)
|
||||||
-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
|
||||||
-d --debug Show debugging output
|
-b --background <png file> Image to load as background
|
||||||
-v --version Show program version
|
-t --tps <ticks/s> At how many ticks per second to run
|
||||||
`
|
--map-flag <name> Map Flag uniform to <name>
|
||||||
|
--map-ticks <name> Map Ticks uniform to <name>
|
||||||
|
--map-time <name> Map Time uniform to <name>
|
||||||
|
--map-slider <name> Map Slider uniform to <name>
|
||||||
|
--map-mouse <name> Map Mouse uniform to <name>
|
||||||
|
-d --debug Show debugging output
|
||||||
|
-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"`
|
||||||
|
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
|
X, Y, Width, Height int // feed from -g + -p
|
||||||
}
|
}
|
||||||
@@ -64,18 +78,10 @@ type Config struct {
|
|||||||
func InitConfig() (*Config, error) {
|
func InitConfig() (*Config, error) {
|
||||||
var kloader = koanf.New(".")
|
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
|
// 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,6 +93,13 @@ func InitConfig() (*Config, error) {
|
|||||||
flagset.StringP("position", "p", "0x0", "position of shader")
|
flagset.StringP("position", "p", "0x0", "position of shader")
|
||||||
flagset.StringArrayP("image", "i", nil, "image file")
|
flagset.StringArrayP("image", "i", nil, "image file")
|
||||||
flagset.StringP("shader", "s", "", "shader 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-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")
|
||||||
|
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)
|
||||||
@@ -103,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",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,8 +153,8 @@ func InitConfig() (*Config, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func SanitiyCheck(conf *Config) error {
|
func SanitiyCheck(conf *Config) error {
|
||||||
if len(conf.Image) < 1 {
|
if len(conf.Image) > 4 {
|
||||||
return fmt.Errorf("at least 1 image must be specified")
|
return fmt.Errorf("only 4 images can be specified")
|
||||||
}
|
}
|
||||||
|
|
||||||
if conf.Shader == "" {
|
if conf.Shader == "" {
|
||||||
@@ -152,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
|
||||||
@@ -168,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
|
||||||
@@ -182,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()
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package main
|
|||||||
|
|
||||||
var Flag int
|
var Flag int
|
||||||
var Slider float
|
var Slider float
|
||||||
var Time int
|
var Time float
|
||||||
var Mouse vec2
|
var Mouse vec2
|
||||||
|
|
||||||
func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 {
|
func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 {
|
||||||
33
example/ebiten.kage
Normal file
33
example/ebiten.kage
Normal 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)
|
||||||
|
}
|
||||||
118
game.go
118
game.go
@@ -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,34 +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) {
|
||||||
|
if game.Background != nil {
|
||||||
|
op := &ebiten.DrawImageOptions{}
|
||||||
|
screen.DrawImage(game.Background.Value(), op)
|
||||||
|
}
|
||||||
|
|
||||||
op := &ebiten.DrawRectShaderOptions{}
|
op := &ebiten.DrawRectShaderOptions{}
|
||||||
|
|
||||||
mousex, mousey := ebiten.CursorPosition()
|
|
||||||
|
|
||||||
op.Uniforms = map[string]any{
|
op.Uniforms = map[string]any{
|
||||||
"Flag": game.Flag,
|
game.Conf.Flag: game.Flag,
|
||||||
"Slider": game.Slider,
|
game.Conf.Slider: game.Slider,
|
||||||
"Ticks": game.Ticks,
|
game.Conf.Time: game.Ticks / float64(ebiten.TPS()),
|
||||||
"Mouse": []float64{float64(mousex), float64(mousey)},
|
game.Conf.Mouse: game.Cursor,
|
||||||
|
game.Conf.Ticks: game.Ticks,
|
||||||
}
|
}
|
||||||
|
|
||||||
for idx, image := range game.Images {
|
for idx, image := range game.Images {
|
||||||
op.Images[idx] = image
|
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
5
go.mod
@@ -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
4
go.sum
@@ -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=
|
||||||
|
|||||||
BIN
kage-viewer
BIN
kage-viewer
Binary file not shown.
13
main.go
13
main.go
@@ -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)
|
||||||
|
|||||||
80
mkrel.sh
80
mkrel.sh
@@ -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
|
|
||||||
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
f73335dc3e4e65b089624e9580b02d38926597c59127ca507be03148ab229b4f
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
d7726c68b43c550c27a42f7586a418915d042ed9a444f651cb5159e37bdea4ab
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
91b57cfbaa1ec63b797fbb4c4b3892c2e462ec7668207a3c645917af9c7ac3d1
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
197bfab6dda912f8ed8f8d1b7afb1946d1c7640ab84ccb4a48c8d5d7c62fe8ea
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
c69df9ea174b69fb17e5f1e359106bce6105f6185e09531912e04398a4b72eff
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
5c61f307b7b576f10d4a5ae276dbb8070053efd060bbfda93f8535658478b2cf
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
df707023f0bd50fe1ff55e466f212c5668d6c488644b25d5880e64ca21c4f073
|
|
||||||
Reference in New Issue
Block a user