You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

269 lines
7.5 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: 3d_aux.cpp
  3. /////////////////////////////////////////////////////////////////////////////
  4. #ifdef __GNUG__
  5. #pragma implementation
  6. #pragma interface
  7. #endif
  8. #include "fctsys.h"
  9. #if !wxUSE_GLCANVAS
  10. #error Please set wxUSE_GLCANVAS to 1 in setup.h.
  11. #endif
  12. #include "common.h"
  13. #include "trigo.h"
  14. #include "bitmaps.h"
  15. #include "3d_viewer.h"
  16. #include "3d_struct.h"
  17. #include "trackball.h"
  18. /**************************************************************************/
  19. void Struct3D_Master::Set_Object_Coords(S3D_Vertex * coord, int nbcoord )
  20. /**************************************************************************/
  21. {
  22. int ii;
  23. /* adjust object scale, rotation and offset position */
  24. for ( ii = 0; ii < nbcoord; ii++ )
  25. {
  26. coord[ii].x *= m_MatScale.x;
  27. coord[ii].y *= m_MatScale.y;
  28. coord[ii].z *= m_MatScale.z;
  29. /* adjust rotation */
  30. if ( m_MatRotation.x )
  31. RotatePoint(&coord[ii].y, &coord[ii].z,
  32. (int)(m_MatRotation.x * 10));
  33. if ( m_MatRotation.y )
  34. RotatePoint(&coord[ii].z, &coord[ii].x,
  35. (int)(m_MatRotation.y * 10));
  36. if ( m_MatRotation.z )
  37. RotatePoint(&coord[ii].x, &coord[ii].y,
  38. (int)(m_MatRotation.z * 10));
  39. /* adjust offset position (offset is given in UNIT 3D (0.1 inch) */
  40. #define SCALE_3D_CONV (PCB_INTERNAL_UNIT/UNITS3D_TO_UNITSPCB)
  41. coord[ii].x += m_MatPosition.x * SCALE_3D_CONV;
  42. coord[ii].y += m_MatPosition.y * SCALE_3D_CONV;
  43. coord[ii].z += m_MatPosition.z * SCALE_3D_CONV;
  44. }
  45. }
  46. /************************************************************/
  47. void Set_Object_Data(const S3D_Vertex * coord, int nbcoord )
  48. /************************************************************/
  49. {
  50. int ii;
  51. GLfloat ax,ay,az,bx,by,bz,nx,ny,nz,r;
  52. /* ignore faces with less than 3 points */
  53. if (nbcoord < 3) return;
  54. /* calculate normal direction */
  55. ax = coord[1].x - coord[0].x;
  56. ay = coord[1].y - coord[0].y;
  57. az = coord[1].z - coord[0].z;
  58. bx = coord[nbcoord-1].x - coord[0].x;
  59. by = coord[nbcoord-1].y - coord[0].y;
  60. bz = coord[nbcoord-1].z - coord[0].z;
  61. nx = ay * bz - az * by;
  62. ny = az * bx - ax * bz;
  63. nz = ax * by - ay * bx;
  64. r = sqrt(nx*nx + ny*ny + nz*nz);
  65. if (r >= 0.000001) /* avoid division by zero */
  66. {
  67. nx /= r; ny /= r; nz /= r;
  68. glNormal3f(nx,ny,nz);
  69. }
  70. /* glBegin/glEnd */
  71. switch (nbcoord)
  72. {
  73. case 3:
  74. glBegin(GL_TRIANGLES);
  75. break;
  76. case 4:
  77. glBegin(GL_QUADS);
  78. break;
  79. default:
  80. glBegin(GL_POLYGON);
  81. break;
  82. }
  83. /* draw polygon/triangle/quad */
  84. for (ii = 0; ii < nbcoord; ii++)
  85. {
  86. glVertex3f(coord[ii].x * DataScale3D,
  87. coord[ii].y * DataScale3D,
  88. coord[ii].z * DataScale3D);
  89. }
  90. glEnd();
  91. }
  92. /**********************************************/
  93. GLuint Pcb3D_GLCanvas::DisplayCubeforTest()
  94. /**********************************************/
  95. {
  96. GLuint gllist = glGenLists( 1 );
  97. glNewList( gllist, GL_COMPILE_AND_EXECUTE );
  98. /* draw six faces of a cube */
  99. glBegin(GL_QUADS);
  100. glNormal3f( 0.0F, 0.0F, 1.0F);
  101. glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f(-0.5F, 0.5F, 0.5F);
  102. glVertex3f(-0.5F,-0.5F, 0.5F); glVertex3f( 0.5F,-0.5F, 0.5F);
  103. glNormal3f( 0.0F, 0.0F,-1.0F);
  104. glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f(-0.5F, 0.5F,-0.5F);
  105. glVertex3f( 0.5F, 0.5F,-0.5F); glVertex3f( 0.5F,-0.5F,-0.5F);
  106. glNormal3f( 0.0F, 1.0F, 0.0F);
  107. glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f( 0.5F, 0.5F,-0.5F);
  108. glVertex3f(-0.5F, 0.5F,-0.5F); glVertex3f(-0.5F, 0.5F, 0.5F);
  109. glNormal3f( 0.0F,-1.0F, 0.0F);
  110. glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f( 0.5F,-0.5F,-0.5F);
  111. glVertex3f( 0.5F,-0.5F, 0.5F); glVertex3f(-0.5F,-0.5F, 0.5F);
  112. glNormal3f( 1.0F, 0.0F, 0.0F);
  113. glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f( 0.5F,-0.5F, 0.5F);
  114. glVertex3f( 0.5F,-0.5F,-0.5F); glVertex3f( 0.5F, 0.5F,-0.5F);
  115. glNormal3f(-1.0F, 0.0F, 0.0F);
  116. glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f(-0.5F,-0.5F, 0.5F);
  117. glVertex3f(-0.5F, 0.5F, 0.5F); glVertex3f(-0.5F, 0.5F,-0.5F);
  118. glEnd();
  119. glEndList();
  120. return gllist;
  121. }
  122. /**********************/
  123. /* class Info_3D_Visu */
  124. /**********************/
  125. /* Constructor */
  126. Info_3D_Visu::Info_3D_Visu()
  127. {
  128. int ii;
  129. m_Beginx = m_Beginy = 0.0; /* position of mouse */
  130. m_Zoom = 1.0; /* field of view in degrees */
  131. trackball( m_Quat, 0.0, 0.0, 0.0, 0.0 );
  132. for ( ii = 0; ii < 4; ii++ ) m_Rot[ii] = 0.0;
  133. m_Layers = 1;
  134. m_BoardSettings = NULL;
  135. }
  136. Info_3D_Visu::~Info_3D_Visu()
  137. {
  138. }
  139. /*****************************************************************/
  140. /* Classe pour afficher et editer un Vertex (triplet de valeurs),*/
  141. /* en INCHES ou MM ou sans unites */
  142. /*****************************************************************/
  143. WinEDA_VertexCtrl::WinEDA_VertexCtrl(wxWindow *parent, const wxString & title,
  144. wxBoxSizer * BoxSizer,
  145. int units, int internal_unit)
  146. {
  147. wxString text;
  148. wxStaticText * msgtitle;
  149. m_Units = units;
  150. m_Internal_Unit = internal_unit;
  151. if ( title.IsEmpty() ) text = _("Vertex ");
  152. else text = title;
  153. text += ReturnUnitSymbol(units);
  154. msgtitle = new wxStaticText(parent, -1, text, wxDefaultPosition, wxSize(-1,-1), 0 );
  155. BoxSizer->Add(msgtitle, wxGROW|wxLEFT|wxRIGHT|wxTOP|wxBOTTOM|wxADJUST_MINSIZE);
  156. wxFlexGridSizer * GridSizer = new wxFlexGridSizer(3, 2, 0, 0);
  157. BoxSizer->Add(GridSizer, 0, wxGROW|wxALL, 5);
  158. msgtitle = new wxStaticText(parent, -1, wxT("X:"));
  159. GridSizer->Add(msgtitle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5);
  160. m_XValueCtrl = new wxTextCtrl(parent, -1, wxEmptyString, wxDefaultPosition, wxSize(-1,-1), 0 );
  161. GridSizer->Add(m_XValueCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5);
  162. msgtitle = new wxStaticText(parent, -1, wxT("Y:"), wxDefaultPosition, wxSize(-1,-1), 0 );
  163. GridSizer->Add(msgtitle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5);
  164. m_YValueCtrl = new wxTextCtrl(parent, -1, wxEmptyString, wxDefaultPosition, wxSize(-1,-1), 0 );
  165. GridSizer->Add(m_YValueCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5);
  166. msgtitle = new wxStaticText(parent, -1, wxT("Z:"), wxDefaultPosition, wxSize(-1,-1), 0 );
  167. GridSizer->Add(msgtitle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5);
  168. m_ZValueCtrl = new wxTextCtrl(parent, -1, wxEmptyString, wxDefaultPosition, wxSize(-1,-1), 0 );
  169. GridSizer->Add(m_ZValueCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5);
  170. }
  171. WinEDA_VertexCtrl::~WinEDA_VertexCtrl()
  172. {
  173. }
  174. /*******************************************/
  175. S3D_Vertex WinEDA_VertexCtrl::GetValue()
  176. /*******************************************/
  177. /* Retourne (en unites internes) les coordonnes entrees (en unites utilisateur)
  178. */
  179. {
  180. S3D_Vertex value;
  181. double dtmp;
  182. m_XValueCtrl->GetValue().ToDouble(&dtmp);
  183. value.x = dtmp;
  184. m_YValueCtrl->GetValue().ToDouble(&dtmp);
  185. value.y = dtmp;
  186. m_ZValueCtrl->GetValue().ToDouble(&dtmp);
  187. value.z = dtmp;
  188. return value;
  189. }
  190. /**************************************************/
  191. void WinEDA_VertexCtrl::SetValue(S3D_Vertex vertex)
  192. /**************************************************/
  193. {
  194. wxString text;
  195. text.Printf( wxT("%f"), vertex.x);
  196. m_XValueCtrl->Clear();
  197. m_XValueCtrl->AppendText(text);
  198. text.Printf(wxT("%f"), vertex.y);
  199. m_YValueCtrl->Clear();
  200. m_YValueCtrl->AppendText(text);
  201. text.Printf(wxT("%f"), vertex.z);
  202. m_ZValueCtrl->Clear();
  203. m_ZValueCtrl->AppendText(text);
  204. }
  205. /*****************************************/
  206. void WinEDA_VertexCtrl::Enable(bool onoff)
  207. /*****************************************/
  208. {
  209. m_XValueCtrl->Enable(onoff);
  210. m_YValueCtrl->Enable(onoff);
  211. m_ZValueCtrl->Enable(onoff);
  212. }