3d_viewer fix translation and rotation issues (patch from Mario Luzeiro)

This commit is contained in:
unknown 2014-07-31 09:01:30 +02:00 committed by jean-pierre charras
parent 34b645daed
commit 73005087d5
10 changed files with 100 additions and 43 deletions

View File

@ -424,7 +424,7 @@ void EDA_3D_CANVAS::Redraw()
// 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 @@ void EDA_3D_CANVAS::Redraw()
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 @@ void EDA_3D_CANVAS::BuildBoard3DView(GLuint aBoardList, GLuint aBodyOnlyList)
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 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
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 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
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 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
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 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
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();

View File

@ -51,12 +51,12 @@ static void CALLBACK tessCPolyPt2Vertex( const GLvoid* data );
// 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 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
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 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
// before calling gluDeleteTess
gluTessVertex( tess, v_data, &polylist[ii] );
if( polylist.IsEndContour( ii ) )
{
gluTessEndContour( tess );
@ -215,7 +220,9 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
gluDeleteTess( tess );
if( aThickness == 0 )
{
return;
}
// Build the 3D data : vertical side
Draw3D_VerticalPolygonalCylinder( polylist, aThickness, aZpos - (aThickness / 2.0), false, aBiuTo3DUnits );

View File

@ -54,10 +54,10 @@ S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
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 );

View File

@ -57,6 +57,8 @@ S3D_MESH::~S3D_MESH()
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 @@ void S3D_MESH::openGL_RenderAllChilds()
SetOpenGlDefaultMaterial();
glPopMatrix();
}
void S3D_MESH::openGL_Render()
{
//DBG( printf( " render\n" ) );
//DBG( printf( "openGL_Render" ) );
if( m_Materials )
{
@ -90,6 +93,7 @@ void S3D_MESH::openGL_Render()
if( m_CoordIndex.size() == 0)
{
return;
}
@ -134,7 +138,7 @@ void S3D_MESH::openGL_Render()
{
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::openGL_Render()
void S3D_MESH::calcPointNormalized ()
{
//DBG( printf( "calcPointNormalized\n" ) );
if( isPointNormalizedComputed == true )
{
return;
@ -221,8 +227,11 @@ bool IsClockwise(glm::vec3 v0, glm::vec3 v1, glm::vec3 v2)
void S3D_MESH::calcPerFaceNormals ()
{
//DBG( printf( "calcPerFaceNormals" ) );
if( isPerFaceNormalsComputed == true )
{
return;
}
isPerFaceNormalsComputed = true;
@ -230,6 +239,7 @@ void S3D_MESH::calcPerFaceNormals ()
if( m_PerVertexNormalsNormalized.size() > 0 )
{
return;
}
@ -317,12 +327,15 @@ void S3D_MESH::calcPerFaceNormals ()
}
}
}
// 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;

View File

@ -66,6 +66,7 @@ public:
// 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;

View File

@ -167,6 +167,7 @@ private:
int read_IndexedFaceSet();
int read_Coordinate();
int read_Normal();
int read_NormalIndex();
int read_Color();
int read_coordIndex();
int read_colorIndex();

View File

@ -68,6 +68,9 @@ void VRML1_MODEL_PARSER::Load( const wxString aFilename )
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,15 +81,12 @@ void VRML1_MODEL_PARSER::Load( const wxString aFilename )
//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();

View File

@ -70,6 +70,9 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
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,15 +83,12 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
//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 @@ int VRML2_MODEL_PARSER::read_IndexedFaceSet()
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_colorIndex()
}
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" ) );

View File

@ -64,7 +64,7 @@ void VRML_MODEL_PARSER::Load( const wxString aFilename )
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" ) );

View File

@ -69,17 +69,22 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
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 );
//glPushMatrix();
glTranslatef( matPos.x, matPos.y, matPos.z);
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
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);
//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 );
glScalef( matScale.x, matScale.y, matScale.z );
@ -502,9 +507,6 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
//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