Finish first demo scene
This commit is contained in:
parent
36f01c6716
commit
77d5938b4b
4 changed files with 43 additions and 15 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "decla.red",
|
"name": "sdf-2d-demo",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,8 @@ export abstract class Random {
|
||||||
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
||||||
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static getRandomInRange(from: number, to: number): number {
|
||||||
|
return from + Random.getRandom() * (to - from);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,8 +37,12 @@ const handleScene = async (scene: Scene) => {
|
||||||
const renderer = compile(
|
const renderer = compile(
|
||||||
canvas,
|
canvas,
|
||||||
scene.descriptors,
|
scene.descriptors,
|
||||||
[vec3.fromValues(0.4, 0.35, 0.6), vec3.fromValues(0, 1, 0), vec3.fromValues(1, 1, 0)],
|
[vec3.fromValues(0.4, 1, 0.6), vec3.fromValues(1, 1, 0), vec3.fromValues(0.3, 1, 1)],
|
||||||
{ tileMultiplier: 8, enableStopwatch: false }
|
{
|
||||||
|
tileMultiplier: 10,
|
||||||
|
enableStopwatch: false,
|
||||||
|
shaderMacros: { softShadowTraceCount: '128', hardShadowTraceCount: '48' },
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
let triggerIsOver: () => void;
|
let triggerIsOver: () => void;
|
||||||
|
|
|
||||||
|
|
@ -1,47 +1,66 @@
|
||||||
import { vec2 } from 'gl-matrix';
|
import { vec2, vec3 } from 'gl-matrix';
|
||||||
import { CircleLight, Drawable, DrawableDescriptor, Flashlight, Tunnel } from 'sdf-2d';
|
import { CircleLight, Drawable, DrawableDescriptor, Tunnel } from 'sdf-2d';
|
||||||
import { Random } from '../helper/random';
|
import { Random } from '../helper/random';
|
||||||
import { Scene } from './scene';
|
import { Scene } from './scene';
|
||||||
|
|
||||||
export class RainScene implements Scene {
|
export class RainScene implements Scene {
|
||||||
public droplets: Array<Droplet> = [];
|
public droplets: Array<Droplet> = [];
|
||||||
|
|
||||||
|
private light1: CircleLight = new CircleLight(
|
||||||
|
vec2.create(),
|
||||||
|
1,
|
||||||
|
vec3.fromValues(1, 0, 1),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
private light2: CircleLight = new CircleLight(
|
||||||
|
vec2.create(),
|
||||||
|
1,
|
||||||
|
vec3.fromValues(1, 0, 0.5),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
public constructor() {
|
public constructor() {
|
||||||
for (let i = 0; i < 100; i++) {
|
for (let i = 0; i < 20; i++) {
|
||||||
this.droplets.push(new Droplet());
|
this.droplets.push(new Droplet());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public get descriptors(): Array<DrawableDescriptor> {
|
public get descriptors(): Array<DrawableDescriptor> {
|
||||||
return [Tunnel.descriptor, CircleLight.descriptor, Flashlight.descriptor];
|
return [Tunnel.descriptor, CircleLight.descriptor];
|
||||||
}
|
}
|
||||||
|
|
||||||
public animate(
|
public animate(
|
||||||
currentTime: number,
|
currentTime: number,
|
||||||
viewAreaSize: { width: number; height: number }
|
viewAreaSize: { width: number; height: number }
|
||||||
): void {
|
): void {
|
||||||
|
vec2.set(this.light1.center, 0, viewAreaSize.height / 2);
|
||||||
|
vec2.set(this.light2.center, viewAreaSize.width, viewAreaSize.height / 2);
|
||||||
this.droplets.forEach((d) => d.animate(currentTime, viewAreaSize));
|
this.droplets.forEach((d) => d.animate(currentTime, viewAreaSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
public get drawables(): Array<Drawable> {
|
public get drawables(): Array<Drawable> {
|
||||||
return this.droplets.map((d) => d.drawable);
|
return [...this.droplets.map((d) => d.drawable), this.light1, this.light2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Droplet {
|
class Droplet {
|
||||||
public readonly drawable: Tunnel;
|
public readonly drawable: Tunnel;
|
||||||
|
|
||||||
private speed = Random.getRandom() * 0.2 + 0.1;
|
private speed = Random.getRandom() * 0.2 + 0.2;
|
||||||
private position = vec2.fromValues(Random.getRandom(), Random.getRandom());
|
private position = vec2.fromValues(
|
||||||
private length = Random.getRandom() * 30 + 8;
|
Random.getRandomInRange(0.1, 0.9),
|
||||||
|
Random.getRandom()
|
||||||
|
);
|
||||||
|
private length = Random.getRandom() * 20 + 4;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
const size = Random.getRandom() * 10 + 5;
|
const size = Random.getRandom() * 2 + 2;
|
||||||
|
|
||||||
this.drawable = new Tunnel(
|
this.drawable = new Tunnel(
|
||||||
vec2.create(),
|
vec2.create(),
|
||||||
vec2.create(),
|
vec2.create(),
|
||||||
size + Random.getRandom() * 5 + 5,
|
size + Random.getRandom() * 2 + 2,
|
||||||
size
|
size
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -50,11 +69,12 @@ class Droplet {
|
||||||
currentTime: number,
|
currentTime: number,
|
||||||
{ width, height }: { width: number; height: number }
|
{ width, height }: { width: number; height: number }
|
||||||
) {
|
) {
|
||||||
const heightOffset = 300;
|
const heightOffset = 100;
|
||||||
vec2.set(
|
vec2.set(
|
||||||
this.drawable.from,
|
this.drawable.from,
|
||||||
this.position[0] * width,
|
this.position[0] * width,
|
||||||
height - ((this.speed * currentTime) % (height + heightOffset))
|
height -
|
||||||
|
((this.position[1] * height + this.speed * currentTime) % (height + heightOffset))
|
||||||
);
|
);
|
||||||
|
|
||||||
vec2.add(this.drawable.to, this.drawable.from, vec2.fromValues(0, this.length));
|
vec2.add(this.drawable.to, this.drawable.from, vec2.fromValues(0, this.length));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue