KiCad PCB EDA Suite
Loading...
Searching...
No Matches
render_3d_opengl.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2015-2016 Mario Luzeiro <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21#ifndef RENDER_3D_OPENGL_H
22#define RENDER_3D_OPENGL_H
23
24#include <kicad_gl/kiglad.h> // Must be included first
25
26#include "../render_3d_base.h"
27#include "layer_triangles.h"
28#include "3d_spheres_gizmo.h"
29
36
37#include "3d_model.h"
38
39#include "3d_cache/3d_info.h"
40
41#include <geometry/eda_angle.h>
42#include <pad.h> // For PAD_DRILL_POST_MACHINING_MODE
43
44#include <atomic>
45#include <map>
46#include <memory>
47#include <stop_token>
48#include <thread>
49
50typedef std::map<PCB_LAYER_ID, std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED>> MAP_OGL_DISP_LISTS;
51typedef std::list<std::shared_ptr<TRIANGLE_DISPLAY_LIST>> LIST_TRIANGLES;
52
53#define SIZE_OF_CIRCLE_TEXTURE 1024
54
59{
60public:
61 explicit RENDER_3D_OPENGL( EDA_3D_CANVAS* aCanvas, BOARD_ADAPTER& aAdapter, CAMERA& aCamera );
62
64
65 void SetCurWindowSize( const wxSize& aSize ) override;
66 bool Redraw( bool aIsMoving ) override;
67
68 int GetWaitForEditingTimeOut() override;
69
70 void JoinBgWorker() override;
71 void StopBgWorker() override;
72
73 void SetCurrentRollOverItem( BOARD_ITEM* aRollOverItem )
74 {
75 m_currentRollOverItem = aRollOverItem;
76 }
77
82
87
88 void handleGizmoMouseInput( int mouseX, int mouseY );
89 void updateGizmoSelection( glm::mat4 aCameraRotationMatrix );
90 void setGizmoViewport( int x, int y, int width, int height );
91 std::tuple<int, int, int, int> getGizmoViewport() const;
94
95private:
96 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> generateHoles( const LIST_OBJECT2D& aListHolesObject2d,
97 const SHAPE_POLY_SET& aPoly, float aZtop, float aZbot,
98 bool aInvertFaces,
99 const BVH_CONTAINER_2D* aThroughHoles = nullptr );
100
101 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> generateLayerList( const BVH_CONTAINER_2D* aContainer,
102 const SHAPE_POLY_SET* aPolyList, PCB_LAYER_ID aLayer,
103 const BVH_CONTAINER_2D* aThroughHoles = nullptr );
104
105 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> generateEmptyLayerList( PCB_LAYER_ID aLayer );
106
107 void addTopAndBottomTriangles( std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDst, const SFVEC2F& v0,
108 const SFVEC2F& v1, const SFVEC2F& v2, float top, float bot );
109
110 void addObjectTriangles( const RING_2D* aRing, std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer,
111 float aZtop, float aZbot );
112
113 void addObjectTriangles( const POLYGON_4PT_2D* aPoly, std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer,
114 float aZtop, float aZbot );
115
116 void addObjectTriangles( const FILLED_CIRCLE_2D* aCircle, std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer,
117 float aZtop, float aZbot );
118
119 void addObjectTriangles( const TRIANGLE_2D* aTri, std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer,
120 float aZtop, float aZbot );
121
122 void addObjectTriangles( const ROUND_SEGMENT_2D* aSeg, std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer,
123 float aZtop, float aZbot );
124
125 void renderSolderMaskLayer( PCB_LAYER_ID aLayerID, float aZPos, bool aShowThickness,
126 bool aSkipRenderHoles );
127
128 void renderBoardBody( bool aSkipRenderHoles );
129
130 void getLayerZPos( PCB_LAYER_ID aLayerID, float& aOutZtop, float& aOutZbot ) const;
131
132 void generateRing( const SFVEC2F& aCenter, float aInnerRadius, float aOuterRadius,
133 unsigned int aNr_sides_per_circle,
134 std::vector< SFVEC2F >& aInnerContourResult,
135 std::vector< SFVEC2F >& aOuterContourResult, bool aInvertOrder );
136
137 void generateCylinder( const SFVEC2F& aCenter, float aInnerRadius, float aOuterRadius,
138 float aZtop, float aZbot, unsigned int aNr_sides_per_circle,
139 std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer );
140
141 void generateInvCone( const SFVEC2F& aCenter, float aInnerRadius, float aOuterRadius,
142 float aZtop, float aZbot, unsigned int aNr_sides_per_circle,
143 std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer, EDA_ANGLE aAngle );
144
145 void generateDisk( const SFVEC2F& aCenter, float aRadius, float aZ,
146 unsigned int aNr_sides_per_circle, std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer,
147 bool aTop );
148
149 void generateDimple( const SFVEC2F& aCenter, float aRadius, float aZ, float aDepth,
150 unsigned int aNr_sides_per_circle, std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer,
151 bool aTop );
152
153 void generateViasAndPads();
154
155 bool appendPostMachiningGeometry( std::shared_ptr<TRIANGLE_DISPLAY_LIST> aDstLayer,
156 const SFVEC2F& aHoleCenter,
158 int aSizeIU,
159 int aDepthIU,
160 float aHoleInnerRadius,
161 float aZSurface,
162 bool aIsFront,
163 float aPlatingThickness3d,
164 float aUnitScale,
165 float* aZEnd );
166
167 void generateViaBarrels( float aPlatingThickness3d, float aUnitScale );
168
169 void generatePlatedHoleShells( int aPlatingThickness, float aUnitScale );
170
171 void generateViaCovers( float aPlatingThickness3d, float aUnitScale );
172
181 void load3dModels( std::stop_token aStop = std::stop_token() );
182
185 {
187 std::shared_ptr<MODEL_3D> m_model;
191
192 MODELTORENDER( glm::mat4 aModelWorldMat,
193 std::shared_ptr<MODEL_3D> aModel,
194 float aOpacity,
195 bool aIsTransparent,
196 bool aIsSelected ) :
197 m_modelWorldMat( std::move( aModelWorldMat ) ),
198 m_model( std::move( aModel ) ),
199 m_opacity( aOpacity ),
200 m_isTransparent( aIsTransparent ),
201 m_isSelected( aIsSelected )
202 {
203 }
204 };
205
206 void renderPlaceholderForFootprint( std::list<MODELTORENDER>& aDstRenderList, const glm::mat4& aFpMatrix,
207 const FOOTPRINT* aFootprint, bool aRenderTransparentOnly, bool aIsSelected,
208 float aOpacity );
209
211
212 void renderOpaqueModels( const glm::mat4 &aCameraViewMatrix );
213
214 void renderExtrudedBodies( bool aTransparentPass );
215
216 void renderTransparentModels( const glm::mat4 &aCameraViewMatrix );
217
218 void renderModel( const glm::mat4 &aCameraViewMatrix, const MODELTORENDER &aModelToRender,
219 const SFVEC3F &aSelColor, const SFVEC3F *aCameraWorldPos );
220
221
222 void get3dModelsSelected( std::list<MODELTORENDER> &aDstRenderList, bool aGetTop, bool aGetBot,
223 bool aRenderTransparentOnly, bool aRenderSelectedOnly );
224
225 void get3dModelsFromFootprint( std::list<MODELTORENDER> &aDstRenderList,
226 const FOOTPRINT* aFootprint, bool aRenderTransparentOnly,
227 bool aIsSelected );
228
229 void setLightFront( bool enabled );
230 void setLightTop( bool enabled );
231 void setLightBottom( bool enabled );
232
238 void generate3dGrid( GRID3D_TYPE aGridType );
239
240 // Materials
241 void setupMaterials();
242
243 void setCopperMaterial();
245 void unsetDepthOffset();
246
247 void setLayerMaterial( PCB_LAYER_ID aLayerID );
248
249 bool initializeOpenGL();
250
251 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> createBoard( const SHAPE_POLY_SET& aBoardPoly,
252 const BVH_CONTAINER_2D* aThroughHoles = nullptr,
253 bool aTransparent = false );
254
260 void backfillPostMachine();
261
262 void reload();
263
264 void setArrowMaterial();
265
266 void freeAllLists();
267
269
270 void startBgWorker();
271 void bgWorker( std::stop_token aStop );
272 void runHitTestRebuild( std::stop_token aStop );
273 void sendRefreshView();
274
275 struct
276 {
287
289 std::jthread m_bgWorkerThread;
290 std::atomic<bool> m_bgWorkerBusy{ false };
291 std::atomic<bool> m_hitTestDirty{ false };
292 std::recursive_mutex m_renderMutex;
293
294private:
295 // Helper functions for safe access
296 template <typename T>
297 void assignRenderPtr( std::shared_ptr<T>& aDst, std::shared_ptr<T> aVal )
298 {
299 std::lock_guard lock( m_renderMutex );
300 retireRenderPtr( aDst );
301 aDst = std::move( aVal );
302 }
303
304 template <typename TMap>
305 void assignRenderMap( TMap& aMap, const typename TMap::key_type& aKey, typename TMap::mapped_type aVal )
306 {
307 std::lock_guard lock( m_renderMutex );
308 typename TMap::mapped_type& slot = aMap[aKey];
309 retireRenderPtr( slot );
310 slot = std::move( aVal );
311 }
312
313 template <typename T>
314 void retireRenderPtr( std::shared_ptr<T>& aPtr )
315 {
316 if( aPtr )
317 m_retiredRenderPtrs.push_back( std::move( aPtr ) );
318 }
319
320 void appendRenderTriangleList( std::shared_ptr<TRIANGLE_DISPLAY_LIST> aTriangles )
321 {
322 std::lock_guard lock( m_renderMutex );
323 m_triangles.push_back( std::move( aTriangles ) );
324 }
325
326private:
327 // Access to the following members must be protected by m_renderMutex:
329 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_platedPadsFront;
330 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_platedPadsBack;
331 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_offboardPadsFront;
332 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_offboardPadsBack;
335 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_board;
336 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_boardWithHoles;
337 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_postMachinePlugs;
338 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_antiBoard;
339 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_outerThroughHoles;
340 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_outerViaThroughHoles;
341 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_outerThroughHoleRings;
342 std::vector<std::shared_ptr<void>> m_retiredRenderPtrs;
343
346
347 GLuint m_grid;
349
350 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_microviaHoles;
351 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_padHoles;
352 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_viaFrontCover;
353 std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED> m_viaBackCover;
354
355 // Caches
356 std::map<wxString, std::shared_ptr<MODEL_3D_DEFERRED>> m_3dModelMap;
357 std::map<std::vector<float>, glm::mat4> m_3dModelMatrixMap;
358
360
364 std::shared_ptr<MODEL_3D> m_placeholderModel = nullptr;
365
366 std::map<const FOOTPRINT*, std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED>> m_extrudedBodyLists;
367 std::map<const FOOTPRINT*, std::shared_ptr<OPENGL_RENDER_LIST_DEFERRED>> m_extrudedPadLists;
368};
369
370#endif // RENDER_3D_OPENGL_H
GRID3D_TYPE
Grid types.
Definition 3d_enums.h:50
defines the basic data associated with a single 3D model.
A simplified non-intersecting 4 point polygon.
Helper class to handle information needed to display 3D board.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
A class used to derive camera objects from.
Definition camera.h:99
Implement a canvas based on a wxGLCanvas.
Simple non-intersecting polygon with 4 points.
RENDER_3D_BASE(BOARD_ADAPTER &aBoardAdapter, CAMERA &aCamera)
void runHitTestRebuild(std::stop_token aStop)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > generateHoles(const LIST_OBJECT2D &aListHolesObject2d, const SHAPE_POLY_SET &aPoly, float aZtop, float aZbot, bool aInvertFaces, const BVH_CONTAINER_2D *aThroughHoles=nullptr)
SPHERES_GIZMO::GizmoSphereSelection getSelectedGizmoSphere() const
void generateRing(const SFVEC2F &aCenter, float aInnerRadius, float aOuterRadius, unsigned int aNr_sides_per_circle, std::vector< SFVEC2F > &aInnerContourResult, std::vector< SFVEC2F > &aOuterContourResult, bool aInvertOrder)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_offboardPadsBack
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_microviaHoles
SHAPE_POLY_SET m_antiBoardPolys
The negative polygon representation of the board outline.
std::map< const FOOTPRINT *, std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > > m_extrudedBodyLists
void RebuildHitTestAsync()
Rebuild the raytracing hit-test scene in the background after a visibility change.
GRID3D_TYPE m_lastGridType
Stores the last grid type.
std::tuple< int, int, int, int > getGizmoViewport() const
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_viaFrontCover
void renderOpaqueModels(const glm::mat4 &aCameraViewMatrix)
void Load3dModelsIfNeeded()
Load footprint models if they are not already loaded, i.e.
void StopBgWorker() override
Request stop and join any in-progress background loading.
void generate3dGrid(GRID3D_TYPE aGridType)
Create a 3D grid to an OpenGL display list.
void setLightFront(bool enabled)
std::shared_ptr< MODEL_3D > m_placeholderModel
bool Redraw(bool aIsMoving) override
Redraw the view.
MAP_OGL_DISP_LISTS m_layers
MAP_OGL_DISP_LISTS m_innerLayerHoles
void appendRenderTriangleList(std::shared_ptr< TRIANGLE_DISPLAY_LIST > aTriangles)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_postMachinePlugs
Board material plugs for backdrill/counterbore/countersink.
RENDER_3D_OPENGL(EDA_3D_CANVAS *aCanvas, BOARD_ADAPTER &aAdapter, CAMERA &aCamera)
std::atomic< bool > m_hitTestDirty
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_offboardPadsFront
MAP_OGL_DISP_LISTS m_outerLayerHoles
BOARD_ITEM * m_currentRollOverItem
void renderBoardBody(bool aSkipRenderHoles)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > generateEmptyLayerList(PCB_LAYER_ID aLayer)
std::map< std::vector< float >, glm::mat4 > m_3dModelMatrixMap
void generateDisk(const SFVEC2F &aCenter, float aRadius, float aZ, unsigned int aNr_sides_per_circle, std::shared_ptr< TRIANGLE_DISPLAY_LIST > aDstLayer, bool aTop)
void SetCurrentRollOverItem(BOARD_ITEM *aRollOverItem)
std::recursive_mutex m_renderMutex
void generateDimple(const SFVEC2F &aCenter, float aRadius, float aZ, float aDepth, unsigned int aNr_sides_per_circle, std::shared_ptr< TRIANGLE_DISPLAY_LIST > aDstLayer, bool aTop)
LIST_TRIANGLES m_triangles
store pointers so can be deleted latter
void assignRenderMap(TMap &aMap, const typename TMap::key_type &aKey, typename TMap::mapped_type aVal)
bool appendPostMachiningGeometry(std::shared_ptr< TRIANGLE_DISPLAY_LIST > aDstLayer, const SFVEC2F &aHoleCenter, PAD_DRILL_POST_MACHINING_MODE aMode, int aSizeIU, int aDepthIU, float aHoleInnerRadius, float aZSurface, bool aIsFront, float aPlatingThickness3d, float aUnitScale, float *aZEnd)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_platedPadsFront
void setLayerMaterial(PCB_LAYER_ID aLayerID)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_platedPadsBack
void generateViaCovers(float aPlatingThickness3d, float aUnitScale)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_board
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_boardWithHoles
void retireRenderPtr(std::shared_ptr< T > &aPtr)
void load3dModels(std::stop_token aStop=std::stop_token())
Load footprint models from the cache and load it to deferred openGL lists (MODEL_3D_DEFERRED) objects...
struct RENDER_3D_OPENGL::@136145154067207014164113243162246125147361200233 m_materials
void renderModel(const glm::mat4 &aCameraViewMatrix, const MODELTORENDER &aModelToRender, const SFVEC3F &aSelColor, const SFVEC3F *aCameraWorldPos)
int GetWaitForEditingTimeOut() override
Give the interface the time (in ms) that it should wait for editing or movements before (this works f...
SMATERIAL m_NonPlatedCopper
void generateInvCone(const SFVEC2F &aCenter, float aInnerRadius, float aOuterRadius, float aZtop, float aZbot, unsigned int aNr_sides_per_circle, std::shared_ptr< TRIANGLE_DISPLAY_LIST > aDstLayer, EDA_ANGLE aAngle)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_antiBoard
void generatePlatedHoleShells(int aPlatingThickness, float aUnitScale)
std::map< wxString, std::shared_ptr< MODEL_3D_DEFERRED > > m_3dModelMap
void renderSolderMaskLayer(PCB_LAYER_ID aLayerID, float aZPos, bool aShowThickness, bool aSkipRenderHoles)
void renderTransparentModels(const glm::mat4 &aCameraViewMatrix)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_outerThroughHoles
void get3dModelsSelected(std::list< MODELTORENDER > &aDstRenderList, bool aGetTop, bool aGetBot, bool aRenderTransparentOnly, bool aRenderSelectedOnly)
std::atomic< bool > m_bgWorkerBusy
void setPlatedCopperAndDepthOffset(PCB_LAYER_ID aLayer_id)
void updateGizmoSelection(glm::mat4 aCameraRotationMatrix)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > generateLayerList(const BVH_CONTAINER_2D *aContainer, const SHAPE_POLY_SET *aPolyList, PCB_LAYER_ID aLayer, const BVH_CONTAINER_2D *aThroughHoles=nullptr)
std::map< const FOOTPRINT *, std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > > m_extrudedPadLists
void getLayerZPos(PCB_LAYER_ID aLayerID, float &aOutZtop, float &aOutZbot) const
void SetCurWindowSize(const wxSize &aSize) override
Before each render, the canvas will tell the render what is the size of its windows,...
void bgWorker(std::stop_token aStop)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_padHoles
EDA_3D_CANVAS * m_canvas
void renderPlaceholderForFootprint(std::list< MODELTORENDER > &aDstRenderList, const glm::mat4 &aFpMatrix, const FOOTPRINT *aFootprint, bool aRenderTransparentOnly, bool aIsSelected, float aOpacity)
std::vector< std::shared_ptr< void > > m_retiredRenderPtrs
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > createBoard(const SHAPE_POLY_SET &aBoardPoly, const BVH_CONTAINER_2D *aThroughHoles=nullptr, bool aTransparent=false)
SPHERES_GIZMO * m_spheres_gizmo
void JoinBgWorker() override
Block until any in-progress background loading has finished.
void generateViaBarrels(float aPlatingThickness3d, float aUnitScale)
void addTopAndBottomTriangles(std::shared_ptr< TRIANGLE_DISPLAY_LIST > aDst, const SFVEC2F &v0, const SFVEC2F &v1, const SFVEC2F &v2, float top, float bot)
std::jthread m_bgWorkerThread
GLuint m_grid
oGL list that stores current grid
void get3dModelsFromFootprint(std::list< MODELTORENDER > &aDstRenderList, const FOOTPRINT *aFootprint, bool aRenderTransparentOnly, bool aIsSelected)
void assignRenderPtr(std::shared_ptr< T > &aDst, std::shared_ptr< T > aVal)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_outerViaThroughHoles
void handleGizmoMouseInput(int mouseX, int mouseY)
void setLightBottom(bool enabled)
void setGizmoViewport(int x, int y, int width, int height)
void addObjectTriangles(const RING_2D *aRing, std::shared_ptr< TRIANGLE_DISPLAY_LIST > aDstLayer, float aZtop, float aZbot)
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_outerThroughHoleRings
void backfillPostMachine()
Create ring-shaped plugs for holes that have backdrill or post-machining.
std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > m_viaBackCover
void generateCylinder(const SFVEC2F &aCenter, float aInnerRadius, float aOuterRadius, float aZtop, float aZbot, unsigned int aNr_sides_per_circle, std::shared_ptr< TRIANGLE_DISPLAY_LIST > aDstLayer)
void setLightTop(bool enabled)
Represent a set of closed polygons.
Renders a set of colored spheres in 3D space that act as a directional orientation gizmo.
GizmoSphereSelection
Enum to indicate which sphere (direction) is selected.
std::list< OBJECT_2D * > LIST_OBJECT2D
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
STL namespace.
PAD_DRILL_POST_MACHINING_MODE
Definition padstack.h:75
std::map< PCB_LAYER_ID, std::shared_ptr< OPENGL_RENDER_LIST_DEFERRED > > MAP_OGL_DISP_LISTS
std::list< std::shared_ptr< TRIANGLE_DISPLAY_LIST > > LIST_TRIANGLES
MODELTORENDER(glm::mat4 aModelWorldMat, std::shared_ptr< MODEL_3D > aModel, float aOpacity, bool aIsTransparent, bool aIsSelected)
std::shared_ptr< MODEL_3D > m_model
KIBIS top(path, &reporter)
VECTOR3I v1(5, 5, 5)
VECTOR2I v2(1, 0)
glm::vec2 SFVEC2F
Definition xv3d_types.h:38
glm::vec3 SFVEC3F
Definition xv3d_types.h:40