# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: mrluzeiro@ua.pt-20140730234041-lz0081rnncl1ales
# target_branch: http://bazaar.launchpad.net/~kicad-product-\
#   committers/kicad/product/
# testament_sha1: f52aabcf3b057a9ad46f1702310fe77f28399e82
# timestamp: 2014-07-31 01:41:56 +0200
# base_revision_id: jp.charras@wanadoo.fr-20140730153955-\
#   znkwr7g18rwcphpc
# 
# Begin patch
=== modified file '3d-viewer/3d_draw.cpp'
--- 3d-viewer/3d_draw.cpp	2014-07-30 15:39:55 +0000
+++ 3d-viewer/3d_draw.cpp	2014-07-30 23:40:41 +0000
@@ -424,7 +424,7 @@
 
          // Initialize Projection Matrix for Ortographic View
          glOrtho( -size.x / orthoReductionFactor, size.x / orthoReductionFactor,
-                  -size.y / orthoReductionFactor, size.y / orthoReductionFactor, 1, 100 );
+                  -size.y / orthoReductionFactor, size.y / orthoReductionFactor, 1, 10 );
      }
      else
      {
@@ -432,7 +432,7 @@
          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, 100 );
+         gluPerspective( 45.0 * g_Parm_3D_Visu.m_Zoom, ratio_HV, 1, 10 );
      }
 
     // position viewer
@@ -979,7 +979,7 @@
 
     if( g_Parm_3D_Visu.IsRealisticMode() )
     {
-        SetGLEpoxyColor( 0.9 );
+        SetGLEpoxyColor( 1.0 );
         if( g_Parm_3D_Visu.HightQualityMode() )
         {
             SetGLTexture( m_text_pcb, 35.0f );
@@ -1400,7 +1400,7 @@
         m_glLists[GL_ID_BOARD] = glGenLists( 1 );
         m_glLists[GL_ID_BODY] = glGenLists( 1 );
         BuildBoard3DView(m_glLists[GL_ID_BOARD], m_glLists[GL_ID_BODY]);
-
+        CheckGLError( __FILE__, __LINE__ );
     }
 
     if( ! m_glLists[GL_ID_TECH_LAYERS] )
@@ -1409,6 +1409,7 @@
         glNewList( m_glLists[GL_ID_TECH_LAYERS], GL_COMPILE );
         BuildTechLayers3DView();
         glEndList();
+        CheckGLError( __FILE__, __LINE__ );
     }
 
     if( ! m_glLists[GL_ID_AUX_LAYERS] )
@@ -1417,9 +1418,9 @@
         glNewList( m_glLists[GL_ID_AUX_LAYERS], GL_COMPILE );
         BuildBoard3DAuxLayers();
         glEndList();
+        CheckGLError( __FILE__, __LINE__ );
     }
 
-
     // draw modules 3D shapes
     if( ! m_glLists[GL_ID_3DSHAPES_SOLID_FRONT] && g_Parm_3D_Visu.GetFlag( FL_MODULE ) )
     {
@@ -1434,14 +1435,16 @@
         BuildFootprintShape3DList( m_glLists[GL_ID_3DSHAPES_SOLID_FRONT],
                                    m_glLists[GL_ID_3DSHAPES_TRANSP_FRONT], false );
 
+        CheckGLError( __FILE__, __LINE__ );
+
         m_glLists[GL_ID_SHADOW_FRONT] = glGenLists( 1 );
         m_glLists[GL_ID_SHADOW_BACK]  = glGenLists( 1 );
         m_glLists[GL_ID_SHADOW_BOARD] = glGenLists( 1 );
         BuildShadowList(m_glLists[GL_ID_SHADOW_FRONT], m_glLists[GL_ID_SHADOW_BACK], m_glLists[GL_ID_SHADOW_BOARD]);
+
+        CheckGLError( __FILE__, __LINE__ );
     }
-
-    // Test for errors
-    CheckGLError( __FILE__, __LINE__ );
+    
 
 #ifdef PRINT_CALCULATION_TIME
     unsigned    endtime = GetRunningMicroSecs();

=== modified file '3d-viewer/3d_draw_basic_functions.cpp'
--- 3d-viewer/3d_draw_basic_functions.cpp	2014-07-30 09:01:25 +0000
+++ 3d-viewer/3d_draw_basic_functions.cpp	2014-07-30 23:40:41 +0000
@@ -51,12 +51,12 @@
 // 2 helper functions to set the current normal vector for gle items
 static inline void SetNormalZpos()
 {
-    glNormal3f( 0.0, 0.0, 1.0 );
+    //glNormal3f( 0.0, 0.0, 1.0 );
 }
 
 static inline void SetNormalZneg()
 {
-    glNormal3f( 0.0, 0.0, -1.0 );
+    //glNormal3f( 0.0, 0.0, -1.0 );
 }
 
 void TransfertToGLlist( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits );
@@ -185,6 +185,10 @@
                 startContour = 0;
             }
 
+            // https://www.opengl.org/sdk/docs/man2/xhtml/gluTessNormal.xml
+            gluTessNormal( tess, 0.0, 0.0, 0.0 );
+
+
             v_data[0]   = polylist.GetX( ii ) * aBiuTo3DUnits;
             v_data[1]   = -polylist.GetY( ii ) * aBiuTo3DUnits;
             // gluTessVertex store pointers on data, not data, so do not store
@@ -193,6 +197,7 @@
             // before calling gluDeleteTess
             gluTessVertex( tess, v_data, &polylist[ii] );
 
+
             if( polylist.IsEndContour( ii ) )
             {
                 gluTessEndContour( tess );
@@ -215,7 +220,9 @@
     gluDeleteTess( tess );
 
     if( aThickness == 0 )
+    {
         return;
+    }
 
     // Build the 3D data : vertical side
     Draw3D_VerticalPolygonalCylinder( polylist, aThickness, aZpos - (aThickness / 2.0), false, aBiuTo3DUnits );

=== modified file '3d-viewer/3d_material.cpp'
--- 3d-viewer/3d_material.cpp	2014-07-30 09:01:25 +0000
+++ 3d-viewer/3d_material.cpp	2014-07-30 23:40:41 +0000
@@ -54,10 +54,10 @@
 
 void SetOpenGlDefaultMaterial()
 {
-    glm::vec4 ambient( 0.2, 0.2, 0.2, 1.0 );
+    glm::vec4 ambient( 0.15, 0.15, 0.15, 1.0 );
     glm::vec4 specular( 0.1, 0.1, 0.1, 1.0 );
     glm::vec4 emissive( 0.1, 0.1, 0.1, 1.0 );
-    GLint shininess_value = 100;
+    GLint shininess_value = 80;
 
     glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
     //glColor4f( 1.0, 1.0, 1.0, 1.0 );

=== modified file '3d-viewer/3d_mesh_model.cpp'
--- 3d-viewer/3d_mesh_model.cpp	2014-07-30 09:01:25 +0000
+++ 3d-viewer/3d_mesh_model.cpp	2014-07-30 23:40:41 +0000
@@ -57,6 +57,8 @@
 
 void S3D_MESH::openGL_RenderAllChilds()
 {
+    //DBG( printf( "openGL_RenderAllChilds") );
+
     glPushMatrix();
     glTranslatef( m_translation.x, m_translation.y, m_translation.z );
     glRotatef( m_rotation[3], m_rotation[0], m_rotation[1], m_rotation[2] );
@@ -76,12 +78,13 @@
     SetOpenGlDefaultMaterial();
 
     glPopMatrix();
+
 }
 
 
 void S3D_MESH::openGL_Render()
 {
-    //DBG( printf( "      render\n" ) );
+    //DBG( printf( "openGL_Render" ) );
 
     if( m_Materials )
     {
@@ -90,6 +93,7 @@
 
     if( m_CoordIndex.size() == 0)
     {
+
         return;
     }
 
@@ -134,7 +138,7 @@
         {
             for(unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
             {
-                glm::vec3 normal = m_PerVertexNormalsNormalized[m_CoordIndex[idx][ii]];
+                glm::vec3 normal = m_PerVertexNormalsNormalized[m_NormalIndex[idx][ii]];
                 glNormal3fv( &normal.x );
 
                 glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
@@ -176,6 +180,8 @@
 
 void S3D_MESH::calcPointNormalized ()
 {
+    //DBG( printf( "calcPointNormalized\n" ) );
+
     if( isPointNormalizedComputed == true )
     {
         return;
@@ -221,8 +227,11 @@
 
 void S3D_MESH::calcPerFaceNormals ()
 {
+    //DBG( printf( "calcPerFaceNormals" ) );
+
     if( isPerFaceNormalsComputed == true )
     {
+
         return;
     }
     isPerFaceNormalsComputed = true;
@@ -230,6 +239,7 @@
 
     if( m_PerVertexNormalsNormalized.size() > 0 )
     {
+
         return;
     }
 
@@ -317,12 +327,15 @@
         }
         
     }
+
 }
 
 // http://www.bytehazard.com/code/vertnorm.html
 // http://www.emeyex.com/site/tuts/VertexNormals.pdf
 void S3D_MESH::calcPerPointNormals ()
 {
+    //DBG( printf( "calcPerPointNormals" ) );
+
     if( isPerPointNormalsComputed == true )
     {
         return;

=== modified file '3d-viewer/3d_mesh_model.h'
--- 3d-viewer/3d_mesh_model.h	2014-07-30 09:01:25 +0000
+++ 3d-viewer/3d_mesh_model.h	2014-07-30 23:40:41 +0000
@@ -66,6 +66,7 @@
     // Point and index list
     std::vector< glm::vec3 > m_Point;
     std::vector< std::vector<int> > m_CoordIndex;
+    std::vector< std::vector<int> > m_NormalIndex;
     std::vector< glm::vec3 > m_PerFaceNormalsNormalized;
     std::vector< glm::vec3 > m_PerVertexNormalsNormalized;
 

=== modified file '3d-viewer/modelparsers.h'
--- 3d-viewer/modelparsers.h	2014-07-30 09:01:25 +0000
+++ 3d-viewer/modelparsers.h	2014-07-30 23:40:41 +0000
@@ -167,6 +167,7 @@
     int read_IndexedFaceSet();
     int read_Coordinate();
     int read_Normal();
+    int read_NormalIndex();
     int read_Color();
     int read_coordIndex();
     int read_colorIndex();

=== modified file '3d-viewer/vrml_v1_modelparser.cpp'
--- 3d-viewer/vrml_v1_modelparser.cpp	2014-07-30 09:01:25 +0000
+++ 3d-viewer/vrml_v1_modelparser.cpp	2014-07-30 23:40:41 +0000
@@ -68,6 +68,9 @@
     glShadeModel( GL_SMOOTH );
     glEnable( GL_NORMALIZE );
 
+    float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
+    glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
+
     glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y, GetMaster()->m_MatScale.z );
     glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y, GetMaster()->m_MatRotation.z );
     glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y, GetMaster()->m_MatPosition.z );
@@ -78,14 +81,11 @@
     //glPushMatrix();
     glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
 
-    glRotatef( matRot.z, 0.0f, 0.0f, 1.0f );
-    glRotatef( matRot.y, 0.0f, 1.0f, 0.0f );
-    glRotatef( matRot.x, 1.0f, 0.0f, 0.0f );
+    glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
+    glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
+    glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
     
     glScalef( matScale.x, matScale.y, matScale.z );    
-    
-    float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
-    glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
 
     // Switch the locale to standard C (needed to print floating point numbers like 1.3)
     SetLocaleTo_C_standard();

=== modified file '3d-viewer/vrml_v2_modelparser.cpp'
--- 3d-viewer/vrml_v2_modelparser.cpp	2014-07-30 09:01:25 +0000
+++ 3d-viewer/vrml_v2_modelparser.cpp	2014-07-30 23:40:41 +0000
@@ -70,6 +70,9 @@
     glShadeModel(GL_SMOOTH);
     glEnable(GL_NORMALIZE);
 
+    float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
+    glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
+
     glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y, GetMaster()->m_MatScale.z );
     glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y, GetMaster()->m_MatRotation.z );
     glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y, GetMaster()->m_MatPosition.z );
@@ -80,14 +83,11 @@
     //glPushMatrix();
     glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
 
-    glRotatef( matRot.z, 0.0f, 0.0f, 1.0f );
-    glRotatef( matRot.y, 0.0f, 1.0f, 0.0f );
-    glRotatef( matRot.x, 1.0f, 0.0f, 0.0f );
+    glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
+    glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
+    glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
     
     glScalef( matScale.x, matScale.y, matScale.z );
-    
-    float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
-    glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
 
     // Switch the locale to standard C (needed to print floating point numbers like 1.3)
     SetLocaleTo_C_standard();
@@ -546,12 +546,10 @@
             read_Coordinate();
         } else if( strcmp( text, "Normal" ) == 0 )
         {
-            //read_Normal();
-            read_NotImplemented( m_file, '}' );
+            read_Normal();
         } else if( strcmp( text, "normalIndex" ) == 0 )
         {
-            //DBG( printf( "    normalIndex NotImplemented\n" ) );
-            read_NotImplemented( m_file, ']' );
+            read_NormalIndex();
         } else if( strcmp( text, "Color" ) == 0 )
         {
             read_Color();
@@ -606,6 +604,38 @@
 }
 
 
+int VRML2_MODEL_PARSER::read_NormalIndex()
+{
+    //DBG( printf( "    read_NormalIndex\n" ) );
+
+    m_model->m_NormalIndex.clear();
+
+    glm::ivec3 coord;
+
+    int dummy; // should be -1
+
+    std::vector<int> coord_list;
+    coord_list.clear();
+    while( fscanf (m_file, "%d, ", &dummy ) == 1 )
+    {
+        if( dummy == -1 )
+        {
+            m_model->m_NormalIndex.push_back( coord_list );
+            //DBG( printf( " size: %lu ", coord_list.size()) );
+            coord_list.clear();
+        } else
+        {
+            coord_list.push_back( dummy );
+            //DBG( printf( "%d ", dummy) );
+        }
+    }
+
+    //DBG( printf( "    m_NormalIndex.size: %ld\n", m_model->m_NormalIndex.size() ) );    
+
+    return 0;
+}
+
+
 int VRML2_MODEL_PARSER::read_coordIndex()
 {
     //DBG( printf( "    read_coordIndex\n" ) );

=== modified file '3d-viewer/vrmlmodelparser.cpp'
--- 3d-viewer/vrmlmodelparser.cpp	2014-07-30 09:01:25 +0000
+++ 3d-viewer/vrmlmodelparser.cpp	2014-07-30 23:40:41 +0000
@@ -64,7 +64,7 @@
     char       line[12];
     FILE*      file;
 
-    // DBG( printf( "Load %s\n", static_cast<const char*>(aFilename.mb_str()) ) );
+    //DBG( printf( "Load %s", static_cast<const char*>(aFilename.mb_str()) ) );
 
     file = wxFopen( aFilename, wxT( "rt" ) );
 
@@ -86,7 +86,7 @@
     {
         //DBG( printf( "About to parser a #VRML V2.0 file\n" ) );
         vrml2_parser->Load( aFilename );
-
+        
         return;
     }
     else if( stricmp( line, "#VRML V1.0" ) == 0)

=== modified file '3d-viewer/x3dmodelparser.cpp'
--- 3d-viewer/x3dmodelparser.cpp	2014-07-30 09:01:25 +0000
+++ 3d-viewer/x3dmodelparser.cpp	2014-07-30 23:40:41 +0000
@@ -69,18 +69,23 @@
     glShadeModel(GL_SMOOTH);
     glEnable(GL_NORMALIZE);
 
-    glm::vec3 matScale(GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y, GetMaster()->m_MatScale.z );
-    glm::vec3 matRot(GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y, GetMaster()->m_MatRotation.z );
-    glm::vec3 matPos(GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y, GetMaster()->m_MatPosition.z );
-
+    float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
+    glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
+
+    glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y, GetMaster()->m_MatScale.z );
+    glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y, GetMaster()->m_MatRotation.z );
+    glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y, GetMaster()->m_MatPosition.z );
+    
+
+#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
 
     //glPushMatrix();
-    glTranslatef( matPos.x, matPos.y, matPos.z);
-
-    glRotatef( matRot.z, 0.0f, 0.0f, 1.0f);
-    glRotatef( matRot.y, 0.0f, 1.0f, 0.0f);
-    glRotatef( matRot.x, 1.0f, 0.0f, 0.0f);
-
+    glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
+
+    glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
+    glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
+    glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
+    
     glScalef( matScale.x, matScale.y, matScale.z );
 
     // Switch the locale to standard C (needed to print floating point numbers)
@@ -502,9 +507,6 @@
 
         //triplets.push_back(point);
 
-        double vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
-        point *= vrmlunits_to_3Dunits;
-
         m_model->m_Point.push_back( point );
 
         // VRML

# Begin bundle
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
4BbsBDSIxqC/u8ENXbHvJSJH8C7kinChIEovxvo=
