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>
|
<PlayerSlot v-for="p in current_players" :player="p"></PlayerSlot>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ResultDialog
|
<ResultDialog :isVisible="showResults" :won="isWinner" :players="goStore.current_game?.players"
|
||||||
:isVisible="showResults"
|
|
||||||
:won="isWinner"
|
|
||||||
:players="goStore.current_game?.players"
|
|
||||||
@close="showResults = false">
|
@close="showResults = false">
|
||||||
</ResultDialog>
|
</ResultDialog>
|
||||||
<SelfView></SelfView>
|
<SelfView></SelfView>
|
||||||
@@ -98,7 +95,7 @@ function showWinnerScreen() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#current_player.self {
|
#current_player.self {
|
||||||
background-image: url('../images/bg-grass.png');
|
background-image: url('/images/bg-grass.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
#market {
|
#market {
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ const props = defineProps<Props>()
|
|||||||
}
|
}
|
||||||
|
|
||||||
.player_list_element.self {
|
.player_list_element.self {
|
||||||
background-image: url('../images/bg-grass.png');
|
background-image: url('/images/bg-grass.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
.view {
|
.view {
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ const close = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.dialog-box {
|
.dialog-box {
|
||||||
background-image: url('../images/bg-grass.png');
|
background-image: url('/images/bg-grass.png');
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
width: 800px;
|
width: 800px;
|
||||||
|
|||||||
@@ -11,4 +11,13 @@ export default defineNuxtConfig({
|
|||||||
modules: [
|
modules: [
|
||||||
'@pinia/nuxt',
|
'@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>
|
<label for="ready">Ready</label>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
<AnimatedBackground></AnimatedBackground>
|
||||||
<LoginView v-if="goStore.context === 'login'"></LoginView>
|
<LoginView v-if="goStore.context === 'login'"></LoginView>
|
||||||
<GameBoard v-if="goStore.context != 'lobby' && goStore.context != 'login'"></GameBoard>
|
<GameBoard v-if="goStore.context != 'lobby' && goStore.context != 'login'"></GameBoard>
|
||||||
<LobbyView v-if="goStore.context == 'lobby'"></LobbyView>
|
<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