Rationalise 3D settings data-structure.

Move the camera out to its own so that everything else is board-
related, and then rename BOARD_ADAPTER.

At some point the flags should probably be moved out too, and they
can have the EDA_3D_SETTINGS name.
This commit is contained in:
Jeff Young 2020-03-26 14:05:20 +00:00
parent 3e247a70d5
commit 5134856f18
34 changed files with 749 additions and 787 deletions

View File

@ -42,7 +42,11 @@
PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, PCB_BASE_FRAME* aFrame, MODULE* aModule, PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, PCB_BASE_FRAME* aFrame, MODULE* aModule,
std::vector<MODULE_3D_SETTINGS>* aParentModelList ) : std::vector<MODULE_3D_SETTINGS>* aParentModelList ) :
PANEL_PREV_3D_BASE( aParent, wxID_ANY ) PANEL_PREV_3D_BASE( aParent, wxID_ANY ),
m_previewPane( nullptr ),
m_boardAdapter(),
m_currentCamera( m_trackBallCamera ),
m_trackBallCamera( RANGE_SCALE_3D )
{ {
m_userUnits = aFrame->GetUserUnits(); m_userUnits = aFrame->GetUserUnits();
@ -79,12 +83,9 @@ PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, PCB_BASE_FRAME* aFrame, MODULE*
m_dummyModule = new MODULE( *aModule ); m_dummyModule = new MODULE( *aModule );
m_dummyBoard->Add( m_dummyModule ); m_dummyBoard->Add( m_dummyModule );
// Set 3d viewer configuration for preview
m_settings3Dviewer = new EDA_3D_SETTINGS();
// Create the 3D canvas // Create the 3D canvas
m_previewPane = new EDA_3D_CANVAS( this, COGL_ATT_LIST::GetAttributesList( true ), m_previewPane = new EDA_3D_CANVAS( this, COGL_ATT_LIST::GetAttributesList( true ),
m_dummyBoard, *m_settings3Dviewer, m_dummyBoard, m_boardAdapter, m_currentCamera,
aFrame->Prj().Get3DCacheManager() ); aFrame->Prj().Get3DCacheManager() );
loadCommonSettings(); loadCommonSettings();
@ -113,7 +114,6 @@ PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, PCB_BASE_FRAME* aFrame, MODULE*
PANEL_PREV_3D::~PANEL_PREV_3D() PANEL_PREV_3D::~PANEL_PREV_3D()
{ {
delete m_settings3Dviewer;
delete m_dummyBoard; delete m_dummyBoard;
delete m_previewPane; delete m_previewPane;
} }
@ -137,7 +137,7 @@ void PANEL_PREV_3D::loadCommonSettings()
const DPI_SCALING dpi{ settings, this }; const DPI_SCALING dpi{ settings, this };
m_previewPane->SetScaleFactor( dpi.GetScaleFactor() ); m_previewPane->SetScaleFactor( dpi.GetScaleFactor() );
m_settings3Dviewer->SetFlag( FL_MOUSEWHEEL_PANNING, settings->m_Input.mousewheel_pan ); m_boardAdapter.SetFlag( FL_MOUSEWHEEL_PANNING, settings->m_Input.mousewheel_pan );
} }

View File

@ -42,6 +42,7 @@
#include <tools_holder.h> #include <tools_holder.h>
#include <3d_canvas/eda_3d_canvas.h> #include <3d_canvas/eda_3d_canvas.h>
#include <3d_viewer_id.h> #include <3d_viewer_id.h>
#include <3d_rendering/ctrack_ball.h>
// Define min and max parameter values // Define min and max parameter values
#define MAX_SCALE 10000.0 #define MAX_SCALE 10000.0
@ -66,10 +67,10 @@
class S3D_CACHE; class S3D_CACHE;
class FILENAME_RESOLVER; class FILENAME_RESOLVER;
class BOARD; class BOARD;
class EDA_3D_SETTINGS; class BOARD_ADAPTER;
class MODULE; class MODULE;
class PANEL_PREV_3D: public EDA_3D_SETTINGS_HOLDER, public TOOLS_HOLDER, public PANEL_PREV_3D_BASE class PANEL_PREV_3D: public EDA_3D_BOARD_HOLDER, public TOOLS_HOLDER, public PANEL_PREV_3D_BASE
{ {
public: public:
PANEL_PREV_3D( wxWindow* aParent, PCB_BASE_FRAME* aFrame, MODULE* aModule, PANEL_PREV_3D( wxWindow* aParent, PCB_BASE_FRAME* aFrame, MODULE* aModule,
@ -79,7 +80,9 @@ public:
private: private:
EDA_3D_CANVAS* m_previewPane; EDA_3D_CANVAS* m_previewPane;
EDA_3D_SETTINGS* m_settings3Dviewer; BOARD_ADAPTER m_boardAdapter;
CCAMERA& m_currentCamera;
CTRACK_BALL m_trackBallCamera;
BOARD* m_dummyBoard; BOARD* m_dummyBoard;
MODULE* m_dummyModule; MODULE* m_dummyModule;
@ -141,7 +144,7 @@ private:
void View3DISO( wxCommandEvent& event ) override void View3DISO( wxCommandEvent& event ) override
{ {
m_settings3Dviewer->CameraGet().ToggleProjection(); m_currentCamera.ToggleProjection();
m_previewPane->Refresh(); m_previewPane->Refresh();
} }
@ -189,7 +192,9 @@ public:
void OnMenuEvent( wxMenuEvent& aEvent ); void OnMenuEvent( wxMenuEvent& aEvent );
wxWindow* GetToolCanvas() const override { return m_previewPane; } wxWindow* GetToolCanvas() const override { return m_previewPane; }
EDA_3D_SETTINGS* GetSettings() override { return m_settings3Dviewer; }
BOARD_ADAPTER& GetAdapter() override { return m_boardAdapter; }
CCAMERA& GetCurrentCamera() override { return m_currentCamera; }
/** /**
* @brief SetModelDataIdx - Sets the currently selected index in the model list so that * @brief SetModelDataIdx - Sets the currently selected index in the model list so that

View File

@ -28,7 +28,7 @@
*/ */
#include "../3d_rendering/ccamera.h" #include "../3d_rendering/ccamera.h"
#include "3d_settings.h" #include "board_adapter.h"
#include <3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.h> #include <3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.h>
#include <class_board.h> #include <class_board.h>
#include <3d_math.h> #include <3d_math.h>
@ -44,22 +44,17 @@
* "KI_TRACE_EDA_CINFO3D_VISU". See the wxWidgets documentation on wxLogTrace for * "KI_TRACE_EDA_CINFO3D_VISU". See the wxWidgets documentation on wxLogTrace for
* more information. * more information.
*/ */
const wxChar *EDA_3D_SETTINGS::m_logTrace = wxT( "KI_TRACE_EDA_CINFO3D_VISU" ); const wxChar *BOARD_ADAPTER::m_logTrace = wxT( "KI_TRACE_EDA_CINFO3D_VISU" );
EDA_3D_SETTINGS G_null_EDA_3D_SETTINGS; BOARD_ADAPTER::BOARD_ADAPTER() :
EDA_3D_SETTINGS::EDA_3D_SETTINGS() :
m_board( nullptr ), m_board( nullptr ),
m_3d_model_manager( nullptr ), m_3d_model_manager( nullptr ),
m_colors( nullptr ), m_colors( nullptr ),
m_layerZcoordTop(), m_layerZcoordTop(),
m_layerZcoordBottom(), m_layerZcoordBottom()
m_currentCamera( m_trackBallCamera ),
m_trackBallCamera( RANGE_SCALE_3D )
{ {
wxLogTrace( m_logTrace, wxT( "EDA_3D_SETTINGS::EDA_3D_SETTINGS" ) ); wxLogTrace( m_logTrace, wxT( "BOARD_ADAPTER::BOARD_ADAPTER" ) );
m_3D_grid_type = GRID3D_TYPE::NONE; m_3D_grid_type = GRID3D_TYPE::NONE;
m_drawFlags.resize( FL_LAST, false ); m_drawFlags.resize( FL_LAST, false );
@ -119,13 +114,13 @@ EDA_3D_SETTINGS::EDA_3D_SETTINGS() :
} }
EDA_3D_SETTINGS::~EDA_3D_SETTINGS() BOARD_ADAPTER::~BOARD_ADAPTER()
{ {
destroyLayers(); destroyLayers();
} }
bool EDA_3D_SETTINGS::Is3DLayerEnabled( PCB_LAYER_ID aLayer ) const bool BOARD_ADAPTER::Is3DLayerEnabled( PCB_LAYER_ID aLayer ) const
{ {
wxASSERT( aLayer < PCB_LAYER_ID_COUNT ); wxASSERT( aLayer < PCB_LAYER_ID_COUNT );
@ -208,7 +203,7 @@ bool EDA_3D_SETTINGS::Is3DLayerEnabled( PCB_LAYER_ID aLayer ) const
} }
bool EDA_3D_SETTINGS::GetFlag( DISPLAY3D_FLG aFlag ) const bool BOARD_ADAPTER::GetFlag( DISPLAY3D_FLG aFlag ) const
{ {
wxASSERT( aFlag < FL_LAST ); wxASSERT( aFlag < FL_LAST );
@ -216,14 +211,14 @@ bool EDA_3D_SETTINGS::GetFlag( DISPLAY3D_FLG aFlag ) const
} }
void EDA_3D_SETTINGS::SetFlag( DISPLAY3D_FLG aFlag, bool aState ) void BOARD_ADAPTER::SetFlag( DISPLAY3D_FLG aFlag, bool aState )
{ {
wxASSERT( aFlag < FL_LAST ); wxASSERT( aFlag < FL_LAST );
m_drawFlags[aFlag] = aState; m_drawFlags[aFlag] = aState;
} }
bool EDA_3D_SETTINGS::ShouldModuleBeDisplayed( MODULE_ATTR_T aModuleAttributs ) const bool BOARD_ADAPTER::ShouldModuleBeDisplayed( MODULE_ATTR_T aModuleAttributs ) const
{ {
if( ( ( aModuleAttributs == MOD_DEFAULT ) && if( ( ( aModuleAttributs == MOD_DEFAULT ) &&
GetFlag( FL_MODULE_ATTRIBUTES_NORMAL ) ) || GetFlag( FL_MODULE_ATTRIBUTES_NORMAL ) ) ||
@ -243,12 +238,12 @@ bool EDA_3D_SETTINGS::ShouldModuleBeDisplayed( MODULE_ATTR_T aModuleAttributs )
#define COPPER_THICKNESS KiROUND( 0.035 * IU_PER_MM ) // for 35 um #define COPPER_THICKNESS KiROUND( 0.035 * IU_PER_MM ) // for 35 um
#define TECH_LAYER_THICKNESS KiROUND( 0.04 * IU_PER_MM ) #define TECH_LAYER_THICKNESS KiROUND( 0.04 * IU_PER_MM )
int EDA_3D_SETTINGS::GetCopperThicknessBIU() const int BOARD_ADAPTER::GetCopperThicknessBIU() const
{ {
return COPPER_THICKNESS; return COPPER_THICKNESS;
} }
unsigned int EDA_3D_SETTINGS::GetNrSegmentsCircle( float aDiameter3DU ) const unsigned int BOARD_ADAPTER::GetNrSegmentsCircle( float aDiameter3DU ) const
{ {
wxASSERT( aDiameter3DU > 0.0f ); wxASSERT( aDiameter3DU > 0.0f );
@ -256,7 +251,7 @@ unsigned int EDA_3D_SETTINGS::GetNrSegmentsCircle( float aDiameter3DU ) const
} }
unsigned int EDA_3D_SETTINGS::GetNrSegmentsCircle( int aDiameterBIU ) const unsigned int BOARD_ADAPTER::GetNrSegmentsCircle( int aDiameterBIU ) const
{ {
wxASSERT( aDiameterBIU > 0 ); wxASSERT( aDiameterBIU > 0 );
@ -265,7 +260,7 @@ unsigned int EDA_3D_SETTINGS::GetNrSegmentsCircle( int aDiameterBIU ) const
} }
double EDA_3D_SETTINGS::GetCircleCorrectionFactor( int aNrSides ) const double BOARD_ADAPTER::GetCircleCorrectionFactor( int aNrSides ) const
{ {
wxASSERT( aNrSides >= 3 ); wxASSERT( aNrSides >= 3 );
@ -273,9 +268,9 @@ double EDA_3D_SETTINGS::GetCircleCorrectionFactor( int aNrSides ) const
} }
void EDA_3D_SETTINGS::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWarningTextReporter ) void BOARD_ADAPTER::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWarningTextReporter )
{ {
wxLogTrace( m_logTrace, wxT( "EDA_3D_SETTINGS::InitSettings" ) ); wxLogTrace( m_logTrace, wxT( "BOARD_ADAPTER::InitSettings" ) );
// Calculates the board bounding box // Calculates the board bounding box
// First, use only the board outlines // First, use only the board outlines
@ -446,7 +441,7 @@ void EDA_3D_SETTINGS::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWa
#ifdef PRINT_STATISTICS_3D_VIEWER #ifdef PRINT_STATISTICS_3D_VIEWER
unsigned stats_stopCreateLayersTime = GetRunningMicroSecs(); unsigned stats_stopCreateLayersTime = GetRunningMicroSecs();
printf( "EDA_3D_SETTINGS::InitSettings times\n" ); printf( "BOARD_ADAPTER::InitSettings times\n" );
printf( " CreateBoardPoly: %.3f ms\n", printf( " CreateBoardPoly: %.3f ms\n",
(float)( stats_stopCreateBoardPolyTime - stats_startCreateBoardPolyTime ) / 1e3 ); (float)( stats_stopCreateBoardPolyTime - stats_startCreateBoardPolyTime ) / 1e3 );
printf( " CreateLayers and holes: %.3f ms\n", printf( " CreateLayers and holes: %.3f ms\n",
@ -456,7 +451,7 @@ void EDA_3D_SETTINGS::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWa
} }
bool EDA_3D_SETTINGS::createBoardPolygon() bool BOARD_ADAPTER::createBoardPolygon()
{ {
m_board_poly.RemoveAllContours(); m_board_poly.RemoveAllContours();
@ -466,7 +461,7 @@ bool EDA_3D_SETTINGS::createBoardPolygon()
} }
float EDA_3D_SETTINGS::GetModulesZcoord3DIU( bool aIsFlipped ) const float BOARD_ADAPTER::GetModulesZcoord3DIU( bool aIsFlipped ) const
{ {
if( aIsFlipped ) if( aIsFlipped )
{ {
@ -485,7 +480,7 @@ float EDA_3D_SETTINGS::GetModulesZcoord3DIU( bool aIsFlipped ) const
} }
SFVEC3F EDA_3D_SETTINGS::GetLayerColor( PCB_LAYER_ID aLayerId ) const SFVEC3F BOARD_ADAPTER::GetLayerColor( PCB_LAYER_ID aLayerId ) const
{ {
wxASSERT( aLayerId < PCB_LAYER_ID_COUNT ); wxASSERT( aLayerId < PCB_LAYER_ID_COUNT );
@ -495,13 +490,13 @@ SFVEC3F EDA_3D_SETTINGS::GetLayerColor( PCB_LAYER_ID aLayerId ) const
} }
SFVEC3F EDA_3D_SETTINGS::GetItemColor( int aItemId ) const SFVEC3F BOARD_ADAPTER::GetItemColor( int aItemId ) const
{ {
return GetColor( m_colors->GetColor( aItemId ) ); return GetColor( m_colors->GetColor( aItemId ) );
} }
SFVEC3F EDA_3D_SETTINGS::GetColor( COLOR4D aColor ) const SFVEC3F BOARD_ADAPTER::GetColor( COLOR4D aColor ) const
{ {
return SFVEC3F( aColor.r, aColor.g, aColor.b ); return SFVEC3F( aColor.r, aColor.g, aColor.b );
} }

View File

@ -22,8 +22,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#ifndef EDA_3D_SETTINGS_H #ifndef BOARD_ADAPTER_H
#define EDA_3D_SETTINGS_H #define BOARD_ADAPTER_H
#include <array> #include <array>
#include <vector> #include <vector>
@ -31,7 +31,6 @@
#include "../3d_rendering/3d_render_raytracing/accelerators/ccontainer.h" #include "../3d_rendering/3d_render_raytracing/accelerators/ccontainer.h"
#include "../3d_rendering/3d_render_raytracing/shapes3D/cbbox.h" #include "../3d_rendering/3d_render_raytracing/shapes3D/cbbox.h"
#include "../3d_rendering/ccamera.h" #include "../3d_rendering/ccamera.h"
#include "../3d_rendering/ctrack_ball.h"
#include "../3d_enums.h" #include "../3d_enums.h"
#include "../3d_cache/3d_cache.h" #include "../3d_cache/3d_cache.h"
@ -62,16 +61,16 @@ typedef std::map< PCB_LAYER_ID, SHAPE_POLY_SET *> MAP_POLY;
/** /**
* Class EDA_3D_SETTINGS * Class BOARD_ADAPTER
* Helper class to handle information needed to display 3D board * Helper class to handle information needed to display 3D board
*/ */
class EDA_3D_SETTINGS class BOARD_ADAPTER
{ {
public: public:
EDA_3D_SETTINGS(); BOARD_ADAPTER();
~EDA_3D_SETTINGS(); ~BOARD_ADAPTER();
/** /**
* @brief Set3DCacheManager - Update the Cache manager pointer * @brief Set3DCacheManager - Update the Cache manager pointer
@ -198,12 +197,6 @@ class EDA_3D_SETTINGS
*/ */
float GetModulesZcoord3DIU( bool aIsFlipped ) const ; float GetModulesZcoord3DIU( bool aIsFlipped ) const ;
/**
* @brief CameraGet - get current camera in use
* @return a camera
*/
CCAMERA &CameraGet() const { return m_currentCamera; }
/** /**
* @brief GridGet - get the current grid * @brief GridGet - get the current grid
* @return space type of the grid * @return space type of the grid
@ -517,27 +510,15 @@ public:
private: private:
/// Current board BOARD* m_board;
BOARD *m_board; S3D_CACHE* m_3d_model_manager;
/// pointer to the 3d model manager
S3D_CACHE *m_3d_model_manager;
/// pointer to current color settings
COLOR_SETTINGS* m_colors; COLOR_SETTINGS* m_colors;
// Render options // Render options
/// options flags to render the board
std::vector< bool > m_drawFlags; std::vector< bool > m_drawFlags;
/// Stores the current grid type
GRID3D_TYPE m_3D_grid_type; GRID3D_TYPE m_3D_grid_type;
/// render engine currently on use
RENDER_ENGINE m_render_engine; RENDER_ENGINE m_render_engine;
/// mode to render the 3d shape models material
MATERIAL_MODE m_material_mode; MATERIAL_MODE m_material_mode;
@ -635,13 +616,6 @@ private:
/// Non copper layers thickness /// Non copper layers thickness
float m_nonCopperLayerThickness3DU; float m_nonCopperLayerThickness3DU;
// Cameras
/// Holds a pointer to current camera in use.
CCAMERA &m_currentCamera;
CTRACK_BALL m_trackBallCamera;
/// min factor used for cicle segment approximation calculation /// min factor used for cicle segment approximation calculation
float m_calc_seg_min_factor3DU; float m_calc_seg_min_factor3DU;
@ -680,14 +654,11 @@ private:
}; };
/// This is a dummy visualization configuration class EDA_3D_BOARD_HOLDER
extern EDA_3D_SETTINGS G_null_EDA_3D_SETTINGS;
class EDA_3D_SETTINGS_HOLDER
{ {
public: public:
virtual EDA_3D_SETTINGS* GetSettings() = 0; virtual BOARD_ADAPTER& GetAdapter() = 0;
virtual CCAMERA& GetCurrentCamera() = 0;
}; };
#endif // EDA_3D_SETTINGS_H #endif // BOARD_ADAPTER_H

View File

@ -30,17 +30,12 @@
* board_items_to_polygon_shape_transform.cpp * board_items_to_polygon_shape_transform.cpp
*/ */
#include "3d_settings.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cring2d.h" #include "../3d_rendering/3d_render_raytracing/shapes2D/cring2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cfilledcircle2d.h" #include "../3d_rendering/3d_render_raytracing/shapes2D/cfilledcircle2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/croundsegment2d.h" #include "../3d_rendering/3d_render_raytracing/shapes2D/croundsegment2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cpolygon4pts2d.h" #include "../3d_rendering/3d_render_raytracing/shapes2D/cpolygon4pts2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/ctriangle2d.h" #include "../3d_rendering/3d_render_raytracing/shapes2D/ctriangle2d.h"
#include "../3d_rendering/3d_render_raytracing/accelerators/ccontainer2d.h" #include <board_adapter.h>
#include "../3d_rendering/3d_render_raytracing/shapes3D/ccylinder.h"
#include "../3d_rendering/3d_render_raytracing/shapes3D/clayeritem.h"
#include <class_board.h> #include <class_board.h>
#include <class_module.h> #include <class_module.h>
#include <class_pad.h> #include <class_pad.h>
@ -87,7 +82,7 @@ void addTextSegmToContainer( int x0, int y0, int xf, int yf, void* aData )
// Based on // Based on
// void TEXTE_PCB::TransformShapeWithClearanceToPolygonSet // void TEXTE_PCB::TransformShapeWithClearanceToPolygonSet
// board_items_to_polygon_shape_transform.cpp // board_items_to_polygon_shape_transform.cpp
void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const TEXTE_PCB* aText, void BOARD_ADAPTER::AddShapeWithClearanceToContainer( const TEXTE_PCB* aText,
CGENERICCONTAINER2D *aDstContainer, CGENERICCONTAINER2D *aDstContainer,
PCB_LAYER_ID aLayerId, PCB_LAYER_ID aLayerId,
int aClearanceValue ) int aClearanceValue )
@ -131,7 +126,7 @@ void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const TEXTE_PCB* aText,
} }
void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const DIMENSION* aDimension, void BOARD_ADAPTER::AddShapeWithClearanceToContainer( const DIMENSION* aDimension,
CGENERICCONTAINER2D *aDstContainer, CGENERICCONTAINER2D *aDstContainer,
PCB_LAYER_ID aLayerId, PCB_LAYER_ID aLayerId,
int aClearanceValue ) int aClearanceValue )
@ -168,7 +163,7 @@ void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const DIMENSION* aDimens
// Based on // Based on
// void MODULE::TransformGraphicShapesWithClearanceToPolygonSet // void MODULE::TransformGraphicShapesWithClearanceToPolygonSet
// board_items_to_polygon_shape_transform.cpp#L204 // board_items_to_polygon_shape_transform.cpp#L204
void EDA_3D_SETTINGS::AddGraphicsShapesWithClearanceToContainer( const MODULE* aModule, void BOARD_ADAPTER::AddGraphicsShapesWithClearanceToContainer( const MODULE* aModule,
CGENERICCONTAINER2D *aDstContainer, CGENERICCONTAINER2D *aDstContainer,
PCB_LAYER_ID aLayerId, PCB_LAYER_ID aLayerId,
int aInflateValue ) int aInflateValue )
@ -234,7 +229,7 @@ void EDA_3D_SETTINGS::AddGraphicsShapesWithClearanceToContainer( const MODULE* a
} }
COBJECT2D *EDA_3D_SETTINGS::createNewTrack( const TRACK* aTrack, COBJECT2D *BOARD_ADAPTER::createNewTrack( const TRACK* aTrack,
int aClearanceValue ) const int aClearanceValue ) const
{ {
SFVEC2F start3DU( aTrack->GetStart().x * m_biuTo3Dunits, SFVEC2F start3DU( aTrack->GetStart().x * m_biuTo3Dunits,
@ -281,7 +276,7 @@ COBJECT2D *EDA_3D_SETTINGS::createNewTrack( const TRACK* aTrack,
// Based on: // Based on:
// void D_PAD:: TransformShapeWithClearanceToPolygon( // void D_PAD:: TransformShapeWithClearanceToPolygon(
// board_items_to_polygon_shape_transform.cpp // board_items_to_polygon_shape_transform.cpp
void EDA_3D_SETTINGS::createNewPadWithClearance( const D_PAD* aPad, void BOARD_ADAPTER::createNewPadWithClearance( const D_PAD* aPad,
CGENERICCONTAINER2D *aDstContainer, CGENERICCONTAINER2D *aDstContainer,
wxSize aClearanceValue ) const wxSize aClearanceValue ) const
{ {
@ -295,7 +290,7 @@ void EDA_3D_SETTINGS::createNewPadWithClearance( const D_PAD* aPad,
if( !dx || !dy ) if( !dx || !dy )
{ {
wxLogTrace( m_logTrace, wxLogTrace( m_logTrace,
wxT( "EDA_3D_SETTINGS::createNewPadWithClearance - found an invalid pad" ) ); wxT( "BOARD_ADAPTER::createNewPadWithClearance - found an invalid pad" ) );
return; return;
} }
@ -533,13 +528,13 @@ void EDA_3D_SETTINGS::createNewPadWithClearance( const D_PAD* aPad,
// Based on: // Based on:
// BuildPadDrillShapePolygon // BuildPadDrillShapePolygon
// board_items_to_polygon_shape_transform.cpp // board_items_to_polygon_shape_transform.cpp
COBJECT2D *EDA_3D_SETTINGS::createNewPadDrill( const D_PAD* aPad, int aInflateValue ) COBJECT2D *BOARD_ADAPTER::createNewPadDrill( const D_PAD* aPad, int aInflateValue )
{ {
wxSize drillSize = aPad->GetDrillSize(); wxSize drillSize = aPad->GetDrillSize();
if( !drillSize.x || !drillSize.y ) if( !drillSize.x || !drillSize.y )
{ {
wxLogTrace( m_logTrace, wxT( "EDA_3D_SETTINGS::createNewPadDrill - found an invalid pad" ) ); wxLogTrace( m_logTrace, wxT( "BOARD_ADAPTER::createNewPadDrill - found an invalid pad" ) );
return NULL; return NULL;
} }
@ -584,7 +579,7 @@ COBJECT2D *EDA_3D_SETTINGS::createNewPadDrill( const D_PAD* aPad, int aInflateVa
} }
void EDA_3D_SETTINGS::AddPadsShapesWithClearanceToContainer( const MODULE* aModule, void BOARD_ADAPTER::AddPadsShapesWithClearanceToContainer( const MODULE* aModule,
CGENERICCONTAINER2D *aDstContainer, CGENERICCONTAINER2D *aDstContainer,
PCB_LAYER_ID aLayerId, PCB_LAYER_ID aLayerId,
int aInflateValue, int aInflateValue,
@ -647,7 +642,7 @@ void EDA_3D_SETTINGS::AddPadsShapesWithClearanceToContainer( const MODULE* aModu
// based on TransformArcToPolygon function from // based on TransformArcToPolygon function from
// common/convert_basic_shapes_to_polygon.cpp // common/convert_basic_shapes_to_polygon.cpp
void EDA_3D_SETTINGS::TransformArcToSegments( const wxPoint &aCentre, void BOARD_ADAPTER::TransformArcToSegments( const wxPoint &aCentre,
const wxPoint &aStart, const wxPoint &aStart,
double aArcAngle, double aArcAngle,
int aCircleToSegmentsCount, int aCircleToSegmentsCount,
@ -724,7 +719,7 @@ void EDA_3D_SETTINGS::TransformArcToSegments( const wxPoint &aCentre,
// Based on // Based on
// TransformShapeWithClearanceToPolygon // TransformShapeWithClearanceToPolygon
// board_items_to_polygon_shape_transform.cpp#L431 // board_items_to_polygon_shape_transform.cpp#L431
void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const DRAWSEGMENT* aDrawSegment, void BOARD_ADAPTER::AddShapeWithClearanceToContainer( const DRAWSEGMENT* aDrawSegment,
CGENERICCONTAINER2D *aDstContainer, CGENERICCONTAINER2D *aDstContainer,
PCB_LAYER_ID aLayerId, PCB_LAYER_ID aLayerId,
int aClearanceValue ) int aClearanceValue )
@ -815,7 +810,7 @@ void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const DRAWSEGMENT* aDraw
// Based on // Based on
// TransformSolidAreasShapesToPolygonSet // TransformSolidAreasShapesToPolygonSet
// board_items_to_polygon_shape_transform.cpp // board_items_to_polygon_shape_transform.cpp
void EDA_3D_SETTINGS::AddSolidAreasShapesToContainer( const ZONE_CONTAINER* aZoneContainer, void BOARD_ADAPTER::AddSolidAreasShapesToContainer( const ZONE_CONTAINER* aZoneContainer,
CGENERICCONTAINER2D *aDstContainer, CGENERICCONTAINER2D *aDstContainer,
PCB_LAYER_ID aLayerId ) PCB_LAYER_ID aLayerId )
{ {
@ -896,7 +891,7 @@ void EDA_3D_SETTINGS::AddSolidAreasShapesToContainer( const ZONE_CONTAINER* aZon
void EDA_3D_SETTINGS::buildPadShapeThickOutlineAsSegments( const D_PAD* aPad, void BOARD_ADAPTER::buildPadShapeThickOutlineAsSegments( const D_PAD* aPad,
CGENERICCONTAINER2D *aDstContainer, CGENERICCONTAINER2D *aDstContainer,
int aWidth ) int aWidth )
{ {

View File

@ -30,7 +30,7 @@
* board_items_to_polygon_shape_transform.cpp * board_items_to_polygon_shape_transform.cpp
*/ */
#include "3d_settings.h" #include "board_adapter.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cring2d.h" #include "../3d_rendering/3d_render_raytracing/shapes2D/cring2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cfilledcircle2d.h" #include "../3d_rendering/3d_render_raytracing/shapes2D/cfilledcircle2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/croundsegment2d.h" #include "../3d_rendering/3d_render_raytracing/shapes2D/croundsegment2d.h"
@ -58,7 +58,7 @@
#include <profile.h> #include <profile.h>
void EDA_3D_SETTINGS::destroyLayers() void BOARD_ADAPTER::destroyLayers()
{ {
if( !m_layers_poly.empty() ) if( !m_layers_poly.empty() )
{ {
@ -113,7 +113,7 @@ void EDA_3D_SETTINGS::destroyLayers()
} }
void EDA_3D_SETTINGS::createLayers( REPORTER *aStatusTextReporter ) void BOARD_ADAPTER::createLayers( REPORTER *aStatusTextReporter )
{ {
destroyLayers(); destroyLayers();
@ -1059,7 +1059,7 @@ void EDA_3D_SETTINGS::createLayers( REPORTER *aStatusTextReporter )
#ifdef PRINT_STATISTICS_3D_VIEWER #ifdef PRINT_STATISTICS_3D_VIEWER
unsigned stats_endHolesBVHTime = GetRunningMicroSecs(); unsigned stats_endHolesBVHTime = GetRunningMicroSecs();
printf( "EDA_3D_SETTINGS::createLayers times\n" ); printf( "BOARD_ADAPTER::createLayers times\n" );
printf( " Copper Layers: %.3f ms\n", printf( " Copper Layers: %.3f ms\n",
(float)( stats_endCopperLayersTime - stats_startCopperLayersTime ) / 1e3 ); (float)( stats_endCopperLayersTime - stats_startCopperLayersTime ) / 1e3 );
printf( " Holes BVH creation: %.3f ms\n", printf( " Holes BVH creation: %.3f ms\n",

View File

@ -30,7 +30,7 @@
* board_items_to_polygon_shape_transform.cpp * board_items_to_polygon_shape_transform.cpp
*/ */
#include "3d_settings.h" #include "board_adapter.h"
#include <convert_basic_shapes_to_polygon.h> #include <convert_basic_shapes_to_polygon.h>
#include <class_edge_mod.h> #include <class_edge_mod.h>
#include <class_module.h> #include <class_module.h>
@ -38,7 +38,7 @@
// This is the same function as in board_items_to_polygon_shape_transform.cpp // This is the same function as in board_items_to_polygon_shape_transform.cpp
// but it adds the rect/trapezoid shapes with a different winding // but it adds the rect/trapezoid shapes with a different winding
void EDA_3D_SETTINGS::buildPadShapePolygon( const D_PAD* aPad, void BOARD_ADAPTER::buildPadShapePolygon( const D_PAD* aPad,
SHAPE_POLY_SET& aCornerBuffer, SHAPE_POLY_SET& aCornerBuffer,
wxSize aInflateValue ) const wxSize aInflateValue ) const
{ {
@ -105,7 +105,7 @@ void EDA_3D_SETTINGS::buildPadShapePolygon( const D_PAD* aPad,
} }
void EDA_3D_SETTINGS::buildPadShapeThickOutlineAsPolygon( const D_PAD* aPad, void BOARD_ADAPTER::buildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
SHAPE_POLY_SET& aCornerBuffer, SHAPE_POLY_SET& aCornerBuffer,
int aWidth ) const int aWidth ) const
{ {
@ -139,7 +139,7 @@ void EDA_3D_SETTINGS::buildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
// Based on the same function name in board_items_to_polyshape_transform.cpp // Based on the same function name in board_items_to_polyshape_transform.cpp
// It was implemented here to allow dynamic segments count per pad shape // It was implemented here to allow dynamic segments count per pad shape
void EDA_3D_SETTINGS::transformPadsShapesWithClearanceToPolygon( const PADS& aPads, PCB_LAYER_ID aLayer, void BOARD_ADAPTER::transformPadsShapesWithClearanceToPolygon( const PADS& aPads, PCB_LAYER_ID aLayer,
SHAPE_POLY_SET& aCornerBuffer, SHAPE_POLY_SET& aCornerBuffer,
int aInflateValue, int aInflateValue,
bool aSkipNPTHPadsWihNoCopper ) const bool aSkipNPTHPadsWihNoCopper ) const
@ -198,7 +198,7 @@ void EDA_3D_SETTINGS::transformPadsShapesWithClearanceToPolygon( const PADS& aPa
} }
} }
void EDA_3D_SETTINGS::transformGraphicModuleEdgeToPolygonSet( const MODULE *aModule, void BOARD_ADAPTER::transformGraphicModuleEdgeToPolygonSet( const MODULE *aModule,
PCB_LAYER_ID aLayer, PCB_LAYER_ID aLayer,
SHAPE_POLY_SET& aCornerBuffer ) const SHAPE_POLY_SET& aCornerBuffer ) const
{ {

View File

@ -84,14 +84,16 @@ BEGIN_EVENT_TABLE( EDA_3D_CANVAS, wxGLCanvas )
END_EVENT_TABLE() END_EVENT_TABLE()
EDA_3D_CANVAS::EDA_3D_CANVAS( wxWindow *aParent, const int *aAttribList, BOARD *aBoard, EDA_3D_CANVAS::EDA_3D_CANVAS( wxWindow* aParent, const int* aAttribList, BOARD* aBoard,
EDA_3D_SETTINGS &aSettings , S3D_CACHE *a3DCachePointer ) : BOARD_ADAPTER& aBoardAdapter, CCAMERA& aCamera,
S3D_CACHE* a3DCachePointer ) :
HIDPI_GL_CANVAS( aParent, wxID_ANY, aAttribList, wxDefaultPosition, wxDefaultSize, HIDPI_GL_CANVAS( aParent, wxID_ANY, aAttribList, wxDefaultPosition, wxDefaultSize,
wxFULL_REPAINT_ON_RESIZE ), wxFULL_REPAINT_ON_RESIZE ),
m_eventDispatcher( nullptr ), m_eventDispatcher( nullptr ),
m_parentStatusBar( nullptr ), m_parentStatusBar( nullptr ),
m_glRC( nullptr ), m_glRC( nullptr ),
m_settings( aSettings ), m_boardAdapter( aBoardAdapter ),
m_camera( aCamera ),
m_3d_render( nullptr ) m_3d_render( nullptr )
{ {
wxLogTrace( m_logTrace, "EDA_3D_CANVAS::EDA_3D_CANVAS" ); wxLogTrace( m_logTrace, "EDA_3D_CANVAS::EDA_3D_CANVAS" );
@ -123,8 +125,8 @@ EDA_3D_CANVAS::EDA_3D_CANVAS( wxWindow *aParent, const int *aAttribList, BOARD *
m_render_raytracing_was_requested = false; m_render_raytracing_was_requested = false;
m_opengl_supports_raytracing = false; m_opengl_supports_raytracing = false;
m_3d_render_raytracing = new C3D_RENDER_RAYTRACING( aSettings ); m_3d_render_raytracing = new C3D_RENDER_RAYTRACING( m_boardAdapter, m_camera );
m_3d_render_ogl_legacy = new C3D_RENDER_OGL_LEGACY( aSettings ); m_3d_render_ogl_legacy = new C3D_RENDER_OGL_LEGACY( m_boardAdapter, m_camera );
wxASSERT( m_3d_render_raytracing != NULL ); wxASSERT( m_3d_render_raytracing != NULL );
wxASSERT( m_3d_render_ogl_legacy != NULL ); wxASSERT( m_3d_render_ogl_legacy != NULL );
@ -137,12 +139,12 @@ EDA_3D_CANVAS::EDA_3D_CANVAS( wxWindow *aParent, const int *aAttribList, BOARD *
RenderEngineChanged(); RenderEngineChanged();
wxASSERT( aBoard != NULL ); wxASSERT( aBoard != NULL );
m_settings.SetBoard( aBoard ); m_boardAdapter.SetBoard( aBoard );
m_settings.SetColorSettings( Pgm().GetSettingsManager().GetColorSettings() ); m_boardAdapter.SetColorSettings( Pgm().GetSettingsManager().GetColorSettings() );
wxASSERT( a3DCachePointer != NULL ); wxASSERT( a3DCachePointer != NULL );
m_settings.Set3DCacheManager( a3DCachePointer ); m_boardAdapter.Set3DCacheManager( a3DCachePointer );
const wxEventType events[] = const wxEventType events[] =
{ {
@ -287,12 +289,12 @@ void EDA_3D_CANVAS::GetScreenshot( wxImage &aDstImage )
void EDA_3D_CANVAS::ReloadRequest( BOARD *aBoard , S3D_CACHE *aCachePointer ) void EDA_3D_CANVAS::ReloadRequest( BOARD *aBoard , S3D_CACHE *aCachePointer )
{ {
if( aCachePointer != NULL ) if( aCachePointer != NULL )
m_settings.Set3DCacheManager( aCachePointer ); m_boardAdapter.Set3DCacheManager( aCachePointer );
if( aBoard != NULL ) if( aBoard != NULL )
m_settings.SetBoard( aBoard ); m_boardAdapter.SetBoard( aBoard );
m_settings.SetColorSettings( Pgm().GetSettingsManager().GetColorSettings() ); m_boardAdapter.SetColorSettings( Pgm().GetSettingsManager().GetColorSettings() );
if( m_3d_render ) if( m_3d_render )
m_3d_render->ReloadRequest(); m_3d_render->ReloadRequest();
@ -319,10 +321,10 @@ void EDA_3D_CANVAS::DisplayStatus()
{ {
wxString msg; wxString msg;
msg.Printf( "dx %3.2f", m_settings.CameraGet().GetCameraPos().x ); msg.Printf( "dx %3.2f", m_camera.GetCameraPos().x );
m_parentStatusBar->SetStatusText( msg, static_cast<int>( EDA_3D_VIEWER_STATUSBAR::X_POS ) ); m_parentStatusBar->SetStatusText( msg, static_cast<int>( EDA_3D_VIEWER_STATUSBAR::X_POS ) );
msg.Printf( "dy %3.2f", m_settings.CameraGet().GetCameraPos().y ); msg.Printf( "dy %3.2f", m_camera.GetCameraPos().y );
m_parentStatusBar->SetStatusText( msg, static_cast<int>( EDA_3D_VIEWER_STATUSBAR::Y_POS ) ); m_parentStatusBar->SetStatusText( msg, static_cast<int>( EDA_3D_VIEWER_STATUSBAR::Y_POS ) );
} }
} }
@ -380,7 +382,7 @@ void EDA_3D_CANVAS::OnPaint( wxPaintEvent &event )
// is wrong when next another canvas is repainted. // is wrong when next another canvas is repainted.
wxSize clientSize = GetNativePixelSize(); wxSize clientSize = GetNativePixelSize();
const bool windows_size_changed = m_settings.CameraGet().SetCurWindowSize( clientSize ); const bool windows_size_changed = m_camera.SetCurWindowSize( clientSize );
// Initialize openGL if need // Initialize openGL if need
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
@ -399,13 +401,13 @@ void EDA_3D_CANVAS::OnPaint( wxPaintEvent &event )
{ {
m_3d_render = m_3d_render_ogl_legacy; m_3d_render = m_3d_render_ogl_legacy;
m_render_raytracing_was_requested = false; m_render_raytracing_was_requested = false;
m_settings.RenderEngineSet( RENDER_ENGINE::OPENGL_LEGACY ); m_boardAdapter.RenderEngineSet( RENDER_ENGINE::OPENGL_LEGACY );
} }
// Check if a raytacing was requested and need to switch to raytracing mode // Check if a raytacing was requested and need to switch to raytracing mode
if( m_settings.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY ) if( m_boardAdapter.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
{ {
const bool was_camera_changed = m_settings.CameraGet().ParametersChanged(); const bool was_camera_changed = m_camera.ParametersChanged();
// It reverts back to OpenGL mode if it was requested a raytracing // It reverts back to OpenGL mode if it was requested a raytracing
// render of the current scene. AND the mouse / camera is moving // render of the current scene. AND the mouse / camera is moving
@ -426,7 +428,7 @@ void EDA_3D_CANVAS::OnPaint( wxPaintEvent &event )
{ {
const unsigned curtime_delta = GetRunningMicroSecs() - m_strtime_camera_movement; const unsigned curtime_delta = GetRunningMicroSecs() - m_strtime_camera_movement;
curtime_delta_s = (curtime_delta / 1e6) * m_camera_moving_speed; curtime_delta_s = (curtime_delta / 1e6) * m_camera_moving_speed;
m_settings.CameraGet().Interpolate( curtime_delta_s ); m_camera.Interpolate( curtime_delta_s );
if( curtime_delta_s > 1.0f ) if( curtime_delta_s > 1.0f )
{ {
@ -456,7 +458,7 @@ void EDA_3D_CANVAS::OnPaint( wxPaintEvent &event )
if( m_render_pivot ) if( m_render_pivot )
{ {
const float scale = glm::min( m_settings.CameraGet().ZoomGet(), 1.0f ); const float scale = glm::min( m_camera.ZoomGet(), 1.0f );
render_pivot( curtime_delta_s, scale * scale ); render_pivot( curtime_delta_s, scale * scale );
} }
@ -480,7 +482,7 @@ void EDA_3D_CANVAS::OnPaint( wxPaintEvent &event )
} }
// This will reset the flag of camera parameters changed // This will reset the flag of camera parameters changed
m_settings.CameraGet().ParametersChanged(); m_camera.ParametersChanged();
if( !err_messages.IsEmpty() ) if( !err_messages.IsEmpty() )
wxLogMessage( err_messages ); wxLogMessage( err_messages );
@ -540,9 +542,9 @@ void EDA_3D_CANVAS::OnMouseWheel( wxMouseEvent &event )
if( m_camera_is_moving ) if( m_camera_is_moving )
return; return;
float delta_move = m_delta_move_step_factor * m_settings.CameraGet().ZoomGet(); float delta_move = m_delta_move_step_factor * m_camera.ZoomGet();
if( m_settings.GetFlag( FL_MOUSEWHEEL_PANNING ) ) if( m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) )
delta_move *= (0.01f * event.GetWheelRotation()); delta_move *= (0.01f * event.GetWheelRotation());
else else
if( event.GetWheelRotation() < 0 ) if( event.GetWheelRotation() < 0 )
@ -557,28 +559,28 @@ void EDA_3D_CANVAS::OnMouseWheel( wxMouseEvent &event )
// wheel + ctrl -> horizontal scrolling; // wheel + ctrl -> horizontal scrolling;
// wheel -> zooming. // wheel -> zooming.
if( m_settings.GetFlag( FL_MOUSEWHEEL_PANNING ) && !event.ControlDown() ) if( m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) && !event.ControlDown() )
{ {
if( event.GetWheelAxis() == wxMOUSE_WHEEL_HORIZONTAL || event.ShiftDown() ) if( event.GetWheelAxis() == wxMOUSE_WHEEL_HORIZONTAL || event.ShiftDown() )
m_settings.CameraGet().Pan( SFVEC3F( -delta_move, 0.0f, 0.0f ) ); m_camera.Pan( SFVEC3F( -delta_move, 0.0f, 0.0f ) );
else else
m_settings.CameraGet().Pan( SFVEC3F( 0.0f, -delta_move, 0.0f ) ); m_camera.Pan( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
mouseActivity = true; mouseActivity = true;
} }
else if( event.ShiftDown() && !m_settings.GetFlag( FL_MOUSEWHEEL_PANNING ) ) else if( event.ShiftDown() && !m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) )
{ {
m_settings.CameraGet().Pan( SFVEC3F( 0.0f, -delta_move, 0.0f ) ); m_camera.Pan( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
mouseActivity = true; mouseActivity = true;
} }
else if( event.ControlDown() && !m_settings.GetFlag( FL_MOUSEWHEEL_PANNING ) ) else if( event.ControlDown() && !m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) )
{ {
m_settings.CameraGet().Pan( SFVEC3F( delta_move, 0.0f, 0.0f ) ); m_camera.Pan( SFVEC3F( delta_move, 0.0f, 0.0f ) );
mouseActivity = true; mouseActivity = true;
} }
else else
{ {
mouseActivity = m_settings.CameraGet().Zoom( event.GetWheelRotation() > 0 ? 1.1f : 1/1.1f ); mouseActivity = m_camera.Zoom( event.GetWheelRotation() > 0 ? 1.1f : 1/1.1f );
} }
// If it results on a camera movement // If it results on a camera movement
@ -594,7 +596,7 @@ void EDA_3D_CANVAS::OnMouseWheel( wxMouseEvent &event )
} }
// Update the cursor current mouse position on the camera // Update the cursor current mouse position on the camera
m_settings.CameraGet().SetCurMousePosition( event.GetPosition() ); m_camera.SetCurMousePosition( event.GetPosition() );
} }
@ -611,7 +613,7 @@ void EDA_3D_CANVAS::OnMagnify( wxMouseEvent& event )
float magnification = ( event.GetMagnification() + 1.0f ); float magnification = ( event.GetMagnification() + 1.0f );
m_settings.CameraGet().Zoom( magnification ); m_camera.Zoom( magnification );
DisplayStatus(); DisplayStatus();
Request_refresh(); Request_refresh();
@ -626,14 +628,14 @@ void EDA_3D_CANVAS::OnMouseMove( wxMouseEvent &event )
if( m_camera_is_moving ) if( m_camera_is_moving )
return; return;
m_settings.CameraGet().SetCurWindowSize( GetNativePixelSize() ); m_camera.SetCurWindowSize( GetNativePixelSize() );
if( event.Dragging() ) if( event.Dragging() )
{ {
if( event.LeftIsDown() ) // Drag if( event.LeftIsDown() ) // Drag
m_settings.CameraGet().Drag( event.GetPosition() ); m_camera.Drag( event.GetPosition() );
else if( event.MiddleIsDown() ) // Pan else if( event.MiddleIsDown() ) // Pan
m_settings.CameraGet().Pan( event.GetPosition() ); m_camera.Pan( event.GetPosition() );
m_mouse_is_moving = true; m_mouse_is_moving = true;
m_mouse_was_moved = true; m_mouse_was_moved = true;
@ -644,7 +646,7 @@ void EDA_3D_CANVAS::OnMouseMove( wxMouseEvent &event )
} }
const wxPoint eventPosition = event.GetPosition(); const wxPoint eventPosition = event.GetPosition();
m_settings.CameraGet().SetCurMousePosition( eventPosition ); m_camera.SetCurMousePosition( eventPosition );
} }
@ -774,7 +776,7 @@ void EDA_3D_CANVAS::move_pivot_based_on_cur_mouse_position()
SFVEC3F rayDir; SFVEC3F rayDir;
// Generate a ray origin and direction based on current mouser position and camera // Generate a ray origin and direction based on current mouser position and camera
m_settings.CameraGet().MakeRayAtCurrrentMousePosition( rayOrigin, rayDir ); m_camera.MakeRayAtCurrrentMousePosition( rayOrigin, rayDir );
RAY mouseRay; RAY mouseRay;
mouseRay.Init( rayOrigin, rayDir ); mouseRay.Init( rayOrigin, rayDir );
@ -782,12 +784,12 @@ void EDA_3D_CANVAS::move_pivot_based_on_cur_mouse_position()
float hit_t; float hit_t;
// Test it with the board bounding box // Test it with the board bounding box
if( m_settings.GetBBox3DU().Intersect( mouseRay, &hit_t ) ) if( m_boardAdapter.GetBBox3DU().Intersect( mouseRay, &hit_t ) )
{ {
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().SetLookAtPos_T1( mouseRay.at( hit_t ) ); m_camera.SetLookAtPos_T1( mouseRay.at( hit_t ) );
m_settings.CameraGet().ResetXYpos_T1(); m_camera.ResetXYpos_T1();
request_start_moving_camera(); request_start_moving_camera();
} }
@ -799,7 +801,7 @@ bool EDA_3D_CANVAS::SetView3D( int aKeycode )
if( m_camera_is_moving ) if( m_camera_is_moving )
return false; return false;
const float delta_move = m_delta_move_step_factor * m_settings.CameraGet().ZoomGet(); const float delta_move = m_delta_move_step_factor * m_camera.ZoomGet();
const float arrow_moving_time_speed = 8.0f; const float arrow_moving_time_speed = 8.0f;
bool handled = false; bool handled = false;
@ -810,126 +812,124 @@ bool EDA_3D_CANVAS::SetView3D( int aKeycode )
return true; return true;
case WXK_LEFT: case WXK_LEFT:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::LINEAR ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::LINEAR );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Pan_T1( SFVEC3F( -delta_move, 0.0f, 0.0f ) ); m_camera.Pan_T1( SFVEC3F( -delta_move, 0.0f, 0.0f ) );
request_start_moving_camera( arrow_moving_time_speed, false ); request_start_moving_camera( arrow_moving_time_speed, false );
return true; return true;
case WXK_RIGHT: case WXK_RIGHT:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::LINEAR ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::LINEAR );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Pan_T1( SFVEC3F( +delta_move, 0.0f, 0.0f ) ); m_camera.Pan_T1( SFVEC3F( +delta_move, 0.0f, 0.0f ) );
request_start_moving_camera( arrow_moving_time_speed, false ); request_start_moving_camera( arrow_moving_time_speed, false );
return true; return true;
case WXK_UP: case WXK_UP:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::LINEAR ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::LINEAR );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Pan_T1( SFVEC3F( 0.0f, +delta_move, 0.0f ) ); m_camera.Pan_T1( SFVEC3F( 0.0f, +delta_move, 0.0f ) );
request_start_moving_camera( arrow_moving_time_speed, false ); request_start_moving_camera( arrow_moving_time_speed, false );
return true; return true;
case WXK_DOWN: case WXK_DOWN:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::LINEAR ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::LINEAR );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Pan_T1( SFVEC3F( 0.0f, -delta_move, 0.0f ) ); m_camera.Pan_T1( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
request_start_moving_camera( arrow_moving_time_speed, false ); request_start_moving_camera( arrow_moving_time_speed, false );
return true; return true;
case WXK_HOME: case WXK_HOME:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Reset_T1(); m_camera.Reset_T1();
request_start_moving_camera( glm::min( glm::max( m_settings.CameraGet().ZoomGet(), 1/1.26f ), 1.26f ) ); request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 1/1.26f ), 1.26f ) );
return true; return true;
case WXK_END: case WXK_END:
break; break;
case WXK_TAB: case WXK_TAB:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::EASING_IN_OUT ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::EASING_IN_OUT );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().RotateZ_T1( glm::radians( 45.0f ) ); m_camera.RotateZ_T1( glm::radians( 45.0f ) );
request_start_moving_camera(); request_start_moving_camera();
handled = true; handled = true;
break; break;
case WXK_F1: case WXK_F1:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
if( m_settings.CameraGet().Zoom_T1( 1.26f ) ) // 3 steps per doubling if( m_camera.Zoom_T1( 1.26f ) ) // 3 steps per doubling
request_start_moving_camera( 3.0f ); request_start_moving_camera( 3.0f );
return true; return true;
case WXK_F2: case WXK_F2:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
if( m_settings.CameraGet().Zoom_T1( 1/1.26f ) ) // 3 steps per halving if( m_camera.Zoom_T1( 1/1.26f ) ) // 3 steps per halving
request_start_moving_camera( 3.0f ); request_start_moving_camera( 3.0f );
return true; return true;
case ID_VIEW3D_RESET: case ID_VIEW3D_RESET:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Reset_T1(); m_camera.Reset_T1();
request_start_moving_camera( glm::min( glm::max( m_settings.CameraGet().ZoomGet(), 0.5f ), 1.125f ) ); request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
return true; return true;
case ID_VIEW3D_RIGHT: case ID_VIEW3D_RIGHT:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Reset_T1(); m_camera.Reset_T1();
m_settings.CameraGet().RotateZ_T1( glm::radians( -90.0f ) ); m_camera.RotateZ_T1( glm::radians( -90.0f ) );
m_settings.CameraGet().RotateX_T1( glm::radians( -90.0f ) ); m_camera.RotateX_T1( glm::radians( -90.0f ) );
request_start_moving_camera(); request_start_moving_camera();
return true; return true;
case ID_VIEW3D_LEFT: case ID_VIEW3D_LEFT:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Reset_T1(); m_camera.Reset_T1();
m_settings.CameraGet().RotateZ_T1( glm::radians( 90.0f ) ); m_camera.RotateZ_T1( glm::radians( 90.0f ) );
m_settings.CameraGet().RotateX_T1( glm::radians( -90.0f ) ); m_camera.RotateX_T1( glm::radians( -90.0f ) );
request_start_moving_camera(); request_start_moving_camera();
return true; return true;
case ID_VIEW3D_FRONT: case ID_VIEW3D_FRONT:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Reset_T1(); m_camera.Reset_T1();
m_settings.CameraGet().RotateX_T1( glm::radians( -90.0f ) ); m_camera.RotateX_T1( glm::radians( -90.0f ) );
request_start_moving_camera(); request_start_moving_camera();
return true; return true;
case ID_VIEW3D_BACK: case ID_VIEW3D_BACK:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Reset_T1(); m_camera.Reset_T1();
m_settings.CameraGet().RotateX_T1( glm::radians( -90.0f ) ); m_camera.RotateX_T1( glm::radians( -90.0f ) );
m_settings.CameraGet().RotateZ_T1( glm::radians( -180.0f ) ); m_camera.RotateZ_T1( glm::radians( -180.0f ) );
request_start_moving_camera(); request_start_moving_camera();
return true; return true;
case ID_VIEW3D_TOP: case ID_VIEW3D_TOP:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Reset_T1(); m_camera.Reset_T1();
request_start_moving_camera( request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
glm::min( glm::max( m_settings.CameraGet().ZoomGet(), 0.5f ), 1.125f ) );
return true; return true;
case ID_VIEW3D_BOTTOM: case ID_VIEW3D_BOTTOM:
m_settings.CameraGet().SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER ); m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
m_settings.CameraGet().SetT0_and_T1_current_T(); m_camera.SetT0_and_T1_current_T();
m_settings.CameraGet().Reset_T1(); m_camera.Reset_T1();
m_settings.CameraGet().RotateY_T1( glm::radians( 180.0f ) ); m_camera.RotateY_T1( glm::radians( 180.0f ) );
request_start_moving_camera( request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
glm::min( glm::max( m_settings.CameraGet().ZoomGet(), 0.5f ), 1.125f ) );
return true; return true;
default: default:
@ -949,7 +949,7 @@ bool EDA_3D_CANVAS::SetView3D( int aKeycode )
void EDA_3D_CANVAS::RenderEngineChanged() void EDA_3D_CANVAS::RenderEngineChanged()
{ {
switch( m_settings.RenderEngineGet() ) switch( m_boardAdapter.RenderEngineGet() )
{ {
case RENDER_ENGINE::OPENGL_LEGACY: m_3d_render = m_3d_render_ogl_legacy; break; case RENDER_ENGINE::OPENGL_LEGACY: m_3d_render = m_3d_render_ogl_legacy; break;
case RENDER_ENGINE::RAYTRACING: m_3d_render = m_3d_render_raytracing; break; case RENDER_ENGINE::RAYTRACING: m_3d_render = m_3d_render_raytracing; break;

View File

@ -26,7 +26,7 @@
#define EDA_3D_CANVAS_H #define EDA_3D_CANVAS_H
#include "3d_settings.h" #include "board_adapter.h"
#include "3d_rendering/c3d_render_base.h" #include "3d_rendering/c3d_render_base.h"
#include "3d_cache/3d_cache.h" #include "3d_cache/3d_cache.h"
#include <gal/hidpi_gl_canvas.h> #include <gal/hidpi_gl_canvas.h>
@ -53,11 +53,8 @@ class EDA_3D_CANVAS : public HIDPI_GL_CANVAS
* @param aBoard: The board * @param aBoard: The board
* @param aSettings: the settings options to be used by this canvas * @param aSettings: the settings options to be used by this canvas
*/ */
EDA_3D_CANVAS( wxWindow *aParent, EDA_3D_CANVAS( wxWindow* aParent, const int* aAttribList, BOARD* aBoard,
const int *aAttribList = 0, BOARD_ADAPTER& aSettings, CCAMERA& aCamera, S3D_CACHE* a3DCachePointer );
BOARD *aBoard = NULL,
EDA_3D_SETTINGS &aSettings = G_null_EDA_3D_SETTINGS,
S3D_CACHE *a3DCachePointer = NULL );
~EDA_3D_CANVAS(); ~EDA_3D_CANVAS();
@ -212,8 +209,8 @@ private:
float m_camera_moving_speed; // 1.0f will be 1:1 float m_camera_moving_speed; // 1.0f will be 1:1
unsigned m_strtime_camera_movement; // Ticktime of camera movement start unsigned m_strtime_camera_movement; // Ticktime of camera movement start
EDA_3D_SETTINGS& m_settings; // Pre-computed 3D information and visual BOARD_ADAPTER& m_boardAdapter; // Pre-computed 3D info and settings
// settings to render the board CCAMERA& m_camera;
C3D_RENDER_BASE* m_3d_render; C3D_RENDER_BASE* m_3d_render;
C3D_RENDER_RAYTRACING* m_3d_render_raytracing; C3D_RENDER_RAYTRACING* m_3d_render_raytracing;
C3D_RENDER_OGL_LEGACY* m_3d_render_ogl_legacy; C3D_RENDER_OGL_LEGACY* m_3d_render_ogl_legacy;

View File

@ -81,7 +81,7 @@ void EDA_3D_CANVAS::render_pivot( float t , float aScale )
if( t > 1.0f ) if( t > 1.0f )
t = 1.0f; t = 1.0f;
const SFVEC3F &lookAtPos = m_settings.CameraGet().GetLookAtPos_T1(); const SFVEC3F &lookAtPos = m_camera.GetLookAtPos_T1();
glDisable( GL_LIGHTING ); glDisable( GL_LIGHTING );
glDisable( GL_DEPTH_TEST ); glDisable( GL_DEPTH_TEST );
@ -90,11 +90,11 @@ void EDA_3D_CANVAS::render_pivot( float t , float aScale )
// Set projection and modelview matrixes // Set projection and modelview matrixes
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
glMatrixMode( GL_PROJECTION ); glMatrixMode( GL_PROJECTION );
glLoadMatrixf( glm::value_ptr( m_settings.CameraGet().GetProjectionMatrix() ) ); glLoadMatrixf( glm::value_ptr( m_camera.GetProjectionMatrix() ) );
glMatrixMode( GL_MODELVIEW ); glMatrixMode( GL_MODELVIEW );
glLoadIdentity(); glLoadIdentity();
glLoadMatrixf( glm::value_ptr( m_settings.CameraGet().GetViewMatrix() ) ); glLoadMatrixf( glm::value_ptr( m_camera.GetViewMatrix() ) );
glEnable( GL_COLOR_MATERIAL ); glEnable( GL_COLOR_MATERIAL );
glColor4f( 0.0f, 1.0f, 0.0f, 0.75f - t * 0.75f ); glColor4f( 0.0f, 1.0f, 0.0f, 0.75f - t * 0.75f );

View File

@ -141,7 +141,7 @@ void C3D_RENDER_OGL_LEGACY::add_object_to_triangle_layer( const CRING2D * aRing,
generate_ring_contour( center, generate_ring_contour( center,
inner, inner,
outer, outer,
m_settings.GetNrSegmentsCircle( outer * 2.0f ), m_boardAdapter.GetNrSegmentsCircle( outer * 2.0f ),
innerContour, innerContour,
outerContour, outerContour,
false ); false );
@ -318,7 +318,7 @@ CLAYERS_OGL_DISP_LISTS *C3D_RENDER_OGL_LEGACY::generate_holes_display_list(
layerTriangles->AddToMiddleContourns( aPoly, layerTriangles->AddToMiddleContourns( aPoly,
aZbot, aZbot,
aZtop, aZtop,
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
aInvertFaces ); aInvertFaces );
} }
@ -348,14 +348,14 @@ void C3D_RENDER_OGL_LEGACY::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
unsigned stats_startReloadTime = GetRunningMicroSecs(); unsigned stats_startReloadTime = GetRunningMicroSecs();
m_settings.InitSettings( aStatusTextReporter, aWarningTextReporter ); m_boardAdapter.InitSettings( aStatusTextReporter, aWarningTextReporter );
#ifdef PRINT_STATISTICS_3D_VIEWER #ifdef PRINT_STATISTICS_3D_VIEWER
unsigned stats_endReloadTime = GetRunningMicroSecs(); unsigned stats_endReloadTime = GetRunningMicroSecs();
#endif #endif
SFVEC3F camera_pos = m_settings.GetBoardCenter3DU(); SFVEC3F camera_pos = m_boardAdapter.GetBoardCenter3DU();
m_settings.CameraGet().SetBoardLookAtPos( camera_pos ); m_camera.SetBoardLookAtPos( camera_pos );
#ifdef PRINT_STATISTICS_3D_VIEWER #ifdef PRINT_STATISTICS_3D_VIEWER
unsigned stats_start_OpenGL_Load_Time = GetRunningMicroSecs(); unsigned stats_start_OpenGL_Load_Time = GetRunningMicroSecs();
@ -368,11 +368,11 @@ void C3D_RENDER_OGL_LEGACY::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
CCONTAINER2D boardContainer; CCONTAINER2D boardContainer;
SHAPE_POLY_SET tmpBoard = m_settings.GetBoardPoly(); SHAPE_POLY_SET tmpBoard = m_boardAdapter.GetBoardPoly();
Convert_shape_line_polygon_to_triangles( tmpBoard, Convert_shape_line_polygon_to_triangles( tmpBoard,
boardContainer, boardContainer,
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
(const BOARD_ITEM &)*m_settings.GetBoard() ); (const BOARD_ITEM &)*m_boardAdapter.GetBoard() );
const LIST_OBJECT2D &listBoardObject2d = boardContainer.GetList(); const LIST_OBJECT2D &listBoardObject2d = boardContainer.GetList();
@ -409,7 +409,7 @@ void C3D_RENDER_OGL_LEGACY::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
layer_z_bot ); layer_z_bot );
} }
const SHAPE_POLY_SET &boardPoly = m_settings.GetBoardPoly(); const SHAPE_POLY_SET &boardPoly = m_boardAdapter.GetBoardPoly();
wxASSERT( boardPoly.OutlineCount() > 0 ); wxASSERT( boardPoly.OutlineCount() > 0 );
@ -418,7 +418,7 @@ void C3D_RENDER_OGL_LEGACY::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
layerTriangles->AddToMiddleContourns( boardPoly, layerTriangles->AddToMiddleContourns( boardPoly,
layer_z_bot, layer_z_bot,
layer_z_top, layer_z_top,
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
false ); false );
m_ogl_disp_list_board = new CLAYERS_OGL_DISP_LISTS( *layerTriangles, m_ogl_disp_list_board = new CLAYERS_OGL_DISP_LISTS( *layerTriangles,
@ -437,52 +437,52 @@ void C3D_RENDER_OGL_LEGACY::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
aStatusTextReporter->Report( _( "Load OpenGL: holes and vias" ) ); aStatusTextReporter->Report( _( "Load OpenGL: holes and vias" ) );
m_ogl_disp_list_through_holes_outer = generate_holes_display_list( m_ogl_disp_list_through_holes_outer = generate_holes_display_list(
m_settings.GetThroughHole_Outer().GetList(), m_boardAdapter.GetThroughHole_Outer().GetList(),
m_settings.GetThroughHole_Outer_poly(), m_boardAdapter.GetThroughHole_Outer_poly(),
1.0f, 1.0f,
0.0f, 0.0f,
false ); false );
SHAPE_POLY_SET bodyHoles = m_settings.GetThroughHole_Outer_poly(); SHAPE_POLY_SET bodyHoles = m_boardAdapter.GetThroughHole_Outer_poly();
bodyHoles.BooleanAdd( m_settings.GetThroughHole_Outer_poly_NPTH(), bodyHoles.BooleanAdd( m_boardAdapter.GetThroughHole_Outer_poly_NPTH(),
SHAPE_POLY_SET::PM_FAST ); SHAPE_POLY_SET::PM_FAST );
m_ogl_disp_list_through_holes_outer_with_npth = generate_holes_display_list( m_ogl_disp_list_through_holes_outer_with_npth = generate_holes_display_list(
m_settings.GetThroughHole_Outer().GetList(), m_boardAdapter.GetThroughHole_Outer().GetList(),
bodyHoles, bodyHoles,
1.0f, 1.0f,
0.0f, 0.0f,
false ); false );
m_ogl_disp_list_through_holes_inner = generate_holes_display_list( m_ogl_disp_list_through_holes_inner = generate_holes_display_list(
m_settings.GetThroughHole_Inner().GetList(), m_boardAdapter.GetThroughHole_Inner().GetList(),
m_settings.GetThroughHole_Inner_poly(), m_boardAdapter.GetThroughHole_Inner_poly(),
1.0f, 1.0f,
0.0f, 0.0f,
true ); true );
m_ogl_disp_list_through_holes_vias_outer = generate_holes_display_list( m_ogl_disp_list_through_holes_vias_outer = generate_holes_display_list(
m_settings.GetThroughHole_Vias_Outer().GetList(), m_boardAdapter.GetThroughHole_Vias_Outer().GetList(),
m_settings.GetThroughHole_Vias_Outer_poly(), m_boardAdapter.GetThroughHole_Vias_Outer_poly(),
1.0f, 1.0f,
0.0f, 0.0f,
false ); false );
// Not in use // Not in use
//m_ogl_disp_list_through_holes_vias_inner = generate_holes_display_list( //m_ogl_disp_list_through_holes_vias_inner = generate_holes_display_list(
// m_settings.GetThroughHole_Vias_Inner().GetList(), // m_boardAdapter.GetThroughHole_Vias_Inner().GetList(),
// m_settings.GetThroughHole_Vias_Inner_poly(), // m_boardAdapter.GetThroughHole_Vias_Inner_poly(),
// 1.0f, 0.0f, // 1.0f, 0.0f,
// false ); // false );
const MAP_POLY & innerMapHoles = m_settings.GetPolyMapHoles_Inner(); const MAP_POLY & innerMapHoles = m_boardAdapter.GetPolyMapHoles_Inner();
const MAP_POLY & outerMapHoles = m_settings.GetPolyMapHoles_Outer(); const MAP_POLY & outerMapHoles = m_boardAdapter.GetPolyMapHoles_Outer();
wxASSERT( innerMapHoles.size() == outerMapHoles.size() ); wxASSERT( innerMapHoles.size() == outerMapHoles.size() );
const MAP_CONTAINER_2D &map_holes = m_settings.GetMapLayersHoles(); const MAP_CONTAINER_2D &map_holes = m_boardAdapter.GetMapLayersHoles();
if( outerMapHoles.size() > 0 ) if( outerMapHoles.size() > 0 )
{ {
@ -526,13 +526,13 @@ void C3D_RENDER_OGL_LEGACY::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
if( aStatusTextReporter ) if( aStatusTextReporter )
aStatusTextReporter->Report( _( "Load OpenGL: layers" ) ); aStatusTextReporter->Report( _( "Load OpenGL: layers" ) );
for( MAP_CONTAINER_2D::const_iterator ii = m_settings.GetMapLayers().begin(); for( MAP_CONTAINER_2D::const_iterator ii = m_boardAdapter.GetMapLayers().begin();
ii != m_settings.GetMapLayers().end(); ii != m_boardAdapter.GetMapLayers().end();
++ii ) ++ii )
{ {
PCB_LAYER_ID layer_id = static_cast<PCB_LAYER_ID>(ii->first); PCB_LAYER_ID layer_id = static_cast<PCB_LAYER_ID>(ii->first);
if( !m_settings.Is3DLayerEnabled( layer_id ) ) if( !m_boardAdapter.Is3DLayerEnabled( layer_id ) )
continue; continue;
const CBVHCONTAINER2D *container2d = static_cast<const CBVHCONTAINER2D *>(ii->second); const CBVHCONTAINER2D *container2d = static_cast<const CBVHCONTAINER2D *>(ii->second);
@ -593,7 +593,7 @@ void C3D_RENDER_OGL_LEGACY::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
} }
} }
const MAP_POLY &map_poly = m_settings.GetPolyMap(); const MAP_POLY &map_poly = m_boardAdapter.GetPolyMap();
// Load the vertical (Z axis) component of shapes // Load the vertical (Z axis) component of shapes
if( map_poly.find( layer_id ) != map_poly.end() ) if( map_poly.find( layer_id ) != map_poly.end() )
@ -602,7 +602,7 @@ void C3D_RENDER_OGL_LEGACY::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
if( polyList->OutlineCount() > 0 ) if( polyList->OutlineCount() > 0 )
layerTriangles->AddToMiddleContourns( *polyList, layer_z_bot, layer_z_top, layerTriangles->AddToMiddleContourns( *polyList, layer_z_bot, layer_z_top,
m_settings.BiuTo3Dunits(), false ); m_boardAdapter.BiuTo3Dunits(), false );
} }
// Create display list // Create display list
@ -675,8 +675,8 @@ void C3D_RENDER_OGL_LEGACY::get_layer_z_pos ( PCB_LAYER_ID aLayerID,
float &aOutZtop, float &aOutZtop,
float &aOutZbot ) const float &aOutZbot ) const
{ {
aOutZbot = m_settings.GetLayerBottomZpos3DU( aLayerID ); aOutZbot = m_boardAdapter.GetLayerBottomZpos3DU( aLayerID );
aOutZtop = m_settings.GetLayerTopZpos3DU( aLayerID ); aOutZtop = m_boardAdapter.GetLayerTopZpos3DU( aLayerID );
if( aOutZtop < aOutZbot ) if( aOutZtop < aOutZbot )
{ {
@ -731,12 +731,12 @@ void C3D_RENDER_OGL_LEGACY::generate_cylinder( const SFVEC2F &aCenter,
void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads() void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads()
{ {
if( m_settings.GetStats_Nr_Vias() ) if( m_boardAdapter.GetStats_Nr_Vias() )
{ {
const unsigned int reserve_nr_triangles_estimation = const unsigned int reserve_nr_triangles_estimation =
m_settings.GetNrSegmentsCircle( m_settings.GetStats_Med_Via_Hole_Diameter3DU() ) * m_boardAdapter.GetNrSegmentsCircle( m_boardAdapter.GetStats_Med_Via_Hole_Diameter3DU() ) *
8 * 8 *
m_settings.GetStats_Nr_Vias(); m_boardAdapter.GetStats_Nr_Vias();
CLAYER_TRIANGLES *layerTriangleVIA = new CLAYER_TRIANGLES( reserve_nr_triangles_estimation ); CLAYER_TRIANGLES *layerTriangleVIA = new CLAYER_TRIANGLES( reserve_nr_triangles_estimation );
@ -744,20 +744,20 @@ void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads()
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Insert vias holes (vertical cylinders) // Insert vias holes (vertical cylinders)
for( auto track : m_settings.GetBoard()->Tracks() ) for( auto track : m_boardAdapter.GetBoard()->Tracks() )
{ {
if( track->Type() == PCB_VIA_T ) if( track->Type() == PCB_VIA_T )
{ {
const VIA *via = static_cast<const VIA*>(track); const VIA *via = static_cast<const VIA*>(track);
const float holediameter = via->GetDrillValue() * m_settings.BiuTo3Dunits(); const float holediameter = via->GetDrillValue() * m_boardAdapter.BiuTo3Dunits();
const float thickness = m_settings.GetCopperThickness3DU(); const float thickness = m_boardAdapter.GetCopperThickness3DU();
const int nrSegments = m_settings.GetNrSegmentsCircle( via->GetDrillValue() ); const int nrSegments = m_boardAdapter.GetNrSegmentsCircle( via->GetDrillValue() );
const double correctionFactor = m_settings.GetCircleCorrectionFactor( nrSegments ); const double correctionFactor = m_boardAdapter.GetCircleCorrectionFactor( nrSegments );
const float hole_inner_radius = ( holediameter / 2.0f ) * correctionFactor; const float hole_inner_radius = ( holediameter / 2.0f ) * correctionFactor;
const SFVEC2F via_center( via->GetStart().x * m_settings.BiuTo3Dunits(), const SFVEC2F via_center( via->GetStart().x * m_boardAdapter.BiuTo3Dunits(),
-via->GetStart().y * m_settings.BiuTo3Dunits() ); -via->GetStart().y * m_boardAdapter.BiuTo3Dunits() );
PCB_LAYER_ID top_layer, bottom_layer; PCB_LAYER_ID top_layer, bottom_layer;
via->LayerPair( &top_layer, &bottom_layer ); via->LayerPair( &top_layer, &bottom_layer );
@ -788,7 +788,7 @@ void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads()
} }
if( m_settings.GetStats_Nr_Holes() > 0 ) if( m_boardAdapter.GetStats_Nr_Holes() > 0 )
{ {
SHAPE_POLY_SET tht_outer_holes_poly; // Stores the outer poly of the copper holes (the pad) SHAPE_POLY_SET tht_outer_holes_poly; // Stores the outer poly of the copper holes (the pad)
SHAPE_POLY_SET tht_inner_holes_poly; // Stores the inner poly of the copper holes (the hole) SHAPE_POLY_SET tht_inner_holes_poly; // Stores the inner poly of the copper holes (the hole)
@ -797,7 +797,7 @@ void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads()
tht_inner_holes_poly.RemoveAllContours(); tht_inner_holes_poly.RemoveAllContours();
// Insert pads holes (vertical cylinders) // Insert pads holes (vertical cylinders)
for( const auto module : m_settings.GetBoard()->Modules() ) for( const auto module : m_boardAdapter.GetBoard()->Modules() )
{ {
for( auto pad : module->Pads() ) for( auto pad : module->Pads() )
{ {
@ -812,10 +812,10 @@ void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads()
// we use the hole diameter to calculate the seg count. // we use the hole diameter to calculate the seg count.
// for round holes, drillsize.x == drillsize.y // for round holes, drillsize.x == drillsize.y
// for slots, the diameter is the smaller of (drillsize.x, drillsize.y) // for slots, the diameter is the smaller of (drillsize.x, drillsize.y)
int copperThickness = m_settings.GetCopperThicknessBIU(); int copperThickness = m_boardAdapter.GetCopperThicknessBIU();
int radius = std::min( drillsize.x, drillsize.y ) / 2 + copperThickness; int radius = std::min( drillsize.x, drillsize.y ) / 2 + copperThickness;
int nrSegments = m_settings.GetNrSegmentsCircle( radius * 2 ); int nrSegments = m_boardAdapter.GetNrSegmentsCircle( radius * 2 );
double correctionFactor = m_settings.GetCircleCorrectionFactor( nrSegments ); double correctionFactor = m_boardAdapter.GetCircleCorrectionFactor( nrSegments );
int correction = radius * ( correctionFactor - 1 ); int correction = radius * ( correctionFactor - 1 );
pad->BuildPadDrillShapePolygon( pad->BuildPadDrillShapePolygon(
@ -834,8 +834,8 @@ void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads()
Convert_shape_line_polygon_to_triangles( tht_outer_holes_poly, Convert_shape_line_polygon_to_triangles( tht_outer_holes_poly,
holesContainer, holesContainer,
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
(const BOARD_ITEM &)*m_settings.GetBoard() ); (const BOARD_ITEM &)*m_boardAdapter.GetBoard() );
const LIST_OBJECT2D &listHolesObject2d = holesContainer.GetList(); const LIST_OBJECT2D &listHolesObject2d = holesContainer.GetList();
@ -873,7 +873,7 @@ void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads()
{ {
layerTriangles->AddToMiddleContourns( tht_outer_holes_poly, layerTriangles->AddToMiddleContourns( tht_outer_holes_poly,
layer_z_bot, layer_z_top, layer_z_bot, layer_z_top,
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
false ); false );
m_ogl_disp_list_pads_holes = new CLAYERS_OGL_DISP_LISTS( m_ogl_disp_list_pads_holes = new CLAYERS_OGL_DISP_LISTS(
@ -896,13 +896,13 @@ void C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads()
*/ */
void C3D_RENDER_OGL_LEGACY::load_3D_models( REPORTER *aStatusTextReporter ) void C3D_RENDER_OGL_LEGACY::load_3D_models( REPORTER *aStatusTextReporter )
{ {
if( (!m_settings.GetFlag( FL_MODULE_ATTRIBUTES_NORMAL )) && if((!m_boardAdapter.GetFlag( FL_MODULE_ATTRIBUTES_NORMAL )) &&
(!m_settings.GetFlag( FL_MODULE_ATTRIBUTES_NORMAL_INSERT )) && (!m_boardAdapter.GetFlag( FL_MODULE_ATTRIBUTES_NORMAL_INSERT )) &&
(!m_settings.GetFlag( FL_MODULE_ATTRIBUTES_VIRTUAL )) ) (!m_boardAdapter.GetFlag( FL_MODULE_ATTRIBUTES_VIRTUAL )) )
return; return;
// Go for all modules // Go for all modules
for( auto module : m_settings.GetBoard()->Modules() ) for( auto module : m_boardAdapter.GetBoard()->Modules() )
{ {
if( !module->Models().empty() ) if( !module->Models().empty() )
{ {
@ -930,14 +930,14 @@ void C3D_RENDER_OGL_LEGACY::load_3D_models( REPORTER *aStatusTextReporter )
{ {
// It is not present, try get it from cache // It is not present, try get it from cache
const S3DMODEL *modelPtr = const S3DMODEL *modelPtr =
m_settings.Get3DCacheManager()->GetModel( sM->m_Filename ); m_boardAdapter.Get3DCacheManager()->GetModel( sM->m_Filename );
// only add it if the return is not NULL // only add it if the return is not NULL
if( modelPtr ) if( modelPtr )
{ {
C_OGL_3DMODEL* ogl_model = C_OGL_3DMODEL* ogl_model =
new C_OGL_3DMODEL( *modelPtr, new C_OGL_3DMODEL( *modelPtr,
m_settings.MaterialModeGet() ); m_boardAdapter.MaterialModeGet() );
if( ogl_model ) if( ogl_model )
m_3dmodel_map[ sM->m_Filename ] = ogl_model; m_3dmodel_map[ sM->m_Filename ] = ogl_model;

View File

@ -44,8 +44,8 @@
*/ */
#define UNITS3D_TO_UNITSPCB (IU_PER_MM) #define UNITS3D_TO_UNITSPCB (IU_PER_MM)
C3D_RENDER_OGL_LEGACY::C3D_RENDER_OGL_LEGACY( EDA_3D_SETTINGS &aSettings ) : C3D_RENDER_OGL_LEGACY::C3D_RENDER_OGL_LEGACY( BOARD_ADAPTER& aAdapter, CCAMERA& aCamera ) :
C3D_RENDER_BASE( aSettings ) C3D_RENDER_BASE( aAdapter, aCamera )
{ {
wxLogTrace( m_logTrace, wxT( "C3D_RENDER_OGL_LEGACY::C3D_RENDER_OGL_LEGACY" ) ); wxLogTrace( m_logTrace, wxT( "C3D_RENDER_OGL_LEGACY::C3D_RENDER_OGL_LEGACY" ) );
@ -148,8 +148,7 @@ void C3D_RENDER_OGL_LEGACY::render_3D_arrows()
glm::mat4(1.0f), glm::mat4(1.0f),
SFVEC3F( 0.0f, 0.0f, -(arrow_size * 2.75f) ) ); SFVEC3F( 0.0f, 0.0f, -(arrow_size * 2.75f) ) );
const glm::mat4 ViewMatrix = TranslationMatrix * const glm::mat4 ViewMatrix = TranslationMatrix * m_camera.GetRotationMatrix();
m_settings.CameraGet().GetRotationMatrix();
glLoadMatrixf( glm::value_ptr( ViewMatrix ) ); glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
@ -178,23 +177,23 @@ void C3D_RENDER_OGL_LEGACY::setupMaterials()
{ {
m_materials = {}; m_materials = {};
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
{ {
// http://devernay.free.fr/cours/opengl/materials.html // http://devernay.free.fr/cours/opengl/materials.html
// Copper material mixed with the copper color // Copper material mixed with the copper color
m_materials.m_Copper.m_Ambient = SFVEC3F( m_settings.m_CopperColor.r * 0.1f, m_materials.m_Copper.m_Ambient = SFVEC3F( m_boardAdapter.m_CopperColor.r * 0.1f,
m_settings.m_CopperColor.g * 0.1f, m_boardAdapter.m_CopperColor.g * 0.1f,
m_settings.m_CopperColor.b * 0.1f); m_boardAdapter.m_CopperColor.b * 0.1f);
m_materials.m_Copper.m_Specular = SFVEC3F( m_settings.m_CopperColor.r * 0.75f + 0.25f, m_materials.m_Copper.m_Specular = SFVEC3F( m_boardAdapter.m_CopperColor.r * 0.75f + 0.25f,
m_settings.m_CopperColor.g * 0.75f + 0.25f, m_boardAdapter.m_CopperColor.g * 0.75f + 0.25f,
m_settings.m_CopperColor.b * 0.75f + 0.25f ); m_boardAdapter.m_CopperColor.b * 0.75f + 0.25f );
// This guess the material type(ex: copper vs gold) to determine the // This guess the material type(ex: copper vs gold) to determine the
// shininess factor between 0.1 and 0.4 // shininess factor between 0.1 and 0.4
float shininessfactor = 0.40f - mapf( fabs( m_settings.m_CopperColor.r - float shininessfactor = 0.40f - mapf( fabs( m_boardAdapter.m_CopperColor.r -
m_settings.m_CopperColor.g ), m_boardAdapter.m_CopperColor.g ),
0.15f, 1.00f, 0.15f, 1.00f,
0.00f, 0.30f ); 0.00f, 0.30f );
@ -203,69 +202,73 @@ void C3D_RENDER_OGL_LEGACY::setupMaterials()
// Paste material mixed with paste color // Paste material mixed with paste color
m_materials.m_Paste.m_Ambient = SFVEC3F( m_settings.m_SolderPasteColor.r, m_materials.m_Paste.m_Ambient = SFVEC3F( m_boardAdapter.m_SolderPasteColor.r,
m_settings.m_SolderPasteColor.g, m_boardAdapter.m_SolderPasteColor.g,
m_settings.m_SolderPasteColor.b ); m_boardAdapter.m_SolderPasteColor.b );
m_materials.m_Paste.m_Specular = SFVEC3F( m_settings.m_SolderPasteColor.r * m_materials.m_Paste.m_Specular = SFVEC3F( m_boardAdapter.m_SolderPasteColor.r *
m_settings.m_SolderPasteColor.r, m_boardAdapter.m_SolderPasteColor.r,
m_settings.m_SolderPasteColor.g * m_boardAdapter.m_SolderPasteColor.g *
m_settings.m_SolderPasteColor.g, m_boardAdapter.m_SolderPasteColor.g,
m_settings.m_SolderPasteColor.b * m_boardAdapter.m_SolderPasteColor.b *
m_settings.m_SolderPasteColor.b ); m_boardAdapter.m_SolderPasteColor.b );
m_materials.m_Paste.m_Shininess = 0.1f * 128.0f; m_materials.m_Paste.m_Shininess = 0.1f * 128.0f;
m_materials.m_Paste.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f ); m_materials.m_Paste.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f );
// Silk screen material mixed with silk screen color // Silk screen material mixed with silk screen color
m_materials.m_SilkSTop.m_Ambient = SFVEC3F( m_settings.m_SilkScreenColorTop.r, m_materials.m_SilkSTop.m_Ambient = SFVEC3F( m_boardAdapter.m_SilkScreenColorTop.r,
m_settings.m_SilkScreenColorTop.g, m_settings.m_SilkScreenColorTop.b ); m_boardAdapter.m_SilkScreenColorTop.g,
m_boardAdapter.m_SilkScreenColorTop.b );
m_materials.m_SilkSTop.m_Specular = SFVEC3F( m_materials.m_SilkSTop.m_Specular = SFVEC3F(
m_settings.m_SilkScreenColorTop.r * m_settings.m_SilkScreenColorTop.r + 0.10f, m_boardAdapter.m_SilkScreenColorTop.r * m_boardAdapter.m_SilkScreenColorTop.r + 0.10f,
m_settings.m_SilkScreenColorTop.g * m_settings.m_SilkScreenColorTop.g + 0.10f, m_boardAdapter.m_SilkScreenColorTop.g * m_boardAdapter.m_SilkScreenColorTop.g + 0.10f,
m_settings.m_SilkScreenColorTop.b * m_settings.m_SilkScreenColorTop.b + 0.10f ); m_boardAdapter.m_SilkScreenColorTop.b * m_boardAdapter.m_SilkScreenColorTop.b + 0.10f );
m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f; m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f;
m_materials.m_SilkSTop.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f ); m_materials.m_SilkSTop.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f );
// Silk screen material mixed with silk screen color // Silk screen material mixed with silk screen color
m_materials.m_SilkSBot.m_Ambient = SFVEC3F( m_settings.m_SilkScreenColorBot.r, m_materials.m_SilkSBot.m_Ambient = SFVEC3F( m_boardAdapter.m_SilkScreenColorBot.r,
m_settings.m_SilkScreenColorBot.g, m_settings.m_SilkScreenColorBot.b ); m_boardAdapter.m_SilkScreenColorBot.g,
m_boardAdapter.m_SilkScreenColorBot.b );
m_materials.m_SilkSBot.m_Specular = SFVEC3F( m_materials.m_SilkSBot.m_Specular = SFVEC3F(
m_settings.m_SilkScreenColorBot.r * m_settings.m_SilkScreenColorBot.r + 0.10f, m_boardAdapter.m_SilkScreenColorBot.r * m_boardAdapter.m_SilkScreenColorBot.r + 0.10f,
m_settings.m_SilkScreenColorBot.g * m_settings.m_SilkScreenColorBot.g + 0.10f, m_boardAdapter.m_SilkScreenColorBot.g * m_boardAdapter.m_SilkScreenColorBot.g + 0.10f,
m_settings.m_SilkScreenColorBot.b * m_settings.m_SilkScreenColorBot.b + 0.10f ); m_boardAdapter.m_SilkScreenColorBot.b * m_boardAdapter.m_SilkScreenColorBot.b + 0.10f );
m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f; m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f;
m_materials.m_SilkSBot.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f ); m_materials.m_SilkSBot.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f );
// Solder mask material mixed with solder mask color // Solder mask material mixed with solder mask color
m_materials.m_SolderMaskTop.m_Ambient = SFVEC3F( m_settings.m_SolderMaskColorTop.r * 0.3f, m_materials.m_SolderMaskTop.m_Ambient = SFVEC3F(
m_settings.m_SolderMaskColorTop.g * 0.3f, m_boardAdapter.m_SolderMaskColorTop.r * 0.3f,
m_settings.m_SolderMaskColorTop.b * 0.3f ); m_boardAdapter.m_SolderMaskColorTop.g * 0.3f,
m_boardAdapter.m_SolderMaskColorTop.b * 0.3f );
m_materials.m_SolderMaskTop.m_Specular = m_materials.m_SolderMaskTop.m_Specular = SFVEC3F(
SFVEC3F( m_settings.m_SolderMaskColorTop.r * m_settings.m_SolderMaskColorTop.r, m_boardAdapter.m_SolderMaskColorTop.r * m_boardAdapter.m_SolderMaskColorTop.r,
m_settings.m_SolderMaskColorTop.g * m_settings.m_SolderMaskColorTop.g, m_boardAdapter.m_SolderMaskColorTop.g * m_boardAdapter.m_SolderMaskColorTop.g,
m_settings.m_SolderMaskColorTop.b * m_settings.m_SolderMaskColorTop.b ); m_boardAdapter.m_SolderMaskColorTop.b * m_boardAdapter.m_SolderMaskColorTop.b );
m_materials.m_SolderMaskTop.m_Shininess = 0.8f * 128.0f; m_materials.m_SolderMaskTop.m_Shininess = 0.8f * 128.0f;
m_materials.m_SolderMaskTop.m_Transparency = 0.17f; m_materials.m_SolderMaskTop.m_Transparency = 0.17f;
m_materials.m_SolderMaskTop.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f ); m_materials.m_SolderMaskTop.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f );
// Solder mask material mixed with solder mask color // Solder mask material mixed with solder mask color
m_materials.m_SolderMaskBot.m_Ambient = SFVEC3F( m_settings.m_SolderMaskColorBot.r * 0.3f, m_materials.m_SolderMaskBot.m_Ambient = SFVEC3F(
m_settings.m_SolderMaskColorBot.g * 0.3f, m_boardAdapter.m_SolderMaskColorBot.r * 0.3f,
m_settings.m_SolderMaskColorBot.b * 0.3f ); m_boardAdapter.m_SolderMaskColorBot.g * 0.3f,
m_boardAdapter.m_SolderMaskColorBot.b * 0.3f );
m_materials.m_SolderMaskBot.m_Specular = m_materials.m_SolderMaskBot.m_Specular = SFVEC3F(
SFVEC3F( m_settings.m_SolderMaskColorBot.r * m_settings.m_SolderMaskColorBot.r, m_boardAdapter.m_SolderMaskColorBot.r * m_boardAdapter.m_SolderMaskColorBot.r,
m_settings.m_SolderMaskColorBot.g * m_settings.m_SolderMaskColorBot.g, m_boardAdapter.m_SolderMaskColorBot.g * m_boardAdapter.m_SolderMaskColorBot.g,
m_settings.m_SolderMaskColorBot.b * m_settings.m_SolderMaskColorBot.b ); m_boardAdapter.m_SolderMaskColorBot.b * m_boardAdapter.m_SolderMaskColorBot.b );
m_materials.m_SolderMaskBot.m_Shininess = 0.8f * 128.0f; m_materials.m_SolderMaskBot.m_Shininess = 0.8f * 128.0f;
m_materials.m_SolderMaskBot.m_Transparency = 0.17f; m_materials.m_SolderMaskBot.m_Transparency = 0.17f;
@ -277,7 +280,7 @@ void C3D_RENDER_OGL_LEGACY::setupMaterials()
97.0f / 255.0f, 97.0f / 255.0f,
47.0f / 255.0f ); 47.0f / 255.0f );
m_materials.m_EpoxyBoard.m_Diffuse = m_settings.m_BoardBodyColor; m_materials.m_EpoxyBoard.m_Diffuse = m_boardAdapter.m_BoardBodyColor;
m_materials.m_EpoxyBoard.m_Specular = SFVEC3F( 18.0f / 255.0f, m_materials.m_EpoxyBoard.m_Specular = SFVEC3F( 18.0f / 255.0f,
3.0f / 255.0f, 3.0f / 255.0f,
@ -332,7 +335,7 @@ void C3D_RENDER_OGL_LEGACY::setupMaterials()
// Epoxy material // Epoxy material
m_materials.m_EpoxyBoard.m_Ambient = matAmbientColor; m_materials.m_EpoxyBoard.m_Ambient = matAmbientColor;
m_materials.m_EpoxyBoard.m_Diffuse = m_settings.m_BoardBodyColor; m_materials.m_EpoxyBoard.m_Diffuse = m_boardAdapter.m_BoardBodyColor;
m_materials.m_EpoxyBoard.m_Specular = matSpecularColor; m_materials.m_EpoxyBoard.m_Specular = matSpecularColor;
m_materials.m_EpoxyBoard.m_Shininess = matShininess; m_materials.m_EpoxyBoard.m_Shininess = matShininess;
m_materials.m_EpoxyBoard.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f ); m_materials.m_EpoxyBoard.m_Emissive = SFVEC3F( 0.0f, 0.0f, 0.0f );
@ -415,9 +418,9 @@ void C3D_RENDER_OGL_LEGACY::set_layer_material( PCB_LAYER_ID aLayerID )
SFVEC3F C3D_RENDER_OGL_LEGACY::get_layer_color( PCB_LAYER_ID aLayerID ) SFVEC3F C3D_RENDER_OGL_LEGACY::get_layer_color( PCB_LAYER_ID aLayerID )
{ {
SFVEC3F layerColor = m_settings.GetLayerColor( aLayerID ); SFVEC3F layerColor = m_boardAdapter.GetLayerColor( aLayerID );
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
{ {
switch( aLayerID ) switch( aLayerID )
{ {
@ -426,22 +429,22 @@ SFVEC3F C3D_RENDER_OGL_LEGACY::get_layer_color( PCB_LAYER_ID aLayerID )
break; break;
case B_Mask: case B_Mask:
layerColor = m_settings.m_SolderMaskColorBot; layerColor = m_boardAdapter.m_SolderMaskColorBot;
break; break;
case F_Mask: case F_Mask:
layerColor = m_settings.m_SolderMaskColorTop; layerColor = m_boardAdapter.m_SolderMaskColorTop;
break; break;
case B_Paste: case B_Paste:
case F_Paste: case F_Paste:
layerColor = m_settings.m_SolderPasteColor; layerColor = m_boardAdapter.m_SolderPasteColor;
break; break;
case B_SilkS: case B_SilkS:
layerColor = m_settings.m_SilkScreenColorBot; layerColor = m_boardAdapter.m_SilkScreenColorBot;
break; break;
case F_SilkS: case F_SilkS:
layerColor = m_settings.m_SilkScreenColorTop; layerColor = m_boardAdapter.m_SilkScreenColorTop;
break; break;
case Dwgs_User: case Dwgs_User:
@ -461,7 +464,7 @@ SFVEC3F C3D_RENDER_OGL_LEGACY::get_layer_color( PCB_LAYER_ID aLayerID )
break; break;
default: default:
layerColor = m_settings.m_CopperColor; layerColor = m_boardAdapter.m_CopperColor;
break; break;
} }
} }
@ -539,16 +542,16 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
setupMaterials(); setupMaterials();
// generate a new 3D grid as the size of the board may had changed // generate a new 3D grid as the size of the board may had changed
m_last_grid_type = m_settings.GridGet(); m_last_grid_type = m_boardAdapter.GridGet();
generate_new_3DGrid( m_last_grid_type ); generate_new_3DGrid( m_last_grid_type );
} }
else else
{ {
// Check if grid was changed // Check if grid was changed
if( m_settings.GridGet() != m_last_grid_type ) if( m_boardAdapter.GridGet() != m_last_grid_type )
{ {
// and generate a new one // and generate a new one
m_last_grid_type = m_settings.GridGet(); m_last_grid_type = m_boardAdapter.GridGet();
generate_new_3DGrid( m_last_grid_type ); generate_new_3DGrid( m_last_grid_type );
} }
} }
@ -573,8 +576,8 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
// Draw the background ( rectangle with color gradient) // Draw the background ( rectangle with color gradient)
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
OGL_DrawBackground( SFVEC3F( m_settings.m_BgColorTop ), OGL_DrawBackground( SFVEC3F( m_boardAdapter.m_BgColorTop ),
SFVEC3F( m_settings.m_BgColorBot ) ); SFVEC3F( m_boardAdapter.m_BgColorBot ) );
glEnable( GL_DEPTH_TEST ); glEnable( GL_DEPTH_TEST );
@ -582,11 +585,11 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
// Set projection and modelview matrixes // Set projection and modelview matrixes
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
glMatrixMode( GL_PROJECTION ); glMatrixMode( GL_PROJECTION );
glLoadMatrixf( glm::value_ptr( m_settings.CameraGet().GetProjectionMatrix() ) ); glLoadMatrixf( glm::value_ptr( m_camera.GetProjectionMatrix() ) );
glMatrixMode( GL_MODELVIEW ); glMatrixMode( GL_MODELVIEW );
glLoadIdentity(); glLoadIdentity();
glLoadMatrixf( glm::value_ptr( m_settings.CameraGet().GetViewMatrix() ) ); glLoadMatrixf( glm::value_ptr( m_camera.GetViewMatrix() ) );
// Position the headlight // Position the headlight
@ -599,7 +602,7 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
glEnable( GL_LIGHTING ); glEnable( GL_LIGHTING );
{ {
const SFVEC3F &cameraPos = m_settings.CameraGet().GetPos(); const SFVEC3F &cameraPos = m_camera.GetPos();
// Place the light at a minimun Z so the diffuse factor will not drop // Place the light at a minimun Z so the diffuse factor will not drop
// and the board will still look with good light. // and the board will still look with good light.
@ -625,12 +628,12 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
// Display board body // Display board body
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
if( m_settings.GetFlag( FL_SHOW_BOARD_BODY ) ) if( m_boardAdapter.GetFlag( FL_SHOW_BOARD_BODY ) )
{ {
if( m_ogl_disp_list_board ) if( m_ogl_disp_list_board )
{ {
m_ogl_disp_list_board->ApplyScalePosition( -m_settings.GetEpoxyThickness3DU() / 2.0f, m_ogl_disp_list_board->ApplyScalePosition( -m_boardAdapter.GetEpoxyThickness3DU() / 2.0f,
m_settings.GetEpoxyThickness3DU() ); m_boardAdapter.GetEpoxyThickness3DU() );
OGL_SetMaterial( m_materials.m_EpoxyBoard ); OGL_SetMaterial( m_materials.m_EpoxyBoard );
@ -639,8 +642,8 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
if( m_ogl_disp_list_through_holes_outer_with_npth ) if( m_ogl_disp_list_through_holes_outer_with_npth )
{ {
m_ogl_disp_list_through_holes_outer_with_npth->ApplyScalePosition( m_ogl_disp_list_through_holes_outer_with_npth->ApplyScalePosition(
-m_settings.GetEpoxyThickness3DU() / 2.0f, -m_boardAdapter.GetEpoxyThickness3DU() / 2.0f,
m_settings.GetEpoxyThickness3DU() ); m_boardAdapter.GetEpoxyThickness3DU() );
m_ogl_disp_list_board->DrawAllCameraCulledSubtractLayer( m_ogl_disp_list_board->DrawAllCameraCulledSubtractLayer(
m_ogl_disp_list_through_holes_outer_with_npth, m_ogl_disp_list_through_holes_outer_with_npth,
@ -654,7 +657,7 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
} }
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
{ {
// Draw vias and pad holes with copper material // Draw vias and pad holes with copper material
set_layer_material( B_Cu ); set_layer_material( B_Cu );
@ -689,7 +692,7 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
continue; continue;
// Do not show inner layers when it is displaying the board // Do not show inner layers when it is displaying the board
if( m_settings.GetFlag( FL_SHOW_BOARD_BODY ) ) if( m_boardAdapter.GetFlag( FL_SHOW_BOARD_BODY ) )
{ {
if( (layer_id > F_Cu) && (layer_id < B_Cu) ) if( (layer_id > F_Cu) && (layer_id < B_Cu) )
continue; continue;
@ -737,7 +740,7 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
} }
else else
{ {
if( m_settings.GetFlag( FL_SUBTRACT_MASK_FROM_SILK ) && if( m_boardAdapter.GetFlag( FL_SUBTRACT_MASK_FROM_SILK ) &&
( ( ( layer_id == B_SilkS ) && ( ( ( layer_id == B_SilkS ) &&
( m_ogl_disp_lists_layers.find( B_Mask ) != m_ogl_disp_lists_layers.end() ) ) || ( m_ogl_disp_lists_layers.find( B_Mask ) != m_ogl_disp_lists_layers.end() ) ) ||
( ( layer_id == F_SilkS ) && ( ( layer_id == F_SilkS ) &&
@ -767,8 +770,7 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
} }
else else
{ {
pLayerDispList->DrawAllCameraCulled( m_settings.CameraGet().GetPos().z, pLayerDispList->DrawAllCameraCulled( m_camera.GetPos().z, aIsMoving == false );
(aIsMoving == false) );
} }
} }
} }
@ -791,7 +793,7 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
// Display transparent mask layers // Display transparent mask layers
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
if( m_settings.GetFlag( FL_SOLDERMASK ) ) if( m_boardAdapter.GetFlag( FL_SOLDERMASK ) )
{ {
//setLight_Top( true ); //setLight_Top( true );
//setLight_Bottom( true ); //setLight_Bottom( true );
@ -801,20 +803,20 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
glEnable( GL_POLYGON_OFFSET_FILL ); glEnable( GL_POLYGON_OFFSET_FILL );
glPolygonOffset( 0.0f, -1.0f ); glPolygonOffset( 0.0f, -1.0f );
if( m_settings.CameraGet().GetPos().z > 0 ) if( m_camera.GetPos().z > 0 )
{ {
render_solder_mask_layer( B_Mask, m_settings.GetLayerTopZpos3DU( B_Mask ), render_solder_mask_layer( B_Mask, m_boardAdapter.GetLayerTopZpos3DU( B_Mask ),
aIsMoving ); aIsMoving );
render_solder_mask_layer( F_Mask, m_settings.GetLayerBottomZpos3DU( F_Mask ), render_solder_mask_layer( F_Mask, m_boardAdapter.GetLayerBottomZpos3DU( F_Mask ),
aIsMoving ); aIsMoving );
} }
else else
{ {
render_solder_mask_layer( F_Mask, m_settings.GetLayerBottomZpos3DU( F_Mask ), render_solder_mask_layer( F_Mask, m_boardAdapter.GetLayerBottomZpos3DU( F_Mask ),
aIsMoving ); aIsMoving );
render_solder_mask_layer( B_Mask, m_settings.GetLayerTopZpos3DU( B_Mask ), render_solder_mask_layer( B_Mask, m_boardAdapter.GetLayerTopZpos3DU( B_Mask ),
aIsMoving ); aIsMoving );
} }
@ -838,7 +840,7 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
// Render Grid // Render Grid
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
if( m_settings.GridGet() != GRID3D_TYPE::NONE ) if( m_boardAdapter.GridGet() != GRID3D_TYPE::NONE )
{ {
glDisable( GL_LIGHTING ); glDisable( GL_LIGHTING );
@ -851,7 +853,7 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
// Render 3D arrows // Render 3D arrows
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
if( m_settings.GetFlag( FL_AXIS ) ) if( m_boardAdapter.GetFlag( FL_AXIS ) )
render_3D_arrows(); render_3D_arrows();
// Return back to the original viewport (this is important if we want // Return back to the original viewport (this is important if we want
@ -1033,11 +1035,11 @@ void C3D_RENDER_OGL_LEGACY::render_solder_mask_layer( PCB_LAYER_ID aLayerID,
if( m_ogl_disp_list_through_holes_vias_outer ) if( m_ogl_disp_list_through_holes_vias_outer )
m_ogl_disp_list_through_holes_vias_outer->ApplyScalePosition( m_ogl_disp_list_through_holes_vias_outer->ApplyScalePosition(
aZPosition, aZPosition,
m_settings.GetNonCopperLayerThickness3DU() ); m_boardAdapter.GetNonCopperLayerThickness3DU() );
m_ogl_disp_list_board->ApplyScalePosition( m_ogl_disp_list_board->ApplyScalePosition(
aZPosition, aZPosition,
m_settings.GetNonCopperLayerThickness3DU() ); m_boardAdapter.GetNonCopperLayerThickness3DU() );
set_layer_material( aLayerID ); set_layer_material( aLayerID );
@ -1055,11 +1057,11 @@ void C3D_RENDER_OGL_LEGACY::render_solder_mask_layer( PCB_LAYER_ID aLayerID,
if( m_ogl_disp_list_through_holes_vias_outer ) if( m_ogl_disp_list_through_holes_vias_outer )
m_ogl_disp_list_through_holes_vias_outer->ApplyScalePosition( m_ogl_disp_list_through_holes_vias_outer->ApplyScalePosition(
aZPosition, aZPosition,
m_settings.GetNonCopperLayerThickness3DU() ); m_boardAdapter.GetNonCopperLayerThickness3DU() );
m_ogl_disp_list_board->ApplyScalePosition( m_ogl_disp_list_board->ApplyScalePosition(
aZPosition, aZPosition,
m_settings.GetNonCopperLayerThickness3DU() ); m_boardAdapter.GetNonCopperLayerThickness3DU() );
set_layer_material( aLayerID ); set_layer_material( aLayerID );
@ -1078,10 +1080,10 @@ void C3D_RENDER_OGL_LEGACY::render_3D_models( bool aRenderTopOrBot,
bool aRenderTransparentOnly ) bool aRenderTransparentOnly )
{ {
// Go for all modules // Go for all modules
for( auto module : m_settings.GetBoard()->Modules() ) for( auto module : m_boardAdapter.GetBoard()->Modules() )
{ {
if( !module->Models().empty() ) if( !module->Models().empty() )
if( m_settings.ShouldModuleBeDisplayed( (MODULE_ATTR_T) module->GetAttributes() ) ) if( m_boardAdapter.ShouldModuleBeDisplayed((MODULE_ATTR_T) module->GetAttributes() ) )
if( ( aRenderTopOrBot && !module->IsFlipped() ) if( ( aRenderTopOrBot && !module->IsFlipped() )
|| ( !aRenderTopOrBot && module->IsFlipped() ) ) || ( !aRenderTopOrBot && module->IsFlipped() ) )
render_3D_module( module, aRenderTransparentOnly ); render_3D_module( module, aRenderTransparentOnly );
@ -1094,14 +1096,14 @@ void C3D_RENDER_OGL_LEGACY::render_3D_module( const MODULE* module,
{ {
if( !module->Models().empty() ) if( !module->Models().empty() )
{ {
const double zpos = m_settings.GetModulesZcoord3DIU( module->IsFlipped() ); const double zpos = m_boardAdapter.GetModulesZcoord3DIU( module->IsFlipped() );
glPushMatrix(); glPushMatrix();
wxPoint pos = module->GetPosition(); wxPoint pos = module->GetPosition();
glTranslatef( pos.x * m_settings.BiuTo3Dunits(), glTranslatef( pos.x * m_boardAdapter.BiuTo3Dunits(),
-pos.y * m_settings.BiuTo3Dunits(), -pos.y * m_boardAdapter.BiuTo3Dunits(),
zpos ); zpos );
if( module->GetOrientation() ) if( module->GetOrientation() )
@ -1113,7 +1115,7 @@ void C3D_RENDER_OGL_LEGACY::render_3D_module( const MODULE* module,
glRotatef( 180.0f, 0.0f, 0.0f, 1.0f ); glRotatef( 180.0f, 0.0f, 0.0f, 1.0f );
} }
double modelunit_to_3d_units_factor = m_settings.BiuTo3Dunits() * UNITS3D_TO_UNITSPCB; double modelunit_to_3d_units_factor = m_boardAdapter.BiuTo3Dunits() * UNITS3D_TO_UNITSPCB;
glScaled( modelunit_to_3d_units_factor, glScaled( modelunit_to_3d_units_factor,
modelunit_to_3d_units_factor, modelunit_to_3d_units_factor,
@ -1153,7 +1155,7 @@ void C3D_RENDER_OGL_LEGACY::render_3D_module( const MODULE* module,
else else
modelPtr->Draw_opaque(); modelPtr->Draw_opaque();
if( m_settings.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) ) if( m_boardAdapter.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) )
{ {
glEnable( GL_BLEND ); glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
@ -1210,11 +1212,11 @@ void C3D_RENDER_OGL_LEGACY::generate_new_3DGrid( GRID3D_TYPE aGridType )
const double zpos = 0.0; const double zpos = 0.0;
// Color of grid lines // Color of grid lines
const SFVEC3F gridColor = m_settings.GetColor( DARKGRAY ); const SFVEC3F gridColor = m_boardAdapter.GetColor( DARKGRAY );
// Color of grid lines every 5 lines // Color of grid lines every 5 lines
const SFVEC3F gridColor_marker = m_settings.GetColor( LIGHTGRAY ); const SFVEC3F gridColor_marker = m_boardAdapter.GetColor( LIGHTGRAY );
const double scale = m_settings.BiuTo3Dunits(); const double scale = m_boardAdapter.BiuTo3Dunits();
const double transparency = 0.35; const double transparency = 0.35;
double griSizeMM = 0.0; double griSizeMM = 0.0;
@ -1240,8 +1242,8 @@ void C3D_RENDER_OGL_LEGACY::generate_new_3DGrid( GRID3D_TYPE aGridType )
glNormal3f( 0.0, 0.0, 1.0 ); glNormal3f( 0.0, 0.0, 1.0 );
const wxSize brd_size = m_settings.GetBoardSizeBIU(); const wxSize brd_size = m_boardAdapter.GetBoardSizeBIU();
wxPoint brd_center_pos = m_settings.GetBoardPosBIU(); wxPoint brd_center_pos = m_boardAdapter.GetBoardPosBIU();
brd_center_pos.y = -brd_center_pos.y; brd_center_pos.y = -brd_center_pos.y;

View File

@ -59,7 +59,7 @@ typedef std::map< wxString, C_OGL_3DMODEL * > MAP_3DMODEL;
class C3D_RENDER_OGL_LEGACY : public C3D_RENDER_BASE class C3D_RENDER_OGL_LEGACY : public C3D_RENDER_BASE
{ {
public: public:
explicit C3D_RENDER_OGL_LEGACY( EDA_3D_SETTINGS &aSettings ); explicit C3D_RENDER_OGL_LEGACY( BOARD_ADAPTER& aAdapter, CCAMERA& aCamera );
~C3D_RENDER_OGL_LEGACY(); ~C3D_RENDER_OGL_LEGACY();
@ -108,9 +108,6 @@ private:
MAP_3DMODEL m_3dmodel_map; MAP_3DMODEL m_3dmodel_map;
private: private:
void generate_through_outer_holes();
void generate_through_inner_holes();
CLAYERS_OGL_DISP_LISTS *generate_holes_display_list( const LIST_OBJECT2D &aListHolesObject2d, CLAYERS_OGL_DISP_LISTS *generate_holes_display_list( const LIST_OBJECT2D &aListHolesObject2d,
const SHAPE_POLY_SET &aPoly, const SHAPE_POLY_SET &aPoly,
float aZtop, float aZtop,
@ -213,11 +210,6 @@ private:
void set_layer_material( PCB_LAYER_ID aLayerID ); void set_layer_material( PCB_LAYER_ID aLayerID );
SFVEC3F get_layer_color( PCB_LAYER_ID aLayerID ); SFVEC3F get_layer_color( PCB_LAYER_ID aLayerID );
public:
const MAP_OGL_DISP_LISTS &GetLayerDispListMap() const { return m_ogl_disp_lists_layers; }
const CLAYERS_OGL_DISP_LISTS *GetLayerDispList( PCB_LAYER_ID aLayerId ) const { return m_ogl_disp_lists_layers.at( aLayerId ); }
const CLAYERS_OGL_DISP_LISTS *GetBoardDispList() const { return m_ogl_disp_list_board; }
}; };
#endif // C3D_RENDER_OGL_LEGACY_H_ #endif // C3D_RENDER_OGL_LEGACY_H_

View File

@ -55,47 +55,48 @@
void C3D_RENDER_RAYTRACING::setupMaterials() void C3D_RENDER_RAYTRACING::setupMaterials()
{ {
double mmTo3Dunits = IU_PER_MM * m_boardAdapter.BiuTo3Dunits();
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) )
{ {
m_board_normal_perturbator = CBOARDNORMAL( 0.5f * IU_PER_MM * m_settings.BiuTo3Dunits() ); m_board_normal_perturbator = CBOARDNORMAL( 0.5f * mmTo3Dunits );
m_copper_normal_perturbator = CCOPPERNORMAL( 4.0f * IU_PER_MM * m_settings.BiuTo3Dunits(), m_copper_normal_perturbator = CCOPPERNORMAL( 4.0f * mmTo3Dunits,
&m_board_normal_perturbator ); &m_board_normal_perturbator );
m_solder_mask_normal_perturbator = CSOLDERMASKNORMAL( &m_board_normal_perturbator ); m_solder_mask_normal_perturbator = CSOLDERMASKNORMAL( &m_board_normal_perturbator );
m_plastic_normal_perturbator = CPLASTICNORMAL( 0.15f * IU_PER_MM * m_settings.BiuTo3Dunits() ); m_plastic_normal_perturbator = CPLASTICNORMAL( 0.15f * mmTo3Dunits );
m_plastic_shine_normal_perturbator = CPLASTICSHINENORMAL( 1.0f * IU_PER_MM * m_settings.BiuTo3Dunits() ); m_plastic_shine_normal_perturbator = CPLASTICSHINENORMAL( 1.0f * mmTo3Dunits );
m_brushed_metal_normal_perturbator = CMETALBRUSHEDNORMAL( 1.0f * IU_PER_MM * m_settings.BiuTo3Dunits() ); m_brushed_metal_normal_perturbator = CMETALBRUSHEDNORMAL( 1.0f * mmTo3Dunits );
} }
// http://devernay.free.fr/cours/opengl/materials.html // http://devernay.free.fr/cours/opengl/materials.html
// Copper // Copper
m_materials.m_Copper = CBLINN_PHONG_MATERIAL( m_materials.m_Copper = CBLINN_PHONG_MATERIAL(
ConvertSRGBToLinear( (SFVEC3F)m_settings.m_CopperColor ) * ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_CopperColor ) *
(SFVEC3F)(0.18f), // ambient (SFVEC3F)(0.18f), // ambient
SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive
glm::clamp( ((SFVEC3F)(1.0f) - glm::clamp( ((SFVEC3F)(1.0f) -
ConvertSRGBToLinear( (SFVEC3F)m_settings.m_CopperColor ) ), ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_CopperColor ) ),
SFVEC3F( 0.0f ), SFVEC3F( 0.0f ),
SFVEC3F( 0.35f ) ), // specular SFVEC3F( 0.35f ) ), // specular
0.4f * 128.0f, // shiness 0.4f * 128.0f, // shiness
0.0f, // transparency 0.0f, // transparency
0.0f ); 0.0f );
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) )
m_materials.m_Copper.SetNormalPerturbator( &m_copper_normal_perturbator ); m_materials.m_Copper.SetNormalPerturbator( &m_copper_normal_perturbator );
m_materials.m_Paste = CBLINN_PHONG_MATERIAL( m_materials.m_Paste = CBLINN_PHONG_MATERIAL(
ConvertSRGBToLinear( (SFVEC3F)m_settings.m_SolderPasteColor ) * ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_SolderPasteColor ) *
ConvertSRGBToLinear( (SFVEC3F)m_settings.m_SolderPasteColor ), // ambient ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_SolderPasteColor ), // ambient
SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive
ConvertSRGBToLinear( (SFVEC3F)m_settings.m_SolderPasteColor ) * ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_SolderPasteColor ) *
ConvertSRGBToLinear( (SFVEC3F)m_settings.m_SolderPasteColor ), // specular ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_SolderPasteColor ), // specular
0.10f * 128.0f, // shiness 0.10f * 128.0f, // shiness
0.0f, // transparency 0.0f, // transparency
0.0f ); 0.0f );
@ -104,7 +105,7 @@ void C3D_RENDER_RAYTRACING::setupMaterials()
SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive
glm::clamp( glm::clamp(
( ( SFVEC3F )( 1.0f ) ( ( SFVEC3F )( 1.0f )
- ConvertSRGBToLinear( (SFVEC3F) m_settings.m_SilkScreenColorTop ) ), - ConvertSRGBToLinear( (SFVEC3F) m_boardAdapter.m_SilkScreenColorTop ) ),
SFVEC3F( 0.0f ), SFVEC3F( 0.0f ),
SFVEC3F( 0.10f ) ), // specular SFVEC3F( 0.10f ) ), // specular
0.078125f * 128.0f, // shiness 0.078125f * 128.0f, // shiness
@ -112,18 +113,18 @@ void C3D_RENDER_RAYTRACING::setupMaterials()
0.0f ); 0.0f );
const float solderMaskTop_gray = const float solderMaskTop_gray =
( m_settings.m_SolderMaskColorTop.r + m_settings.m_SolderMaskColorTop.g ( m_boardAdapter.m_SolderMaskColorTop.r + m_boardAdapter.m_SolderMaskColorTop.g
+ m_settings.m_SolderMaskColorTop.b ) + m_boardAdapter.m_SolderMaskColorTop.b )
/ 3.0f; / 3.0f;
const float solderMaskTop_transparency = solderMaskTop_gray * 0.40f + 0.005f; const float solderMaskTop_transparency = solderMaskTop_gray * 0.40f + 0.005f;
m_materials.m_SolderMask = CBLINN_PHONG_MATERIAL( m_materials.m_SolderMask = CBLINN_PHONG_MATERIAL(
ConvertSRGBToLinear( (SFVEC3F) m_settings.m_SolderMaskColorTop ) * 0.10f, // ambient ConvertSRGBToLinear( (SFVEC3F) m_boardAdapter.m_SolderMaskColorTop ) * 0.10f, // ambient
SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive
glm::clamp( glm::clamp(
( ( SFVEC3F )( 1.0f ) ( ( SFVEC3F )( 1.0f )
- ConvertSRGBToLinear( (SFVEC3F) m_settings.m_SolderMaskColorTop ) ), - ConvertSRGBToLinear( (SFVEC3F) m_boardAdapter.m_SolderMaskColorTop ) ),
SFVEC3F( 0.0f ), SFVEC3F( 0.0f ),
SFVEC3F( solderMaskTop_gray * 2.0f ) ), // specular SFVEC3F( solderMaskTop_gray * 2.0f ) ), // specular
0.85f * 128.0f, // shiness 0.85f * 128.0f, // shiness
@ -131,18 +132,18 @@ void C3D_RENDER_RAYTRACING::setupMaterials()
0.16f ); // reflection 0.16f ); // reflection
const float solderMaskBot_gray = const float solderMaskBot_gray =
( m_settings.m_SolderMaskColorBot.r + m_settings.m_SolderMaskColorBot.g ( m_boardAdapter.m_SolderMaskColorBot.r + m_boardAdapter.m_SolderMaskColorBot.g
+ m_settings.m_SolderMaskColorBot.b ) + m_boardAdapter.m_SolderMaskColorBot.b )
/ 3.0f; / 3.0f;
const float solderMaskBot_transparency = solderMaskBot_gray * 0.40f + 0.005f; const float solderMaskBot_transparency = solderMaskBot_gray * 0.40f + 0.005f;
m_materials.m_SolderMask = CBLINN_PHONG_MATERIAL( m_materials.m_SolderMask = CBLINN_PHONG_MATERIAL(
ConvertSRGBToLinear( (SFVEC3F) m_settings.m_SolderMaskColorBot ) * 0.10f, // ambient ConvertSRGBToLinear( (SFVEC3F) m_boardAdapter.m_SolderMaskColorBot ) * 0.10f, // ambient
SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive SFVEC3F( 0.0f, 0.0f, 0.0f ), // emissive
glm::clamp( glm::clamp(
( ( SFVEC3F )( 1.0f ) ( ( SFVEC3F )( 1.0f )
- ConvertSRGBToLinear( (SFVEC3F) m_settings.m_SolderMaskColorBot ) ), - ConvertSRGBToLinear( (SFVEC3F) m_boardAdapter.m_SolderMaskColorBot ) ),
SFVEC3F( 0.0f ), SFVEC3F( 0.0f ),
SFVEC3F( solderMaskBot_gray * 2.0f ) ), // specular SFVEC3F( solderMaskBot_gray * 2.0f ) ), // specular
0.85f * 128.0f, // shiness 0.85f * 128.0f, // shiness
@ -153,7 +154,7 @@ void C3D_RENDER_RAYTRACING::setupMaterials()
m_materials.m_SolderMask.SetNrRefractionsSamples( 1 ); m_materials.m_SolderMask.SetNrRefractionsSamples( 1 );
m_materials.m_SolderMask.SetNrReflectionsSamples( 2 ); m_materials.m_SolderMask.SetNrReflectionsSamples( 2 );
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) )
m_materials.m_SolderMask.SetNormalPerturbator( &m_solder_mask_normal_perturbator ); m_materials.m_SolderMask.SetNormalPerturbator( &m_solder_mask_normal_perturbator );
m_materials.m_EpoxyBoard = CBLINN_PHONG_MATERIAL( m_materials.m_EpoxyBoard = CBLINN_PHONG_MATERIAL(
@ -171,11 +172,11 @@ void C3D_RENDER_RAYTRACING::setupMaterials()
m_materials.m_EpoxyBoard.SetAbsorvance( 10.0f ); m_materials.m_EpoxyBoard.SetAbsorvance( 10.0f );
m_materials.m_EpoxyBoard.SetNrRefractionsSamples( 3 ); m_materials.m_EpoxyBoard.SetNrRefractionsSamples( 3 );
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) )
m_materials.m_EpoxyBoard.SetNormalPerturbator( &m_board_normal_perturbator ); m_materials.m_EpoxyBoard.SetNormalPerturbator( &m_board_normal_perturbator );
SFVEC3F bgTop = ConvertSRGBToLinear( (SFVEC3F)m_settings.m_BgColorTop ); SFVEC3F bgTop = ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_BgColorTop );
//SFVEC3F bgBot = (SFVEC3F)m_settings.m_BgColorBot; //SFVEC3F bgBot = (SFVEC3F)m_boardAdapter.m_BgColorBot;
m_materials.m_Floor = CBLINN_PHONG_MATERIAL( m_materials.m_Floor = CBLINN_PHONG_MATERIAL(
bgTop * 0.125f, // ambient bgTop * 0.125f, // ambient
@ -270,15 +271,15 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
unsigned stats_startReloadTime = GetRunningMicroSecs(); unsigned stats_startReloadTime = GetRunningMicroSecs();
m_settings.InitSettings( aStatusTextReporter, aWarningTextReporter ); m_boardAdapter.InitSettings( aStatusTextReporter, aWarningTextReporter );
#ifdef PRINT_STATISTICS_3D_VIEWER #ifdef PRINT_STATISTICS_3D_VIEWER
unsigned stats_endReloadTime = GetRunningMicroSecs(); unsigned stats_endReloadTime = GetRunningMicroSecs();
unsigned stats_startConvertTime = GetRunningMicroSecs(); unsigned stats_startConvertTime = GetRunningMicroSecs();
#endif #endif
SFVEC3F camera_pos = m_settings.GetBoardCenter3DU(); SFVEC3F camera_pos = m_boardAdapter.GetBoardCenter3DU();
m_settings.CameraGet().SetBoardLookAtPos( camera_pos ); m_camera.SetBoardLookAtPos( camera_pos );
m_object_container.Clear(); m_object_container.Clear();
m_containerWithObjectsToDelete.Clear(); m_containerWithObjectsToDelete.Clear();
@ -295,19 +296,19 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
m_outlineBoard2dObjects = new CCONTAINER2D; m_outlineBoard2dObjects = new CCONTAINER2D;
const int outlineCount = m_settings.GetBoardPoly().OutlineCount(); const int outlineCount = m_boardAdapter.GetBoardPoly().OutlineCount();
if( outlineCount > 0 ) if( outlineCount > 0 )
{ {
float divFactor = 0.0f; float divFactor = 0.0f;
if( m_settings.GetStats_Nr_Vias() ) if( m_boardAdapter.GetStats_Nr_Vias() )
divFactor = m_settings.GetStats_Med_Via_Hole_Diameter3DU() * 18.0f; divFactor = m_boardAdapter.GetStats_Med_Via_Hole_Diameter3DU() * 18.0f;
else else
if( m_settings.GetStats_Nr_Holes() ) if( m_boardAdapter.GetStats_Nr_Holes() )
divFactor = m_settings.GetStats_Med_Hole_Diameter3DU() * 8.0f; divFactor = m_boardAdapter.GetStats_Med_Hole_Diameter3DU() * 8.0f;
SHAPE_POLY_SET boardPolyCopy = m_settings.GetBoardPoly(); SHAPE_POLY_SET boardPolyCopy = m_boardAdapter.GetBoardPoly();
boardPolyCopy.Fracture( SHAPE_POLY_SET::PM_FAST ); boardPolyCopy.Fracture( SHAPE_POLY_SET::PM_FAST );
for( int iOutlinePolyIdx = 0; iOutlinePolyIdx < outlineCount; iOutlinePolyIdx++ ) for( int iOutlinePolyIdx = 0; iOutlinePolyIdx < outlineCount; iOutlinePolyIdx++ )
@ -315,13 +316,13 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
Convert_path_polygon_to_polygon_blocks_and_dummy_blocks( Convert_path_polygon_to_polygon_blocks_and_dummy_blocks(
boardPolyCopy, boardPolyCopy,
*m_outlineBoard2dObjects, *m_outlineBoard2dObjects,
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
divFactor, divFactor,
*dynamic_cast<const BOARD_ITEM*>( m_settings.GetBoard() ), *dynamic_cast<const BOARD_ITEM*>( m_boardAdapter.GetBoard() ),
iOutlinePolyIdx ); iOutlinePolyIdx );
} }
if( m_settings.GetFlag( FL_SHOW_BOARD_BODY ) ) if( m_boardAdapter.GetFlag( FL_SHOW_BOARD_BODY ) )
{ {
const LIST_OBJECT2D &listObjects = m_outlineBoard2dObjects->GetList(); const LIST_OBJECT2D &listObjects = m_outlineBoard2dObjects->GetList();
@ -334,11 +335,11 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
std::vector<const COBJECT2D *> *object2d_B = new std::vector<const COBJECT2D *>(); std::vector<const COBJECT2D *> *object2d_B = new std::vector<const COBJECT2D *>();
// Check if there are any THT that intersects this outline object part // Check if there are any THT that intersects this outline object part
if( !m_settings.GetThroughHole_Outer().GetList().empty() ) if( !m_boardAdapter.GetThroughHole_Outer().GetList().empty() )
{ {
CONST_LIST_OBJECT2D intersectionList; CONST_LIST_OBJECT2D intersectionList;
m_settings.GetThroughHole_Outer().GetListObjectsIntersects( m_boardAdapter.GetThroughHole_Outer().GetListObjectsIntersects(
object2d_A->GetBBox(), object2d_A->GetBBox(),
intersectionList ); intersectionList );
@ -367,17 +368,17 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
{ {
#if 0 #if 0
create_3d_object_from( m_object_container, object2d_A, create_3d_object_from( m_object_container, object2d_A,
m_settings.GetLayerBottomZpos3DU( F_Cu ), m_boardAdapter.GetLayerBottomZpos3DU( F_Cu ),
m_settings.GetLayerBottomZpos3DU( B_Cu ), m_boardAdapter.GetLayerBottomZpos3DU( B_Cu ),
&m_materials.m_EpoxyBoard, &m_materials.m_EpoxyBoard,
g_epoxyColor ); g_epoxyColor );
#else #else
CLAYERITEM *objPtr = new CLAYERITEM( object2d_A, CLAYERITEM *objPtr = new CLAYERITEM( object2d_A,
m_settings.GetLayerBottomZpos3DU( F_Cu ), m_boardAdapter.GetLayerBottomZpos3DU( F_Cu ),
m_settings.GetLayerBottomZpos3DU( B_Cu ) ); m_boardAdapter.GetLayerBottomZpos3DU( B_Cu ) );
objPtr->SetMaterial( &m_materials.m_EpoxyBoard ); objPtr->SetMaterial( &m_materials.m_EpoxyBoard );
objPtr->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_settings.m_BoardBodyColor ) ); objPtr->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_BoardBodyColor ) );
m_object_container.Add( objPtr ); m_object_container.Add( objPtr );
#endif #endif
} }
@ -387,16 +388,16 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
object2d_A, object2d_A,
object2d_B, object2d_B,
CSGITEM_FULL, CSGITEM_FULL,
(const BOARD_ITEM &)*m_settings.GetBoard() ); (const BOARD_ITEM &)*m_boardAdapter.GetBoard() );
m_containerWithObjectsToDelete.Add( itemCSG2d ); m_containerWithObjectsToDelete.Add( itemCSG2d );
CLAYERITEM *objPtr = new CLAYERITEM( itemCSG2d, CLAYERITEM *objPtr = new CLAYERITEM( itemCSG2d,
m_settings.GetLayerBottomZpos3DU( F_Cu ), m_boardAdapter.GetLayerBottomZpos3DU( F_Cu ),
m_settings.GetLayerBottomZpos3DU( B_Cu ) ); m_boardAdapter.GetLayerBottomZpos3DU( B_Cu ) );
objPtr->SetMaterial( &m_materials.m_EpoxyBoard ); objPtr->SetMaterial( &m_materials.m_EpoxyBoard );
objPtr->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_settings.m_BoardBodyColor ) ); objPtr->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_BoardBodyColor ) );
m_object_container.Add( objPtr ); m_object_container.Add( objPtr );
} }
} }
@ -408,9 +409,9 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
// So this will add a full hole. // So this will add a full hole.
// In fact, that is not need if the hole have copper. // In fact, that is not need if the hole have copper.
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
if( !m_settings.GetThroughHole_Outer().GetList().empty() ) if( !m_boardAdapter.GetThroughHole_Outer().GetList().empty() )
{ {
const LIST_OBJECT2D &holeList = m_settings.GetThroughHole_Outer().GetList(); const LIST_OBJECT2D &holeList = m_boardAdapter.GetThroughHole_Outer().GetList();
for( LIST_OBJECT2D::const_iterator hole = holeList.begin(); for( LIST_OBJECT2D::const_iterator hole = holeList.begin();
hole != holeList.end(); hole != holeList.end();
@ -426,12 +427,12 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
CVCYLINDER *objPtr = new CVCYLINDER( CVCYLINDER *objPtr = new CVCYLINDER(
hole2d->GetCentroid(), hole2d->GetCentroid(),
NextFloatDown( m_settings.GetLayerBottomZpos3DU( F_Cu ) ), NextFloatDown( m_boardAdapter.GetLayerBottomZpos3DU( F_Cu ) ),
NextFloatUp( m_settings.GetLayerBottomZpos3DU( B_Cu ) ), NextFloatUp( m_boardAdapter.GetLayerBottomZpos3DU( B_Cu ) ),
radius ); radius );
objPtr->SetMaterial( &m_materials.m_EpoxyBoard ); objPtr->SetMaterial( &m_materials.m_EpoxyBoard );
objPtr->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_settings.m_BoardBodyColor ) ); objPtr->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_BoardBodyColor ) );
m_object_container.Add( objPtr ); m_object_container.Add( objPtr );
} }
@ -453,8 +454,8 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
printf("Add layers maps...\n"); printf("Add layers maps...\n");
#endif #endif
for( MAP_CONTAINER_2D::const_iterator ii = m_settings.GetMapLayers().begin(); for( MAP_CONTAINER_2D::const_iterator ii = m_boardAdapter.GetMapLayers().begin();
ii != m_settings.GetMapLayers().end(); ii != m_boardAdapter.GetMapLayers().end();
++ii ) ++ii )
{ {
PCB_LAYER_ID layer_id = static_cast<PCB_LAYER_ID>(ii->first); PCB_LAYER_ID layer_id = static_cast<PCB_LAYER_ID>(ii->first);
@ -476,27 +477,27 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
case F_Paste: case F_Paste:
materialLayer = &m_materials.m_Paste; materialLayer = &m_materials.m_Paste;
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
layerColor = m_settings.m_SolderPasteColor; layerColor = m_boardAdapter.m_SolderPasteColor;
else else
layerColor = m_settings.GetLayerColor( layer_id ); layerColor = m_boardAdapter.GetLayerColor( layer_id );
break; break;
case B_SilkS: case B_SilkS:
materialLayer = &m_materials.m_SilkS; materialLayer = &m_materials.m_SilkS;
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
layerColor = m_settings.m_SilkScreenColorBot; layerColor = m_boardAdapter.m_SilkScreenColorBot;
else else
layerColor = m_settings.GetLayerColor( layer_id ); layerColor = m_boardAdapter.GetLayerColor( layer_id );
break; break;
case F_SilkS: case F_SilkS:
materialLayer = &m_materials.m_SilkS; materialLayer = &m_materials.m_SilkS;
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
layerColor = m_settings.m_SilkScreenColorTop; layerColor = m_boardAdapter.m_SilkScreenColorTop;
else else
layerColor = m_settings.GetLayerColor( layer_id ); layerColor = m_boardAdapter.GetLayerColor( layer_id );
break; break;
case Dwgs_User: case Dwgs_User:
@ -518,10 +519,10 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
default: default:
materialLayer = &m_materials.m_Copper; materialLayer = &m_materials.m_Copper;
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
layerColor = m_settings.m_CopperColor; layerColor = m_boardAdapter.m_CopperColor;
else else
layerColor = m_settings.GetLayerColor( layer_id ); layerColor = m_boardAdapter.GetLayerColor( layer_id );
break; break;
} }
@ -548,7 +549,7 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
// Check if there are any layerhole that intersects this object // Check if there are any layerhole that intersects this object
// Eg: a segment is cutted by a via hole or THT hole. // Eg: a segment is cutted by a via hole or THT hole.
// ///////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////
const MAP_CONTAINER_2D &layerHolesMap = m_settings.GetMapLayersHoles(); const MAP_CONTAINER_2D &layerHolesMap = m_boardAdapter.GetMapLayersHoles();
if( layerHolesMap.find(layer_id) != layerHolesMap.end() ) if( layerHolesMap.find(layer_id) != layerHolesMap.end() )
{ {
@ -579,11 +580,11 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
// Check if there are any THT that intersects this object // Check if there are any THT that intersects this object
// ///////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////
if( !m_settings.GetThroughHole_Outer().GetList().empty() ) if( !m_boardAdapter.GetThroughHole_Outer().GetList().empty() )
{ {
CONST_LIST_OBJECT2D intersectionList; CONST_LIST_OBJECT2D intersectionList;
m_settings.GetThroughHole_Outer().GetListObjectsIntersects( m_boardAdapter.GetThroughHole_Outer().GetListObjectsIntersects(
object2d_A->GetBBox(), object2d_A->GetBBox(),
intersectionList ); intersectionList );
@ -604,9 +605,9 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
} }
const MAP_CONTAINER_2D& mapLayers = m_settings.GetMapLayers(); const MAP_CONTAINER_2D& mapLayers = m_boardAdapter.GetMapLayers();
if( m_settings.GetFlag( FL_SUBTRACT_MASK_FROM_SILK ) && if( m_boardAdapter.GetFlag( FL_SUBTRACT_MASK_FROM_SILK ) &&
( ( ( layer_id == B_SilkS ) && ( ( ( layer_id == B_SilkS ) &&
( mapLayers.find( B_Mask ) != mapLayers.end() ) ) || ( mapLayers.find( B_Mask ) != mapLayers.end() ) ) ||
( ( layer_id == F_SilkS ) && ( ( layer_id == F_SilkS ) &&
@ -647,14 +648,14 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
#if 0 #if 0
create_3d_object_from( m_object_container, create_3d_object_from( m_object_container,
object2d_A, object2d_A,
m_settings.GetLayerBottomZpos3DU( layer_id ), m_boardAdapter.GetLayerBottomZpos3DU( layer_id ),
m_settings.GetLayerTopZpos3DU( layer_id ), m_boardAdapter.GetLayerTopZpos3DU( layer_id ),
materialLayer, materialLayer,
layerColor ); layerColor );
#else #else
CLAYERITEM *objPtr = new CLAYERITEM( object2d_A, CLAYERITEM *objPtr = new CLAYERITEM( object2d_A,
m_settings.GetLayerBottomZpos3DU( layer_id ), m_boardAdapter.GetLayerBottomZpos3DU( layer_id ),
m_settings.GetLayerTopZpos3DU( layer_id ) ); m_boardAdapter.GetLayerTopZpos3DU( layer_id ) );
objPtr->SetMaterial( materialLayer ); objPtr->SetMaterial( materialLayer );
objPtr->SetColor( ConvertSRGBToLinear( layerColor ) ); objPtr->SetColor( ConvertSRGBToLinear( layerColor ) );
m_object_container.Add( objPtr ); m_object_container.Add( objPtr );
@ -670,8 +671,8 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
m_containerWithObjectsToDelete.Add( itemCSG2d ); m_containerWithObjectsToDelete.Add( itemCSG2d );
CLAYERITEM *objPtr = new CLAYERITEM( itemCSG2d, CLAYERITEM *objPtr = new CLAYERITEM( itemCSG2d,
m_settings.GetLayerBottomZpos3DU( layer_id ), m_boardAdapter.GetLayerBottomZpos3DU( layer_id ),
m_settings.GetLayerTopZpos3DU( layer_id ) ); m_boardAdapter.GetLayerTopZpos3DU( layer_id ) );
objPtr->SetMaterial( materialLayer ); objPtr->SetMaterial( materialLayer );
objPtr->SetColor( ConvertSRGBToLinear( layerColor ) ); objPtr->SetColor( ConvertSRGBToLinear( layerColor ) );
@ -690,13 +691,13 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
// We will check for all objects in the outline if it intersects any object // We will check for all objects in the outline if it intersects any object
// in the layer container and also any hole. // in the layer container and also any hole.
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
if( m_settings.GetFlag( FL_SOLDERMASK ) && if( m_boardAdapter.GetFlag( FL_SOLDERMASK ) &&
(m_outlineBoard2dObjects->GetList().size() >= 1) ) (m_outlineBoard2dObjects->GetList().size() >= 1) )
{ {
CMATERIAL *materialLayer = &m_materials.m_SolderMask; CMATERIAL *materialLayer = &m_materials.m_SolderMask;
for( MAP_CONTAINER_2D::const_iterator ii = m_settings.GetMapLayers().begin(); for( MAP_CONTAINER_2D::const_iterator ii = m_boardAdapter.GetMapLayers().begin();
ii != m_settings.GetMapLayers().end(); ii != m_boardAdapter.GetMapLayers().end();
++ii ) ++ii )
{ {
PCB_LAYER_ID layer_id = static_cast<PCB_LAYER_ID>(ii->first); PCB_LAYER_ID layer_id = static_cast<PCB_LAYER_ID>(ii->first);
@ -709,18 +710,18 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
continue; continue;
SFVEC3F layerColor; SFVEC3F layerColor;
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
{ {
if( layer_id == B_Mask ) if( layer_id == B_Mask )
layerColor = m_settings.m_SolderMaskColorBot; layerColor = m_boardAdapter.m_SolderMaskColorBot;
else else
layerColor = m_settings.m_SolderMaskColorTop; layerColor = m_boardAdapter.m_SolderMaskColorTop;
} }
else else
layerColor = m_settings.GetLayerColor( layer_id ); layerColor = m_boardAdapter.GetLayerColor( layer_id );
const float zLayerMin = m_settings.GetLayerBottomZpos3DU( layer_id ); const float zLayerMin = m_boardAdapter.GetLayerBottomZpos3DU( layer_id );
const float zLayerMax = m_settings.GetLayerTopZpos3DU( layer_id ); const float zLayerMax = m_boardAdapter.GetLayerTopZpos3DU( layer_id );
// Get the outline board objects // Get the outline board objects
const LIST_OBJECT2D &listObjects = m_outlineBoard2dObjects->GetList(); const LIST_OBJECT2D &listObjects = m_outlineBoard2dObjects->GetList();
@ -734,12 +735,12 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
std::vector<const COBJECT2D *> *object2d_B = new std::vector<const COBJECT2D *>(); std::vector<const COBJECT2D *> *object2d_B = new std::vector<const COBJECT2D *>();
// Check if there are any THT that intersects this outline object part // Check if there are any THT that intersects this outline object part
if( !m_settings.GetThroughHole_Outer().GetList().empty() ) if( !m_boardAdapter.GetThroughHole_Outer().GetList().empty() )
{ {
CONST_LIST_OBJECT2D intersectionList; CONST_LIST_OBJECT2D intersectionList;
m_settings.GetThroughHole_Outer().GetListObjectsIntersects( m_boardAdapter.GetThroughHole_Outer().GetListObjectsIntersects(
object2d_A->GetBBox(), object2d_A->GetBBox(),
intersectionList ); intersectionList );
@ -846,9 +847,9 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
// Add floor // Add floor
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_BACKFLOOR ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_BACKFLOOR ) )
{ {
CBBOX boardBBox = m_settings.GetBBox3DU(); CBBOX boardBBox = m_boardAdapter.GetBBox3DU();
if( boardBBox.IsInitialized() ) if( boardBBox.IsInitialized() )
{ {
@ -891,8 +892,8 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
newTriangle1->SetMaterial( (const CMATERIAL *)&m_materials.m_Floor ); newTriangle1->SetMaterial( (const CMATERIAL *)&m_materials.m_Floor );
newTriangle2->SetMaterial( (const CMATERIAL *)&m_materials.m_Floor ); newTriangle2->SetMaterial( (const CMATERIAL *)&m_materials.m_Floor );
newTriangle1->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_settings.m_BgColorTop ) ); newTriangle1->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_BgColorTop ) );
newTriangle2->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_settings.m_BgColorTop ) ); newTriangle2->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_BgColorTop ) );
} }
} }
} }
@ -915,7 +916,7 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusTextReporter, REPORTER* aWa
// Option 1 - using Point Lights // Option 1 - using Point Lights
const SFVEC3F &boarCenter = m_settings.GetBBox3DU().GetCenter(); const SFVEC3F &boarCenter = m_boardAdapter.GetBBox3DU().GetCenter();
m_lights.Add( new CPOINTLIGHT( SFVEC3F( boarCenter.x, boarCenter.y, +RANGE_SCALE_3D * 2.0f ), m_lights.Add( new CPOINTLIGHT( SFVEC3F( boarCenter.x, boarCenter.y, +RANGE_SCALE_3D * 2.0f ),
SFVEC3F( light_top_bottom ) ) ); SFVEC3F( light_top_bottom ) ) );
@ -1035,19 +1036,19 @@ void C3D_RENDER_RAYTRACING::insert3DViaHole( const VIA* aVia )
aVia->LayerPair( &top_layer, &bottom_layer ); aVia->LayerPair( &top_layer, &bottom_layer );
float topZ = m_settings.GetLayerBottomZpos3DU( top_layer ) + float topZ = m_boardAdapter.GetLayerBottomZpos3DU( top_layer ) +
m_settings.GetCopperThickness3DU(); m_boardAdapter.GetCopperThickness3DU();
float botZ = m_settings.GetLayerBottomZpos3DU( bottom_layer ) - float botZ = m_boardAdapter.GetLayerBottomZpos3DU( bottom_layer ) -
m_settings.GetCopperThickness3DU(); m_boardAdapter.GetCopperThickness3DU();
const SFVEC2F center = SFVEC2F( aVia->GetStart().x * m_settings.BiuTo3Dunits(), const SFVEC2F center = SFVEC2F( aVia->GetStart().x * m_boardAdapter.BiuTo3Dunits(),
-aVia->GetStart().y * m_settings.BiuTo3Dunits() ); -aVia->GetStart().y * m_boardAdapter.BiuTo3Dunits() );
CRING2D *ring = new CRING2D( center, CRING2D *ring = new CRING2D( center,
radiusBUI * m_settings.BiuTo3Dunits(), radiusBUI * m_boardAdapter.BiuTo3Dunits(),
( radiusBUI + m_settings.GetCopperThicknessBIU() ) * ( radiusBUI + m_boardAdapter.GetCopperThicknessBIU() ) *
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
*aVia ); *aVia );
m_containerWithObjectsToDelete.Add( ring ); m_containerWithObjectsToDelete.Add( ring );
@ -1057,11 +1058,11 @@ void C3D_RENDER_RAYTRACING::insert3DViaHole( const VIA* aVia )
objPtr->SetMaterial( &m_materials.m_Copper ); objPtr->SetMaterial( &m_materials.m_Copper );
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
objPtr->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_settings.m_CopperColor ) ); objPtr->SetColor( ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_CopperColor ) );
else else
objPtr->SetColor( ConvertSRGBToLinear( objPtr->SetColor( ConvertSRGBToLinear(
m_settings.GetItemColor( LAYER_VIAS + static_cast<int>( aVia->GetViaType() ) ) ) ); m_boardAdapter.GetItemColor( LAYER_VIAS + static_cast<int>( aVia->GetViaType() ) ) ) );
m_object_container.Add( objPtr ); m_object_container.Add( objPtr );
} }
@ -1075,10 +1076,10 @@ void C3D_RENDER_RAYTRACING::insert3DPadHole( const D_PAD* aPad )
SFVEC3F objColor; SFVEC3F objColor;
if( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) ) if( m_boardAdapter.GetFlag( FL_USE_REALISTIC_MODE ) )
objColor = (SFVEC3F)m_settings.m_CopperColor; objColor = (SFVEC3F)m_boardAdapter.m_CopperColor;
else else
objColor = m_settings.GetItemColor( LAYER_PADS_TH ); objColor = m_boardAdapter.GetItemColor( LAYER_PADS_TH );
const wxSize drillsize = aPad->GetDrillSize(); const wxSize drillsize = aPad->GetDrillSize();
const bool hasHole = drillsize.x && drillsize.y; const bool hasHole = drillsize.x && drillsize.y;
@ -1086,22 +1087,22 @@ void C3D_RENDER_RAYTRACING::insert3DPadHole( const D_PAD* aPad )
if( !hasHole ) if( !hasHole )
return; return;
const float topZ = m_settings.GetLayerBottomZpos3DU( F_Cu ) + const float topZ = m_boardAdapter.GetLayerBottomZpos3DU( F_Cu ) +
m_settings.GetCopperThickness3DU(); m_boardAdapter.GetCopperThickness3DU();
const float botZ = m_settings.GetLayerBottomZpos3DU( B_Cu ) - const float botZ = m_boardAdapter.GetLayerBottomZpos3DU( B_Cu ) -
m_settings.GetCopperThickness3DU(); m_boardAdapter.GetCopperThickness3DU();
if( drillsize.x == drillsize.y ) // usual round hole if( drillsize.x == drillsize.y ) // usual round hole
{ {
SFVEC2F center = SFVEC2F( aPad->GetPosition().x * m_settings.BiuTo3Dunits(), SFVEC2F center = SFVEC2F( aPad->GetPosition().x * m_boardAdapter.BiuTo3Dunits(),
-aPad->GetPosition().y * m_settings.BiuTo3Dunits() ); -aPad->GetPosition().y * m_boardAdapter.BiuTo3Dunits() );
CRING2D *ring = new CRING2D( center, CRING2D *ring = new CRING2D( center,
( drillsize.x / 2 ) * m_settings.BiuTo3Dunits(), ( drillsize.x / 2 ) * m_boardAdapter.BiuTo3Dunits(),
( ( drillsize.x / 2 ) + (( drillsize.x / 2 ) +
m_settings.GetCopperThicknessBIU() ) * m_boardAdapter.GetCopperThicknessBIU() ) *
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
*aPad ); *aPad );
m_containerWithObjectsToDelete.Add( ring ); m_containerWithObjectsToDelete.Add( ring );
@ -1130,20 +1131,20 @@ void C3D_RENDER_RAYTRACING::insert3DPadHole( const D_PAD* aPad )
wxPoint end = aPad->GetPosition() - ends_offset; wxPoint end = aPad->GetPosition() - ends_offset;
CROUNDSEGMENT2D *innerSeg = new CROUNDSEGMENT2D( CROUNDSEGMENT2D *innerSeg = new CROUNDSEGMENT2D(
SFVEC2F( start.x * m_settings.BiuTo3Dunits(), SFVEC2F( start.x * m_boardAdapter.BiuTo3Dunits(),
-start.y * m_settings.BiuTo3Dunits() ), -start.y * m_boardAdapter.BiuTo3Dunits() ),
SFVEC2F( end.x * m_settings.BiuTo3Dunits(), SFVEC2F( end.x * m_boardAdapter.BiuTo3Dunits(),
-end.y * m_settings.BiuTo3Dunits() ), -end.y * m_boardAdapter.BiuTo3Dunits() ),
width * m_settings.BiuTo3Dunits(), width * m_boardAdapter.BiuTo3Dunits(),
*aPad ); *aPad );
CROUNDSEGMENT2D *outerSeg = new CROUNDSEGMENT2D( CROUNDSEGMENT2D *outerSeg = new CROUNDSEGMENT2D(
SFVEC2F( start.x * m_settings.BiuTo3Dunits(), SFVEC2F( start.x * m_boardAdapter.BiuTo3Dunits(),
-start.y * m_settings.BiuTo3Dunits() ), -start.y * m_boardAdapter.BiuTo3Dunits() ),
SFVEC2F( end.x * m_settings.BiuTo3Dunits(), SFVEC2F( end.x * m_boardAdapter.BiuTo3Dunits(),
-end.y * m_settings.BiuTo3Dunits() ), -end.y * m_boardAdapter.BiuTo3Dunits() ),
( width + m_settings.GetCopperThicknessBIU() * 2 ) * ( width + m_boardAdapter.GetCopperThicknessBIU() * 2 ) *
m_settings.BiuTo3Dunits(), m_boardAdapter.BiuTo3Dunits(),
*aPad ); *aPad );
// NOTE: the round segment width is the "diameter", so we double the thickness // NOTE: the round segment width is the "diameter", so we double the thickness
@ -1170,11 +1171,11 @@ void C3D_RENDER_RAYTRACING::insert3DPadHole( const D_PAD* aPad )
// Check if there are any other THT that intersects this hole // Check if there are any other THT that intersects this hole
// It will use the non inflated holes // It will use the non inflated holes
if( !m_settings.GetThroughHole_Inner().GetList().empty() ) if( !m_boardAdapter.GetThroughHole_Inner().GetList().empty() )
{ {
CONST_LIST_OBJECT2D intersectionList; CONST_LIST_OBJECT2D intersectionList;
m_settings.GetThroughHole_Inner().GetListObjectsIntersects( object2d_A->GetBBox(), m_boardAdapter.GetThroughHole_Inner().GetListObjectsIntersects( object2d_A->GetBBox(),
intersectionList ); intersectionList );
if( !intersectionList.empty() ) if( !intersectionList.empty() )
@ -1232,7 +1233,7 @@ void C3D_RENDER_RAYTRACING::add_3D_vias_and_pads_to_container()
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Insert vias holes (vertical cylinders) // Insert vias holes (vertical cylinders)
for( auto track : m_settings.GetBoard()->Tracks() ) for( auto track : m_boardAdapter.GetBoard()->Tracks() )
{ {
if( track->Type() == PCB_VIA_T ) if( track->Type() == PCB_VIA_T )
{ {
@ -1242,7 +1243,7 @@ void C3D_RENDER_RAYTRACING::add_3D_vias_and_pads_to_container()
} }
// Insert pads holes (vertical cylinders) // Insert pads holes (vertical cylinders)
for( auto module : m_settings.GetBoard()->Modules() ) for( auto module : m_boardAdapter.GetBoard()->Modules() )
{ {
for( auto pad : module->Pads() ) for( auto pad : module->Pads() )
if( pad->GetAttribute () != PAD_ATTRIB_HOLE_NOT_PLATED ) if( pad->GetAttribute () != PAD_ATTRIB_HOLE_NOT_PLATED )
@ -1256,20 +1257,20 @@ void C3D_RENDER_RAYTRACING::add_3D_vias_and_pads_to_container()
void C3D_RENDER_RAYTRACING::load_3D_models() void C3D_RENDER_RAYTRACING::load_3D_models()
{ {
// Go for all modules // Go for all modules
for( auto module : m_settings.GetBoard()->Modules() ) for( auto module : m_boardAdapter.GetBoard()->Modules() )
{ {
if( (!module->Models().empty() ) && if((!module->Models().empty() ) &&
m_settings.ShouldModuleBeDisplayed( (MODULE_ATTR_T)module->GetAttributes() ) ) m_boardAdapter.ShouldModuleBeDisplayed((MODULE_ATTR_T)module->GetAttributes() ) )
{ {
double zpos = m_settings.GetModulesZcoord3DIU( module->IsFlipped() ); double zpos = m_boardAdapter.GetModulesZcoord3DIU( module->IsFlipped() );
wxPoint pos = module->GetPosition(); wxPoint pos = module->GetPosition();
glm::mat4 moduleMatrix = glm::mat4( 1.0f ); glm::mat4 moduleMatrix = glm::mat4( 1.0f );
moduleMatrix = glm::translate( moduleMatrix, moduleMatrix = glm::translate( moduleMatrix,
SFVEC3F( pos.x * m_settings.BiuTo3Dunits(), SFVEC3F( pos.x * m_boardAdapter.BiuTo3Dunits(),
-pos.y * m_settings.BiuTo3Dunits(), -pos.y * m_boardAdapter.BiuTo3Dunits(),
zpos ) ); zpos ) );
if( module->GetOrientation() ) if( module->GetOrientation() )
@ -1292,7 +1293,7 @@ void C3D_RENDER_RAYTRACING::load_3D_models()
SFVEC3F( 0.0f, 0.0f, 1.0f ) ); SFVEC3F( 0.0f, 0.0f, 1.0f ) );
} }
const double modelunit_to_3d_units_factor = m_settings.BiuTo3Dunits() * const double modelunit_to_3d_units_factor = m_boardAdapter.BiuTo3Dunits() *
UNITS3D_TO_UNITSPCB; UNITS3D_TO_UNITSPCB;
moduleMatrix = glm::scale( moduleMatrix, moduleMatrix = glm::scale( moduleMatrix,
@ -1309,7 +1310,7 @@ void C3D_RENDER_RAYTRACING::load_3D_models()
{ {
// get it from cache // get it from cache
const S3DMODEL *modelPtr = const S3DMODEL *modelPtr =
m_settings.Get3DCacheManager()->GetModel( sM->m_Filename ); m_boardAdapter.Get3DCacheManager()->GetModel( sM->m_Filename );
// only add it if the return is not NULL // only add it if the return is not NULL
if( modelPtr ) if( modelPtr )
@ -1392,7 +1393,7 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
imat < a3DModel->m_MaterialsSize; imat < a3DModel->m_MaterialsSize;
++imat ) ++imat )
{ {
if( m_settings.MaterialModeGet() == MATERIAL_MODE::NORMAL ) if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::NORMAL )
{ {
const SMATERIAL &material = a3DModel->m_Materials[imat]; const SMATERIAL &material = a3DModel->m_Materials[imat];
@ -1412,7 +1413,7 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
SFVEC3F ambient; SFVEC3F ambient;
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
{ {
// apply a gain to the (dark) ambient colors // apply a gain to the (dark) ambient colors
@ -1440,7 +1441,7 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
material.m_Transparency, material.m_Transparency,
reflectionFactor ); reflectionFactor );
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) )
{ {
// Guess material type and apply a normal perturbator // Guess material type and apply a normal perturbator
@ -1571,14 +1572,14 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
const SFVEC3F diffuseColor = const SFVEC3F diffuseColor =
a3DModel->m_Materials[mesh.m_MaterialIdx].m_Diffuse; a3DModel->m_Materials[mesh.m_MaterialIdx].m_Diffuse;
if( m_settings.MaterialModeGet() == MATERIAL_MODE::CAD_MODE ) if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::CAD_MODE )
newTriangle->SetColor( ConvertSRGBToLinear( MaterialDiffuseToColorCAD( diffuseColor ) ) ); newTriangle->SetColor( ConvertSRGBToLinear( MaterialDiffuseToColorCAD( diffuseColor ) ) );
else else
newTriangle->SetColor( ConvertSRGBToLinear( diffuseColor ) ); newTriangle->SetColor( ConvertSRGBToLinear( diffuseColor ) );
} }
else else
{ {
if( m_settings.MaterialModeGet() == MATERIAL_MODE::CAD_MODE ) if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::CAD_MODE )
newTriangle->SetColor( ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx0] ) ), newTriangle->SetColor( ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx0] ) ),
ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx1] ) ), ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx1] ) ),
ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx2] ) ) ); ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx2] ) ) );

View File

@ -46,9 +46,9 @@
// convertLinearToSRGB // convertLinearToSRGB
//#include <glm/gtc/color_space.hpp> //#include <glm/gtc/color_space.hpp>
C3D_RENDER_RAYTRACING::C3D_RENDER_RAYTRACING( EDA_3D_SETTINGS &aSettings ) : C3D_RENDER_RAYTRACING::C3D_RENDER_RAYTRACING( BOARD_ADAPTER& aAdapter, CCAMERA& aCamera ) :
C3D_RENDER_BASE( aSettings ), C3D_RENDER_BASE( aAdapter, aCamera ),
m_postshader_ssao( aSettings.CameraGet() ) m_postshader_ssao( aCamera )
{ {
wxLogTrace( m_logTrace, wxT( "C3D_RENDER_RAYTRACING::C3D_RENDER_RAYTRACING" ) ); wxLogTrace( m_logTrace, wxT( "C3D_RENDER_RAYTRACING::C3D_RENDER_RAYTRACING" ) );
@ -213,7 +213,7 @@ bool C3D_RENDER_RAYTRACING::Redraw(
glDisable( GL_BLEND ); glDisable( GL_BLEND );
const bool was_camera_changed = m_settings.CameraGet().ParametersChanged(); const bool was_camera_changed = m_camera.ParametersChanged();
if( requestRedraw || aIsMoving || was_camera_changed ) if( requestRedraw || aIsMoving || was_camera_changed )
m_rt_render_state = RT_RENDER_STATE_MAX; // Set to an invalid state, m_rt_render_state = RT_RENDER_STATE_MAX; // Set to an invalid state,
@ -225,10 +225,10 @@ bool C3D_RENDER_RAYTRACING::Redraw(
{ {
// Set head light (camera view light) with the oposite direction of the camera // Set head light (camera view light) with the oposite direction of the camera
if( m_camera_light ) if( m_camera_light )
m_camera_light->SetDirection( -m_settings.CameraGet().GetDir() ); m_camera_light->SetDirection( -m_camera.GetDir() );
OGL_DrawBackground( SFVEC3F(m_settings.m_BgColorTop), OGL_DrawBackground( SFVEC3F( m_boardAdapter.m_BgColorTop),
SFVEC3F(m_settings.m_BgColorBot) ); SFVEC3F( m_boardAdapter.m_BgColorBot) );
// Bind PBO // Bind PBO
glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, m_pboId ); glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, m_pboId );
@ -274,8 +274,8 @@ bool C3D_RENDER_RAYTRACING::Redraw(
{ {
glClear( GL_COLOR_BUFFER_BIT ); glClear( GL_COLOR_BUFFER_BIT );
// Options if we want draw background instead // Options if we want draw background instead
//OGL_DrawBackground( SFVEC3F(m_settings.m_BgColorTop), //OGL_DrawBackground( SFVEC3F(m_boardAdapter.m_BgColorTop),
// SFVEC3F(m_settings.m_BgColorBot) ); // SFVEC3F(m_boardAdapter.m_BgColorBot) );
} }
glWindowPos2i( m_xoffset, m_yoffset ); glWindowPos2i( m_xoffset, m_yoffset );
@ -307,9 +307,9 @@ void C3D_RENDER_RAYTRACING::render( GLubyte *ptrPBO , REPORTER *aStatusTextRepor
restart_render_state(); restart_render_state();
if( m_camera_light ) if( m_camera_light )
m_camera_light->SetDirection( -m_settings.CameraGet().GetDir() ); m_camera_light->SetDirection( -m_camera.GetDir() );
if( m_settings.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY ) if( m_boardAdapter.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
{ {
// Set all pixels of PBO transparent (Alpha to 0) // Set all pixels of PBO transparent (Alpha to 0)
// This way it will draw the full buffer but only shows the updated ( // This way it will draw the full buffer but only shows the updated (
@ -325,8 +325,8 @@ void C3D_RENDER_RAYTRACING::render( GLubyte *ptrPBO , REPORTER *aStatusTextRepor
} }
} }
m_BgColorTop_LinearRGB = ConvertSRGBToLinear( (SFVEC3F)m_settings.m_BgColorTop ); m_BgColorTop_LinearRGB = ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_BgColorTop );
m_BgColorBot_LinearRGB = ConvertSRGBToLinear( (SFVEC3F)m_settings.m_BgColorBot ); m_BgColorBot_LinearRGB = ConvertSRGBToLinear( (SFVEC3F)m_boardAdapter.m_BgColorBot );
} }
switch( m_rt_render_state ) switch( m_rt_render_state )
@ -418,13 +418,11 @@ void C3D_RENDER_RAYTRACING::rt_render_tracing( GLubyte *ptrPBO ,
// or mark it as finished // or mark it as finished
if( m_nrBlocksRenderProgress >= m_blockPositions.size() ) if( m_nrBlocksRenderProgress >= m_blockPositions.size() )
{ {
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
m_rt_render_state = RT_RENDER_STATE_POST_PROCESS_SHADE; m_rt_render_state = RT_RENDER_STATE_POST_PROCESS_SHADE;
else else
{
m_rt_render_state = RT_RENDER_STATE_FINISH; m_rt_render_state = RT_RENDER_STATE_FINISH;
} }
}
} }
#ifdef USE_SRGB_SPACE #ifdef USE_SRGB_SPACE
@ -462,8 +460,7 @@ SFVEC3F ConvertSRGBToLinear( const SFVEC3F &aSRGBcolor )
#endif #endif
void C3D_RENDER_RAYTRACING::rt_final_color( GLubyte *ptrPBO, void C3D_RENDER_RAYTRACING::rt_final_color( GLubyte *ptrPBO, const SFVEC3F &rgbColor,
const SFVEC3F &rgbColor,
bool applyColorSpaceConversion ) bool applyColorSpaceConversion )
{ {
@ -535,7 +532,7 @@ void C3D_RENDER_RAYTRACING::rt_trace_AA_packet( const SFVEC3F *aBgColorY,
const RAY *aRayPck, const RAY *aRayPck,
SFVEC3F *aOutHitColor ) SFVEC3F *aOutHitColor )
{ {
const bool is_testShadow = m_settings.GetFlag( FL_RENDER_RAYTRACING_SHADOWS ); const bool is_testShadow = m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_SHADOWS );
for( unsigned int y = 0, i = 0; y < RAYPACKET_DIM; ++y ) for( unsigned int y = 0, i = 0; y < RAYPACKET_DIM; ++y )
{ {
@ -665,10 +662,9 @@ void C3D_RENDER_RAYTRACING::rt_render_trace_block( GLubyte *ptrPBO ,
const SFVEC2I blockPosI = SFVEC2I( blockPos.x + m_xoffset, const SFVEC2I blockPosI = SFVEC2I( blockPos.x + m_xoffset,
blockPos.y + m_yoffset ); blockPos.y + m_yoffset );
RAYPACKET blockPacket( m_settings.CameraGet(), RAYPACKET blockPacket( m_camera, (SFVEC2F)blockPosI + SFVEC2F(DISP_FACTOR, DISP_FACTOR),
(SFVEC2F)blockPosI + SFVEC2F(DISP_FACTOR, DISP_FACTOR), SFVEC2F(DISP_FACTOR, DISP_FACTOR) /* Displacement random factor */ );
SFVEC2F(DISP_FACTOR, DISP_FACTOR) // Displacement random factor
);
HITINFO_PACKET hitPacket_X0Y0[RAYPACKET_RAYS_PER_PACKET]; HITINFO_PACKET hitPacket_X0Y0[RAYPACKET_RAYS_PER_PACKET];
@ -692,7 +688,7 @@ void C3D_RENDER_RAYTRACING::rt_render_trace_block( GLubyte *ptrPBO ,
{ {
// If block is empty then set shades and continue // If block is empty then set shades and continue
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
{ {
for( unsigned int y = 0; y < RAYPACKET_DIM; ++y ) for( unsigned int y = 0; y < RAYPACKET_DIM; ++y )
{ {
@ -718,14 +714,13 @@ void C3D_RENDER_RAYTRACING::rt_render_trace_block( GLubyte *ptrPBO ,
// (as the final color will be computed on post processing) // (as the final color will be computed on post processing)
// but it is used for report progress // but it is used for report progress
const bool isFinalColor = !m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ); const bool isFinalColor = !m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING );
for( unsigned int y = 0; y < RAYPACKET_DIM; ++y ) for( unsigned int y = 0; y < RAYPACKET_DIM; ++y )
{ {
const SFVEC3F &outColor = bgColor[y]; const SFVEC3F &outColor = bgColor[y];
const unsigned int yConst = blockPos.x + const unsigned int yConst = blockPos.x + ( (y + blockPos.y) * m_realBufferSize.x);
( (y + blockPos.y) * m_realBufferSize.x);
for( unsigned int x = 0; x < RAYPACKET_DIM; ++x ) for( unsigned int x = 0; x < RAYPACKET_DIM; ++x )
{ {
@ -748,10 +743,10 @@ void C3D_RENDER_RAYTRACING::rt_render_trace_block( GLubyte *ptrPBO ,
rt_shades_packet( bgColor, rt_shades_packet( bgColor,
blockPacket.m_ray, blockPacket.m_ray,
hitPacket_X0Y0, hitPacket_X0Y0,
m_settings.GetFlag( FL_RENDER_RAYTRACING_SHADOWS ), m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_SHADOWS ),
hitColor_X0Y0 ); hitColor_X0Y0 );
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_ANTI_ALIASING ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_ANTI_ALIASING ) )
{ {
SFVEC3F hitColor_AA_X1Y1[RAYPACKET_RAYS_PER_PACKET]; SFVEC3F hitColor_AA_X1Y1[RAYPACKET_RAYS_PER_PACKET];
@ -761,10 +756,8 @@ void C3D_RENDER_RAYTRACING::rt_render_trace_block( GLubyte *ptrPBO ,
HITINFO_PACKET hitPacket_AA_X1Y1[RAYPACKET_RAYS_PER_PACKET]; HITINFO_PACKET hitPacket_AA_X1Y1[RAYPACKET_RAYS_PER_PACKET];
HITINFO_PACKET_init( hitPacket_AA_X1Y1 ); HITINFO_PACKET_init( hitPacket_AA_X1Y1 );
RAYPACKET blockPacket_AA_X1Y1( m_settings.CameraGet(), RAYPACKET blockPacket_AA_X1Y1( m_camera, (SFVEC2F)blockPosI + SFVEC2F(0.5f, 0.5f),
(SFVEC2F)blockPosI + SFVEC2F(0.5f, 0.5f), SFVEC2F(DISP_FACTOR, DISP_FACTOR) );
SFVEC2F(DISP_FACTOR, DISP_FACTOR) // Displacement random factor
);
if( !m_accelerator->Intersect( blockPacket_AA_X1Y1, hitPacket_AA_X1Y1 ) ) if( !m_accelerator->Intersect( blockPacket_AA_X1Y1, hitPacket_AA_X1Y1 ) )
{ {
@ -784,7 +777,7 @@ void C3D_RENDER_RAYTRACING::rt_render_trace_block( GLubyte *ptrPBO ,
rt_shades_packet( bgColor, rt_shades_packet( bgColor,
blockPacket_AA_X1Y1.m_ray, blockPacket_AA_X1Y1.m_ray,
hitPacket_AA_X1Y1, hitPacket_AA_X1Y1,
m_settings.GetFlag( FL_RENDER_RAYTRACING_SHADOWS ), m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_SHADOWS ),
hitColor_AA_X1Y1 hitColor_AA_X1Y1
); );
} }
@ -807,17 +800,17 @@ void C3D_RENDER_RAYTRACING::rt_render_trace_block( GLubyte *ptrPBO ,
RAY blockRayPck_AA_X0Y1[RAYPACKET_RAYS_PER_PACKET]; RAY blockRayPck_AA_X0Y1[RAYPACKET_RAYS_PER_PACKET];
RAY blockRayPck_AA_X1Y1_half[RAYPACKET_RAYS_PER_PACKET]; RAY blockRayPck_AA_X1Y1_half[RAYPACKET_RAYS_PER_PACKET];
RAYPACKET_InitRays_with2DDisplacement( m_settings.CameraGet(), RAYPACKET_InitRays_with2DDisplacement( m_camera,
(SFVEC2F)blockPosI + SFVEC2F(0.5f - DISP_FACTOR, DISP_FACTOR), (SFVEC2F)blockPosI + SFVEC2F(0.5f - DISP_FACTOR, DISP_FACTOR),
SFVEC2F(DISP_FACTOR, DISP_FACTOR), // Displacement random factor SFVEC2F(DISP_FACTOR, DISP_FACTOR), // Displacement random factor
blockRayPck_AA_X1Y0 ); blockRayPck_AA_X1Y0 );
RAYPACKET_InitRays_with2DDisplacement( m_settings.CameraGet(), RAYPACKET_InitRays_with2DDisplacement( m_camera,
(SFVEC2F)blockPosI + SFVEC2F(DISP_FACTOR, 0.5f - DISP_FACTOR), (SFVEC2F)blockPosI + SFVEC2F(DISP_FACTOR, 0.5f - DISP_FACTOR),
SFVEC2F(DISP_FACTOR, DISP_FACTOR), // Displacement random factor SFVEC2F(DISP_FACTOR, DISP_FACTOR), // Displacement random factor
blockRayPck_AA_X0Y1 ); blockRayPck_AA_X0Y1 );
RAYPACKET_InitRays_with2DDisplacement( m_settings.CameraGet(), RAYPACKET_InitRays_with2DDisplacement( m_camera,
(SFVEC2F)blockPosI + SFVEC2F(0.25f - DISP_FACTOR, 0.25f - DISP_FACTOR), (SFVEC2F)blockPosI + SFVEC2F(0.25f - DISP_FACTOR, 0.25f - DISP_FACTOR),
SFVEC2F(DISP_FACTOR, DISP_FACTOR), // Displacement random factor SFVEC2F(DISP_FACTOR, DISP_FACTOR), // Displacement random factor
blockRayPck_AA_X1Y1_half ); blockRayPck_AA_X1Y1_half );
@ -858,7 +851,7 @@ void C3D_RENDER_RAYTRACING::rt_render_trace_block( GLubyte *ptrPBO ,
const uint32_t ptrInc = (m_realBufferSize.x - RAYPACKET_DIM) * 4; const uint32_t ptrInc = (m_realBufferSize.x - RAYPACKET_DIM) * 4;
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
{ {
SFVEC2I bPos; SFVEC2I bPos;
bPos.y = blockPos.y; bPos.y = blockPos.y;
@ -918,7 +911,7 @@ void C3D_RENDER_RAYTRACING::rt_render_post_process_shade( GLubyte *ptrPBO,
{ {
(void)ptrPBO; // unused (void)ptrPBO; // unused
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
{ {
if( aStatusTextReporter ) if( aStatusTextReporter )
aStatusTextReporter->Report( _("Rendering: Post processing shader") ); aStatusTextReporter->Report( _("Rendering: Post processing shader") );
@ -969,7 +962,7 @@ void C3D_RENDER_RAYTRACING::rt_render_post_process_blur_finish( GLubyte *ptrPBO,
{ {
(void)aStatusTextReporter; //unused (void)aStatusTextReporter; //unused
if( m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
{ {
// Now blurs the shader result and compute the final color // Now blurs the shader result and compute the final color
std::atomic<size_t> nextBlock( 0 ); std::atomic<size_t> nextBlock( 0 );
@ -1105,16 +1098,16 @@ void C3D_RENDER_RAYTRACING::render_preview( GLubyte *ptrPBO )
const SFVEC2I windowsPos = SFVEC2I( windowPosUI.x + m_xoffset, const SFVEC2I windowsPos = SFVEC2I( windowPosUI.x + m_xoffset,
windowPosUI.y + m_yoffset ); windowPosUI.y + m_yoffset );
RAYPACKET blockPacket( m_settings.CameraGet(), windowsPos, 4 ); RAYPACKET blockPacket( m_camera, windowsPos, 4 );
HITINFO_PACKET hitPacket[RAYPACKET_RAYS_PER_PACKET]; HITINFO_PACKET hitPacket[RAYPACKET_RAYS_PER_PACKET];
// Initialize hitPacket with a "not hit" information // Initialize hitPacket with a "not hit" information
for( unsigned int i = 0; i < RAYPACKET_RAYS_PER_PACKET; ++i ) for( HITINFO_PACKET& packet : hitPacket )
{ {
hitPacket[i].m_HitInfo.m_tHit = std::numeric_limits<float>::infinity(); packet.m_HitInfo.m_tHit = std::numeric_limits<float>::infinity();
hitPacket[i].m_HitInfo.m_acc_node_info = 0; packet.m_HitInfo.m_acc_node_info = 0;
hitPacket[i].m_hitresult = false; packet.m_hitresult = false;
} }
// Intersect packet block // Intersect packet block
@ -1129,8 +1122,8 @@ void C3D_RENDER_RAYTRACING::render_preview( GLubyte *ptrPBO )
{ {
const float posYfactor = (float)(windowsPos.y + y * 4.0f) / (float)m_windowSize.y; const float posYfactor = (float)(windowsPos.y + y * 4.0f) / (float)m_windowSize.y;
bgColor[y] = (SFVEC3F)m_settings.m_BgColorTop * SFVEC3F(posYfactor) + bgColor[y] = (SFVEC3F)m_boardAdapter.m_BgColorTop * SFVEC3F( posYfactor) +
(SFVEC3F)m_settings.m_BgColorBot * ( SFVEC3F(1.0f) - SFVEC3F(posYfactor) ); (SFVEC3F)m_boardAdapter.m_BgColorBot * ( SFVEC3F( 1.0f) - SFVEC3F( posYfactor) );
} }
CCOLORRGB hitColorShading[RAYPACKET_RAYS_PER_PACKET]; CCOLORRGB hitColorShading[RAYPACKET_RAYS_PER_PACKET];
@ -1728,7 +1721,7 @@ SFVEC3F C3D_RENDER_RAYTRACING::shadeHit( const SFVEC3F &aBgColor,
SFVEC3F hitPoint = aHitInfo.m_HitPoint; SFVEC3F hitPoint = aHitInfo.m_HitPoint;
if( !m_isPreview ) if( !m_isPreview )
hitPoint += aHitInfo.m_HitNormal * m_settings.GetNonCopperLayerThickness3DU() * 1.2f; hitPoint += aHitInfo.m_HitNormal * m_boardAdapter.GetNonCopperLayerThickness3DU() * 1.2f;
const CMATERIAL *objMaterial = aHitInfo.pHitObject->GetMaterial(); const CMATERIAL *objMaterial = aHitInfo.pHitObject->GetMaterial();
wxASSERT( objMaterial != NULL ); wxASSERT( objMaterial != NULL );
@ -1740,7 +1733,7 @@ SFVEC3F C3D_RENDER_RAYTRACING::shadeHit( const SFVEC3F &aBgColor,
const LIST_LIGHT &lightList = m_lights.GetList(); const LIST_LIGHT &lightList = m_lights.GetList();
#if USE_EXPERIMENTAL_SOFT_SHADOWS #if USE_EXPERIMENTAL_SOFT_SHADOWS
const bool is_aa_enabled = m_settings.GetFlag( FL_RENDER_RAYTRACING_ANTI_ALIASING ) && const bool is_aa_enabled = m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_ANTI_ALIASING ) &&
(!m_isPreview); (!m_isPreview);
#endif #endif
@ -1766,7 +1759,7 @@ SFVEC3F C3D_RENDER_RAYTRACING::shadeHit( const SFVEC3F &aBgColor,
/* /*
if( (!m_isPreview) && if( (!m_isPreview) &&
// Little hack to make randomness to the shading and shadows // Little hack to make randomness to the shading and shadows
m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
vectorToLight = glm::normalize( vectorToLight + vectorToLight = glm::normalize( vectorToLight +
UniformRandomHemisphereDirection() * 0.1f ); UniformRandomHemisphereDirection() * 0.1f );
*/ */
@ -1789,7 +1782,7 @@ SFVEC3F C3D_RENDER_RAYTRACING::shadeHit( const SFVEC3F &aBgColor,
(aRecursiveLevel > 0) || (aRecursiveLevel > 0) ||
// Only use soft shadows if using post processing // Only use soft shadows if using post processing
(!m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) (!m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
) )
{ {
#endif #endif
@ -1835,7 +1828,7 @@ SFVEC3F C3D_RENDER_RAYTRACING::shadeHit( const SFVEC3F &aBgColor,
shadow_att_factor_sum += shadow_att_factor_light; shadow_att_factor_sum += shadow_att_factor_light;
} }
if( !m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) ) if( !m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ) )
{ {
outColor += objMaterial->Shade( aRay, outColor += objMaterial->Shade( aRay,
aHitInfo, aHitInfo,
@ -1894,7 +1887,7 @@ SFVEC3F C3D_RENDER_RAYTRACING::shadeHit( const SFVEC3F &aBgColor,
if( !aIsInsideObject && if( !aIsInsideObject &&
(objMaterial->GetReflection() > 0.0f) && (objMaterial->GetReflection() > 0.0f) &&
m_settings.GetFlag( FL_RENDER_RAYTRACING_REFLECTIONS ) ) m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_REFLECTIONS ) )
{ {
const unsigned int reflection_number_of_samples = objMaterial->GetNrReflectionsSamples(); const unsigned int reflection_number_of_samples = objMaterial->GetNrReflectionsSamples();
@ -1941,8 +1934,8 @@ SFVEC3F C3D_RENDER_RAYTRACING::shadeHit( const SFVEC3F &aBgColor,
// Refractions // Refractions
// ///////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////
if( (objMaterial->GetTransparency() > 0.0f) && if((objMaterial->GetTransparency() > 0.0f) &&
m_settings.GetFlag( FL_RENDER_RAYTRACING_REFRACTIONS ) ) m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_REFRACTIONS ) )
{ {
const float airIndex = 1.000293f; const float airIndex = 1.000293f;
const float glassIndex = 1.49f; const float glassIndex = 1.49f;

View File

@ -59,7 +59,7 @@ typedef enum
class C3D_RENDER_RAYTRACING : public C3D_RENDER_BASE class C3D_RENDER_RAYTRACING : public C3D_RENDER_BASE
{ {
public: public:
explicit C3D_RENDER_RAYTRACING( EDA_3D_SETTINGS &aSettings ); explicit C3D_RENDER_RAYTRACING( BOARD_ADAPTER& aAdapter, CCAMERA& aCamera );
~C3D_RENDER_RAYTRACING(); ~C3D_RENDER_RAYTRACING();

View File

@ -40,8 +40,9 @@
const wxChar * C3D_RENDER_BASE::m_logTrace = wxT( "KI_TRACE_3D_RENDER" ); const wxChar * C3D_RENDER_BASE::m_logTrace = wxT( "KI_TRACE_3D_RENDER" );
C3D_RENDER_BASE::C3D_RENDER_BASE( EDA_3D_SETTINGS &aSettings) : C3D_RENDER_BASE::C3D_RENDER_BASE( BOARD_ADAPTER& aBoardAdapter, CCAMERA& aCamera ) :
m_settings( aSettings ) m_boardAdapter( aBoardAdapter ),
m_camera( aCamera )
{ {
wxLogTrace( m_logTrace, wxT( "C3D_RENDER_BASE::C3D_RENDER_BASE" ) ); wxLogTrace( m_logTrace, wxT( "C3D_RENDER_BASE::C3D_RENDER_BASE" ) );
m_is_opengl_initialized = false; m_is_opengl_initialized = false;

View File

@ -32,7 +32,7 @@
#include <pcb_base_frame.h> #include <pcb_base_frame.h>
#include "3d_canvas/3d_settings.h" #include "3d_canvas/board_adapter.h"
#include <reporter.h> #include <reporter.h>
#include <widgets/busy_indicator.h> #include <widgets/busy_indicator.h>
@ -47,7 +47,7 @@ class C3D_RENDER_BASE
// Operations // Operations
public: public:
explicit C3D_RENDER_BASE( EDA_3D_SETTINGS &aSettings ); explicit C3D_RENDER_BASE( BOARD_ADAPTER& aBoardAdapter, CCAMERA& aCamera );
virtual ~C3D_RENDER_BASE() = 0; virtual ~C3D_RENDER_BASE() = 0;
@ -107,7 +107,9 @@ protected:
std::unique_ptr<BUSY_INDICATOR> CreateBusyIndicator() const; std::unique_ptr<BUSY_INDICATOR> CreateBusyIndicator() const;
/// settings refrence in use for this render /// settings refrence in use for this render
EDA_3D_SETTINGS &m_settings; BOARD_ADAPTER& m_boardAdapter;
CCAMERA& m_camera;
/// flag if the opengl specific for this render was already initialized /// flag if the opengl specific for this render was already initialized
bool m_is_opengl_initialized; bool m_is_opengl_initialized;

View File

@ -103,72 +103,72 @@ void EDA_3D_VIEWER::CreateMenuBar()
//clang-format off //clang-format off
auto raytracingCondition = [this]( const SELECTION& aSel ) auto raytracingCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.RenderEngineGet() != RENDER_ENGINE::OPENGL_LEGACY; return m_boardAdapter.RenderEngineGet() != RENDER_ENGINE::OPENGL_LEGACY;
}; };
auto NormalModeCondition = [this]( const SELECTION& aSel ) auto NormalModeCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.MaterialModeGet() == MATERIAL_MODE::NORMAL; return m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::NORMAL;
}; };
auto DiffuseModeCondition = [this]( const SELECTION& aSel ) auto DiffuseModeCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.MaterialModeGet() == MATERIAL_MODE::DIFFUSE_ONLY; return m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::DIFFUSE_ONLY;
}; };
auto CADModeCondition = [this]( const SELECTION& aSel ) auto CADModeCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.MaterialModeGet() == MATERIAL_MODE::CAD_MODE; return m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::CAD_MODE;
}; };
auto copperThicknessCondition = [this]( const SELECTION& aSel ) auto copperThicknessCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS ); return m_boardAdapter.GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS );
}; };
auto boundingBoxesCondition = [this]( const SELECTION& aSel ) auto boundingBoxesCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ); return m_boardAdapter.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX );
}; };
auto renderShadowsCondition = [this]( const SELECTION& aSel ) auto renderShadowsCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_RAYTRACING_SHADOWS ); return m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_SHADOWS );
}; };
auto proceduralTexturesCondition = [this]( const SELECTION& aSel ) auto proceduralTexturesCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ); return m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES );
}; };
auto showFloorCondition = [this]( const SELECTION& aSel ) auto showFloorCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_RAYTRACING_BACKFLOOR ); return m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_BACKFLOOR );
}; };
auto useRefractionsCondition = [this]( const SELECTION& aSel ) auto useRefractionsCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_RAYTRACING_REFRACTIONS ); return m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_REFRACTIONS );
}; };
auto useReflectionsCondition = [this]( const SELECTION& aSel ) auto useReflectionsCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_RAYTRACING_REFLECTIONS ); return m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_REFLECTIONS );
}; };
auto antiAliasingCondition = [this]( const SELECTION& aSel ) auto antiAliasingCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_RAYTRACING_ANTI_ALIASING ); return m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_ANTI_ALIASING );
}; };
auto postProcessCondition = [this]( const SELECTION& aSel ) auto postProcessCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING ); return m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_POST_PROCESSING );
}; };
auto showAxesCondition = [this]( const SELECTION& aSel ) auto showAxesCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GetFlag( FL_AXIS ); return m_boardAdapter.GetFlag( FL_AXIS );
}; };
//clang-format on //clang-format on
@ -272,27 +272,27 @@ void EDA_3D_VIEWER::CreateMenuBar()
//clang-format off //clang-format off
auto noGridCondition = [this]( const SELECTION& aSel ) auto noGridCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GridGet() == GRID3D_TYPE::NONE; return m_boardAdapter.GridGet() == GRID3D_TYPE::NONE;
}; };
auto grid10mmCondition = [this]( const SELECTION& aSel ) auto grid10mmCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GridGet() == GRID3D_TYPE::GRID_10MM; return m_boardAdapter.GridGet() == GRID3D_TYPE::GRID_10MM;
}; };
auto grid5mmCondition = [this]( const SELECTION& aSel ) auto grid5mmCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GridGet() == GRID3D_TYPE::GRID_5MM; return m_boardAdapter.GridGet() == GRID3D_TYPE::GRID_5MM;
}; };
auto grid2p5mmCondition = [this]( const SELECTION& aSel ) auto grid2p5mmCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GridGet() == GRID3D_TYPE::GRID_2P5MM; return m_boardAdapter.GridGet() == GRID3D_TYPE::GRID_2P5MM;
}; };
auto grid_1mmCondition = [this]( const SELECTION& aSel ) auto grid_1mmCondition = [this]( const SELECTION& aSel )
{ {
return m_settings.GridGet() == GRID3D_TYPE::GRID_1MM; return m_boardAdapter.GridGet() == GRID3D_TYPE::GRID_1MM;
}; };
//clang-format on //clang-format on

View File

@ -102,7 +102,7 @@ void EDA_3D_VIEWER::ReCreateMainToolbar()
void EDA_3D_VIEWER::SyncToolbars() void EDA_3D_VIEWER::SyncToolbars()
{ {
bool isOrtho = m_settings.CameraGet().GetProjection() == PROJECTION_TYPE::ORTHO; bool isOrtho = m_currentCamera.GetProjection() == PROJECTION_TYPE::ORTHO;
m_mainToolBar->Toggle( EDA_3D_ACTIONS::toggleOrtho, isOrtho ); m_mainToolBar->Toggle( EDA_3D_ACTIONS::toggleOrtho, isOrtho );
m_mainToolBar->Refresh(); m_mainToolBar->Refresh();

View File

@ -24,7 +24,7 @@
#include "dialog_3D_view_option_base.h" #include "dialog_3D_view_option_base.h"
#include <3d_viewer/eda_3d_viewer.h> #include <3d_viewer/eda_3d_viewer.h>
#include <3d_canvas/3d_settings.h> #include <3d_canvas/board_adapter.h>
#include <bitmaps.h> #include <bitmaps.h>
class DIALOG_3D_VIEW_OPTIONS : public DIALOG_3D_VIEW_OPTIONS_BASE class DIALOG_3D_VIEW_OPTIONS : public DIALOG_3D_VIEW_OPTIONS_BASE
@ -34,7 +34,7 @@ public:
private: private:
EDA_3D_VIEWER* m_parent; EDA_3D_VIEWER* m_parent;
EDA_3D_SETTINGS& m_settings; BOARD_ADAPTER& m_settings;
void initDialog(); void initDialog();
@ -57,11 +57,11 @@ void EDA_3D_VIEWER::Install3DViewOptionDialog( wxCommandEvent& event )
} }
DIALOG_3D_VIEW_OPTIONS::DIALOG_3D_VIEW_OPTIONS( EDA_3D_VIEWER* parent ) DIALOG_3D_VIEW_OPTIONS::DIALOG_3D_VIEW_OPTIONS( EDA_3D_VIEWER* parent ) :
: DIALOG_3D_VIEW_OPTIONS_BASE( parent ), m_settings( *parent->GetSettings() ) DIALOG_3D_VIEW_OPTIONS_BASE( parent ),
m_parent( parent ),
m_settings( parent->GetAdapter() )
{ {
m_parent = parent;
initDialog(); initDialog();
m_sdbSizerOK->SetDefault(); m_sdbSizerOK->SetDefault();

View File

@ -89,6 +89,8 @@ EDA_3D_VIEWER::EDA_3D_VIEWER( KIWAY *aKiway, PCB_BASE_FRAME *aParent, const wxSt
wxDefaultSize, style, QUALIFIED_VIEWER3D_FRAMENAME( aParent ) ), wxDefaultSize, style, QUALIFIED_VIEWER3D_FRAMENAME( aParent ) ),
m_mainToolBar( nullptr ), m_mainToolBar( nullptr ),
m_canvas( nullptr ), m_canvas( nullptr ),
m_currentCamera( m_trackBallCamera ),
m_trackBallCamera( RANGE_SCALE_3D ),
m_toolDispatcher( nullptr ) m_toolDispatcher( nullptr )
{ {
wxLogTrace( m_logTrace, "EDA_3D_VIEWER::EDA_3D_VIEWER %s", aTitle ); wxLogTrace( m_logTrace, "EDA_3D_VIEWER::EDA_3D_VIEWER %s", aTitle );
@ -112,7 +114,8 @@ EDA_3D_VIEWER::EDA_3D_VIEWER( KIWAY *aKiway, PCB_BASE_FRAME *aParent, const wxSt
SetStatusWidths( arrayDim( status_dims ), status_dims ); SetStatusWidths( arrayDim( status_dims ), status_dims );
m_canvas = new EDA_3D_CANVAS( this, COGL_ATT_LIST::GetAttributesList( true ), m_canvas = new EDA_3D_CANVAS( this, COGL_ATT_LIST::GetAttributesList( true ),
aParent->GetBoard(), m_settings, Prj().Get3DCacheManager() ); aParent->GetBoard(), m_boardAdapter, m_currentCamera,
Prj().Get3DCacheManager() );
if( m_canvas ) if( m_canvas )
m_canvas->SetStatusBar( status_bar ); m_canvas->SetStatusBar( status_bar );
@ -236,10 +239,10 @@ void EDA_3D_VIEWER::Process_Special_Functions( wxCommandEvent &event )
return; return;
case ID_MENU3D_BGCOLOR_BOTTOM: case ID_MENU3D_BGCOLOR_BOTTOM:
if( Set3DColorFromUser( m_settings.m_BgColorBot, _( "Background Color, Bottom" ), if( Set3DColorFromUser( m_boardAdapter.m_BgColorBot, _( "Background Color, Bottom" ),
nullptr ) ) nullptr ) )
{ {
if( m_settings.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY ) if( m_boardAdapter.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
m_canvas->Request_refresh(); m_canvas->Request_refresh();
else else
NewDisplay( true ); NewDisplay( true );
@ -247,9 +250,9 @@ void EDA_3D_VIEWER::Process_Special_Functions( wxCommandEvent &event )
return; return;
case ID_MENU3D_BGCOLOR_TOP: case ID_MENU3D_BGCOLOR_TOP:
if( Set3DColorFromUser( m_settings.m_BgColorTop, _( "Background Color, Top" ), nullptr ) ) if( Set3DColorFromUser( m_boardAdapter.m_BgColorTop, _( "Background Color, Top" ), nullptr ) )
{ {
if( m_settings.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY ) if( m_boardAdapter.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
m_canvas->Request_refresh(); m_canvas->Request_refresh();
else else
NewDisplay( true ); NewDisplay( true );
@ -282,17 +285,17 @@ void EDA_3D_VIEWER::Process_Special_Functions( wxCommandEvent &event )
break; break;
case ID_MENU3D_FL_RENDER_MATERIAL_MODE_NORMAL: case ID_MENU3D_FL_RENDER_MATERIAL_MODE_NORMAL:
m_settings.MaterialModeSet( MATERIAL_MODE::NORMAL ); m_boardAdapter.MaterialModeSet( MATERIAL_MODE::NORMAL );
NewDisplay( true ); NewDisplay( true );
return; return;
case ID_MENU3D_FL_RENDER_MATERIAL_MODE_DIFFUSE_ONLY: case ID_MENU3D_FL_RENDER_MATERIAL_MODE_DIFFUSE_ONLY:
m_settings.MaterialModeSet( MATERIAL_MODE::DIFFUSE_ONLY ); m_boardAdapter.MaterialModeSet( MATERIAL_MODE::DIFFUSE_ONLY );
NewDisplay( true ); NewDisplay( true );
return; return;
case ID_MENU3D_FL_RENDER_MATERIAL_MODE_CAD_MODE: case ID_MENU3D_FL_RENDER_MATERIAL_MODE_CAD_MODE:
m_settings.MaterialModeSet( MATERIAL_MODE::CAD_MODE ); m_boardAdapter.MaterialModeSet( MATERIAL_MODE::CAD_MODE );
NewDisplay( true ); NewDisplay( true );
return; return;
@ -318,18 +321,18 @@ void EDA_3D_VIEWER::Process_Special_Functions( wxCommandEvent &event )
void EDA_3D_VIEWER::OnRenderEngineSelection( wxCommandEvent &event ) void EDA_3D_VIEWER::OnRenderEngineSelection( wxCommandEvent &event )
{ {
const RENDER_ENGINE old_engine = m_settings.RenderEngineGet(); const RENDER_ENGINE old_engine = m_boardAdapter.RenderEngineGet();
if( old_engine == RENDER_ENGINE::OPENGL_LEGACY ) if( old_engine == RENDER_ENGINE::OPENGL_LEGACY )
m_settings.RenderEngineSet( RENDER_ENGINE::RAYTRACING ); m_boardAdapter.RenderEngineSet( RENDER_ENGINE::RAYTRACING );
else else
m_settings.RenderEngineSet( RENDER_ENGINE::OPENGL_LEGACY ); m_boardAdapter.RenderEngineSet( RENDER_ENGINE::OPENGL_LEGACY );
wxLogTrace( m_logTrace, "EDA_3D_VIEWER::OnRenderEngineSelection type %s ", wxLogTrace( m_logTrace, "EDA_3D_VIEWER::OnRenderEngineSelection type %s ",
( m_settings.RenderEngineGet() == RENDER_ENGINE::RAYTRACING ) ? "Ray Trace" : ( m_boardAdapter.RenderEngineGet() == RENDER_ENGINE::RAYTRACING ) ? "Ray Trace" :
"OpenGL Legacy" ); "OpenGL Legacy" );
if( old_engine != m_settings.RenderEngineGet() ) if( old_engine != m_boardAdapter.RenderEngineGet() )
RenderEngineChanged(); RenderEngineChanged();
} }
@ -339,7 +342,7 @@ void EDA_3D_VIEWER::OnDisableRayTracing( wxCommandEvent& aEvent )
wxLogTrace( m_logTrace, "EDA_3D_VIEWER::%s disabling ray tracing.", __WXFUNCTION__ ); wxLogTrace( m_logTrace, "EDA_3D_VIEWER::%s disabling ray tracing.", __WXFUNCTION__ );
m_disable_ray_tracing = true; m_disable_ray_tracing = true;
m_settings.RenderEngineSet( RENDER_ENGINE::OPENGL_LEGACY ); m_boardAdapter.RenderEngineSet( RENDER_ENGINE::OPENGL_LEGACY );
} }
@ -390,19 +393,19 @@ void EDA_3D_VIEWER::LoadSettings( APP_SETTINGS_BASE *aCfg )
aTarget.b = aColor.b; aTarget.b = aColor.b;
}; };
set_color( colors->GetColor( LAYER_3D_BACKGROUND_BOTTOM ), m_settings.m_BgColorBot ); set_color( colors->GetColor( LAYER_3D_BACKGROUND_BOTTOM ), m_boardAdapter.m_BgColorBot );
set_color( colors->GetColor( LAYER_3D_BACKGROUND_TOP ), m_settings.m_BgColorTop ); set_color( colors->GetColor( LAYER_3D_BACKGROUND_TOP ), m_boardAdapter.m_BgColorTop );
set_color( colors->GetColor( LAYER_3D_BOARD ), m_settings.m_BoardBodyColor ); set_color( colors->GetColor( LAYER_3D_BOARD ), m_boardAdapter.m_BoardBodyColor );
set_color( colors->GetColor( LAYER_3D_COPPER ), m_settings.m_CopperColor ); set_color( colors->GetColor( LAYER_3D_COPPER ), m_boardAdapter.m_CopperColor );
set_color( colors->GetColor( LAYER_3D_SILKSCREEN_BOTTOM ), m_settings.m_SilkScreenColorBot ); set_color( colors->GetColor( LAYER_3D_SILKSCREEN_BOTTOM ), m_boardAdapter.m_SilkScreenColorBot );
set_color( colors->GetColor( LAYER_3D_SILKSCREEN_TOP ), m_settings.m_SilkScreenColorTop ); set_color( colors->GetColor( LAYER_3D_SILKSCREEN_TOP ), m_boardAdapter.m_SilkScreenColorTop );
set_color( colors->GetColor( LAYER_3D_SOLDERMASK ), m_settings.m_SolderMaskColorBot ); set_color( colors->GetColor( LAYER_3D_SOLDERMASK ), m_boardAdapter.m_SolderMaskColorBot );
set_color( colors->GetColor( LAYER_3D_SOLDERMASK ), m_settings.m_SolderMaskColorTop ); set_color( colors->GetColor( LAYER_3D_SOLDERMASK ), m_boardAdapter.m_SolderMaskColorTop );
set_color( colors->GetColor( LAYER_3D_SOLDERPASTE ), m_settings.m_SolderPasteColor ); set_color( colors->GetColor( LAYER_3D_SOLDERPASTE ), m_boardAdapter.m_SolderPasteColor );
if( cfg ) if( cfg )
{ {
#define TRANSER_SETTING( flag, field ) m_settings.SetFlag( flag, cfg->m_Render.field ) #define TRANSER_SETTING( flag, field ) m_boardAdapter.SetFlag( flag, cfg->m_Render.field )
TRANSER_SETTING( FL_USE_REALISTIC_MODE, realistic ); TRANSER_SETTING( FL_USE_REALISTIC_MODE, realistic );
TRANSER_SETTING( FL_SUBTRACT_MASK_FROM_SILK, subtract_mask_from_silk ); TRANSER_SETTING( FL_SUBTRACT_MASK_FROM_SILK, subtract_mask_from_silk );
@ -433,15 +436,15 @@ void EDA_3D_VIEWER::LoadSettings( APP_SETTINGS_BASE *aCfg )
TRANSER_SETTING( FL_ECO, show_eco ); TRANSER_SETTING( FL_ECO, show_eco );
TRANSER_SETTING( FL_SHOW_BOARD_BODY, show_board_body ); TRANSER_SETTING( FL_SHOW_BOARD_BODY, show_board_body );
m_settings.GridSet( static_cast<GRID3D_TYPE>( cfg->m_Render.grid_type ) ); m_boardAdapter.GridSet( static_cast<GRID3D_TYPE>( cfg->m_Render.grid_type ) );
RENDER_ENGINE engine = static_cast<RENDER_ENGINE>( cfg->m_Render.engine ); RENDER_ENGINE engine = static_cast<RENDER_ENGINE>( cfg->m_Render.engine );
wxLogTrace( m_logTrace, engine == RENDER_ENGINE::RAYTRACING ? wxLogTrace( m_logTrace, engine == RENDER_ENGINE::RAYTRACING ?
"EDA_3D_VIEWER::LoadSettings render setting Ray Trace" : "EDA_3D_VIEWER::LoadSettings render setting Ray Trace" :
"EDA_3D_VIEWER::LoadSettings render setting OpenGL" ); "EDA_3D_VIEWER::LoadSettings render setting OpenGL" );
m_settings.RenderEngineSet( engine ); m_boardAdapter.RenderEngineSet( engine );
m_settings.MaterialModeSet( static_cast<MATERIAL_MODE>( cfg->m_Render.material_mode ) ); m_boardAdapter.MaterialModeSet( static_cast<MATERIAL_MODE>( cfg->m_Render.material_mode ) );
#undef TRANSFER_SETTING #undef TRANSFER_SETTING
} }
@ -463,26 +466,26 @@ void EDA_3D_VIEWER::SaveSettings( APP_SETTINGS_BASE *aCfg )
colors->SetColor( aTarget, COLOR4D( aSource.r, aSource.g, aSource.b, 1.0 ) ); colors->SetColor( aTarget, COLOR4D( aSource.r, aSource.g, aSource.b, 1.0 ) );
}; };
save_color( m_settings.m_BgColorBot, LAYER_3D_BACKGROUND_BOTTOM ); save_color( m_boardAdapter.m_BgColorBot, LAYER_3D_BACKGROUND_BOTTOM );
save_color( m_settings.m_BgColorTop, LAYER_3D_BACKGROUND_TOP ); save_color( m_boardAdapter.m_BgColorTop, LAYER_3D_BACKGROUND_TOP );
save_color( m_settings.m_BoardBodyColor, LAYER_3D_BOARD ); save_color( m_boardAdapter.m_BoardBodyColor, LAYER_3D_BOARD );
save_color( m_settings.m_CopperColor, LAYER_3D_COPPER ); save_color( m_boardAdapter.m_CopperColor, LAYER_3D_COPPER );
save_color( m_settings.m_SilkScreenColorBot, LAYER_3D_SILKSCREEN_BOTTOM ); save_color( m_boardAdapter.m_SilkScreenColorBot, LAYER_3D_SILKSCREEN_BOTTOM );
save_color( m_settings.m_SilkScreenColorTop, LAYER_3D_SILKSCREEN_TOP ); save_color( m_boardAdapter.m_SilkScreenColorTop, LAYER_3D_SILKSCREEN_TOP );
save_color( m_settings.m_SolderMaskColorTop, LAYER_3D_SOLDERMASK ); save_color( m_boardAdapter.m_SolderMaskColorTop, LAYER_3D_SOLDERMASK );
save_color( m_settings.m_SolderPasteColor, LAYER_3D_SOLDERPASTE ); save_color( m_boardAdapter.m_SolderPasteColor, LAYER_3D_SOLDERPASTE );
wxLogTrace( m_logTrace, m_settings.RenderEngineGet() == RENDER_ENGINE::RAYTRACING ? wxLogTrace( m_logTrace, m_boardAdapter.RenderEngineGet() == RENDER_ENGINE::RAYTRACING ?
"EDA_3D_VIEWER::SaveSettings render setting Ray Trace" : "EDA_3D_VIEWER::SaveSettings render setting Ray Trace" :
"EDA_3D_VIEWER::SaveSettings render setting OpenGL" ); "EDA_3D_VIEWER::SaveSettings render setting OpenGL" );
if( cfg ) if( cfg )
{ {
#define TRANSFER_SETTING( field, flag ) cfg->m_Render.field = m_settings.GetFlag( flag ) #define TRANSFER_SETTING( field, flag ) cfg->m_Render.field = m_boardAdapter.GetFlag( flag )
cfg->m_Render.engine = static_cast<int>( m_settings.RenderEngineGet() ); cfg->m_Render.engine = static_cast<int>( m_boardAdapter.RenderEngineGet() );
cfg->m_Render.grid_type = static_cast<int>( m_settings.GridGet() ); cfg->m_Render.grid_type = static_cast<int>( m_boardAdapter.GridGet() );
cfg->m_Render.material_mode = static_cast<int>( m_settings.MaterialModeGet() ); cfg->m_Render.material_mode = static_cast<int>( m_boardAdapter.MaterialModeGet() );
TRANSFER_SETTING( opengl_copper_thickness, FL_RENDER_OPENGL_COPPER_THICKNESS ); TRANSFER_SETTING( opengl_copper_thickness, FL_RENDER_OPENGL_COPPER_THICKNESS );
TRANSFER_SETTING( opengl_show_model_bbox, FL_RENDER_OPENGL_SHOW_MODEL_BBOX ); TRANSFER_SETTING( opengl_show_model_bbox, FL_RENDER_OPENGL_SHOW_MODEL_BBOX );
@ -548,24 +551,24 @@ void EDA_3D_VIEWER::SynchroniseColoursWithBoard()
switch( stckpItem->GetBrdLayerId() ) switch( stckpItem->GetBrdLayerId() )
{ {
case F_SilkS: case F_SilkS:
m_settings.m_SilkScreenColorTop.r = color.Red() / 255.0; m_boardAdapter.m_SilkScreenColorTop.r = color.Red() / 255.0;
m_settings.m_SilkScreenColorTop.g = color.Green() / 255.0; m_boardAdapter.m_SilkScreenColorTop.g = color.Green() / 255.0;
m_settings.m_SilkScreenColorTop.b = color.Blue() / 255.0; m_boardAdapter.m_SilkScreenColorTop.b = color.Blue() / 255.0;
break; break;
case B_SilkS: case B_SilkS:
m_settings.m_SilkScreenColorBot.r = color.Red() / 255.0; m_boardAdapter.m_SilkScreenColorBot.r = color.Red() / 255.0;
m_settings.m_SilkScreenColorBot.g = color.Green() / 255.0; m_boardAdapter.m_SilkScreenColorBot.g = color.Green() / 255.0;
m_settings.m_SilkScreenColorBot.b = color.Blue() / 255.0; m_boardAdapter.m_SilkScreenColorBot.b = color.Blue() / 255.0;
break; break;
case F_Mask: case F_Mask:
m_settings.m_SolderMaskColorTop.r = color.Red() / 255.0; m_boardAdapter.m_SolderMaskColorTop.r = color.Red() / 255.0;
m_settings.m_SolderMaskColorTop.g = color.Green() / 255.0; m_boardAdapter.m_SolderMaskColorTop.g = color.Green() / 255.0;
m_settings.m_SolderMaskColorTop.b = color.Blue() / 255.0; m_boardAdapter.m_SolderMaskColorTop.b = color.Blue() / 255.0;
break; break;
case B_Mask: case B_Mask:
m_settings.m_SolderMaskColorBot.r = color.Red() / 255.0; m_boardAdapter.m_SolderMaskColorBot.r = color.Red() / 255.0;
m_settings.m_SolderMaskColorBot.g = color.Green() / 255.0; m_boardAdapter.m_SolderMaskColorBot.g = color.Green() / 255.0;
m_settings.m_SolderMaskColorBot.b = color.Blue() / 255.0; m_boardAdapter.m_SolderMaskColorBot.b = color.Blue() / 255.0;
break; break;
default: default:
break; break;
@ -724,9 +727,9 @@ bool EDA_3D_VIEWER::Set3DSilkScreenColorFromUser()
colors.push_back( CUSTOM_COLOR_ITEM( 241.0/255.0, 241.0/255.0, 241.0/255.0, "White" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 241.0/255.0, 241.0/255.0, 241.0/255.0, "White" ) );
colors.push_back( CUSTOM_COLOR_ITEM( 4.0/255.0, 18.0/255.0, 21.0/255.0, "Dark" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 4.0/255.0, 18.0/255.0, 21.0/255.0, "Dark" ) );
if( Set3DColorFromUser( m_settings.m_SilkScreenColorTop, _( "Silkscreen Color" ), &colors ) ) if( Set3DColorFromUser( m_boardAdapter.m_SilkScreenColorTop, _( "Silkscreen Color" ), &colors ) )
{ {
m_settings.m_SilkScreenColorBot = m_settings.m_SilkScreenColorTop; m_boardAdapter.m_SilkScreenColorBot = m_boardAdapter.m_SilkScreenColorTop;
NewDisplay( true ); NewDisplay( true );
return true; return true;
} }
@ -754,9 +757,9 @@ bool EDA_3D_VIEWER::Set3DSolderMaskColorFromUser()
colors.push_back( CUSTOM_COLOR_ITEM( 119/255.0, 31/255.0, 91/255.0, "Purple" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 119/255.0, 31/255.0, 91/255.0, "Purple" ) );
colors.push_back( CUSTOM_COLOR_ITEM( 32/255.0, 2/255.0, 53/255.0, "Purple Dark" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 32/255.0, 2/255.0, 53/255.0, "Purple Dark" ) );
if( Set3DColorFromUser( m_settings.m_SolderMaskColorTop, _( "Solder Mask Color" ), &colors ) ) if( Set3DColorFromUser( m_boardAdapter.m_SolderMaskColorTop, _( "Solder Mask Color" ), &colors ) )
{ {
m_settings.m_SolderMaskColorBot = m_settings.m_SolderMaskColorTop; m_boardAdapter.m_SolderMaskColorBot = m_boardAdapter.m_SolderMaskColorTop;
NewDisplay( true ); NewDisplay( true );
return true; return true;
} }
@ -774,7 +777,7 @@ bool EDA_3D_VIEWER::Set3DCopperColorFromUser()
colors.push_back( CUSTOM_COLOR_ITEM( 213/255.0, 213/255.0, 213/255.0, "Silver" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 213/255.0, 213/255.0, 213/255.0, "Silver" ) );
colors.push_back( CUSTOM_COLOR_ITEM( 160/255.0, 160/255.0, 160/255.0, "Tin" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 160/255.0, 160/255.0, 160/255.0, "Tin" ) );
if( Set3DColorFromUser( m_settings.m_CopperColor, _( "Copper Color" ), &colors ) ) if( Set3DColorFromUser( m_boardAdapter.m_CopperColor, _( "Copper Color" ), &colors ) )
{ {
NewDisplay( true ); NewDisplay( true );
return true; return true;
@ -797,7 +800,7 @@ bool EDA_3D_VIEWER::Set3DBoardBodyColorFromUser()
colors.push_back( CUSTOM_COLOR_ITEM( 63/255.0, 126/255.0, 71/255.0, "green 1" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 63/255.0, 126/255.0, 71/255.0, "green 1" ) );
colors.push_back( CUSTOM_COLOR_ITEM( 117/255.0, 122/255.0, 90/255.0, "green 2" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 117/255.0, 122/255.0, 90/255.0, "green 2" ) );
if( Set3DColorFromUser( m_settings.m_BoardBodyColor, _( "Board Body Color" ), &colors ) ) if( Set3DColorFromUser( m_boardAdapter.m_BoardBodyColor, _( "Board Body Color" ), &colors ) )
{ {
NewDisplay( true ); NewDisplay( true );
return true; return true;
@ -815,7 +818,7 @@ bool EDA_3D_VIEWER::Set3DSolderPasteColorFromUser()
colors.push_back( CUSTOM_COLOR_ITEM( 213/255.0, 213/255.0, 213/255.0, "Silver" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 213/255.0, 213/255.0, 213/255.0, "Silver" ) );
colors.push_back( CUSTOM_COLOR_ITEM( 90/255.0, 90/255.0, 90/255.0, "grey 2" ) ); colors.push_back( CUSTOM_COLOR_ITEM( 90/255.0, 90/255.0, 90/255.0, "grey 2" ) );
if( Set3DColorFromUser( m_settings.m_SolderPasteColor, _( "Solder Paste Color" ), &colors ) ) if( Set3DColorFromUser( m_boardAdapter.m_SolderPasteColor, _( "Solder Paste Color" ), &colors ) )
{ {
NewDisplay( true ); NewDisplay( true );
return true; return true;
@ -827,7 +830,7 @@ bool EDA_3D_VIEWER::Set3DSolderPasteColorFromUser()
void EDA_3D_VIEWER::OnUpdateUIEngine( wxUpdateUIEvent& aEvent ) void EDA_3D_VIEWER::OnUpdateUIEngine( wxUpdateUIEvent& aEvent )
{ {
aEvent.Check( m_settings.RenderEngineGet() != RENDER_ENGINE::OPENGL_LEGACY ); aEvent.Check( m_boardAdapter.RenderEngineGet() != RENDER_ENGINE::OPENGL_LEGACY );
} }
@ -837,15 +840,15 @@ void EDA_3D_VIEWER::OnUpdateUIMaterial( wxUpdateUIEvent& aEvent )
switch( aEvent.GetId() ) switch( aEvent.GetId() )
{ {
case ID_MENU3D_FL_RENDER_MATERIAL_MODE_NORMAL: case ID_MENU3D_FL_RENDER_MATERIAL_MODE_NORMAL:
aEvent.Check( m_settings.MaterialModeGet() == MATERIAL_MODE::NORMAL ); aEvent.Check( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::NORMAL );
break; break;
case ID_MENU3D_FL_RENDER_MATERIAL_MODE_DIFFUSE_ONLY: case ID_MENU3D_FL_RENDER_MATERIAL_MODE_DIFFUSE_ONLY:
aEvent.Check( m_settings.MaterialModeGet() == MATERIAL_MODE::DIFFUSE_ONLY ); aEvent.Check( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::DIFFUSE_ONLY );
break; break;
case ID_MENU3D_FL_RENDER_MATERIAL_MODE_CAD_MODE: case ID_MENU3D_FL_RENDER_MATERIAL_MODE_CAD_MODE:
aEvent.Check( m_settings.MaterialModeGet() == MATERIAL_MODE::CAD_MODE ); aEvent.Check( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::CAD_MODE );
break; break;
default: default:
@ -862,5 +865,5 @@ void EDA_3D_VIEWER::loadCommonSettings()
const DPI_SCALING dpi{ settings, this }; const DPI_SCALING dpi{ settings, this };
m_canvas->SetScaleFactor( dpi.GetScaleFactor() ); m_canvas->SetScaleFactor( dpi.GetScaleFactor() );
m_settings.SetFlag( FL_MOUSEWHEEL_PANNING, settings->m_Input.mousewheel_pan ); m_boardAdapter.SetFlag( FL_MOUSEWHEEL_PANNING, settings->m_Input.mousewheel_pan );
} }

View File

@ -32,8 +32,9 @@
#ifndef EDA_3D_VIEWER_H #ifndef EDA_3D_VIEWER_H
#define EDA_3D_VIEWER_H #define EDA_3D_VIEWER_H
#include "3d_canvas/3d_settings.h" #include "3d_canvas/board_adapter.h"
#include "../3d_canvas/eda_3d_canvas.h" #include "3d_canvas/eda_3d_canvas.h"
#include "3d_rendering/ctrack_ball.h"
#include <kiway_player.h> #include <kiway_player.h>
#include <wx/colourdata.h> #include <wx/colourdata.h>
#include <../common/dialogs/dialog_color_picker.h> // for CUSTOM_COLORS_LIST definition #include <../common/dialogs/dialog_color_picker.h> // for CUSTOM_COLORS_LIST definition
@ -62,7 +63,7 @@ enum EDA_3D_VIEWER_STATUSBAR
/** /**
* Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard * Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard
*/ */
class EDA_3D_VIEWER : public EDA_3D_SETTINGS_HOLDER, public KIWAY_PLAYER class EDA_3D_VIEWER : public EDA_3D_BOARD_HOLDER, public KIWAY_PLAYER
{ {
public: public:
@ -101,10 +102,8 @@ class EDA_3D_VIEWER : public EDA_3D_SETTINGS_HOLDER, public KIWAY_PLAYER
*/ */
void NewDisplay( bool aForceImmediateRedraw = false ); void NewDisplay( bool aForceImmediateRedraw = false );
/** BOARD_ADAPTER& GetAdapter() override { return m_boardAdapter; }
* @return current settings CCAMERA& GetCurrentCamera() override { return m_currentCamera; }
*/
EDA_3D_SETTINGS* GetSettings() override { return &m_settings; }
/** /**
* Get a SFVEC3D from a wx colour dialog * Get a SFVEC3D from a wx colour dialog
@ -155,7 +154,7 @@ class EDA_3D_VIEWER : public EDA_3D_SETTINGS_HOLDER, public KIWAY_PLAYER
void CommonSettingsChanged( bool aEnvVarsChanged ) override; void CommonSettingsChanged( bool aEnvVarsChanged ) override;
void SynchroniseColoursWithBoard( void ); void SynchroniseColoursWithBoard();
private: private:
/// Called when user press the File->Exit /// Called when user press the File->Exit
@ -209,7 +208,9 @@ private:
ACTION_TOOLBAR* m_mainToolBar; ACTION_TOOLBAR* m_mainToolBar;
EDA_3D_CANVAS* m_canvas; EDA_3D_CANVAS* m_canvas;
EDA_3D_SETTINGS m_settings; BOARD_ADAPTER m_boardAdapter;
CCAMERA& m_currentCamera;
CTRACK_BALL m_trackBallCamera;
TOOL_DISPATCHER* m_toolDispatcher; TOOL_DISPATCHER* m_toolDispatcher;

View File

@ -68,12 +68,14 @@ void EDA_3D_CONTROLLER::Reset( RESET_REASON aReason )
if( holder ) if( holder )
{ {
m_canvas = dynamic_cast<EDA_3D_CANVAS*>( holder->GetToolCanvas() ); m_canvas = dynamic_cast<EDA_3D_CANVAS*>( holder->GetToolCanvas() );
m_settings = dynamic_cast<EDA_3D_SETTINGS_HOLDER*>( holder )->GetSettings(); m_boardAdapter = &dynamic_cast<EDA_3D_BOARD_HOLDER*>( holder )->GetAdapter();
m_camera = &dynamic_cast<EDA_3D_BOARD_HOLDER*>( holder )->GetCurrentCamera();
} }
else else
{ {
m_canvas = nullptr; m_canvas = nullptr;
m_settings = nullptr; m_boardAdapter = nullptr;
m_camera = nullptr;
} }
} }
@ -138,16 +140,16 @@ int EDA_3D_CONTROLLER::RotateView( const TOOL_EVENT& aEvent )
{ {
switch( aEvent.Parameter<intptr_t>() ) switch( aEvent.Parameter<intptr_t>() )
{ {
case ID_ROTATE3D_X_NEG: m_settings->CameraGet().RotateX( -glm::radians( ROT_ANGLE ) ); break; case ID_ROTATE3D_X_NEG: m_camera->RotateX( -glm::radians( ROT_ANGLE ) ); break;
case ID_ROTATE3D_X_POS: m_settings->CameraGet().RotateX( glm::radians( ROT_ANGLE ) ); break; case ID_ROTATE3D_X_POS: m_camera->RotateX( glm::radians( ROT_ANGLE ) ); break;
case ID_ROTATE3D_Y_NEG: m_settings->CameraGet().RotateY( -glm::radians( ROT_ANGLE ) ); break; case ID_ROTATE3D_Y_NEG: m_camera->RotateY( -glm::radians( ROT_ANGLE ) ); break;
case ID_ROTATE3D_Y_POS: m_settings->CameraGet().RotateY( glm::radians( ROT_ANGLE ) ); break; case ID_ROTATE3D_Y_POS: m_camera->RotateY( glm::radians( ROT_ANGLE ) ); break;
case ID_ROTATE3D_Z_NEG: m_settings->CameraGet().RotateZ( -glm::radians( ROT_ANGLE ) ); break; case ID_ROTATE3D_Z_NEG: m_camera->RotateZ( -glm::radians( ROT_ANGLE ) ); break;
case ID_ROTATE3D_Z_POS: m_settings->CameraGet().RotateZ( glm::radians( ROT_ANGLE ) ); break; case ID_ROTATE3D_Z_POS: m_camera->RotateZ( glm::radians( ROT_ANGLE ) ); break;
default: wxFAIL; break; default: wxFAIL; break;
} }
if( m_settings->RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY ) if( m_boardAdapter->RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
m_canvas->Request_refresh(); m_canvas->Request_refresh();
else else
m_canvas->RenderRaytracingRequest(); m_canvas->RenderRaytracingRequest();
@ -158,9 +160,9 @@ int EDA_3D_CONTROLLER::RotateView( const TOOL_EVENT& aEvent )
int EDA_3D_CONTROLLER::ToggleOrtho( const TOOL_EVENT& aEvent ) int EDA_3D_CONTROLLER::ToggleOrtho( const TOOL_EVENT& aEvent )
{ {
m_settings->CameraGet().ToggleProjection(); m_camera->ToggleProjection();
if( m_settings->RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY ) if( m_boardAdapter->RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
m_canvas->Request_refresh(); m_canvas->Request_refresh();
else else
m_canvas->RenderRaytracingRequest(); m_canvas->RenderRaytracingRequest();
@ -173,7 +175,7 @@ int EDA_3D_CONTROLLER::ToggleVisibility( const TOOL_EVENT& aEvent )
{ {
DISPLAY3D_FLG flag = aEvent.Parameter<DISPLAY3D_FLG>(); DISPLAY3D_FLG flag = aEvent.Parameter<DISPLAY3D_FLG>();
m_settings->SetFlag( flag, !m_settings->GetFlag( flag ) ); m_boardAdapter->SetFlag( flag, !m_boardAdapter->GetFlag( flag ) );
switch( flag ) switch( flag )
{ {
@ -205,7 +207,7 @@ int EDA_3D_CONTROLLER::ToggleVisibility( const TOOL_EVENT& aEvent )
int EDA_3D_CONTROLLER::On3DGridSelection( const TOOL_EVENT& aEvent ) int EDA_3D_CONTROLLER::On3DGridSelection( const TOOL_EVENT& aEvent )
{ {
GRID3D_TYPE grid = aEvent.Parameter<GRID3D_TYPE>(); GRID3D_TYPE grid = aEvent.Parameter<GRID3D_TYPE>();
m_settings->GridSet( grid ); m_boardAdapter->GridSet( grid );
if( m_canvas ) if( m_canvas )
m_canvas->Request_refresh(); m_canvas->Request_refresh();

View File

@ -27,7 +27,7 @@
#include <tool/tool_interactive.h> #include <tool/tool_interactive.h>
class EDA_3D_VIEWER; class EDA_3D_VIEWER;
class EDA_3D_SETTINGS; class BOARD_ADAPTER;
/** /**
@ -42,7 +42,8 @@ public:
EDA_3D_CONTROLLER() : EDA_3D_CONTROLLER() :
TOOL_INTERACTIVE( "3DViewer.Control" ), TOOL_INTERACTIVE( "3DViewer.Control" ),
m_canvas( nullptr ), m_canvas( nullptr ),
m_settings( nullptr ) m_boardAdapter( nullptr ),
m_camera( nullptr )
{ } { }
~EDA_3D_CONTROLLER() override { } ~EDA_3D_CONTROLLER() override { }
@ -80,7 +81,8 @@ private:
private: private:
EDA_3D_CANVAS* m_canvas; EDA_3D_CANVAS* m_canvas;
EDA_3D_SETTINGS* m_settings; BOARD_ADAPTER* m_boardAdapter;
CCAMERA* m_camera;
}; };
#endif #endif

View File

@ -35,7 +35,7 @@ set(3D-VIEWER_SRCS
${DIR_DLG}/dlg_select_3dmodel.cpp ${DIR_DLG}/dlg_select_3dmodel.cpp
${DIR_DLG}/panel_prev_3d_base.cpp ${DIR_DLG}/panel_prev_3d_base.cpp
${DIR_DLG}/panel_prev_3d.cpp ${DIR_DLG}/panel_prev_3d.cpp
3d_canvas/3d_settings.cpp 3d_canvas/board_adapter.cpp
3d_canvas/create_layer_items.cpp 3d_canvas/create_layer_items.cpp
3d_canvas/create_3Dgraphic_brd_items.cpp 3d_canvas/create_3Dgraphic_brd_items.cpp
3d_canvas/create_layer_poly.cpp 3d_canvas/create_layer_poly.cpp

View File

@ -128,7 +128,7 @@ public:
m_schSettings = *static_cast<const SCH_RENDER_SETTINGS*>( aSettings ); m_schSettings = *static_cast<const SCH_RENDER_SETTINGS*>( aSettings );
} }
/// @copydoc PAINTER::GetSettings() /// @copydoc PAINTER::GetAdapter()
virtual SCH_RENDER_SETTINGS* GetSettings() override virtual SCH_RENDER_SETTINGS* GetSettings() override
{ {
return &m_schSettings; return &m_schSettings;

View File

@ -268,7 +268,7 @@
<property name="id">ID_MENU_SET_SIMUL</property> <property name="id">ID_MENU_SET_SIMUL</property>
<property name="kind">wxITEM_NORMAL</property> <property name="kind">wxITEM_NORMAL</property>
<property name="label">Settings...</property> <property name="label">Settings...</property>
<property name="name">m_settings</property> <property name="name">m_boardAdapter</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="shortcut"></property> <property name="shortcut"></property>
<property name="unchecked_bitmap"></property> <property name="unchecked_bitmap"></property>

View File

@ -127,7 +127,7 @@ private:
wxString getTextFromField( const SCH_REFERENCE& aRef, const NumFieldType aField ); wxString getTextFromField( const SCH_REFERENCE& aRef, const NumFieldType aField );
/** /**
* @brief Check if modules has different data. Check only if corresponding \ref m_settings * @brief Check if modules has different data. Check only if corresponding \ref m_boardAdapter
* flag is rised * flag is rised
* @param aFirst first module to compare * @param aFirst first module to compare
* @param aSecond second module to compare * @param aSecond second module to compare

View File

@ -175,7 +175,7 @@ public:
m_gerbviewSettings = *static_cast<const GERBVIEW_RENDER_SETTINGS*>( aSettings ); m_gerbviewSettings = *static_cast<const GERBVIEW_RENDER_SETTINGS*>( aSettings );
} }
/// @copydoc PAINTER::GetSettings() /// @copydoc PAINTER::GetAdapter()
virtual GERBVIEW_RENDER_SETTINGS* GetSettings() override virtual GERBVIEW_RENDER_SETTINGS* GetSettings() override
{ {
return &m_gerbviewSettings; return &m_gerbviewSettings;

View File

@ -338,7 +338,7 @@ public:
virtual void ApplySettings( const RENDER_SETTINGS* aSettings ) = 0; virtual void ApplySettings( const RENDER_SETTINGS* aSettings ) = 0;
/** /**
* Function GetSettings * Function GetAdapter
* Returns pointer to current settings that are going to be used when drawing items. * Returns pointer to current settings that are going to be used when drawing items.
* @return Current rendering settings. * @return Current rendering settings.
*/ */

View File

@ -145,7 +145,7 @@ public:
return m_toolMgr; return m_toolMgr;
} }
//TOOL_SETTINGS& GetSettings(); //TOOL_SETTINGS& GetAdapter();
bool IsToolActive() const; bool IsToolActive() const;

View File

@ -114,7 +114,7 @@ public:
m_renderSettings = *static_cast<const WS_RENDER_SETTINGS*>( aSettings ); m_renderSettings = *static_cast<const WS_RENDER_SETTINGS*>( aSettings );
} }
/// @copydoc PAINTER::GetSettings() /// @copydoc PAINTER::GetAdapter()
virtual RENDER_SETTINGS* GetSettings() override { return &m_renderSettings; } virtual RENDER_SETTINGS* GetSettings() override { return &m_renderSettings; }
private: private:

View File

@ -232,7 +232,7 @@ public:
m_pcbSettings = *static_cast<const PCB_RENDER_SETTINGS*>( aSettings ); m_pcbSettings = *static_cast<const PCB_RENDER_SETTINGS*>( aSettings );
} }
/// @copydoc PAINTER::GetSettings() /// @copydoc PAINTER::GetAdapter()
virtual PCB_RENDER_SETTINGS* GetSettings() override virtual PCB_RENDER_SETTINGS* GetSettings() override
{ {
return &m_pcbSettings; return &m_pcbSettings;