WIP canvas
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
|
||||
#define FBM_OCTAVES 6
|
||||
|
||||
#include "lygia/generative/fbm.glsl"
|
||||
|
||||
uniform vec2 u_resolution;
|
||||
uniform vec2 u_mouse;
|
||||
uniform float u_time;
|
||||
|
||||
void main(){
|
||||
vec2 st=gl_FragCoord.xy/min(u_resolution.x,u_resolution.x)*2.;
|
||||
|
||||
vec2 q=vec2(0.);
|
||||
q.x=fbm(st);
|
||||
q.y=fbm(st+vec2(1.));
|
||||
|
||||
q=q*.5+.5;
|
||||
vec2 r=vec2(0.);
|
||||
r.x=fbm(st+1.*q+vec2(1.7,9.2)+.0115*u_time);
|
||||
r.y=fbm(st+1.*q+vec2(8.3,2.8)+.0226*u_time);
|
||||
r=r*.5+.5;
|
||||
|
||||
float f=fbm(st+r);
|
||||
|
||||
f=mix(.5,1.,f);
|
||||
gl_FragColor=vec4(0.,.1+f,0.,1.);
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
<script setup lang="ts">
|
||||
import noise from "~/assets/shaders/noise.frag?raw"
|
||||
|
||||
const canvas = ref<HTMLCanvasElement | null>(null)
|
||||
|
||||
declare const webglUtils: {
|
||||
createProgramFromSources: (gl: WebGLRenderingContext, array: [string, string]) => any,
|
||||
resizeCanvasToDisplaySize: (e: HTMLCanvasElement | OffscreenCanvas) => any
|
||||
}
|
||||
|
||||
declare const resolveLygiaAsync: (source: string) => Promise<string>
|
||||
|
||||
|
||||
|
||||
async function main(canvas: HTMLCanvasElement) {
|
||||
// Get A WebGL context
|
||||
/** @type {HTMLCanvasElement} */
|
||||
const gl = canvas.getContext("webgl");
|
||||
if (!gl) {
|
||||
return;
|
||||
}
|
||||
|
||||
const vs = `attribute vec4 a_position;void main() {gl_Position = a_position;}`;
|
||||
|
||||
const fs = await resolveLygiaAsync(noise);
|
||||
|
||||
// setup GLSL program
|
||||
const program = webglUtils.createProgramFromSources(gl, [vs, fs]);
|
||||
|
||||
// look up where the vertex data needs to go.
|
||||
const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
|
||||
|
||||
// look up uniform locations
|
||||
const resolutionLocation = gl.getUniformLocation(program, "u_resolution");
|
||||
const mouseLocation = gl.getUniformLocation(program, "u_mouse");
|
||||
const timeLocation = gl.getUniformLocation(program, "u_time");
|
||||
|
||||
// Create a buffer to put three 2d clip space points in
|
||||
const positionBuffer = gl.createBuffer();
|
||||
|
||||
// Bind it to ARRAY_BUFFER (think of it as ARRAY_BUFFER = positionBuffer)
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
||||
|
||||
// fill it with a 2 triangles that cover clipspace
|
||||
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
|
||||
-1, -1, // first triangle
|
||||
1, -1,
|
||||
-1, 1,
|
||||
-1, 1, // second triangle
|
||||
1, -1,
|
||||
1, 1,
|
||||
]), gl.STATIC_DRAW);
|
||||
|
||||
let mouseX = 0;
|
||||
let mouseY = 0;
|
||||
|
||||
|
||||
function render(time: number) {
|
||||
if (!gl) { return }
|
||||
time *= 0.001; // convert to seconds
|
||||
|
||||
webglUtils.resizeCanvasToDisplaySize(gl.canvas);
|
||||
|
||||
// Tell WebGL how to convert from clip space to pixels
|
||||
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
|
||||
|
||||
// Tell it to use our program (pair of shaders)
|
||||
gl.useProgram(program);
|
||||
|
||||
// Turn on the attribute
|
||||
gl.enableVertexAttribArray(positionAttributeLocation);
|
||||
|
||||
// Bind the position buffer.
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
||||
|
||||
// Tell the attribute how to get data out of positionBuffer (ARRAY_BUFFER)
|
||||
gl.vertexAttribPointer(
|
||||
positionAttributeLocation,
|
||||
2, // 2 components per iteration
|
||||
gl.FLOAT, // the data is 32bit floats
|
||||
false, // don't normalize the data
|
||||
0, // 0 = move forward size * sizeof(type) each iteration to get the next position
|
||||
0, // start at the beginning of the buffer
|
||||
);
|
||||
|
||||
gl.uniform2f(resolutionLocation, gl.canvas.width, gl.canvas.height);
|
||||
gl.uniform2f(mouseLocation, mouseX, mouseY);
|
||||
gl.uniform1f(timeLocation, time);
|
||||
|
||||
gl.drawArrays(
|
||||
gl.TRIANGLES,
|
||||
0, // offset
|
||||
6, // num vertices to process
|
||||
);
|
||||
|
||||
requestAnimationFrame(render);
|
||||
}
|
||||
requestAnimationFrame(render);
|
||||
}
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
if (!canvas.value) { return }
|
||||
main(canvas.value);
|
||||
})
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<canvas ref="canvas">test</canvas>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
@@ -70,10 +70,7 @@ function showWinnerScreen() {
|
||||
<PlayerSlot v-for="p in current_players" :player="p"></PlayerSlot>
|
||||
</div>
|
||||
</div>
|
||||
<ResultDialog
|
||||
:isVisible="showResults"
|
||||
:won="isWinner"
|
||||
:players="goStore.current_game?.players"
|
||||
<ResultDialog :isVisible="showResults" :won="isWinner" :players="goStore.current_game?.players"
|
||||
@close="showResults = false">
|
||||
</ResultDialog>
|
||||
<SelfView></SelfView>
|
||||
@@ -98,7 +95,7 @@ function showWinnerScreen() {
|
||||
}
|
||||
|
||||
#current_player.self {
|
||||
background-image: url('../images/bg-grass.png');
|
||||
background-image: url('/images/bg-grass.png');
|
||||
}
|
||||
|
||||
#market {
|
||||
|
||||
@@ -122,7 +122,7 @@ const props = defineProps<Props>()
|
||||
}
|
||||
|
||||
.player_list_element.self {
|
||||
background-image: url('../images/bg-grass.png');
|
||||
background-image: url('/images/bg-grass.png');
|
||||
}
|
||||
|
||||
.view {
|
||||
|
||||
@@ -66,7 +66,7 @@ const close = () => {
|
||||
}
|
||||
|
||||
.dialog-box {
|
||||
background-image: url('../images/bg-grass.png');
|
||||
background-image: url('/images/bg-grass.png');
|
||||
padding: 0 20px;
|
||||
border-radius: 5px;
|
||||
width: 800px;
|
||||
|
||||
@@ -11,4 +11,13 @@ export default defineNuxtConfig({
|
||||
modules: [
|
||||
'@pinia/nuxt',
|
||||
],
|
||||
app: {
|
||||
head: {
|
||||
script: [{
|
||||
src: "/webgl-utils.js"
|
||||
}, {
|
||||
src: "https://lygia.xyz/resolve.js"
|
||||
}]
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
@@ -15,6 +15,7 @@ import goStore, { setReady } from "@/netcode";
|
||||
<label for="ready">Ready</label>
|
||||
</template>
|
||||
</div>
|
||||
<AnimatedBackground></AnimatedBackground>
|
||||
<LoginView v-if="goStore.context === 'login'"></LoginView>
|
||||
<GameBoard v-if="goStore.context != 'lobby' && goStore.context != 'login'"></GameBoard>
|
||||
<LobbyView v-if="goStore.context == 'lobby'"></LobbyView>
|
||||
|
||||
@@ -0,0 +1,294 @@
|
||||
/*
|
||||
* Copyright 2021, GFXFundamentals.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of GFXFundamentals. nor the names of his
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* global define */
|
||||
(function(root, factory) { // eslint-disable-line
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define([], function() {
|
||||
return factory.call(root);
|
||||
});
|
||||
} else {
|
||||
// Browser globals
|
||||
root.webglUtils = factory.call(root);
|
||||
}
|
||||
}(this, function() {
|
||||
"use strict";
|
||||
|
||||
const topWindow = this;
|
||||
|
||||
/** @module webgl-utils */
|
||||
|
||||
function isInIFrame(w) {
|
||||
w = w || topWindow;
|
||||
return w !== w.top;
|
||||
}
|
||||
|
||||
if (!isInIFrame()) {
|
||||
console.log("%c%s", 'color:blue;font-weight:bold;', 'for more about webgl-utils.js see:'); // eslint-disable-line
|
||||
console.log("%c%s", 'color:blue;font-weight:bold;', 'http://webgl2fundamentals.org/webgl/lessons/webgl-boilerplate.html'); // eslint-disable-line
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapped logging function.
|
||||
* @param {string} msg The message to log.
|
||||
*/
|
||||
function error(msg) {
|
||||
if (topWindow.console) {
|
||||
if (topWindow.console.error) {
|
||||
topWindow.console.error(msg);
|
||||
} else if (topWindow.console.log) {
|
||||
topWindow.console.log(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const errorRE = /ERROR:\s*\d+:(\d+)/gi;
|
||||
function addLineNumbersWithError(src, log = '') {
|
||||
// Note: Error message formats are not defined by any spec so this may or may not work.
|
||||
const matches = [...log.matchAll(errorRE)];
|
||||
const lineNoToErrorMap = new Map(matches.map((m, ndx) => {
|
||||
const lineNo = parseInt(m[1]);
|
||||
const next = matches[ndx + 1];
|
||||
const end = next ? next.index : log.length;
|
||||
const msg = log.substring(m.index, end);
|
||||
return [lineNo - 1, msg];
|
||||
}));
|
||||
return src.split('\n').map((line, lineNo) => {
|
||||
const err = lineNoToErrorMap.get(lineNo);
|
||||
return `${lineNo + 1}: ${line}${err ? `\n\n^^^ ${err}` : ''}`;
|
||||
}).join('\n');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Error Callback
|
||||
* @callback ErrorCallback
|
||||
* @param {string} msg error message.
|
||||
* @memberOf module:webgl-utils
|
||||
*/
|
||||
|
||||
/**
|
||||
* Loads a shader.
|
||||
* @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.
|
||||
* @param {string} shaderSource The shader source.
|
||||
* @param {number} shaderType The type of shader.
|
||||
* @param {module:webgl-utils.ErrorCallback} opt_errorCallback callback for errors.
|
||||
* @return {WebGLShader} The created shader.
|
||||
*/
|
||||
function loadShader(gl, shaderSource, shaderType, opt_errorCallback) {
|
||||
const errFn = opt_errorCallback || error;
|
||||
// Create the shader object
|
||||
const shader = gl.createShader(shaderType);
|
||||
|
||||
// Load the shader source
|
||||
gl.shaderSource(shader, shaderSource);
|
||||
|
||||
// Compile the shader
|
||||
gl.compileShader(shader);
|
||||
|
||||
// Check the compile status
|
||||
const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
|
||||
if (!compiled) {
|
||||
// Something went wrong during compilation; get the error
|
||||
const lastError = gl.getShaderInfoLog(shader);
|
||||
errFn(`Error compiling shader: ${lastError}\n${addLineNumbersWithError(shaderSource, lastError)}`);
|
||||
gl.deleteShader(shader);
|
||||
return null;
|
||||
}
|
||||
|
||||
return shader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a program, attaches shaders, binds attrib locations, links the
|
||||
* program and calls useProgram.
|
||||
* @param {WebGLShader[]} shaders The shaders to attach
|
||||
* @param {string[]} [opt_attribs] An array of attribs names. Locations will be assigned by index if not passed in
|
||||
* @param {number[]} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations.
|
||||
* @param {module:webgl-utils.ErrorCallback} opt_errorCallback callback for errors. By default it just prints an error to the console
|
||||
* on error. If you want something else pass an callback. It's passed an error message.
|
||||
* @memberOf module:webgl-utils
|
||||
*/
|
||||
function createProgram(
|
||||
gl, shaders, opt_attribs, opt_locations, opt_errorCallback) {
|
||||
const errFn = opt_errorCallback || error;
|
||||
const program = gl.createProgram();
|
||||
shaders.forEach(function(shader) {
|
||||
gl.attachShader(program, shader);
|
||||
});
|
||||
if (opt_attribs) {
|
||||
opt_attribs.forEach(function(attrib, ndx) {
|
||||
gl.bindAttribLocation(
|
||||
program,
|
||||
opt_locations ? opt_locations[ndx] : ndx,
|
||||
attrib);
|
||||
});
|
||||
}
|
||||
gl.linkProgram(program);
|
||||
|
||||
// Check the link status
|
||||
const linked = gl.getProgramParameter(program, gl.LINK_STATUS);
|
||||
if (!linked) {
|
||||
// something went wrong with the link
|
||||
const lastError = gl.getProgramInfoLog(program);
|
||||
errFn(`Error in program linking: ${lastError}\n${
|
||||
shaders.map(shader => {
|
||||
const src = addLineNumbersWithError(gl.getShaderSource(shader));
|
||||
const type = gl.getShaderParameter(shader, gl.SHADER_TYPE);
|
||||
return `${glEnumToString(gl, type)}:\n${src}`;
|
||||
}).join('\n')
|
||||
}`);
|
||||
|
||||
gl.deleteProgram(program);
|
||||
return null;
|
||||
}
|
||||
return program;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a shader from a script tag.
|
||||
* @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.
|
||||
* @param {string} scriptId The id of the script tag.
|
||||
* @param {number} opt_shaderType The type of shader. If not passed in it will
|
||||
* be derived from the type of the script tag.
|
||||
* @param {module:webgl-utils.ErrorCallback} opt_errorCallback callback for errors.
|
||||
* @return {WebGLShader} The created shader.
|
||||
*/
|
||||
function createShaderFromScript(
|
||||
gl, scriptId, opt_shaderType, opt_errorCallback) {
|
||||
let shaderSource = "";
|
||||
let shaderType;
|
||||
const shaderScript = document.getElementById(scriptId);
|
||||
if (!shaderScript) {
|
||||
throw ("*** Error: unknown script element" + scriptId);
|
||||
}
|
||||
shaderSource = shaderScript.text;
|
||||
|
||||
if (!opt_shaderType) {
|
||||
if (shaderScript.type === "x-shader/x-vertex") {
|
||||
shaderType = gl.VERTEX_SHADER;
|
||||
} else if (shaderScript.type === "x-shader/x-fragment") {
|
||||
shaderType = gl.FRAGMENT_SHADER;
|
||||
} else if (shaderType !== gl.VERTEX_SHADER && shaderType !== gl.FRAGMENT_SHADER) {
|
||||
throw ("*** Error: unknown shader type");
|
||||
}
|
||||
}
|
||||
|
||||
return loadShader(
|
||||
gl, shaderSource, opt_shaderType ? opt_shaderType : shaderType,
|
||||
opt_errorCallback);
|
||||
}
|
||||
|
||||
const defaultShaderType = [
|
||||
"VERTEX_SHADER",
|
||||
"FRAGMENT_SHADER",
|
||||
];
|
||||
|
||||
/**
|
||||
* Creates a program from 2 script tags.
|
||||
*
|
||||
* @param {WebGLRenderingContext} gl The WebGLRenderingContext
|
||||
* to use.
|
||||
* @param {string[]} shaderScriptIds Array of ids of the script
|
||||
* tags for the shaders. The first is assumed to be the
|
||||
* vertex shader, the second the fragment shader.
|
||||
* @param {string[]} [opt_attribs] An array of attribs names. Locations will be assigned by index if not passed in
|
||||
* @param {number[]} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations.
|
||||
* @param {module:webgl-utils.ErrorCallback} opt_errorCallback callback for errors. By default it just prints an error to the console
|
||||
* on error. If you want something else pass an callback. It's passed an error message.
|
||||
* @return {WebGLProgram} The created program.
|
||||
* @memberOf module:webgl-utils
|
||||
*/
|
||||
function createProgramFromScripts(
|
||||
gl, shaderScriptIds, opt_attribs, opt_locations, opt_errorCallback) {
|
||||
const shaders = [];
|
||||
for (let ii = 0; ii < shaderScriptIds.length; ++ii) {
|
||||
shaders.push(createShaderFromScript(
|
||||
gl, shaderScriptIds[ii], gl[defaultShaderType[ii]], opt_errorCallback));
|
||||
}
|
||||
return createProgram(gl, shaders, opt_attribs, opt_locations, opt_errorCallback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a program from 2 sources.
|
||||
*
|
||||
* @param {WebGLRenderingContext} gl The WebGLRenderingContext
|
||||
* to use.
|
||||
* @param {string[]} shaderSourcess Array of sources for the
|
||||
* shaders. The first is assumed to be the vertex shader,
|
||||
* the second the fragment shader.
|
||||
* @param {string[]} [opt_attribs] An array of attribs names. Locations will be assigned by index if not passed in
|
||||
* @param {number[]} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations.
|
||||
* @param {module:webgl-utils.ErrorCallback} opt_errorCallback callback for errors. By default it just prints an error to the console
|
||||
* on error. If you want something else pass an callback. It's passed an error message.
|
||||
* @return {WebGLProgram} The created program.
|
||||
* @memberOf module:webgl-utils
|
||||
*/
|
||||
function createProgramFromSources(
|
||||
gl, shaderSources, opt_attribs, opt_locations, opt_errorCallback) {
|
||||
const shaders = [];
|
||||
for (let ii = 0; ii < shaderSources.length; ++ii) {
|
||||
shaders.push(loadShader(
|
||||
gl, shaderSources[ii], gl[defaultShaderType[ii]], opt_errorCallback));
|
||||
}
|
||||
return createProgram(gl, shaders, opt_attribs, opt_locations, opt_errorCallback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize a canvas to match the size its displayed.
|
||||
* @param {HTMLCanvasElement} canvas The canvas to resize.
|
||||
* @param {number} [multiplier] amount to multiply by.
|
||||
* Pass in window.devicePixelRatio for native pixels.
|
||||
* @return {boolean} true if the canvas was resized.
|
||||
* @memberOf module:webgl-utils
|
||||
*/
|
||||
function resizeCanvasToDisplaySize(canvas, multiplier) {
|
||||
multiplier = multiplier || 1;
|
||||
const width = canvas.clientWidth * multiplier | 0;
|
||||
const height = canvas.clientHeight * multiplier | 0;
|
||||
if (canvas.width !== width || canvas.height !== height) {
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return {
|
||||
createProgram: createProgram,
|
||||
createProgramFromScripts: createProgramFromScripts,
|
||||
createProgramFromSources: createProgramFromSources,
|
||||
resizeCanvasToDisplaySize: resizeCanvasToDisplaySize,
|
||||
};
|
||||
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user