6
.cargo/config.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
# clipboard api is still unstable, so web-sys requires the below flag to be passed for copy (ctrl + c) to work
|
||||
# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html
|
||||
# check status at https://developer.mozilla.org/en-US/docs/Web/API/Clipboard#browser_compatibility
|
||||
# we don't use `[build]` because of rust analyzer's build cache invalidation https://github.com/emilk/eframe_template/issues/93
|
||||
[target.wasm32-unknown-unknown]
|
||||
rustflags = ["--cfg=web_sys_unstable_apis"]
|
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
assets/ filter=lfs diff=lfs merge=lfs -text
|
45
.github/workflows/pages.yml
vendored
Normal file
|
@ -0,0 +1,45 @@
|
|||
name: Github Pages
|
||||
|
||||
# By default, runs if you push to master. keeps your deployed app in sync with master branch.
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
# to only run when you do a new github release, comment out above part and uncomment the below trigger.
|
||||
# on:
|
||||
# release:
|
||||
# types:
|
||||
# - published
|
||||
|
||||
permissions:
|
||||
contents: write # for committing to gh-pages branch.
|
||||
|
||||
jobs:
|
||||
build-github-pages:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2 # repo checkout
|
||||
- uses: actions-rs/toolchain@v1 # get rust toolchain for wasm
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: stable
|
||||
target: wasm32-unknown-unknown
|
||||
override: true
|
||||
- name: Rust Cache # cache the rust build artefacts
|
||||
uses: Swatinem/rust-cache@v1
|
||||
- name: Download and install Trunk binary
|
||||
run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf-
|
||||
- name: Build # build
|
||||
# "${GITHUB_REPOSITORY#*/}" evaluates into the name of the repository
|
||||
# using --public-url something will allow trunk to modify all the href paths like from favicon.ico to repo_name/favicon.ico .
|
||||
# this is necessary for github pages where the site is deployed to username.github.io/repo_name and all files must be requested
|
||||
# relatively as eframe_template/favicon.ico. if we skip public-url option, the href paths will instead request username.github.io/favicon.ico which
|
||||
# will obviously return error 404 not found.
|
||||
run: ./trunk build --release --public-url "${GITHUB_REPOSITORY#*/}"
|
||||
- name: Deploy
|
||||
uses: JamesIves/github-pages-deploy-action@v4
|
||||
with:
|
||||
folder: dist
|
||||
# this option will not maintain any history of your previous pages deployment
|
||||
# set to false if you want all page build to be committed to your gh-pages branch history
|
||||
single-commit: true
|
105
.github/workflows/rust.yml
vendored
Normal file
|
@ -0,0 +1,105 @@
|
|||
on: [push, pull_request]
|
||||
|
||||
name: CI
|
||||
|
||||
env:
|
||||
# This is required to enable the web_sys clipboard API which egui_web uses
|
||||
# https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html
|
||||
# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html
|
||||
RUSTFLAGS: --cfg=web_sys_unstable_apis
|
||||
|
||||
jobs:
|
||||
check:
|
||||
name: Check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: stable
|
||||
override: true
|
||||
- uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: check
|
||||
args: --all-features
|
||||
|
||||
check_wasm:
|
||||
name: Check wasm32
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: stable
|
||||
target: wasm32-unknown-unknown
|
||||
override: true
|
||||
- uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: check
|
||||
args: --all-features --lib --target wasm32-unknown-unknown
|
||||
|
||||
test:
|
||||
name: Test Suite
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: stable
|
||||
override: true
|
||||
- run: sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev
|
||||
- uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: test
|
||||
args: --lib
|
||||
|
||||
fmt:
|
||||
name: Rustfmt
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: stable
|
||||
override: true
|
||||
components: rustfmt
|
||||
- uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: fmt
|
||||
args: --all -- --check
|
||||
|
||||
clippy:
|
||||
name: Clippy
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: stable
|
||||
override: true
|
||||
components: clippy
|
||||
- uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: clippy
|
||||
args: -- -D warnings
|
||||
|
||||
trunk:
|
||||
name: trunk
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: 1.72.0
|
||||
target: wasm32-unknown-unknown
|
||||
override: true
|
||||
- name: Download and install Trunk binary
|
||||
run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf-
|
||||
- name: Build
|
||||
run: ./trunk build
|
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/target
|
||||
/dist
|
17
.woodpecker.yml
Normal file
|
@ -0,0 +1,17 @@
|
|||
steps:
|
||||
- name: build
|
||||
image: rust
|
||||
commands:
|
||||
- wget https://github.com/mozilla/sccache/releases/download/v0.7.7/sccache-v0.7.7-x86_64-unknown-linux-musl.tar.gz
|
||||
- tar xzf sccache-v0.7.7-x86_64-unknown-linux-musl.tar.gz
|
||||
- mv sccache-v0.7.7-x86_64-unknown-linux-musl/sccache /usr/bin/sccache
|
||||
- chmod +x /usr/bin/sccache
|
||||
- sccache --start-server
|
||||
- sccache --show-stats
|
||||
- curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
|
||||
- cargo binstall trunk
|
||||
- trunk build --release -- --target-dir /var/woodpecker/portfolio-build
|
||||
- rm -rf /var/woodpecker/portfolio
|
||||
- mv dist /var/woodpecker/portfolio
|
||||
volumes:
|
||||
- /var/woodpecker:/var/woodpecker
|
4225
Cargo.lock
generated
Normal file
61
Cargo.toml
Normal file
|
@ -0,0 +1,61 @@
|
|||
[package]
|
||||
name = "portfolio"
|
||||
version = "0.1.0"
|
||||
authors = ["Isaac Mills <rooster0055@protonmail.com>"]
|
||||
edition = "2021"
|
||||
rust-version = "1.72"
|
||||
|
||||
|
||||
[dependencies]
|
||||
cosmic-jotdown = { version = "0.1.0", path = "../cosmic-jotdown" }
|
||||
eframe = { version = "0.26.2", default-features = false, features = [
|
||||
"accesskit", # Make egui comptaible with screen readers. NOTE: adds a lot of dependencies.
|
||||
# "default_fonts",
|
||||
"wgpu", # Use the glow rendering backend. Alternative: "wgpu".
|
||||
"x11",
|
||||
"wayland",
|
||||
] }
|
||||
egui-glyphon = { version = "0.1.0", path = "../egui-glyphon" }
|
||||
egui_extras = { version = "0.26.2", features = ["image", "http", "file"] }
|
||||
encase = { version = "0.7.0", features = ["glam"] }
|
||||
glam = "0.25.0"
|
||||
image = { version = "0.24.9", features = ["jpeg", "png"] }
|
||||
keyframe = { version = "1.1.1", default-features = false }
|
||||
log = "0.4"
|
||||
range-map = "0.2.0"
|
||||
|
||||
# native:
|
||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||
env_logger = "0.10"
|
||||
|
||||
# web:
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
wgpu = { version = "0.19.3", features = ["webgpu", "webgl"] }
|
||||
wasm-bindgen-futures = "0.4"
|
||||
|
||||
|
||||
[profile.release]
|
||||
opt-level = 2 # fast and small wasm
|
||||
lto = true
|
||||
panic = "abort"
|
||||
strip = true
|
||||
|
||||
# Optimize all dependencies even in debug builds:
|
||||
[profile.dev.package."*"]
|
||||
opt-level = 2
|
||||
|
||||
|
||||
[patch.crates-io]
|
||||
|
||||
[build-dependencies]
|
||||
databake = "0.1.7"
|
||||
glob = "0.3.1"
|
||||
jotdown = { version = "0.3.2", path = "../jotdown", features = ["parser"] }
|
||||
|
||||
# If you want to use the bleeding edge version of egui and eframe:
|
||||
# egui = { git = "https://github.com/emilk/egui", branch = "master" }
|
||||
# eframe = { git = "https://github.com/emilk/egui", branch = "master" }
|
||||
|
||||
# If you fork https://github.com/emilk/egui you can test with:
|
||||
# egui = { path = "../egui/crates/egui" }
|
||||
# eframe = { path = "../egui/crates/eframe" }
|
76
README.md
Normal file
|
@ -0,0 +1,76 @@
|
|||
# eframe template
|
||||
|
||||
[![dependency status](https://deps.rs/repo/github/emilk/eframe_template/status.svg)](https://deps.rs/repo/github/emilk/eframe_template)
|
||||
[![Build Status](https://github.com/emilk/eframe_template/workflows/CI/badge.svg)](https://github.com/emilk/eframe_template/actions?workflow=CI)
|
||||
|
||||
This is a template repo for [eframe](https://github.com/emilk/egui/tree/master/crates/eframe), a framework for writing apps using [egui](https://github.com/emilk/egui/).
|
||||
|
||||
The goal is for this to be the simplest way to get started writing a GUI app in Rust.
|
||||
|
||||
You can compile your app natively or for the web, and share it using Github Pages.
|
||||
|
||||
## Getting started
|
||||
|
||||
Start by clicking "Use this template" at https://github.com/emilk/eframe_template/ or follow [these instructions](https://docs.github.com/en/free-pro-team@latest/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template).
|
||||
|
||||
Change the name of the crate: Chose a good name for your project, and change the name to it in:
|
||||
* `Cargo.toml`
|
||||
* Change the `package.name` from `eframe_template` to `your_crate`.
|
||||
* Change the `package.authors`
|
||||
* `main.rs`
|
||||
* Change `eframe_template::TemplateApp` to `your_crate::TemplateApp`
|
||||
* `index.html`
|
||||
* Change the `<title>eframe template</title>` to `<title>your_crate</title>`. optional.
|
||||
* `assets/sw.js`
|
||||
* Change the `'./eframe_template.js'` to `./your_crate.js` (in `filesToCache` array)
|
||||
* Change the `'./eframe_template_bg.wasm'` to `./your_crate_bg.wasm` (in `filesToCache` array)
|
||||
|
||||
### Learning about egui
|
||||
|
||||
`src/app.rs` contains a simple example app. This is just to give some inspiration - most of it can be removed if you like.
|
||||
|
||||
The official egui docs are at <https://docs.rs/egui>. If you prefer watching a video introduction, check out <https://www.youtube.com/watch?v=NtUkr_z7l84>. For inspiration, check out the [the egui web demo](https://emilk.github.io/egui/index.html) and follow the links in it to its source code.
|
||||
|
||||
### Testing locally
|
||||
|
||||
Make sure you are using the latest version of stable rust by running `rustup update`.
|
||||
|
||||
`cargo run --release`
|
||||
|
||||
On Linux you need to first run:
|
||||
|
||||
`sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev`
|
||||
|
||||
On Fedora Rawhide you need to run:
|
||||
|
||||
`dnf install clang clang-devel clang-tools-extra libxkbcommon-devel pkg-config openssl-devel libxcb-devel gtk3-devel atk fontconfig-devel`
|
||||
|
||||
### Web Locally
|
||||
|
||||
You can compile your app to [WASM](https://en.wikipedia.org/wiki/WebAssembly) and publish it as a web page.
|
||||
|
||||
We use [Trunk](https://trunkrs.dev/) to build for web target.
|
||||
1. Install the required target with `rustup target add wasm32-unknown-unknown`.
|
||||
2. Install Trunk with `cargo install --locked trunk`.
|
||||
3. Run `trunk serve` to build and serve on `http://127.0.0.1:8080`. Trunk will rebuild automatically if you edit the project.
|
||||
4. Open `http://127.0.0.1:8080/index.html#dev` in a browser. See the warning below.
|
||||
|
||||
> `assets/sw.js` script will try to cache our app, and loads the cached version when it cannot connect to server allowing your app to work offline (like PWA).
|
||||
> appending `#dev` to `index.html` will skip this caching, allowing us to load the latest builds during development.
|
||||
|
||||
### Web Deploy
|
||||
1. Just run `trunk build --release`.
|
||||
2. It will generate a `dist` directory as a "static html" website
|
||||
3. Upload the `dist` directory to any of the numerous free hosting websites including [GitHub Pages](https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site).
|
||||
4. we already provide a workflow that auto-deploys our app to GitHub pages if you enable it.
|
||||
> To enable Github Pages, you need to go to Repository -> Settings -> Pages -> Source -> set to `gh-pages` branch and `/` (root).
|
||||
>
|
||||
> If `gh-pages` is not available in `Source`, just create and push a branch called `gh-pages` and it should be available.
|
||||
|
||||
You can test the template app at <https://emilk.github.io/eframe_template/>.
|
||||
|
||||
## Updating egui
|
||||
|
||||
As of 2023, egui is in active development with frequent releases with breaking changes. [eframe_template](https://github.com/emilk/eframe_template/) will be updated in lock-step to always use the latest version of egui.
|
||||
|
||||
When updating `egui` and `eframe` it is recommended you do so one version at the time, and read about the changes in [the egui changelog](https://github.com/emilk/egui/blob/master/CHANGELOG.md) and [eframe changelog](https://github.com/emilk/egui/blob/master/crates/eframe/CHANGELOG.md).
|
1
Trunk.toml
Normal file
|
@ -0,0 +1 @@
|
|||
[build]
|
BIN
assets/favicon.ico
Executable file
After Width: | Height: | Size: 15 KiB |
BIN
assets/icon-1024.png
Normal file
After Width: | Height: | Size: 314 KiB |
BIN
assets/icon-256.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
assets/icon_ios_touch_192.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
assets/images/artix.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
BIN
assets/images/bitogo.jpg
Normal file
After Width: | Height: | Size: 8 KiB |
BIN
assets/images/block_scrappapercircus.jpg
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
assets/images/chicanery.jpg
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
assets/images/classic_scrappapercircus.jpg
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
assets/images/coptic_scrappapercircus.jpg
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
assets/images/doggo.jpg
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
assets/images/dotfiles.jpg
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
assets/images/gimp.png
Normal file
After Width: | Height: | Size: 5 KiB |
BIN
assets/images/hiking.jpg
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
assets/images/inkscape.png
Normal file
After Width: | Height: | Size: 6 KiB |
BIN
assets/images/java.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
assets/images/kdenlive.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
assets/images/linux.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
assets/images/me.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
assets/images/mta.jpg
Normal file
After Width: | Height: | Size: 104 KiB |
BIN
assets/images/narrative1.jpg
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
assets/images/narrative2.jpg
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
assets/images/narrative3.jpg
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
assets/images/narrative4.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
assets/images/narrative5.jpg
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
assets/images/neumont.jpg
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
assets/images/nice_beat.jpg
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
assets/images/pac1.jpg
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
assets/images/postgresql.png
Normal file
After Width: | Height: | Size: 5 KiB |
BIN
assets/images/pufferfish.jpg
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
assets/images/python.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
assets/images/reaper.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
assets/images/rovio.jpg
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
assets/images/rust.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
assets/images/saul_goodman.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
assets/images/scratch.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
BIN
assets/images/scratch_medal.jpg
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
assets/images/scratch_winner1.jpg
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
assets/images/scratch_winner2.jpg
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
assets/images/sewer_surfin.jpg
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
assets/images/sonic_remix.jpg
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
assets/images/tree_sitter.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
assets/maskable_icon_x512.png
Normal file
After Width: | Height: | Size: 128 KiB |
23
build.rs
Normal file
|
@ -0,0 +1,23 @@
|
|||
use std::{borrow::Cow, path::Path};
|
||||
|
||||
use databake::Bake;
|
||||
use jotdown::Event;
|
||||
|
||||
fn main() {
|
||||
let out = std::env::var("OUT_DIR").unwrap();
|
||||
|
||||
let jots = glob::glob("src/*.jot").unwrap();
|
||||
|
||||
for path in jots.map(|p| p.unwrap()) {
|
||||
let file = std::fs::read_to_string(&path).unwrap();
|
||||
let name = path.file_name().unwrap();
|
||||
|
||||
let jot: Cow<'_, [Event<'_>]> = Cow::Owned(jotdown::Parser::new(&file).collect::<Vec<_>>());
|
||||
|
||||
std::fs::write(
|
||||
Path::new(&out).join(name),
|
||||
jot.bake(&Default::default()).to_string(),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
28
certs/192.168.1.44-key.pem
Normal file
|
@ -0,0 +1,28 @@
|
|||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDStvYGRPeqk766
|
||||
ySSzJ1SvQOi4I689ukgKT/TxbX4rdCBSmeERXoIt4qb8eHFz4BHPtrkDta/mTFJ2
|
||||
R2knMaSHHcSwh/eJKN6lcTCN+qpnKLm3i2yKFKcXcHiqJg2tCbGj00kIkGPB4iBV
|
||||
lpMF107xuukCRJAInqau6evseOITT4aXlTx/A7YJP3z3Y1qPfvAgN4ej4TDo6DtG
|
||||
DSEJpsyjtC5thcCnF4vkAoIhpIbH1iNryxj1Hc75lfxdeQztUeJLjGQixLfOWjY1
|
||||
EuSHjhbB3eFXQ447AOdnohohMEuurbBNfX7FvoYsLMuG4dhHPLV8HXhk/YsnrH18
|
||||
ai4qBzbZAgMBAAECggEAK5+1T5b3r1jnI8SA1JZP8fh+NaEtppnqUDg9fb4tYNGp
|
||||
32/8KJxoVxeVeq90zYiWJ2qs4xe6UvN6HwKpwnOEnHSNQ/7iQIM1lQraAorivHix
|
||||
+k3jKrMb5L5kPNWj/y8Cl+gmNp+uB3XJO+7wgUUSEvmfQ9jt+Nrfp1bGgS6Fn3l3
|
||||
DP8tq0/bRuDxfkhLOuZzXAGqXATjEDR5jfJmqoPucLjdVe9C8hXOPu2+xBiJY244
|
||||
df90qjkDNiGLFBL7WsctNTy0tJaRmF+qHfXhvj2eY6fvYlXA3m2rbH5wmTaBRD7G
|
||||
l6g3GCRJF7mhP2ownbcA8yzMv9DYgiH7EiclrncQAQKBgQD2heLaAT5rtgYIVkgX
|
||||
OczqOwqg8Vf9z+PzA3bQ9UZybyojY/uVsy3Y1f04gQq5sdygnHE2Qr2pYpBs7gqt
|
||||
yN9aNTY8NpZulRUvpRnVQqPWVIlI0xBcaDqSK7BIwnU50pLze56/u+BrJSHARFWL
|
||||
SvrLAr9D2Mx57ET3RTSc72/FHQKBgQDa0KxymGIlq3JaroG5nTX6+x5KXR2+xnWb
|
||||
iQDKtC0qHg/Qy7eVy5jJm2EazNchsLLybbE7RNWhE+nDjkKb3SeDUyFwpyNNKw6j
|
||||
lp1KqcHcx8b0GKGf7uC2jUSW9iTVlNu9mqW2lDgLZ5h1p8QmMdl8/8AEnIn3g/YR
|
||||
TrbtzV637QKBgB6dlAW0/9aKnYcth/hycjNor7I7Js1boxiMBpZ+z4forFgG07jM
|
||||
rtXuBWueAwH6x8aehyTQ9xLxLbSJf4QDnVFrqFekA9yp4R6wp1un0gcNKpuDstV3
|
||||
EEcU6+itVbefoiZg5N806vMDgoSJOAJ7hlft+GjppMNDh3EaBCW1SrE1AoGAboSJ
|
||||
JRQcNmSCzJRpRyPFWO+u2+ZuGKZKTnWDJd6dFTG70TyjjBAaKnHFOPEPE6AYseN/
|
||||
aa0ZrVLOdgwLTogD5gt9z1VLujUuHqf65/QXy3hH34/1Sj8v1mRBqXHHJu0Zk4lh
|
||||
e3cfW3tGgN5sbtIsxDq0dF/QO2i2RwWX1UIuPf0CgYAbh59OslAq2Y4+8B/Ss45p
|
||||
3H7fBeRAlN65X+YjkwdZi0zy5Hlczp38hurTjYlvc/vSXSUDeeAVWxQIUnFT/qQu
|
||||
UyDvwzVWnx1V3EV53NsYzMP0rYV/2EYVkcJCn5RtSyDcYOFiDaxtY1liTpCjvzJz
|
||||
m5blo7Angaths0lBj/sLAQ==
|
||||
-----END PRIVATE KEY-----
|
24
certs/192.168.1.44.pem
Normal file
|
@ -0,0 +1,24 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIECDCCAnCgAwIBAgIRAK1O4JEC2N5FRJYJwsqP7nYwDQYJKoZIhvcNAQELBQAw
|
||||
XzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMRowGAYDVQQLDBFpc2Fh
|
||||
Y21AQUNFUkxhcHRvcDEhMB8GA1UEAwwYbWtjZXJ0IGlzYWFjbUBBQ0VSTGFwdG9w
|
||||
MB4XDTI0MDMxNzIzMjkzMVoXDTI2MDYxNzIzMjkzMVowRTEnMCUGA1UEChMebWtj
|
||||
ZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMRowGAYDVQQLDBFpc2FhY21AQUNF
|
||||
UkxhcHRvcDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANK29gZE96qT
|
||||
vrrJJLMnVK9A6Lgjrz26SApP9PFtfit0IFKZ4RFegi3ipvx4cXPgEc+2uQO1r+ZM
|
||||
UnZHaScxpIcdxLCH94ko3qVxMI36qmcoubeLbIoUpxdweKomDa0JsaPTSQiQY8Hi
|
||||
IFWWkwXXTvG66QJEkAiepq7p6+x44hNPhpeVPH8Dtgk/fPdjWo9+8CA3h6PhMOjo
|
||||
O0YNIQmmzKO0Lm2FwKcXi+QCgiGkhsfWI2vLGPUdzvmV/F15DO1R4kuMZCLEt85a
|
||||
NjUS5IeOFsHd4VdDjjsA52eiGiEwS66tsE19fsW+hiwsy4bh2Ec8tXwdeGT9iyes
|
||||
fXxqLioHNtkCAwEAAaNZMFcwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsG
|
||||
AQUFBwMBMB8GA1UdIwQYMBaAFHvuXKJyKje/MuhO/0EpQEactUBbMA8GA1UdEQQI
|
||||
MAaHBMCoASwwDQYJKoZIhvcNAQELBQADggGBAGrQiTUghaQwb5XenFdt7/pfK4Xp
|
||||
vSt0g+dP/9EKkrjM4FB0qeOnjM6bcMs37NhoJwmpn+d52Y1gbjMXBgg6ZCm4ZuR4
|
||||
pPQgmmiiv0/DSNwjjVpNJy+qy8iW2xujY+Mca6f8ww6XHx4mqALe113hKUMcKgk0
|
||||
WwraLNk+RSZQYDUxad497V3DNXEsn9Zj3k/4hKXHNf2u2MKPqSiP4XAoEC01DtYl
|
||||
LwLwx/2pyw3QBoZdskxYbCu0gEW1elTZTEmCrCo1Va8tcUOqrpdFlXQpyfIDDClI
|
||||
IFlArcGG6Ya7ZAoe6TJQdSh/fh4zsf4ryxDWHOroy+UG4Nh6lQ3fezH+TkLvL4nD
|
||||
nf1Zm+zLnwKiKfW7Y30OZhA/B7cxSFYd0pcnjNDzoi6/x4ONL9wjadxa7qTaJgxW
|
||||
hzJZli+Efh1hFPJJDCOU/eSJ0+aVRkblca8ns9GvSD1LChpccxZTUkonVeIHaAf+
|
||||
551o9FPhtSswLHWlNgL8XAhBK4vOHa/7zz8xgQ==
|
||||
-----END CERTIFICATE-----
|
11
check.sh
Executable file
|
@ -0,0 +1,11 @@
|
|||
#!/usr/bin/env bash
|
||||
# This scripts runs various CI-like checks in a convenient way.
|
||||
set -eux
|
||||
|
||||
cargo check --quiet --workspace --all-targets
|
||||
cargo check --quiet --workspace --all-features --lib --target wasm32-unknown-unknown
|
||||
cargo fmt --all -- --check
|
||||
cargo clippy --quiet --workspace --all-targets --all-features -- -D warnings -W clippy::all
|
||||
cargo test --quiet --workspace --all-targets --all-features
|
||||
cargo test --quiet --workspace --doc
|
||||
trunk build
|
2
config.toml
Normal file
|
@ -0,0 +1,2 @@
|
|||
[target.wasm32-unknown-unknown]
|
||||
rustflags = ["-C", "target-feature=+simd128"]
|
129
index.html
Normal file
|
@ -0,0 +1,129 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<!-- Disable zooming: -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||
|
||||
<head>
|
||||
<!-- change this to your project name -->
|
||||
<title>Isaac Mills's Portfolio</title>
|
||||
|
||||
<!-- config for our rust wasm binary. go to https://trunkrs.dev/assets/#rust for more customization -->
|
||||
<link data-trunk rel="rust" data-wasm-opt="0" />
|
||||
<!-- this is the base url relative to which other urls will be constructed. trunk will insert this from the public-url option -->
|
||||
<base data-trunk-public-url />
|
||||
|
||||
<link data-trunk rel="icon" href="assets/favicon.ico">
|
||||
|
||||
|
||||
<link data-trunk rel="copy-file" href="assets/icon-1024.png" />
|
||||
<link data-trunk rel="copy-file" href="assets/icon-256.png" />
|
||||
<link data-trunk rel="copy-file" href="assets/icon_ios_touch_192.png" />
|
||||
<link data-trunk rel="copy-file" href="assets/maskable_icon_x512.png" />
|
||||
<link data-trunk rel="copy-dir" href="assets/images" />
|
||||
|
||||
|
||||
<link rel="apple-touch-icon" href="icon_ios_touch_192.png">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="white">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#404040">
|
||||
|
||||
<style>
|
||||
html {
|
||||
/* Remove touch delay: */
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
body {
|
||||
/* Light mode background color for what is not covered by the egui canvas,
|
||||
or where the egui canvas is translucent. */
|
||||
background: #909090;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
/* Dark mode background color for what is not covered by the egui canvas,
|
||||
or where the egui canvas is translucent. */
|
||||
background: #404040;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allow canvas to fill entire web page: */
|
||||
html,
|
||||
body {
|
||||
overflow: hidden;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* Position canvas in center-top: */
|
||||
canvas {
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0%);
|
||||
}
|
||||
|
||||
.centered {
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
color: #f0f0f0;
|
||||
font-size: 24px;
|
||||
font-family: Ubuntu-Light, Helvetica, sans-serif;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------- */
|
||||
/* Loading animation from https://loading.io/css/ */
|
||||
.lds-dual-ring {
|
||||
display: inline-block;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.lds-dual-ring:after {
|
||||
content: " ";
|
||||
display: block;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin: 0px;
|
||||
border-radius: 50%;
|
||||
border: 3px solid #fff;
|
||||
border-color: #fff transparent #fff transparent;
|
||||
animation: lds-dual-ring 1.2s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes lds-dual-ring {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- The WASM code will resize the canvas dynamically -->
|
||||
<!-- the id is hardcoded in main.rs . so, make sure both match. -->
|
||||
<canvas id="the_canvas_id"></canvas>
|
||||
|
||||
<!--Register Service Worker. this will cache the wasm / js scripts for offline use (for PWA functionality). -->
|
||||
<!-- Force refresh (Ctrl + F5) to load the latest files instead of cached files -->
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
<!-- Powered by egui: https://github.com/emilk/egui/ -->
|
11
opt.sh
Normal file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/sh
|
||||
wasm=dist/portfolio-*_bg.wasm
|
||||
js=dist/portfolio-*.js
|
||||
wasm-opt -O2 --fast-math $wasm -o $wasm
|
||||
find dist/ \
|
||||
-name "*.js" -o \
|
||||
-name "*.pdf" -o \
|
||||
-name "*.ico" -o \
|
||||
-name "*.wasm" -o \
|
||||
-name "*.html" -o \
|
||||
-name "*.json" | parallel brotli -f
|
9
rust-toolchain
Normal file
|
@ -0,0 +1,9 @@
|
|||
# If you see this, run "rustup self update" to get rustup 1.23 or newer.
|
||||
|
||||
# NOTE: above comment is for older `rustup` (before TOML support was added),
|
||||
# which will treat the first line as the toolchain name, and therefore show it
|
||||
# to the user in the error, instead of "error: invalid channel name '[toolchain]'".
|
||||
|
||||
[toolchain]
|
||||
components = [ "rustfmt", "clippy" ]
|
||||
targets = [ "wasm32-unknown-unknown" ]
|
16
src/about_me.jot
Normal file
|
@ -0,0 +1,16 @@
|
|||
# About me
|
||||
|
||||
*Hi!* My name is Isaac Mills. I'm a software engineer and computer scientist who loves harnessing the power of technology to solve problems!
|
||||
|
||||
![Myself](images/me.jpg#256x192)
|
||||
![Me and my dogoo](images/doggo.jpg#192x256)
|
||||
![My family and I on a hike](images/hiking.jpg#256x192)
|
||||
![Me in a Neumont CS T-Shirt](images/neumont.jpg#192x256)
|
||||
|
||||
- I love learning about computers. Everything from how they work, to new languages, to new ways to use them (I even learned a bit of WGSL and WGPU to make the shader in the background\*)
|
||||
- I love looking for problems to solve, and working with people to solve them
|
||||
- As a Boy Scout at heart, I love camping, hiking, backpacking, and just the outdoors generally
|
||||
- I'm a loyal friend who will be there for you through thick and thin
|
||||
- I know how to both write code for computers, as well as whip them into shape when they start having problems. I am the IT guy in my family
|
||||
|
||||
\*Special thanks to _meico_ from Shadertoy for the GLSL version of your Spectrum Ring shader
|
1026
src/app.rs
Normal file
3
src/font.wgsl
Normal file
|
@ -0,0 +1,3 @@
|
|||
@fragment
|
||||
fn fs_main(@location(1) : vec4<f32>) -> @location(0) vec4<f32> {
|
||||
}
|
7
src/gimp.jot
Normal file
|
@ -0,0 +1,7 @@
|
|||
# GIMP Experience
|
||||
|
||||
GIMP is a lot like Photoshop, but open source and free. Much like Photoshop, I don't think anyone can say they're _"100% fluent"_ in it, but I can say that I _am_ pretty experienced in it.
|
||||
|
||||
- This is a funny image I manipulated of a Pillsburry cookie jar that I thought looked like a pufferfish
|
||||
|
||||
![Pufferfish Doughboy](images/pufferfish.jpg#256x320)
|
24
src/inkscape.jot
Normal file
|
@ -0,0 +1,24 @@
|
|||
# Inkscape Experience
|
||||
|
||||
For those who don't know, *Inkscape* is very similar to Adobe Illustrator, but open source and free. I am fluent, and have made numerous things in this program
|
||||
|
||||
- This project was for my Senior US Government class. It's a mock political advertisement for the fictional Political Action Comittee _Care_.
|
||||
|
||||
![Political Ad Campaign](images/pac1.jpg#256x362)
|
||||
|
||||
- This project was for my Senior Web Development class, and the assignment was to make a logo for a fictional company using what knowledge of Adobe Illustrator (Inkscape) we had
|
||||
|
||||
![Bitogo Corp logo and sologan](images/bitogo.jpg#256x362)
|
||||
|
||||
- This project was also for my Senior US Government class. It's a flag representing the mock country where the Angry Birds franchise takes place
|
||||
|
||||
![A mock flag for Bird Island](images/rovio.jpg#256x181)
|
||||
|
||||
- This project was for my mother, who is an educator who teaches people how to make books from upcycled materials you can find in your own home. These are a few of the colorways for an Instagram ad campaign I helped her make.
|
||||
|
||||
![Classic colorway](images/classic_scrappapercircus.jpg#256x256)
|
||||
![Block colorway](images/block_scrappapercircus.jpg#256x256)
|
||||
![Coptic colorway](images/coptic_scrappapercircus.jpg#256x256)
|
||||
|
||||
|
||||
|
25
src/java.jot
Normal file
|
@ -0,0 +1,25 @@
|
|||
# Java Experience
|
||||
|
||||
I've taken *AP Computer Science A*, as well as my school's post-AP course: *CS Data Structures*. Both courses are in Java.
|
||||
|
||||
- This is a painting of Saul Goodman using the [code.org](https://code.org) Neighborhood Painter. It's done using only it's named colors, and was made by generating Java code from an image file. [You can run it here](https://studio.code.org/projects/javalab/fsGVkmFdUWUeePTV6rYXnb21BD3bAjq6oVTMtKd13lE).
|
||||
|
||||
![Saul Goodman](images/saul_goodman.jpg#256x256)
|
||||
|
||||
- This is an auditory project done with [code.org](https://code.org)'s Java Theater. By using Rust code to parse MIDI files and generate an intermediate format which is parsed by Java, this project contains a library of 27 tracks from various video games which are played using the Theater's comically bad synthesizer. [You can run it here](https://studio.code.org/projects/javalab/SCaGR1_Et1sgc7sxNEvRSf-4RKplGVwIjd7O7WOeKmg)
|
||||
|
||||
![Theater playing Sewer Surfin](images/sewer_surfin.jpg#256x256)
|
||||
|
||||
- This was my most complicated [code.org](https://code.org) project. It's an entire 30 second short film about my personal narrative composed using only the synthesizer, and the shape drawing functions of the Theater. This was composed using a wide variety of tools
|
||||
|
||||
- The frames were composed in [Inkscape](#inkscape).
|
||||
- The MIDI file was based on the Bad Piggies theme song, and was edited using [MIDIEditor](http://www.midieditor.org/). Within the MIDI file, custom events were used to interleave the frames of the animation with the MIDI notes.
|
||||
- The MIDI file was put into a big converter which converted the MIDI, as well as all the SVG frames, into a lot of Java code, which in turn generated the movie using the code.org Theater.
|
||||
|
||||
[You can view the full movie here](https://studio.code.org/projects/javalab/kvhEgxPPEVMkjFFfNZz_n5L6ADRjLOSM2GMNJjGEcUc)
|
||||
|
||||
![Narrative frame 1](images/narrative1.jpg#256x256)
|
||||
![Narrative frame 2](images/narrative2.jpg#256x256)
|
||||
![Narrative frame 3](images/narrative3.jpg#256x256)
|
||||
![Narrative frame 4](images/narrative4.jpg#256x256)
|
||||
![Narrative frame 5](images/narrative5.jpg#256x256)
|
1
src/kdenlive.jot
Normal file
|
@ -0,0 +1 @@
|
|||
# Kdenlive Experience
|
4
src/lib.rs
Normal file
|
@ -0,0 +1,4 @@
|
|||
#![warn(clippy::all, rust_2018_idioms)]
|
||||
|
||||
mod app;
|
||||
pub use app::Portfolio;
|
27
src/linux.jot
Normal file
|
@ -0,0 +1,27 @@
|
|||
# GNU/Linux Experience
|
||||
|
||||
I've been daily driving Linux since the beginning of 2020, and have been hosting a home server running Linux since 2023.
|
||||
|
||||
- On my server at home, I am currently hosting
|
||||
|
||||
- [WireGuard](https://www.wireguard.com/)
|
||||
- [Nextcloud](https://nextcloud.com/)
|
||||
- [code-server](https://coder.com/docs/code-server/latest/install)
|
||||
- [Forgejo](https://forgejo.org/)
|
||||
- [Woodpecker CI](https://woodpecker-ci.org/)
|
||||
- [Vaultwarden](https://github.com/dani-garcia/vaultwarden)
|
||||
- [scrutiny](https://github.com/AnalogJ/scrutiny)
|
||||
|
||||
My daily driver right now, and the distro my server is running on, is the S6 variant of [Artix Linux](https://artixlinux.org/).
|
||||
|
||||
![Artix Linux](images/artix.png#128x128)
|
||||
|
||||
I've not only daily driven Linux, but I've also tailor made programs for it; using technologies such as Wayland, DBus, Wireplumber, and more.
|
||||
|
||||
- An image of my current Linux desktop. The status bar was written entirely by me in Rust ([dotfiles](https://github.com/StratusFearMe21/dotfiles))
|
||||
|
||||
![Dotfiles](images/dotfiles.jpg#512x288)
|
||||
|
||||
- Linux silliness (also uses my [dotfiles](https://github.com/StratusFearMe21/dotfiles))
|
||||
|
||||
![Chicanery](images/chicanery.jpg#512x288)
|
49
src/main.rs
Normal file
|
@ -0,0 +1,49 @@
|
|||
#![warn(clippy::all, rust_2018_idioms)]
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
|
||||
|
||||
use eframe::egui;
|
||||
|
||||
// When compiling natively:
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
fn main() -> eframe::Result<()> {
|
||||
env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`).
|
||||
|
||||
let native_options = eframe::NativeOptions {
|
||||
viewport: egui::ViewportBuilder::default()
|
||||
.with_inner_size([400.0, 300.0])
|
||||
.with_min_inner_size([300.0, 220.0])
|
||||
.with_icon(
|
||||
// NOTE: Adding an icon is optional
|
||||
eframe::icon_data::from_png_bytes(&include_bytes!("../assets/icon-256.png")[..])
|
||||
.unwrap(),
|
||||
),
|
||||
..Default::default()
|
||||
};
|
||||
eframe::run_native(
|
||||
"Isaac Mills's Portfolio",
|
||||
native_options,
|
||||
Box::new(|cc| Box::new(portfolio::Portfolio::new(cc))),
|
||||
)
|
||||
}
|
||||
|
||||
// When compiling to web using trunk:
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
fn main() {
|
||||
// Redirect `log` message to `console.log` and friends:
|
||||
eframe::WebLogger::init(log::LevelFilter::Debug).ok();
|
||||
|
||||
let web_options = eframe::WebOptions {
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
wasm_bindgen_futures::spawn_local(async {
|
||||
eframe::WebRunner::new()
|
||||
.start(
|
||||
"the_canvas_id", // hardcode it
|
||||
web_options,
|
||||
Box::new(|cc| Box::new(portfolio::Portfolio::new(cc))),
|
||||
)
|
||||
.await
|
||||
.expect("failed to start eframe");
|
||||
});
|
||||
}
|
3
src/postgresql.jot
Normal file
|
@ -0,0 +1,3 @@
|
|||
# PostgreSQL Experience
|
||||
|
||||
If data needs basing, my database of choice is PostgreSQL. I've made a couple Discord bots that use PostgreSQL, and every service on my server that uses a DB, I have it hooked up to PostgreSQL. See my [GNU/Linux Experience page](#linux)
|
3
src/python.jot
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Python Experience
|
||||
|
||||
![Microsoft Technology Associate certificate](images/mta.jpg#512x377)
|
13
src/reaper.jot
Normal file
|
@ -0,0 +1,13 @@
|
|||
# REAPER Experience
|
||||
|
||||
*REAPER* is a lot like Audacity, but paid and _waaaay_ better.
|
||||
|
||||
- This is a short piece of upbeat music I made in REAPER. [You can listen to it here](https://nations.lol/s/pbAN8y6rRw8T6nr)
|
||||
|
||||
![Nice Beat](images/nice_beat.jpg#512x288)
|
||||
|
||||
- In a Discord chat, a student from my college sent the chat [this piece of music he made](https://www.bandlab.com/track/fefa6cac-62a4-ee11-8926-000d3a428257?revId=fdfa6cac-62a4-ee11-8926-000d3a428257). Someone in chat said they thought it sounded like a Sonic theme, so I remixed his music with [For True Story by Circuit Freq RMX](https://www.youtube.com/watch?v=fgweT5OdLQY&pp=ygUgZm9yIHRydWUgc3Rvcnkgc29uaWMgZ2VuZXJhdGlvbnM%3D). A song from Sonic Generations. [You can listen to the remix here](https://cdn.discordapp.com/attachments/1110262902482542781/1193022053964582943/Get_down_wit_da_true_story_sonic_hedgehog.webm?ex=66077c5e&is=65f5075e&hm=e873c49de116e38e7f048615c6adafd8719913da7640107d15b4b537c4ca031e&)
|
||||
|
||||
![The Sonic remix](images/sonic_remix.jpg#512x288)
|
||||
|
||||
- I've also edited a podcast using REAPER. However, the podcast was for an assignment my friends were doing, and they would rather the recording not be floating around on the interwebs.
|
14
src/rust.jot
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Rust Experience
|
||||
|
||||
My language of choice is Rust. Everything I write on my own time, and everything I write if I can, I write it in Rust. Even this portfolio is written in Rust!
|
||||
|
||||
This portfolio uses these Rust crates:
|
||||
|
||||
- `jotdown`
|
||||
- `databake`
|
||||
- `eframe`
|
||||
- `glyphon`
|
||||
- `cosmic-text`
|
||||
- `keyframe`
|
||||
- `glam`
|
||||
- `wgpu`
|
10
src/scratch.jot
Normal file
|
@ -0,0 +1,10 @@
|
|||
# Scratch Experience
|
||||
|
||||
Every software developer worth their salt can say they're proficient in Scratch, but very few can say that they've made an award winning Scratch project. In 3rd grade, [my Scratch project](https://scratch.mit.edu/projects/144210368/) won 3rd place in the The Discovery's 2017 Scratch Code Challenge, hosted by the [Terry Lee Wells Discovery Museum](https://nvdm.org) in Reno, Nevada. To my memory, the competition was separated by grade level, and had ~1,000 international participants.
|
||||
|
||||
![Scratch Winner Image 1](images/scratch_winner1.jpg#256x192)
|
||||
![Scratch Winner Image 2](images/scratch_winner2.jpg#256x192)
|
||||
|
||||
- And yes, I do have the medal and the Windows 10 Pro license to prove it
|
||||
|
||||
![Medal](images/scratch_medal.jpg#231x512)
|
68
src/shader.wgsl
Normal file
|
@ -0,0 +1,68 @@
|
|||
struct Uniforms {
|
||||
iResolution: vec2<f32>,
|
||||
time: f32,
|
||||
iMouse: vec2<f32>,
|
||||
size: f32,
|
||||
offset: vec2<f32>,
|
||||
beamwidth: f32,
|
||||
paddingtwo: f32
|
||||
};
|
||||
|
||||
@group(0) @binding(0)
|
||||
var<uniform> uni: Uniforms;
|
||||
|
||||
@vertex
|
||||
fn vs_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4<f32> {
|
||||
var x = f32(i32((vertex_index << u32(1)) & u32(2)));
|
||||
var y = f32(i32(vertex_index & u32(2)));
|
||||
var uv = vec2<f32>(x, y);
|
||||
var out = 2.0 * uv - vec2<f32>(1.0, 1.0);
|
||||
return vec4<f32>(out.x, out.y, 0.0, 1.0);
|
||||
}
|
||||
|
||||
fn modulo(a: f32, b: f32) -> f32 {
|
||||
return ((a % b) + b) % b;
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_main(@builtin(position) fragCoord: vec4<f32>) -> @location(0) vec4<f32> {
|
||||
let iMouse = uni.iMouse + uni.offset;
|
||||
let frag_coord = fragCoord + uni.offset.xyxy;
|
||||
var p: vec2<f32>;
|
||||
var m: vec2<f32>;
|
||||
if (uni.iResolution.x < uni.iResolution.y) {
|
||||
m = (2. * iMouse - uni.iResolution) / uni.iResolution.x;
|
||||
p = (2. * frag_coord.xy - uni.iResolution) / uni.iResolution.x;
|
||||
} else {
|
||||
m = (2. * iMouse - uni.iResolution) / uni.iResolution.y;
|
||||
p = (2. * frag_coord.xy - uni.iResolution) / uni.iResolution.y;
|
||||
}
|
||||
let tau: f32 = 3.1415927 * 2.;
|
||||
let a: f32 = atan2(p.x, p.y);
|
||||
let mousexy: f32 = atan2(m.x, m.y);
|
||||
var r: f32 = length(p) * uni.size;
|
||||
var l: f32 = length(m) * uni.size;
|
||||
var mouse: vec2<f32> = vec2<f32>(mousexy / tau, l);
|
||||
var uv: vec2<f32> = vec2<f32>(a / tau, r);
|
||||
var xCol: f32 = uv.x * 3.;
|
||||
xCol = modulo((xCol), (3.));
|
||||
var horColour: vec3<f32> = vec3<f32>(0.25, 0.25, 0.25);
|
||||
if (xCol < 1.) {
|
||||
horColour.r = horColour.r + (1. - xCol);
|
||||
horColour.g = horColour.g + (xCol);
|
||||
} else { if (xCol < 2.) {
|
||||
xCol = xCol - (1.);
|
||||
horColour.g = horColour.g + (1. - xCol);
|
||||
horColour.b = horColour.b + (xCol);
|
||||
} else {
|
||||
xCol = xCol - (2.);
|
||||
horColour.b = horColour.b + (1. - xCol);
|
||||
horColour.r = horColour.r + (xCol);
|
||||
}
|
||||
}
|
||||
uv = 2. * uv - 1.;
|
||||
mouse = 2. * mouse - 1.;
|
||||
let beamWidth: f32 = (0.7 + 0.5 * sin((uv.x + (mouse.x - 0.2)) * 2. * tau * 0.15 * clamp(5., 0., 10.))) * abs(uni.beamwidth / (30. * uv.y));
|
||||
let horBeam: vec3<f32> = vec3<f32>(beamWidth);
|
||||
return vec4<f32>(horBeam * horColour, 1.);
|
||||
}
|
1
src/tree_sitter.jot
Normal file
|
@ -0,0 +1 @@
|
|||
# Tree-sitter Experience
|