KiCad PCB EDA Suite
EDA_3D_CANVAS Class Reference

Implement a canvas based on a wxGLCanvas. More...

#include <eda_3d_canvas.h>

Inheritance diagram for EDA_3D_CANVAS:
HIDPI_GL_CANVAS

Public Member Functions

 EDA_3D_CANVAS (wxWindow *aParent, const int *aAttribList, BOARD *aBoard, BOARD_ADAPTER &aSettings, CAMERA &aCamera, S3D_CACHE *a3DCachePointer)
 Create a new 3D Canvas with an attribute list. More...
 
 ~EDA_3D_CANVAS ()
 
void SetEventDispatcher (TOOL_DISPATCHER *aEventDispatcher)
 Set a dispatcher that processes events and forwards them to tools. More...
 
void SetStatusBar (wxStatusBar *aStatusBar)
 
void SetInfoBar (WX_INFOBAR *aInfoBar)
 
void ReloadRequest (BOARD *aBoard=nullptr, S3D_CACHE *aCachePointer=nullptr)
 
bool IsReloadRequestPending () const
 Query if there is a pending reload request. More...
 
void RenderRaytracingRequest ()
 Request to render the current view in Raytracing mode. More...
 
void GetScreenshot (wxImage &aDstImage)
 Request a screenshot and output it to the aDstImage. More...
 
bool SetView3D (int aKeycode)
 Helper function to call view commands. More...
 
void AnimationEnabledSet (bool aAnimationEnabled)
 Enable or disable camera animation when switching to a pre-defined view. More...
 
bool AnimationEnabledGet () const
 Return whether camera animation is enabled when switching to a pre-defined view. More...
 
void MovingSpeedMultiplierSet (int aMovingSpeedMultiplier)
 Set the camera animation moving speed multiplier option. More...
 
int MovingSpeedMultiplierGet () const
 Return the current camera animation moving speed multiplier option. More...
 
void RenderEngineChanged ()
 Notify that the render engine was changed. More...
 
void DisplayStatus ()
 Update the status bar with the position information. More...
 
void Request_refresh (bool aRedrawImmediately=true)
 Schedule a refresh update of the canvas. More...
 
void OnEvent (wxEvent &aEvent)
 Used to forward events to the canvas from popups, etc. More...
 
virtual wxSize GetNativePixelSize () const
 
void SetScaleFactor (double aFactor)
 Set the canvas scale factor, probably for a hi-DPI display. More...
 
double GetScaleFactor () const
 Get the current scale factor. More...
 

Private Member Functions

void OnPaint (wxPaintEvent &aEvent)
 Called by a wxPaintEvent event. More...
 
void DoRePaint ()
 The actual function to repaint the canvas. More...
 
void OnEraseBackground (wxEraseEvent &event)
 
void OnRefreshRequest (wxEvent &aEvent)
 
void OnMouseWheel (wxMouseEvent &event)
 
void OnMouseMove (wxMouseEvent &event)
 
void OnLeftDown (wxMouseEvent &event)
 
void OnLeftUp (wxMouseEvent &event)
 
void OnMiddleUp (wxMouseEvent &event)
 
void OnMiddleDown (wxMouseEvent &event)
 
void OnTimerTimeout_Editing (wxTimerEvent &event)
 
void OnCloseWindow (wxCloseEvent &event)
 
void OnResize (wxSizeEvent &event)
 
void OnTimerTimeout_Redraw (wxTimerEvent &event)
 
void stop_editingTimeOut_Timer ()
 Stop the editing time so it will not timeout. More...
 
void restart_editingTimeOut_Timer ()
 Reset the editing timer. More...
 
void request_start_moving_camera (float aMovingSpeed=2.0f, bool aRenderPivot=true)
 Start a camera movement. More...
 
void move_pivot_based_on_cur_mouse_position ()
 This function hits a ray to the board and start a movement. More...
 
void render_pivot (float t, float aScale)
 Render the pivot cursor. More...
 
bool initializeOpenGL ()
 
void releaseOpenGL ()
 Free created targets and openGL context. More...
 
RAY getRayAtCurrrentMousePosition ()
 

Private Attributes

TOOL_DISPATCHERm_eventDispatcher
 
wxStatusBar * m_parentStatusBar
 
WX_INFOBARm_parentInfoBar
 
wxGLContext * m_glRC
 
bool m_is_opengl_initialized
 
bool m_is_opengl_version_supported
 
wxTimer m_editing_timeout_timer
 
wxTimer m_redraw_trigger_timer
 
std::atomic_flag m_is_currently_painting
 
bool m_mouse_is_moving
 
bool m_mouse_was_moved
 
bool m_camera_is_moving
 
bool m_render_pivot
 
float m_camera_moving_speed
 
unsigned m_strtime_camera_movement
 
bool m_animation_enabled
 
int m_moving_speed_multiplier
 
BOARD_ADAPTERm_boardAdapter
 
CAMERAm_camera
 
RENDER_3D_BASEm_3d_render
 
RENDER_3D_RAYTRACEm_3d_render_raytracing
 
RENDER_3D_LEGACYm_3d_render_ogl_legacy
 
bool m_opengl_supports_raytracing
 
bool m_render_raytracing_was_requested
 
CONTAINER_3D m_3DShapes_container
 
ACCELERATOR_3Dm_accelerator3DShapes
 
BOARD_ITEMm_currentIntersectedBoardItem
 

Static Private Attributes

static const float m_delta_move_step_factor = 0.7f
 
static const wxChar * m_logTrace = wxT( "KI_TRACE_EDA_3D_CANVAS" )
 Trace mask used to enable or disable the trace output of this class. More...
 

Detailed Description

Implement a canvas based on a wxGLCanvas.

Definition at line 48 of file eda_3d_canvas.h.

Constructor & Destructor Documentation

◆ EDA_3D_CANVAS()

EDA_3D_CANVAS::EDA_3D_CANVAS ( wxWindow *  aParent,
const int *  aAttribList,
BOARD aBoard,
BOARD_ADAPTER aSettings,
CAMERA aCamera,
S3D_CACHE a3DCachePointer 
)

Create a new 3D Canvas with an attribute list.

Parameters
aParentthe parent creator of this canvas.
aAttribLista list of openGL options created by GetOpenGL_AttributesList.
aBoardThe board.
aSettingsthe settings options to be used by this canvas.

Definition at line 89 of file eda_3d_canvas.cpp.

92  : HIDPI_GL_CANVAS( aParent, wxID_ANY, aAttribList, wxDefaultPosition, wxDefaultSize,
93  wxFULL_REPAINT_ON_RESIZE ),
94  m_eventDispatcher( nullptr ),
95  m_parentStatusBar( nullptr ),
96  m_parentInfoBar( nullptr ),
97  m_glRC( nullptr ),
98  m_is_opengl_initialized( false ),
100  m_mouse_is_moving( false ),
101  m_mouse_was_moved( false ),
102  m_camera_is_moving( false ),
103  m_render_pivot( false ),
104  m_camera_moving_speed( 1.0f ),
106  m_animation_enabled( true ),
108  m_boardAdapter( aBoardAdapter ),
109  m_camera( aCamera ),
110  m_3d_render( nullptr ),
113  m_accelerator3DShapes( nullptr ),
115 {
116  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::EDA_3D_CANVAS" );
117 
118  m_editing_timeout_timer.SetOwner( this );
119  Connect( m_editing_timeout_timer.GetId(), wxEVT_TIMER,
120  wxTimerEventHandler( EDA_3D_CANVAS::OnTimerTimeout_Editing ), nullptr, this );
121 
122  m_redraw_trigger_timer.SetOwner( this );
123  Connect( m_redraw_trigger_timer.GetId(), wxEVT_TIMER,
124  wxTimerEventHandler( EDA_3D_CANVAS::OnTimerTimeout_Redraw ), nullptr, this );
125 
126  m_is_currently_painting.clear();
127 
130 
131  wxASSERT( m_3d_render_raytracing != nullptr );
132  wxASSERT( m_3d_render_ogl_legacy != nullptr );
133 
134  auto busy_indicator_factory = []() { return std::make_unique<WX_BUSY_INDICATOR>(); };
135 
136  m_3d_render_raytracing->SetBusyIndicatorFactory( busy_indicator_factory );
137  m_3d_render_ogl_legacy->SetBusyIndicatorFactory( busy_indicator_factory );
138 
140 
141  wxASSERT( aBoard != nullptr );
142  m_boardAdapter.SetBoard( aBoard );
143 
144  m_boardAdapter.SetColorSettings( Pgm().GetSettingsManager().GetColorSettings() );
145 
146  wxASSERT( a3DCachePointer != nullptr );
147  m_boardAdapter.Set3dCacheManager( a3DCachePointer );
148 
149  const wxEventType events[] =
150  {
151  // Binding both EVT_CHAR and EVT_CHAR_HOOK ensures that all key events,
152  // especially special key like arrow keys, are handled by the GAL event dispatcher,
153  // and not sent to GUI without filtering, because they have a default action (scroll)
154  // that must not be called.
155  wxEVT_LEFT_UP, wxEVT_LEFT_DOWN, wxEVT_LEFT_DCLICK,
156  wxEVT_RIGHT_UP, wxEVT_RIGHT_DOWN, wxEVT_RIGHT_DCLICK,
157  wxEVT_MIDDLE_UP, wxEVT_MIDDLE_DOWN, wxEVT_MIDDLE_DCLICK,
158  wxEVT_MOTION, wxEVT_MOUSEWHEEL, wxEVT_CHAR, wxEVT_CHAR_HOOK,
159 #if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
160  wxEVT_MAGNIFY,
161 #endif
162  wxEVT_MENU_OPEN, wxEVT_MENU_CLOSE, wxEVT_MENU_HIGHLIGHT
163  };
164 
165  for( wxEventType eventType : events )
166  Connect( eventType, wxEventHandler( EDA_3D_CANVAS::OnEvent ), nullptr, m_eventDispatcher );
167 }
bool m_mouse_is_moving
unsigned m_strtime_camera_movement
WX_INFOBAR * m_parentInfoBar
wxStatusBar * m_parentStatusBar
wxGLContext * m_glRC
wxTimer m_editing_timeout_timer
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
BOARD_ITEM * m_currentIntersectedBoardItem
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:102
void SetBoard(BOARD *aBoard) noexcept
Set current board to be rendered.
BOARD_ADAPTER & m_boardAdapter
float m_camera_moving_speed
bool m_is_opengl_version_supported
HIDPI_GL_CANVAS(wxWindow *parent, wxWindowID id=wxID_ANY, const int *attribList=NULL, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=0, const wxString &name=wxGLCanvasName, const wxPalette &palette=wxNullPalette)
RENDER_3D_LEGACY * m_3d_render_ogl_legacy
void Set3dCacheManager(S3D_CACHE *aCachePointer) noexcept
Update the cache manager pointer.
Definition: board_adapter.h:79
bool m_mouse_was_moved
void RenderEngineChanged()
Notify that the render engine was changed.
RENDER_3D_RAYTRACE * m_3d_render_raytracing
Object to render the board using openGL legacy mode.
bool m_camera_is_moving
RENDER_3D_BASE * m_3d_render
void SetBusyIndicatorFactory(BUSY_INDICATOR::FACTORY aNewFactory)
Set a new busy indicator factory.
void OnTimerTimeout_Redraw(wxTimerEvent &event)
SETTINGS_MANAGER * GetSettingsManager()
bool m_animation_enabled
bool m_is_opengl_initialized
TOOL_DISPATCHER * m_eventDispatcher
int m_moving_speed_multiplier
void OnEvent(wxEvent &aEvent)
Used to forward events to the canvas from popups, etc.
bool m_opengl_supports_raytracing
ACCELERATOR_3D * m_accelerator3DShapes
std::atomic_flag m_is_currently_painting
void OnTimerTimeout_Editing(wxTimerEvent &event)
void SetColorSettings(COLOR_SETTINGS *aSettings) noexcept
CAMERA & m_camera
wxTimer m_redraw_trigger_timer
bool m_render_raytracing_was_requested

References GetSettingsManager(), OnEvent(), OnTimerTimeout_Editing(), OnTimerTimeout_Redraw(), and Pgm().

◆ ~EDA_3D_CANVAS()

EDA_3D_CANVAS::~EDA_3D_CANVAS ( )

Definition at line 170 of file eda_3d_canvas.cpp.

171 {
172  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::~EDA_3D_CANVAS" );
173 
174  delete m_accelerator3DShapes;
175  m_accelerator3DShapes = nullptr;
176 
177  releaseOpenGL();
178 }
void releaseOpenGL()
Free created targets and openGL context.
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
ACCELERATOR_3D * m_accelerator3DShapes

References m_accelerator3DShapes, m_logTrace, and releaseOpenGL().

Member Function Documentation

◆ AnimationEnabledGet()

bool EDA_3D_CANVAS::AnimationEnabledGet ( ) const
inline

Return whether camera animation is enabled when switching to a pre-defined view.

Returns
true if animation is enabled.

Definition at line 131 of file eda_3d_canvas.h.

131 { return m_animation_enabled; }
bool m_animation_enabled

References m_animation_enabled.

Referenced by EDA_3D_VIEWER::SaveSettings(), and DIALOG_3D_VIEW_OPTIONS::TransferDataToWindow().

◆ AnimationEnabledSet()

void EDA_3D_CANVAS::AnimationEnabledSet ( bool  aAnimationEnabled)
inline

Enable or disable camera animation when switching to a pre-defined view.

Parameters
aAnimationEnabledanimation enabled state to set.

Definition at line 124 of file eda_3d_canvas.h.

124 { m_animation_enabled = aAnimationEnabled; }
bool m_animation_enabled

References m_animation_enabled.

Referenced by EDA_3D_VIEWER::LoadSettings(), and DIALOG_3D_VIEW_OPTIONS::TransferDataFromWindow().

◆ DisplayStatus()

void EDA_3D_CANVAS::DisplayStatus ( )

Update the status bar with the position information.

Definition at line 326 of file eda_3d_canvas.cpp.

327 {
328  if( m_parentStatusBar )
329  {
330  wxString msg;
331 
332  msg.Printf( "dx %3.2f", m_camera.GetCameraPos().x );
333  m_parentStatusBar->SetStatusText( msg, static_cast<int>( EDA_3D_VIEWER_STATUSBAR::X_POS ) );
334 
335  msg.Printf( "dy %3.2f", m_camera.GetCameraPos().y );
336  m_parentStatusBar->SetStatusText( msg, static_cast<int>( EDA_3D_VIEWER_STATUSBAR::Y_POS ) );
337  }
338 }
wxStatusBar * m_parentStatusBar
const SFVEC3F & GetCameraPos() const
Definition: camera.h:132
CAMERA & m_camera

References CAMERA::GetCameraPos(), m_camera, m_parentStatusBar, X_POS, and Y_POS.

Referenced by DoRePaint(), EDA_3D_CONTROLLER::doZoomInOut(), OnMouseMove(), OnMouseWheel(), request_start_moving_camera(), SetView3D(), and EDA_3D_CONTROLLER::ZoomFitScreen().

◆ DoRePaint()

void EDA_3D_CANVAS::DoRePaint ( )
private

The actual function to repaint the canvas.

It is usually called by OnPaint() but because it does not use a wxPaintDC it can be called outside a wxPaintEvent

Definition at line 348 of file eda_3d_canvas.cpp.

349 {
350  if( m_is_currently_painting.test_and_set() )
351  return;
352 
353  // SwapBuffer requires the window to be shown before calling
354  if( !IsShownOnScreen() )
355  {
356  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::DoRePaint !IsShown" );
357  m_is_currently_painting.clear();
358  return;
359  }
360 
361  // Because the board to draw is handled by the parent viewer frame,
362  // ensure this parent is still alive. When it is closed before the viewer
363  // frame, a paint event can be generated after the parent is closed,
364  // therefore with invalid board.
365  // This is dependent of the platform.
366  // Especially on OSX, but also on Windows, it frequently happens
367  if( !GetParent()->GetParent()->IsShown() )
368  return; // The parent board editor frame is no more alive
369 
370  wxString err_messages;
371 
372  // !TODO: implement error reporter
373  INFOBAR_REPORTER warningReporter( m_parentInfoBar );
374  STATUSBAR_REPORTER activityReporter( m_parentStatusBar,
376 
377  unsigned strtime = GetRunningMicroSecs();
378 
379  // "Makes the OpenGL state that is represented by the OpenGL rendering
380  // context context current, i.e. it will be used by all subsequent OpenGL calls.
381  // This function may only be called when the window is shown on screen"
382 
383  // Explicitly create a new rendering context instance for this canvas.
384  if( m_glRC == nullptr )
386 
388 
389  // Set the OpenGL viewport according to the client size of this canvas.
390  // This is done here rather than in a wxSizeEvent handler because our
391  // OpenGL rendering context (and thus viewport setting) is used with
392  // multiple canvases: If we updated the viewport in the wxSizeEvent
393  // handler, changing the size of one canvas causes a viewport setting that
394  // is wrong when next another canvas is repainted.
395  wxSize clientSize = GetNativePixelSize();
396 
397  const bool windows_size_changed = m_camera.SetCurWindowSize( clientSize );
398 
399  // Initialize openGL if need
401  {
402  if( !initializeOpenGL() )
403  {
405  m_is_currently_painting.clear();
406 
407  return;
408  }
409 
411  {
412  warningReporter.Report( _( "Your OpenGL version is not supported. Minimum required "
413  "is 1.5" ), RPT_SEVERITY_ERROR );
414 
415  warningReporter.Finalize();
416  }
417  }
418 
420  {
421  glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
422  glClear( GL_COLOR_BUFFER_BIT );
423 
424  SwapBuffers();
425 
427  m_is_currently_painting.clear();
428 
429  return;
430  }
431 
432  // Don't attend to ray trace if OpenGL doesn't support it.
434  {
438  }
439 
440  // Check if a raytacing was requested and need to switch to raytracing mode
442  {
443  const bool was_camera_changed = m_camera.ParametersChanged();
444 
445  // It reverts back to OpenGL mode if it was requested a raytracing
446  // render of the current scene. AND the mouse / camera is moving
447  if( ( m_mouse_is_moving || m_camera_is_moving || was_camera_changed
448  || windows_size_changed )
450  {
453  }
454  }
455 
456  float curtime_delta_s = 0.0f;
457 
458  if( m_camera_is_moving )
459  {
460  const unsigned curtime_delta = GetRunningMicroSecs() - m_strtime_camera_movement;
461  curtime_delta_s = (curtime_delta / 1e6) * m_camera_moving_speed;
462  m_camera.Interpolate( curtime_delta_s );
463 
464  if( curtime_delta_s > 1.0f )
465  {
466  m_render_pivot = false;
467  m_camera_is_moving = false;
468  m_mouse_was_moved = true;
469 
471  DisplayStatus();
472  }
473  else
474  {
475  Request_refresh();
476  }
477  }
478 
479  // It will return true if the render request a new redraw
480  bool requested_redraw = false;
481 
482  if( m_3d_render )
483  {
484  try
485  {
486  m_3d_render->SetCurWindowSize( clientSize );
487 
488  bool reloadRaytracingForIntersectionCalculations = false;
489 
492  {
493  reloadRaytracingForIntersectionCalculations = true;
494  }
495 
496  requested_redraw = m_3d_render->Redraw( m_mouse_was_moved || m_camera_is_moving,
497  &activityReporter, &warningReporter );
498 
499  if( reloadRaytracingForIntersectionCalculations )
500  m_3d_render_raytracing->Reload( nullptr, nullptr, true );
501  }
502  catch( std::runtime_error& err )
503  {
506  m_is_opengl_initialized = false;
508  m_is_currently_painting.clear();
509  return;
510  }
511  }
512 
513  if( m_render_pivot )
514  {
515  const float scale = glm::min( m_camera.ZoomGet(), 1.0f );
516  render_pivot( curtime_delta_s, scale * scale );
517  }
518 
519  // "Swaps the double-buffer of this window, making the back-buffer the
520  // front-buffer and vice versa, so that the output of the previous OpenGL
521  // commands is displayed on the window."
522  SwapBuffers();
523 
525 
526  if( !activityReporter.HasMessage() )
527  {
529  {
530  // Calculation time in milliseconds
531  const double calculation_time = (double)( GetRunningMicroSecs() - strtime) / 1e3;
532 
533  activityReporter.Report( wxString::Format( _( "Render time %.0f ms ( %.1f fps)" ),
534  calculation_time, 1000.0 / calculation_time ) );
535  }
536  }
537 
538  // This will reset the flag of camera parameters changed
540 
541  warningReporter.Finalize();
542 
543  if( !err_messages.IsEmpty() )
544  wxLogMessage( err_messages );
545 
546  if( ( !m_camera_is_moving ) && requested_redraw )
547  {
548  m_mouse_was_moved = false;
549  Request_refresh( false );
550  }
551 
552  m_is_currently_painting.clear();
553 }
A wrapper for reporting to a specific text location in a statusbar.
Definition: reporter.h:262
virtual wxSize GetNativePixelSize() const
bool IsReloadRequestPending() const
Query if there is a pending reload request.
bool m_mouse_is_moving
unsigned m_strtime_camera_movement
WX_INFOBAR * m_parentInfoBar
wxStatusBar * m_parentStatusBar
virtual void SetCurWindowSize(const wxSize &aSize)=0
Before each render, the canvas will tell the render what is the size of its windows,...
wxGLContext * m_glRC
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
void DisplayStatus()
Update the status bar with the position information.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
void UnlockCtx(wxGLContext *aContext)
Allow other canvases to bind an OpenGL context.
BOARD_ADAPTER & m_boardAdapter
float m_camera_moving_speed
RENDER_ENGINE GetRenderEngine() const noexcept
bool m_is_opengl_version_supported
static GL_CONTEXT_MANAGER & Get()
Return the GL_CONTEXT_MANAGER instance (singleton).
void restart_editingTimeOut_Timer()
Reset the editing timer.
RENDER_3D_LEGACY * m_3d_render_ogl_legacy
bool m_mouse_was_moved
RENDER_3D_RAYTRACE * m_3d_render_raytracing
bool m_camera_is_moving
RENDER_3D_BASE * m_3d_render
virtual bool Redraw(bool aIsMoving, REPORTER *aStatusReporter=nullptr, REPORTER *aWarningReporter=nullptr)=0
Redraw the view.
void Reload(REPORTER *aStatusReporter, REPORTER *aWarningReporter, bool aOnlyLoadCopperAndShapes)
wxGLContext * CreateCtx(wxGLCanvas *aCanvas, const wxGLContext *aOther=nullptr)
Create a managed OpenGL context.
float ZoomGet() const
Definition: camera.cpp:504
void SetRenderEngine(RENDER_ENGINE aRenderEngine) noexcept
void LockCtx(wxGLContext *aContext, wxGLCanvas *aCanvas)
Set a context as current and prevents other canvases from switching it.
bool m_is_opengl_initialized
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
bool SetCurWindowSize(const wxSize &aSize)
Update the windows size of the camera.
Definition: camera.cpp:435
const int scale
bool initializeOpenGL()
bool m_opengl_supports_raytracing
std::atomic_flag m_is_currently_painting
virtual void Interpolate(float t)
It will update the matrix to interpolate between T0 and T1 values.
Definition: camera.cpp:563
#define _(s)
Definition: 3d_actions.cpp:33
unsigned GetRunningMicroSecs()
An alternate way to calculate an elapset time (in microsecondes) to class PROF_COUNTER.
bool ParametersChanged()
Definition: camera.cpp:581
CAMERA & m_camera
void render_pivot(float t, float aScale)
Render the pivot cursor.
A wrapper for reporting to a WX_INFOBAR UI element.
Definition: reporter.h:291
bool m_render_raytracing_was_requested

References _, GL_CONTEXT_MANAGER::CreateCtx(), DisplayStatus(), INFOBAR_REPORTER::Finalize(), Format(), GL_CONTEXT_MANAGER::Get(), HIDPI_GL_CANVAS::GetNativePixelSize(), BOARD_ADAPTER::GetRenderEngine(), GetRunningMicroSecs(), STATUSBAR_REPORTER::HasMessage(), initializeOpenGL(), CAMERA::Interpolate(), RENDER_3D_BASE::IsReloadRequestPending(), GL_CONTEXT_MANAGER::LockCtx(), m_3d_render, m_3d_render_ogl_legacy, m_3d_render_raytracing, m_boardAdapter, m_camera, m_camera_is_moving, m_camera_moving_speed, m_glRC, m_is_currently_painting, m_is_opengl_initialized, m_is_opengl_version_supported, m_logTrace, m_mouse_is_moving, m_mouse_was_moved, m_opengl_supports_raytracing, m_parentInfoBar, m_parentStatusBar, m_render_pivot, m_render_raytracing_was_requested, m_strtime_camera_movement, OPENGL_LEGACY, CAMERA::ParametersChanged(), RENDER_3D_BASE::Redraw(), RENDER_3D_RAYTRACE::Reload(), render_pivot(), STATUSBAR_REPORTER::Report(), INFOBAR_REPORTER::Report(), Request_refresh(), restart_editingTimeOut_Timer(), RPT_SEVERITY_ERROR, scale, RENDER_3D_BASE::SetCurWindowSize(), CAMERA::SetCurWindowSize(), BOARD_ADAPTER::SetRenderEngine(), STATUS_TEXT, GL_CONTEXT_MANAGER::UnlockCtx(), and CAMERA::ZoomGet().

Referenced by OnPaint(), and OnRefreshRequest().

◆ GetNativePixelSize()

wxSize HIDPI_GL_CANVAS::GetNativePixelSize ( ) const
virtualinherited

Definition at line 46 of file hidpi_gl_canvas.cpp.

47 {
48  wxSize size = wxGLCanvas::GetClientSize();
49 
50  const double scaleFactor = GetScaleFactor();
51  size.x *= scaleFactor;
52  size.y *= scaleFactor;
53 
54  return size;
55 }
double GetScaleFactor() const
Get the current scale factor.

References HIDPI_GL_CANVAS::GetScaleFactor().

Referenced by DoRePaint(), OnMouseMove(), and KIGFX::OPENGL_GAL::OPENGL_GAL().

◆ getRayAtCurrrentMousePosition()

RAY EDA_3D_CANVAS::getRayAtCurrrentMousePosition ( )
private

Definition at line 1141 of file eda_3d_canvas.cpp.

1142 {
1143  SFVEC3F rayOrigin;
1144  SFVEC3F rayDir;
1145 
1146  // Generate a ray origin and direction based on current mouser position and camera
1147  m_camera.MakeRayAtCurrrentMousePosition( rayOrigin, rayDir );
1148 
1149  RAY mouseRay;
1150  mouseRay.Init( rayOrigin, rayDir );
1151 
1152  return mouseRay;
1153 }
void Init(const SFVEC3F &o, const SFVEC3F &d)
Definition: ray.cpp:41
Definition: ray.h:67
void MakeRayAtCurrrentMousePosition(SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
Make a ray based on the latest mouse position.
Definition: camera.cpp:364
glm::vec3 SFVEC3F
Definition: xv3d_types.h:47
CAMERA & m_camera

References RAY::Init(), m_camera, and CAMERA::MakeRayAtCurrrentMousePosition().

Referenced by move_pivot_based_on_cur_mouse_position(), OnLeftDown(), and OnMouseMove().

◆ GetScaleFactor()

double HIDPI_GL_CANVAS::GetScaleFactor ( ) const
inherited

◆ GetScreenshot()

void EDA_3D_CANVAS::GetScreenshot ( wxImage &  aDstImage)

Request a screenshot and output it to the aDstImage.

Parameters
aDstImage- Screenshot destination image

Definition at line 292 of file eda_3d_canvas.cpp.

293 {
294  OglGetScreenshot( aDstImage );
295 }
void OglGetScreenshot(wxImage &aDstImage)
Get the pixel data of current OpenGL image.
Definition: ogl_utils.cpp:36

References OglGetScreenshot().

Referenced by EDA_3D_VIEWER::takeScreenshot().

◆ initializeOpenGL()

bool EDA_3D_CANVAS::initializeOpenGL ( )
private
Returns
true if OpenGL initialization succeeded.

Definition at line 217 of file eda_3d_canvas.cpp.

218 {
219  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::initializeOpenGL" );
220 
221  const GLenum err = glewInit();
222 
223  if( GLEW_OK != err )
224  {
225  const wxString msgError = (const char*) glewGetErrorString( err );
226 
227  wxLogMessage( msgError );
228 
229  return false;
230  }
231  else
232  {
233  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::initializeOpenGL Using GLEW version %s",
234  FROM_UTF8( (char*) glewGetString( GLEW_VERSION ) ) );
235  }
236 
237  wxString version = FROM_UTF8( (char *) glGetString( GL_VERSION ) );
238 
239  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::%s OpenGL version string %s.",
240  __WXFUNCTION__, version );
241 
242  // Extract OpenGL version from string. This method is used because prior to OpenGL 2,
243  // getting the OpenGL major and minor version as integers didn't exist.
244  wxString tmp;
245 
246  wxStringTokenizer tokenizer( version );
247 
248  if( tokenizer.HasMoreTokens() )
249  {
250  long major = 0;
251  long minor = 0;
252 
253  tmp = tokenizer.GetNextToken();
254 
255  tokenizer.SetString( tmp, wxString( "." ) );
256 
257  if( tokenizer.HasMoreTokens() )
258  tokenizer.GetNextToken().ToLong( &major );
259 
260  if( tokenizer.HasMoreTokens() )
261  tokenizer.GetNextToken().ToLong( &minor );
262 
263  if( major < 2 || ( ( major == 2 ) && ( minor < 1 ) ) )
264  {
265  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::%s OpenGL ray tracing not supported.",
266  __WXFUNCTION__ );
267 
268  if( GetParent() )
269  {
270  wxCommandEvent evt( wxEVT_MENU, ID_DISABLE_RAY_TRACING );
271  GetParent()->ProcessWindowEvent( evt );
272  }
273 
275  }
276 
277  if( ( major == 1 ) && ( minor < 5 ) )
278  {
279  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::%s OpenGL not supported.", __WXFUNCTION__ );
280 
282  }
283  }
284 
287 
288  return true;
289 }
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
Definition: macros.h:110
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
bool m_is_opengl_version_supported
bool m_is_opengl_initialized
bool m_opengl_supports_raytracing
static int SetSwapInterval(int aVal)
Attempts to set the OpenGL swap interval.
Definition: gl_utils.h:40

References FROM_UTF8(), ID_DISABLE_RAY_TRACING, m_is_opengl_initialized, m_is_opengl_version_supported, m_logTrace, m_opengl_supports_raytracing, and GL_UTILS::SetSwapInterval().

Referenced by DoRePaint().

◆ IsReloadRequestPending()

bool EDA_3D_CANVAS::IsReloadRequestPending ( ) const
inline

Query if there is a pending reload request.

Returns
true if it wants to reload, false if there is no reload pending.

Definition at line 91 of file eda_3d_canvas.h.

92  {
93  if( m_3d_render )
95  else
96  return false;
97  }
bool IsReloadRequestPending() const
Query if there is a pending reload request.
RENDER_3D_BASE * m_3d_render

References RENDER_3D_BASE::IsReloadRequestPending(), and m_3d_render.

Referenced by EDA_3D_VIEWER::OnActivate().

◆ move_pivot_based_on_cur_mouse_position()

void EDA_3D_CANVAS::move_pivot_based_on_cur_mouse_position ( )
private

This function hits a ray to the board and start a movement.

Definition at line 942 of file eda_3d_canvas.cpp.

943 {
944  RAY mouseRay = getRayAtCurrrentMousePosition();
945 
946  float hit_t;
947 
948  // Test it with the board bounding box
949  if( m_boardAdapter.GetBBox().Intersect( mouseRay, &hit_t ) )
950  {
953  m_camera.SetLookAtPos_T1( mouseRay.at( hit_t ) );
955 
957  }
958 }
void SetLookAtPos_T1(const SFVEC3F &aLookAtPos)
Definition: camera.h:125
void request_start_moving_camera(float aMovingSpeed=2.0f, bool aRenderPivot=true)
Start a camera movement.
RAY getRayAtCurrrentMousePosition()
bool Intersect(const RAY &aRay, float *t) const
Definition: bbox_3d_ray.cpp:46
Definition: ray.h:67
SFVEC3F at(float t) const
Definition: ray.h:89
BOARD_ADAPTER & m_boardAdapter
void SetInterpolateMode(CAMERA_INTERPOLATION aInterpolateMode)
Definition: camera.h:197
const BBOX_3D & GetBBox() const noexcept
Get the board outling bounding box.
virtual void SetT0_and_T1_current_T()
This will set T0 and T1 with the current values.
Definition: camera.cpp:549
void ResetXYpos_T1()
Definition: camera.cpp:399
CAMERA & m_camera

References RAY::at(), BEZIER, BOARD_ADAPTER::GetBBox(), getRayAtCurrrentMousePosition(), BBOX_3D::Intersect(), m_boardAdapter, m_camera, request_start_moving_camera(), CAMERA::ResetXYpos_T1(), CAMERA::SetInterpolateMode(), CAMERA::SetLookAtPos_T1(), and CAMERA::SetT0_and_T1_current_T().

Referenced by OnMiddleUp(), and SetView3D().

◆ MovingSpeedMultiplierGet()

int EDA_3D_CANVAS::MovingSpeedMultiplierGet ( ) const
inline

Return the current camera animation moving speed multiplier option.

Returns
current moving speed multiplier option, one of [1,2,3,4,5].

Definition at line 148 of file eda_3d_canvas.h.

148 { return m_moving_speed_multiplier; }
int m_moving_speed_multiplier

References m_moving_speed_multiplier.

Referenced by EDA_3D_VIEWER::SaveSettings(), and DIALOG_3D_VIEW_OPTIONS::TransferDataToWindow().

◆ MovingSpeedMultiplierSet()

void EDA_3D_CANVAS::MovingSpeedMultiplierSet ( int  aMovingSpeedMultiplier)
inline

Set the camera animation moving speed multiplier option.

Parameters
aMovingSpeedMultiplierone of the possible integer options: [1,2,3,4,5].

Definition at line 138 of file eda_3d_canvas.h.

139  {
140  m_moving_speed_multiplier = aMovingSpeedMultiplier;
141  }
int m_moving_speed_multiplier

References m_moving_speed_multiplier.

Referenced by EDA_3D_VIEWER::LoadSettings(), and DIALOG_3D_VIEW_OPTIONS::TransferDataFromWindow().

◆ OnCloseWindow()

void EDA_3D_CANVAS::OnCloseWindow ( wxCloseEvent &  event)
private

Definition at line 203 of file eda_3d_canvas.cpp.

204 {
205  releaseOpenGL();
206 
207  event.Skip();
208 }
void releaseOpenGL()
Free created targets and openGL context.

References releaseOpenGL().

◆ OnEraseBackground()

void EDA_3D_CANVAS::OnEraseBackground ( wxEraseEvent &  event)
private

Definition at line 587 of file eda_3d_canvas.cpp.

588 {
589  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::OnEraseBackground" );
590  // Do nothing, to avoid flashing.
591 }
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.

References m_logTrace.

◆ OnEvent()

void EDA_3D_CANVAS::OnEvent ( wxEvent &  aEvent)

Used to forward events to the canvas from popups, etc.

Definition at line 576 of file eda_3d_canvas.cpp.

577 {
578  if( !m_eventDispatcher )
579  aEvent.Skip();
580  else
582 
583  Refresh();
584 }
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
virtual void DispatchWxEvent(wxEvent &aEvent)
Process wxEvents (mostly UI events), translate them to TOOL_EVENTs, and make tools handle those.
TOOL_DISPATCHER * m_eventDispatcher

References TOOL_DISPATCHER::DispatchWxEvent(), m_eventDispatcher, and Refresh().

Referenced by EDA_3D_CANVAS().

◆ OnLeftDown()

void EDA_3D_CANVAS::OnLeftDown ( wxMouseEvent &  event)
private

Definition at line 803 of file eda_3d_canvas.cpp.

804 {
805  SetFocus();
807 
808  if( !event.Dragging() && ( m_3d_render_raytracing != nullptr ) )
809  {
810  RAY mouseRay = getRayAtCurrrentMousePosition();
811 
812  BOARD_ITEM *intersectedBoardItem = m_3d_render_raytracing->IntersectBoardItem( mouseRay );
813 
814  // !TODO: send a selection item to pcbnew, eg: via kiway?
815  }
816 }
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:82
RAY getRayAtCurrrentMousePosition()
void stop_editingTimeOut_Timer()
Stop the editing time so it will not timeout.
Definition: ray.h:67
RENDER_3D_RAYTRACE * m_3d_render_raytracing
BOARD_ITEM * IntersectBoardItem(const RAY &aRay)

References getRayAtCurrrentMousePosition(), RENDER_3D_RAYTRACE::IntersectBoardItem(), m_3d_render_raytracing, and stop_editingTimeOut_Timer().

◆ OnLeftUp()

void EDA_3D_CANVAS::OnLeftUp ( wxMouseEvent &  event)
private

Definition at line 819 of file eda_3d_canvas.cpp.

820 {
821  if( m_camera_is_moving )
822  return;
823 
824  if( m_mouse_is_moving )
825  {
826  m_mouse_is_moving = false;
828  }
829 }
bool m_mouse_is_moving
void restart_editingTimeOut_Timer()
Reset the editing timer.
bool m_camera_is_moving

References m_camera_is_moving, m_mouse_is_moving, and restart_editingTimeOut_Timer().

◆ OnMiddleDown()

void EDA_3D_CANVAS::OnMiddleDown ( wxMouseEvent &  event)
private

Definition at line 832 of file eda_3d_canvas.cpp.

833 {
834  SetFocus();
836 }
void stop_editingTimeOut_Timer()
Stop the editing time so it will not timeout.

References stop_editingTimeOut_Timer().

◆ OnMiddleUp()

void EDA_3D_CANVAS::OnMiddleUp ( wxMouseEvent &  event)
private

Definition at line 839 of file eda_3d_canvas.cpp.

840 {
841  if( m_camera_is_moving )
842  return;
843 
844  if( m_mouse_is_moving )
845  {
846  m_mouse_is_moving = false;
848  }
849  else
850  {
852  }
853 }
bool m_mouse_is_moving
void restart_editingTimeOut_Timer()
Reset the editing timer.
bool m_camera_is_moving
void move_pivot_based_on_cur_mouse_position()
This function hits a ray to the board and start a movement.

References m_camera_is_moving, m_mouse_is_moving, move_pivot_based_on_cur_mouse_position(), and restart_editingTimeOut_Timer().

◆ OnMouseMove()

void EDA_3D_CANVAS::OnMouseMove ( wxMouseEvent &  event)
private

Definition at line 682 of file eda_3d_canvas.cpp.

683 {
684  //wxLogTrace( m_logTrace, wxT( "EDA_3D_CANVAS::OnMouseMove" ) );
685 
686  if( m_camera_is_moving )
687  return;
688 
690 
691  if( event.Dragging() )
692  {
693  if( event.LeftIsDown() ) // Drag
694  m_camera.Drag( event.GetPosition() );
695  else if( event.MiddleIsDown() ) // Pan
696  m_camera.Pan( event.GetPosition() );
697 
698  m_mouse_is_moving = true;
699  m_mouse_was_moved = true;
700 
701  // orientation has changed, redraw mesh
702  DisplayStatus();
703  Request_refresh();
704  }
705 
706  const wxPoint eventPosition = event.GetPosition();
707  m_camera.SetCurMousePosition( eventPosition );
708 
709  if( !event.Dragging() &&
711  {
713  static_cast<int>( EDA_3D_VIEWER_STATUSBAR::STATUS_TEXT ) );
714 
715  RAY mouseRay = getRayAtCurrrentMousePosition();
716 
717  BOARD_ITEM *intersectedBoardItem = m_3d_render_raytracing->IntersectBoardItem( mouseRay );
718 
719  if( intersectedBoardItem )
720  {
721  if( intersectedBoardItem != m_currentIntersectedBoardItem )
722  {
724  m_currentIntersectedBoardItem = intersectedBoardItem;
725 
726  Request_refresh();
727  }
728 
729  switch( intersectedBoardItem->Type() )
730  {
731  case PCB_PAD_T:
732  {
733  PAD* pad = dynamic_cast<PAD*>( intersectedBoardItem );
734 
735  if( pad && pad->IsOnCopperLayer() )
736  {
737  reporter.Report( wxString::Format( _( "Net %s\tNetClass %s\tPadName %s" ),
738  pad->GetNet()->GetNetname(),
739  pad->GetNet()->GetNetClassName(),
740  pad->GetName() ) );
741  }
742  }
743  break;
744 
745  case PCB_FOOTPRINT_T:
746  {
747  FOOTPRINT* footprint = dynamic_cast<FOOTPRINT *>( intersectedBoardItem );
748 
749  if( footprint )
750  reporter.Report( footprint->GetReference() );
751  }
752  break;
753 
754  case PCB_TRACE_T:
755  case PCB_VIA_T:
756  case PCB_ARC_T:
757  {
758  TRACK* track = dynamic_cast<TRACK *>( intersectedBoardItem );
759 
760  if( track )
761  {
762  reporter.Report( wxString::Format( _( "Net %s\tNetClass %s" ),
763  track->GetNet()->GetNetname(),
764  track->GetNet()->GetNetClassName() ) );
765  }
766  }
767  break;
768 
769  case PCB_ZONE_T:
770  {
771  ZONE* zone = dynamic_cast<ZONE*>( intersectedBoardItem );
772 
773  if( zone && zone->IsOnCopperLayer() )
774  {
775  reporter.Report( wxString::Format( _( "Net %s\tNetClass %s" ),
776  zone->GetNet()->GetNetname(),
777  zone->GetNet()->GetNetClassName() ) );
778  }
779  }
780  break;
781 
782  default:
783  break;
784  }
785  }
786  else
787  {
788  if( ( m_currentIntersectedBoardItem != nullptr ) &&
790  {
792  Request_refresh();
793 
794  reporter.Report( "" );
795  }
796 
798  }
799  }
800 }
A wrapper for reporting to a specific text location in a statusbar.
Definition: reporter.h:262
virtual wxSize GetNativePixelSize() const
virtual void Pan(const wxPoint &aNewMousePosition)=0
bool m_mouse_is_moving
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:82
RAY getRayAtCurrrentMousePosition()
wxString GetNetClassName() const
Definition: netinfo.h:126
NETINFO_ITEM * GetNet() const
Function GetNet Returns NET_INFO object for a given item.
wxStatusBar * m_parentStatusBar
class ARC, an arc track segment on a copper layer
Definition: typeinfo.h:97
BOARD_ITEM * m_currentIntersectedBoardItem
class PAD, a pad in a footprint
Definition: typeinfo.h:89
Definition: ray.h:67
void DisplayStatus()
Update the status bar with the position information.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
virtual void Drag(const wxPoint &aNewMousePosition)=0
Calculate a new mouse drag position.
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
BOARD_ADAPTER & m_boardAdapter
RENDER_ENGINE GetRenderEngine() const noexcept
RENDER_3D_LEGACY * m_3d_render_ogl_legacy
bool m_mouse_was_moved
RENDER_3D_RAYTRACE * m_3d_render_raytracing
void SetCurrentIntersectedBoardItem(BOARD_ITEM *aCurrentIntersectedBoardItem)
const wxString & GetName() const
Definition: pad.h:130
bool m_camera_is_moving
void SetCurMousePosition(const wxPoint &aPosition)
Update the current mouse position without make any new calculations on camera.
Definition: camera.cpp:418
const wxString & GetNetname() const
Function GetNetname.
Definition: netinfo.h:138
ZONE handles a list of polygons defining a copper zone.
Definition: zone.h:57
class ZONE, a copper pour area
Definition: typeinfo.h:105
const wxString GetReference() const
Function GetReference.
Definition: footprint.h:442
bool IsOnCopperLayer() const override
Definition: pad.h:214
class FOOTPRINT, a footprint
Definition: typeinfo.h:88
BOARD_ITEM * IntersectBoardItem(const RAY &aRay)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
bool SetCurWindowSize(const wxSize &aSize)
Update the windows size of the camera.
Definition: camera.cpp:435
#define _(s)
Definition: 3d_actions.cpp:33
bool IsOnCopperLayer() const override
Function IsOnCopperLayer.
Definition: zone.cpp:221
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
Definition: pad.h:60
CAMERA & m_camera
Definition: track.h:83
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:161

References _, DisplayStatus(), CAMERA::Drag(), Format(), PAD::GetName(), HIDPI_GL_CANVAS::GetNativePixelSize(), BOARD_CONNECTED_ITEM::GetNet(), NETINFO_ITEM::GetNetClassName(), NETINFO_ITEM::GetNetname(), getRayAtCurrrentMousePosition(), FOOTPRINT::GetReference(), BOARD_ADAPTER::GetRenderEngine(), RENDER_3D_RAYTRACE::IntersectBoardItem(), ZONE::IsOnCopperLayer(), PAD::IsOnCopperLayer(), m_3d_render_ogl_legacy, m_3d_render_raytracing, m_boardAdapter, m_camera, m_camera_is_moving, m_currentIntersectedBoardItem, m_mouse_is_moving, m_mouse_was_moved, m_parentStatusBar, OPENGL_LEGACY, CAMERA::Pan(), PCB_ARC_T, PCB_FOOTPRINT_T, PCB_PAD_T, PCB_TRACE_T, PCB_VIA_T, PCB_ZONE_T, STATUSBAR_REPORTER::Report(), Request_refresh(), CAMERA::SetCurMousePosition(), RENDER_3D_LEGACY::SetCurrentIntersectedBoardItem(), CAMERA::SetCurWindowSize(), STATUS_TEXT, and EDA_ITEM::Type().

◆ OnMouseWheel()

void EDA_3D_CANVAS::OnMouseWheel ( wxMouseEvent &  event)
private

Definition at line 594 of file eda_3d_canvas.cpp.

595 {
596  bool mouseActivity = false;
597 
598  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::OnMouseWheel" );
599 
600  if( m_camera_is_moving )
601  return;
602 
603  float delta_move = m_delta_move_step_factor * m_camera.ZoomGet();
604 
606  delta_move *= 0.01f * event.GetWheelRotation();
607  else
608  if( event.GetWheelRotation() < 0 )
609  delta_move = -delta_move;
610 
611  // mousewheel_panning enabled:
612  // wheel -> pan;
613  // wheel + shift -> horizontal scrolling;
614  // wheel + ctrl -> zooming;
615  // mousewheel_panning disabled:
616  // wheel + shift -> vertical scrolling;
617  // wheel + ctrl -> horizontal scrolling;
618  // wheel -> zooming.
619 
620  if( m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) && !event.ControlDown() )
621  {
622  if( event.GetWheelAxis() == wxMOUSE_WHEEL_HORIZONTAL || event.ShiftDown() )
623  m_camera.Pan( SFVEC3F( -delta_move, 0.0f, 0.0f ) );
624  else
625  m_camera.Pan( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
626 
627  mouseActivity = true;
628  }
629  else if( event.ShiftDown() && !m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) )
630  {
631  m_camera.Pan( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
632  mouseActivity = true;
633  }
634  else if( event.ControlDown() && !m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) )
635  {
636  m_camera.Pan( SFVEC3F( delta_move, 0.0f, 0.0f ) );
637  mouseActivity = true;
638  }
639  else
640  {
641  mouseActivity = m_camera.Zoom( event.GetWheelRotation() > 0 ? 1.1f : 1/1.1f );
642  }
643 
644  // If it results on a camera movement
645  if( mouseActivity )
646  {
647  DisplayStatus();
648  Request_refresh();
649 
650  m_mouse_is_moving = true;
651  m_mouse_was_moved = true;
652 
654  }
655 
656  // Update the cursor current mouse position on the camera
657  m_camera.SetCurMousePosition( event.GetPosition() );
658 }
virtual void Pan(const wxPoint &aNewMousePosition)=0
bool GetFlag(DISPLAY3D_FLG aFlag) const
Get a configuration status of a flag.
bool m_mouse_is_moving
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
void DisplayStatus()
Update the status bar with the position information.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
BOARD_ADAPTER & m_boardAdapter
void restart_editingTimeOut_Timer()
Reset the editing timer.
bool m_mouse_was_moved
bool m_camera_is_moving
void SetCurMousePosition(const wxPoint &aPosition)
Update the current mouse position without make any new calculations on camera.
Definition: camera.cpp:418
float ZoomGet() const
Definition: camera.cpp:504
bool Zoom(float aFactor)
Definition: camera.cpp:461
glm::vec3 SFVEC3F
Definition: xv3d_types.h:47
CAMERA & m_camera
static const float m_delta_move_step_factor

References DisplayStatus(), FL_MOUSEWHEEL_PANNING, BOARD_ADAPTER::GetFlag(), m_boardAdapter, m_camera, m_camera_is_moving, m_delta_move_step_factor, m_logTrace, m_mouse_is_moving, m_mouse_was_moved, CAMERA::Pan(), Request_refresh(), restart_editingTimeOut_Timer(), CAMERA::SetCurMousePosition(), CAMERA::Zoom(), and CAMERA::ZoomGet().

◆ OnPaint()

void EDA_3D_CANVAS::OnPaint ( wxPaintEvent &  aEvent)
private

Called by a wxPaintEvent event.

Definition at line 341 of file eda_3d_canvas.cpp.

342 {
343  // Please have a look at: https://lists.launchpad.net/kicad-developers/msg25149.html
344  DoRePaint();
345 }
void DoRePaint()
The actual function to repaint the canvas.

References DoRePaint().

◆ OnRefreshRequest()

void EDA_3D_CANVAS::OnRefreshRequest ( wxEvent &  aEvent)
private

Definition at line 886 of file eda_3d_canvas.cpp.

887 {
888  DoRePaint();
889 }
void DoRePaint()
The actual function to repaint the canvas.

References DoRePaint().

◆ OnResize()

void EDA_3D_CANVAS::OnResize ( wxSizeEvent &  event)
private

Definition at line 211 of file eda_3d_canvas.cpp.

212 {
213  this->Request_refresh();
214 }
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.

References Request_refresh().

◆ OnTimerTimeout_Editing()

void EDA_3D_CANVAS::OnTimerTimeout_Editing ( wxTimerEvent &  event)
private

Definition at line 856 of file eda_3d_canvas.cpp.

857 {
858  (void)event;
859 
860  m_mouse_is_moving = false;
861  m_mouse_was_moved = false;
862 
863  Request_refresh();
864 }
bool m_mouse_is_moving
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
bool m_mouse_was_moved

References m_mouse_is_moving, m_mouse_was_moved, and Request_refresh().

Referenced by EDA_3D_CANVAS().

◆ OnTimerTimeout_Redraw()

void EDA_3D_CANVAS::OnTimerTimeout_Redraw ( wxTimerEvent &  event)
private

Definition at line 880 of file eda_3d_canvas.cpp.

881 {
882  Request_refresh( true );
883 }
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.

References Request_refresh().

Referenced by EDA_3D_CANVAS().

◆ releaseOpenGL()

void EDA_3D_CANVAS::releaseOpenGL ( )
private

Free created targets and openGL context.

Definition at line 181 of file eda_3d_canvas.cpp.

182 {
183  if( m_glRC )
184  {
186 
187  delete m_3d_render_raytracing;
188  m_3d_render_raytracing = nullptr;
189 
190  delete m_3d_render_ogl_legacy;
191  m_3d_render_ogl_legacy = nullptr;
192 
193  // This is just a copy of a pointer, can safely be set to NULL.
194  m_3d_render = nullptr;
195 
198  m_glRC = nullptr;
199  }
200 }
wxGLContext * m_glRC
void UnlockCtx(wxGLContext *aContext)
Allow other canvases to bind an OpenGL context.
static GL_CONTEXT_MANAGER & Get()
Return the GL_CONTEXT_MANAGER instance (singleton).
RENDER_3D_LEGACY * m_3d_render_ogl_legacy
RENDER_3D_RAYTRACE * m_3d_render_raytracing
RENDER_3D_BASE * m_3d_render
void LockCtx(wxGLContext *aContext, wxGLCanvas *aCanvas)
Set a context as current and prevents other canvases from switching it.
void DestroyCtx(wxGLContext *aContext)
Destroy a managed OpenGL context.

References GL_CONTEXT_MANAGER::DestroyCtx(), GL_CONTEXT_MANAGER::Get(), GL_CONTEXT_MANAGER::LockCtx(), m_3d_render, m_3d_render_ogl_legacy, m_3d_render_raytracing, m_glRC, and GL_CONTEXT_MANAGER::UnlockCtx().

Referenced by OnCloseWindow(), and ~EDA_3D_CANVAS().

◆ ReloadRequest()

void EDA_3D_CANVAS::ReloadRequest ( BOARD aBoard = nullptr,
S3D_CACHE aCachePointer = nullptr 
)

Definition at line 298 of file eda_3d_canvas.cpp.

299 {
300  if( aCachePointer != nullptr )
301  m_boardAdapter.Set3dCacheManager( aCachePointer );
302 
303  if( aBoard != nullptr )
304  m_boardAdapter.SetBoard( aBoard );
305 
306  m_boardAdapter.SetColorSettings( Pgm().GetSettingsManager().GetColorSettings() );
307 
308  if( m_3d_render )
310 }
void ReloadRequest()
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:102
void SetBoard(BOARD *aBoard) noexcept
Set current board to be rendered.
BOARD_ADAPTER & m_boardAdapter
void Set3dCacheManager(S3D_CACHE *aCachePointer) noexcept
Update the cache manager pointer.
Definition: board_adapter.h:79
RENDER_3D_BASE * m_3d_render
SETTINGS_MANAGER * GetSettingsManager()
void SetColorSettings(COLOR_SETTINGS *aSettings) noexcept

References GetSettingsManager(), m_3d_render, m_boardAdapter, Pgm(), RENDER_3D_BASE::ReloadRequest(), BOARD_ADAPTER::Set3dCacheManager(), BOARD_ADAPTER::SetBoard(), and BOARD_ADAPTER::SetColorSettings().

Referenced by EDA_3D_VIEWER::ReloadRequest(), PANEL_PREV_3D::UpdateDummyFootprint(), and PANEL_PREV_3D::View3DUpdate().

◆ render_pivot()

void EDA_3D_CANVAS::render_pivot ( float  t,
float  aScale 
)
private

Render the pivot cursor.

Parameters
ttime between 0.0 and 1.0.
aScalescale to apply on the cursor.

Definition at line 76 of file eda_3d_canvas_pivot.cpp.

77 {
78  wxASSERT( aScale >= 0.0f );
79  wxASSERT( t >= 0.0f );
80 
81  if( t > 1.0f )
82  t = 1.0f;
83 
84  const SFVEC3F &lookAtPos = m_camera.GetLookAtPos_T1();
85 
86  glDisable( GL_LIGHTING );
87  glDisable( GL_DEPTH_TEST );
88  glDisable( GL_CULL_FACE );
89 
90  // Set projection and modelview matrixes
91  glMatrixMode( GL_PROJECTION );
92  glLoadMatrixf( glm::value_ptr( m_camera.GetProjectionMatrix() ) );
93 
94  glMatrixMode( GL_MODELVIEW );
95  glLoadIdentity();
96  glLoadMatrixf( glm::value_ptr( m_camera.GetViewMatrix() ) );
97 
98  glEnable( GL_COLOR_MATERIAL );
99  glColor4f( 0.0f, 1.0f, 0.0f, 0.75f - t * 0.75f );
100 
101  // Translate to the look at position
102  glTranslatef( lookAtPos.x, lookAtPos.y, lookAtPos.z );
103 
104  glScalef( aScale, aScale, aScale );
105 
106  pivot_render_triangles( t * 0.5f );
107 
108  t = t * 0.80f;
109  glScalef( 1.0f - t, 1.0f - t, 1.0f - t );
110  glColor4f( 0.0f, 1.0f, 0.0f, 0.8f - t );
111 
112  glPushMatrix();
113  glRotatef( t * 90.0f, 0.0f, 0.0f, 1.0f );
114  pivot_render_triangles( t * 0.5f );
115  glPopMatrix();
116 
117  glPushMatrix();
118  glRotatef( -t * 90.0f, 0.0f, 0.0f, 1.0f );
119  pivot_render_triangles( t * 0.5f );
120  glPopMatrix();
121 }
const glm::mat4 & GetProjectionMatrix() const
Definition: camera.cpp:376
const SFVEC3F & GetLookAtPos_T1() const
Definition: camera.h:130
const glm::mat4 & GetViewMatrix() const
Definition: camera.cpp:406
glm::vec3 SFVEC3F
Definition: xv3d_types.h:47
static void pivot_render_triangles(float t)
CAMERA & m_camera

References CAMERA::GetLookAtPos_T1(), CAMERA::GetProjectionMatrix(), CAMERA::GetViewMatrix(), m_camera, and pivot_render_triangles().

Referenced by DoRePaint().

◆ RenderEngineChanged()

void EDA_3D_CANVAS::RenderEngineChanged ( )

Notify that the render engine was changed.

Definition at line 1123 of file eda_3d_canvas.cpp.

1124 {
1125  switch( m_boardAdapter.GetRenderEngine() )
1126  {
1129  default: m_3d_render = nullptr; break;
1130  }
1131 
1132  if( m_3d_render )
1134 
1135  m_mouse_was_moved = false;
1136 
1137  Request_refresh();
1138 }
void ReloadRequest()
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
BOARD_ADAPTER & m_boardAdapter
RENDER_ENGINE GetRenderEngine() const noexcept
RENDER_3D_LEGACY * m_3d_render_ogl_legacy
bool m_mouse_was_moved
RENDER_3D_RAYTRACE * m_3d_render_raytracing
RENDER_3D_BASE * m_3d_render

References BOARD_ADAPTER::GetRenderEngine(), m_3d_render, m_3d_render_ogl_legacy, m_3d_render_raytracing, m_boardAdapter, m_mouse_was_moved, OPENGL_LEGACY, RAYTRACING, RENDER_3D_BASE::ReloadRequest(), and Request_refresh().

Referenced by EDA_3D_VIEWER::RenderEngineChanged().

◆ RenderRaytracingRequest()

void EDA_3D_CANVAS::RenderRaytracingRequest ( )

Request to render the current view in Raytracing mode.

Definition at line 313 of file eda_3d_canvas.cpp.

314 {
316 
317  if( m_3d_render )
319 
321 
322  Request_refresh();
323 }
void ReloadRequest()
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
RENDER_3D_RAYTRACE * m_3d_render_raytracing
RENDER_3D_BASE * m_3d_render
bool m_render_raytracing_was_requested

References m_3d_render, m_3d_render_raytracing, m_render_raytracing_was_requested, RENDER_3D_BASE::ReloadRequest(), and Request_refresh().

Referenced by EDA_3D_CONTROLLER::RotateView(), and EDA_3D_CONTROLLER::ToggleOrtho().

◆ Request_refresh()

void EDA_3D_CANVAS::Request_refresh ( bool  aRedrawImmediately = true)

Schedule a refresh update of the canvas.

Parameters
aRedrawImmediatelytrue will request a redraw, false will schedule a redraw after a short timeout.

Definition at line 892 of file eda_3d_canvas.cpp.

893 {
894  if( aRedrawImmediately )
895  {
896  // Just calling Refresh() does not work always
897  // Using an event to call DoRepaint ensure the repaint code will be executed,
898  // and PostEvent will take priority to other events like mouse movements, keys, etc.
899  // and is executed during the next idle time
900  wxCommandEvent redrawEvent( wxEVT_REFRESH_CUSTOM_COMMAND, ID_CUSTOM_EVENT_1 );
901  wxPostEvent( this, redrawEvent );
902  }
903  else
904  {
905  // Schedule a timed redraw
906  m_redraw_trigger_timer.Start( 10 , wxTIMER_ONE_SHOT );
907  }
908 }
wxTimer m_redraw_trigger_timer

References ID_CUSTOM_EVENT_1, and m_redraw_trigger_timer.

Referenced by DoRePaint(), EDA_3D_CONTROLLER::On3DGridSelection(), EDA_3D_VIEWER::OnActivate(), OnMouseMove(), OnMouseWheel(), OnResize(), OnTimerTimeout_Editing(), OnTimerTimeout_Redraw(), EDA_3D_VIEWER::Redraw(), EDA_3D_VIEWER::refreshRender(), RenderEngineChanged(), RenderRaytracingRequest(), request_start_moving_camera(), EDA_3D_CONTROLLER::RotateView(), EDA_3D_CONTROLLER::SetMaterial(), SetView3D(), EDA_3D_VIEWER::takeScreenshot(), EDA_3D_CONTROLLER::ToggleOrtho(), EDA_3D_CONTROLLER::ToggleVisibility(), PANEL_PREV_3D::UpdateDummyFootprint(), and EDA_3D_CONTROLLER::ZoomRedraw().

◆ request_start_moving_camera()

void EDA_3D_CANVAS::request_start_moving_camera ( float  aMovingSpeed = 2.0f,
bool  aRenderPivot = true 
)
private

Start a camera movement.

Parameters
aMovingSpeedthe time speed.
aRenderPivotif it should display pivot cursor while move.

Definition at line 911 of file eda_3d_canvas.cpp.

912 {
913  wxASSERT( aMovingSpeed > FLT_EPSILON );
914 
915  // Fast forward the animation if the animation is disabled
916  if( !m_animation_enabled )
917  {
918  m_camera.Interpolate( 1.0f );
919  DisplayStatus();
920  Request_refresh();
921  return;
922  }
923 
924  // Map speed multiplier option to actual multiplier value
925  // [1,2,3,4,5] -> [0.25, 0.5, 1, 2, 4]
926  aMovingSpeed *= ( 1 << m_moving_speed_multiplier ) / 8.0f;
927 
928  m_render_pivot = aRenderPivot;
929  m_camera_moving_speed = aMovingSpeed;
930 
932 
933  DisplayStatus();
934  Request_refresh();
935 
936  m_camera_is_moving = true;
937 
939 }
unsigned m_strtime_camera_movement
void stop_editingTimeOut_Timer()
Stop the editing time so it will not timeout.
void DisplayStatus()
Update the status bar with the position information.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
float m_camera_moving_speed
bool m_camera_is_moving
bool m_animation_enabled
int m_moving_speed_multiplier
virtual void Interpolate(float t)
It will update the matrix to interpolate between T0 and T1 values.
Definition: camera.cpp:563
unsigned GetRunningMicroSecs()
An alternate way to calculate an elapset time (in microsecondes) to class PROF_COUNTER.
CAMERA & m_camera

References DisplayStatus(), GetRunningMicroSecs(), CAMERA::Interpolate(), m_animation_enabled, m_camera, m_camera_is_moving, m_camera_moving_speed, m_moving_speed_multiplier, m_render_pivot, m_strtime_camera_movement, Request_refresh(), and stop_editingTimeOut_Timer().

Referenced by move_pivot_based_on_cur_mouse_position(), and SetView3D().

◆ restart_editingTimeOut_Timer()

void EDA_3D_CANVAS::restart_editingTimeOut_Timer ( )
private

Reset the editing timer.

Definition at line 873 of file eda_3d_canvas.cpp.

874 {
875  if( m_3d_render )
876  m_editing_timeout_timer.Start( m_3d_render->GetWaitForEditingTimeOut(), wxTIMER_ONE_SHOT );
877 }
wxTimer m_editing_timeout_timer
virtual int GetWaitForEditingTimeOut()=0
Give the interface the time (in ms) that it should wait for editing or movements before (this works f...
RENDER_3D_BASE * m_3d_render

References RENDER_3D_BASE::GetWaitForEditingTimeOut(), m_3d_render, and m_editing_timeout_timer.

Referenced by DoRePaint(), OnLeftUp(), OnMiddleUp(), OnMouseWheel(), and SetView3D().

◆ SetEventDispatcher()

void EDA_3D_CANVAS::SetEventDispatcher ( TOOL_DISPATCHER aEventDispatcher)

Set a dispatcher that processes events and forwards them to tools.

#DRAW_PANEL_GAL does not take over the ownership. Passing NULL disconnects all event handlers from the DRAW_PANEL_GAL and parent frame.

Parameters
aEventDispatcheris the object that will be used for dispatching events.

Definition at line 556 of file eda_3d_canvas.cpp.

557 {
558  m_eventDispatcher = aEventDispatcher;
559 
560  if( m_eventDispatcher )
561  {
562  m_parent->Connect( wxEVT_TOOL,
563  wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
564  nullptr, m_eventDispatcher );
565  }
566  else
567  {
568  // While loop is used to be sure that all event handlers are removed.
569  while( m_parent->Disconnect( wxEVT_TOOL,
570  wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
571  nullptr, m_eventDispatcher ) );
572  }
573 }
TOOL_DISPATCHER * m_eventDispatcher
virtual void DispatchWxCommand(wxCommandEvent &aEvent)
Process wxCommands (mostly menu related events) and runs appropriate actions (eg.

References TOOL_DISPATCHER::DispatchWxCommand(), and m_eventDispatcher.

Referenced by PANEL_PREV_3D::PANEL_PREV_3D(), and EDA_3D_VIEWER::~EDA_3D_VIEWER().

◆ SetInfoBar()

void EDA_3D_CANVAS::SetInfoBar ( WX_INFOBAR aInfoBar)
inline

Definition at line 79 of file eda_3d_canvas.h.

80  {
81  m_parentInfoBar = aInfoBar;
82  }
WX_INFOBAR * m_parentInfoBar

References m_parentInfoBar.

Referenced by PANEL_PREV_3D::PANEL_PREV_3D().

◆ SetScaleFactor()

void HIDPI_GL_CANVAS::SetScaleFactor ( double  aFactor)
inherited

Set the canvas scale factor, probably for a hi-DPI display.

Definition at line 58 of file hidpi_gl_canvas.cpp.

59 {
60  m_scale_factor = aNewScaleFactor;
61 }
double m_scale_factor
The current scale factor (e.g.

References HIDPI_GL_CANVAS::m_scale_factor.

Referenced by PANEL_PREV_3D::loadCommonSettings(), EDA_3D_VIEWER::loadCommonSettings(), and KIGFX::OPENGL_GAL::updatedGalDisplayOptions().

◆ SetStatusBar()

void EDA_3D_CANVAS::SetStatusBar ( wxStatusBar *  aStatusBar)
inline

Definition at line 74 of file eda_3d_canvas.h.

75  {
76  m_parentStatusBar = aStatusBar;
77  }
wxStatusBar * m_parentStatusBar

References m_parentStatusBar.

◆ SetView3D()

bool EDA_3D_CANVAS::SetView3D ( int  aKeycode)

Helper function to call view commands.

Parameters
aKeycodeascii key commands.
Returns
true if the key code was handled, false if no command found for this code.

Definition at line 961 of file eda_3d_canvas.cpp.

962 {
963  if( m_camera_is_moving )
964  return false;
965 
966  const float delta_move = m_delta_move_step_factor * m_camera.ZoomGet();
967  const float arrow_moving_time_speed = 8.0f;
968  bool handled = false;
969 
970  switch( aKeycode )
971  {
972  case WXK_SPACE:
974  return true;
975 
976  case WXK_LEFT:
979  m_camera.Pan_T1( SFVEC3F( -delta_move, 0.0f, 0.0f ) );
980  request_start_moving_camera( arrow_moving_time_speed, false );
981  return true;
982 
983  case WXK_RIGHT:
986  m_camera.Pan_T1( SFVEC3F( +delta_move, 0.0f, 0.0f ) );
987  request_start_moving_camera( arrow_moving_time_speed, false );
988  return true;
989 
990  case WXK_UP:
993  m_camera.Pan_T1( SFVEC3F( 0.0f, +delta_move, 0.0f ) );
994  request_start_moving_camera( arrow_moving_time_speed, false );
995  return true;
996 
997  case WXK_DOWN:
1000  m_camera.Pan_T1( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
1001  request_start_moving_camera( arrow_moving_time_speed, false );
1002  return true;
1003 
1004  case WXK_HOME:
1007  m_camera.Reset_T1();
1008  request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 1/1.26f ), 1.26f ) );
1009  return true;
1010 
1011  case WXK_END:
1012  break;
1013 
1014  case WXK_TAB:
1017  m_camera.RotateZ_T1( glm::radians( 45.0f ) );
1019  handled = true;
1020  break;
1021 
1022  case WXK_F1:
1025 
1026  if( m_camera.Zoom_T1( 1.26f ) ) // 3 steps per doubling
1028 
1029  return true;
1030 
1031  case WXK_F2:
1034 
1035  if( m_camera.Zoom_T1( 1/1.26f ) ) // 3 steps per halving
1037 
1038  return true;
1039 
1040  case ID_VIEW3D_RESET:
1043  m_camera.Reset_T1();
1044  request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
1045  return true;
1046 
1047  case ID_VIEW3D_RIGHT:
1050  m_camera.Reset_T1();
1051  m_camera.RotateZ_T1( glm::radians( -90.0f ) );
1052  m_camera.RotateX_T1( glm::radians( -90.0f ) );
1054  return true;
1055 
1056  case ID_VIEW3D_LEFT:
1059  m_camera.Reset_T1();
1060  m_camera.RotateZ_T1( glm::radians( 90.0f ) );
1061  m_camera.RotateX_T1( glm::radians( -90.0f ) );
1063  return true;
1064 
1065  case ID_VIEW3D_FRONT:
1068  m_camera.Reset_T1();
1069  m_camera.RotateX_T1( glm::radians( -90.0f ) );
1071  return true;
1072 
1073  case ID_VIEW3D_BACK:
1076  m_camera.Reset_T1();
1077  m_camera.RotateX_T1( glm::radians( -90.0f ) );
1078 
1079  // The rotation angle should be 180.
1080  // We use 179.999 (180 - epsilon) to avoid a full 360 deg rotation when
1081  // using 180 deg if the previous rotated position was already 180 deg
1082  m_camera.RotateZ_T1( glm::radians( 179.999f ) );
1084  return true;
1085 
1086  case ID_VIEW3D_TOP:
1089  m_camera.Reset_T1();
1090  request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
1091  return true;
1092 
1093  case ID_VIEW3D_BOTTOM:
1096  m_camera.Reset_T1();
1097  m_camera.RotateY_T1( glm::radians( 179.999f ) ); // Rotation = 180 - epsilon
1098  request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
1099  return true;
1100 
1101  case ID_VIEW3D_FLIP:
1104  m_camera.RotateY_T1( glm::radians( 179.999f ) );
1106  return true;
1107 
1108  default:
1109  return false;
1110  }
1111 
1112  m_mouse_was_moved = true;
1113 
1115 
1116  DisplayStatus();
1117  Request_refresh();
1118 
1119  return handled;
1120 }
void RotateZ_T1(float aAngleInRadians)
Definition: camera.cpp:543
bool Zoom_T1(float aFactor)
Definition: camera.cpp:484
void request_start_moving_camera(float aMovingSpeed=2.0f, bool aRenderPivot=true)
Start a camera movement.
virtual void Pan_T1(const SFVEC3F &aDeltaOffsetInc)=0
void RotateY_T1(float aAngleInRadians)
Definition: camera.cpp:537
void DisplayStatus()
Update the status bar with the position information.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
void restart_editingTimeOut_Timer()
Reset the editing timer.
bool m_mouse_was_moved
bool m_camera_is_moving
virtual void Reset_T1()
Definition: camera.cpp:101
float ZoomGet() const
Definition: camera.cpp:504
void SetInterpolateMode(CAMERA_INTERPOLATION aInterpolateMode)
Definition: camera.h:197
virtual void SetT0_and_T1_current_T()
This will set T0 and T1 with the current values.
Definition: camera.cpp:549
void move_pivot_based_on_cur_mouse_position()
This function hits a ray to the board and start a movement.
glm::vec3 SFVEC3F
Definition: xv3d_types.h:47
CAMERA & m_camera
static const float m_delta_move_step_factor
void RotateX_T1(float aAngleInRadians)
Definition: camera.cpp:531

References BEZIER, DisplayStatus(), EASING_IN_OUT, ID_VIEW3D_BACK, ID_VIEW3D_BOTTOM, ID_VIEW3D_FLIP, ID_VIEW3D_FRONT, ID_VIEW3D_LEFT, ID_VIEW3D_RESET, ID_VIEW3D_RIGHT, ID_VIEW3D_TOP, LINEAR, m_camera, m_camera_is_moving, m_delta_move_step_factor, m_mouse_was_moved, move_pivot_based_on_cur_mouse_position(), CAMERA::Pan_T1(), Request_refresh(), request_start_moving_camera(), CAMERA::Reset_T1(), restart_editingTimeOut_Timer(), CAMERA::RotateX_T1(), CAMERA::RotateY_T1(), CAMERA::RotateZ_T1(), CAMERA::SetInterpolateMode(), CAMERA::SetT0_and_T1_current_T(), CAMERA::Zoom_T1(), and CAMERA::ZoomGet().

Referenced by EDA_3D_CONTROLLER::doZoomInOut(), EDA_3D_CONTROLLER::PanControl(), PANEL_PREV_3D::View3DBack(), PANEL_PREV_3D::View3DBottom(), PANEL_PREV_3D::View3DFront(), PANEL_PREV_3D::View3DLeft(), PANEL_PREV_3D::View3DRight(), PANEL_PREV_3D::View3DTop(), EDA_3D_CONTROLLER::ViewControl(), and EDA_3D_CONTROLLER::ZoomFitScreen().

◆ stop_editingTimeOut_Timer()

void EDA_3D_CANVAS::stop_editingTimeOut_Timer ( )
private

Stop the editing time so it will not timeout.

Definition at line 867 of file eda_3d_canvas.cpp.

868 {
870 }
wxTimer m_editing_timeout_timer

References m_editing_timeout_timer.

Referenced by OnLeftDown(), OnMiddleDown(), and request_start_moving_camera().

Member Data Documentation

◆ m_3d_render

◆ m_3d_render_ogl_legacy

RENDER_3D_LEGACY* EDA_3D_CANVAS::m_3d_render_ogl_legacy
private

Definition at line 279 of file eda_3d_canvas.h.

Referenced by DoRePaint(), OnMouseMove(), releaseOpenGL(), and RenderEngineChanged().

◆ m_3d_render_raytracing

RENDER_3D_RAYTRACE* EDA_3D_CANVAS::m_3d_render_raytracing
private

◆ m_3DShapes_container

CONTAINER_3D EDA_3D_CANVAS::m_3DShapes_container
private

Definition at line 287 of file eda_3d_canvas.h.

◆ m_accelerator3DShapes

ACCELERATOR_3D* EDA_3D_CANVAS::m_accelerator3DShapes
private

Definition at line 288 of file eda_3d_canvas.h.

Referenced by ~EDA_3D_CANVAS().

◆ m_animation_enabled

bool EDA_3D_CANVAS::m_animation_enabled
private

◆ m_boardAdapter

BOARD_ADAPTER& EDA_3D_CANVAS::m_boardAdapter
private

◆ m_camera

◆ m_camera_is_moving

bool EDA_3D_CANVAS::m_camera_is_moving
private

◆ m_camera_moving_speed

float EDA_3D_CANVAS::m_camera_moving_speed
private

Definition at line 270 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and request_start_moving_camera().

◆ m_currentIntersectedBoardItem

BOARD_ITEM* EDA_3D_CANVAS::m_currentIntersectedBoardItem
private

Definition at line 290 of file eda_3d_canvas.h.

Referenced by OnMouseMove().

◆ m_delta_move_step_factor

const float EDA_3D_CANVAS::m_delta_move_step_factor = 0.7f
staticprivate

Definition at line 281 of file eda_3d_canvas.h.

Referenced by OnMouseWheel(), and SetView3D().

◆ m_editing_timeout_timer

wxTimer EDA_3D_CANVAS::m_editing_timeout_timer
private

Definition at line 261 of file eda_3d_canvas.h.

Referenced by restart_editingTimeOut_Timer(), and stop_editingTimeOut_Timer().

◆ m_eventDispatcher

TOOL_DISPATCHER* EDA_3D_CANVAS::m_eventDispatcher
private

Definition at line 253 of file eda_3d_canvas.h.

Referenced by OnEvent(), and SetEventDispatcher().

◆ m_glRC

wxGLContext* EDA_3D_CANVAS::m_glRC
private

Definition at line 257 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and releaseOpenGL().

◆ m_is_currently_painting

std::atomic_flag EDA_3D_CANVAS::m_is_currently_painting
private

Definition at line 264 of file eda_3d_canvas.h.

Referenced by DoRePaint().

◆ m_is_opengl_initialized

bool EDA_3D_CANVAS::m_is_opengl_initialized
private

Definition at line 258 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and initializeOpenGL().

◆ m_is_opengl_version_supported

bool EDA_3D_CANVAS::m_is_opengl_version_supported
private

Definition at line 259 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and initializeOpenGL().

◆ m_mouse_is_moving

bool EDA_3D_CANVAS::m_mouse_is_moving
private

◆ m_mouse_was_moved

bool EDA_3D_CANVAS::m_mouse_was_moved
private

◆ m_moving_speed_multiplier

int EDA_3D_CANVAS::m_moving_speed_multiplier
private

◆ m_opengl_supports_raytracing

bool EDA_3D_CANVAS::m_opengl_supports_raytracing
private

Definition at line 284 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and initializeOpenGL().

◆ m_parentInfoBar

WX_INFOBAR* EDA_3D_CANVAS::m_parentInfoBar
private

Definition at line 255 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and SetInfoBar().

◆ m_parentStatusBar

wxStatusBar* EDA_3D_CANVAS::m_parentStatusBar
private

Definition at line 254 of file eda_3d_canvas.h.

Referenced by DisplayStatus(), DoRePaint(), OnMouseMove(), and SetStatusBar().

◆ m_redraw_trigger_timer

wxTimer EDA_3D_CANVAS::m_redraw_trigger_timer
private

Definition at line 263 of file eda_3d_canvas.h.

Referenced by Request_refresh().

◆ m_render_pivot

bool EDA_3D_CANVAS::m_render_pivot
private

Definition at line 269 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and request_start_moving_camera().

◆ m_render_raytracing_was_requested

bool EDA_3D_CANVAS::m_render_raytracing_was_requested
private

Definition at line 285 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and RenderRaytracingRequest().

◆ m_strtime_camera_movement

unsigned EDA_3D_CANVAS::m_strtime_camera_movement
private

Definition at line 271 of file eda_3d_canvas.h.

Referenced by DoRePaint(), and request_start_moving_camera().


The documentation for this class was generated from the following files: