Sketcher/BackEdit: makes sketch elements render on -Z if sketch viewed from back side

This commit is contained in:
0penBrain
2022-08-30 17:36:03 +02:00
committed by wwmayer
parent a6a8f27125
commit 3f220f1dd8
7 changed files with 67 additions and 47 deletions

View File

@@ -424,7 +424,8 @@ void EditModeCoinManager::drawEditMarkers(const std::vector<Base::Vector2d> &Edi
int i=0; // setting up the line set
for (std::vector<Base::Vector2d>::const_iterator it = EditMarkers.begin(); it != EditMarkers.end(); ++it,i++) {
verts[i].setValue(it->x, it->y, drawingParameters.zEdit);
verts[i].setValue(it->x, it->y,
ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zEdit);
color[i] = drawingParameters.InformationColor;
}
@@ -444,7 +445,8 @@ void EditModeCoinManager::drawEdit(const std::vector<Base::Vector2d> &EditCurve)
int i=0; // setting up the line set
for (std::vector<Base::Vector2d>::const_iterator it = EditCurve.begin(); it != EditCurve.end(); ++it,i++) {
verts[i].setValue(it->x,it->y, drawingParameters.zEdit);
verts[i].setValue(it->x,it->y,
ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zEdit);
color[i] = drawingParameters.CreateCurveColor;
}
@@ -472,7 +474,8 @@ void EditModeCoinManager::drawEdit(const std::list<std::vector<Base::Vector2d>>
int indexindex=0;
for(const auto & v : list) {
for (const auto & p : v) {
verts[coordindex].setValue(p.x, p.y, drawingParameters.zEdit);
verts[coordindex].setValue(p.x, p.y,
ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zEdit);
color[coordindex] = drawingParameters.CreateCurveColor;
coordindex++;
}
@@ -489,7 +492,8 @@ void EditModeCoinManager::drawEdit(const std::list<std::vector<Base::Vector2d>>
void EditModeCoinManager::setPositionText(const Base::Vector2d &Pos, const SbString &text)
{
editModeScenegraphNodes.textX->string = text;
editModeScenegraphNodes.textPos->translation = SbVec3f(Pos.x, Pos.y, drawingParameters.zText);
editModeScenegraphNodes.textPos->translation = SbVec3f(Pos.x, Pos.y,
ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zText);
}
void EditModeCoinManager::setPositionText(const Base::Vector2d &Pos)
@@ -639,10 +643,11 @@ void EditModeCoinManager::processGeometryInformationOverlay(const GeoListFacade
void EditModeCoinManager::updateAxesLength()
{
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(0,SbVec3f(-analysisResults.boundingBoxMagnitudeOrder, 0.0f, drawingParameters.zCross));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(1,SbVec3f(analysisResults.boundingBoxMagnitudeOrder, 0.0f, drawingParameters.zCross));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(2,SbVec3f(0.0f, -analysisResults.boundingBoxMagnitudeOrder, drawingParameters.zCross));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(3,SbVec3f(0.0f, analysisResults.boundingBoxMagnitudeOrder, drawingParameters.zCross));
auto zCrossH = ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zCross;
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(0,SbVec3f(-analysisResults.boundingBoxMagnitudeOrder, 0.0f, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(1,SbVec3f(analysisResults.boundingBoxMagnitudeOrder, 0.0f, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(2,SbVec3f(0.0f, -analysisResults.boundingBoxMagnitudeOrder, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(3,SbVec3f(0.0f, analysisResults.boundingBoxMagnitudeOrder, zCrossH));
}
void EditModeCoinManager::updateGridExtent()

View File

@@ -144,6 +144,8 @@ void EditModeConstraintCoinManager::processConstraints(const GeoListFacade & geo
{
const auto &constrlist = ViewProviderSketchCoinAttorney::getConstraints(viewProvider);
auto zConstrH = ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zConstr;
// After an undo/redo it can happen that we have an empty geometry list but a non-empty constraint list
// In this case just ignore the constraints. (See bug #0000421)
if (geolistfacade.geomlist.size() <= 2 && !constrlist.empty()) {
@@ -337,7 +339,7 @@ Restart:
auto translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::FirstTranslationIndex)));
translation->abPos = SbVec3f(midpos.x, midpos.y, drawingParameters.zConstr); //Absolute Reference
translation->abPos = SbVec3f(midpos.x, midpos.y, zConstrH); //Absolute Reference
//Reference Position that is scaled according to zoom
translation->translation = SbVec3f(relpos.x, relpos.y, 0);
@@ -361,7 +363,7 @@ Restart:
auto translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::FirstTranslationIndex)));
translation->abPos = SbVec3f(midpos1.x, midpos1.y, drawingParameters.zConstr);
translation->abPos = SbVec3f(midpos1.x, midpos1.y, zConstrH);
translation->translation = SbVec3f(relpos1.x, relpos1.y, 0);
Base::Vector3d relpos2 = seekConstraintPosition(midpos2, norm2, dir2, 4.0, editModeScenegraphNodes.constrGroup->getChild(i));
@@ -370,7 +372,7 @@ Restart:
translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::SecondTranslationIndex)));
translation->abPos = SbVec3f(secondPos.x, secondPos.y, drawingParameters.zConstr);
translation->abPos = SbVec3f(secondPos.x, secondPos.y, zConstrH);
translation->translation = SbVec3f(relpos2.x -relpos1.x, relpos2.y -relpos1.y, 0);
}
}
@@ -466,7 +468,7 @@ Restart:
auto translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::FirstTranslationIndex)));
translation->abPos = SbVec3f(midpos1.x, midpos1.y, drawingParameters.zConstr);
translation->abPos = SbVec3f(midpos1.x, midpos1.y, zConstrH);
translation->translation = SbVec3f(relpos1.x, relpos1.y, 0);
if (twoIcons) {
@@ -474,7 +476,7 @@ Restart:
Base::Vector3d secondPos = midpos2 - midpos1;
auto translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::SecondTranslationIndex)));
translation->abPos = SbVec3f(secondPos.x, secondPos.y, drawingParameters.zConstr);
translation->abPos = SbVec3f(secondPos.x, secondPos.y, zConstrH);
translation->translation = SbVec3f(relpos2.x -relpos1.x, relpos2.y -relpos1.y, 0);
}
@@ -660,7 +662,7 @@ Restart:
auto translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::FirstTranslationIndex)));
translation->abPos = SbVec3f(midpos1.x, midpos1.y, drawingParameters.zConstr); //Absolute Reference
translation->abPos = SbVec3f(midpos1.x, midpos1.y, zConstrH); //Absolute Reference
//Reference Position that is scaled according to zoom
translation->translation = SbVec3f(relpos1.x, relpos1.y, 0);
@@ -669,7 +671,7 @@ Restart:
translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::SecondTranslationIndex)));
translation->abPos = SbVec3f(secondPos.x, secondPos.y, drawingParameters.zConstr); //Absolute Reference
translation->abPos = SbVec3f(secondPos.x, secondPos.y, zConstrH); //Absolute Reference
//Reference Position that is scaled according to zoom
translation->translation = SbVec3f(relpos2.x - relpos1.x, relpos2.y -relpos1.y, 0);
@@ -728,8 +730,8 @@ Restart:
asciiText->pnts.setNum(2);
SbVec3f *verts = asciiText->pnts.startEditing();
verts[0] = SbVec3f (pnt1.x, pnt1.y, drawingParameters.zConstr);
verts[1] = SbVec3f (pnt2.x, pnt2.y, drawingParameters.zConstr);
verts[0] = SbVec3f (pnt1.x, pnt1.y, zConstrH);
verts[1] = SbVec3f (pnt2.x, pnt2.y, zConstrH);
asciiText->pnts.finishEditing();
@@ -781,7 +783,7 @@ Restart:
auto translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::FirstTranslationIndex)));
translation->abPos = SbVec3f(pos.x, pos.y, drawingParameters.zConstr); //Absolute Reference
translation->abPos = SbVec3f(pos.x, pos.y, zConstrH); //Absolute Reference
translation->translation = SbVec3f(relPos.x, relPos.y, 0);
}
else if (Constr->Type == Tangent) {
@@ -806,14 +808,14 @@ Restart:
auto translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::FirstTranslationIndex)));
translation->abPos = SbVec3f(midpos1.x, midpos1.y, drawingParameters.zConstr); //Absolute Reference
translation->abPos = SbVec3f(midpos1.x, midpos1.y, zConstrH); //Absolute Reference
translation->translation = SbVec3f(relpos1.x, relpos1.y, 0);
Base::Vector3d secondPos = midpos2 - midpos1;
translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::SecondTranslationIndex)));
translation->abPos = SbVec3f(secondPos.x, secondPos.y, drawingParameters.zConstr); //Absolute Reference
translation->abPos = SbVec3f(secondPos.x, secondPos.y, zConstrH); //Absolute Reference
translation->translation = SbVec3f(relpos2.x -relpos1.x, relpos2.y -relpos1.y, 0);
break;
@@ -895,7 +897,7 @@ Restart:
}
auto translation = static_cast<SoZoomTranslation *>(sep->getChild(static_cast<int>(ConstraintNodePosition::FirstTranslationIndex)));
translation->abPos = SbVec3f(pos.x, pos.y, drawingParameters.zConstr); //Absolute Reference
translation->abPos = SbVec3f(pos.x, pos.y, zConstrH); //Absolute Reference
translation->translation = SbVec3f(relPos.x, relPos.y, 0);
}
}
@@ -908,8 +910,8 @@ Restart:
Base::Vector3d pnt1 = geolistfacade.getPoint(Constr->First, Constr->FirstPos);
Base::Vector3d pnt2 = geolistfacade.getPoint(Constr->Second, Constr->SecondPos);
SbVec3f p1(pnt1.x, pnt1.y, drawingParameters.zConstr);
SbVec3f p2(pnt2.x, pnt2.y, drawingParameters.zConstr);
SbVec3f p1(pnt1.x, pnt1.y, zConstrH);
SbVec3f p2(pnt2.x, pnt2.y, zConstrH);
SbVec3f dir = (p2-p1);
dir.normalize();
SbVec3f norm (-dir[1],dir[0],0);
@@ -1086,8 +1088,8 @@ Restart:
} else
break;
SbVec3f p1(pnt1.x, pnt1.y, drawingParameters.zConstr);
SbVec3f p2(pnt2.x, pnt2.y, drawingParameters.zConstr);
SbVec3f p1(pnt1.x, pnt1.y, zConstrH);
SbVec3f p2(pnt2.x, pnt2.y, zConstrH);
SoDatumLabel *asciiText = static_cast<SoDatumLabel *>(sep->getChild(static_cast<int>(ConstraintNodePosition::DatumLabelIndex)));
@@ -1149,8 +1151,8 @@ Restart:
} else
break;
SbVec3f p1(pnt1.x, pnt1.y, drawingParameters.zConstr);
SbVec3f p2(pnt2.x, pnt2.y, drawingParameters.zConstr);
SbVec3f p1(pnt1.x, pnt1.y, zConstrH);
SbVec3f p2(pnt2.x, pnt2.y, zConstrH);
SoDatumLabel *asciiText = static_cast<SoDatumLabel *>(sep->getChild(static_cast<int>(ConstraintNodePosition::DatumLabelIndex)));

View File

@@ -47,6 +47,7 @@
#include "Mod/Sketcher/App/Constraint.h"
#include "EditModeGeometryCoinConverter.h"
#include "ViewProviderSketchCoinAttorney.h"
using namespace SketcherGui;
@@ -226,7 +227,8 @@ void EditModeGeometryCoinConverter::convert(const Sketcher::GeoListFacade & geol
int i=0; // setting up the line set
for (std::vector<Base::Vector3d>::const_iterator it = Coords[l].begin(); it != Coords[l].end(); ++it,i++)
verts[i].setValue(it->x,it->y,drawingParameters.zLowLines);
verts[i].setValue(it->x,it->y,
ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zLowLines);
i=0; // setting up the indexes of the line set
for (std::vector<unsigned int>::const_iterator it = Index[l].begin(); it != Index[l].end(); ++it,i++)
@@ -234,7 +236,8 @@ void EditModeGeometryCoinConverter::convert(const Sketcher::GeoListFacade & geol
i=0; // setting up the point set
for (std::vector<Base::Vector3d>::const_iterator it = Points[l].begin(); it != Points[l].end(); ++it,i++)
pverts[i].setValue(it->x,it->y,drawingParameters.zLowPoints);
pverts[i].setValue(it->x,it->y,
ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zLowPoints);
geometryLayerNodes.CurvesCoordinate[l]->point.finishEditing();
geometryLayerNodes.CurveSet[l]->numVertices.finishEditing();

View File

@@ -26,6 +26,8 @@
#include <vector>
#include "ViewProviderSketch.h"
namespace Base {
template< typename T >
class Vector3;

View File

@@ -200,6 +200,7 @@ void EditModeGeometryCoinManager::updateGeometryColor(const GeoListFacade & geol
// Update Colors
SbColor *crosscolor = editModeScenegraphNodes.RootCrossMaterials->diffuseColor.startEditing();
auto viewOrientationFactor = ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider);
for(int l=0; l<geometryLayerParameters.CoinLayers; l++) {
@@ -276,7 +277,7 @@ void EditModeGeometryCoinManager::updateGeometryColor(const GeoListFacade & geol
for (int i=0; i < PtNum; i++) { // 0 is the origin
if( i == 0 && l == 0 ) { // reset root point to lowest
pverts[i].setValue(0, 0, drawingParameters.zRootPoint);
pverts[i].setValue(0, 0, viewOrientationFactor * drawingParameters.zRootPoint);
}
else {
pverts[i].getValue(x,y,z);
@@ -284,9 +285,9 @@ void EditModeGeometryCoinManager::updateGeometryColor(const GeoListFacade & geol
if(geom) {
if(geom->getConstruction())
pverts[i].setValue(x,y,zConstrPoint);
pverts[i].setValue(x,y,viewOrientationFactor * zConstrPoint);
else
pverts[i].setValue(x,y,zNormPoint);
pverts[i].setValue(x,y,viewOrientationFactor * zNormPoint);
}
}
}
@@ -352,35 +353,35 @@ void EditModeGeometryCoinManager::updateGeometryColor(const GeoListFacade & geol
color[i] = drawingParameters.PreselectSelectedColor;
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,drawingParameters.zHighLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * drawingParameters.zHighLine);
}
}
else if (selected){
color[i] = drawingParameters.SelectColor;
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,drawingParameters.zHighLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * drawingParameters.zHighLine);
}
}
else if (preselected){
color[i] = drawingParameters.PreselectColor;
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,drawingParameters.zHighLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * drawingParameters.zHighLine);
}
}
else if (GeoId <= Sketcher::GeoEnum::RefExt) { // external Geometry
color[i] = drawingParameters.CurveExternalColor;
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,zExtLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * zExtLine);
}
}
else if ( issketchinvalid ) {
color[i] = drawingParameters.InvalidSketchColor;
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,zNormLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * zNormLine);
}
}
else if (isConstructionGeom(GeoId)) {
@@ -399,28 +400,28 @@ void EditModeGeometryCoinManager::updateGeometryColor(const GeoListFacade & geol
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,zConstrLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * zConstrLine);
}
}
else if (ViewProviderSketchCoinAttorney::isSketchFullyConstrained(viewProvider)) {
color[i] = drawingParameters.FullyConstrainedColor;
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,zNormLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * zNormLine);
}
}
else if (isFullyConstraintElement(GeoId)) {
color[i] = drawingParameters.FullyConstraintElementColor;
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,zNormLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * zNormLine);
}
}
else {
color[i] = drawingParameters.CurveColor;
for (int k=j; j<k+indexes; j++) {
verts[j].getValue(x,y,z);
verts[j] = SbVec3f(x,y,zNormLine);
verts[j] = SbVec3f(x,y,viewOrientationFactor * zNormLine);
}
}
}

View File

@@ -45,6 +45,7 @@
#include "EditModeCoinManagerParameters.h"
#include "EditModeInformationOverlayCoinConverter.h"
#include "ViewProviderSketchCoinAttorney.h"
using namespace SketcherGui;
@@ -203,16 +204,18 @@ void EditModeInformationOverlayCoinConverter::calculate(const Part::Geometry * g
curvatureComb.coordinates.reserve(3*ndiv); // 2*ndiv +1 points of ndiv separate segments + ndiv points for last segment
curvatureComb.indices.reserve(ndiv+1); // ndiv separate segments of radials + 1 segment connecting at comb end
auto zInfoH = ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zInfo;
for(int i = 0; i < ndiv; i++) {
// note emplace emplaces on the position BEFORE the iterator given.
curvatureComb.coordinates.emplace_back(pointatcurvelist[i].x, pointatcurvelist[i].y, drawingParameters.zInfo); // radials
curvatureComb.coordinates.emplace_back(pointatcomblist[i].x, pointatcomblist[i].y, drawingParameters.zInfo); // radials
curvatureComb.coordinates.emplace_back(pointatcurvelist[i].x, pointatcurvelist[i].y, zInfoH); // radials
curvatureComb.coordinates.emplace_back(pointatcomblist[i].x, pointatcomblist[i].y, zInfoH); // radials
curvatureComb.indices.emplace_back(2); // line
}
for(int i = 0; i < ndiv; i++)
curvatureComb.coordinates.emplace_back(pointatcomblist[i].x, pointatcomblist[i].y, drawingParameters.zInfo); // // comb endpoint closing segment
curvatureComb.coordinates.emplace_back(pointatcomblist[i].x, pointatcomblist[i].y, zInfoH); // // comb endpoint closing segment
curvatureComb.indices.emplace_back(ndiv); // Comb line
}
@@ -286,7 +289,8 @@ void EditModeInformationOverlayCoinConverter::setPolygon(const Result & result,
SbVec3f *vts = polygoncoords->point.startEditing();
for(size_t i = 0; i < result.coordinates.size(); i++)
vts[i].setValue(result.coordinates[i].x, result.coordinates[i].y, drawingParameters.zInfo);
vts[i].setValue(result.coordinates[i].x, result.coordinates[i].y,
ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zInfo);
for(size_t i = 0; i < result.indices.size(); i++)
index[i] = result.indices[i];
@@ -348,7 +352,8 @@ void EditModeInformationOverlayCoinConverter::addNode(const Result & result) {
SoTranslation *translate = new SoTranslation;
translate->translation.setValue(result.positions[i].x, result.positions[i].y, drawingParameters.zInfo);
translate->translation.setValue(result.positions[i].x, result.positions[i].y,
ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zInfo);
SoFont *font = new SoFont;
font->name.setValue("Helvetica");
@@ -425,7 +430,7 @@ void EditModeInformationOverlayCoinConverter::updateNode(const Result & result)
SoSeparator *sep = static_cast<SoSeparator *>(sw->getChild(0));
static_cast<SoTranslation *>(sep->getChild(static_cast<int>(TextNodePosition::TextCoordinates)))->translation.setValue(result.positions[i].x, result.positions[i].y, drawingParameters.zInfo);
static_cast<SoTranslation *>(sep->getChild(static_cast<int>(TextNodePosition::TextCoordinates)))->translation.setValue(result.positions[i].x, result.positions[i].y, ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider) * drawingParameters.zInfo);
// since the first and last control point of a spline is also treated as knot and thus
// can also have a displayed multiplicity, we must assure the multiplicity is not visibly overwritten

View File

@@ -26,6 +26,8 @@
#include <vector>
#include "ViewProviderSketch.h"
namespace Base {
template< typename T >
class Vector3;