Commit 459ea885 authored by jean-pierre charras's avatar jean-pierre charras
Browse files

Add patch for 3D viewer enhancements (better render + better vrml reader + x3d...

Add patch for 3D viewer enhancements (better render + better vrml reader + x3d reader bug fix) from Mario Luzeiro, with few coding style issues fixed.
parents 15403684 7a4ea895
Loading
Loading
Loading
Loading
+24 −6
Original line number Diff line number Diff line
@@ -57,13 +57,31 @@ void S3D_MASTER::ObjectCoordsTo3DUnits( std::vector< S3D_VERTEX >& aVertices )

        // adjust rotation
        if( m_MatRotation.x )
            RotatePoint( &aVertices[ii].y, &aVertices[ii].z, m_MatRotation.x * 10 );
        {
            double a = aVertices[ii].y;
            double b = aVertices[ii].z;
            RotatePoint( &a, &b, m_MatRotation.x * 10 );
            aVertices[ii].y = (float)a;
            aVertices[ii].z = (float)b;
        }

        if( m_MatRotation.y )
            RotatePoint( &aVertices[ii].z, &aVertices[ii].x, m_MatRotation.y * 10 );
        {
            double a = aVertices[ii].z;
            double b = aVertices[ii].x;
            RotatePoint( &a, &b, m_MatRotation.x * 10 );
            aVertices[ii].z = (float)a;
            aVertices[ii].x = (float)b;
        }

        if( m_MatRotation.z )
            RotatePoint( &aVertices[ii].x, &aVertices[ii].y, m_MatRotation.z * 10 );
        {
            double a = aVertices[ii].x;
            double b = aVertices[ii].y;
            RotatePoint( &a, &b, m_MatRotation.x * 10 );
            aVertices[ii].x = (float)a;
            aVertices[ii].y = (float)b;
        }

        /* adjust offset position (offset is given in UNIT 3D (0.1 inch) */
#define SCALE_3D_CONV ((IU_PER_MILS * 1000) / UNITS3D_TO_UNITSPCB)
+51 −56
Original line number Diff line number Diff line
@@ -16,17 +16,23 @@

#include <gestfich.h>

#ifdef __WINDOWS__
#include <GL/glew.h>        // must be included before gl.h
#endif

#include <3d_viewer.h>
#include <3d_canvas.h>
#include <info3d_visu.h>
#include <trackball.h>
#include <3d_viewer_id.h>

#include <textures/text_silk.c>
#include <textures/text_pcb.c>

// -----------------
// helper function (from wxWidgets, opengl/cube.cpp sample
// -----------------
void CheckGLError()
void CheckGLError(const char *aFileName, int aLineNumber)
{
    GLenum errLast = GL_NO_ERROR;

@@ -47,7 +53,7 @@ void CheckGLError()

        errLast = err;

        wxLogError(wxT("OpenGL error %d"), err);
        wxLogError( wxT( "OpenGL error %d\nAt: %s, line: %d" ), err, aFileName, aLineNumber );
    }
}

@@ -78,6 +84,7 @@ EDA_3D_CANVAS::EDA_3D_CANVAS( EDA_3D_FRAME* parent, int* attribList ) :
                wxFULL_REPAINT_ON_RESIZE )
{
    m_init   = false;
    m_shadow_init = false;

    // Clear all gl list identifiers:
    for( int ii = GL_ID_BEGIN; ii < GL_ID_END; ii++ )
@@ -490,15 +497,46 @@ void EDA_3D_CANVAS::OnEraseBackground( wxEraseEvent& event )
    // Do nothing, to avoid flashing.
}

typedef struct s_sImage
{
  unsigned int   width;
  unsigned int   height;
  unsigned int   bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
  unsigned char  pixel_data[64 * 64 * 4 + 1];
}tsImage;


GLuint load_and_generate_texture( tsImage *image )
{

    GLuint texture;
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
    glPixelStorei (GL_PACK_ALIGNMENT, 1);

    glGenTextures( 1, &texture );
    glBindTexture( GL_TEXTURE_2D, texture );
    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_MAG_FILTER, GL_LINEAR );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    return texture;
}

/* Initialize broad parameters for OpenGL */
void EDA_3D_CANVAS::InitGL()
{
    wxSize size = GetClientSize();

    if( !m_init )
    {
        m_init = true;


        m_text_pcb = load_and_generate_texture( (tsImage *)&text_pcb  );
        m_text_silk = load_and_generate_texture( (tsImage *)&text_silk );

        g_Parm_3D_Visu.m_Zoom = 1.0;
        m_ZBottom = 1.0;
        m_ZTop = 10.0;
@@ -513,7 +551,7 @@ void EDA_3D_CANVAS::InitGL()
        glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );

        // speedups
        glEnable( GL_DITHER );
        //glEnable( GL_DITHER );
        glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_DONT_CARE );
        glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
        glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
@@ -522,51 +560,6 @@ void EDA_3D_CANVAS::InitGL()
        glEnable( GL_BLEND );
        glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    }

    // set viewing projection

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

#define MAX_VIEW_ANGLE 160.0 / 45.0
    if( g_Parm_3D_Visu.m_Zoom > MAX_VIEW_ANGLE )
        g_Parm_3D_Visu.m_Zoom = MAX_VIEW_ANGLE;

     if( Parent()->ModeIsOrtho() )
     {
         // OrthoReductionFactor is chosen so as to provide roughly the same size as
         // Perspective View
         const double orthoReductionFactor = 400 / g_Parm_3D_Visu.m_Zoom;

         // Initialize Projection Matrix for Ortographic View
         glOrtho( -size.x / orthoReductionFactor, size.x / orthoReductionFactor,
                  -size.y / orthoReductionFactor, size.y / orthoReductionFactor, 1, 10 );
     }
     else
     {
         // Ratio width / height of the window display
         double ratio_HV = (double) size.x / size.y;

         // Initialize Projection Matrix for Perspective View
         gluPerspective( 45.0 * g_Parm_3D_Visu.m_Zoom, ratio_HV, 1, 10 );
     }


    // position viewer
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glTranslatef( 0.0F, 0.0F, -( m_ZBottom + m_ZTop) / 2 );

    // clear color and depth buffers
    glClearColor( g_Parm_3D_Visu.m_BgColor.m_Red,
                  g_Parm_3D_Visu.m_BgColor.m_Green,
                  g_Parm_3D_Visu.m_BgColor.m_Blue, 1 );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    // Setup light sources:
    SetLights();

    CheckGLError();
}


@@ -578,16 +571,19 @@ void EDA_3D_CANVAS::SetLights()

    /* set viewing projection */
    light_color[3] = 1.0;
    GLfloat Z_axis_pos[4]    = { 0.0, 0.0, 3.0, 0.0 };
    GLfloat lowZ_axis_pos[4] = { 0.0, 0.0, -3.0, 0.5 };
    GLfloat Z_axis_pos[4]    = { 0.0, 0.0, 30.0, 0.0 };
    GLfloat lowZ_axis_pos[4] = { 0.0, 0.0, -30.0, 0.5 };

    /* activate light */
    light = 1.0;
    light_color[0] = light_color[1] = light_color[2] = light;
    glLightfv( GL_LIGHT0, GL_POSITION, Z_axis_pos );
    glLightfv( GL_LIGHT0, GL_DIFFUSE, light_color );
    light = 0.3;
    light_color[0] = light_color[1] = light_color[2] = light;

    light_color[0] = 0.3;
    light_color[1] = 0.3;
    light_color[2] = 0.4;

    glLightfv( GL_LIGHT1, GL_POSITION, lowZ_axis_pos );
    glLightfv( GL_LIGHT1, GL_DIFFUSE, light_color );
    glEnable( GL_LIGHT0 );      // White spot on Z axis
@@ -654,7 +650,6 @@ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event )
                  viewport.x, viewport.y,
                  GL_ALPHA, GL_UNSIGNED_BYTE, alphabuffer );


    image.SetData( pixelbuffer );
    image.SetAlpha( alphabuffer );
    image = image.Mirror( false );
+37 −6
Original line number Diff line number Diff line
@@ -43,10 +43,11 @@
#endif

#include <3d_struct.h>
#include <convert_basic_shapes_to_polygon.h>
 
class BOARD_DESIGN_SETTINGS;
class EDA_3D_FRAME;
class S3D_VERTEX;

class VIA;
class D_PAD;

@@ -61,8 +62,14 @@ enum GL_LIST_ID
    GL_ID_BOARD,                // List id for copper layers
    GL_ID_TECH_LAYERS,          // List id for non copper layers (masks...)
    GL_ID_AUX_LAYERS,           // List id for user layers (draw, eco, comment)
    GL_ID_3DSHAPES_SOLID,       // List id for 3D shapes, non transparent entities
    GL_ID_3DSHAPES_TRANSP,      // List id for 3D shapes, transparent entities
    GL_ID_3DSHAPES_SOLID_FRONT, // List id for 3D shapes, non transparent entities
    GL_ID_3DSHAPES_TRANSP_FRONT,// List id for 3D shapes, transparent entities
    GL_ID_3DSHAPES_SOLID_BACK, // List id for 3D shapes, non transparent entities
    GL_ID_3DSHAPES_TRANSP_BACK,// List id for 3D shapes, transparent entities
    GL_ID_SHADOW_FRONT,
    GL_ID_SHADOW_BACK,
    GL_ID_SHADOW_BOARD,
    GL_ID_BODY,                // Body only list
    GL_ID_END
};

@@ -76,6 +83,16 @@ private:
    double          m_ZBottom;          // position of the back layer
    double          m_ZTop;             // position of the front layer

    GLuint          m_text_pcb;
    GLuint          m_text_silk;

    bool            m_shadow_init;
    GLuint          m_text_fake_shadow_front;
    GLuint          m_text_fake_shadow_back;
    GLuint          m_text_fake_shadow_board;

    void Create_and_Render_Shadow_Buffer( GLuint *aDst_gl_texture, GLuint aTexture_size, bool aDraw_body, int aBlurPasses );
    
public:
    EDA_3D_CANVAS( EDA_3D_FRAME* parent, int* attribList = 0 );
    ~EDA_3D_CANVAS();
@@ -122,6 +139,9 @@ public:
        m_draw3dOffset.x = aPosX;
        m_draw3dOffset.y = aPosY;
    }
    void SetGLTechLayersColor( LAYER_NUM aLayer );
    void SetGLCopperColor();
    void SetGLEpoxyColor( double aTransparency = 1.0 );

    /**
     * Function BuildBoard3DView
@@ -129,7 +149,7 @@ public:
     * Populates the OpenGL GL_ID_BOARD draw list with board items only on copper layers.
     * 3D footprint shapes, tech layers and aux layers are not on this list
     */
    void   BuildBoard3DView();
    void   BuildBoard3DView(GLuint aBoardList, GLuint aBodyOnlyList);

    /**
     * Function BuildTechLayers3DView
@@ -138,6 +158,12 @@ public:
     */
    void   BuildTechLayers3DView();

    /**
     * Function BuildShadowList
     * Called by CreateDrawGL_List()
     */
     void BuildShadowList( GLuint aFrontList, GLuint aBacklist, GLuint aBoardList );

    /**
     * Function BuildFootprintShape3DList
     * Called by CreateDrawGL_List()
@@ -148,7 +174,8 @@ public:
     * which need to be drawn after all other items
     */
    void   BuildFootprintShape3DList( GLuint aOpaqueList,
                                      GLuint aTransparentList);
                                      GLuint aTransparentList,
                                      bool aSideToLoad );
    /**
     * Function BuildBoard3DAuxLayers
     * Called by CreateDrawGL_List()
@@ -163,7 +190,11 @@ public:
    void   Draw3DViaHole( const VIA * aVia );
    void   Draw3DPadHole( const D_PAD * aPad );

    void   GenerateFakeShadowsTextures();

    DECLARE_EVENT_TABLE()
};

void CheckGLError(const char *aFileName, int aLineNumber);

#endif  /*  _3D_CANVAS_H_ */
+11 −31
Original line number Diff line number Diff line
@@ -30,36 +30,6 @@

#include <3d_viewer.h>

S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
    EDA_ITEM( father, NOT_USED )
{
    m_DiffuseColor.x   = m_DiffuseColor.y = m_DiffuseColor.z = 1.0;
    m_SpecularColor.x  = m_SpecularColor.y = m_SpecularColor.z = 1.0;
    m_AmbientIntensity = 1.0;
    m_Transparency     = 0.0;
    m_Shininess = 1.0;
    m_Name = name;
}

void S3D_MATERIAL::SetMaterial()
{
    S3D_MASTER * s3dParent = (S3D_MASTER *) GetParent();
    s3dParent->SetLastTransparency( m_Transparency );

    if( ! s3dParent->IsOpenGlAllowed() )
        return;

    glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
    glColor4f( m_DiffuseColor.x * m_AmbientIntensity,
               m_DiffuseColor.y * m_AmbientIntensity,
               m_DiffuseColor.z * m_AmbientIntensity,
               1.0 - m_Transparency );
#if 0
    glColorMaterial( GL_FRONT_AND_BACK, GL_SPECULAR );
    glColor3f( m_SpecularColor.x, m_SpecularColor.y, m_SpecularColor.z );
    glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
#endif
}

bool S3D_MASTER::IsOpenGlAllowed()
{
@@ -68,9 +38,12 @@ bool S3D_MASTER::IsOpenGlAllowed()
        if( m_lastTransparency == 0.0 )
            return true;
    }

    if( m_loadTransparentObjects )      // return true for transparent objects only
    {
        if( m_lastTransparency != 0.0 )
            return true;
    }

    return false;
}
@@ -102,6 +75,13 @@ S3D_MASTER::S3D_MASTER( EDA_ITEM* aParent ) :
    m_3D_Drawings = NULL;
    m_Materials   = NULL;
    m_ShapeType   = FILE3D_NONE;

    m_use_modelfile_diffuseColor = true;
    m_use_modelfile_emissiveColor = false;
    m_use_modelfile_specularColor = false;
    m_use_modelfile_ambientIntensity = false;
    m_use_modelfile_transparency = true;
    m_use_modelfile_shininess = false;
}


+606 −83

File changed.

Preview size limit exceeded, changes collapsed.

Loading