3d_viewer.h 6.5 KB
Newer Older
1 2 3
/////////////////////////////////////////////////////////////////////////////
// Name:        3d_viewer.h
/////////////////////////////////////////////////////////////////////////////
4 5 6 7

#ifndef __3D_VIEWER_H__
#define __3D_VIEWER_H__

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#if !wxUSE_GLCANVAS
#error Please set wxUSE_GLCANVAS to 1 in setup.h.
#endif

#include "wx/glcanvas.h"

#ifdef __WXMAC__
#  ifdef __DARWIN__
#    include <OpenGL/glu.h>
#  else
#    include <glu.h>
#  endif
#else
#  include <GL/glu.h>
#endif

#include "pcbstruct.h"
#include "3d_struct.h"
26 27
#include "id.h"

28

29
#define KICAD_DEFAULT_3D_DRAWFRAME_STYLE wxDEFAULT_FRAME_STYLE | wxWANTS_CHARS
charras's avatar
charras committed
30

31

32
#define LIB3D_PATH wxT( "packages3d" )
33

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
/**
 * Command IDs for the 3D viewer.
 *
 * Please add IDs that are unique to the 3D viewer here and not in the global
 * id.h file.  This will prevent the entire project from being rebuilt when
 * adding new commands to the 3D viewer.
 */
enum id_3dview_frm
{
    ID_START_COMMAND_3D = ID_END_LIST,
    ID_ROTATE3D_X_NEG,
    ID_ROTATE3D_X_POS,
    ID_ROTATE3D_Y_NEG,
    ID_ROTATE3D_Y_POS,
    ID_ROTATE3D_Z_NEG,
    ID_ROTATE3D_Z_POS,
    ID_RELOAD3D_BOARD,
    ID_TOOL_SCREENCOPY_TOCLIBBOARD,
    ID_MOVE3D_LEFT,
    ID_MOVE3D_RIGHT,
    ID_MOVE3D_UP,
    ID_MOVE3D_DOWN,
    ID_MENU3D_BGCOLOR_SELECTION,
    ID_MENU3D_AXIS_ONOFF,
    ID_MENU3D_MODULE_ONOFF,
    ID_MENU3D_UNUSED,
    ID_MENU3D_ZONE_ONOFF,
    ID_MENU3D_DRAWINGS_ONOFF,
    ID_MENU3D_COMMENTS_ONOFF,
    ID_MENU3D_ECO1_ONOFF,
    ID_MENU3D_ECO2_ONOFF,
    ID_END_COMMAND_3D,

    ID_MENU_SCREENCOPY_PNG,
    ID_MENU_SCREENCOPY_JPEG,
    ID_MENU_SCREENCOPY_TOCLIBBOARD,

    ID_POPUP_3D_VIEW_START,
    ID_POPUP_ZOOMIN,
    ID_POPUP_ZOOMOUT,
    ID_POPUP_VIEW_XPOS,
    ID_POPUP_VIEW_XNEG,
    ID_POPUP_VIEW_YPOS,
    ID_POPUP_VIEW_YNEG,
    ID_POPUP_VIEW_ZPOS,
    ID_POPUP_VIEW_ZNEG,
    ID_POPUP_MOVE3D_LEFT,
    ID_POPUP_MOVE3D_RIGHT,
    ID_POPUP_MOVE3D_UP,
    ID_POPUP_MOVE3D_DOWN,
    ID_POPUP_3D_VIEW_END
};


88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
class Pcb3D_GLCanvas;
class WinEDA3D_DrawFrame;
class Info_3D_Visu;
class S3D_Vertex;
class SEGVIA;


#define m_ROTX m_Rot[0]
#define m_ROTY m_Rot[1]
#define m_ROTZ m_Rot[2]

/* information needed to display 3D board */
class Info_3D_Visu
{
public:
103 104 105 106
    double    m_Beginx, m_Beginy;   /* position of mouse */
    double    m_Quat[4];            /* orientation of object */
    double    m_Rot[4];             /* man rotation of object */
    double    m_Zoom;               /* field of view in degrees */
107
    S3D_Color m_BgColor;
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
    bool      m_Draw3DAxis;
    bool      m_Draw3DModule;
    bool      m_Draw3DZone;
    bool      m_Draw3DComments;
    bool      m_Draw3DDrawings;
    bool      m_Draw3DEco1;
    bool      m_Draw3DEco2;
    wxPoint   m_BoardPos;
    wxSize    m_BoardSize;
    int       m_Layers;
    EDA_BoardDesignSettings* m_BoardSettings;   // Link to current board design
                                                // settings
    double    m_Epoxy_Width;                    /* Epoxy thickness (normalized)
                                                 **/

    double    m_BoardScale;     /* Normalization scale for coordinates:
                                 * when scaled between -1.0 and +1.0 */
    double    m_LayerZcoord[32];
126
	double	  m_ActZpos;	
127
public: Info_3D_Visu();
128
    ~Info_3D_Visu();
129 130 131
};


132
class Pcb3D_GLCanvas : public wxGLCanvas
133 134
{
public:
135
    WinEDA3D_DrawFrame* m_Parent;
136 137

private:
138 139
    bool         m_init;
    GLuint       m_gllist;
140
#if wxCHECK_VERSION( 2, 9, 0 )
141
    wxGLContext* m_glRC;
142
#endif
143
public:
144
    Pcb3D_GLCanvas( WinEDA3D_DrawFrame* parent );
145 146
    ~Pcb3D_GLCanvas();

147 148 149 150 151 152 153 154 155 156 157 158
    void   ClearLists();

    void   OnPaint( wxPaintEvent& event );
    void   OnEraseBackground( wxEraseEvent& event );
    void   OnChar( wxKeyEvent& event );
    void   OnMouseEvent( wxMouseEvent& event );
    void   OnRightClick( wxMouseEvent& event );
    void   OnPopUpMenu( wxCommandEvent& event );
    void   TakeScreenshot( wxCommandEvent& event );
    void   SetView3D( int keycode );
    void   DisplayStatus();
    void   Redraw( bool finish = false );
159 160
    GLuint DisplayCubeforTest();

161
    void   OnEnterWindow( wxMouseEvent& event );
162

163
    void   Render();
164
    GLuint CreateDrawGL_List();
165 166 167
    void   InitGL();
    void   SetLights();
    void   Draw3D_Track( TRACK* track );
168 169 170 171 172
    /** Function Draw3D_SolidPolygonsInZones
     * draw all solid polygons used as filles areas in a zone
     * @param aZone_c = the zone to draw
    */
	void   Draw3D_SolidPolygonsInZones( ZONE_CONTAINER* aZone_c );
173 174 175 176
    void   Draw3D_Via( SEGVIA* via );
    void   Draw3D_DrawSegment( DRAWSEGMENT* segment );
    void   Draw3D_DrawText( TEXTE_PCB* text );

177
    //int Get3DLayerEnable(int act_layer);
178

179
    DECLARE_EVENT_TABLE()
180 181 182
};


183
class WinEDA3D_DrawFrame : public wxFrame
184 185
{
public:
186 187 188 189 190 191 192
    WinEDA_BasePcbFrame* m_Parent;
    Pcb3D_GLCanvas*      m_Canvas;
    WinEDA_Toolbar*      m_HToolBar;
    WinEDA_Toolbar*      m_VToolBar;
    int          m_InternalUnits;
    wxPoint      m_FramePos;
    wxSize       m_FrameSize;
193

194
#if defined(KICAD_AUIMANAGER)
195 196 197 198
    wxAuiManager m_auimgr;
    ~WinEDA3D_DrawFrame() { m_auimgr.UnInit(); };
#endif

199
private:
200
    wxString m_FrameName;       // name used for writing and reading setup
201
                                // It is "Frame3D"
202 203

public:
204
    WinEDA3D_DrawFrame( WinEDA_BasePcbFrame* parent, const wxString& title,
205
                        long style = KICAD_DEFAULT_3D_DRAWFRAME_STYLE );
206

207 208
    void Exit3DFrame( wxCommandEvent& event );
    void OnCloseWindow( wxCloseEvent& Event );
209 210 211 212 213 214 215
    void ReCreateMenuBar();
    void ReCreateHToolbar();
    void ReCreateVToolbar();
    void SetToolbars();
    void GetSettings();
    void SaveSettings();

216 217 218 219 220 221 222
    void OnLeftClick( wxDC* DC, const wxPoint& MousePos );
    void OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu );
    void OnKeyEvent( wxKeyEvent& event );
    int  BestZoom();
    void RedrawActiveWindow( wxDC* DC, bool EraseBg );
    void Process_Special_Functions( wxCommandEvent& event );
    void Process_Zoom( wxCommandEvent& event );
223 224 225 226 227 228 229 230 231 232 233

    void NewDisplay();
    void Set3DBgColor();
    void Set3DAxisOnOff();
    void Set3DModuleOnOff();
    void Set3DPlaceOnOff();
    void Set3DZoneOnOff();
    void Set3DCommentsOnOff();
    void Set3DDrawingsOnOff();
    void Set3DEco1OnOff();
    void Set3DEco2OnOff();
234

235
    DECLARE_EVENT_TABLE()
236 237
};

238 239
void     SetGLColor( int color );
void     Set_Object_Data( const S3D_Vertex* coord, int nbcoord );
240

241
extern Info_3D_Visu g_Parm_3D_Visu;
242 243 244 245
extern double       g_Draw3d_dx, g_Draw3d_dy;
extern double       ZBottom, ZTop;
extern double       DataScale3D; // 3D scale units.
extern int          gl_attrib[];
246 247

#endif  /*  __3D_VIEWER_H__ */