mirror of
https://github.com/xemu-project/xemu-website.git
synced 2024-11-26 21:00:33 +00:00
Render all gl scenes in one call
This commit is contained in:
parent
2c30f06152
commit
55ee3ea346
@ -1,7 +1,3 @@
|
|||||||
;(function(){
|
|
||||||
"use strict"
|
|
||||||
window.addEventListener("load", setupWebGL, false);
|
|
||||||
|
|
||||||
var gl, program;
|
var gl, program;
|
||||||
var time_loc;
|
var time_loc;
|
||||||
var buffer;
|
var buffer;
|
||||||
@ -11,7 +7,7 @@ var restart_anim = true;
|
|||||||
var last_started = 0;
|
var last_started = 0;
|
||||||
var loaded = false;
|
var loaded = false;
|
||||||
|
|
||||||
var vert_src = `
|
var logo_vert_src = `
|
||||||
|
|
||||||
#version 100
|
#version 100
|
||||||
attribute vec2 in_Position;
|
attribute vec2 in_Position;
|
||||||
@ -24,7 +20,7 @@ void main() {
|
|||||||
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
var frag_src = `
|
var logo_frag_src = `
|
||||||
|
|
||||||
#version 100
|
#version 100
|
||||||
precision highp float;
|
precision highp float;
|
||||||
@ -210,12 +206,12 @@ void main()
|
|||||||
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
function reset_time() {
|
function logo_reset_time() {
|
||||||
restart_anim = true;
|
restart_anim = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL
|
// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL
|
||||||
function loadTexture(gl, url) {
|
function logo_loadTexture(gl, url) {
|
||||||
const texture = gl.createTexture();
|
const texture = gl.createTexture();
|
||||||
gl.bindTexture(gl.TEXTURE_2D, texture);
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
||||||
const level = 0;
|
const level = 0;
|
||||||
@ -260,13 +256,23 @@ function isPowerOf2(value) {
|
|||||||
return (value & (value - 1)) == 0;
|
return (value & (value - 1)) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupWebGL (evt) {
|
function logo_getRenderingContext() {
|
||||||
window.removeEventListener(evt.type, setupWebGL, false);
|
var canvas = document.querySelector("#logo-canvas");
|
||||||
if (!(gl = getRenderingContext()))
|
canvas.width = 512;
|
||||||
|
canvas.height = 512;
|
||||||
|
var gl = canvas.getContext("webgl");
|
||||||
|
if (!gl) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return gl;
|
||||||
|
}
|
||||||
|
|
||||||
|
function logo_setupWebGL() {
|
||||||
|
if (!(gl = logo_getRenderingContext()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var vertexShader = gl.createShader(gl.VERTEX_SHADER);
|
var vertexShader = gl.createShader(gl.VERTEX_SHADER);
|
||||||
gl.shaderSource(vertexShader, vert_src);
|
gl.shaderSource(vertexShader, logo_vert_src);
|
||||||
gl.compileShader(vertexShader);
|
gl.compileShader(vertexShader);
|
||||||
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
|
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
|
||||||
var err_str = gl.getShaderInfoLog(vertexShader);
|
var err_str = gl.getShaderInfoLog(vertexShader);
|
||||||
@ -275,7 +281,7 @@ function setupWebGL (evt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
|
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
|
||||||
gl.shaderSource(fragmentShader, frag_src);
|
gl.shaderSource(fragmentShader, logo_frag_src);
|
||||||
gl.compileShader(fragmentShader);
|
gl.compileShader(fragmentShader);
|
||||||
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
|
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
|
||||||
var err_str = gl.getShaderInfoLog(fragmentShader);
|
var err_str = gl.getShaderInfoLog(fragmentShader);
|
||||||
@ -308,27 +314,27 @@ function setupWebGL (evt) {
|
|||||||
var pos_attr_loc = gl.getAttribLocation(program, "in_Position");
|
var pos_attr_loc = gl.getAttribLocation(program, "in_Position");
|
||||||
gl.vertexAttribPointer(pos_attr_loc, 2, gl.FLOAT, false, 2*4, 0);
|
gl.vertexAttribPointer(pos_attr_loc, 2, gl.FLOAT, false, 2*4, 0);
|
||||||
gl.enableVertexAttribArray(pos_attr_loc);
|
gl.enableVertexAttribArray(pos_attr_loc);
|
||||||
var tex = loadTexture(gl, "logo_sdf.png")
|
var tex = logo_loadTexture(gl, "logo_sdf.png")
|
||||||
var tex_loc = gl.getUniformLocation(program, "tex");
|
var tex_loc = gl.getUniformLocation(program, "tex");
|
||||||
time_loc = gl.getUniformLocation(program, "iTime");
|
time_loc = gl.getUniformLocation(program, "iTime");
|
||||||
gl.useProgram(program);
|
gl.useProgram(program);
|
||||||
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
|
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
|
||||||
gl.finish();
|
|
||||||
|
|
||||||
requestAnimationFrame(render);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function render(ts) {
|
var initialized = false;
|
||||||
if (!loaded) {
|
|
||||||
requestAnimationFrame(render);
|
function logo_render(ts) {
|
||||||
|
if (!initialized) {
|
||||||
|
logo_setupWebGL();
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
if (!(gl = logo_getRenderingContext())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!(gl = getRenderingContext()))
|
|
||||||
return;
|
|
||||||
if (pending_disable_fallback) {
|
if (pending_disable_fallback) {
|
||||||
document.getElementById("logo-canvas").style.visibility = "visible";
|
document.getElementById("logo-canvas").style.visibility = "visible";
|
||||||
document.getElementById("logo-fallback").style.visibility = "hidden";
|
document.getElementById("logo-fallback").style.visibility = "hidden";
|
||||||
document.getElementById("logo-canvas").onclick = reset_time;
|
document.getElementById("logo-canvas").onclick = logo_reset_time;
|
||||||
pending_disable_fallback = false;
|
pending_disable_fallback = false;
|
||||||
}
|
}
|
||||||
gl.clearColor(0, 0, 0, 0);
|
gl.clearColor(0, 0, 0, 0);
|
||||||
@ -337,19 +343,7 @@ function render(ts) {
|
|||||||
last_started = ts;
|
last_started = ts;
|
||||||
restart_anim = false;
|
restart_anim = false;
|
||||||
}
|
}
|
||||||
gl.uniform1f(time_loc, (ts-last_started)/1000.0);
|
gl.uniform1f(time_loc, (ts-last_started));
|
||||||
gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_BYTE, 0);
|
gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_BYTE, 0);
|
||||||
requestAnimationFrame(render);
|
gl.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRenderingContext() {
|
|
||||||
var canvas = document.querySelector("#logo-canvas");
|
|
||||||
canvas.width = 512;
|
|
||||||
canvas.height = 512;
|
|
||||||
var gl = canvas.getContext("webgl");
|
|
||||||
if (!gl) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return gl;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
|
@ -369,6 +369,8 @@ if (platform != undefined) {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="gl_logo.js"></script>
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import * as THREE from 'three';
|
import * as THREE from 'three';
|
||||||
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
|
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
|
||||||
@ -407,14 +409,12 @@ camera.position.z = 0.65;
|
|||||||
camera.position.x = 0.12;
|
camera.position.x = 0.12;
|
||||||
|
|
||||||
var clock = new THREE.Clock();
|
var clock = new THREE.Clock();
|
||||||
var render = function () {
|
var sphere_render = function () {
|
||||||
requestAnimationFrame( render );
|
|
||||||
var t = clock.getElapsedTime();
|
var t = clock.getElapsedTime();
|
||||||
var s = Math.sin(t * Math.PI / 50);
|
var s = Math.sin(t * Math.PI / 50);
|
||||||
sphere.rotation.y = (Math.PI/10) * s;
|
sphere.rotation.y = (Math.PI/10) * s;
|
||||||
renderer.render(scene, camera);
|
renderer.render(scene, camera);
|
||||||
};
|
};
|
||||||
render();
|
|
||||||
window.addEventListener('resize', function(){
|
window.addEventListener('resize', function(){
|
||||||
camera.aspect = canvas.offsetWidth/canvas.offsetHeight;
|
camera.aspect = canvas.offsetWidth/canvas.offsetHeight;
|
||||||
camera.updateProjectionMatrix();
|
camera.updateProjectionMatrix();
|
||||||
@ -502,9 +502,7 @@ xbox_scene.add(point_light);
|
|||||||
|
|
||||||
xbox_camera.position.z = 0.65;
|
xbox_camera.position.z = 0.65;
|
||||||
|
|
||||||
var clock = new THREE.Clock();
|
|
||||||
var xbox_render = function () {
|
var xbox_render = function () {
|
||||||
requestAnimationFrame( xbox_render );
|
|
||||||
var t = clock.getElapsedTime();
|
var t = clock.getElapsedTime();
|
||||||
var s = Math.sin(t * Math.PI / 50);
|
var s = Math.sin(t * Math.PI / 50);
|
||||||
if (xbox != null) {
|
if (xbox != null) {
|
||||||
@ -515,7 +513,14 @@ var xbox_render = function () {
|
|||||||
}
|
}
|
||||||
xbox_renderer.render(xbox_scene, xbox_camera);
|
xbox_renderer.render(xbox_scene, xbox_camera);
|
||||||
};
|
};
|
||||||
xbox_render();
|
|
||||||
|
var render = function () {
|
||||||
|
requestAnimationFrame( render );
|
||||||
|
sphere_render();
|
||||||
|
xbox_render();
|
||||||
|
logo_render(clock.getElapsedTime());
|
||||||
|
};
|
||||||
|
render();
|
||||||
|
|
||||||
const controls = new ArcballControls( xbox_camera, xbox_renderer.domElement, xbox_scene );
|
const controls = new ArcballControls( xbox_camera, xbox_renderer.domElement, xbox_scene );
|
||||||
|
|
||||||
@ -532,7 +537,6 @@ window.addEventListener('resize', function(){
|
|||||||
}, false);
|
}, false);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript" src="gl_logo.js"></script>
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
function updateNavbarTransparency() {
|
function updateNavbarTransparency() {
|
||||||
var nav = $(".navbar");
|
var nav = $(".navbar");
|
||||||
|
Loading…
Reference in New Issue
Block a user