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
7c482f68
Commit
7c482f68
authored
Mar 03, 2008
by
CHARRAS
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added Jonas Diemer's patch (3D display: enhanced movings from mouse and tools)
parent
56ef4d3b
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
765 additions
and
711 deletions
+765
-711
3d_canvas.cpp
3d-viewer/3d_canvas.cpp
+19
-8
3d_draw.cpp
3d-viewer/3d_draw.cpp
+740
-703
change_log.txt
change_log.txt
+6
-0
No files found.
3d-viewer/3d_canvas.cpp
View file @
7c482f68
...
...
@@ -282,6 +282,8 @@ void Pcb3D_GLCanvas::OnMouseEvent( wxMouseEvent& event )
}
if
(
event
.
Dragging
()
)
{
if
(
event
.
LeftIsDown
()
)
{
/* drag in progress, simulate trackball */
trackball
(
spin_quat
,
...
...
@@ -291,6 +293,15 @@ void Pcb3D_GLCanvas::OnMouseEvent( wxMouseEvent& event )
(
size
.
y
-
2.0
*
event
.
GetY
()
)
/
size
.
y
);
add_quats
(
spin_quat
,
g_Parm_3D_Visu
.
m_Quat
,
g_Parm_3D_Visu
.
m_Quat
);
}
else
if
(
event
.
MiddleIsDown
()
)
{
/* middle button drag -> pan */
/* Current zoom and an additional factor are taken into account for the amount of panning. */
const
float
PAN_FACTOR
=
8.0
*
g_Parm_3D_Visu
.
m_Zoom
;
g_Draw3d_dx
-=
PAN_FACTOR
*
(
g_Parm_3D_Visu
.
m_Beginx
-
event
.
GetX
()
)
/
size
.
x
;
g_Draw3d_dy
-=
PAN_FACTOR
*
(
event
.
GetY
()
-
g_Parm_3D_Visu
.
m_Beginy
)
/
size
.
y
;
}
/* orientation has changed, redraw mesh */
DisplayStatus
();
...
...
3d-viewer/3d_draw.cpp
View file @
7c482f68
//////////////////////////////////////
// Name: 3d_draw.cpp
//////////////////////////////////////
...
...
@@ -27,43 +28,51 @@
#include "3d_struct.h"
static
void
Draw3D_FilledCircle
(
double
posx
,
double
posy
,
double
rayon
,
double
hole_rayon
,
double
zpos
);
static
void
Draw3D_FilledSegment
(
double
startx
,
double
starty
,
double
endx
,
double
endy
,
double
width
,
double
zpos
);
static
void
Draw3D_FilledCylinder
(
double
posx
,
double
posy
,
double
rayon
,
double
height
,
double
zpos
);
static
void
Draw3D_FilledSegmentWithHole
(
double
startx
,
double
starty
,
double
endx
,
double
endy
,
double
width
,
double
holex
,
double
holey
,
double
holeradius
,
double
zpos
);
/**********************************/
static
void
Draw3D_FilledCircle
(
double
posx
,
double
posy
,
double
rayon
,
double
hole_rayon
,
double
zpos
);
static
void
Draw3D_FilledSegment
(
double
startx
,
double
starty
,
double
endx
,
double
endy
,
double
width
,
double
zpos
);
static
void
Draw3D_FilledCylinder
(
double
posx
,
double
posy
,
double
rayon
,
double
height
,
double
zpos
);
static
void
Draw3D_FilledSegmentWithHole
(
double
startx
,
double
starty
,
double
endx
,
double
endy
,
double
width
,
double
holex
,
double
holey
,
double
holeradius
,
double
zpos
);
/******************************************/
void
Pcb3D_GLCanvas
::
Redraw
(
bool
finish
)
/**********************************/
/**********************************
********
/
{
SetCurrent
();
InitGL
();
glMatrixMode
(
GL_MODELVIEW
);
/* position viewer */
glMatrixMode
(
GL_MODELVIEW
);
/* position viewer */
/* transformations */
GLfloat
mat
[
4
][
4
];
// Translatory motion first, so rotations don't mess up the orientation...
glTranslatef
(
g_Draw3d_dx
,
g_Draw3d_dy
,
0.0
F
);
build_rotmatrix
(
mat
,
g_Parm_3D_Visu
.
m_Quat
);
glMultMatrixf
(
&
mat
[
0
][
0
]
);
glTranslatef
(
g_Draw3d_dx
,
g_Draw3d_dy
,
0.0
F
);
glRotatef
(
g_Parm_3D_Visu
.
m_Rot
[
0
],
1.0
,
0.0
,
0.0
);
glRotatef
(
g_Parm_3D_Visu
.
m_Rot
[
1
],
0.0
,
1.0
,
0.0
);
glRotatef
(
g_Parm_3D_Visu
.
m_Rot
[
2
],
0.0
,
0.0
,
1.0
);
glRotatef
(
g_Parm_3D_Visu
.
m_Rot
[
0
],
1.0
,
0.0
,
0.0
);
glRotatef
(
g_Parm_3D_Visu
.
m_Rot
[
1
],
0.0
,
1.0
,
0.0
);
glRotatef
(
g_Parm_3D_Visu
.
m_Rot
[
2
],
0.0
,
0.0
,
1.0
);
if
(
m_gllist
)
glCallList
(
m_gllist
);
else
{
m_gllist
=
CreateDrawGL_List
();
// m_gllist = DisplayCubeforTest(); // Only for test
}
...
...
@@ -77,14 +86,15 @@ void Pcb3D_GLCanvas::Redraw( bool finish )
/**********************************************/
GLuint
Pcb3D_GLCanvas
::
CreateDrawGL_List
()
/**********************************************/
/* Creation de la liste des elements a afficher
*/
{
GLuint
gllist
=
glGenLists
(
1
);
WinEDA_BasePcbFrame
*
pcbframe
=
m_Parent
->
m_Parent
;
BOARD
*
pcb
=
pcbframe
->
m_Pcb
;
TRACK
*
pt_piste
;
int
ii
;
GLuint
gllist
=
glGenLists
(
1
);
WinEDA_BasePcbFrame
*
pcbframe
=
m_Parent
->
m_Parent
;
BOARD
*
pcb
=
pcbframe
->
m_Pcb
;
TRACK
*
pt_piste
;
int
ii
;
wxBusyCursor
dummy
;
...
...
@@ -92,9 +102,10 @@ int ii;
g_Parm_3D_Visu
.
m_BoardSettings
=
pcb
->
m_BoardSettings
;
g_Parm_3D_Visu
.
m_BoardSize
=
pcb
->
m_BoundaryBox
.
GetSize
();
g_Parm_3D_Visu
.
m_BoardPos
=
pcb
->
m_BoundaryBox
.
Centre
();
g_Parm_3D_Visu
.
m_BoardPos
.
y
=
-
g_Parm_3D_Visu
.
m_BoardPos
.
y
;
g_Parm_3D_Visu
.
m_BoardPos
.
y
=
-
g_Parm_3D_Visu
.
m_BoardPos
.
y
;
g_Parm_3D_Visu
.
m_Layers
=
pcb
->
m_BoardSettings
->
m_CopperLayerCount
;
g_Parm_3D_Visu
.
m_BoardScale
=
2.0
/
MAX
(
g_Parm_3D_Visu
.
m_BoardSize
.
x
,
g_Parm_3D_Visu
.
m_BoardSize
.
y
);
g_Parm_3D_Visu
.
m_BoardScale
=
2.0
/
MAX
(
g_Parm_3D_Visu
.
m_BoardSize
.
x
,
g_Parm_3D_Visu
.
m_BoardSize
.
y
);
float
epoxy_width
=
1.6
;
// epoxy width in mm
g_Parm_3D_Visu
.
m_Epoxy_Width
=
epoxy_width
/
2.54
*
1000
*
g_Parm_3D_Visu
.
m_BoardScale
;
...
...
@@ -108,6 +119,7 @@ int ii;
else
g_Parm_3D_Visu
.
m_LayerZcoord
[
ii
]
=
g_Parm_3D_Visu
.
m_Epoxy_Width
;
}
GLfloat
zpos_cu
=
500
*
g_Parm_3D_Visu
.
m_BoardScale
;
GLfloat
zpos_cmp
=
g_Parm_3D_Visu
.
m_Epoxy_Width
+
zpos_cu
;
g_Parm_3D_Visu
.
m_LayerZcoord
[
ADHESIVE_N_CU
]
=
-
zpos_cu
*
2
;
...
...
@@ -121,46 +133,47 @@ int ii;
glNewList
(
gllist
,
GL_COMPILE_AND_EXECUTE
);
glColorMaterial
(
GL_FRONT_AND_BACK
,
GL_AMBIENT_AND_DIFFUSE
);
glColorMaterial
(
GL_FRONT_AND_BACK
,
GL_AMBIENT_AND_DIFFUSE
);
/* draw axes */
glEnable
(
GL_COLOR_MATERIAL
);
SetGLColor
(
WHITE
);
glBegin
(
GL_LINES
);
glEnable
(
GL_COLOR_MATERIAL
);
SetGLColor
(
WHITE
);
glBegin
(
GL_LINES
);
glNormal3f
(
0.0
,
0.0
,
1.0
);
// Normal is Z axis
glVertex3f
(
0.0
,
0.0
,
0.0
);
glVertex3f
(
1.0
,
0.0
,
0.0
);
// X axis
glVertex3f
(
0.0
,
0.0
,
0.0
);
glVertex3f
(
0.0
,
-
1.0
,
0.0
);
// Y axis
glNormal3f
(
1.0
,
0.0
,
0.0
);
// Normal is Y axis
glVertex3f
(
0.0
,
0.0
,
0.0
);
glVertex3f
(
0.0
,
0.0
,
0.0
);
glVertex3f
(
0.0
,
-
1.0
,
0.0
);
// Y axis
glNormal3f
(
1.0
,
0.0
,
0.0
);
// Normal is Y axis
glVertex3f
(
0.0
,
0.0
,
0.0
);
glVertex3f
(
0.0
,
0.0
,
0.3
);
// Z axis
glEnd
();
/* Draw epoxy limits (do not use, works and test in progress) */
#if 0
glEnable(GL_FOG
);
glEnable( GL_FOG
);
GLfloat param;
// param = GL_LINEAR;
// glFogfv(GL_FOG_MODE, & param);
param = 0.2;
glFogfv(GL_FOG_DENSITY, & param
);
glFogfv( GL_FOG_DENSITY, ¶m
);
param = g_Parm_3D_Visu.m_LayerZcoord[15];
glFogfv(GL_FOG_END, & param
);
glBegin(GL_QUADS
);
SetGLColor(g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[CMP_N]
);
glFogfv( GL_FOG_END, ¶m
);
glBegin( GL_QUADS
);
SetGLColor( g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[CMP_N]
);
double sx = DataScale3D * g_Parm_3D_Visu.m_BoardSize.x / 2;
double sy = DataScale3D * g_Parm_3D_Visu.m_BoardSize.y / 2;
double zpos = g_Parm_3D_Visu.m_LayerZcoord[15];
glNormal3f( 0.0, 0.0, 1.0
); // Normal is Z axis
glNormal3f( 0.0, 0.0, 1.0
); // Normal is Z axis
sx = sy = 0.5;
glVertex3f( -sx, -sy, zpos );
glVertex3f( -sx, sy, zpos );
glVertex3f( sx, sy, zpos );
glVertex3f( sx, -sy, zpos );
glEnd();
glBegin(GL_QUADS
);
SetGLColor(g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[COPPER_LAYER_N]
);
glBegin( GL_QUADS
);
SetGLColor( g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[COPPER_LAYER_N]
);
glNormal3f( 0.0, 0.0, -1.0 ); // Normal is -Z axis
glVertex3f( -sx, -sy, 0 );
glVertex3f( -sx, sy, 0 );
...
...
@@ -170,55 +183,56 @@ int ii;
#endif
/* Translation du trac du BOARD pour placer son centre en 0, 0 */
glTranslatef
(
-
g_Parm_3D_Visu
.
m_BoardPos
.
x
*
g_Parm_3D_Visu
.
m_BoardScale
,
glTranslatef
(
-
g_Parm_3D_Visu
.
m_BoardPos
.
x
*
g_Parm_3D_Visu
.
m_BoardScale
,
-
g_Parm_3D_Visu
.
m_BoardPos
.
y
*
g_Parm_3D_Visu
.
m_BoardScale
,
0.0
F
);
0.0
F
);
glNormal3f
(
0.0
,
0.0
,
1.0
);
// Normal is Z axis
/* Trac des pistes : */
for
(
pt_piste
=
pcb
->
m_Track
;
pt_piste
!=
NULL
;
pt_piste
=
(
TRACK
*
)
pt_piste
->
Pnext
)
{
if
(
pt_piste
->
Type
()
==
TYPEVIA
)
Draw3D_Via
((
SEGVIA
*
)
pt_piste
);
Draw3D_Via
(
(
SEGVIA
*
)
pt_piste
);
else
Draw3D_Track
(
pt_piste
);
Draw3D_Track
(
pt_piste
);
}
/* Trac des edges */
EDA_BaseStruct
*
PtStruct
;
EDA_BaseStruct
*
PtStruct
;
for
(
PtStruct
=
pcb
->
m_Drawings
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
#define STRUCT ((DRAWSEGMENT *) PtStruct
)
#define STRUCT ( (DRAWSEGMENT*) PtStruct
)
if
(
PtStruct
->
Type
()
!=
TYPEDRAWSEGMENT
)
continue
;
Draw3D_DrawSegment
(
STRUCT
);
Draw3D_DrawSegment
(
STRUCT
);
}
/* trac des modules */
MODULE
*
Module
=
(
MODULE
*
)
pcb
->
m_Modules
;
for
(
;
Module
!=
NULL
;
Module
=
(
MODULE
*
)
Module
->
Pnext
)
MODULE
*
Module
=
(
MODULE
*
)
pcb
->
m_Modules
;
for
(
;
Module
!=
NULL
;
Module
=
(
MODULE
*
)
Module
->
Pnext
)
{
Module
->
Draw3D
(
this
);
Module
->
Draw3D
(
this
);
}
glEndList
();
/* Test for errors */
GLenum
err
=
glGetError
();
if
(
err
!=
GL_NO_ERROR
)
DisplayError
(
this
,
wxT
(
"Error in GL commands"
)
);
DisplayError
(
this
,
wxT
(
"Error in GL commands"
)
);
return
gllist
;
}
/************************************************/
void
Pcb3D_GLCanvas
::
Draw3D_Track
(
TRACK
*
track
)
void
Pcb3D_GLCanvas
::
Draw3D_Track
(
TRACK
*
track
)
/************************************************/
{
double
zpos
;
int
layer
=
track
->
GetLayer
();
int
color
=
g_Parm_3D_Visu
.
m_BoardSettings
->
m_LayerColor
[
layer
];
double
ox
,
oy
,
fx
,
fy
;
double
w
;
double
zpos
;
int
layer
=
track
->
GetLayer
();
int
color
=
g_Parm_3D_Visu
.
m_BoardSettings
->
m_LayerColor
[
layer
];
double
ox
,
oy
,
fx
,
fy
;
double
w
;
if
(
color
&
ITEM_NOT_SHOW
)
return
;
...
...
@@ -226,7 +240,7 @@ double w;
layer
=
g_Parm_3D_Visu
.
m_Layers
-
1
;
zpos
=
g_Parm_3D_Visu
.
m_LayerZcoord
[
layer
];
SetGLColor
(
color
);
SetGLColor
(
color
);
glNormal3f
(
0.0
,
0.0
,
(
layer
==
COPPER_LAYER_N
)
?
-
1.0
:
1.0
);
w
=
track
->
m_Width
*
g_Parm_3D_Visu
.
m_BoardScale
;
...
...
@@ -234,20 +248,21 @@ double w;
oy
=
track
->
m_Start
.
y
*
g_Parm_3D_Visu
.
m_BoardScale
;
fx
=
track
->
m_End
.
x
*
g_Parm_3D_Visu
.
m_BoardScale
;
fy
=
track
->
m_End
.
y
*
g_Parm_3D_Visu
.
m_BoardScale
;
Draw3D_FilledSegment
(
ox
,
-
oy
,
fx
,
-
fy
,
w
,
zpos
);
Draw3D_FilledSegment
(
ox
,
-
oy
,
fx
,
-
fy
,
w
,
zpos
);
}
/********************************************/
void
Pcb3D_GLCanvas
::
Draw3D_Via
(
SEGVIA
*
via
)
void
Pcb3D_GLCanvas
::
Draw3D_Via
(
SEGVIA
*
via
)
/*********************************************/
/* 3D drawing for a VIA (cylinder + filled circles)
*/
{
double
x
,
y
,
r
,
hole
;
int
layer
,
top_layer
,
bottom_layer
;
double
zpos
,
height
;
int
color
;
double
x
,
y
,
r
,
hole
;
int
layer
,
top_layer
,
bottom_layer
;
double
zpos
,
height
;
int
color
;
r
=
via
->
m_Width
*
g_Parm_3D_Visu
.
m_BoardScale
/
2
;
hole
=
via
->
GetDrillValue
();
...
...
@@ -255,7 +270,7 @@ int color;
x
=
via
->
m_Start
.
x
*
g_Parm_3D_Visu
.
m_BoardScale
;
y
=
via
->
m_Start
.
y
*
g_Parm_3D_Visu
.
m_BoardScale
;
via
->
ReturnLayerPair
(
&
top_layer
,
&
bottom_layer
);
via
->
ReturnLayerPair
(
&
top_layer
,
&
bottom_layer
);
// Drawing filled circles:
for
(
layer
=
bottom_layer
;
layer
<
g_Parm_3D_Visu
.
m_Layers
;
layer
++
)
...
...
@@ -267,32 +282,33 @@ int color;
color
=
g_Parm_3D_Visu
.
m_BoardSettings
->
m_LayerColor
[
CMP_N
];
if
(
color
&
ITEM_NOT_SHOW
)
continue
;
SetGLColor
(
color
);
SetGLColor
(
color
);
glNormal3f
(
0.0
,
0.0
,
(
layer
==
COPPER_LAYER_N
)
?
-
1.0
:
1.0
);
Draw3D_FilledCircle
(
x
,
-
y
,
r
,
hole
,
zpos
);
if
(
layer
>=
top_layer
)
Draw3D_FilledCircle
(
x
,
-
y
,
r
,
hole
,
zpos
);
if
(
layer
>=
top_layer
)
break
;
}
// Drawing hole:
SetGLColor
(
DARKGRAY
);
SetGLColor
(
DARKGRAY
);
height
=
g_Parm_3D_Visu
.
m_LayerZcoord
[
top_layer
]
-
g_Parm_3D_Visu
.
m_LayerZcoord
[
bottom_layer
];
Draw3D_FilledCylinder
(
x
,
-
y
,
hole
,
height
,
g_Parm_3D_Visu
.
m_LayerZcoord
[
bottom_layer
]
);
Draw3D_FilledCylinder
(
x
,
-
y
,
hole
,
height
,
g_Parm_3D_Visu
.
m_LayerZcoord
[
bottom_layer
]
);
}
/*************************************************************/
void
Pcb3D_GLCanvas
::
Draw3D_DrawSegment
(
DRAWSEGMENT
*
segment
)
void
Pcb3D_GLCanvas
::
Draw3D_DrawSegment
(
DRAWSEGMENT
*
segment
)
/*************************************************************/
{
int
layer
;
double
x
,
y
,
xf
,
yf
;
double
zpos
,
w
;
int
color
=
g_Parm_3D_Visu
.
m_BoardSettings
->
m_LayerColor
[
segment
->
GetLayer
()];
int
layer
;
double
x
,
y
,
xf
,
yf
;
double
zpos
,
w
;
int
color
=
g_Parm_3D_Visu
.
m_BoardSettings
->
m_LayerColor
[
segment
->
GetLayer
()];
if
(
color
&
ITEM_NOT_SHOW
)
return
;
SetGLColor
(
color
);
SetGLColor
(
color
);
w
=
segment
->
m_Width
*
g_Parm_3D_Visu
.
m_BoardScale
;
x
=
segment
->
m_Start
.
x
*
g_Parm_3D_Visu
.
m_BoardScale
;
y
=
segment
->
m_Start
.
y
*
g_Parm_3D_Visu
.
m_BoardScale
;
...
...
@@ -308,7 +324,6 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->GetLayer()];
Draw3D_FilledSegment
(
x
,
-
y
,
xf
,
-
yf
,
w
,
zpos
);
}
}
else
{
zpos
=
g_Parm_3D_Visu
.
m_LayerZcoord
[
segment
->
GetLayer
()];
...
...
@@ -318,18 +333,18 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->GetLayer()];
/*********************************************/
void
MODULE
::
Draw3D
(
Pcb3D_GLCanvas
*
glcanvas
)
void
MODULE
::
Draw3D
(
Pcb3D_GLCanvas
*
glcanvas
)
/*********************************************/
{
D_PAD
*
pad
=
m_Pads
;
D_PAD
*
pad
=
m_Pads
;
#if 0
if( !
DisplayOpt.Show_Modules_Cmp )
if( !
DisplayOpt.Show_Modules_Cmp )
{
if( m_Layer == CMP_N )
return;
}
if( !
DisplayOpt.Show_Modules_Cu )
if( !
DisplayOpt.Show_Modules_Cu )
{
if( m_Layer == COPPER_LAYER_N )
return;
...
...
@@ -337,23 +352,23 @@ D_PAD * pad = m_Pads;
#endif
/* Draw pads */
glColorMaterial
(
GL_FRONT_AND_BACK
,
GL_AMBIENT_AND_DIFFUSE
);
glColorMaterial
(
GL_FRONT_AND_BACK
,
GL_AMBIENT_AND_DIFFUSE
);
glNormal3f
(
0.0
,
0.0
,
1.0
);
// Normal is Z axis
for
(
;
pad
!=
NULL
;
pad
=
(
D_PAD
*
)
pad
->
Pnext
)
{
pad
->
Draw3D
(
glcanvas
);
pad
->
Draw3D
(
glcanvas
);
}
/* Draw module shape: 3D shape if exists (or module edge if not exists) */
Struct3D_Master
*
Struct3D
=
m_3D_Drawings
;
bool
As3dShape
=
FALSE
;
Struct3D_Master
*
Struct3D
=
m_3D_Drawings
;
bool
As3dShape
=
FALSE
;
glPushMatrix
();
glTranslatef
(
m_Pos
.
x
*
g_Parm_3D_Visu
.
m_BoardScale
,
-
m_Pos
.
y
*
g_Parm_3D_Visu
.
m_BoardScale
,
g_Parm_3D_Visu
.
m_LayerZcoord
[
m_Layer
]
);
if
(
m_Orient
)
{
glRotatef
(
(
double
)
m_Orient
/
10
,
0.0
,
0.0
,
1.0
);
glRotatef
(
(
double
)
m_Orient
/
10
,
0.0
,
0.0
,
1.0
);
}
if
(
m_Layer
==
COPPER_LAYER_N
)
{
...
...
@@ -362,19 +377,20 @@ bool As3dShape = FALSE;
}
DataScale3D
=
g_Parm_3D_Visu
.
m_BoardScale
*
UNITS3D_TO_UNITSPCB
;
for
(
;
Struct3D
!=
NULL
;
Struct3D
=
(
Struct3D_Master
*
)
Struct3D
->
Pnext
)
for
(
;
Struct3D
!=
NULL
;
Struct3D
=
(
Struct3D_Master
*
)
Struct3D
->
Pnext
)
{
if
(
!
Struct3D
->
m_Shape3DName
.
IsEmpty
()
)
if
(
!
Struct3D
->
m_Shape3DName
.
IsEmpty
()
)
{
As3dShape
=
TRUE
;
Struct3D
->
ReadData
();
}
}
glPopMatrix
();
if
(
!
As3dShape
)
if
(
!
As3dShape
)
{
EDA_BaseStruct
*
Struct
=
m_Drawings
;
EDA_BaseStruct
*
Struct
=
m_Drawings
;
glNormal3f
(
0.0
,
0.0
,
1.0
);
// Normal is Z axis
for
(
;
Struct
!=
NULL
;
Struct
=
Struct
->
Pnext
)
{
...
...
@@ -384,7 +400,7 @@ bool As3dShape = FALSE;
break
;
case
TYPEEDGEMODULE
:
((
EDGE_MODULE
*
)
Struct
)
->
Draw3D
(
glcanvas
);
(
(
EDGE_MODULE
*
)
Struct
)
->
Draw3D
(
glcanvas
);
break
;
default
:
...
...
@@ -396,17 +412,17 @@ bool As3dShape = FALSE;
/***************************************************/
void
EDGE_MODULE
::
Draw3D
(
Pcb3D_GLCanvas
*
glcanvas
)
void
EDGE_MODULE
::
Draw3D
(
Pcb3D_GLCanvas
*
glcanvas
)
/***************************************************/
{
int
ux0
,
uy0
,
dx
,
dy
,
rayon
,
StAngle
,
EndAngle
;
double
scale
,
x
,
y
,
fx
,
fy
,
w
,
zpos
;
int
color
=
g_Parm_3D_Visu
.
m_BoardSettings
->
m_LayerColor
[
m_Layer
];
int
ux0
,
uy0
,
dx
,
dy
,
rayon
,
StAngle
,
EndAngle
;
double
scale
,
x
,
y
,
fx
,
fy
,
w
,
zpos
;
int
color
=
g_Parm_3D_Visu
.
m_BoardSettings
->
m_LayerColor
[
m_Layer
];
if
(
color
&
ITEM_NOT_SHOW
)
return
;
SetGLColor
(
color
);
SetGLColor
(
color
);
glNormal3f
(
0.0
,
0.0
,
(
m_Layer
==
COPPER_LAYER_N
)
?
-
1.0
:
1.0
);
scale
=
g_Parm_3D_Visu
.
m_BoardScale
;
...
...
@@ -416,6 +432,7 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[m_Layer];
dy
=
m_End
.
y
;
zpos
=
g_Parm_3D_Visu
.
m_LayerZcoord
[
m_Layer
];
w
=
m_Width
*
g_Parm_3D_Visu
.
m_BoardScale
;
switch
(
m_Shape
)
{
case
S_SEGMENT
:
...
...
@@ -423,17 +440,17 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[m_Layer];
y
=
m_Start
.
y
*
g_Parm_3D_Visu
.
m_BoardScale
;
fx
=
dx
*
g_Parm_3D_Visu
.
m_BoardScale
;
fy
=
dy
*
g_Parm_3D_Visu
.
m_BoardScale
;
Draw3D_FilledSegment
(
x
,
-
y
,
fx
,
-
fy
,
w
,
zpos
);
break
;
Draw3D_FilledSegment
(
x
,
-
y
,
fx
,
-
fy
,
w
,
zpos
);
break
;
case
S_CIRCLE
:
rayon
=
(
int
)
hypot
(
(
double
)(
dx
-
ux0
),
(
double
)
(
dy
-
uy0
)
);
rayon
=
(
int
)
hypot
(
(
double
)
(
dx
-
ux0
),
(
double
)
(
dy
-
uy0
)
);
/* TO DO */
break
;
case
S_ARC
:
rayon
=
(
int
)
hypot
(
(
double
)(
dx
-
ux0
),
(
double
)
(
dy
-
uy0
)
);
StAngle
=
(
int
)
ArcTangente
(
dy
-
uy0
,
dx
-
ux0
);
rayon
=
(
int
)
hypot
(
(
double
)
(
dx
-
ux0
),
(
double
)
(
dy
-
uy0
)
);
StAngle
=
(
int
)
ArcTangente
(
dy
-
uy0
,
dx
-
ux0
);
EndAngle
=
StAngle
+
m_Angle
;
/* TO DO */
break
;
...
...
@@ -442,31 +459,32 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[m_Layer];
/***********************************************/
void
D_PAD
::
Draw3D
(
Pcb3D_GLCanvas
*
glcanvas
)
void
D_PAD
::
Draw3D
(
Pcb3D_GLCanvas
*
glcanvas
)
/***********************************************/
/* Dessin 3D des pads avec leur trou de percage
*/
{
int
ii
,
ll
,
layer
,
nlmax
;
int
ux0
,
uy0
,
int
ii
,
ll
,
layer
,
nlmax
;
int
ux0
,
uy0
,
dx
,
dx0
,
dy
,
dy0
,
delta_cx
,
delta_cy
,
xc
,
yc
;
int
angle
,
delta_angle
;
int
coord
[
4
][
2
];
double
fcoord
[
8
][
2
],
f_hole_coord
[
8
][
2
];
float
scale
;
double
zpos
;
wxPoint
shape_pos
;
double
x
,
y
,
r
,
w
,
hole
,
holeX
,
holeY
;
double
drillx
,
drilly
;
bool
Oncu
,
Oncmp
,
Both
;
int
color
;
int
angle
,
delta_angle
;
int
coord
[
4
][
2
];
double
fcoord
[
8
][
2
],
f_hole_coord
[
8
][
2
];
float
scale
;
double
zpos
;
wxPoint
shape_pos
;
double
x
,
y
,
r
,
w
,
hole
,
holeX
,
holeY
;
double
drillx
,
drilly
;
bool
Oncu
,
Oncmp
,
Both
;
int
color
;
scale
=
g_Parm_3D_Visu
.
m_BoardScale
;
holeX
=
(
double
)
m_Drill
.
x
*
scale
/
2
;
holeY
=
(
double
)
m_Drill
.
y
*
scale
/
2
;
hole
=
MIN
(
holeX
,
holeY
);
holeX
=
(
double
)
m_Drill
.
x
*
scale
/
2
;
holeY
=
(
double
)
m_Drill
.
y
*
scale
/
2
;
hole
=
MIN
(
holeX
,
holeY
);
/* calcul du centre des formes des pads : */
shape_pos
=
ReturnShapePos
();
...
...
@@ -485,8 +503,8 @@ int color;
/* Draw the pad hole (TODO: draw OBLONG hole) */
if
(
holeX
&&
holeY
)
{
SetGLColor
(
DARKGRAY
);
Draw3D_FilledCylinder
(
drillx
,
-
drilly
,
hole
,
g_Parm_3D_Visu
.
m_LayerZcoord
[
CMP_N
],
0.0
);
SetGLColor
(
DARKGRAY
);
Draw3D_FilledCylinder
(
drillx
,
-
drilly
,
hole
,
g_Parm_3D_Visu
.
m_LayerZcoord
[
CMP_N
],
0.0
);
}
glNormal3f
(
0.0
,
0.0
,
1.0
);
// Normal is Z axis
...
...
@@ -494,33 +512,35 @@ int color;
Oncu
=
(
m_Masque_Layer
&
CUIVRE_LAYER
)
?
TRUE
:
FALSE
;
Oncmp
=
(
m_Masque_Layer
&
CMP_LAYER
)
?
TRUE
:
FALSE
;
Both
=
Oncu
&&
Oncmp
;
switch
(
m_PadShape
&
0x7F
)
{
case
PAD_CIRCLE
:
case
PAD_CIRCLE
:
x
=
xc
*
scale
;
y
=
yc
*
scale
;
r
=
(
double
)
dx
*
scale
;
r
=
(
double
)
dx
*
scale
;
for
(
layer
=
FIRST_COPPER_LAYER
;
layer
<=
LAST_COPPER_LAYER
;
layer
++
)
{
if
(
layer
&&
(
layer
==
nlmax
)
)
layer
=
CMP_N
;
if
(
(
layer
==
CMP_N
)
&&
!
Oncmp
)
if
(
(
layer
==
CMP_N
)
&&
!
Oncmp
)
continue
;
if
(
(
layer
==
COPPER_LAYER_N
)
&&
!
Oncu
)
if
(
(
layer
==
COPPER_LAYER_N
)
&&
!
Oncu
)
continue
;
if
(
(
layer
>
FIRST_COPPER_LAYER
)
&&
(
layer
<
LAST_COPPER_LAYER
)
&&
!
Both
)
if
(
(
layer
>
FIRST_COPPER_LAYER
)
&&
(
layer
<
LAST_COPPER_LAYER
)
&&
!
Both
)
continue
;
color
=
g_Parm_3D_Visu
.
m_BoardSettings
->
m_LayerColor
[
layer
];
if
(
color
&
ITEM_NOT_SHOW
)
continue
;
SetGLColor
(
color
);
SetGLColor
(
color
);
glNormal3f
(
0.0
,
0.0
,
(
layer
==
COPPER_LAYER_N
)
?
-
1.0
:
1.0
);
zpos
=
g_Parm_3D_Visu
.
m_LayerZcoord
[
layer
];
Draw3D_FilledCircle
(
x
,
-
y
,
r
,
hole
,
zpos
);
Draw3D_FilledCircle
(
x
,
-
y
,
r
,
hole
,
zpos
);
}
break
;
case
PAD_OVAL
:
case
PAD_OVAL
:
/* calcul de l'entraxe de l'ellipse */
if
(
dx
>
dy
)
/* ellipse horizontale */
{
...
...
@@ -536,20 +556,20 @@ int color;
w
=
m_Size
.
x
*
scale
;
delta_angle
=
angle
;
}
RotatePoint
(
&
delta_cx
,
&
delta_cy
,
angle
);
RotatePoint
(
&
delta_cx
,
&
delta_cy
,
angle
);
{
double
ox
,
oy
,
fx
,
fy
;
ox
=
(
double
)
(
ux0
+
delta_cx
)
*
scale
;
oy
=
(
double
)
(
uy0
+
delta_cy
)
*
scale
;
fx
=
(
double
)
(
ux0
-
delta_cx
)
*
scale
;
fy
=
(
double
)
(
uy0
-
delta_cy
)
*
scale
;
for
(
layer
=
FIRST_COPPER_LAYER
;
layer
<=
LAST_COPPER_LAYER
;
layer
++
)
ox
=
(
double
)
(
ux0
+
delta_cx
)
*
scale
;
oy
=
(
double
)
(
uy0
+
delta_cy
)
*
scale
;
fx
=
(
double
)
(
ux0
-
delta_cx
)
*
scale
;
fy
=
(
double
)
(
uy0
-
delta_cy
)
*
scale
;
for
(
layer
=
FIRST_COPPER_LAYER
;
layer
<=
LAST_COPPER_LAYER
;
layer
++
)
{
if
(
layer
&&
(
layer
==
nlmax
)
)
layer
=
CMP_N
;
if
(
(
layer
==
CMP_N
)
&&
!
Oncmp
)
if
(
(
layer
==
CMP_N
)
&&
!
Oncmp
)
continue
;
if
(
(
layer
==
COPPER_LAYER_N
)
&&
!
Oncu
)
if
(
(
layer
==
COPPER_LAYER_N
)
&&
!
Oncu
)
continue
;
if
(
(
layer
>
FIRST_COPPER_LAYER
)
&&
(
layer
<
LAST_COPPER_LAYER
)
&&
!
Both
)
continue
;
...
...
@@ -557,36 +577,37 @@ int color;
glNormal3f
(
0.0
,
0.0
,
(
layer
==
COPPER_LAYER_N
)
?
-
1.0
:
1.0
);
if
(
color
&
ITEM_NOT_SHOW
)
continue
;
SetGLColor
(
color
);
SetGLColor
(
color
);
zpos
=
g_Parm_3D_Visu
.
m_LayerZcoord
[
layer
];
Draw3D_FilledSegmentWithHole
(
ox
,
-
oy
,
fx
,
-
fy
,
w
,
drillx
,
-
drilly
,
hole
,
zpos
);
Draw3D_FilledSegmentWithHole
(
ox
,
-
oy
,
fx
,
-
fy
,
w
,
drillx
,
-
drilly
,
hole
,
zpos
);
}
}
break
;
case
PAD_RECT
:
case
PAD_RECT
:
// case SPECIAL_PAD:
case
PAD_TRAPEZOID
:
{
int
ddx
,
ddy
;
ddx
=
m_DeltaSize
.
x
>>
1
;
ddy
=
m_DeltaSize
.
y
>>
1
;
/* demi dim dx et dy */
int
ddx
,
ddy
;
ddx
=
m_DeltaSize
.
x
>>
1
;
ddy
=
m_DeltaSize
.
y
>>
1
;
/* demi dim dx et dy */
coord
[
0
][
0
]
=
-
dx
-
ddy
;
coord
[
0
][
1
]
=
+
dy
+
ddx
;
coord
[
0
][
0
]
=
-
dx
-
ddy
;
coord
[
0
][
1
]
=
+
dy
+
ddx
;
coord
[
1
][
0
]
=
-
dx
+
ddy
;
coord
[
1
][
1
]
=
-
dy
-
ddx
;
coord
[
1
][
0
]
=
-
dx
+
ddy
;
coord
[
1
][
1
]
=
-
dy
-
ddx
;
coord
[
2
][
0
]
=
+
dx
-
ddy
;
coord
[
2
][
1
]
=
-
dy
+
ddx
;
coord
[
2
][
0
]
=
+
dx
-
ddy
;
coord
[
2
][
1
]
=
-
dy
+
ddx
;
coord
[
3
][
0
]
=
+
dx
+
ddy
;
coord
[
3
][
1
]
=
+
dy
-
ddx
;
coord
[
3
][
0
]
=
+
dx
+
ddy
;
coord
[
3
][
1
]
=
+
dy
-
ddx
;
for
(
ii
=
0
;
ii
<
4
;
ii
++
)
{
RotatePoint
(
&
coord
[
ii
][
0
],
&
coord
[
ii
][
1
],
angle
);
RotatePoint
(
&
coord
[
ii
][
0
],
&
coord
[
ii
][
1
],
angle
);
coord
[
ii
][
0
]
+=
ux0
;
coord
[
ii
][
1
]
+=
uy0
;
ll
=
ii
*
2
;
...
...
@@ -607,8 +628,8 @@ int color;
{
f_hole_coord
[
ii
][
0
]
=
-
hole
*
0.707
;
f_hole_coord
[
ii
][
1
]
=
hole
*
0.707
;
RotatePoint
(
&
f_hole_coord
[
ii
][
0
],
&
f_hole_coord
[
ii
][
1
],
angle
-
(
ii
*
450
)
);
RotatePoint
(
&
f_hole_coord
[
ii
][
0
],
&
f_hole_coord
[
ii
][
1
],
angle
-
(
ii
*
450
)
);
f_hole_coord
[
ii
][
0
]
+=
drillx
;
f_hole_coord
[
ii
][
1
]
+=
drilly
;
}
...
...
@@ -617,9 +638,9 @@ int color;
{
if
(
layer
&&
(
layer
==
nlmax
)
)
layer
=
CMP_N
;
if
(
(
layer
==
CMP_N
)
&&
!
Oncmp
)
if
(
(
layer
==
CMP_N
)
&&
!
Oncmp
)
continue
;
if
(
(
layer
==
COPPER_LAYER_N
)
&&
!
Oncu
)
if
(
(
layer
==
COPPER_LAYER_N
)
&&
!
Oncu
)
continue
;
if
(
(
layer
>
FIRST_COPPER_LAYER
)
&&
(
layer
<
LAST_COPPER_LAYER
)
&&
!
Both
)
continue
;
...
...
@@ -627,14 +648,15 @@ int color;
glNormal3f
(
0.0
,
0.0
,
(
layer
==
COPPER_LAYER_N
)
?
-
1.0
:
1.0
);
if
(
color
&
ITEM_NOT_SHOW
)
continue
;
SetGLColor
(
color
);
SetGLColor
(
color
);
zpos
=
g_Parm_3D_Visu
.
m_LayerZcoord
[
layer
];
glBegin
(
GL_QUAD_STRIP
);
glBegin
(
GL_QUAD_STRIP
);
for
(
ii
=
0
;
ii
<
8
;
ii
++
)
{
glVertex3f
(
f_hole_coord
[
ii
][
0
],
-
f_hole_coord
[
ii
][
1
],
zpos
);
glVertex3f
(
fcoord
[
ii
][
0
],
-
fcoord
[
ii
][
1
],
zpos
);
}
glVertex3f
(
f_hole_coord
[
0
][
0
],
-
f_hole_coord
[
0
][
1
],
zpos
);
glVertex3f
(
fcoord
[
0
][
0
],
-
fcoord
[
0
][
1
],
zpos
);
glEnd
();
...
...
@@ -649,53 +671,55 @@ int color;
/*************************/
void
SetGLColor
(
int
color
)
void
SetGLColor
(
int
color
)
/*************************/
{
double
red
,
green
,
blue
;
StructColors
colordata
=
ColorRefs
[
color
&
MASKCOLOR
];
double
red
,
green
,
blue
;
StructColors
colordata
=
ColorRefs
[
color
&
MASKCOLOR
];
red
=
colordata
.
m_Red
/
255.0
;
blue
=
colordata
.
m_Blue
/
255.0
;
green
=
colordata
.
m_Green
/
255.0
;
glColor3f
(
red
,
green
,
blue
);
glColor3f
(
red
,
green
,
blue
);
}
/********************************************************/
static
void
Draw3D_FilledCircle
(
double
posx
,
double
posy
,
double
rayon
,
double
hole
,
double
zpos
)
static
void
Draw3D_FilledCircle
(
double
posx
,
double
posy
,
double
rayon
,
double
hole
,
double
zpos
)
/********************************************************/
{
int
ii
,
slice
=
16
;
double
x
,
y
;
int
ii
,
slice
=
16
;
double
x
,
y
;
glBegin
(
GL_QUAD_STRIP
);
glBegin
(
GL_QUAD_STRIP
);
for
(
ii
=
0
;
ii
<=
slice
;
ii
++
)
{
x
=
hole
;
y
=
0.0
;
RotatePoint
(
&
x
,
&
y
,
ii
*
225
);
RotatePoint
(
&
x
,
&
y
,
ii
*
225
);
glVertex3f
(
x
+
posx
,
y
+
posy
,
zpos
);
x
=
rayon
;
y
=
0.0
;
RotatePoint
(
&
x
,
&
y
,
ii
*
225
);
RotatePoint
(
&
x
,
&
y
,
ii
*
225
);
glVertex3f
(
x
+
posx
,
y
+
posy
,
zpos
);
}
glEnd
();
}
/*********************************************************/
static
void
Draw3D_FilledCylinder
(
double
posx
,
double
posy
,
double
rayon
,
double
height
,
double
zpos
)
static
void
Draw3D_FilledCylinder
(
double
posx
,
double
posy
,
double
rayon
,
double
height
,
double
zpos
)
/*********************************************************/
{
int
ii
;
double
x
,
y
;
int
ii
;
double
x
,
y
;
#define NB_SEGM 12
S3D_Vertex
coords
[
4
];
double
tmp
=
DataScale3D
;
S3D_Vertex
coords
[
4
];
double
tmp
=
DataScale3D
;
DataScale3D
=
1.0
;
// les coord sont deja a l'echelle pour Set_Object_Data();
coords
[
0
].
x
=
coords
[
1
].
x
=
posx
+
rayon
;
...
...
@@ -707,7 +731,7 @@ double tmp = DataScale3D;
{
x
=
rayon
;
y
=
0.0
;
RotatePoint
(
&
x
,
&
y
,
ii
*
(
3600
/
NB_SEGM
)
);
RotatePoint
(
&
x
,
&
y
,
ii
*
(
3600
/
NB_SEGM
)
);
coords
[
2
].
x
=
coords
[
3
].
x
=
posx
+
x
;
coords
[
2
].
y
=
coords
[
3
].
y
=
posy
+
y
;
Set_Object_Data
(
coords
,
4
);
...
...
@@ -716,56 +740,60 @@ double tmp = DataScale3D;
coords
[
1
].
x
=
coords
[
3
].
x
;
coords
[
1
].
y
=
coords
[
3
].
y
;
}
glNormal3f
(
0.0
,
0.0
,
1.0
);
// Normal is Z axis
glNormal3f
(
0.0
,
0.0
,
1.0
);
// Normal is Z axis
DataScale3D
=
tmp
;
}
/*****************************************************************/
static
void
Draw3D_FilledSegment
(
double
startx
,
double
starty
,
double
endx
,
double
endy
,
double
width
,
double
zpos
)
static
void
Draw3D_FilledSegment
(
double
startx
,
double
starty
,
double
endx
,
double
endy
,
double
width
,
double
zpos
)
/*****************************************************************/
/* trace un polygone semblable a un segment a bouts ronds
*/
{
double
dx
,
dy
,
x
,
y
,
firstx
=
0
,
firsty
=
0
;
int
ii
,
angle
;
double
dx
,
dy
,
x
,
y
,
firstx
=
0
,
firsty
=
0
;
int
ii
,
angle
;
// on va calculer les coordonnes du segment suppos horizontal,
// puis tourner les cordonnes de l'angle voulu
dx
=
endx
-
startx
;
dy
=
endy
-
starty
;
angle
=
(
int
)(
(
atan2
(
dy
,
dx
)
*
1800
/
M_PI
)
+
0.5
);
angle
=
(
int
)
(
(
atan2
(
dy
,
dx
)
*
1800
/
M_PI
)
+
0.5
);
RotatePoint
(
&
dx
,
&
dy
,
angle
);
// apres rotation: dx = longueur du segment
RotatePoint
(
&
dx
,
&
dy
,
angle
);
// apres rotation: dx = longueur du segment
// dy = 0;
width
/=
2
;
glBegin
(
GL_POLYGON
);
glBegin
(
GL_POLYGON
);
// trac de l'arrondi a droite (1er demi polygone a la fin du segment)
for
(
ii
=
0
;
ii
<=
8
;
ii
++
)
{
x
=
0.0
;
y
=
-
width
;
RotatePoint
(
&
x
,
&
y
,
-
ii
*
225
);
RotatePoint
(
&
x
,
&
y
,
-
ii
*
225
);
x
+=
dx
;
RotatePoint
(
&
x
,
&
y
,
-
angle
);
glVertex3f
(
startx
+
x
,
starty
+
y
,
zpos
);
RotatePoint
(
&
x
,
&
y
,
-
angle
);
glVertex3f
(
startx
+
x
,
starty
+
y
,
zpos
);
if
(
ii
==
0
)
{
firstx
=
startx
+
x
;
firsty
=
starty
+
y
;
}
}
// trac de l'arrondi a gauche (2ieme demi polygone a l'origine du segment)
for
(
ii
=
0
;
ii
<=
8
;
ii
++
)
{
int
jj
=
ii
*
225
;
x
=
0.0
;
y
=
width
;
RotatePoint
(
&
x
,
&
y
,
-
angle
-
jj
);
glVertex3f
(
startx
+
x
,
starty
+
y
,
zpos
);
RotatePoint
(
&
x
,
&
y
,
-
angle
-
jj
);
glVertex3f
(
startx
+
x
,
starty
+
y
,
zpos
);
}
glVertex3f
(
firstx
,
firsty
,
zpos
);
...
...
@@ -774,16 +802,23 @@ int ii, angle;
/*****************************************************************/
static
void
Draw3D_FilledSegmentWithHole
(
double
startx
,
double
starty
,
double
endx
,
double
endy
,
double
width
,
double
holex
,
double
holey
,
double
holeradius
,
double
zpos
)
static
void
Draw3D_FilledSegmentWithHole
(
double
startx
,
double
starty
,
double
endx
,
double
endy
,
double
width
,
double
holex
,
double
holey
,
double
holeradius
,
double
zpos
)
/*****************************************************************/
/* trace un polygone semblable a un segment a bouts ronds avec trou
*/
{
double
x
,
y
,
xin
,
yin
;
double
firstx
=
0
,
firsty
=
0
,
firstxin
=
0
,
firstyin
=
0
;
int
ii
,
angle
,
theta
;
double
x
,
y
,
xin
,
yin
;
double
firstx
=
0
,
firsty
=
0
,
firstxin
=
0
,
firstyin
=
0
;
int
ii
,
angle
,
theta
;
// on va calculer les coordonnes du segment suppos horizontal,
// puis tourner les cordonnes de l'angle voulu
...
...
@@ -793,14 +828,15 @@ int ii, angle, theta;
endy
-=
starty
;
holex
-=
startx
;
holey
-=
starty
;
angle
=
(
int
)(
(
atan2
(
endy
,
endx
)
*
1800
/
M_PI
)
+
0.5
);
angle
=
(
int
)
(
(
atan2
(
endy
,
endx
)
*
1800
/
M_PI
)
+
0.5
);
RotatePoint
(
&
endx
,
&
endy
,
angle
);
// apres rotation: endx = longueur du segment
RotatePoint
(
&
endx
,
&
endy
,
angle
);
// apres rotation: endx = longueur du segment
// endy = 0;
RotatePoint
(
&
holex
,
&
holey
,
angle
);
RotatePoint
(
&
holex
,
&
holey
,
angle
);
width
/=
2
;
glBegin
(
GL_QUAD_STRIP
);
glBegin
(
GL_QUAD_STRIP
);
// trac de l'arrondi a droite (1er demi polygone a la fin du segment)
// autour du demi-trou de percage
for
(
ii
=
0
;
ii
<=
8
;
ii
++
)
...
...
@@ -810,14 +846,14 @@ int ii, angle, theta;
xin
=
0.0
;
yin
=
-
holeradius
;
theta
=
-
ii
*
225
;
RotatePoint
(
&
x
,
&
y
,
theta
);
RotatePoint
(
&
xin
,
&
yin
,
theta
);
RotatePoint
(
&
x
,
&
y
,
theta
);
RotatePoint
(
&
xin
,
&
yin
,
theta
);
x
+=
endx
;
RotatePoint
(
&
x
,
&
y
,
-
angle
);
RotatePoint
(
&
x
,
&
y
,
-
angle
);
xin
+=
holex
;
RotatePoint
(
&
xin
,
&
yin
,
-
angle
);
glVertex3f
(
startx
+
xin
,
starty
+
yin
,
zpos
);
glVertex3f
(
startx
+
x
,
starty
+
y
,
zpos
);
RotatePoint
(
&
xin
,
&
yin
,
-
angle
);
glVertex3f
(
startx
+
xin
,
starty
+
yin
,
zpos
);
glVertex3f
(
startx
+
x
,
starty
+
y
,
zpos
);
if
(
ii
==
0
)
// Memorisation du point de dpart du trac
{
firstx
=
startx
+
x
;
...
...
@@ -826,19 +862,20 @@ int ii, angle, theta;
firstyin
=
starty
+
yin
;
}
}
// trac de l'arrondi a gauche (2ieme demi polygone a l'origine du segment)
for
(
ii
=
0
;
ii
<=
8
;
ii
++
)
{
theta
=
-
ii
*
225
;
x
=
0.0
;
y
=
width
;
RotatePoint
(
&
x
,
&
y
,
-
angle
+
theta
);
RotatePoint
(
&
x
,
&
y
,
-
angle
+
theta
);
xin
=
0.0
;
yin
=
holeradius
;
RotatePoint
(
&
xin
,
&
yin
,
theta
);
RotatePoint
(
&
xin
,
&
yin
,
theta
);
xin
+=
holex
;
RotatePoint
(
&
xin
,
&
yin
,
-
angle
);
glVertex3f
(
startx
+
xin
,
starty
+
yin
,
zpos
);
RotatePoint
(
&
xin
,
&
yin
,
-
angle
);
glVertex3f
(
startx
+
xin
,
starty
+
yin
,
zpos
);
glVertex3f
(
startx
+
x
,
starty
+
y
,
zpos
);
}
...
...
change_log.txt
View file @
7c482f68
...
...
@@ -5,6 +5,12 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2008-mars-03 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
3d display:
Added Jonas Diemer's patch (enhanced movings from mouse and tools)
2008-Mar-1 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+pcbnew
...
...
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