Skip to content

Commit

Permalink
[HTML] Added web page to showcase WebGL support.
Browse files Browse the repository at this point in the history
- Main index.html file merely redirects to docu/WebPage folder.
- Added simple web page showcasing two working WebGL examples: Animation and Fonts.
  • Loading branch information
LukasBanana committed Aug 23, 2024
1 parent 4a280e7 commit 844db91
Show file tree
Hide file tree
Showing 12 changed files with 3,153 additions and 0 deletions.
2,652 changes: 2,652 additions & 0 deletions docu/WebPage/Example_Animation/Example_Animation.data

Large diffs are not rendered by default.

179 changes: 179 additions & 0 deletions docu/WebPage/Example_Animation/Example_Animation.data.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@

var Module = typeof Module !== 'undefined' ? Module : {};

if (!Module.expectedDataFileDownloads) {
Module.expectedDataFileDownloads = 0;
}

Module.expectedDataFileDownloads++;
(function() {
// Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context.
if (Module['ENVIRONMENT_IS_PTHREAD'] || Module['$ww']) return;
var loadPackage = function(metadata) {

var PACKAGE_PATH = '';
if (typeof window === 'object') {
PACKAGE_PATH = window['encodeURIComponent'](window.location.pathname.toString().substring(0, window.location.pathname.toString().lastIndexOf('/')) + '/');
} else if (typeof process === 'undefined' && typeof location !== 'undefined') {
// web worker
PACKAGE_PATH = encodeURIComponent(location.pathname.toString().substring(0, location.pathname.toString().lastIndexOf('/')) + '/');
}
var PACKAGE_NAME = 'Example_Animation.data';
var REMOTE_PACKAGE_BASE = 'Example_Animation.data';
if (typeof Module['locateFilePackage'] === 'function' && !Module['locateFile']) {
Module['locateFile'] = Module['locateFilePackage'];
err('warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)');
}
var REMOTE_PACKAGE_NAME = Module['locateFile'] ? Module['locateFile'](REMOTE_PACKAGE_BASE, '') : REMOTE_PACKAGE_BASE;
var REMOTE_PACKAGE_SIZE = metadata['remote_package_size'];

function fetchRemotePackage(packageName, packageSize, callback, errback) {
if (typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string') {
require('fs').readFile(packageName, function(err, contents) {
if (err) {
errback(err);
} else {
callback(contents.buffer);
}
});
return;
}
var xhr = new XMLHttpRequest();
xhr.open('GET', packageName, true);
xhr.responseType = 'arraybuffer';
xhr.onprogress = function(event) {
var url = packageName;
var size = packageSize;
if (event.total) size = event.total;
if (event.loaded) {
if (!xhr.addedTotal) {
xhr.addedTotal = true;
if (!Module.dataFileDownloads) Module.dataFileDownloads = {};
Module.dataFileDownloads[url] = {
loaded: event.loaded,
total: size
};
} else {
Module.dataFileDownloads[url].loaded = event.loaded;
}
var total = 0;
var loaded = 0;
var num = 0;
for (var download in Module.dataFileDownloads) {
var data = Module.dataFileDownloads[download];
total += data.total;
loaded += data.loaded;
num++;
}
total = Math.ceil(total * Module.expectedDataFileDownloads/num);
if (Module['setStatus']) Module['setStatus'](`Downloading data... (${loaded}/${total})`);
} else if (!Module.dataFileDownloads) {
if (Module['setStatus']) Module['setStatus']('Downloading data...');
}
};
xhr.onerror = function(event) {
throw new Error("NetworkError for: " + packageName);
}
xhr.onload = function(event) {
if (xhr.status == 200 || xhr.status == 304 || xhr.status == 206 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
var packageData = xhr.response;
callback(packageData);
} else {
throw new Error(xhr.statusText + " : " + xhr.responseURL);
}
};
xhr.send(null);
};

function handleError(error) {
console.error('package error:', error);
};

var fetchedCallback = null;
var fetched = Module['getPreloadedPackage'] ? Module['getPreloadedPackage'](REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE) : null;

if (!fetched) fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, function(data) {
if (fetchedCallback) {
fetchedCallback(data);
fetchedCallback = null;
} else {
fetched = data;
}
}, handleError);

function runWithFS() {

function assert(check, msg) {
if (!check) throw msg + new Error().stack;
}
Module['FS_createPath']("/", "assets", true, true);

/** @constructor */
function DataRequest(start, end, audio) {
this.start = start;
this.end = end;
this.audio = audio;
}
DataRequest.prototype = {
requests: {},
open: function(mode, name) {
this.name = name;
this.requests[name] = this;
Module['addRunDependency'](`fp ${this.name}`);
},
send: function() {},
onload: function() {
var byteArray = this.byteArray.subarray(this.start, this.end);
this.finish(byteArray);
},
finish: function(byteArray) {
var that = this;
// canOwn this data in the filesystem, it is a slide into the heap that will never change
Module['FS_createDataFile'](this.name, null, byteArray, true, true, true);
Module['removeRunDependency'](`fp ${that.name}`);
this.requests[this.name] = null;
}
};

var files = metadata['files'];
for (var i = 0; i < files.length; ++i) {
new DataRequest(files[i]['start'], files[i]['end'], files[i]['audio'] || 0).open('GET', files[i]['filename']);
}

function processPackageData(arrayBuffer) {
assert(arrayBuffer, 'Loading data file failed.');
assert(arrayBuffer.constructor.name === ArrayBuffer.name, 'bad input to processPackageData');
var byteArray = new Uint8Array(arrayBuffer);
var curr;
// Reuse the bytearray from the XHR as the source for file reads.
DataRequest.prototype.byteArray = byteArray;
var files = metadata['files'];
for (var i = 0; i < files.length; ++i) {
DataRequest.prototype.requests[files[i].filename].onload();
} Module['removeRunDependency']('datafile_Example_Animation.data');

};
Module['addRunDependency']('datafile_Example_Animation.data');

if (!Module.preloadResults) Module.preloadResults = {};

Module.preloadResults[PACKAGE_NAME] = {fromCache: false};
if (fetched) {
processPackageData(fetched);
fetched = null;
} else {
fetchedCallback = processPackageData;
}

}
if (Module['calledRun']) {
runWithFS();
} else {
if (!Module['preRun']) Module['preRun'] = [];
Module["preRun"].push(runWithFS); // FS is not initialized yet, wait for it
}

}
loadPackage({"files": [{"filename": "/assets/Example.450core.frag", "start": 0, "end": 1247}, {"filename": "/assets/Example.450core.vert", "start": 1247, "end": 1962}, {"filename": "/assets/Example.frag", "start": 1962, "end": 3059}, {"filename": "/assets/Example.vert", "start": 3059, "end": 3630}, {"filename": "/assets/IcoSphere.obj", "start": 3630, "end": 20796}, {"filename": "/assets/PenroseStairs-Bottom.obj", "start": 20796, "end": 30108}, {"filename": "/assets/PenroseStairs-Top.obj", "start": 30108, "end": 39182}, {"filename": "/assets/TilesGray512.jpg", "start": 39182, "end": 253540}], "remote_package_size": 253540});

})();
1 change: 1 addition & 0 deletions docu/WebPage/Example_Animation/Example_Animation.js

Large diffs are not rendered by default.

Binary file not shown.
49 changes: 49 additions & 0 deletions docu/WebPage/Example_Animation/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>LLGL - Animation</title>
<style>
h1 {
font-family: Arial, Helvetica, sans-serif;
}
canvas {
display: block;
padding: 0;
margin: auto;
width: 70%;
}
</style>
</head>
<body>
<!-- Create canvas that C++ code will draw into -->
<div style="text-align: center;">
<h1>WebGL Example with LLGL</h1>
<canvas id="canvas" oncontextmenu="event.preventDefault()" width="800" height="600"></canvas>
</div>

<!-- Define module to allow C++ code to access the canvas element -->
<script type="text/javascript">
var Module = {
print: function() {
var e = document.getElementById("output");
return e && (e.value = ""), (...t) => {
var n = t.join(" ");
console.log(n), e && (e.value += n + "\n", e.scrollTop = e.scrollHeight)
}
}(),
canvas: (() => {
var e = document.getElementById("canvas");
return e.addEventListener("webglcontextlost", (e => {
alert("WebGL context lost. You will need to reload the page."), e.preventDefault()
}), !1), e
})()
};
</script>

<!-- Add JavaScript glue code generated by Emscripten -->
<script src=Example_Animation.data.js></script>
<script src=Example_Animation.js></script>
</body>
</html>
Binary file added docu/WebPage/Example_Fonts/Example_Fonts.data
Binary file not shown.
Loading

0 comments on commit 844db91

Please sign in to comment.