@@ -30,6 +30,8 @@ var g_scenes = {}; // each of the models
30
30
var g_sceneGroups = { } ; // the placement of the models
31
31
var g_fog = true ;
32
32
var g_requestId ;
33
+ var g_frameData ;
34
+ var g_vrDisplay ;
33
35
34
36
//g_debug = true;
35
37
//g_drawOnce = true;
@@ -1101,7 +1103,8 @@ function initialize() {
1101
1103
setCanvasSize ( canvas , g . globals . width , g . globals . height ) ;
1102
1104
}
1103
1105
1104
- function render ( ) {
1106
+ function render ( elapsedTime , projectionMatrix , viewMatrix ) {
1107
+ /*
1105
1108
var now = theClock.getTime();
1106
1109
var elapsedTime;
1107
1110
if(then == 0.0) {
@@ -1115,6 +1118,7 @@ function initialize() {
1115
1118
1116
1119
g_fpsTimer.update(elapsedTime);
1117
1120
fpsElem.innerHTML = g_fpsTimer.averageFPS;
1121
+ */
1118
1122
1119
1123
// If we are running > 40hz then turn on a few more options.
1120
1124
if ( setPretty && g_fpsTimer . averageFPS > 40 ) {
@@ -1158,9 +1162,11 @@ function initialize() {
1158
1162
ambient [ 1 ] = g . globals . ambientGreen ;
1159
1163
ambient [ 2 ] = g . globals . ambientBlue ;
1160
1164
1165
+ /*
1161
1166
gl.colorMask(true, true, true, true);
1162
1167
gl.clearColor(0,0.8,1,0);
1163
1168
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
1169
+ */
1164
1170
1165
1171
var near = 1 ;
1166
1172
var far = 25000 ;
@@ -1173,20 +1179,26 @@ function initialize() {
1173
1179
var height = Math . abs ( top - bottom ) ;
1174
1180
var xOff = width * g . net . offset [ 0 ] * g . net . offsetMult ;
1175
1181
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 (
1186
1196
viewInverse ,
1187
1197
eyePosition ,
1188
1198
target ,
1189
1199
up ) ;
1200
+ }
1201
+
1190
1202
if ( g . net . slave ) {
1191
1203
// compute X fov from y fov
1192
1204
var fovy = math . degToRad ( g . globals . fieldOfView * g . net . fovFudge ) ;
@@ -1579,19 +1591,75 @@ function initialize() {
1579
1591
gl . depthMask ( true ) ;
1580
1592
}
1581
1593
1594
+ /*
1582
1595
// Set the alpha to 255.
1583
1596
gl.colorMask(false, false, false, true);
1584
1597
gl.clearColor(0,0,0,1);
1585
1598
gl.clear(gl.COLOR_BUFFER_BIT);
1599
+ */
1586
1600
1587
1601
// turn off logging after 1 frame.
1588
1602
g_logGLCalls = false ;
1589
1603
1604
+ /*
1590
1605
if (!g_drawOnce) {
1591
1606
g_requestId = tdl.webgl.requestAnimationFrame(render, canvas);
1592
1607
}
1608
+ */
1593
1609
}
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 ( ) ;
1595
1663
return true ;
1596
1664
}
1597
1665
@@ -1726,4 +1794,181 @@ $(function(){
1726
1794
main ( ) ;
1727
1795
} ) ;
1728
1796
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
+ }
1729
1972
1973
+ window . addEventListener ( 'DOMContentLoaded' , init , false ) ;
1974
+ } ) ( ) ;
0 commit comments