Skip to content

Commit b194981

Browse files
committed
working vite build plugin! omg yes :o
1 parent 819df65 commit b194981

File tree

10 files changed

+1094
-0
lines changed

10 files changed

+1094
-0
lines changed
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Shader Park Vite Prebuild Plugin Template 🎉
2+
=================
3+
4+
To setup run:
5+
```
6+
npm i
7+
```
8+
9+
To start the server:
10+
```
11+
npm run dev
12+
```
13+
14+
To build:
15+
```
16+
npm run build
17+
```
18+
19+
Write your Shader Park code in the spCode.sp file
20+
You can simply paste in code from the ShaderPark web editor.
21+
22+
This setup uses a Vite plugin to generate the GLSL shaders at build time, so the shader-park-core library does not need to be bundled into your app. This has several benefits:
23+
- Smaller bundle size. shader-park-core is heavy because it depends on large libraries like esprima.
24+
- Faster initial render. Shaders are generated ahead of time.
25+
- No need to use eval in the browser. This is more secure and follows best practices.
26+
- Clear isolation between shaderpark code and the rest of your javascript code.
27+
28+
Find out more about [Shader Park](https://shaderpark.com/).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<title>Shader Park Template</title>
5+
<meta charset="utf-8">
6+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
7+
<meta name="viewport" content="width=device-width, initial-scale=1">
8+
<!-- import the webpage's stylesheet -->
9+
<link rel="stylesheet" href="/style.css">
10+
</head>
11+
<body>
12+
<script src="./index.js" type="module"></script>
13+
</body>
14+
</html>
+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import {
2+
Scene, PerspectiveCamera, WebGLRenderer, Mesh,
3+
Vector2, Vector3, Vector4, Color,
4+
SphereGeometry, ShaderMaterial, BackSide
5+
} from 'three';
6+
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
7+
import generatedShader from './spCode.sp';
8+
9+
let scene = new Scene();
10+
11+
let camera = new PerspectiveCamera( 70, window.innerWidth/window.innerHeight, 0.1, 100 );
12+
camera.position.z = 2;
13+
14+
let renderer = new WebGLRenderer({ antialias: true });
15+
renderer.setSize( window.innerWidth, window.innerHeight );
16+
renderer.setPixelRatio( window.devicePixelRatio );
17+
18+
renderer.setClearColor( new Color(1, 1, 1), 1 );
19+
document.body.appendChild( renderer.domElement );
20+
21+
function uniformDescriptionToThreeJSFormat(rawUniforms) {
22+
const vectorConstructors = {
23+
float: v => v,
24+
vec2: v => new Vector2(v.x, v.y),
25+
vec3: v => new Vector3(v.x, v.y, v.z),
26+
vec4: v => new Vector4(v.x, v.y, v.z, v.w)
27+
};
28+
29+
return rawUniforms.reduce((acc, {name, type, value}) => {
30+
acc[name] = { value: vectorConstructors[type](value) };
31+
return acc;
32+
}, {});
33+
}
34+
35+
const material = new ShaderMaterial({
36+
uniforms: uniformDescriptionToThreeJSFormat(generatedShader.uniforms),
37+
vertexShader: generatedShader.vert,
38+
fragmentShader: generatedShader.frag,
39+
transparent: true,
40+
side: BackSide,
41+
});
42+
43+
const mesh = new Mesh(new SphereGeometry(2, 32, 16), material);
44+
scene.add(mesh);
45+
46+
let controls = new OrbitControls( camera, renderer.domElement, {
47+
enableDamping : true,
48+
dampingFactor : 0.25,
49+
zoomSpeed : 0.5,
50+
rotateSpeed : 0.5
51+
} );
52+
53+
let render = () => {
54+
requestAnimationFrame( render );
55+
material.uniforms.time.value += 0.015;
56+
controls.update();
57+
renderer.render( scene, camera );
58+
};
59+
60+
render();

0 commit comments

Comments
 (0)