97 resetAngles (); |
97 resetAngles (); |
98 m_picking = m_rangepick = false; |
98 m_picking = m_rangepick = false; |
99 m_camera = (GL::Camera) gl_camera.value; |
99 m_camera = (GL::Camera) gl_camera.value; |
100 m_drawToolTip = false; |
100 m_drawToolTip = false; |
101 m_editmode = Select; |
101 m_editmode = Select; |
|
102 m_rectdraw = false; |
102 |
103 |
103 m_toolTipTimer = new QTimer (this); |
104 m_toolTipTimer = new QTimer (this); |
104 m_toolTipTimer->setSingleShot (true); |
105 m_toolTipTimer->setSingleShot (true); |
105 connect (m_toolTipTimer, SIGNAL (timeout ()), this, SLOT (slot_toolTipTimer ())); |
106 connect (m_toolTipTimer, SIGNAL (timeout ()), this, SLOT (slot_toolTipTimer ())); |
106 |
107 |
501 paint.drawText (m_width - textSize.width (), m_height - 16, textSize.width (), |
502 paint.drawText (m_width - textSize.width (), m_height - 16, textSize.width (), |
502 textSize.height (), Qt::AlignCenter, text); |
503 textSize.height (), Qt::AlignCenter, text); |
503 |
504 |
504 // If we're drawing, draw the vertices onto the screen. |
505 // If we're drawing, draw the vertices onto the screen. |
505 if (m_editmode == Draw) { |
506 if (m_editmode == Draw) { |
506 ushort numverts = m_drawedVerts.size () + 1; |
507 ushort numverts; |
|
508 |
|
509 if (!m_rectdraw) |
|
510 numverts = m_drawedVerts.size () + 1; |
|
511 else |
|
512 numverts = (m_drawedVerts.size () > 0) ? 4 : 1; |
|
513 |
507 const short blipsize = 8; |
514 const short blipsize = 8; |
508 |
515 |
509 if (numverts > 0) { |
516 if (numverts > 0) { |
510 QPoint* poly = new QPoint[numverts]; |
517 QPoint* poly = new QPoint[numverts]; |
511 |
518 |
512 uchar i = 0; |
519 if (!m_rectdraw) { |
513 for (vertex& vert : m_drawedVerts) { |
520 uchar i = 0; |
514 poly[i] = coordconv3_2 (vert); |
521 for (vertex& vert : m_drawedVerts) { |
515 ++i; |
522 poly[i] = coordconv3_2 (vert); |
|
523 ++i; |
|
524 } |
|
525 |
|
526 // Draw the cursor vertex as the last one in the list. |
|
527 if (numverts < 5) |
|
528 poly[i] = coordconv3_2 (m_hoverpos); |
|
529 else |
|
530 numverts = 4; |
|
531 } else { |
|
532 if (m_drawedVerts.size () > 0) { |
|
533 QPoint v0 = coordconv3_2 (m_drawedVerts[0]), |
|
534 v1 = coordconv3_2 ((m_drawedVerts.size () >= 2) ? m_drawedVerts[1] : m_hoverpos); |
|
535 |
|
536 poly[0] = QPoint (v0.x (), v0.y ()); |
|
537 poly[1] = QPoint (v0.x (), v1.y ()); |
|
538 poly[2] = QPoint (v1.x (), v1.y ()); |
|
539 poly[3] = QPoint (v1.x (), v0.y ()); |
|
540 } else { |
|
541 poly[0] = coordconv3_2 (m_hoverpos); |
|
542 } |
516 } |
543 } |
517 |
|
518 // Draw the cursor vertex as the last one in the list. |
|
519 if (numverts < 5) |
|
520 poly[i] = coordconv3_2 (m_hoverpos); |
|
521 else |
|
522 numverts = 4; |
|
523 |
544 |
524 paint.setPen (m_thinBorderPen); |
545 paint.setPen (m_thinBorderPen); |
525 paint.setBrush (QColor (128, 192, 0)); |
546 paint.setBrush (QColor (128, 192, 0)); |
526 |
547 |
527 // Draw vertex blips |
548 // Draw vertex blips |
539 } |
560 } |
540 } |
561 } |
541 } |
562 } |
542 |
563 |
543 // Camera icons |
564 // Camera icons |
544 if (!m_picking && m_editmode == Select) { |
565 if (!m_picking) { |
545 // Draw a background for the selected camera |
566 // Draw a background for the selected camera |
546 paint.setPen (m_thinBorderPen); |
567 paint.setPen (m_thinBorderPen); |
547 paint.setBrush (QBrush (QColor (0, 128, 160, 128))); |
568 paint.setBrush (QBrush (QColor (0, 128, 160, 128))); |
548 paint.drawRect (g_CameraIcons[camera ()].selRect); |
569 paint.drawRect (g_CameraIcons[camera ()].selRect); |
549 |
570 |
550 // Draw the actual icons |
571 // Draw the actual icons |
551 for (CameraIcon& info : g_CameraIcons) |
572 for (CameraIcon& info : g_CameraIcons) { |
|
573 // Don't draw the free camera icon when in draw mode |
|
574 if (&info == &g_CameraIcons[GL::Free] && editMode () != Select) |
|
575 continue; |
|
576 |
552 paint.drawPixmap (info.destRect, *info.img, info.srcRect); |
577 paint.drawPixmap (info.destRect, *info.img, info.srcRect); |
|
578 } |
553 |
579 |
554 // Draw a label for the current camera in the top left corner |
580 // Draw a label for the current camera in the top left corner |
555 { |
581 { |
556 const ushort margin = 4; |
582 const ushort margin = 4; |
557 |
583 |
811 void GLRenderer::mouseReleaseEvent (QMouseEvent* ev) { |
837 void GLRenderer::mouseReleaseEvent (QMouseEvent* ev) { |
812 const bool wasLeft = (m_lastButtons & Qt::LeftButton) && !(ev->buttons() & Qt::LeftButton); |
838 const bool wasLeft = (m_lastButtons & Qt::LeftButton) && !(ev->buttons() & Qt::LeftButton); |
813 const bool wasRight = (m_lastButtons & Qt::RightButton) && !(ev->buttons() & Qt::RightButton); |
839 const bool wasRight = (m_lastButtons & Qt::RightButton) && !(ev->buttons() & Qt::RightButton); |
814 |
840 |
815 if (wasLeft) { |
841 if (wasLeft) { |
816 if (m_editmode == Draw) { |
842 // Check if we selected a camera icon |
817 // If we have 4 verts, stop drawing. |
843 if (!m_rangepick) { |
818 if (m_drawedVerts.size () >= 4) { |
844 for (CameraIcon& info : g_CameraIcons) { |
819 endDraw (true); |
845 if (info.destRect.contains (ev->pos ())) { |
820 return; |
846 setCamera (info.cam); |
|
847 update (); |
|
848 return; |
|
849 } |
821 } |
850 } |
822 |
851 } |
823 // If we picked an already-existing vertex, stop drawing |
852 |
824 for (vertex& vert : m_drawedVerts) { |
853 switch (editMode ()) { |
825 if (vert == m_hoverpos) { |
854 case Draw: |
|
855 if (m_rectdraw) { |
|
856 if (m_drawedVerts.size () == 2) { |
826 endDraw (true); |
857 endDraw (true); |
827 return; |
858 return; |
828 } |
859 } |
|
860 } else { |
|
861 // If we have 4 verts, stop drawing. |
|
862 if (m_drawedVerts.size () >= 4) { |
|
863 endDraw (true); |
|
864 return; |
|
865 } |
|
866 |
|
867 if (m_drawedVerts.size () == 0 && ev->modifiers () & Qt::ShiftModifier) |
|
868 m_rectdraw = true; |
|
869 |
|
870 // If we picked an already-existing vertex, stop drawing |
|
871 for (vertex& vert : m_drawedVerts) { |
|
872 if (vert == m_hoverpos) { |
|
873 endDraw (true); |
|
874 return; |
|
875 } |
|
876 } |
829 } |
877 } |
830 |
878 |
831 m_drawedVerts.push_back (m_hoverpos); |
879 m_drawedVerts.push_back (m_hoverpos); |
832 |
|
833 update (); |
880 update (); |
834 return; |
881 break; |
835 } else { |
882 |
|
883 case Select: |
836 if (!m_rangepick) |
884 if (!m_rangepick) |
837 m_addpick = (m_keymods & Qt::ControlModifier); |
885 m_addpick = (m_keymods & Qt::ControlModifier); |
838 |
886 |
839 if (m_totalmove < 10 || m_rangepick) |
887 if (m_totalmove < 10 || m_rangepick) |
840 pick (ev->x (), ev->y ()); |
888 pick (ev->x (), ev->y ()); |
|
889 break; |
841 } |
890 } |
842 |
891 |
843 m_rangepick = false; |
892 m_rangepick = false; |
844 m_totalmove = 0; |
893 m_totalmove = 0; |
845 return; |
894 return; |
846 } |
895 } |
847 |
896 |
848 if (wasRight && m_editmode == Draw) { |
897 if (wasRight && m_drawedVerts.size () > 0) { |
849 if (m_drawedVerts.size () > 0) { |
898 // Remove the last vertex |
850 // Remove the last vertex |
899 m_drawedVerts.erase (m_drawedVerts.end () - 1); |
851 m_drawedVerts.erase (m_drawedVerts.end () - 1); |
900 |
852 } |
901 if (m_drawedVerts.size () == 0) |
|
902 m_rectdraw = false; |
853 |
903 |
854 update (); |
904 update (); |
855 } |
905 } |
856 } |
906 } |
857 |
907 |
944 |
994 |
945 // ============================================================================= |
995 // ============================================================================= |
946 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
996 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
947 // ============================================================================= |
997 // ============================================================================= |
948 void GLRenderer::pick (uint mouseX, uint mouseY) { |
998 void GLRenderer::pick (uint mouseX, uint mouseY) { |
949 // Check if we selected a camera icon |
|
950 if (!m_rangepick) { |
|
951 QPoint pos (mouseX, mouseY); |
|
952 |
|
953 for (CameraIcon& info : g_CameraIcons) { |
|
954 if (info.destRect.contains (pos)) { |
|
955 setCamera (info.cam); |
|
956 update (); |
|
957 return; |
|
958 } |
|
959 } |
|
960 } |
|
961 |
|
962 GLint viewport[4]; |
999 GLint viewport[4]; |
963 |
1000 |
964 // Clear the selection if we do not wish to add to it. |
1001 // Clear the selection if we do not wish to add to it. |
965 if (!m_addpick) { |
1002 if (!m_addpick) { |
966 std::vector<LDObject*> oldsel = g_win->sel (); |
1003 std::vector<LDObject*> oldsel = g_win->sel (); |
1119 update (); |
1156 update (); |
1120 } |
1157 } |
1121 |
1158 |
1122 // ============================================================================= |
1159 // ============================================================================= |
1123 void GLRenderer::endDraw (bool accept) { |
1160 void GLRenderer::endDraw (bool accept) { |
1124 // If we accepted, clean the selection and create the object |
1161 (void) accept; |
1125 if (accept) { |
1162 |
1126 vector<vertex>& verts = m_drawedVerts; |
1163 // Clean the selection and create the object |
1127 LDObject* obj = null; |
1164 vector<vertex>& verts = m_drawedVerts; |
1128 |
1165 LDObject* obj = null; |
|
1166 |
|
1167 if (m_rectdraw) { |
|
1168 LDQuad* quad = new LDQuad; |
|
1169 vertex v0 = m_drawedVerts[0], |
|
1170 v1 = m_drawedVerts[1]; |
|
1171 const Axis axisX = cameraAxis (false), |
|
1172 axisY = cameraAxis (true); |
|
1173 |
|
1174 memset (quad->coords, 0, sizeof quad->coords); |
|
1175 quad->coords[0][axisX] = v0[axisX]; |
|
1176 quad->coords[0][axisY] = v0[axisY]; |
|
1177 quad->coords[1][axisX] = v1[axisX]; |
|
1178 quad->coords[1][axisY] = v0[axisY]; |
|
1179 quad->coords[2][axisX] = v1[axisX]; |
|
1180 quad->coords[2][axisY] = v1[axisY]; |
|
1181 quad->coords[3][axisX] = v0[axisX]; |
|
1182 quad->coords[3][axisY] = v1[axisY]; |
|
1183 quad->color = maincolor; |
|
1184 obj = quad; |
|
1185 } else { |
1129 switch (verts.size ()) { |
1186 switch (verts.size ()) { |
1130 case 1: |
1187 case 1: |
1131 { |
1188 // 1 vertex - add a vertex object |
1132 // 1 vertex - add a vertex object |
1189 obj = new LDVertex; |
1133 obj = new LDVertex; |
1190 static_cast<LDVertex*> (obj)->pos = verts[0]; |
1134 static_cast<LDVertex*> (obj)->pos = verts[0]; |
1191 obj->color = maincolor; |
1135 obj->color = maincolor; |
|
1136 } |
|
1137 break; |
1192 break; |
1138 |
1193 |
1139 case 2: |
1194 case 2: |
1140 { |
1195 // 2 verts - make a line |
1141 // 2 verts - make a line |
1196 obj = new LDLine; |
1142 obj = new LDLine; |
1197 obj->color = edgecolor; |
1143 obj->color = edgecolor; |
1198 for (ushort i = 0; i < 2; ++i) |
1144 for (ushort i = 0; i < 2; ++i) |
1199 obj->coords[i] = verts[i]; |
1145 obj->coords[i] = verts[i]; |
|
1146 } |
|
1147 break; |
1200 break; |
1148 |
1201 |
1149 case 3: |
1202 case 3: |
1150 case 4: |
1203 case 4: |
1151 { |
1204 obj = (verts.size () == 3) ? |
1152 obj = (verts.size () == 3) ? |
1205 static_cast<LDObject*> (new LDTriangle) : |
1153 static_cast<LDObject*> (new LDTriangle) : |
1206 static_cast<LDObject*> (new LDQuad); |
1154 static_cast<LDObject*> (new LDQuad); |
1207 |
1155 |
1208 obj->color = maincolor; |
1156 obj->color = maincolor; |
1209 for (ushort i = 0; i < obj->vertices (); ++i) |
1157 for (ushort i = 0; i < obj->vertices (); ++i) |
1210 obj->coords[i] = verts[i]; |
1158 obj->coords[i] = verts[i]; |
|
1159 } |
|
1160 break; |
1211 break; |
1161 } |
1212 } |
1162 |
1213 } |
1163 if (obj) { |
1214 |
1164 g_curfile->addObject (obj); |
1215 if (obj) { |
1165 compileObject (obj); |
1216 g_curfile->addObject (obj); |
1166 g_win->fullRefresh (); |
1217 compileObject (obj); |
1167 |
1218 g_win->fullRefresh (); |
1168 History::addEntry (new AddHistory ({(ulong) obj->getIndex (g_curfile)}, {obj->clone ()})); |
1219 |
1169 } |
1220 History::addEntry (new AddHistory ({(ulong) obj->getIndex (g_curfile)}, {obj->clone ()})); |
1170 } |
1221 } |
1171 |
1222 |
1172 m_drawedVerts.clear (); |
1223 m_drawedVerts.clear (); |
|
1224 m_rectdraw = false; |
1173 } |
1225 } |
1174 |
1226 |
1175 // ============================================================================= |
1227 // ============================================================================= |
1176 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
1228 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
1177 // ============================================================================= |
1229 // ============================================================================= |