src/gldraw.cpp

changeset 492
e964085e6913
parent 491
7d1b5ecd76c0
child 493
16766ac1bbd9
equal deleted inserted replaced
491:7d1b5ecd76c0 492:e964085e6913
48 {{ -1, 0, 0 }, X, Z, false, true }, 48 {{ -1, 0, 0 }, X, Z, false, true },
49 {{ 0, 0, 0 }, X, Y, true, true }, 49 {{ 0, 0, 0 }, X, Y, true, true },
50 {{ 0, -1, 0 }, Z, Y, false, true }, 50 {{ 0, -1, 0 }, Z, Y, false, true },
51 }; 51 };
52 52
53 static const matrix g_circleDrawTransforms[3] = {
54 { 2, 0, 0, 0, 1, 0, 0, 0, 2 },
55 { 2, 0, 0, 0, 0, 2, 0, 1, 0 },
56 { 0, 1, 0, 2, 0, 0, 0, 0, 2 },
57 };
58
53 cfg (String, gl_bgcolor, "#CCCCD9"); 59 cfg (String, gl_bgcolor, "#CCCCD9");
54 cfg (String, gl_maincolor, "#707078"); 60 cfg (String, gl_maincolor, "#707078");
55 cfg (Float, gl_maincolor_alpha, 1.0); 61 cfg (Float, gl_maincolor_alpha, 1.0);
56 cfg (Int, gl_linethickness, 2); 62 cfg (Int, gl_linethickness, 2);
57 cfg (Bool, gl_colorbfc, false); 63 cfg (Bool, gl_colorbfc, false);
530 paint.drawText (m_width - textSize.width(), m_height - 16, textSize.width(), 536 paint.drawText (m_width - textSize.width(), m_height - 16, textSize.width(),
531 textSize.height(), Qt::AlignCenter, text); 537 textSize.height(), Qt::AlignCenter, text);
532 538
533 // If we're drawing, draw the vertices onto the screen. 539 // If we're drawing, draw the vertices onto the screen.
534 if (editMode() == Draw) { 540 if (editMode() == Draw) {
535 const short blipsize = 8;
536 int numverts = 4; 541 int numverts = 4;
537 542
538 if (!m_rectdraw) 543 if (!m_rectdraw)
539 numverts = m_drawedVerts.size() + 1; 544 numverts = m_drawedVerts.size() + 1;
540 545
577 paint.setPen (pen); 582 paint.setPen (pen);
578 paint.setBrush (QColor (64, 192, 0, 128)); 583 paint.setBrush (QColor (64, 192, 0, 128));
579 paint.drawPolygon (poly, numverts); 584 paint.drawPolygon (poly, numverts);
580 585
581 // Draw vertex blips 586 // Draw vertex blips
582 pen = m_thinBorderPen; 587 for (int i = 0; i < numverts; ++i) {
583 pen.setWidth (1);
584 paint.setPen (pen);
585 paint.setBrush (QColor (64, 192, 0));
586
587 for (ushort i = 0; i < numverts; ++i) {
588 QPoint& blip = poly[i]; 588 QPoint& blip = poly[i];
589 paint.drawEllipse (blip.x() - blipsize / 2, blip.y() - blipsize / 2, 589 drawBlip (paint, blip);
590 blipsize, blipsize); 590
591
592 // Draw their coordinates 591 // Draw their coordinates
593 paint.drawText (blip.x(), blip.y() - 8, polyverts[i].stringRep (true)); 592 paint.drawText (blip.x(), blip.y() - 8, polyverts[i].stringRep (true));
594 } 593 }
594 }
595 }
596 elif (editMode() == CircleMode)
597 { // If we have not specified the center point of the circle yet, preview it on the screen.
598 if (m_drawedVerts.size() == 0)
599 drawBlip (paint, coordconv3_2 (m_hoverpos));
600 else
601 { QVector<vertex> verts;
602 const double dist = circleDrawDist();
603 const int segs = lores;
604 const double angleUnit = (2 * pi) / segs;
605 Axis relX, relY;
606 getRelativeAxes (relX, relY);
607
608 for (int i = 0; i < segs; ++i)
609 { vertex v = g_origin;
610 v[relX] = m_drawedVerts[0][relX] + (cos (i * angleUnit) * dist);
611 v[relY] = m_drawedVerts[0][relY] + (sin (i * angleUnit) * dist);
612 verts << v;
613 }
614
615 QVector<QPoint> points;
616 for (const vertex& v : verts)
617 { QPoint point = coordconv3_2 (v);
618 drawBlip (paint, point);
619 points << point;
620 }
621
622 QPen pen = m_thinBorderPen;
623 pen.setWidth (2);
624 pen.setColor (luma (m_bgcolor) < 40 ? Qt::white : Qt::black);
625 paint.setPen (pen);
626 paint.setBrush (Qt::NoBrush);
627 paint.drawPolygon (QPolygon (points));
595 } 628 }
596 } 629 }
597 } 630 }
598 631
599 // Camera icons 632 // Camera icons
662 695
663 paint.setPen (m_thickBorderPen); 696 paint.setPen (m_thickBorderPen);
664 paint.setBrush (QBrush (fillColor)); 697 paint.setBrush (QBrush (fillColor));
665 paint.drawRect (rect); 698 paint.drawRect (rect);
666 } 699 }
700 }
701
702 // =============================================================================
703 // -----------------------------------------------------------------------------
704 void GLRenderer::drawBlip (QPainter& paint, QPoint pos) const
705 { QPen pen = m_thinBorderPen;
706 const int blipsize = 8;
707 pen.setWidth (1);
708 paint.setPen (pen);
709 paint.setBrush (QColor (64, 192, 0));
710 paint.drawEllipse (pos.x() - blipsize / 2, pos.y() - blipsize / 2, blipsize, blipsize);
667 } 711 }
668 712
669 // ============================================================================= 713 // =============================================================================
670 // ----------------------------------------------------------------------------- 714 // -----------------------------------------------------------------------------
671 QColor GLRenderer::getTextPen () const { 715 QColor GLRenderer::getTextPen () const {
853 } 897 }
854 } 898 }
855 899
856 addDrawnVertex (m_hoverpos); 900 addDrawnVertex (m_hoverpos);
857 break; 901 break;
858 902
903 case CircleMode:
904 if (m_drawedVerts.size() == 2)
905 { endDraw (true);
906 return;
907 }
908
909 addDrawnVertex (m_hoverpos);
910 break;
911
859 case Select: 912 case Select:
860 if (!drawOnly()) { 913 if (!drawOnly()) {
861 if (m_totalmove < 10) 914 if (m_totalmove < 10)
862 m_rangepick = false; 915 m_rangepick = false;
863 916
896 if (distsq < mindist) { 949 if (distsq < mindist) {
897 mindist = distsq; 950 mindist = distsq;
898 closest = pos3d; 951 closest = pos3d;
899 valid = true; 952 valid = true;
900 953
901 /* If it's only 4 pixels away, I think we found our vertex now. */ 954 // If it's only 4 pixels away, I think we found our vertex now.
902 if (distsq <= 16.0f) // 4.0f ** 2 955 if (distsq <= 16.0f) // 4.0f ** 2
903 break; 956 break;
904 } 957 }
905 } 958 }
906 959
1173 unsetCursor(); 1226 unsetCursor();
1174 setContextMenuPolicy (Qt::DefaultContextMenu); 1227 setContextMenuPolicy (Qt::DefaultContextMenu);
1175 break; 1228 break;
1176 1229
1177 case Draw: 1230 case Draw:
1231 case CircleMode:
1178 // Cannot draw into the free camera - use top instead. 1232 // Cannot draw into the free camera - use top instead.
1179 if (m_camera == Free) 1233 if (m_camera == Free)
1180 setCamera (Top); 1234 setCamera (Top);
1181 1235
1182 // Disable the context menu - we need the right mouse button 1236 // Disable the context menu - we need the right mouse button
1220 (void) accept; 1274 (void) accept;
1221 1275
1222 // Clean the selection and create the object 1276 // Clean the selection and create the object
1223 List<vertex>& verts = m_drawedVerts; 1277 List<vertex>& verts = m_drawedVerts;
1224 LDObject* obj = null; 1278 LDObject* obj = null;
1225 1279
1226 if (m_rectdraw) { 1280 switch (editMode())
1227 LDQuad* quad = new LDQuad; 1281 { case Draw:
1228 1282 if (m_rectdraw) {
1229 // Copy the vertices from m_rectverts 1283 LDQuad* quad = new LDQuad;
1230 updateRectVerts(); 1284
1231 1285 // Copy the vertices from m_rectverts
1232 for (int i = 0; i < quad->vertices(); ++i) 1286 updateRectVerts();
1233 quad->setVertex (i, m_rectverts[i]); 1287
1234 1288 for (int i = 0; i < quad->vertices(); ++i)
1235 quad->setColor (maincolor); 1289 quad->setVertex (i, m_rectverts[i]);
1236 obj = quad; 1290
1237 } else { 1291 quad->setColor (maincolor);
1238 switch (verts.size()) { 1292 obj = quad;
1239 case 1: 1293 } else {
1240 // 1 vertex - add a vertex object 1294 switch (verts.size()) {
1241 obj = new LDVertex; 1295 case 1:
1242 static_cast<LDVertex*> (obj)->pos = verts[0]; 1296 // 1 vertex - add a vertex object
1243 obj->setColor (maincolor); 1297 obj = new LDVertex;
1244 break; 1298 static_cast<LDVertex*> (obj)->pos = verts[0];
1245 1299 obj->setColor (maincolor);
1246 case 2: 1300 break;
1247 // 2 verts - make a line 1301
1248 obj = new LDLine (verts[0], verts[1]); 1302 case 2:
1249 obj->setColor (edgecolor); 1303 // 2 verts - make a line
1250 break; 1304 obj = new LDLine (verts[0], verts[1]);
1251 1305 obj->setColor (edgecolor);
1252 case 3: 1306 break;
1253 case 4: 1307
1254 obj = (verts.size() == 3) ? 1308 case 3:
1255 static_cast<LDObject*> (new LDTriangle) : 1309 case 4:
1256 static_cast<LDObject*> (new LDQuad); 1310 obj = (verts.size() == 3) ?
1257 1311 static_cast<LDObject*> (new LDTriangle) :
1258 obj->setColor (maincolor); 1312 static_cast<LDObject*> (new LDQuad);
1259 for (ushort i = 0; i < obj->vertices(); ++i) 1313
1260 obj->setVertex (i, verts[i]); 1314 obj->setColor (maincolor);
1261 break; 1315 for (ushort i = 0; i < obj->vertices(); ++i)
1262 } 1316 obj->setVertex (i, verts[i]);
1263 } 1317 break;
1264 1318 }
1319 }
1320 break;
1321
1322 case CircleMode:
1323 { const staticCameraMeta* cam = &g_staticCameras[m_camera];
1324 const double dist = circleDrawDist();
1325
1326 matrix transform = g_circleDrawTransforms[camera() % 3];
1327 for (int i = 0; i < 9; ++i)
1328 { if (transform[i] == 2)
1329 transform[i] = dist;
1330 elif (transform[i] == 1 && camera() >= 3)
1331 transform[i] = -1;
1332 }
1333
1334 LDSubfile* ref = new LDSubfile;
1335 ref->setFileInfo (findLoadedFile ("4-4edge.dat"));
1336 ref->setTransform (transform);
1337 ref->setPosition (m_drawedVerts[0]);
1338 ref->setColor (maincolor);
1339 obj = ref;
1340 }
1341 break;
1342
1343 case Select:
1344 assert (false);
1345 return;
1346 }
1347
1265 if (obj) { 1348 if (obj) {
1266 g_win->beginAction (null); 1349 g_win->beginAction (null);
1267 file()->addObject (obj); 1350 file()->addObject (obj);
1268 compileObject (obj); 1351 compileObject (obj);
1269 g_win->fullRefresh(); 1352 g_win->fullRefresh();
1270 g_win->endAction(); 1353 g_win->endAction();
1271 } 1354 }
1272 1355
1273 m_drawedVerts.clear(); 1356 m_drawedVerts.clear();
1274 m_rectdraw = false; 1357 m_rectdraw = false;
1358 }
1359
1360 // =============================================================================
1361 // -----------------------------------------------------------------------------
1362 double GLRenderer::circleDrawDist() const
1363 { assert (m_drawedVerts.size() >= 1);
1364 const vertex& v1 = (m_drawedVerts.size() == 2) ? m_drawedVerts[1] : m_hoverpos;
1365 Axis relX, relY;
1366 getRelativeAxes (relX, relY);
1367
1368 const double dx = m_drawedVerts[0][relX] - v1[relX];
1369 const double dy = m_drawedVerts[0][relY] - v1[relY];
1370 return sqrt ((dx * dx) + (dy * dy));
1371 }
1372
1373 // =============================================================================
1374 // -----------------------------------------------------------------------------
1375 void GLRenderer::getRelativeAxes (Axis& relX, Axis& relY) const
1376 { const staticCameraMeta* cam = &g_staticCameras[m_camera];
1377 relX = cam->axisX;
1378 relY = cam->axisY;
1275 } 1379 }
1276 1380
1277 // ============================================================================= 1381 // =============================================================================
1278 // ----------------------------------------------------------------------------- 1382 // -----------------------------------------------------------------------------
1279 static List<vertex> getVertices (LDObject* obj) { 1383 static List<vertex> getVertices (LDObject* obj) {

mercurial