Commit 4c20fb4c authored by jean-pierre charras's avatar jean-pierre charras
Browse files

3d-viewer: code cleaning.

parent 5e032ef0
Loading
Loading
Loading
Loading
+54 −79
Original line number Original line Diff line number Diff line
@@ -161,7 +161,7 @@ void EDA_3D_CANVAS::OnChar( wxKeyEvent& event )
void EDA_3D_CANVAS::SetView3D( int keycode )
void EDA_3D_CANVAS::SetView3D( int keycode )
{
{
    int    ii;
    int    ii;
    double delta_move = 0.7 * g_Parm_3D_Visu.m_Zoom;
    double delta_move = 0.7 * GetPrm3DVisu().m_Zoom;


    switch( keycode )
    switch( keycode )
    {
    {
@@ -182,22 +182,22 @@ void EDA_3D_CANVAS::SetView3D( int keycode )
        break;
        break;


    case WXK_HOME:
    case WXK_HOME:
        g_Parm_3D_Visu.m_Zoom = 1.0;
        GetPrm3DVisu().m_Zoom = 1.0;
        m_draw3dOffset.x = m_draw3dOffset.y = 0;
        m_draw3dOffset.x = m_draw3dOffset.y = 0;
        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        break;
        break;


    case WXK_END:
    case WXK_END:
        break;
        break;


    case WXK_F1:
    case WXK_F1:
        g_Parm_3D_Visu.m_Zoom /= 1.4;
        GetPrm3DVisu().m_Zoom /= 1.4;
        if( g_Parm_3D_Visu.m_Zoom <= 0.01 )
        if( GetPrm3DVisu().m_Zoom <= 0.01 )
            g_Parm_3D_Visu.m_Zoom = 0.01;
            GetPrm3DVisu().m_Zoom = 0.01;
        break;
        break;


    case WXK_F2:
    case WXK_F2:
        g_Parm_3D_Visu.m_Zoom *= 1.4;
        GetPrm3DVisu().m_Zoom *= 1.4;
        break;
        break;


    case '+':
    case '+':
@@ -210,59 +210,59 @@ void EDA_3D_CANVAS::SetView3D( int keycode )
    case 'R':
    case 'R':
        m_draw3dOffset.x = m_draw3dOffset.y = 0;
        m_draw3dOffset.x = m_draw3dOffset.y = 0;
        for( ii = 0; ii < 4; ii++ )
        for( ii = 0; ii < 4; ii++ )
            g_Parm_3D_Visu.m_Rot[ii] = 0.0;
            GetPrm3DVisu().m_Rot[ii] = 0.0;


        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        break;
        break;


    case 'x':
    case 'x':
        for( ii = 0; ii < 4; ii++ )
        for( ii = 0; ii < 4; ii++ )
            g_Parm_3D_Visu.m_Rot[ii] = 0.0;
            GetPrm3DVisu().m_Rot[ii] = 0.0;


        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        g_Parm_3D_Visu.m_ROTZ = -90;
        GetPrm3DVisu().m_ROTZ = -90;
        g_Parm_3D_Visu.m_ROTX = -90;
        GetPrm3DVisu().m_ROTX = -90;
        break;
        break;


    case 'X':
    case 'X':
        for( ii = 0; ii < 4; ii++ )
        for( ii = 0; ii < 4; ii++ )
            g_Parm_3D_Visu.m_Rot[ii] = 0.0;
            GetPrm3DVisu().m_Rot[ii] = 0.0;


        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        g_Parm_3D_Visu.m_ROTZ = 90;
        GetPrm3DVisu().m_ROTZ = 90;
        g_Parm_3D_Visu.m_ROTX = -90;
        GetPrm3DVisu().m_ROTX = -90;
        break;
        break;


    case 'y':
    case 'y':
        for( ii = 0; ii < 4; ii++ )
        for( ii = 0; ii < 4; ii++ )
            g_Parm_3D_Visu.m_Rot[ii] = 0.0;
            GetPrm3DVisu().m_Rot[ii] = 0.0;


        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        g_Parm_3D_Visu.m_ROTX = -90;
        GetPrm3DVisu().m_ROTX = -90;
        break;
        break;


    case 'Y':
    case 'Y':
        for( ii = 0; ii < 4; ii++ )
        for( ii = 0; ii < 4; ii++ )
            g_Parm_3D_Visu.m_Rot[ii] = 0.0;
            GetPrm3DVisu().m_Rot[ii] = 0.0;


        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        g_Parm_3D_Visu.m_ROTX = -90;
        GetPrm3DVisu().m_ROTX = -90;
        g_Parm_3D_Visu.m_ROTZ = -180;
        GetPrm3DVisu().m_ROTZ = -180;
        break;
        break;


    case 'z':
    case 'z':
        for( ii = 0; ii < 4; ii++ )
        for( ii = 0; ii < 4; ii++ )
            g_Parm_3D_Visu.m_Rot[ii] = 0.0;
            GetPrm3DVisu().m_Rot[ii] = 0.0;


        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        break;
        break;


    case 'Z':
    case 'Z':
        for( ii = 0; ii < 4; ii++ )
        for( ii = 0; ii < 4; ii++ )
            g_Parm_3D_Visu.m_Rot[ii] = 0.0;
            GetPrm3DVisu().m_Rot[ii] = 0.0;


        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        g_Parm_3D_Visu.m_ROTX = -180;
        GetPrm3DVisu().m_ROTX = -180;
        break;
        break;


    default:
    default:
@@ -279,47 +279,35 @@ void EDA_3D_CANVAS::OnMouseWheel( wxMouseEvent& event )
    if( event.ShiftDown() )
    if( event.ShiftDown() )
    {
    {
        if( event.GetWheelRotation() < 0 )
        if( event.GetWheelRotation() < 0 )
        {
            SetView3D( WXK_UP );    // move up
            /* up */
            SetView3D( WXK_UP );
        }
        else
        else
        {
            SetView3D( WXK_DOWN );  // move down
            /* down */
            SetView3D( WXK_DOWN );
        }
    }
    }
    else if( event.ControlDown() )
    else if( event.ControlDown() )
    {
    {
        if( event.GetWheelRotation() > 0 )
        if( event.GetWheelRotation() > 0 )
        {
            SetView3D( WXK_RIGHT ); // move right
            /* right */
            SetView3D( WXK_RIGHT );
        }
        else
        else
        {
            SetView3D( WXK_LEFT );  // move left
            /* left */
            SetView3D( WXK_LEFT );
        }
    }
    }
    else
    else
    {
    {
        if( event.GetWheelRotation() > 0 )
        if( event.GetWheelRotation() > 0 )
        {
        {
            g_Parm_3D_Visu.m_Zoom /= 1.4;
            GetPrm3DVisu().m_Zoom /= 1.4;


            if( g_Parm_3D_Visu.m_Zoom <= 0.01 )
            if( GetPrm3DVisu().m_Zoom <= 0.01 )
                g_Parm_3D_Visu.m_Zoom = 0.01;
                GetPrm3DVisu().m_Zoom = 0.01;
        }
        }
        else
        else
            g_Parm_3D_Visu.m_Zoom *= 1.4;
            GetPrm3DVisu().m_Zoom *= 1.4;


        DisplayStatus();
        DisplayStatus();
        Refresh( false );
        Refresh( false );
    }
    }


    g_Parm_3D_Visu.m_Beginx = event.GetX();
    GetPrm3DVisu().m_Beginx = event.GetX();
    g_Parm_3D_Visu.m_Beginy = event.GetY();
    GetPrm3DVisu().m_Beginy = event.GetY();
}
}




@@ -334,12 +322,12 @@ void EDA_3D_CANVAS::OnMouseMove( wxMouseEvent& event )
        {
        {
            /* drag in progress, simulate trackball */
            /* drag in progress, simulate trackball */
            trackball( spin_quat,
            trackball( spin_quat,
                       (2.0 * g_Parm_3D_Visu.m_Beginx - size.x) / size.x,
                       (2.0 * GetPrm3DVisu().m_Beginx - size.x) / size.x,
                       (size.y - 2.0 * g_Parm_3D_Visu.m_Beginy) / size.y,
                       (size.y - 2.0 * GetPrm3DVisu().m_Beginy) / size.y,
                       (     2.0 * event.GetX() - size.x) / size.x,
                       (     2.0 * event.GetX() - size.x) / size.x,
                       ( size.y - 2.0 * event.GetY() ) / size.y );
                       ( size.y - 2.0 * event.GetY() ) / size.y );


            add_quats( spin_quat, g_Parm_3D_Visu.m_Quat, g_Parm_3D_Visu.m_Quat );
            add_quats( spin_quat, GetPrm3DVisu().m_Quat, GetPrm3DVisu().m_Quat );
        }
        }
        else if( event.MiddleIsDown() )
        else if( event.MiddleIsDown() )
        {
        {
@@ -347,11 +335,11 @@ void EDA_3D_CANVAS::OnMouseMove( wxMouseEvent& event )


            /* Current zoom and an additional factor are taken into account
            /* Current zoom and an additional factor are taken into account
             * for the amount of panning. */
             * for the amount of panning. */
            const double PAN_FACTOR = 8.0 * g_Parm_3D_Visu.m_Zoom;
            const double PAN_FACTOR = 8.0 * GetPrm3DVisu().m_Zoom;
            m_draw3dOffset.x -= PAN_FACTOR *
            m_draw3dOffset.x -= PAN_FACTOR *
                           ( g_Parm_3D_Visu.m_Beginx - event.GetX() ) / size.x;
                           ( GetPrm3DVisu().m_Beginx - event.GetX() ) / size.x;
            m_draw3dOffset.y -= PAN_FACTOR *
            m_draw3dOffset.y -= PAN_FACTOR *
                           (event.GetY() - g_Parm_3D_Visu.m_Beginy) / size.y;
                           (event.GetY() - GetPrm3DVisu().m_Beginy) / size.y;
        }
        }


        /* orientation has changed, redraw mesh */
        /* orientation has changed, redraw mesh */
@@ -359,8 +347,8 @@ void EDA_3D_CANVAS::OnMouseMove( wxMouseEvent& event )
        Refresh( false );
        Refresh( false );
    }
    }


    g_Parm_3D_Visu.m_Beginx = event.GetX();
    GetPrm3DVisu().m_Beginx = event.GetX();
    g_Parm_3D_Visu.m_Beginy = event.GetY();
    GetPrm3DVisu().m_Beginy = event.GetY();
}
}




@@ -502,7 +490,7 @@ void EDA_3D_CANVAS::DisplayStatus()
    msg.Printf( wxT( "dy %3.2f" ), m_draw3dOffset.y );
    msg.Printf( wxT( "dy %3.2f" ), m_draw3dOffset.y );
    Parent()->SetStatusText( msg, 2 );
    Parent()->SetStatusText( msg, 2 );


    msg.Printf( wxT( "View: %3.1f" ), 45 * g_Parm_3D_Visu.m_Zoom );
    msg.Printf( wxT( "View: %3.1f" ), 45 * GetPrm3DVisu().m_Zoom );
    Parent()->SetStatusText( msg, 3 );
    Parent()->SetStatusText( msg, 3 );
}
}


@@ -539,7 +527,8 @@ GLuint load_and_generate_texture( tsImage *image )


    glGenTextures( 1, &texture );
    glGenTextures( 1, &texture );
    glBindTexture( GL_TEXTURE_2D, texture );
    glBindTexture( GL_TEXTURE_2D, texture );
    gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA, image->width, image->height, GL_RGBA, GL_UNSIGNED_BYTE, image->pixel_data );
    gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA, image->width, image->height,
                       GL_RGBA, GL_UNSIGNED_BYTE, image->pixel_data );


    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
@@ -561,7 +550,7 @@ void EDA_3D_CANVAS::InitGL()
        m_text_pcb = load_and_generate_texture( (tsImage *)&text_pcb  );
        m_text_pcb = load_and_generate_texture( (tsImage *)&text_pcb  );
        m_text_silk = load_and_generate_texture( (tsImage *)&text_silk );
        m_text_silk = load_and_generate_texture( (tsImage *)&text_silk );


        g_Parm_3D_Visu.m_Zoom = 1.0;
        GetPrm3DVisu().m_Zoom = 1.0;
        m_ZBottom = 1.0;
        m_ZBottom = 1.0;
        m_ZTop = 10.0;
        m_ZTop = 10.0;


@@ -590,12 +579,8 @@ void EDA_3D_CANVAS::InitGL()
/* Initialize OpenGL light sources. */
/* Initialize OpenGL light sources. */
void EDA_3D_CANVAS::SetLights()
void EDA_3D_CANVAS::SetLights()
{
{
    /* set viewing projection */
    // activate light. the source is above the xy plane, at source_pos
    GLfloat Z_axis_pos[4]    = { 0.0, 0.0, 30.0, 0.0 };
    GLfloat source_pos[4]    = { 0.0, 0.0, 30.0, 0.0 };
//    GLfloat lowZ_axis_pos[4] = { 0.0, 0.0, -30.0, 0.5 };

    // activate lights. 2 lights are used:
    // One is above the xy plane, the other is below the xy plane
    GLfloat light_color[4];     // color of lights (RGBA values)
    GLfloat light_color[4];     // color of lights (RGBA values)
    light_color[3] = 1.0;
    light_color[3] = 1.0;


@@ -609,22 +594,12 @@ void EDA_3D_CANVAS::SetLights()
    light_color[0] = light_color[1] = light_color[2] = 1.0;
    light_color[0] = light_color[1] = light_color[2] = 1.0;
    glLightfv( GL_LIGHT0, GL_SPECULAR, light_color );
    glLightfv( GL_LIGHT0, GL_SPECULAR, light_color );


    glLightfv( GL_LIGHT0, GL_POSITION, Z_axis_pos );
    glLightfv( GL_LIGHT0, GL_POSITION, source_pos );


    light_color[0] = light_color[1] = light_color[2] = 0.1;
    light_color[0] = light_color[1] = light_color[2] = 0.1;
    glLightModelfv( GL_LIGHT_MODEL_AMBIENT, light_color );
    glLightModelfv( GL_LIGHT_MODEL_AMBIENT, light_color );


/*
    // Light below the xy plane
    glLightfv( GL_LIGHT1, GL_POSITION, lowZ_axis_pos );
    light_color[0] = light_color[1] = light_color[2] = 0.4;
    glLightfv( GL_LIGHT1, GL_DIFFUSE, light_color );

    light_color[0] = light_color[1] = light_color[2] = 0.1;
    glLightfv( GL_LIGHT1, GL_SPECULAR, light_color );
*/
    glEnable( GL_LIGHT0 );      // White spot on Z axis ( top )
    glEnable( GL_LIGHT0 );      // White spot on Z axis ( top )
    glDisable( GL_LIGHT1 );      // White spot on Z axis ( bottom )
    glEnable( GL_LIGHTING );
    glEnable( GL_LIGHTING );
}
}


+6 −3
Original line number Original line Diff line number Diff line
@@ -142,6 +142,9 @@ public:
        m_draw3dOffset.y = aPosY;
        m_draw3dOffset.y = aPosY;
    }
    }


    /** @return the INFO3D_VISU which contains the current parameters
     * to draw the 3D view og the board
     */
    INFO3D_VISU& GetPrm3DVisu() const;
    INFO3D_VISU& GetPrm3DVisu() const;




+6 −7
Original line number Original line Diff line number Diff line
@@ -121,12 +121,11 @@ static void Draw3D_VerticalPolygonalCylinder( const CPOLYGONS_LIST& aPolysList,


void SetGLColor( EDA_COLOR_T color, double alpha )
void SetGLColor( EDA_COLOR_T color, double alpha )
{
{
    double              red, green, blue;
    const StructColors &colordata = g_ColorRefs[ColorGetBase( color )];
    const StructColors &colordata = g_ColorRefs[ColorGetBase( color )];


    red     = colordata.m_Red / 255.0;
    double red     = colordata.m_Red / 255.0;
    blue    = colordata.m_Blue / 255.0;
    double blue    = colordata.m_Blue / 255.0;
    green   = colordata.m_Green / 255.0;
    double green   = colordata.m_Green / 255.0;
    glColor4f( red, green, blue, alpha );
    glColor4f( red, green, blue, alpha );
}
}


@@ -170,7 +169,7 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
    g_Parm_3D_Visu.m_CurrentZpos = zpos;
    g_Parm_3D_Visu.m_CurrentZpos = zpos;
    v_data[2] = aZpos + (aThickness / 2.0);
    v_data[2] = aZpos + (aThickness / 2.0);


    // Set normal to toward positive Z axis, for a solid object only (to draw the top side)
    // Set normal toward positive Z axis, for a solid object on the top side
    if( aThickness )
    if( aThickness )
        SetNormalZpos();
        SetNormalZpos();


@@ -222,7 +221,7 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
        zpos = ( aZpos - (aThickness / 2.0) ) * aBiuTo3DUnits;
        zpos = ( aZpos - (aThickness / 2.0) ) * aBiuTo3DUnits;
        g_Parm_3D_Visu.m_CurrentZpos = zpos;
        g_Parm_3D_Visu.m_CurrentZpos = zpos;
        v_data[2] = zpos;
        v_data[2] = zpos;
        // Now;, set normal to toward negative Z axis, for the solid object bottom side
        // Set normal toward negative Z axis, for a solid object on bottom side
        SetNormalZneg();
        SetNormalZneg();
    }
    }


+1 −1
Original line number Original line Diff line number Diff line
@@ -45,7 +45,7 @@


INFO3D_VISU& EDA_3D_CANVAS::GetPrm3DVisu() const
INFO3D_VISU& EDA_3D_CANVAS::GetPrm3DVisu() const
{
{
    return g_Parm_3D_Visu;
    return Parent()->GetPrm3DVisu();
}
}


wxSize EDA_3D_CANVAS::getBoardSize() const
wxSize EDA_3D_CANVAS::getBoardSize() const
+70 −56
Original line number Original line Diff line number Diff line
@@ -224,15 +224,15 @@ void EDA_3D_FRAME::LoadSettings( wxConfigBase* aCfg )
{
{
    EDA_BASE_FRAME::LoadSettings( aCfg );
    EDA_BASE_FRAME::LoadSettings( aCfg );


    INFO3D_VISU& prms = g_Parm_3D_Visu;
    INFO3D_VISU& prms = GetPrm3DVisu();


    aCfg->Read( keyBgColor_Red, &g_Parm_3D_Visu.m_BgColor.m_Red, 0.4 );
    aCfg->Read( keyBgColor_Red, &GetPrm3DVisu().m_BgColor.m_Red, 0.4 );
    aCfg->Read( keyBgColor_Green, &g_Parm_3D_Visu.m_BgColor.m_Green, 0.4 );
    aCfg->Read( keyBgColor_Green, &GetPrm3DVisu().m_BgColor.m_Green, 0.4 );
    aCfg->Read( keyBgColor_Blue, &g_Parm_3D_Visu.m_BgColor.m_Blue, 0.5 );
    aCfg->Read( keyBgColor_Blue, &GetPrm3DVisu().m_BgColor.m_Blue, 0.5 );


    aCfg->Read( keyBgColor_Red_Top, &g_Parm_3D_Visu.m_BgColor_Top.m_Red, 0.8 );
    aCfg->Read( keyBgColor_Red_Top, &GetPrm3DVisu().m_BgColor_Top.m_Red, 0.8 );
    aCfg->Read( keyBgColor_Green_Top, &g_Parm_3D_Visu.m_BgColor_Top.m_Green, 0.8 );
    aCfg->Read( keyBgColor_Green_Top, &GetPrm3DVisu().m_BgColor_Top.m_Green, 0.8 );
    aCfg->Read( keyBgColor_Blue_Top, &g_Parm_3D_Visu.m_BgColor_Top.m_Blue, 0.9 );
    aCfg->Read( keyBgColor_Blue_Top, &GetPrm3DVisu().m_BgColor_Top.m_Blue, 0.9 );


    bool tmp;
    bool tmp;
    aCfg->Read( keyShowRealisticMode, &tmp, false );
    aCfg->Read( keyShowRealisticMode, &tmp, false );
@@ -297,15 +297,15 @@ void EDA_3D_FRAME::SaveSettings( wxConfigBase* aCfg )
{
{
    EDA_BASE_FRAME::SaveSettings( aCfg );
    EDA_BASE_FRAME::SaveSettings( aCfg );


    INFO3D_VISU& prms = g_Parm_3D_Visu;
    INFO3D_VISU& prms = GetPrm3DVisu();


    aCfg->Write( keyBgColor_Red, g_Parm_3D_Visu.m_BgColor.m_Red );
    aCfg->Write( keyBgColor_Red, GetPrm3DVisu().m_BgColor.m_Red );
    aCfg->Write( keyBgColor_Green, g_Parm_3D_Visu.m_BgColor.m_Green );
    aCfg->Write( keyBgColor_Green, GetPrm3DVisu().m_BgColor.m_Green );
    aCfg->Write( keyBgColor_Blue, g_Parm_3D_Visu.m_BgColor.m_Blue );
    aCfg->Write( keyBgColor_Blue, GetPrm3DVisu().m_BgColor.m_Blue );


    aCfg->Write( keyBgColor_Red_Top, g_Parm_3D_Visu.m_BgColor_Top.m_Red );
    aCfg->Write( keyBgColor_Red_Top, GetPrm3DVisu().m_BgColor_Top.m_Red );
    aCfg->Write( keyBgColor_Green_Top, g_Parm_3D_Visu.m_BgColor_Top.m_Green );
    aCfg->Write( keyBgColor_Green_Top, GetPrm3DVisu().m_BgColor_Top.m_Green );
    aCfg->Write( keyBgColor_Blue_Top, g_Parm_3D_Visu.m_BgColor_Top.m_Blue );
    aCfg->Write( keyBgColor_Blue_Top, GetPrm3DVisu().m_BgColor_Top.m_Blue );


    aCfg->Write( keyShowRealisticMode, prms.GetFlag( FL_USE_REALISTIC_MODE ) );
    aCfg->Write( keyShowRealisticMode, prms.GetFlag( FL_USE_REALISTIC_MODE ) );


@@ -340,23 +340,23 @@ void EDA_3D_FRAME::Process_Zoom( wxCommandEvent& event )
    case ID_ZOOM_PAGE:
    case ID_ZOOM_PAGE:


        for( ii = 0; ii < 4; ii++ )
        for( ii = 0; ii < 4; ii++ )
            g_Parm_3D_Visu.m_Rot[ii] = 0.0;
            GetPrm3DVisu().m_Rot[ii] = 0.0;


        g_Parm_3D_Visu.m_Zoom = 1.0;
        GetPrm3DVisu().m_Zoom = 1.0;
        m_canvas->SetOffset( 0.0, 0.0 );
        m_canvas->SetOffset( 0.0, 0.0 );
        trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
        trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
        break;
        break;


    case ID_ZOOM_IN:
    case ID_ZOOM_IN:
        g_Parm_3D_Visu.m_Zoom /= 1.2;
        GetPrm3DVisu().m_Zoom /= 1.2;


        if( g_Parm_3D_Visu.m_Zoom <= 0.01 )
        if( GetPrm3DVisu().m_Zoom <= 0.01 )
            g_Parm_3D_Visu.m_Zoom = 0.01;
            GetPrm3DVisu().m_Zoom = 0.01;


        break;
        break;


    case ID_ZOOM_OUT:
    case ID_ZOOM_OUT:
        g_Parm_3D_Visu.m_Zoom *= 1.2;
        GetPrm3DVisu().m_Zoom *= 1.2;
        break;
        break;


    case ID_ZOOM_REDRAW:
    case ID_ZOOM_REDRAW:
@@ -410,27 +410,27 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
        break;
        break;


    case ID_ROTATE3D_X_POS:
    case ID_ROTATE3D_X_POS:
        g_Parm_3D_Visu.m_ROTX += ROT_ANGLE;
        GetPrm3DVisu().m_ROTX += ROT_ANGLE;
        break;
        break;


    case ID_ROTATE3D_X_NEG:
    case ID_ROTATE3D_X_NEG:
        g_Parm_3D_Visu.m_ROTX -= ROT_ANGLE;
        GetPrm3DVisu().m_ROTX -= ROT_ANGLE;
        break;
        break;


    case ID_ROTATE3D_Y_POS:
    case ID_ROTATE3D_Y_POS:
        g_Parm_3D_Visu.m_ROTY += ROT_ANGLE;
        GetPrm3DVisu().m_ROTY += ROT_ANGLE;
        break;
        break;


    case ID_ROTATE3D_Y_NEG:
    case ID_ROTATE3D_Y_NEG:
        g_Parm_3D_Visu.m_ROTY -= ROT_ANGLE;
        GetPrm3DVisu().m_ROTY -= ROT_ANGLE;
        break;
        break;


    case ID_ROTATE3D_Z_POS:
    case ID_ROTATE3D_Z_POS:
        g_Parm_3D_Visu.m_ROTZ += ROT_ANGLE;
        GetPrm3DVisu().m_ROTZ += ROT_ANGLE;
        break;
        break;


    case ID_ROTATE3D_Z_NEG:
    case ID_ROTATE3D_Z_NEG:
        g_Parm_3D_Visu.m_ROTZ -= ROT_ANGLE;
        GetPrm3DVisu().m_ROTZ -= ROT_ANGLE;
        break;
        break;


    case ID_MOVE3D_LEFT:
    case ID_MOVE3D_LEFT:
@@ -460,97 +460,97 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
        break;
        break;


    case ID_MENU3D_BGCOLOR_SELECTION:
    case ID_MENU3D_BGCOLOR_SELECTION:
        Set3DBgColor( g_Parm_3D_Visu.m_BgColor );
        Get3DColorFromUser( GetPrm3DVisu().m_BgColor );
        return;
        return;


    case ID_MENU3D_BGCOLOR_TOP_SELECTION:
    case ID_MENU3D_BGCOLOR_TOP_SELECTION:
        Set3DBgColor( g_Parm_3D_Visu.m_BgColor_Top );
        Get3DColorFromUser( GetPrm3DVisu().m_BgColor_Top );
        return;
        return;


    case ID_MENU3D_REALISTIC_MODE:
    case ID_MENU3D_REALISTIC_MODE:
        g_Parm_3D_Visu.SetFlag( FL_USE_REALISTIC_MODE, isChecked );
        GetPrm3DVisu().SetFlag( FL_USE_REALISTIC_MODE, isChecked );
        NewDisplay();
        NewDisplay();
        return;
        return;


    case ID_MENU3D_FL_RENDER_SHADOWS:
    case ID_MENU3D_FL_RENDER_SHADOWS:
        g_Parm_3D_Visu.SetFlag( FL_RENDER_SHADOWS, isChecked );
        GetPrm3DVisu().SetFlag( FL_RENDER_SHADOWS, isChecked );
        NewDisplay();
        NewDisplay();
        return;
        return;


    case ID_MENU3D_FL_RENDER_SHOW_HOLES_IN_ZONES:
    case ID_MENU3D_FL_RENDER_SHOW_HOLES_IN_ZONES:
        g_Parm_3D_Visu.SetFlag( FL_RENDER_SHOW_HOLES_IN_ZONES, isChecked );
        GetPrm3DVisu().SetFlag( FL_RENDER_SHOW_HOLES_IN_ZONES, isChecked );
        NewDisplay();
        NewDisplay();
        return;
        return;


    case ID_MENU3D_FL_RENDER_TEXTURES:
    case ID_MENU3D_FL_RENDER_TEXTURES:
        g_Parm_3D_Visu.SetFlag( FL_RENDER_TEXTURES, isChecked );
        GetPrm3DVisu().SetFlag( FL_RENDER_TEXTURES, isChecked );
        NewDisplay(GL_ID_BOARD);
        NewDisplay(GL_ID_BOARD);
        NewDisplay(GL_ID_TECH_LAYERS);
        NewDisplay(GL_ID_TECH_LAYERS);
        return;
        return;


    case ID_MENU3D_FL_RENDER_SMOOTH:
    case ID_MENU3D_FL_RENDER_SMOOTH:
        g_Parm_3D_Visu.SetFlag( FL_RENDER_SMOOTH, isChecked );
        GetPrm3DVisu().SetFlag( FL_RENDER_SMOOTH, isChecked );
        NewDisplay();
        NewDisplay();
        return;
        return;


    case ID_MENU3D_FL_RENDER_MATERIAL:
    case ID_MENU3D_FL_RENDER_MATERIAL:
        g_Parm_3D_Visu.SetFlag( FL_RENDER_MATERIAL, isChecked );
        GetPrm3DVisu().SetFlag( FL_RENDER_MATERIAL, isChecked );
        NewDisplay();
        NewDisplay();
        return;
        return;


    case ID_MENU3D_SHOW_BOARD_BODY:
    case ID_MENU3D_SHOW_BOARD_BODY:
        g_Parm_3D_Visu.SetFlag( FL_SHOW_BOARD_BODY, isChecked );
        GetPrm3DVisu().SetFlag( FL_SHOW_BOARD_BODY, isChecked );
        NewDisplay();
        NewDisplay();
        return;
        return;


    case ID_MENU3D_AXIS_ONOFF:
    case ID_MENU3D_AXIS_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_AXIS, isChecked );
        GetPrm3DVisu().SetFlag( FL_AXIS, isChecked );
        m_canvas->Refresh();
        m_canvas->Refresh();
        return;
        return;


    case ID_MENU3D_MODULE_ONOFF:
    case ID_MENU3D_MODULE_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_MODULE, isChecked );
        GetPrm3DVisu().SetFlag( FL_MODULE, isChecked );
        m_canvas->Refresh();
        m_canvas->Refresh();
        return;
        return;


    case ID_MENU3D_USE_COPPER_THICKNESS:
    case ID_MENU3D_USE_COPPER_THICKNESS:
        g_Parm_3D_Visu.SetFlag( FL_USE_COPPER_THICKNESS, isChecked );
        GetPrm3DVisu().SetFlag( FL_USE_COPPER_THICKNESS, isChecked );
        NewDisplay(GL_ID_BOARD);
        NewDisplay(GL_ID_BOARD);
        NewDisplay(GL_ID_TECH_LAYERS);
        NewDisplay(GL_ID_TECH_LAYERS);
        return;
        return;


    case ID_MENU3D_ZONE_ONOFF:
    case ID_MENU3D_ZONE_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_ZONE, isChecked );
        GetPrm3DVisu().SetFlag( FL_ZONE, isChecked );
        NewDisplay(GL_ID_BOARD);
        NewDisplay(GL_ID_BOARD);
        return;
        return;


    case ID_MENU3D_ADHESIVE_ONOFF:
    case ID_MENU3D_ADHESIVE_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_ADHESIVE, isChecked );
        GetPrm3DVisu().SetFlag( FL_ADHESIVE, isChecked );
        NewDisplay(GL_ID_TECH_LAYERS);
        NewDisplay(GL_ID_TECH_LAYERS);
        return;
        return;


    case ID_MENU3D_SILKSCREEN_ONOFF:
    case ID_MENU3D_SILKSCREEN_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_SILKSCREEN, isChecked );
        GetPrm3DVisu().SetFlag( FL_SILKSCREEN, isChecked );
        NewDisplay(GL_ID_TECH_LAYERS);
        NewDisplay(GL_ID_TECH_LAYERS);
        return;
        return;


    case ID_MENU3D_SOLDER_MASK_ONOFF:
    case ID_MENU3D_SOLDER_MASK_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_SOLDERMASK, isChecked );
        GetPrm3DVisu().SetFlag( FL_SOLDERMASK, isChecked );
        NewDisplay(GL_ID_TECH_LAYERS);
        NewDisplay(GL_ID_TECH_LAYERS);
        return;
        return;


    case ID_MENU3D_SOLDER_PASTE_ONOFF:
    case ID_MENU3D_SOLDER_PASTE_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_SOLDERPASTE, isChecked );
        GetPrm3DVisu().SetFlag( FL_SOLDERPASTE, isChecked );
        NewDisplay(GL_ID_TECH_LAYERS);
        NewDisplay(GL_ID_TECH_LAYERS);
        return;
        return;


    case ID_MENU3D_COMMENTS_ONOFF:
    case ID_MENU3D_COMMENTS_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_COMMENTS, isChecked );
        GetPrm3DVisu().SetFlag( FL_COMMENTS, isChecked );
        NewDisplay(GL_ID_AUX_LAYERS);
        NewDisplay(GL_ID_AUX_LAYERS);
        return;
        return;


    case ID_MENU3D_ECO_ONOFF:
    case ID_MENU3D_ECO_ONOFF:
        g_Parm_3D_Visu.SetFlag( FL_ECO, isChecked );
        GetPrm3DVisu().SetFlag( FL_ECO, isChecked );
        NewDisplay(GL_ID_AUX_LAYERS);
        NewDisplay(GL_ID_AUX_LAYERS);
        return;
        return;


@@ -579,27 +579,27 @@ void EDA_3D_FRAME::On3DGridSelection( wxCommandEvent& event )
    switch( id )
    switch( id )
    {
    {
    case ID_MENU3D_GRID_NOGRID:
    case ID_MENU3D_GRID_NOGRID:
        g_Parm_3D_Visu.SetFlag( FL_GRID, false );
        GetPrm3DVisu().SetFlag( FL_GRID, false );
        break;
        break;


    case ID_MENU3D_GRID_10_MM:
    case ID_MENU3D_GRID_10_MM:
        g_Parm_3D_Visu.SetFlag( FL_GRID, true );
        GetPrm3DVisu().SetFlag( FL_GRID, true );
        g_Parm_3D_Visu.m_3D_Grid = 10.0;
        GetPrm3DVisu().m_3D_Grid = 10.0;
        break;
        break;


    case ID_MENU3D_GRID_5_MM:
    case ID_MENU3D_GRID_5_MM:
        g_Parm_3D_Visu.SetFlag( FL_GRID, true );
        GetPrm3DVisu().SetFlag( FL_GRID, true );
        g_Parm_3D_Visu.m_3D_Grid = 5.0;
        GetPrm3DVisu().m_3D_Grid = 5.0;
        break;
        break;


    case ID_MENU3D_GRID_2P5_MM:
    case ID_MENU3D_GRID_2P5_MM:
        g_Parm_3D_Visu.SetFlag( FL_GRID, true );
        GetPrm3DVisu().SetFlag( FL_GRID, true );
        g_Parm_3D_Visu.m_3D_Grid = 2.5;
        GetPrm3DVisu().m_3D_Grid = 2.5;
        break;
        break;


    case ID_MENU3D_GRID_1_MM:
    case ID_MENU3D_GRID_1_MM:
        g_Parm_3D_Visu.SetFlag( FL_GRID, true );
        GetPrm3DVisu().SetFlag( FL_GRID, true );
        g_Parm_3D_Visu.m_3D_Grid = 1.0;
        GetPrm3DVisu().m_3D_Grid = 1.0;
        break;
        break;


    default:
    default:
@@ -636,7 +636,7 @@ void EDA_3D_FRAME::OnActivate( wxActivateEvent& event )


/* called to set the background color of the 3D scene
/* called to set the background color of the 3D scene
 */
 */
bool EDA_3D_FRAME::Set3DBgColor( S3D_COLOR &color )
bool EDA_3D_FRAME::Get3DColorFromUser( S3D_COLOR &color )
{
{
    wxColour    newcolor, oldcolor;
    wxColour    newcolor, oldcolor;


@@ -663,3 +663,17 @@ BOARD* EDA_3D_FRAME::GetBoard()
{
{
    return Parent()->GetBoard();
    return Parent()->GetBoard();
}
}


INFO3D_VISU& EDA_3D_FRAME::GetPrm3DVisu() const
{
    // return the INFO3D_VISU which contains the current parameters
    // to draw the 3D view og the board
    return g_Parm_3D_Visu;
}

bool EDA_3D_FRAME::IsEnabled( DISPLAY3D_FLG aItem ) const
{
    // return true if aItem must be displayed
    return GetPrm3DVisu().GetFlag( aItem );
}
Loading