Skip to content

Commit a7616e3

Browse files
committed
Prototype to enable aquarium vr mode. Currently do not support view change so remove this function temporarily.
1 parent f559700 commit a7616e3

File tree

3 files changed

+259
-12
lines changed

3 files changed

+259
-12
lines changed

aquarium-vr/aquarium-vr.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@
128128
<div class="clickable" id="setSetting6">1000</div>
129129
<div class="clickable" id="setSetting7">2000</div>
130130
<div class="clickable" id="setSetting8">4000</div>
131+
<!--
131132
<div class="clickable" id="setSetting9">Change View</div>
133+
-->
132134
<div class="clickable" id="setSetting10">Advanced</div>
133135
<div class="clickable" id="options">Options...
134136
<div id="optionsContainer">

aquarium-vr/aquarium-vr.js

Lines changed: 257 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ var g_scenes = {}; // each of the models
3030
var g_sceneGroups = {}; // the placement of the models
3131
var g_fog = true;
3232
var g_requestId;
33+
var g_frameData;
34+
var g_vrDisplay;
3335

3436
//g_debug = true;
3537
//g_drawOnce = true;
@@ -1101,7 +1103,8 @@ function initialize() {
11011103
setCanvasSize(canvas, g.globals.width, g.globals.height);
11021104
}
11031105

1104-
function render() {
1106+
function render(elapsedTime, projectionMatrix, viewMatrix) {
1107+
/*
11051108
var now = theClock.getTime();
11061109
var elapsedTime;
11071110
if(then == 0.0) {
@@ -1115,6 +1118,7 @@ function initialize() {
11151118
11161119
g_fpsTimer.update(elapsedTime);
11171120
fpsElem.innerHTML = g_fpsTimer.averageFPS;
1121+
*/
11181122

11191123
// If we are running > 40hz then turn on a few more options.
11201124
if (setPretty && g_fpsTimer.averageFPS > 40) {
@@ -1158,9 +1162,11 @@ function initialize() {
11581162
ambient[1] = g.globals.ambientGreen;
11591163
ambient[2] = g.globals.ambientBlue;
11601164

1165+
/*
11611166
gl.colorMask(true, true, true, true);
11621167
gl.clearColor(0,0.8,1,0);
11631168
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
1169+
*/
11641170

11651171
var near = 1;
11661172
var far = 25000;
@@ -1173,20 +1179,26 @@ function initialize() {
11731179
var height = Math.abs(top - bottom);
11741180
var xOff = width * g.net.offset[0] * g.net.offsetMult;
11751181
var yOff = height * g.net.offset[1] * g.net.offsetMult;
1176-
fast.matrix4.frustum(
1177-
projection,
1178-
left + xOff,
1179-
right + xOff,
1180-
bottom + yOff,
1181-
top + yOff,
1182-
near,
1183-
far);
1184-
1185-
fast.matrix4.cameraLookAt(
1182+
if (g_vrDisplay && g_vrDisplay.isPresenting) {
1183+
fast.matrix4.copy(projection, projectionMatrix);
1184+
fast.matrix4.inverse(viewInverse, viewMatrix);
1185+
} else {
1186+
fast.matrix4.frustum(
1187+
projection,
1188+
left + xOff,
1189+
right + xOff,
1190+
bottom + yOff,
1191+
top + yOff,
1192+
near,
1193+
far);
1194+
1195+
fast.matrix4.cameraLookAt(
11861196
viewInverse,
11871197
eyePosition,
11881198
target,
11891199
up);
1200+
}
1201+
11901202
if (g.net.slave) {
11911203
// compute X fov from y fov
11921204
var fovy = math.degToRad(g.globals.fieldOfView * g.net.fovFudge);
@@ -1579,19 +1591,75 @@ function initialize() {
15791591
gl.depthMask(true);
15801592
}
15811593

1594+
/*
15821595
// Set the alpha to 255.
15831596
gl.colorMask(false, false, false, true);
15841597
gl.clearColor(0,0,0,1);
15851598
gl.clear(gl.COLOR_BUFFER_BIT);
1599+
*/
15861600

15871601
// turn off logging after 1 frame.
15881602
g_logGLCalls = false;
15891603

1604+
/*
15901605
if (!g_drawOnce) {
15911606
g_requestId = tdl.webgl.requestAnimationFrame(render, canvas);
15921607
}
1608+
*/
15931609
}
1594-
render();
1610+
1611+
function onAnimationFrame() {
1612+
var now = theClock.getTime();
1613+
var elapsedTime;
1614+
if(then == 0.0) {
1615+
elapsedTime = 0.0;
1616+
} else {
1617+
elapsedTime = now - then;
1618+
}
1619+
then = now;
1620+
1621+
frameCount++;
1622+
1623+
g_fpsTimer.update(elapsedTime);
1624+
fpsElem.innerHTML = g_fpsTimer.averageFPS;
1625+
1626+
gl.colorMask(true, true, true, true);
1627+
gl.clearColor(0,0.8,1,0);
1628+
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
1629+
1630+
if (g_vrDisplay) {
1631+
if (!g_drawOnce) {
1632+
g_requestId = g_vrDisplay.requestAnimationFrame(onAnimationFrame);
1633+
}
1634+
g_vrDisplay.getFrameData(g_frameData);
1635+
if (g_vrDisplay.isPresenting) {
1636+
gl.viewport(0, 0, canvas.width * 0.5, canvas.height);
1637+
render(elapsedTime, g_frameData.leftProjectionMatrix, g_frameData.leftViewMatrix);
1638+
1639+
gl.viewport(canvas.width * 0.5, 0, canvas.width * 0.5, canvas.height);
1640+
render(elapsedTime, g_frameData.rightProjectionMatrix, g_frameData.rightViewMatrix);
1641+
1642+
g_vrDisplay.submitFrame();
1643+
} else {
1644+
gl.viewport(0, 0, canvas.width, canvas.height);
1645+
render(elapsedTime);
1646+
}
1647+
} else {
1648+
if (!g_drawOnce) {
1649+
g_requestId = tdl.webgl.requestAnimationFrame(onAnimationFrame, canvas);
1650+
}
1651+
gl.viewport(0, 0, canvas.width, canvas.height);
1652+
render(elapsedTime);
1653+
}
1654+
1655+
// Set the alpha to 255.
1656+
gl.colorMask(false, false, false, true);
1657+
gl.clearColor(0,0,0,1);
1658+
gl.clear(gl.COLOR_BUFFER_BIT);
1659+
}
1660+
1661+
//render();
1662+
onAnimationFrame();
15951663
return true;
15961664
}
15971665

@@ -1726,4 +1794,181 @@ $(function(){
17261794
main();
17271795
});
17281796

1797+
VR = (function() {
1798+
"use strict";
1799+
var vrButton;
1800+
1801+
function getButtonContainer () {
1802+
var buttonContainer = document.getElementById("vr-button-container");
1803+
if (!buttonContainer) {
1804+
buttonContainer = document.createElement("div");
1805+
buttonContainer.id = "vr-button-container";
1806+
buttonContainer.style.fontFamily = "sans-serif";
1807+
buttonContainer.style.position = "absolute";
1808+
buttonContainer.style.zIndex = "999";
1809+
buttonContainer.style.left = "0";
1810+
buttonContainer.style.bottom = "0";
1811+
buttonContainer.style.right = "0";
1812+
buttonContainer.style.margin = "0";
1813+
buttonContainer.style.padding = "0";
1814+
buttonContainer.align = "right";
1815+
document.body.appendChild(buttonContainer);
1816+
}
1817+
return buttonContainer;
1818+
}
1819+
1820+
function addButtonElement (message, key, icon) {
1821+
var buttonElement = document.createElement("div");
1822+
buttonElement.classList.add = "vr-button";
1823+
buttonElement.style.color = "#FFF";
1824+
buttonElement.style.fontWeight = "bold";
1825+
buttonElement.style.backgroundColor = "#888";
1826+
buttonElement.style.borderRadius = "5px";
1827+
buttonElement.style.border = "3px solid #555";
1828+
buttonElement.style.position = "relative";
1829+
buttonElement.style.display = "inline-block";
1830+
buttonElement.style.margin = "0.5em";
1831+
buttonElement.style.padding = "0.75em";
1832+
buttonElement.style.cursor = "pointer";
1833+
buttonElement.align = "center";
1834+
1835+
if (icon) {
1836+
buttonElement.innerHTML = "<img src='" + icon + "'/><br/>" + message;
1837+
} else {
1838+
buttonElement.innerHTML = message;
1839+
}
1840+
1841+
if (key) {
1842+
var keyElement = document.createElement("span");
1843+
keyElement.classList.add = "vr-button-accelerator";
1844+
keyElement.style.fontSize = "0.75em";
1845+
keyElement.style.fontStyle = "italic";
1846+
keyElement.innerHTML = " (" + key + ")";
1847+
1848+
buttonElement.appendChild(keyElement);
1849+
}
1850+
1851+
getButtonContainer().appendChild(buttonElement);
1852+
1853+
return buttonElement;
1854+
}
1855+
1856+
function addButton (message, key, icon, callback) {
1857+
var keyListener = null;
1858+
if (key) {
1859+
var keyCode = key.charCodeAt(0);
1860+
keyListener = function (event) {
1861+
if (event.keyCode === keyCode) {
1862+
callback(event);
1863+
}
1864+
};
1865+
document.addEventListener("keydown", keyListener, false);
1866+
}
1867+
var element = addButtonElement(message, key, icon);
1868+
element.addEventListener("click", function (event) {
1869+
callback(event);
1870+
event.preventDefault();
1871+
}, false);
1872+
1873+
return {
1874+
element: element,
1875+
keyListener: keyListener
1876+
};
1877+
}
1878+
1879+
function removeButton (button) {
1880+
if (!button)
1881+
return;
1882+
if (button.element.parentElement)
1883+
button.element.parentElement.removeChild(button.element);
1884+
if (button.keyListener)
1885+
document.removeEventListener("keydown", button.keyListener, false);
1886+
}
1887+
1888+
function getCurrentUrl() {
1889+
var path = window.location.pathname;
1890+
return path.substring(0, path.lastIndexOf('/'));
1891+
}
1892+
1893+
function onPresentChange() {
1894+
// When we begin or end presenting, the canvas should be resized
1895+
// to the recommended dimensions for the display.
1896+
onResize();
1897+
1898+
if (g_vrDisplay.isPresenting) {
1899+
if (g_vrDisplay.capabilities.hasExternalDisplay) {
1900+
removeButton(vrButton);
1901+
vrButton = addButton("Exit VR", "E", getCurrentUrl() + "/vr_assets/button.png", onExitPresent);
1902+
}
1903+
} else {
1904+
if (g_vrDisplay.capabilities.hasExternalDisplay) {
1905+
removeButton(vrButton);
1906+
vrButton = addButton("Enter VR", "E", getCurrentUrl() + "/vr_assets/button.png", onRequestPresent);
1907+
}
1908+
}
1909+
}
1910+
1911+
function onRequestPresent() {
1912+
g_vrDisplay.requestPresent([{ source: canvas }]).then(function() {}, function() {
1913+
console.error("request present failed.");
1914+
});
1915+
}
1916+
1917+
function onExitPresent() {
1918+
if (!g_vrDisplay.isPresenting)
1919+
return;
1920+
1921+
g_vrDisplay.exitPresent().then(function() {}, function() {
1922+
console.error("exit present failed.");
1923+
});
1924+
}
1925+
1926+
function onResize() {
1927+
if (g_vrDisplay && g_vrDisplay.isPresenting) {
1928+
// If we're presenting we want to use the drawing buffer size
1929+
// recommended by the VRDisplay, since that will ensure the best
1930+
// results post-distortion.
1931+
var leftEye = g_vrDisplay.getEyeParameters("left");
1932+
var rightEye = g_vrDisplay.getEyeParameters("right");
1933+
1934+
canvas.width = Math.max(leftEye.renderWidth, rightEye.renderWidth) * 2;
1935+
canvas.height = Math.max(leftEye.renderHeight, rightEye.renderHeight);
1936+
} else {
1937+
// When we're not presenting, we want to change the size of the canvas
1938+
// to match the window dimensions.
1939+
canvas.width = canvas.offsetWidth * window.devicePixelRatio;
1940+
canvas.height = canvas.offsetHeight * window.devicePixelRatio;
1941+
}
1942+
}
1943+
1944+
function init() {
1945+
if(navigator.getVRDisplays) {
1946+
g_frameData = new VRFrameData();
1947+
1948+
navigator.getVRDisplays().then(function(displays) {
1949+
if (displays.length > 0) {
1950+
g_vrDisplay = displays[0];
1951+
g_vrDisplay.depthNear = 0.1;
1952+
g_vrDisplay.depthFar = 1024.0;
1953+
1954+
if (g_vrDisplay.capabilities.canPresent) {
1955+
vrButton = addButton("Enter VR", "E", getCurrentUrl() + "/vr_assets/button.png", onRequestPresent);
1956+
}
1957+
1958+
window.addEventListener('vrdisplaypresentchange', onPresentChange, false);
1959+
window.addEventListener('vrdisplayactivate', onRequestPresent, false);
1960+
window.addEventListener('vrdisplaydeactivate', onExitPresent, false);
1961+
window.addEventListener('resize', function() {onResize();}, false);
1962+
} else {
1963+
console.log("WebVR supported, but no VRDisplays found.")
1964+
}
1965+
});
1966+
} else if (navigator.getVRDevices) {
1967+
console.log("Your browser supports WebVR but not the latest version. See webvr.info for more info.");
1968+
} else {
1969+
console.log("Your browser does not support WebVR. See webvr.info for assistance");
1970+
}
1971+
}
17291972

1973+
window.addEventListener('DOMContentLoaded', init, false);
1974+
})();

aquarium-vr/vr_assets/button.png

788 Bytes
Loading

0 commit comments

Comments
 (0)