Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
4fd3dbb5
Commit
4fd3dbb5
authored
Mar 09, 2014
by
jean-pierre charras
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Finishing work on a better 3D viewer. this also fix bugs like Bug #1129630 .
parent
f24bc87a
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
122 additions
and
72 deletions
+122
-72
3d_aux.cpp
3d-viewer/3d_aux.cpp
+3
-46
3d_canvas.h
3d-viewer/3d_canvas.h
+0
-1
3d_class.cpp
3d-viewer/3d_class.cpp
+21
-1
3d_draw.cpp
3d-viewer/3d_draw.cpp
+35
-15
3d_draw_basic_functions.cpp
3d-viewer/3d_draw_basic_functions.cpp
+2
-2
3d_struct.h
3d-viewer/3d_struct.h
+42
-1
modelparsers.h
3d-viewer/modelparsers.h
+1
-1
vrmlmodelparser.cpp
3d-viewer/vrmlmodelparser.cpp
+6
-2
x3dmodelparser.cpp
3d-viewer/x3dmodelparser.cpp
+5
-2
class_module.h
pcbnew/class_module.h
+7
-1
No files found.
3d-viewer/3d_aux.cpp
View file @
4fd3dbb5
...
...
@@ -45,16 +45,11 @@
#include <info3d_visu.h>
#include <trackball.h>
// Exported function:
void
Set_Object_Data
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
);
void
S3D_MASTER
::
Set_Object_Coords
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
)
void
S3D_MASTER
::
ObjectCoordsTo3DUnits
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
)
{
unsigned
ii
;
/* adjust object scale, rotation and offset position */
for
(
ii
=
0
;
ii
<
aVertices
.
size
();
ii
++
)
for
(
unsigned
ii
=
0
;
ii
<
aVertices
.
size
();
ii
++
)
{
aVertices
[
ii
].
x
*=
m_MatScale
.
x
;
aVertices
[
ii
].
y
*=
m_MatScale
.
y
;
...
...
@@ -79,7 +74,7 @@ void S3D_MASTER::Set_Object_Coords( std::vector< S3D_VERTEX >& aVertices )
}
void
Set_Object_Data
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
)
void
TransfertToGLlist
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
)
{
unsigned
ii
;
GLfloat
ax
,
ay
,
az
,
bx
,
by
,
bz
,
nx
,
ny
,
nz
,
r
;
...
...
@@ -138,44 +133,6 @@ void Set_Object_Data( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits
glEnd
();
}
GLuint
EDA_3D_CANVAS
::
DisplayCubeforTest
()
{
GLuint
gllist
=
glGenLists
(
1
);
glNewList
(
gllist
,
GL_COMPILE_AND_EXECUTE
);
/* draw six faces of a cube */
glBegin
(
GL_QUADS
);
glNormal3f
(
0.0
F
,
0.0
F
,
1.0
F
);
glVertex3f
(
0.5
F
,
0.5
F
,
0.5
F
);
glVertex3f
(
-
0.5
F
,
0.5
F
,
0.5
F
);
glVertex3f
(
-
0.5
F
,
-
0.5
F
,
0.5
F
);
glVertex3f
(
0.5
F
,
-
0.5
F
,
0.5
F
);
glNormal3f
(
0.0
F
,
0.0
F
,
-
1.0
F
);
glVertex3f
(
-
0.5
F
,
-
0.5
F
,
-
0.5
F
);
glVertex3f
(
-
0.5
F
,
0.5
F
,
-
0.5
F
);
glVertex3f
(
0.5
F
,
0.5
F
,
-
0.5
F
);
glVertex3f
(
0.5
F
,
-
0.5
F
,
-
0.5
F
);
glNormal3f
(
0.0
F
,
1.0
F
,
0.0
F
);
glVertex3f
(
0.5
F
,
0.5
F
,
0.5
F
);
glVertex3f
(
0.5
F
,
0.5
F
,
-
0.5
F
);
glVertex3f
(
-
0.5
F
,
0.5
F
,
-
0.5
F
);
glVertex3f
(
-
0.5
F
,
0.5
F
,
0.5
F
);
glNormal3f
(
0.0
F
,
-
1.0
F
,
0.0
F
);
glVertex3f
(
-
0.5
F
,
-
0.5
F
,
-
0.5
F
);
glVertex3f
(
0.5
F
,
-
0.5
F
,
-
0.5
F
);
glVertex3f
(
0.5
F
,
-
0.5
F
,
0.5
F
);
glVertex3f
(
-
0.5
F
,
-
0.5
F
,
0.5
F
);
glNormal3f
(
1.0
F
,
0.0
F
,
0.0
F
);
glVertex3f
(
0.5
F
,
0.5
F
,
0.5
F
);
glVertex3f
(
0.5
F
,
-
0.5
F
,
0.5
F
);
glVertex3f
(
0.5
F
,
-
0.5
F
,
-
0.5
F
);
glVertex3f
(
0.5
F
,
0.5
F
,
-
0.5
F
);
glNormal3f
(
-
1.0
F
,
0.0
F
,
0.0
F
);
glVertex3f
(
-
0.5
F
,
-
0.5
F
,
-
0.5
F
);
glVertex3f
(
-
0.5
F
,
-
0.5
F
,
0.5
F
);
glVertex3f
(
-
0.5
F
,
0.5
F
,
0.5
F
);
glVertex3f
(
-
0.5
F
,
0.5
F
,
-
0.5
F
);
glEnd
();
glEndList
();
return
gllist
;
}
VERTEX_VALUE_CTRL
::
VERTEX_VALUE_CTRL
(
wxWindow
*
aParent
,
wxBoxSizer
*
aBoxSizer
)
{
wxString
text
;
...
...
3d-viewer/3d_canvas.h
View file @
4fd3dbb5
...
...
@@ -104,7 +104,6 @@ public:
void
OnEnterWindow
(
wxMouseEvent
&
event
);
// Display functions
GLuint
DisplayCubeforTest
();
// Just a test function
void
SetView3D
(
int
keycode
);
void
DisplayStatus
();
void
Redraw
();
...
...
3d-viewer/3d_class.cpp
View file @
4fd3dbb5
...
...
@@ -41,9 +41,14 @@ S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
m_Name
=
name
;
}
void
S3D_MATERIAL
::
SetMaterial
()
{
S3D_MASTER
*
s3dParent
=
(
S3D_MASTER
*
)
GetParent
();
s3dParent
->
SetLastTransparency
(
m_Transparency
);
if
(
!
s3dParent
->
IsOpenGlAllowed
()
)
return
;
glColorMaterial
(
GL_FRONT_AND_BACK
,
GL_AMBIENT_AND_DIFFUSE
);
glColor4f
(
m_DiffuseColor
.
x
*
m_AmbientIntensity
,
m_DiffuseColor
.
y
*
m_AmbientIntensity
,
...
...
@@ -56,6 +61,20 @@ void S3D_MATERIAL::SetMaterial()
#endif
}
bool
S3D_MASTER
::
IsOpenGlAllowed
()
{
if
(
m_loadNonTransparentObjects
)
// return true for non transparent objects only
{
if
(
m_lastTransparency
==
0.0
)
return
true
;
}
if
(
m_loadTransparentObjects
)
// return true for transparent objects only
if
(
m_lastTransparency
!=
0.0
)
return
true
;
return
false
;
}
void
S3D_MASTER
::
Insert
(
S3D_MATERIAL
*
aMaterial
)
{
...
...
@@ -79,6 +98,7 @@ S3D_MASTER::S3D_MASTER( EDA_ITEM* aParent ) :
EDA_ITEM
(
aParent
,
NOT_USED
)
{
m_MatScale
.
x
=
m_MatScale
.
y
=
m_MatScale
.
z
=
1.0
;
m_lastTransparency
=
0.0
;
m_3D_Drawings
=
NULL
;
m_Materials
=
NULL
;
m_ShapeType
=
FILE3D_NONE
;
...
...
3d-viewer/3d_draw.cpp
View file @
4fd3dbb5
...
...
@@ -356,7 +356,7 @@ void EDA_3D_CANVAS::BuildBoard3DView()
}
}
// draw graphic items
// draw graphic items
on copper layers (texts)
for
(
BOARD_ITEM
*
item
=
pcb
->
m_Drawings
;
item
;
item
=
item
->
Next
()
)
{
if
(
!
item
->
IsOnLayer
(
layer
)
)
...
...
@@ -364,11 +364,9 @@ void EDA_3D_CANVAS::BuildBoard3DView()
switch
(
item
->
Type
()
)
{
case
PCB_LINE_T
:
case
PCB_LINE_T
:
// should not exist on copper layers
(
(
DRAWSEGMENT
*
)
item
)
->
TransformShapeWithClearanceToPolygon
(
bufferPolys
,
0
,
segcountforcircle
,
correctionFactor
);
bufferPolys
,
0
,
segcountforcircle
,
correctionFactor
);
break
;
case
PCB_TEXT_T
:
...
...
@@ -505,8 +503,7 @@ void EDA_3D_CANVAS::BuildTechLayers3DView()
// a fine representation
CPOLYGONS_LIST
bufferPolys
;
bufferPolys
.
reserve
(
200000
);
// Reserve for large board (tracks mainly)
bufferPolys
.
reserve
(
100000
);
// Reserve for large board
CPOLYGONS_LIST
allLayerHoles
;
// Contains through holes, calculated only once
allLayerHoles
.
reserve
(
20000
);
...
...
@@ -522,11 +519,6 @@ void EDA_3D_CANVAS::BuildTechLayers3DView()
wxMessageBox
(
msg
);
}
CPOLYGONS_LIST
bufferZonesPolys
;
bufferZonesPolys
.
reserve
(
500000
);
// Reserve for large board ( copper zones mainly )
CPOLYGONS_LIST
currLayerHoles
;
// Contains holes for the current layer
int
thickness
=
g_Parm_3D_Visu
.
GetCopperThicknessBIU
();
for
(
TRACK
*
track
=
pcb
->
m_Track
;
track
!=
NULL
;
track
=
track
->
Next
()
)
{
...
...
@@ -544,6 +536,16 @@ void EDA_3D_CANVAS::BuildTechLayers3DView()
}
}
// draw pads holes
for
(
MODULE
*
module
=
pcb
->
m_Modules
;
module
!=
NULL
;
module
=
module
->
Next
()
)
{
// Add pad hole, if any
D_PAD
*
pad
=
module
->
Pads
();
for
(
;
pad
!=
NULL
;
pad
=
pad
->
Next
()
)
pad
->
BuildPadDrillShapePolygon
(
allLayerHoles
,
0
,
segcountLowQuality
);
}
// draw graphic items, on technical layers
...
...
@@ -852,6 +854,7 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
#endif
}
void
EDA_3D_CANVAS
::
BuildFootprintShape3DList
(
GLuint
aOpaqueList
,
GLuint
aTransparentList
)
{
...
...
@@ -860,10 +863,21 @@ void EDA_3D_CANVAS::BuildFootprintShape3DList( GLuint aOpaqueList,
// which need to be drawn after all other items
BOARD
*
pcb
=
GetBoard
();
glNewList
(
m_glLists
[
GL_ID_3DSHAPES_SOLID
],
GL_COMPILE
);
glNewList
(
aOpaqueList
,
GL_COMPILE
);
bool
loadTransparentObjects
=
false
;
for
(
MODULE
*
module
=
pcb
->
m_Modules
;
module
;
module
=
module
->
Next
()
)
module
->
ReadAndInsert3DComponentShape
(
this
,
!
loadTransparentObjects
,
loadTransparentObjects
);
glEndList
();
glNewList
(
aTransparentList
,
GL_COMPILE
);
loadTransparentObjects
=
true
;
for
(
MODULE
*
module
=
pcb
->
m_Modules
;
module
;
module
=
module
->
Next
()
)
module
->
ReadAndInsert3DComponentShape
(
this
);
module
->
ReadAndInsert3DComponentShape
(
this
,
!
loadTransparentObjects
,
loadTransparentObjects
);
glEndList
();
}
...
...
@@ -1055,8 +1069,11 @@ void EDA_3D_CANVAS::Draw3DViaHole( SEGVIA* aVia )
}
void
MODULE
::
ReadAndInsert3DComponentShape
(
EDA_3D_CANVAS
*
glcanvas
)
void
MODULE
::
ReadAndInsert3DComponentShape
(
EDA_3D_CANVAS
*
glcanvas
,
bool
aAllowNonTransparentObjects
,
bool
aAllowTransparentObjects
)
{
// Read from disk and draws the footprint 3D shapes if exists
S3D_MASTER
*
shape3D
=
m_3D_Drawings
;
double
zpos
=
g_Parm_3D_Visu
.
GetModulesZcoord3DIU
(
IsFlipped
()
);
...
...
@@ -1078,6 +1095,9 @@ void MODULE::ReadAndInsert3DComponentShape( EDA_3D_CANVAS* glcanvas )
for
(
;
shape3D
!=
NULL
;
shape3D
=
shape3D
->
Next
()
)
{
shape3D
->
SetLoadNonTransparentObjects
(
aAllowNonTransparentObjects
);
shape3D
->
SetLoadTransparentObjects
(
aAllowTransparentObjects
);
if
(
shape3D
->
Is3DType
(
S3D_MASTER
::
FILE3D_VRML
)
)
shape3D
->
ReadData
();
}
...
...
3d-viewer/3d_draw_basic_functions.cpp
View file @
4fd3dbb5
...
...
@@ -35,7 +35,7 @@
#include <3d_draw_basic_functions.h>
// Imported function:
extern
void
Set_Object_Data
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
);
extern
void
TransfertToGLlist
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
);
extern
void
CheckGLError
();
// Number of segments to approximate a circle by segments
...
...
@@ -116,7 +116,7 @@ static void Draw3D_VerticalPolygonalCylinder( const CPOLYGONS_LIST& aPolysList,
coords
[
3
].
y
=
coords
[
2
].
y
;
// only z change
// Creates the GL_QUAD
Set_Object_Data
(
coords
,
aBiuTo3DUnits
);
TransfertToGLlist
(
coords
,
aBiuTo3DUnits
);
}
}
...
...
3d-viewer/3d_struct.h
View file @
4fd3dbb5
...
...
@@ -109,6 +109,10 @@ public:
private
:
wxString
m_Shape3DName
;
/* 3D shape name in 3D library */
FILE3D_TYPE
m_ShapeType
;
double
m_lastTransparency
;
// last transparency value from
// last material in use
bool
m_loadTransparentObjects
;
bool
m_loadNonTransparentObjects
;
public
:
S3D_MASTER
(
EDA_ITEM
*
aParent
);
...
...
@@ -117,11 +121,41 @@ public:
S3D_MASTER
*
Next
()
const
{
return
(
S3D_MASTER
*
)
Pnext
;
}
S3D_MASTER
*
Back
()
const
{
return
(
S3D_MASTER
*
)
Pback
;
}
// Accessors
void
SetLastTransparency
(
double
aValue
)
{
m_lastTransparency
=
aValue
;
}
void
SetLoadTransparentObjects
(
bool
aLoad
)
{
m_loadTransparentObjects
=
aLoad
;
}
void
SetLoadNonTransparentObjects
(
bool
aLoad
)
{
m_loadNonTransparentObjects
=
aLoad
;
}
void
Insert
(
S3D_MATERIAL
*
aMaterial
);
/**
* Function IsOpenGlAllowed
* @return true if opengl current list accepts a gl data
* used to filter transparent objects, which are drawn after
* non transparent objects
*/
bool
IsOpenGlAllowed
();
void
Copy
(
S3D_MASTER
*
pattern
);
/**
* Function ReadData
* Select the parser to read the 3D data file (vrml, x3d ...)
* and build the description objects list
*/
int
ReadData
();
void
Set_Object_Coords
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
);
/**
* Function ObjectCoordsTo3DUnits
* @param aVertices = a list of 3D coordinates in shape units
* to convert to 3D canvas units, according to the
* footprint 3Dshape rotation, offset and scale parameters
*/
void
ObjectCoordsTo3DUnits
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
);
#if defined(DEBUG)
void
Show
(
int
nestLevel
,
std
::
ostream
&
os
)
const
{
ShowDummy
(
os
);
}
// override
...
...
@@ -147,6 +181,13 @@ public:
*/
const
wxString
GetShape3DFullFilename
();
/**
* Function SetShape3DName
* @param aShapeName = file name of the data file relative to the 3D shape
*
* Set the filename of the 3D shape, and depending on the file extention
* (vrl, x3d, idf ) the type of file.
*/
void
SetShape3DName
(
const
wxString
&
aShapeName
);
};
...
...
3d-viewer/modelparsers.h
View file @
4fd3dbb5
...
...
@@ -37,7 +37,7 @@
class
S3D_MASTER
;
class
S3D_VERTEX
;
extern
void
Set_Object_Data
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
);
extern
void
TransfertToGLlist
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
);
class
S3D_MODEL_PARSER
;
class
X3D_MODEL_PARSER
;
...
...
3d-viewer/vrmlmodelparser.cpp
View file @
4fd3dbb5
...
...
@@ -519,8 +519,12 @@ int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum )
vertices
.
push_back
(
vertex
);
}
GetMaster
()
->
Set_Object_Coords
(
vertices
);
Set_Object_Data
(
vertices
,
vrmlunits_to_3Dunits
);
if
(
GetMaster
()
->
IsOpenGlAllowed
()
)
{
GetMaster
()
->
ObjectCoordsTo3DUnits
(
vertices
);
TransfertToGLlist
(
vertices
,
vrmlunits_to_3Dunits
);
}
vertices
.
clear
();
coordIndex
.
clear
();
}
...
...
3d-viewer/x3dmodelparser.cpp
View file @
4fd3dbb5
...
...
@@ -479,8 +479,11 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
vertices
.
push_back
(
triplets
.
at
(
*
id
)
);
}
GetMaster
()
->
Set_Object_Coords
(
vertices
);
Set_Object_Data
(
vertices
,
vrmlunits_to_3Dunits
);
if
(
GetMaster
()
->
IsOpenGlAllowed
()
)
{
GetMaster
()
->
ObjectCoordsTo3DUnits
(
vertices
);
TransfertToGLlist
(
vertices
,
vrmlunits_to_3Dunits
);
}
vertices
.
clear
();
coordIndex
.
clear
();
...
...
pcbnew/class_module.h
View file @
4fd3dbb5
...
...
@@ -250,8 +250,14 @@ public:
* function ReadandInsert3DComponentShape
* read the 3D component shape(s) of the footprint (physical shape)
* and insert mesh in gl list
* @param glcanvas = the openGL canvas
* @param aAllowNonTransparentObjects = true to load non transparent objects
* @param aAllowTransparentObjects = true to load non transparent objects
* in openGL, transparent objects should be drawn *after* non transparent objects
*/
void
ReadAndInsert3DComponentShape
(
EDA_3D_CANVAS
*
glcanvas
);
void
ReadAndInsert3DComponentShape
(
EDA_3D_CANVAS
*
glcanvas
,
bool
aAllowNonTransparentObjects
,
bool
aAllowTransparentObjects
);
/**
* function TransformPadsShapesWithClearanceToPolygon
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment