add the shader! (hooray!)

This commit is contained in:
zoe 2023-08-25 23:23:14 +02:00
parent 51c5f580e8
commit 95ebf2b525
11 changed files with 147 additions and 16 deletions

23
Cargo.lock generated
View File

@ -2282,6 +2282,7 @@ dependencies = [
"serde",
"serde_derive",
"sqlx",
"strum",
"tokio",
"tower-http",
"tracing",
@ -2304,6 +2305,28 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "strum"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
dependencies = [
"strum_macros",
]
[[package]]
name = "strum_macros"
version = "0.25.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059"
dependencies = [
"heck",
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.29",
]
[[package]]
name = "subtle"
version = "2.5.0"

View File

@ -49,4 +49,5 @@ tower-http = { version = "0.4", features = [
"cors",
"timeout",
] }
fastrand = { version = "2.0.0", features = ["std"] }
fastrand = { version = "2", features = ["std"] }
strum = { version = "0.25", features = ["strum_macros", "derive"] }

View File

@ -7,6 +7,7 @@ use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
mod kind;
mod position;
mod size;
@ -57,6 +58,7 @@ pub struct Star {
pub core: Protostar,
pub size: size::Size,
pub position: position::Position,
pub kind: kind::Kind,
}
#[derive(Serialize, Deserialize, JsonSchema)]
@ -70,6 +72,7 @@ impl Into<Star> for Protostar {
let range = 0..u64::MAX;
Star {
core: self,
kind: kind::Kind::random(rng.u64(range.clone())),
size: size::Size::random(rng.u64(range.clone())),
position: position::Position::random(rng.u64(range.clone())),
}

20
src/stars/kind.rs Normal file
View File

@ -0,0 +1,20 @@
use fastrand::Rng;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use strum::{EnumIter, IntoEnumIterator};
#[derive(Serialize, Deserialize, JsonSchema, EnumIter)]
pub enum Kind {
Nebula,
Planet,
Star,
Nova,
Supernova,
}
impl Kind {
pub fn random(seed: u64) -> Self {
let mut rng = Rng::with_seed(seed);
rng.choice(Self::iter()).unwrap_or(Self::Star)
}
}

View File

@ -17,7 +17,7 @@ impl Position {
Self {
right: rand.f64() * 100.0,
bottom: rand.f64() * 100.0,
width: rand.u8(16..32),
width: rand.u8(16..82),
}
}
}

13
web/package-lock.json generated
View File

@ -28,6 +28,7 @@
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^8.0.3",
"pinia": "^2.1.6",
"postprocessing": "^6.33.0",
"prettier": "^2.4.1",
"sass": "^1.32.7",
"sass-loader": "^12.0.0",
@ -9853,6 +9854,18 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"node_modules/postprocessing": {
"version": "6.33.0",
"resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.33.0.tgz",
"integrity": "sha512-W6KGnF8OVyPtB9f5o2z8abJOefDeT9aoOrI/HmMmJM6/gXTKRc66MrL+qNoGmeeA3moWWsTk0mc9M+shN3vXaA==",
"dev": true,
"engines": {
"node": ">= 0.13.2"
},
"peerDependencies": {
"three": ">= 0.138.0 < 0.156.0"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",

View File

@ -29,6 +29,7 @@
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^8.0.3",
"pinia": "^2.1.6",
"postprocessing": "^6.33.0",
"prettier": "^2.4.1",
"sass": "^1.32.7",
"sass-loader": "^12.0.0",

View File

@ -23,12 +23,6 @@
"doubleSided":true,
"name":"Material.001",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.8000000715255737,
0.07428835332393646,
0.07428835332393646,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}

View File

@ -12,6 +12,11 @@ import * as THREE from "three";
import { PropType, onMounted } from "vue";
import { Star } from "@/swagger";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js';
import { StarShader } from '../scripts/star_shader';
import { getRGB } from '../scripts/convert_color';
const props = defineProps({
star: { type: Star, required: true },
@ -19,7 +24,6 @@ const props = defineProps({
onMounted(async () => {
const canvas = document.getElementById("can");
console.log(canvas);
const loader = new GLTFLoader();
const renderer = new THREE.WebGLRenderer({ canvas: canvas ?? undefined });
renderer.setClearAlpha(0.0);
@ -59,14 +63,26 @@ onMounted(async () => {
camera.aspect = width / height;
camera.updateProjectionMatrix();
renderer.setPixelRatio(1 / (width / 125));
}
}
function animate() {
model.scene.rotation.y += 0.01;
requestAnimationFrame(animate);
resizeCanvas();
renderer.render(scene, camera);
}
const rgb = getRGB(props.star.core.color);
const starShader = StarShader;
starShader.uniforms.newRed.value = rgb[0] / 256;
starShader.uniforms.newGreen.value = rgb[1] / 256;
starShader.uniforms.newBlue.value = rgb[2] / 256;
console.log(starShader.uniforms);
const composer = new EffectComposer(renderer);
composer.addPass(new RenderPass(scene, camera));
composer.addPass(new ShaderPass( starShader ));
function animate() {
model.scene.rotation.y += 0.01;
requestAnimationFrame(animate);
resizeCanvas();
composer.render();
}
resizeCanvas();
animate();

View File

@ -1,6 +1,11 @@
import { hex } from "color-convert";
import { RGB } from "color-convert/conversions";
export function getHue(hexString: string): number {
const color = hex.hsv(hexString);
return color[0];
}
export function getRGB(hexString: string): RGB {
return hex.rgb(hexString);
}

View File

@ -0,0 +1,55 @@
/**
* Full-screen textured quad shader
*/
const StarShader = {
name: "StarShader",
uniforms: {
tDiffuse: { value: null },
opacity: { value: 1.0 },
newRed: { value: 1.0 },
newGreen: { value: 1.0 },
newBlue: { value: 1.0 },
},
vertexShader: /* glsl */ `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}`,
fragmentShader: /* glsl */ `
uniform float opacity;
uniform sampler2D tDiffuse;
uniform float newRed;
uniform float newGreen;
uniform float newBlue;
varying vec2 vUv;
void main() {
vec4 texel = texture2D( tDiffuse, vUv );
vec4 original_color = opacity * texel;
float brightness = (original_color.r + original_color.g + original_color.b) / 3.0;
if (original_color.a > 0.0) {
gl_FragColor.r = newRed * brightness;
gl_FragColor.g = newGreen * brightness;
gl_FragColor.b = newBlue * brightness;
}
gl_FragColor.a = original_color.a;
}`,
};
export { StarShader };