Commit bff11cea authored by jean-pierre charras's avatar jean-pierre charras

3D viewer: code tweaking

parent 20acc9a9
...@@ -241,7 +241,7 @@ void EDA_3D_CANVAS::Draw3D_Zone( ZONE_CONTAINER* aZone ) ...@@ -241,7 +241,7 @@ void EDA_3D_CANVAS::Draw3D_Zone( ZONE_CONTAINER* aZone )
if( layer == LAST_COPPER_LAYER ) if( layer == LAST_COPPER_LAYER )
layer = g_Parm_3D_Visu.m_CopperLayersCount - 1; layer = g_Parm_3D_Visu.m_CopperLayersCount - 1;
int zpos = KiROUND( g_Parm_3D_Visu.m_LayerZcoord[layer] / g_Parm_3D_Visu.m_BiuTo3Dunits ); int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( layer );
SetGLColor( color ); SetGLColor( color );
glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( layer ) ); glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( layer ) );
...@@ -460,7 +460,7 @@ void EDA_3D_CANVAS::Draw3D_Track( TRACK* aTrack ) ...@@ -460,7 +460,7 @@ void EDA_3D_CANVAS::Draw3D_Track( TRACK* aTrack )
if( layer == LAST_COPPER_LAYER ) if( layer == LAST_COPPER_LAYER )
layer = g_Parm_3D_Visu.m_CopperLayersCount - 1; layer = g_Parm_3D_Visu.m_CopperLayersCount - 1;
int zpos = KiROUND( g_Parm_3D_Visu.m_LayerZcoord[layer] / g_Parm_3D_Visu.m_BiuTo3Dunits ); int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( layer );
SetGLColor( color ); SetGLColor( color );
glNormal3f( 0.0, 0.0, (layer == LAYER_N_BACK) ? -1.0 : 1.0 ); glNormal3f( 0.0, 0.0, (layer == LAYER_N_BACK) ? -1.0 : 1.0 );
...@@ -485,7 +485,7 @@ void EDA_3D_CANVAS::Draw3D_Via( SEGVIA* via ) ...@@ -485,7 +485,7 @@ void EDA_3D_CANVAS::Draw3D_Via( SEGVIA* via )
// Drawing horizontal thick rings: // Drawing horizontal thick rings:
for( layer = bottom_layer; layer < g_Parm_3D_Visu.m_CopperLayersCount; layer++ ) for( layer = bottom_layer; layer < g_Parm_3D_Visu.m_CopperLayersCount; layer++ )
{ {
int zpos = KiROUND( g_Parm_3D_Visu.m_LayerZcoord[layer] / biu_to_3Dunits ); int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( layer );
if( layer < g_Parm_3D_Visu.m_CopperLayersCount - 1 ) if( layer < g_Parm_3D_Visu.m_CopperLayersCount - 1 )
{ {
...@@ -518,7 +518,7 @@ void EDA_3D_CANVAS::Draw3D_Via( SEGVIA* via ) ...@@ -518,7 +518,7 @@ void EDA_3D_CANVAS::Draw3D_Via( SEGVIA* via )
color = g_ColorsSettings.GetItemColor( VIAS_VISIBLE + via->m_Shape ); color = g_ColorsSettings.GetItemColor( VIAS_VISIBLE + via->m_Shape );
SetGLColor( color ); SetGLColor( color );
int height = g_Parm_3D_Visu.GetLayerZcoordBIU(top_layer) - int height = g_Parm_3D_Visu.GetLayerZcoordBIU(top_layer) -
g_Parm_3D_Visu.m_LayerZcoord[bottom_layer] - thickness; g_Parm_3D_Visu.GetLayerZcoordBIU( bottom_layer ) - thickness;
int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU(bottom_layer) + thickness/2; int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU(bottom_layer) + thickness/2;
Draw3D_ZaxisCylinder( via->m_Start, inner_radius + thickness/2, height, Draw3D_ZaxisCylinder( via->m_Start, inner_radius + thickness/2, height,
...@@ -625,7 +625,7 @@ void EDA_3D_CANVAS::Draw3D_DrawText( TEXTE_PCB* text ) ...@@ -625,7 +625,7 @@ void EDA_3D_CANVAS::Draw3D_DrawText( TEXTE_PCB* text )
int color = g_ColorsSettings.GetLayerColor( layer ); int color = g_ColorsSettings.GetLayerColor( layer );
SetGLColor( color ); SetGLColor( color );
s_Text3DZPos = KiROUND( g_Parm_3D_Visu.m_LayerZcoord[layer] / g_Parm_3D_Visu.m_BiuTo3Dunits ); s_Text3DZPos = g_Parm_3D_Visu.GetLayerZcoordBIU( layer );
s_Text3DWidth = text->GetThickness(); s_Text3DWidth = text->GetThickness();
glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( layer ) ); glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( layer ) );
wxSize size = text->m_Size; wxSize size = text->m_Size;
...@@ -681,13 +681,19 @@ void MODULE::Draw3D( EDA_3D_CANVAS* glcanvas ) ...@@ -681,13 +681,19 @@ void MODULE::Draw3D( EDA_3D_CANVAS* glcanvas )
S3D_MASTER* Struct3D = m_3D_Drawings; S3D_MASTER* Struct3D = m_3D_Drawings;
bool As3dShape = false; bool As3dShape = false;
if (g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_MODULE]) if( g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_MODULE] )
{ {
double zpos;
if( m_Layer == LAYER_N_BACK )
zpos = g_Parm_3D_Visu.GetModulesZcoord3DIU( true );
else
zpos = g_Parm_3D_Visu.GetModulesZcoord3DIU( false );
glPushMatrix(); glPushMatrix();
glTranslatef( m_Pos.x * g_Parm_3D_Visu.m_BiuTo3Dunits, glTranslatef( m_Pos.x * g_Parm_3D_Visu.m_BiuTo3Dunits,
-m_Pos.y * g_Parm_3D_Visu.m_BiuTo3Dunits, -m_Pos.y * g_Parm_3D_Visu.m_BiuTo3Dunits,
g_Parm_3D_Visu.m_LayerZcoord[m_Layer] ); zpos );
if( m_Orient ) if( m_Orient )
{ {
......
...@@ -59,8 +59,8 @@ static void CALLBACK tessCPolyPt2Vertex( const GLvoid* data ); ...@@ -59,8 +59,8 @@ static void CALLBACK tessCPolyPt2Vertex( const GLvoid* data );
* Used to create the vertical sides of 3D horizontal shapes with thickness. * Used to create the vertical sides of 3D horizontal shapes with thickness.
*/ */
static void Draw3D_VerticalPolygonalCylinder( const std::vector<CPolyPt>& aPolysList, static void Draw3D_VerticalPolygonalCylinder( const std::vector<CPolyPt>& aPolysList,
int aHeight, int aHeight, int aZpos,
int aZpos, double aBiuTo3DUnits ) bool aInside, double aBiuTo3DUnits )
{ {
if( aHeight == 0 ) if( aHeight == 0 )
return; return;
...@@ -69,8 +69,16 @@ static void Draw3D_VerticalPolygonalCylinder( const std::vector<CPolyPt>& aPolys ...@@ -69,8 +69,16 @@ static void Draw3D_VerticalPolygonalCylinder( const std::vector<CPolyPt>& aPolys
coords.resize( 4 ); coords.resize( 4 );
// Init Z position of the 4 points of a GL_QUAD // Init Z position of the 4 points of a GL_QUAD
coords[0].z = aZpos; if( aInside )
coords[1].z = aZpos + aHeight; {
coords[0].z = aZpos;
coords[1].z = aZpos + aHeight;
}
else
{
coords[0].z = aZpos + aHeight;
coords[1].z = aZpos;
}
coords[2].z = coords[1].z; coords[2].z = coords[1].z;
coords[3].z = coords[0].z; coords[3].z = coords[0].z;
...@@ -87,12 +95,12 @@ static void Draw3D_VerticalPolygonalCylinder( const std::vector<CPolyPt>& aPolys ...@@ -87,12 +95,12 @@ static void Draw3D_VerticalPolygonalCylinder( const std::vector<CPolyPt>& aPolys
} }
// Build the 4 vertices of each GL_QUAD // Build the 4 vertices of each GL_QUAD
coords[0].x = aPolysList[jj].x; coords[0].x = aPolysList[ii].x;
coords[0].y = -aPolysList[jj].y; coords[0].y = -aPolysList[ii].y;
coords[1].x = coords[0].x; coords[1].x = coords[0].x;
coords[1].y = coords[0].y; // only z change coords[1].y = coords[0].y; // only z change
coords[2].x = aPolysList[ii].x; coords[2].x = aPolysList[jj].x;
coords[2].y = -aPolysList[ii].y; coords[2].y = -aPolysList[jj].y;
coords[3].x = coords[2].x; coords[3].x = coords[2].x;
coords[3].y = coords[2].y; // only z change coords[3].y = coords[2].y; // only z change
...@@ -192,7 +200,7 @@ void Draw3D_SolidHorizontalPolyPolygons( const std::vector<CPolyPt>& aPolysList, ...@@ -192,7 +200,7 @@ void Draw3D_SolidHorizontalPolyPolygons( const std::vector<CPolyPt>& aPolysList,
return; return;
// Build the 3D data : vertical side // Build the 3D data : vertical side
Draw3D_VerticalPolygonalCylinder( polylist, aThickness, aZpos, aBiuTo3DUnits ); Draw3D_VerticalPolygonalCylinder( polylist, aThickness, aZpos, false, aBiuTo3DUnits );
glNormal3f( 0.0, 0.0, 1.0 ); glNormal3f( 0.0, 0.0, 1.0 );
} }
...@@ -203,7 +211,8 @@ void Draw3D_SolidHorizontalPolyPolygons( const std::vector<CPolyPt>& aPolysList, ...@@ -203,7 +211,8 @@ void Draw3D_SolidHorizontalPolyPolygons( const std::vector<CPolyPt>& aPolysList,
* See Draw3D_SolidHorizontalPolyPolygons for more info * See Draw3D_SolidHorizontalPolyPolygons for more info
*/ */
void Draw3D_SolidHorizontalPolygonWithHoles( const std::vector<CPolyPt>& aPolysList, void Draw3D_SolidHorizontalPolygonWithHoles( const std::vector<CPolyPt>& aPolysList,
int aZpos, int aThickness, double aBiuTo3DUnits ) int aZpos, int aThickness,
double aBiuTo3DUnits )
{ {
std::vector<CPolyPt> polygon; std::vector<CPolyPt> polygon;
...@@ -225,7 +234,7 @@ void Draw3D_ZaxisCylinder( wxPoint aCenterPos, int aRadius, ...@@ -225,7 +234,7 @@ void Draw3D_ZaxisCylinder( wxPoint aCenterPos, int aRadius,
std::vector <CPolyPt> outer_cornerBuffer; std::vector <CPolyPt> outer_cornerBuffer;
TransformCircleToPolygon( outer_cornerBuffer, aCenterPos, TransformCircleToPolygon( outer_cornerBuffer, aCenterPos,
aRadius + (aThickness / 2), SEGM_PER_CIRCLE ); aRadius + (aThickness / 2), slice );
std::vector<S3D_VERTEX> coords; std::vector<S3D_VERTEX> coords;
coords.resize( 4 ); coords.resize( 4 );
...@@ -239,11 +248,11 @@ void Draw3D_ZaxisCylinder( wxPoint aCenterPos, int aRadius, ...@@ -239,11 +248,11 @@ void Draw3D_ZaxisCylinder( wxPoint aCenterPos, int aRadius,
{ {
// Draw the vertical outer side // Draw the vertical outer side
Draw3D_VerticalPolygonalCylinder( outer_cornerBuffer, Draw3D_VerticalPolygonalCylinder( outer_cornerBuffer,
aHeight, aZpos, aBiuTo3DUnits ); aHeight, aZpos, false, aBiuTo3DUnits );
if( aThickness ) if( aThickness )
// Draws the vertical inner side (hole) // Draws the vertical inner side (hole)
Draw3D_VerticalPolygonalCylinder( inner_cornerBuffer, Draw3D_VerticalPolygonalCylinder( inner_cornerBuffer,
aHeight, aZpos, aBiuTo3DUnits ); aHeight, aZpos, true, aBiuTo3DUnits );
} }
if( aThickness ) if( aThickness )
...@@ -286,32 +295,37 @@ void Draw3D_ZaxisOblongCylinder( wxPoint aAxis1Pos, wxPoint aAxis2Pos, ...@@ -286,32 +295,37 @@ void Draw3D_ZaxisOblongCylinder( wxPoint aAxis1Pos, wxPoint aAxis2Pos,
// Build the points to approximate oblong cylinder by segments // Build the points to approximate oblong cylinder by segments
std::vector <CPolyPt> outer_cornerBuffer; std::vector <CPolyPt> outer_cornerBuffer;
int width = aThickness + aRadius * 2; int segm_width = (aRadius * 2) + aThickness;
TransformRoundedEndsSegmentToPolygon( outer_cornerBuffer, aAxis1Pos, TransformRoundedEndsSegmentToPolygon( outer_cornerBuffer, aAxis1Pos,
aAxis2Pos, slice, width ); aAxis2Pos, slice, segm_width );
// Draw the oblong outer cylinder // Draw the oblong outer cylinder
if( aHeight ) if( aHeight )
Draw3D_VerticalPolygonalCylinder( outer_cornerBuffer, aHeight, aZpos, aBiuTo3DUnits ); Draw3D_VerticalPolygonalCylinder( outer_cornerBuffer, aHeight, aZpos,
false, aBiuTo3DUnits );
if( aThickness ) if( aThickness )
{ {
std::vector <CPolyPt> inner_cornerBuffer; std::vector <CPolyPt> inner_cornerBuffer;
width = aThickness - aRadius * 2; segm_width = aRadius * 2;
TransformRoundedEndsSegmentToPolygon( inner_cornerBuffer, aAxis1Pos, TransformRoundedEndsSegmentToPolygon( inner_cornerBuffer, aAxis1Pos,
aAxis2Pos, slice, width ); aAxis2Pos, slice, segm_width );
// Draw the oblong inner cylinder // Draw the oblong inner cylinder
if( aHeight ) if( aHeight )
Draw3D_VerticalPolygonalCylinder( inner_cornerBuffer, aHeight, Draw3D_VerticalPolygonalCylinder( inner_cornerBuffer, aHeight,
aZpos, aBiuTo3DUnits ); true, aZpos, aBiuTo3DUnits );
// draw top (front) horizontal side (ring) // Build the horizontal full polygon shape
// (outer polygon shape - inner polygon shape)
outer_cornerBuffer.insert( outer_cornerBuffer.end(), outer_cornerBuffer.insert( outer_cornerBuffer.end(),
inner_cornerBuffer.begin(), inner_cornerBuffer.end() ); inner_cornerBuffer.begin(),
std::vector<CPolyPt> polygon; inner_cornerBuffer.end() );
std::vector<CPolyPt> polygon;
ConvertPolysListWithHolesToOnePolygon( outer_cornerBuffer, polygon ); ConvertPolysListWithHolesToOnePolygon( outer_cornerBuffer, polygon );
// draw top (front) horizontal side (ring)
glNormal3f( 0.0, 0.0, 1.0 ); glNormal3f( 0.0, 0.0, 1.0 );
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos + aHeight, 0, aBiuTo3DUnits ); Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos + aHeight, 0, aBiuTo3DUnits );
......
...@@ -78,7 +78,7 @@ public: ...@@ -78,7 +78,7 @@ public:
double m_Quat[4]; // orientation of 3D view double m_Quat[4]; // orientation of 3D view
double m_Rot[4]; // rotation parameters of 3D view double m_Rot[4]; // rotation parameters of 3D view
double m_Zoom; // 3D zoom value double m_Zoom; // 3D zoom value
double m_3D_Grid; // 3D grid valmue, in mm double m_3D_Grid; // 3D grid value, in mm
S3D_COLOR m_BgColor; S3D_COLOR m_BgColor;
bool m_DrawFlags[FL_LAST]; // Enable/disable flags (see DISPLAY3D_FLG list) bool m_DrawFlags[FL_LAST]; // Enable/disable flags (see DISPLAY3D_FLG list)
wxPoint m_BoardPos; // center board actual position in board units wxPoint m_BoardPos; // center board actual position in board units
...@@ -90,10 +90,10 @@ public: ...@@ -90,10 +90,10 @@ public:
double m_BiuTo3Dunits; // Normalization scale to convert board double m_BiuTo3Dunits; // Normalization scale to convert board
// internal units to 3D units // internal units to 3D units
// to scale 3D units between -1.0 and +1.0 // to scale 3D units between -1.0 and +1.0
double m_LayerZcoord[LAYER_COUNT]; // Z position of each layer (normalized)
double m_CurrentZpos; // temporary storage of current value of Z position, double m_CurrentZpos; // temporary storage of current value of Z position,
// used in some calculation // used in some calculation
private: private:
double m_LayerZcoord[LAYER_COUNT]; // Z position of each layer (normalized)
double m_CopperThickness; // Copper thickness (normalized) double m_CopperThickness; // Copper thickness (normalized)
double m_EpoxyThickness; // Epoxy thickness (normalized) double m_EpoxyThickness; // Epoxy thickness (normalized)
double m_NonCopperLayerThickness; // Non copper layers thickness double m_NonCopperLayerThickness; // Non copper layers thickness
...@@ -108,6 +108,21 @@ public: INFO3D_VISU(); ...@@ -108,6 +108,21 @@ public: INFO3D_VISU();
*/ */
void InitSettings( BOARD* aBoard ); void InitSettings( BOARD* aBoard );
/**
* function GetModulesZcoord3DIU
* @return the Z coordinate of the module, in 3D Units
* @param aIsFlipped: true for modules on Front (top) layer, false
* if on back (bottom) layer
* Used to know the Z position of 3D shapes
*/
double GetModulesZcoord3DIU( bool aIsFlipped )
{
if( aIsFlipped )
return m_LayerZcoord[ADHESIVE_N_BACK] - m_NonCopperLayerThickness;
else
return m_LayerZcoord[ADHESIVE_N_FRONT] + m_NonCopperLayerThickness;
}
/** /**
* function GetLayerZcoordBIU * function GetLayerZcoordBIU
* @return the Z coordinate of the layer aLayer, in Board Internal Units * @return the Z coordinate of the layer aLayer, in Board Internal Units
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment