add the shader! (hooray!)
This commit is contained in:
parent
51c5f580e8
commit
95ebf2b525
|
@ -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"
|
||||
|
|
|
@ -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"] }
|
||||
|
|
|
@ -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())),
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -23,12 +23,6 @@
|
|||
"doubleSided":true,
|
||||
"name":"Material.001",
|
||||
"pbrMetallicRoughness":{
|
||||
"baseColorFactor":[
|
||||
0.8000000715255737,
|
||||
0.07428835332393646,
|
||||
0.07428835332393646,
|
||||
1
|
||||
],
|
||||
"metallicFactor":0,
|
||||
"roughnessFactor":0.5
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 };
|
Loading…
Reference in New Issue