steveOw
steveOw

Reputation: 1021

Three.js: Viewports Misplaced going from Rev 82 to Rev 89

Using three.js Rev 82 my experimental flight simulator app showed this display (which appears as desired and supports object picking):-

Rev 82

When I altered the app to use three.js Rev 89 there were (pleasingly) zero execution errors but it produced this display (which is wrong due to misplaced viewports and consequent failures in object picking):-

Rev 89

The app uses five (5) rectangular viewports to present graphic data:- (1) An underlying viewport covering whole screen with flat black and blue rectangles; (3) Three mid-level viewports arranged left to right showing views of external world; (1) An overlying "Control Panel" viewport with textboxes, keyboard and buttons.

In going from Rev 82 to Rev 89 that the vertical positions of the mid-level and upper viewports have changed. For example the three "mid-level" viewports have moved from the upper part of the screen to the lower part. And the "Control Panel" viewport - which should be towards the bottom of the screen - has moved to near the top of the screen.

I have looked at the Migration Summary but cannot see any relevant changes. Looking at the Renderer documentation nothing obvious jumps out at me - but there is no revision history therein.


The code I am using (to define, update and render viewports) is as follows:-

function F_Render() 
{

    //... Discover the current window dimensions (usable)
    var WINDOW_USABLE_PIXELS_WIDTH = window.innerWidth;
    var WINDOW_USABLE_PIXELS_HEIGHT = window.innerHeight;

    var Fudge = 0;
    var FIXED_DOXELS_WIDTH  = 1024; 
    var FIXED_DOXELS_HEIGHT = 576; 
    var elastic_viewports = false;
    if (elastic_viewports)
        {
            var SLATE_DOXELS_WIDTH  = WINDOW_USABLE_PIXELS_WIDTH  - Fudge;
            var SLATE_DOXELS_HEIGHT = WINDOW_USABLE_PIXELS_HEIGHT - Fudge;
        }
    else
        {
            var SLATE_DOXELS_WIDTH  = FIXED_DOXELS_WIDTH  -Fudge;
            var SLATE_DOXELS_HEIGHT = FIXED_DOXELS_HEIGHT -Fudge;
        }       

    //**** NB SCREEN COORDS ORIGIN IS TOP LEFT CORNER so Y values increase DOWNWARDS *****

    //**** BUT RENDERER VIEWPORT COORDS INCREASE FROM BOTTOM LEFT

    var numMidPanels = 3;
    var mar = Math.floor( SLATE_DOXELS_HEIGHT/16 );   //...careful, changing this has knock-on effects! 
    midPanelX1min = mar;
    var fudge = SLATE_DOXELS_WIDTH*0.06;
    var fudge = 0;

    //...gives a common width value to be used by all mid panels
    var midPanelWidth        = fudge +(1/numMidPanels) * (SLATE_DOXELS_WIDTH - ((numMidPanels+1)* mar)) ;
    var midPanelAverageWidth = fudge +(1/numMidPanels) * (SLATE_DOXELS_WIDTH - ((numMidPanels+1)* mar)) ;

    var midPanelX1_Width = midPanelAverageWidth *2/3;
    var midPanelX2_Width = midPanelAverageWidth *5/3;
    var midPanelX3_Width = midPanelAverageWidth *2/3;

    //---

    var bottomPanelXmin = mar;  
    var bottomPanelYmin = mar;  
    var bottomPanelHeight = (1/3)* (SLATE_DOXELS_HEIGHT - (3*mar)); //...bottom third of screen height
    var bottomPanelWidth = (SLATE_DOXELS_WIDTH - (2*mar));  
    var midPanelHeight = (2/3)* (SLATE_DOXELS_HEIGHT - (3*mar));        
    midPanelX2min = mar + midPanelWidth + mar ;
    midPanelX3min = mar + midPanelWidth + mar + midPanelWidth + mar;    
    midPanelX2min = mar + midPanelX1_Width + mar ;
    midPanelX3min = mar + midPanelX1_Width + mar + midPanelX2_Width + mar;  
    midPanelYmin = mar + bottomPanelHeight + mar;
    midPanelYmax = mar + bottomPanelHeight + mar + midPanelHeight;  

    //... set ASPECT RATIOS

        //... BASE LAYER Scene111
        var BaseLayer_AspectRatio = SLATE_DOXELS_WIDTH/SLATE_DOXELS_HEIGHT;

        //... MIDDLE LAYER Scene222 Middle Panels

        var MidPanelX1_AspectRatio = midPanelX1_Width/midPanelHeight;
        var MidPanelX2_AspectRatio = midPanelX2_Width/midPanelHeight;
        var MidPanelX3_AspectRatio = midPanelX3_Width/midPanelHeight;

        //... TOP LAYER
        var BottomPanel_AspectRatio = bottomPanelWidth/bottomPanelHeight;

    //------------------------------------------------------------------------------------------

    //... do CAMERA UPDATES if required due to recent change
    if ( scene111camera01._SW_needsUpdate == true)
    {
    scene111camera01.aspect = BaseLayer_AspectRatio;
    scene111camera01.updateProjectionMatrix(); //...is this really neccy?
    scene111camera01._SW_needsUpdate = false;
    }

    //... MIDDLE LAYER Scene222 Middle Panels

    if ( scene222camera02._SW_needsUpdate == true)
    {
    scene222camera02.aspect = MidPanelX1_AspectRatio;
    scene222camera02.updateProjectionMatrix();
    scene222camera02._SW_needsUpdate = false;
    }

    if ( scene222camera03._SW_needsUpdate == true)
    {
    scene222camera03.aspect = MidPanelX2_AspectRatio;
    scene222camera03.updateProjectionMatrix();
    scene222camera03._SW_needsUpdate = false;
    }

    if ( scene222camera04._SW_needsUpdate == true)
    {
    scene222camera04.aspect = MidPanelX3_AspectRatio;
    scene222camera04.updateProjectionMatrix();
    scene222camera04._SW_needsUpdate = false;
    }

    //... TOP LAYER (DashBoard) Scene333

    if ( scene333camera05._SW_needsUpdate == true)
    {
    scene333camera05.aspect = BottomPanel_AspectRatio;
    scene333camera05.updateProjectionMatrix();  
    scene333camera05._SW_needsUpdate = false;
    }

    //==========================================================================================================

    //... Clear the entire raster area

    var Control_Panel_Num = 0;
    Renderer_ZERO.setViewport( 0, 0, SLATE_DOXELS_WIDTH, SLATE_DOXELS_HEIGHT );
    Renderer_ZERO.clear();

    //=========================================================================================================

    //... BASE LAYER, scene111  ... Single Panel (viewport)

    Renderer_ZERO.setViewport( 0, 0, SLATE_DOXELS_WIDTH, SLATE_DOXELS_HEIGHT ); 
    Renderer_ZERO.render( scene111, scene111camera01 );

    Control_Panel_Num = Control_Panel_Num+1;

    ObjectPickingActive=true;

    xxx = SOW_F_sim_Update_Panel_Data ( Control_Panel_Num,"BasePlane",0, 0, SLATE_DOXELS_WIDTH, SLATE_DOXELS_HEIGHT , ObjectPickingActive, scene111, scene111camera01  );   


    //===========================================================================================================

    //... MIDDLE LAYER, scene222 ... three panels (view-ports)

    Renderer_ZERO.clearDepth();


    //... MIDDLE LAYER, LEFT PANEL
    //showVP_scene222camera02  = true; //...now set elsewhere

    if (showVP_scene222camera02 == true)
    {
        Renderer_ZERO.setViewport( midPanelX1min, midPanelYmin, midPanelX1_Width , midPanelHeight  );
        Renderer_ZERO.render( scene222, scene222camera02 );

        Control_Panel_Num = Control_Panel_Num+1;
        ObjectPickingActive=true;
        xxx = SOW_F_sim_Update_Panel_Data (Control_Panel_Num,"Middle_Left",midPanelX1min, midPanelYmin, midPanelX1_Width , midPanelHeight, ObjectPickingActive, scene222, scene222camera02  );  
    }

    //... MIDDLE LAYER, CENTRE PANEL

    if (showVP_scene222camera03 == true)
    {
        var midPanelY2min = midPanelYmin  //-150 //*** JUST FOR TESTING ***
        Renderer_ZERO.setViewport( midPanelX2min, midPanelY2min, midPanelX2_Width, midPanelHeight );    
        Renderer_ZERO.render( scene222, scene222camera03 ); 

        Control_Panel_Num = Control_Panel_Num+1;
        ObjectPickingActive=true;
        xxx = SOW_F_sim_Update_Panel_Data (Control_Panel_Num,"Middle_Centre",midPanelX2min, midPanelY2min, midPanelX2_Width, midPanelHeight, ObjectPickingActive, scene222, scene222camera03  );    
    }

    if (showVP_scene222camera04 == true)
    {
        //... MIDDLE LAYER, RIGHT PANEL
        Renderer_ZERO.setViewport( midPanelX3min, midPanelYmin, midPanelX3_Width, midPanelHeight ); 
        Renderer_ZERO.render( scene222, scene222camera04 );     

        Control_Panel_Num = Control_Panel_Num+1;
        ObjectPickingActive=true;
        xxx = SOW_F_sim_Update_Panel_Data (Control_Panel_Num,"Middle_Right",midPanelX3min, midPanelYmin, midPanelX3_Width, midPanelHeight, ObjectPickingActive, scene222, scene222camera04  );  
    }

    //================================================================================================

    //... TOP LAYER Scene333
    //... THIS LAYER CONTAINS BUTTONS WHICH OVERPLOT MID LAYER 
    //... (Multi-renderers only: display stack sequence controlled by html div declaration sequence).
    //... UPPER LAYER (C)
    //   (DASHBOARD) ...BOTTOM STRIP

    //TEST
    //bottomPanelXmin
    //bottomPanelYmin=100; 
    //bottomPanelWidth
    //bottomPanelHeight= 300 ;
    //END TEST

    //TEST makes bottom panel viewport overlap upwards over the middle panels just to demo that we can do this
    // and thus we can stick objects in a high viewport which display in front of objects from a lower viewport
    // but NOTE WELL this only works reliably when VPs are from different scenes/renderers
    // otherwise conflicts can occur.

    var Fudged_bottomPanelHeight=bottomPanelHeight+40;

    Renderer_ZERO.clearDepth();
    Renderer_ZERO.setViewport( bottomPanelXmin, bottomPanelYmin, bottomPanelWidth, Fudged_bottomPanelHeight );  
    Renderer_ZERO.render( scene333, scene333camera05 );

    Control_Panel_Num = Control_Panel_Num+1;
    ObjectPickingActive=true;
    xxx = SOW_F_sim_Update_Panel_Data (Control_Panel_Num,"Bottom_Strip",bottomPanelXmin, bottomPanelYmin, bottomPanelWidth, Fudged_bottomPanelHeight, ObjectPickingActive, scene333, scene333camera05  );   

} //... END OF F_Render

I'd be grateful if anyone can suggest what changes in three.js may have caused this problem?

Upvotes: 0

Views: 78

Answers (1)

WestLangley
WestLangley

Reputation: 104833

As of r.86, WebGLRenderer.setViewport() and WebGLRenderer.setScissor() assume a coordinate systems where ( 0,0 ) is the top left. Previously, it was bottom left.

three.js r.89

Upvotes: 1

Related Questions