# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: mrluzeiro@ua.pt-20140801212739-n0rzuizmel51xkg7
# target_branch: http://bazaar.launchpad.net/~kicad-product-\
#   committers/kicad/product/
# testament_sha1: e9424d59120e9c1b5d4ec24473e43ca1ea439dba
# timestamp: 2014-08-01 23:28:40 +0200
# base_revision_id: maciej.suminski@cern.ch-20140801092808-\
#   7it5ztubgzld7rsb
# 
# Begin patch
=== modified file '3d-viewer/3d_canvas.cpp'
--- 3d-viewer/3d_canvas.cpp	2014-07-30 15:39:55 +0000
+++ 3d-viewer/3d_canvas.cpp	2014-08-01 21:18:46 +0000
@@ -52,8 +52,8 @@
         }
 
         errLast = err;
-
-        wxLogError( wxT( "OpenGL error %d\nAt: %s, line: %d" ), err, aFileName, aLineNumber );
+        
+        wxLogError( wxT( "OpenGL error %d At: %s, line: %d" ), err,  GetChars( FROM_UTF8( aFileName ) ), aLineNumber );
     }
 }
 

=== modified file '3d-viewer/3d_draw.cpp'
--- 3d-viewer/3d_draw.cpp	2014-07-31 07:01:30 +0000
+++ 3d-viewer/3d_draw.cpp	2014-08-01 21:27:39 +0000
@@ -531,7 +531,6 @@
             glBindTexture( GL_TEXTURE_2D, m_text_fake_shadow_back );
             glCallList( m_glLists[GL_ID_SHADOW_BACK] );
         }
-
         glColor4f( 1.0, 1.0, 1.0, 1.0 );
 
         glEnable( GL_DEPTH_TEST );

=== modified file '3d-viewer/3d_draw_basic_functions.cpp'
--- 3d-viewer/3d_draw_basic_functions.cpp	2014-07-31 07:01:30 +0000
+++ 3d-viewer/3d_draw_basic_functions.cpp	2014-08-01 21:27:39 +0000
@@ -172,9 +172,11 @@
     // Draw solid areas contained in this list
     CPOLYGONS_LIST polylist = aPolysList;    // temporary copy for gluTessVertex
 
+    int startContour;
+
     for( int side = 0; side < 2; side++ )
     {
-        int startContour = 1;
+        startContour = 1;
 
         for( unsigned ii = 0; ii < polylist.GetCornersCount(); ii++ )
         {
@@ -217,6 +219,12 @@
         SetNormalZneg();
     }
 
+    if( startContour == 0 )
+    {
+        gluTessEndContour( tess );
+        gluTessEndPolygon( tess );
+    }
+
     gluDeleteTess( tess );
 
     if( aThickness == 0 )

=== modified file '3d-viewer/3d_mesh_model.cpp'
--- 3d-viewer/3d_mesh_model.cpp	2014-07-31 07:01:30 +0000
+++ 3d-viewer/3d_mesh_model.cpp	2014-08-01 21:27:39 +0000
@@ -121,7 +121,7 @@
         {       
             if( m_Materials )
             {
-                m_Materials->SetOpenGLMaterial(m_MaterialIndex[idx]);
+                m_Materials->SetOpenGLMaterial( m_MaterialIndex[idx] );
             }
         }          
         
@@ -136,7 +136,7 @@
 
         if( m_PerVertexNormalsNormalized.size() > 0 )
         {
-            for(unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
+            for( unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
             {
                 glm::vec3 normal = m_PerVertexNormalsNormalized[m_NormalIndex[idx][ii]];
                 glNormal3fv( &normal.x );
@@ -211,9 +211,12 @@
         p = m_Point[i] * biggerPoint;
         m_PointNormalized.push_back( p );
     }
+
+    //DBG( printf("m_Point.size %u\n", m_Point.size()) );
 }
 
-bool IsClockwise(glm::vec3 v0, glm::vec3 v1, glm::vec3 v2)
+
+bool IsClockwise( glm::vec3 v0, glm::vec3 v1, glm::vec3 v2 )
 {
     double sum = 0.0;
 
@@ -253,6 +256,9 @@
     m_PerFaceNormalsRaw.clear();
     m_PerFaceSquaredArea.clear();
 
+    //DBG( printf("m_CoordIndex.size %u\n", m_CoordIndex.size()) );
+    //DBG( printf("m_PointNormalized.size %u\n", m_PointNormalized.size()) );
+    
     for( unsigned int idx = 0; idx < m_CoordIndex.size(); idx++ )
     {
 
@@ -289,7 +295,7 @@
             area = -area;
         }
 
-        if (area < FLT_EPSILON)
+        if( area < FLT_EPSILON )
         {
             area = FLT_EPSILON * 2.0f;
         }
@@ -311,10 +317,10 @@
             else
             {
                 // Cannot calc normal
-                if( (cross_prod.x > cross_prod.y) && (cross_prod.x > cross_prod.z))
+                if( ( cross_prod.x > cross_prod.y ) && ( cross_prod.x > cross_prod.z ) )
                 {
                     cross_prod.x = 1.0;    cross_prod.y = 0.0; cross_prod.z = 0.0;
-                } else if( (cross_prod.y > cross_prod.x) && (cross_prod.y > cross_prod.z))
+                } else if( ( cross_prod.y > cross_prod.x ) && ( cross_prod.y > cross_prod.z ))
                 {
                     cross_prod.x = 0.0;    cross_prod.y = 1.0; cross_prod.z = 0.0;
                 } else
@@ -363,17 +369,19 @@
         {
             face_A_normals[each_vert_A_idx] = m_PerFaceNormalsRaw[each_face_A_idx] * (m_PerFaceSquaredArea[each_face_A_idx]);
 
-            // for each face A in mesh
+            int vertexIndex = (int)(m_CoordIndex[each_face_A_idx][each_vert_A_idx]);
+            glm::vec3 vector_face_A = m_PerFaceNormalsNormalized[each_face_A_idx];
+
+            // for each face B in mesh
             for( unsigned int each_face_B_idx = 0; each_face_B_idx < m_CoordIndex.size(); each_face_B_idx++ )
             {
                 //if A != B { // ignore self
                 if ( each_face_A_idx != each_face_B_idx)
                 {
-                    if( (m_CoordIndex[each_face_B_idx][0] == (int)(m_CoordIndex[each_face_A_idx][each_vert_A_idx])) ||
-                        (m_CoordIndex[each_face_B_idx][1] == (int)(m_CoordIndex[each_face_A_idx][each_vert_A_idx])) ||
-                        (m_CoordIndex[each_face_B_idx][2] == (int)(m_CoordIndex[each_face_A_idx][each_vert_A_idx])) )
+                    if( (m_CoordIndex[each_face_B_idx][0] == vertexIndex) ||
+                        (m_CoordIndex[each_face_B_idx][1] == vertexIndex) ||
+                        (m_CoordIndex[each_face_B_idx][2] == vertexIndex) )
                     {
-                        glm::vec3 vector_face_A = m_PerFaceNormalsNormalized[each_face_A_idx];
                         glm::vec3 vector_face_B = m_PerFaceNormalsNormalized[each_face_B_idx];
 
                         float dot_prod = glm::dot(vector_face_A, vector_face_B);

=== modified file '3d-viewer/vrml_v2_modelparser.cpp'
--- 3d-viewer/vrml_v2_modelparser.cpp	2014-07-31 07:01:30 +0000
+++ 3d-viewer/vrml_v2_modelparser.cpp	2014-08-01 21:27:39 +0000
@@ -80,7 +80,6 @@
 
 #define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
 
-    //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 );
@@ -140,7 +139,7 @@
 {
     char       text[128];
 
-    ///DBG( printf( "Transform\n" ) ); 
+    //DBG( printf( "Transform\n" ) ); 
 
     while( GetNextTag( m_file, text ) )
     {
@@ -204,7 +203,7 @@
             read_DEF();
         } else
         {
-            //DBG( printf( "    %s NotImplemented\n", text ) );
+            DBG( printf( "    %s NotImplemented\n", text ) );
             read_NotImplemented( m_file, '}' );
         }
     }
@@ -264,7 +263,7 @@
         }
     }
 
-    //DBG( printf( "  DEF failed\n" ) );
+    DBG( printf( "  DEF failed\n" ) );
     return -1;
 }
 
@@ -302,12 +301,12 @@
             read_IndexedFaceSet();
         } else
         {
-            //DBG( printf( "    %s NotImplemented\n", text ) );
+            DBG( printf( "    %s NotImplemented\n", text ) );
             read_NotImplemented( m_file, '}' );
         }
     }
 
-    //DBG( printf( "  Shape failed\n") );
+    DBG( printf( "  Shape failed\n") );
     return -1;
 }
 
@@ -336,7 +335,7 @@
         }
     }
 
-    //DBG( printf( "  Appearance failed\n") );
+    DBG( printf( "  Appearance failed\n") );
     return -1;
 }
 
@@ -407,12 +406,12 @@
                         return 0;
                     }
                 }
-                //DBG( printf( "   read_material error: material not found\n" ) );
+                DBG( printf( "   read_material error: material not found\n" ) );
             }
         }
     }
 
-    //DBG( printf( "  failed material\n") );
+    DBG( printf( "  failed material\n") );
     return -1;
 }
 

=== modified file '3d-viewer/x3dmodelparser.cpp'
--- 3d-viewer/x3dmodelparser.cpp	2014-07-31 07:01:30 +0000
+++ 3d-viewer/x3dmodelparser.cpp	2014-08-01 21:27:39 +0000
@@ -79,7 +79,7 @@
 
 #define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
 
-    //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 );
@@ -249,7 +249,7 @@
             DBG( printf("diffuseColor parsing error") );
         } else
         {
-            // Do not use this diffuse color
+            m_model->m_Materials->m_DiffuseColor.push_back( color );
         }
 
         if( !parseDoubleTriplet( properties[ wxT( "specularColor" ) ],
@@ -334,12 +334,12 @@
                                                              material->m_SpecularColor[0].x,
                                                              material->m_SpecularColor[0].y,
                                                              material->m_SpecularColor[0].z ) );
-/*
+
                 vrml_material.Append( wxString::Format( wxT( "diffuseColor %f %f %f\n" ),
                                                              material->m_DiffuseColor[0].x,
                                                              material->m_DiffuseColor[0].y,
                                                              material->m_DiffuseColor[0].z ) );
-*/
+
                 vrml_material.Append( wxString::Format( wxT( "emissiveColor %f %f %f\n" ),
                                                              material->m_EmissiveColor[0].x,
                                                              material->m_EmissiveColor[0].y,
@@ -505,8 +505,6 @@
         point.y += translation.y;
         point.z += translation.z;
 
-        //triplets.push_back(point);
-
         m_model->m_Point.push_back( point );
 
         // VRML
@@ -522,44 +520,49 @@
     NODE_LIST color;
     GetChildsByName( aFaceNode, wxT( "Color" ), color);
 
-    PROPERTY_MAP color_properties;
-    // IndexedFaceSet has one Coordinate child node
-    GetNodeProperties( color[0], color_properties );
-
-    // Save points to vector as doubles
-    wxStringTokenizer colorpoint_tokens( color_properties[ wxT("color") ] );
-    double color_point = 0.0;
-
-    while( colorpoint_tokens.HasMoreTokens() )
-    {
-        if( colorpoint_tokens.GetNextToken().ToDouble( &color_point ) )
-        {
-            color_points.push_back( color_point );
-        }
-        else
-        {
-            wxLogError( wxT( "Error converting to double" ) );
-        }
-    }
-
-    if( color_points.size() % 3 != 0 )
-    {
-        DBG( printf( "Number of points is incorrect" ) );
-        return;
-    }
-
-    /* Create 3D face color from 3 color points
-     */
-    for( unsigned id = 0; id < color_points.size() / 3; id++ )
-    {
-        m_model->m_MaterialIndex.push_back( id );
-
-        int color_triplet_indx = id * 3;
-        glm::vec3 colorface( color_points[ color_triplet_indx + 0 ],
-                             color_points[ color_triplet_indx + 1 ],
-                             color_points[ color_triplet_indx + 2 ] );
-
-        m_model->m_Materials->m_DiffuseColor.push_back( colorface );
+    // Some models lack color information, need to handle this safely
+    if( !color.empty() )
+    {
+        PROPERTY_MAP color_properties;
+        // IndexedFaceSet has one Coordinate child node
+        GetNodeProperties( color[0], color_properties );
+
+        // Save points to vector as doubles
+        wxStringTokenizer colorpoint_tokens( color_properties[ wxT("color") ] );
+        double color_point = 0.0;
+
+        while( colorpoint_tokens.HasMoreTokens() )
+        {
+            if( colorpoint_tokens.GetNextToken().ToDouble( &color_point ) )
+            {
+                color_points.push_back( color_point );
+            }
+            else
+            {
+                wxLogError( wxT( "Error converting to double" ) );
+            }
+        }
+
+        if( color_points.size() % 3 != 0 )
+        {
+            DBG( printf( "Number of points is incorrect" ) );
+            return;
+        }
+
+        /* Create 3D face color from 3 color points
+         */
+        m_model->m_Materials->m_DiffuseColor.clear();
+        for( unsigned id = 0; id < color_points.size() / 3; id++ )
+        {
+            m_model->m_MaterialIndex.push_back( id );
+
+            int color_triplet_indx = id * 3;
+            glm::vec3 colorface( color_points[ color_triplet_indx + 0 ],
+                                 color_points[ color_triplet_indx + 1 ],
+                                 color_points[ color_triplet_indx + 2 ] );
+
+            m_model->m_Materials->m_DiffuseColor.push_back( colorface );
+        }
     }
 
 

# Begin bundle
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
/4u5IpwoSFcOES0A
