856 void GLRenderer::compileList (LDObject* obj, const GLRenderer::ListType list) |
856 void GLRenderer::compileList (LDObject* obj, const GLRenderer::ListType list) |
857 { setObjectColor (obj, list); |
857 { setObjectColor (obj, list); |
858 |
858 |
859 switch (obj->getType()) |
859 switch (obj->getType()) |
860 { case LDObject::Line: |
860 { case LDObject::Line: |
861 compileSubObject (obj, GL_LINES); |
861 { compileSubObject (obj, GL_LINES); |
862 break; |
862 } break; |
863 |
863 |
864 case LDObject::CondLine: |
864 case LDObject::CondLine: |
865 |
865 { // Draw conditional lines with a dash pattern - however, use a full |
866 // Draw conditional lines with a dash pattern - however, use a full |
|
867 // line when drawing a pick list to make selecting them easier. |
866 // line when drawing a pick list to make selecting them easier. |
868 if (list != GL::PickList) |
867 if (list != GL::PickList) |
869 { glLineStipple (1, 0x6666); |
868 { glLineStipple (1, 0x6666); |
870 glEnable (GL_LINE_STIPPLE); |
869 glEnable (GL_LINE_STIPPLE); |
871 } |
870 } |
872 |
871 |
873 compileSubObject (obj, GL_LINES); |
872 compileSubObject (obj, GL_LINES); |
874 |
873 |
875 glDisable (GL_LINE_STIPPLE); |
874 glDisable (GL_LINE_STIPPLE); |
876 break; |
875 } break; |
877 |
876 |
878 case LDObject::Triangle: |
877 case LDObject::Triangle: |
879 compileSubObject (obj, GL_TRIANGLES); |
878 { compileSubObject (obj, GL_TRIANGLES); |
880 break; |
879 } break; |
881 |
880 |
882 case LDObject::Quad: |
881 case LDObject::Quad: |
883 compileSubObject (obj, GL_QUADS); |
882 { compileSubObject (obj, GL_QUADS); |
884 break; |
883 } break; |
885 |
884 |
886 case LDObject::Subfile: |
885 case LDObject::Subfile: |
887 { LDSubfile* ref = static_cast<LDSubfile*> (obj); |
886 { LDSubfile* ref = static_cast<LDSubfile*> (obj); |
888 QList<LDObject*> objs; |
887 QList<LDObject*> objs; |
889 |
888 |
899 LDObject* prev = ref->prev(); |
898 LDObject* prev = ref->prev(); |
900 |
899 |
901 if (prev && prev->getType() == LDObject::BFC && static_cast<LDBFC*> (prev)->type == LDBFC::InvertNext) |
900 if (prev && prev->getType() == LDObject::BFC && static_cast<LDBFC*> (prev)->type == LDBFC::InvertNext) |
902 g_glInvert = !g_glInvert; |
901 g_glInvert = !g_glInvert; |
903 |
902 |
904 for (LDObject * obj : objs) |
903 for (LDObject* obj : objs) |
905 { compileList (obj, list); |
904 { compileList (obj, list); |
906 delete obj; |
905 obj->deleteSelf(); |
907 } |
906 } |
908 |
907 |
909 g_glInvert = oldinvert; |
908 g_glInvert = oldinvert; |
910 } |
909 } break; |
911 break; |
|
912 |
910 |
913 default: |
911 default: |
914 break; |
912 break; |
915 } |
913 } |
916 } |
914 } |
1248 pixelptr += 4; |
1246 pixelptr += 4; |
1249 |
1247 |
1250 if (idx == 0xFFFFFF) |
1248 if (idx == 0xFFFFFF) |
1251 continue; // White is background; skip |
1249 continue; // White is background; skip |
1252 |
1250 |
|
1251 dlog ("idx: %1", idx); |
1253 LDObject* obj = LDObject::fromID (idx); |
1252 LDObject* obj = LDObject::fromID (idx); |
1254 |
1253 |
1255 // If this is an additive single pick and the object is currently selected, |
1254 // If this is an additive single pick and the object is currently selected, |
1256 // we remove it from selection instead. |
1255 // we remove it from selection instead. |
1257 if (!m_rangepick && m_addpick) |
1256 if (!m_rangepick && m_addpick) |
1585 // Mark in known vertices of this object |
1584 // Mark in known vertices of this object |
1586 QList<vertex> verts = getVertices (obj); |
1585 QList<vertex> verts = getVertices (obj); |
1587 m_knownVerts << verts; |
1586 m_knownVerts << verts; |
1588 removeDuplicates (m_knownVerts); |
1587 removeDuplicates (m_knownVerts); |
1589 |
1588 |
1590 obj->m_glinit = true; |
1589 obj->setGLInit (true); |
1591 } |
1590 } |
1592 |
1591 |
1593 // ============================================================================= |
1592 // ============================================================================= |
1594 // ----------------------------------------------------------------------------- |
1593 // ----------------------------------------------------------------------------- |
1595 uchar* GLRenderer::getScreencap (int& w, int& h) |
1594 uchar* GLRenderer::getScreencap (int& w, int& h) |
1625 |
1624 |
1626 // ============================================================================= |
1625 // ============================================================================= |
1627 // ----------------------------------------------------------------------------- |
1626 // ----------------------------------------------------------------------------- |
1628 void GLRenderer::deleteLists (LDObject* obj) |
1627 void GLRenderer::deleteLists (LDObject* obj) |
1629 { // Delete the lists but only if they have been initialized |
1628 { // Delete the lists but only if they have been initialized |
1630 if (!obj->m_glinit) |
1629 if (!obj->isGLInit()) |
1631 return; |
1630 return; |
1632 |
1631 |
1633 for (const GL::ListType listType : g_glListTypes) |
1632 for (const GL::ListType listType : g_glListTypes) |
1634 glDeleteLists (obj->glLists[listType], 1); |
1633 glDeleteLists (obj->glLists[listType], 1); |
1635 |
1634 |
1636 obj->m_glinit = false; |
1635 obj->setGLInit (false); |
1637 } |
1636 } |
1638 |
1637 |
1639 // ============================================================================= |
1638 // ============================================================================= |
1640 // ----------------------------------------------------------------------------- |
1639 // ----------------------------------------------------------------------------- |
1641 Axis GLRenderer::getCameraAxis (bool y, GLRenderer::EFixedCamera camid) |
1640 Axis GLRenderer::getCameraAxis (bool y, GLRenderer::EFixedCamera camid) |
1888 // ============================================================================= |
1887 // ============================================================================= |
1889 // ----------------------------------------------------------------------------- |
1888 // ----------------------------------------------------------------------------- |
1890 LDOverlay* GLRenderer::findOverlayObject (EFixedCamera cam) |
1889 LDOverlay* GLRenderer::findOverlayObject (EFixedCamera cam) |
1891 { LDOverlay* ovlobj = null; |
1890 { LDOverlay* ovlobj = null; |
1892 |
1891 |
1893 for (LDObject * obj : getFile()->getObjects()) |
1892 for (LDObject* obj : getFile()->getObjects()) |
1894 { if (obj->getType() == LDObject::Overlay && static_cast<LDOverlay*> (obj)->getCamera() == cam) |
1893 { if (obj->getType() == LDObject::Overlay && static_cast<LDOverlay*> (obj)->getCamera() == cam) |
1895 { ovlobj = static_cast<LDOverlay*> (obj); |
1894 { ovlobj = static_cast<LDOverlay*> (obj); |
1896 break; |
1895 break; |
1897 } |
1896 } |
1898 } |
1897 } |
1934 if (!meta.img && ovlobj) |
1933 if (!meta.img && ovlobj) |
1935 { // If this is the last overlay image, we need to remove the empty space after it as well. |
1934 { // If this is the last overlay image, we need to remove the empty space after it as well. |
1936 LDObject* nextobj = ovlobj->next(); |
1935 LDObject* nextobj = ovlobj->next(); |
1937 |
1936 |
1938 if (nextobj && nextobj->getType() == LDObject::Empty) |
1937 if (nextobj && nextobj->getType() == LDObject::Empty) |
1939 { getFile()->forgetObject (nextobj); |
1938 nextobj->deleteSelf(); |
1940 delete nextobj; |
|
1941 } |
|
1942 |
1939 |
1943 // If the overlay object was there and the overlay itself is |
1940 // If the overlay object was there and the overlay itself is |
1944 // not, remove the object. |
1941 // not, remove the object. |
1945 getFile()->forgetObject (ovlobj); |
1942 ovlobj->deleteSelf(); |
1946 delete ovlobj; |
|
1947 } elif (meta.img && !ovlobj) |
1943 } elif (meta.img && !ovlobj) |
1948 { // Inverse case: image is there but the overlay object is |
1944 { // Inverse case: image is there but the overlay object is |
1949 // not, thus create the object. |
1945 // not, thus create the object. |
1950 ovlobj = new LDOverlay; |
1946 ovlobj = new LDOverlay; |
1951 |
1947 |