@@ -26,6 +26,10 @@ if (isMultiviewSupportEnabled()) {
26
26
g . options . useMultiview = { enabled : true , text : 'Use multiview' } ;
27
27
}
28
28
29
+ function useMultiviewForStereo ( ) {
30
+ return multiview && g . options . useMultiview . enabled ;
31
+ }
32
+
29
33
// globals
30
34
var gl ; // the gl context.
31
35
var multiview ; // multiview extension.
@@ -70,6 +74,7 @@ var benchRunTime = "runFor";
70
74
var numFish = "numFish" ;
71
75
var featureFlags = "featureFlags" ;
72
76
var g_stereoDemoActive = false ;
77
+ var g_shadersNeedUpdate = false ; // Set to true whenever the state has changed so that shaders may need to be changed.
73
78
74
79
var g_requestId ;
75
80
var g_syncManager ;
@@ -1522,13 +1527,6 @@ function initialize() {
1522
1527
var lightRayConstInUse = useMultiview ? lightRayConstMultiview : lightRayConst ;
1523
1528
var fishConstInUse = useMultiview ? fishConstMultiview : fishConst ;
1524
1529
1525
- // If we are running > 40hz then turn on a few more options.
1526
- if ( setPretty && g_fpsTimer . averageFPS > 40 ) {
1527
- setPretty = false ;
1528
- if ( ! g . options . normalMaps . enabled ) { g . options . normalMaps . toggle ( ) ; }
1529
- if ( ! g . options . reflection . enabled ) { g . options . reflection . toggle ( ) ; }
1530
- }
1531
-
1532
1530
ambient [ 0 ] = g . globals . ambientRed ;
1533
1531
ambient [ 1 ] = g . globals . ambientGreen ;
1534
1532
ambient [ 2 ] = g . globals . ambientBlue ;
@@ -1911,14 +1909,12 @@ function initialize() {
1911
1909
}
1912
1910
1913
1911
function renderStereo ( leftProjectionMatrix , rightProjectionMatrix , viewInverseMatrix , pose ) {
1914
- var useMultiview = multiview && g . options . useMultiview . enabled ;
1915
- if ( useMultiview ) {
1912
+ if ( useMultiviewForStereo ( ) ) {
1916
1913
setupMultiviewFbIfNeeded ( ) ;
1917
1914
var halfWidth = Math . floor ( canvas . width * 0.5 ) ;
1918
1915
gl . bindFramebuffer ( gl . FRAMEBUFFER , g_multiviewFb ) ;
1919
1916
gl . viewport ( 0 , 0 , halfWidth , canvas . height ) ;
1920
1917
gl . disable ( gl . SCISSOR_TEST ) ;
1921
- setShaders ( true ) ;
1922
1918
render ( [ leftProjectionMatrix , rightProjectionMatrix ] , viewInverseMatrix , true , pose ) ;
1923
1919
1924
1920
gl . bindFramebuffer ( gl . DRAW_FRAMEBUFFER , null ) ;
@@ -1929,7 +1925,6 @@ function initialize() {
1929
1925
} else { // not multiview
1930
1926
gl . viewport ( 0 , 0 , canvas . width * 0.5 , canvas . height ) ;
1931
1927
gl . enable ( gl . SCISSOR_TEST ) ;
1932
- setShaders ( false ) ;
1933
1928
gl . scissor ( 0 , 0 , canvas . width * 0.5 , canvas . height ) ;
1934
1929
render ( leftProjectionMatrix , viewInverseMatrix , false , pose ) ;
1935
1930
@@ -1979,7 +1974,6 @@ function initialize() {
1979
1974
1980
1975
gl . disable ( gl . SCISSOR_TEST ) ;
1981
1976
gl . viewport ( 0 , 0 , gl . drawingBufferWidth , gl . drawingBufferHeight ) ;
1982
- setShaders ( false ) ;
1983
1977
render ( monoProjection , viewInverseTemp ) ;
1984
1978
}
1985
1979
@@ -2034,13 +2028,26 @@ function initialize() {
2034
2028
g_fpsTimer . update ( elapsedTime ) ;
2035
2029
fpsElem . innerHTML = g_fpsTimer . averageFPS ;
2036
2030
2031
+ // If we are running > 40hz then turn on a few more options.
2032
+ if ( setPretty && g_fpsTimer . averageFPS > 40 ) {
2033
+ setPretty = false ;
2034
+ if ( ! g . options . normalMaps . enabled ) { g . options . normalMaps . toggle ( ) ; }
2035
+ if ( ! g . options . reflection . enabled ) { g . options . reflection . toggle ( ) ; }
2036
+ }
2037
+
2037
2038
if ( g_vrDisplay ) {
2038
2039
g_requestId = g_vrDisplay . requestAnimationFrame ( onAnimationFrame ) ;
2039
2040
g_vrDisplay . getFrameData ( g_frameData ) ;
2040
2041
} else {
2041
2042
g_requestId = tdl . webgl . requestAnimationFrame ( onAnimationFrame , canvas ) ;
2042
2043
}
2043
2044
2045
+ if ( g_shadersNeedUpdate ) {
2046
+ var isInStereoMode = ( g_vrDisplay && g_vrDisplay . isPresenting ) || g_stereoDemoActive ;
2047
+ setShaders ( isInStereoMode && useMultiviewForStereo ( ) ) ;
2048
+ g_shadersNeedUpdate = false ;
2049
+ }
2050
+
2044
2051
if ( g_vrDisplay && g_vrDisplay . isPresenting ) {
2045
2052
/* VR UI is enabled in VR Mode. VR UI has two mode, menu mode is the mirror of control panel of
2046
2053
* aquarium and non-menu mode may presents fps(could be turn off) in front of user. These two
@@ -2054,10 +2061,8 @@ function initialize() {
2054
2061
// Query gamepad button clicked event.
2055
2062
g_vrUi . queryGamepadStatus ( ) ;
2056
2063
2057
- var useMultiview = multiview && g . options . useMultiview . enabled ;
2058
-
2059
2064
// TODO: Support VRUI when doing multiview rendering.
2060
- if ( ! useMultiview && g_vrUi . isMenuMode ) {
2065
+ if ( ! useMultiviewForStereo ( ) && g_vrUi . isMenuMode ) {
2061
2066
2062
2067
// When VR UI in menu mode, UI need a cursor to help user do select operation. Currently, cursor uses
2063
2068
// head-neck model which means a point in front of user and user could move the point by rotating their head(with HMD).
@@ -2227,6 +2232,7 @@ function initUIStuff() {
2227
2232
options [ name ] = { enabled :! option . enabled } ;
2228
2233
setSettings ( { options :options } ) ;
2229
2234
elem . style . color = option . enabled ? "red" : "gray" ;
2235
+ g_shadersNeedUpdate = true ;
2230
2236
}
2231
2237
2232
2238
var optionsContainer = document . getElementById ( "optionsContainer" ) ;
@@ -2425,6 +2431,8 @@ $(function(){
2425
2431
// to the recommended dimensions for the display.
2426
2432
resize ( ) ;
2427
2433
2434
+ g_shadersNeedUpdate = true ;
2435
+
2428
2436
if ( g_vrDisplay . isPresenting ) {
2429
2437
if ( g_vrDisplay . capabilities . hasExternalDisplay ) {
2430
2438
removeButton ( vrButton ) ;
@@ -2455,6 +2463,7 @@ $(function(){
2455
2463
2456
2464
function toggleStereoDemo ( ) {
2457
2465
g_stereoDemoActive = ! g_stereoDemoActive ;
2466
+ g_shadersNeedUpdate = true ;
2458
2467
}
2459
2468
2460
2469
function resize ( ) {
@@ -2514,7 +2523,7 @@ $(function(){
2514
2523
}
2515
2524
}
2516
2525
// Regardless of if we have WebVR support, we can demonstrate stereo rendering inside the window.
2517
- stereoDemoButton = addButton ( "Toggle Stereo Demo" , "E " , getCurrentUrl ( ) + "/vr_assets/button.png" , toggleStereoDemo ) ;
2526
+ stereoDemoButton = addButton ( "Toggle Stereo Demo" , "" , getCurrentUrl ( ) + "/vr_assets/button.png" , toggleStereoDemo ) ;
2518
2527
}
2519
2528
window . addEventListener ( 'resize' , function ( ) { onResize ( ) ; } , false ) ;
2520
2529
onResize ( ) ;
0 commit comments