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 90 of file eda_3d_canvas.cpp.

93  : HIDPI_GL_CANVAS( aParent, wxID_ANY, aAttribList, wxDefaultPosition, wxDefaultSize,
94  wxFULL_REPAINT_ON_RESIZE ),
95  m_eventDispatcher( nullptr ),
96  m_parentStatusBar( nullptr ),
97  m_parentInfoBar( nullptr ),
98  m_glRC( nullptr ),
99  m_is_opengl_initialized( false ),
101  m_mouse_is_moving( false ),
102  m_mouse_was_moved( false ),
103  m_camera_is_moving( false ),
104  m_render_pivot( false ),
105  m_camera_moving_speed( 1.0f ),
107  m_animation_enabled( true ),
109  m_boardAdapter( aBoardAdapter ),
110  m_camera( aCamera ),
111  m_3d_render( nullptr ),
114  m_accelerator3DShapes( nullptr ),
116 {
117  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::EDA_3D_CANVAS" );
118 
119  m_editing_timeout_timer.SetOwner( this );
120  Connect( m_editing_timeout_timer.GetId(), wxEVT_TIMER,
121  wxTimerEventHandler( EDA_3D_CANVAS::OnTimerTimeout_Editing ), nullptr, this );
122 
123  m_redraw_trigger_timer.SetOwner( this );
124  Connect( m_redraw_trigger_timer.GetId(), wxEVT_TIMER,
125  wxTimerEventHandler( EDA_3D_CANVAS::OnTimerTimeout_Redraw ), nullptr, this );
126 
127  m_is_currently_painting.clear();
128 
131 
132  wxASSERT( m_3d_render_raytracing != nullptr );
133  wxASSERT( m_3d_render_ogl_legacy != nullptr );
134 
135  auto busy_indicator_factory = []() { return std::make_unique<WX_BUSY_INDICATOR>(); };
136 
137  m_3d_render_raytracing->SetBusyIndicatorFactory( busy_indicator_factory );
138  m_3d_render_ogl_legacy->SetBusyIndicatorFactory( busy_indicator_factory );
139 
141 
142  wxASSERT( aBoard != nullptr );
143  m_boardAdapter.SetBoard( aBoard );
144 
145  m_boardAdapter.SetColorSettings( Pgm().GetSettingsManager().GetColorSettings() );
146 
147  wxASSERT( a3DCachePointer != nullptr );
148  m_boardAdapter.Set3dCacheManager( a3DCachePointer );
149 
150  const wxEventType events[] =
151  {
152  // Binding both EVT_CHAR and EVT_CHAR_HOOK ensures that all key events,
153  // especially special key like arrow keys, are handled by the GAL event dispatcher,
154  // and not sent to GUI without filtering, because they have a default action (scroll)
155  // that must not be called.
156  wxEVT_LEFT_UP, wxEVT_LEFT_DOWN, wxEVT_LEFT_DCLICK,
157  wxEVT_RIGHT_UP, wxEVT_RIGHT_DOWN, wxEVT_RIGHT_DCLICK,
158  wxEVT_MIDDLE_UP, wxEVT_MIDDLE_DOWN, wxEVT_MIDDLE_DCLICK,
159  wxEVT_MOTION, wxEVT_MOUSEWHEEL, wxEVT_CHAR, wxEVT_CHAR_HOOK,
160 #if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
161  wxEVT_MAGNIFY,
162 #endif
163  wxEVT_MENU_OPEN, wxEVT_MENU_CLOSE, wxEVT_MENU_HIGHLIGHT
164  };
165 
166  for( wxEventType eventType : events )
167  Connect( eventType, wxEventHandler( EDA_3D_CANVAS::OnEvent ), nullptr, m_eventDispatcher );
168 }
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:106
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 171 of file eda_3d_canvas.cpp.

172 {
173  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::~EDA_3D_CANVAS" );
174 
175  delete m_accelerator3DShapes;
176  m_accelerator3DShapes = nullptr;
177 
178  releaseOpenGL();
179 }
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 327 of file eda_3d_canvas.cpp.

328 {
329  if( m_parentStatusBar )
330  {
331  wxString msg;
332 
333  msg.Printf( "dx %3.2f", m_camera.GetCameraPos().x );
334  m_parentStatusBar->SetStatusText( msg, static_cast<int>( EDA_3D_VIEWER_STATUSBAR::X_POS ) );
335 
336  msg.Printf( "dy %3.2f", m_camera.GetCameraPos().y );
337  m_parentStatusBar->SetStatusText( msg, static_cast<int>( EDA_3D_VIEWER_STATUSBAR::Y_POS ) );
338  }
339 }
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 349 of file eda_3d_canvas.cpp.

350 {
351  if( m_is_currently_painting.test_and_set() )
352  return;
353 
354  // SwapBuffer requires the window to be shown before calling
355  if( !IsShownOnScreen() )
356  {
357  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::DoRePaint !IsShown" );
358  m_is_currently_painting.clear();
359  return;
360  }
361 
362  // Because the board to draw is handled by the parent viewer frame,
363  // ensure this parent is still alive. When it is closed before the viewer
364  // frame, a paint event can be generated after the parent is closed,
365  // therefore with invalid board.
366  // This is dependent of the platform.
367  // Especially on OSX, but also on Windows, it frequently happens
368  if( !GetParent()->GetParent()->IsShown() )
369  return; // The parent board editor frame is no more alive
370 
371  wxString err_messages;
372 
373  // !TODO: implement error reporter
374  INFOBAR_REPORTER warningReporter( m_parentInfoBar );
375  STATUSBAR_REPORTER activityReporter( m_parentStatusBar,
377 
378  unsigned strtime = GetRunningMicroSecs();
379 
380  // "Makes the OpenGL state that is represented by the OpenGL rendering
381  // context context current, i.e. it will be used by all subsequent OpenGL calls.
382  // This function may only be called when the window is shown on screen"
383 
384  // Explicitly create a new rendering context instance for this canvas.
385  if( m_glRC == nullptr )
387 
389 
390  // Set the OpenGL viewport according to the client size of this canvas.
391  // This is done here rather than in a wxSizeEvent handler because our
392  // OpenGL rendering context (and thus viewport setting) is used with
393  // multiple canvases: If we updated the viewport in the wxSizeEvent
394  // handler, changing the size of one canvas causes a viewport setting that
395  // is wrong when next another canvas is repainted.
396  wxSize clientSize = GetNativePixelSize();
397 
398  const bool windows_size_changed = m_camera.SetCurWindowSize( clientSize );
399 
400  // Initialize openGL if need
402  {
403  if( !initializeOpenGL() )
404  {
406  m_is_currently_painting.clear();
407 
408  return;
409  }
410 
412  {
413  warningReporter.Report( _( "Your OpenGL version is not supported. Minimum required "
414  "is 1.5" ), RPT_SEVERITY_ERROR );
415 
416  warningReporter.Finalize();
417  }
418  }
419 
421  {
422  glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
423  glClear( GL_COLOR_BUFFER_BIT );
424 
425  SwapBuffers();
426 
428  m_is_currently_painting.clear();
429 
430  return;
431  }
432 
433  // Don't attend to ray trace if OpenGL doesn't support it.
435  {
439  }
440 
441  // Check if a raytacing was requested and need to switch to raytracing mode
443  {
444  const bool was_camera_changed = m_camera.ParametersChanged();
445 
446  // It reverts back to OpenGL mode if it was requested a raytracing
447  // render of the current scene. AND the mouse / camera is moving
448  if( ( m_mouse_is_moving || m_camera_is_moving || was_camera_changed
449  || windows_size_changed )
451  {
454  }
455  }
456 
457  float curtime_delta_s = 0.0f;
458 
459  if( m_camera_is_moving )
460  {
461  const unsigned curtime_delta = GetRunningMicroSecs() - m_strtime_camera_movement;
462  curtime_delta_s = (curtime_delta / 1e6) * m_camera_moving_speed;
463  m_camera.Interpolate( curtime_delta_s );
464 
465  if( curtime_delta_s > 1.0f )
466  {
467  m_render_pivot = false;
468  m_camera_is_moving = false;
469  m_mouse_was_moved = true;
470 
472  DisplayStatus();
473  }
474  else
475  {
476  Request_refresh();
477  }
478  }
479 
480  // It will return true if the render request a new redraw
481  bool requested_redraw = false;
482 
483  if( m_3d_render )
484  {
485  try
486  {
487  m_3d_render->SetCurWindowSize( clientSize );
488 
489  bool reloadRaytracingForIntersectionCalculations = false;
490 
493  {
494  reloadRaytracingForIntersectionCalculations = true;
495  }
496 
497  requested_redraw = m_3d_render->Redraw( m_mouse_was_moved || m_camera_is_moving,
498  &activityReporter, &warningReporter );
499 
500  if( reloadRaytracingForIntersectionCalculations )
501  m_3d_render_raytracing->Reload( nullptr, nullptr, true );
502  }
503  catch( std::runtime_error& )
504  {
507  m_is_opengl_initialized = false;
509  m_is_currently_painting.clear();
510  return;
511  }
512  }
513 
514  if( m_render_pivot )
515  {
516  const float scale = glm::min( m_camera.ZoomGet(), 1.0f );
517  render_pivot( curtime_delta_s, scale * scale );
518  }
519 
520  // "Swaps the double-buffer of this window, making the back-buffer the
521  // front-buffer and vice versa, so that the output of the previous OpenGL
522  // commands is displayed on the window."
523  SwapBuffers();
524 
526 
527  if( !activityReporter.HasMessage() )
528  {
530  {
531  // Calculation time in milliseconds
532  const double calculation_time = (double)( GetRunningMicroSecs() - strtime) / 1e3;
533 
534  activityReporter.Report( wxString::Format( _( "Last render time %.0f ms" ),
535  calculation_time ) );
536  }
537  }
538 
539  // This will reset the flag of camera parameters changed
541 
542  warningReporter.Finalize();
543 
544  if( !err_messages.IsEmpty() )
545  wxLogMessage( err_messages );
546 
547  if( ( !m_camera_is_moving ) && requested_redraw )
548  {
549  m_mouse_was_moved = false;
550  Request_refresh( false );
551  }
552 
553  m_is_currently_painting.clear();
554 }
A wrapper for reporting to a specific text location in a statusbar.
Definition: reporter.h:280
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:309
bool m_render_raytracing_was_requested

References _, ACTIVITY, 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(), 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 1128 of file eda_3d_canvas.cpp.

1129 {
1130  SFVEC3F rayOrigin;
1131  SFVEC3F rayDir;
1132 
1133  // Generate a ray origin and direction based on current mouser position and camera
1134  m_camera.MakeRayAtCurrrentMousePosition( rayOrigin, rayDir );
1135 
1136  RAY mouseRay;
1137  mouseRay.Init( rayOrigin, rayDir );
1138 
1139  return mouseRay;
1140 }
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:44
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 293 of file eda_3d_canvas.cpp.

294 {
295  OglGetScreenshot( aDstImage );
296 }
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 218 of file eda_3d_canvas.cpp.

219 {
220  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::initializeOpenGL" );
221 
222  const GLenum err = glewInit();
223 
224  if( GLEW_OK != err )
225  {
226  const wxString msgError = (const char*) glewGetErrorString( err );
227 
228  wxLogMessage( msgError );
229 
230  return false;
231  }
232  else
233  {
234  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::initializeOpenGL Using GLEW version %s",
235  FROM_UTF8( (char*) glewGetString( GLEW_VERSION ) ) );
236  }
237 
238  wxString version = FROM_UTF8( (char *) glGetString( GL_VERSION ) );
239 
240  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::%s OpenGL version string %s.",
241  __WXFUNCTION__, version );
242 
243  // Extract OpenGL version from string. This method is used because prior to OpenGL 2,
244  // getting the OpenGL major and minor version as integers didn't exist.
245  wxString tmp;
246 
247  wxStringTokenizer tokenizer( version );
248 
249  if( tokenizer.HasMoreTokens() )
250  {
251  long major = 0;
252  long minor = 0;
253 
254  tmp = tokenizer.GetNextToken();
255 
256  tokenizer.SetString( tmp, wxString( "." ) );
257 
258  if( tokenizer.HasMoreTokens() )
259  tokenizer.GetNextToken().ToLong( &major );
260 
261  if( tokenizer.HasMoreTokens() )
262  tokenizer.GetNextToken().ToLong( &minor );
263 
264  if( major < 2 || ( ( major == 2 ) && ( minor < 1 ) ) )
265  {
266  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::%s OpenGL ray tracing not supported.",
267  __WXFUNCTION__ );
268 
269  if( GetParent() )
270  {
271  wxCommandEvent evt( wxEVT_MENU, ID_DISABLE_RAY_TRACING );
272  GetParent()->ProcessWindowEvent( evt );
273  }
274 
276  }
277 
278  if( ( major == 1 ) && ( minor < 5 ) )
279  {
280  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::%s OpenGL not supported.", __WXFUNCTION__ );
281 
283  }
284  }
285 
288 
289  return true;
290 }
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 929 of file eda_3d_canvas.cpp.

930 {
931  RAY mouseRay = getRayAtCurrrentMousePosition();
932 
933  float hit_t;
934 
935  // Test it with the board bounding box
936  if( m_boardAdapter.GetBBox().Intersect( mouseRay, &hit_t ) )
937  {
940  m_camera.SetLookAtPos_T1( mouseRay.at( hit_t ) );
942 
944  }
945 }
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 204 of file eda_3d_canvas.cpp.

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

References releaseOpenGL().

◆ OnEraseBackground()

void EDA_3D_CANVAS::OnEraseBackground ( wxEraseEvent &  event)
private

Definition at line 574 of file eda_3d_canvas.cpp.

575 {
576  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::OnEraseBackground" );
577  // Do nothing, to avoid flashing.
578 }
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 563 of file eda_3d_canvas.cpp.

564 {
565  if( !m_eventDispatcher )
566  aEvent.Skip();
567  else
569 
570  Refresh();
571 }
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 790 of file eda_3d_canvas.cpp.

791 {
792  SetFocus();
794 
795  if( !event.Dragging() && ( m_3d_render_raytracing != nullptr ) )
796  {
797  RAY mouseRay = getRayAtCurrrentMousePosition();
798 
799  BOARD_ITEM *intersectedBoardItem = m_3d_render_raytracing->IntersectBoardItem( mouseRay );
800 
801  // !TODO: send a selection item to pcbnew, eg: via kiway?
802  }
803 }
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 806 of file eda_3d_canvas.cpp.

807 {
808  if( m_camera_is_moving )
809  return;
810 
811  if( m_mouse_is_moving )
812  {
813  m_mouse_is_moving = false;
815  }
816 }
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 819 of file eda_3d_canvas.cpp.

820 {
821  SetFocus();
823 }
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 826 of file eda_3d_canvas.cpp.

827 {
828  if( m_camera_is_moving )
829  return;
830 
831  if( m_mouse_is_moving )
832  {
833  m_mouse_is_moving = false;
835  }
836  else
837  {
839  }
840 }
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 669 of file eda_3d_canvas.cpp.

670 {
671  //wxLogTrace( m_logTrace, wxT( "EDA_3D_CANVAS::OnMouseMove" ) );
672 
673  if( m_camera_is_moving )
674  return;
675 
677 
678  if( event.Dragging() )
679  {
680  if( event.LeftIsDown() ) // Drag
681  m_camera.Drag( event.GetPosition() );
682  else if( event.MiddleIsDown() ) // Pan
683  m_camera.Pan( event.GetPosition() );
684 
685  m_mouse_is_moving = true;
686  m_mouse_was_moved = true;
687 
688  // orientation has changed, redraw mesh
689  DisplayStatus();
690  Request_refresh();
691  }
692 
693  const wxPoint eventPosition = event.GetPosition();
694  m_camera.SetCurMousePosition( eventPosition );
695 
696  if( !event.Dragging() &&
698  {
700  static_cast<int>( EDA_3D_VIEWER_STATUSBAR::HOVERED_ITEM ) );
701 
702  RAY mouseRay = getRayAtCurrrentMousePosition();
703 
704  BOARD_ITEM *intersectedBoardItem = m_3d_render_raytracing->IntersectBoardItem( mouseRay );
705 
706  if( intersectedBoardItem )
707  {
708  if( intersectedBoardItem != m_currentIntersectedBoardItem )
709  {
711  m_currentIntersectedBoardItem = intersectedBoardItem;
712 
713  Request_refresh();
714  }
715 
716  switch( intersectedBoardItem->Type() )
717  {
718  case PCB_PAD_T:
719  {
720  PAD* pad = dynamic_cast<PAD*>( intersectedBoardItem );
721 
722  if( pad && pad->IsOnCopperLayer() )
723  {
724  reporter.Report( wxString::Format( _( "Net %s\tNetClass %s\tPadName %s" ),
725  pad->GetNet()->GetNetname(),
726  pad->GetNet()->GetNetClassName(),
727  pad->GetName() ) );
728  }
729  }
730  break;
731 
732  case PCB_FOOTPRINT_T:
733  {
734  FOOTPRINT* footprint = dynamic_cast<FOOTPRINT *>( intersectedBoardItem );
735 
736  if( footprint )
737  reporter.Report( footprint->GetReference() );
738  }
739  break;
740 
741  case PCB_TRACE_T:
742  case PCB_VIA_T:
743  case PCB_ARC_T:
744  {
745  TRACK* track = dynamic_cast<TRACK *>( intersectedBoardItem );
746 
747  if( track )
748  {
749  reporter.Report( wxString::Format( _( "Net %s\tNetClass %s" ),
750  track->GetNet()->GetNetname(),
751  track->GetNet()->GetNetClassName() ) );
752  }
753  }
754  break;
755 
756  case PCB_ZONE_T:
757  {
758  ZONE* zone = dynamic_cast<ZONE*>( intersectedBoardItem );
759 
760  if( zone && zone->IsOnCopperLayer() )
761  {
762  reporter.Report( wxString::Format( _( "Net %s\tNetClass %s" ),
763  zone->GetNet()->GetNetname(),
764  zone->GetNet()->GetNetClassName() ) );
765  }
766  }
767  break;
768 
769  default:
770  break;
771  }
772  }
773  else
774  {
775  if( ( m_currentIntersectedBoardItem != nullptr ) &&
777  {
779  Request_refresh();
780 
781  reporter.Report( "" );
782  }
783 
785  }
786  }
787 }
A wrapper for reporting to a specific text location in a statusbar.
Definition: reporter.h:280
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:108
NETINFO_ITEM * GetNet() const
Return #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)
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
Definition: netinfo.h:119
const wxString & GetReference() const
Definition: footprint.h:426
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
class ZONE, a copper pour area
Definition: typeinfo.h:105
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
Definition: zone.cpp:222
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:163

References _, DisplayStatus(), CAMERA::Drag(), Format(), HIDPI_GL_CANVAS::GetNativePixelSize(), BOARD_CONNECTED_ITEM::GetNet(), NETINFO_ITEM::GetNetClassName(), NETINFO_ITEM::GetNetname(), getRayAtCurrrentMousePosition(), FOOTPRINT::GetReference(), BOARD_ADAPTER::GetRenderEngine(), HOVERED_ITEM, RENDER_3D_RAYTRACE::IntersectBoardItem(), ZONE::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, pad, 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(), and EDA_ITEM::Type().

◆ OnMouseWheel()

void EDA_3D_CANVAS::OnMouseWheel ( wxMouseEvent &  event)
private

Definition at line 581 of file eda_3d_canvas.cpp.

582 {
583  bool mouseActivity = false;
584 
585  wxLogTrace( m_logTrace, "EDA_3D_CANVAS::OnMouseWheel" );
586 
587  if( m_camera_is_moving )
588  return;
589 
590  float delta_move = m_delta_move_step_factor * m_camera.ZoomGet();
591 
593  delta_move *= 0.01f * event.GetWheelRotation();
594  else
595  if( event.GetWheelRotation() < 0 )
596  delta_move = -delta_move;
597 
598  // mousewheel_panning enabled:
599  // wheel -> pan;
600  // wheel + shift -> horizontal scrolling;
601  // wheel + ctrl -> zooming;
602  // mousewheel_panning disabled:
603  // wheel + shift -> vertical scrolling;
604  // wheel + ctrl -> horizontal scrolling;
605  // wheel -> zooming.
606 
607  if( m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) && !event.ControlDown() )
608  {
609  if( event.GetWheelAxis() == wxMOUSE_WHEEL_HORIZONTAL || event.ShiftDown() )
610  m_camera.Pan( SFVEC3F( -delta_move, 0.0f, 0.0f ) );
611  else
612  m_camera.Pan( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
613 
614  mouseActivity = true;
615  }
616  else if( event.ShiftDown() && !m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) )
617  {
618  m_camera.Pan( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
619  mouseActivity = true;
620  }
621  else if( event.ControlDown() && !m_boardAdapter.GetFlag( FL_MOUSEWHEEL_PANNING ) )
622  {
623  m_camera.Pan( SFVEC3F( delta_move, 0.0f, 0.0f ) );
624  mouseActivity = true;
625  }
626  else
627  {
628  mouseActivity = m_camera.Zoom( event.GetWheelRotation() > 0 ? 1.1f : 1/1.1f );
629  }
630 
631  // If it results on a camera movement
632  if( mouseActivity )
633  {
634  DisplayStatus();
635  Request_refresh();
636 
637  m_mouse_is_moving = true;
638  m_mouse_was_moved = true;
639 
641  }
642 
643  // Update the cursor current mouse position on the camera
644  m_camera.SetCurMousePosition( event.GetPosition() );
645 }
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:44
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 342 of file eda_3d_canvas.cpp.

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

References DoRePaint().

◆ OnRefreshRequest()

void EDA_3D_CANVAS::OnRefreshRequest ( wxEvent &  aEvent)
private

Definition at line 873 of file eda_3d_canvas.cpp.

874 {
875  DoRePaint();
876 }
void DoRePaint()
The actual function to repaint the canvas.

References DoRePaint().

◆ OnResize()

void EDA_3D_CANVAS::OnResize ( wxSizeEvent &  event)
private

Definition at line 212 of file eda_3d_canvas.cpp.

213 {
214  this->Request_refresh();
215 }
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 843 of file eda_3d_canvas.cpp.

844 {
845  (void)event;
846 
847  m_mouse_is_moving = false;
848  m_mouse_was_moved = false;
849 
850  Request_refresh();
851 }
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 867 of file eda_3d_canvas.cpp.

868 {
869  Request_refresh( true );
870 }
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 182 of file eda_3d_canvas.cpp.

183 {
184  if( m_glRC )
185  {
187 
188  delete m_3d_render_raytracing;
189  m_3d_render_raytracing = nullptr;
190 
191  delete m_3d_render_ogl_legacy;
192  m_3d_render_ogl_legacy = nullptr;
193 
194  // This is just a copy of a pointer, can safely be set to NULL.
195  m_3d_render = nullptr;
196 
199  m_glRC = nullptr;
200  }
201 }
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 299 of file eda_3d_canvas.cpp.

300 {
301  if( aCachePointer != nullptr )
302  m_boardAdapter.Set3dCacheManager( aCachePointer );
303 
304  if( aBoard != nullptr )
305  m_boardAdapter.SetBoard( aBoard );
306 
307  m_boardAdapter.SetColorSettings( Pgm().GetSettingsManager().GetColorSettings() );
308 
309  if( m_3d_render )
311 }
void ReloadRequest()
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
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:44
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 1110 of file eda_3d_canvas.cpp.

1111 {
1112  switch( m_boardAdapter.GetRenderEngine() )
1113  {
1116  default: m_3d_render = nullptr; break;
1117  }
1118 
1119  if( m_3d_render )
1121 
1122  m_mouse_was_moved = false;
1123 
1124  Request_refresh();
1125 }
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 314 of file eda_3d_canvas.cpp.

315 {
317 
318  if( m_3d_render )
320 
322 
323  Request_refresh();
324 }
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 879 of file eda_3d_canvas.cpp.

880 {
881  if( aRedrawImmediately )
882  {
883  // Just calling Refresh() does not work always
884  // Using an event to call DoRepaint ensure the repaint code will be executed,
885  // and PostEvent will take priority to other events like mouse movements, keys, etc.
886  // and is executed during the next idle time
887  wxCommandEvent redrawEvent( wxEVT_REFRESH_CUSTOM_COMMAND, ID_CUSTOM_EVENT_1 );
888  wxPostEvent( this, redrawEvent );
889  }
890  else
891  {
892  // Schedule a timed redraw
893  m_redraw_trigger_timer.Start( 10 , wxTIMER_ONE_SHOT );
894  }
895 }
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 898 of file eda_3d_canvas.cpp.

899 {
900  wxASSERT( aMovingSpeed > FLT_EPSILON );
901 
902  // Fast forward the animation if the animation is disabled
903  if( !m_animation_enabled )
904  {
905  m_camera.Interpolate( 1.0f );
906  DisplayStatus();
907  Request_refresh();
908  return;
909  }
910 
911  // Map speed multiplier option to actual multiplier value
912  // [1,2,3,4,5] -> [0.25, 0.5, 1, 2, 4]
913  aMovingSpeed *= ( 1 << m_moving_speed_multiplier ) / 8.0f;
914 
915  m_render_pivot = aRenderPivot;
916  m_camera_moving_speed = aMovingSpeed;
917 
919 
920  DisplayStatus();
921  Request_refresh();
922 
923  m_camera_is_moving = true;
924 
926 }
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 860 of file eda_3d_canvas.cpp.

861 {
862  if( m_3d_render )
863  m_editing_timeout_timer.Start( m_3d_render->GetWaitForEditingTimeOut(), wxTIMER_ONE_SHOT );
864 }
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 557 of file eda_3d_canvas.cpp.

558 {
559  m_eventDispatcher = aEventDispatcher;
560 }
TOOL_DISPATCHER * m_eventDispatcher

References 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 948 of file eda_3d_canvas.cpp.

949 {
950  if( m_camera_is_moving )
951  return false;
952 
953  const float delta_move = m_delta_move_step_factor * m_camera.ZoomGet();
954  const float arrow_moving_time_speed = 8.0f;
955  bool handled = false;
956 
957  switch( aKeycode )
958  {
959  case WXK_SPACE:
961  return true;
962 
963  case WXK_LEFT:
966  m_camera.Pan_T1( SFVEC3F( -delta_move, 0.0f, 0.0f ) );
967  request_start_moving_camera( arrow_moving_time_speed, false );
968  return true;
969 
970  case WXK_RIGHT:
973  m_camera.Pan_T1( SFVEC3F( +delta_move, 0.0f, 0.0f ) );
974  request_start_moving_camera( arrow_moving_time_speed, false );
975  return true;
976 
977  case WXK_UP:
980  m_camera.Pan_T1( SFVEC3F( 0.0f, +delta_move, 0.0f ) );
981  request_start_moving_camera( arrow_moving_time_speed, false );
982  return true;
983 
984  case WXK_DOWN:
987  m_camera.Pan_T1( SFVEC3F( 0.0f, -delta_move, 0.0f ) );
988  request_start_moving_camera( arrow_moving_time_speed, false );
989  return true;
990 
991  case WXK_HOME:
994  m_camera.Reset_T1();
995  request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 1/1.26f ), 1.26f ) );
996  return true;
997 
998  case WXK_END:
999  break;
1000 
1001  case WXK_TAB:
1004  m_camera.RotateZ_T1( glm::radians( 45.0f ) );
1006  handled = true;
1007  break;
1008 
1009  case WXK_F1:
1012 
1013  if( m_camera.Zoom_T1( 1.26f ) ) // 3 steps per doubling
1015 
1016  return true;
1017 
1018  case WXK_F2:
1021 
1022  if( m_camera.Zoom_T1( 1/1.26f ) ) // 3 steps per halving
1024 
1025  return true;
1026 
1027  case ID_VIEW3D_RESET:
1030  m_camera.Reset_T1();
1031  request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
1032  return true;
1033 
1034  case ID_VIEW3D_RIGHT:
1037  m_camera.Reset_T1();
1038  m_camera.RotateZ_T1( glm::radians( -90.0f ) );
1039  m_camera.RotateX_T1( glm::radians( -90.0f ) );
1041  return true;
1042 
1043  case ID_VIEW3D_LEFT:
1046  m_camera.Reset_T1();
1047  m_camera.RotateZ_T1( glm::radians( 90.0f ) );
1048  m_camera.RotateX_T1( glm::radians( -90.0f ) );
1050  return true;
1051 
1052  case ID_VIEW3D_FRONT:
1055  m_camera.Reset_T1();
1056  m_camera.RotateX_T1( glm::radians( -90.0f ) );
1058  return true;
1059 
1060  case ID_VIEW3D_BACK:
1063  m_camera.Reset_T1();
1064  m_camera.RotateX_T1( glm::radians( -90.0f ) );
1065 
1066  // The rotation angle should be 180.
1067  // We use 179.999 (180 - epsilon) to avoid a full 360 deg rotation when
1068  // using 180 deg if the previous rotated position was already 180 deg
1069  m_camera.RotateZ_T1( glm::radians( 179.999f ) );
1071  return true;
1072 
1073  case ID_VIEW3D_TOP:
1076  m_camera.Reset_T1();
1077  request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
1078  return true;
1079 
1080  case ID_VIEW3D_BOTTOM:
1083  m_camera.Reset_T1();
1084  m_camera.RotateY_T1( glm::radians( 179.999f ) ); // Rotation = 180 - epsilon
1085  request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
1086  return true;
1087 
1088  case ID_VIEW3D_FLIP:
1091  m_camera.RotateY_T1( glm::radians( 179.999f ) );
1093  return true;
1094 
1095  default:
1096  return false;
1097  }
1098 
1099  m_mouse_was_moved = true;
1100 
1102 
1103  DisplayStatus();
1104  Request_refresh();
1105 
1106  return handled;
1107 }
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:44
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 854 of file eda_3d_canvas.cpp.

855 {
857 }
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: