Skip to content

Commit

Permalink
Fix several regressions:
Browse files Browse the repository at this point in the history
+ do not register the private member '_diffuseColor' as property because it would be exposed to the
  public where it can be modified
+ fix ViewProviderPartExt::finishRestoring() to correctly restore old project files
+ fix ViewProviderPartExt::setHighlightedFaces() to correctly show face colours if VBO is enabled
+ fix ViewProviderBoolean::updateData()
  fix ViewProviderMultiFuse::updateData()
  fix ViewProviderMultiCommon::updateData()
  fix ViewProviderCompound::updateData()
  fix ViewProviderFillet::updateData()
  fix ViewProviderChamfer::updateData()
  that all set invalid transparency values
+ Filter ShapeAppearance in ViewProviderBody::unifyVisualProperty
  because body features usually have different number of faces than the body itself
+ clean up code and remove duplicated code
  • Loading branch information
wwmayer committed Jun 17, 2024
1 parent 6044ecb commit 48b13b4
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 111 deletions.
2 changes: 1 addition & 1 deletion src/Mod/Part/Gui/ViewProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ void ViewProviderPart::applyColor(const Part::ShapeHistory& hist,
}

void ViewProviderPart::applyMaterial(const Part::ShapeHistory& hist,
const App::PropertyMaterialList& colBase,
const std::vector<App::Material>& colBase,
std::vector<App::Material>& colBool)
{
std::map<int, std::vector<int>>::const_iterator jt;
Expand Down
2 changes: 1 addition & 1 deletion src/Mod/Part/Gui/ViewProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class PartGuiExport ViewProviderPart : public ViewProviderPartExt
const std::vector<App::Color>& colBase,
std::vector<App::Color>& colBool);
void applyMaterial(const Part::ShapeHistory& hist,
const App::PropertyMaterialList& colBase,
const std::vector<App::Material>& colBase,
std::vector<App::Material>& colBool);
void applyTransparency(float transparency, std::vector<App::Color>& colors);
void applyTransparency(float transparency, std::vector<App::Material>& colors);
Expand Down
56 changes: 28 additions & 28 deletions src/Mod/Part/Gui/ViewProviderBoolean.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,27 +100,27 @@ void ViewProviderBoolean::updateData(const App::Property* prop)
auto vpTool = dynamic_cast<PartGui::ViewProviderPart*>(
Gui::Application::Instance->getViewProvider(objTool));
if (vpBase && vpTool) {
std::vector<App::Material> colBase = vpBase->ShapeAppearance.getValues();
std::vector<App::Material> colTool = vpTool->ShapeAppearance.getValues();
std::vector<App::Material> colBool;
colBool.resize(boolMap.Extent(), this->ShapeAppearance[0]);
vpBase->ShapeAppearance.setTransparency(vpBase->Transparency.getValue());
vpTool->ShapeAppearance.setTransparency(vpTool->Transparency.getValue());
applyTransparency(vpBase->Transparency.getValue(),colBase);
applyTransparency(vpTool->Transparency.getValue(),colTool);

if (static_cast<int>(vpBase->ShapeAppearance.getSize()) == baseMap.Extent()) {
applyMaterial(hist[0], vpBase->ShapeAppearance, colBool);
if (static_cast<int>(colBase.size()) == baseMap.Extent()) {
applyMaterial(hist[0], colBase, colBool);
}
else if (vpBase->ShapeAppearance.getSize() > 0
&& vpBase->ShapeAppearance[0] != this->ShapeAppearance[0]) {
vpBase->ShapeAppearance.setSize(baseMap.Extent(), vpBase->ShapeAppearance[0]);
applyMaterial(hist[0], vpBase->ShapeAppearance, colBool);
else if (!colBase.empty() && colBase[0] != this->ShapeAppearance[0]) {
colBase.resize(baseMap.Extent(), colBase[0]);
applyMaterial(hist[0], colBase, colBool);
}

if (static_cast<int>(vpTool->ShapeAppearance.getSize()) == toolMap.Extent()) {
applyMaterial(hist[1], vpTool->ShapeAppearance, colBool);
if (static_cast<int>(colTool.size()) == toolMap.Extent()) {
applyMaterial(hist[1], colTool, colBool);
}
else if (vpTool->ShapeAppearance.getSize() > 0
&& vpTool->ShapeAppearance[0] != this->ShapeAppearance[0]) {
vpTool->ShapeAppearance.setSize(toolMap.Extent(), vpTool->ShapeAppearance[0]);
applyMaterial(hist[1], vpTool->ShapeAppearance, colBool);
else if (!colTool.empty() && colTool[0] != this->ShapeAppearance[0]) {
colTool.resize(toolMap.Extent(), colTool[0]);
applyMaterial(hist[1], colTool, colBool);
}

// If the view provider has set a transparency then override the values
Expand Down Expand Up @@ -201,14 +201,14 @@ void ViewProviderMultiFuse::updateData(const App::Property* prop)

auto vpBase = dynamic_cast<PartGui::ViewProviderPart*>(Gui::Application::Instance->getViewProvider(objBase));
if (vpBase) {
vpBase->ShapeAppearance.setTransparency(vpBase->Transparency.getValue());
if (static_cast<int>(vpBase->ShapeAppearance.getSize()) == baseMap.Extent()) {
applyMaterial(hist[index], vpBase->ShapeAppearance, colBool);
std::vector<App::Material> colBase = vpBase->ShapeAppearance.getValues();
applyTransparency(vpBase->Transparency.getValue(),colBase);
if (static_cast<int>(colBase.size()) == baseMap.Extent()) {
applyMaterial(hist[index], colBase, colBool);
}
else if (vpBase->ShapeAppearance.getSize() > 0
&& vpBase->ShapeAppearance[0] != this->ShapeAppearance[0]) {
vpBase->ShapeAppearance.setSize(baseMap.Extent(), vpBase->ShapeAppearance[0]);
applyMaterial(hist[index], vpBase->ShapeAppearance, colBool);
else if (!colBase.empty() && colBase[0] != this->ShapeAppearance[0]) {
colBase.resize(baseMap.Extent(), colBase[0]);
applyMaterial(hist[index], colBase, colBool);
}
}
}
Expand Down Expand Up @@ -336,14 +336,14 @@ void ViewProviderMultiCommon::updateData(const App::Property* prop)

auto vpBase = dynamic_cast<PartGui::ViewProviderPart*>(Gui::Application::Instance->getViewProvider(objBase));
if (vpBase) {
vpBase->ShapeAppearance.setTransparency(vpBase->Transparency.getValue());
if (static_cast<int>(vpBase->ShapeAppearance.getSize()) == baseMap.Extent()) {
applyMaterial(hist[index], vpBase->ShapeAppearance, colBool);
std::vector<App::Material> colBase = vpBase->ShapeAppearance.getValues();
applyTransparency(vpBase->Transparency.getValue(),colBase);
if (static_cast<int>(colBase.size()) == baseMap.Extent()) {
applyMaterial(hist[index], colBase, colBool);
}
else if (vpBase->ShapeAppearance.getSize() > 0
&& vpBase->ShapeAppearance[0] != this->ShapeAppearance[0]) {
vpBase->ShapeAppearance.setSize(baseMap.Extent(), vpBase->ShapeAppearance[0]);
applyMaterial(hist[index], vpBase->ShapeAppearance, colBool);
else if (!colBase.empty() && colBase[0] != this->ShapeAppearance[0]) {
colBase.resize(baseMap.Extent(), colBase[0]);
applyMaterial(hist[index], colBase, colBool);
}
}
}
Expand Down
14 changes: 7 additions & 7 deletions src/Mod/Part/Gui/ViewProviderCompound.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,14 @@ void ViewProviderCompound::updateData(const App::Property* prop)

auto vpBase = dynamic_cast<PartGui::ViewProviderPart*>(Gui::Application::Instance->getViewProvider(objBase));
if (vpBase) {
vpBase->ShapeAppearance.setTransparency(vpBase->Transparency.getValue());
if (static_cast<int>(vpBase->ShapeAppearance.getSize()) == baseMap.Extent()) {
applyMaterial(hist[index], vpBase->ShapeAppearance, compCol);
std::vector<App::Material> baseCol = vpBase->ShapeAppearance.getValues();
applyTransparency(vpBase->Transparency.getValue(), baseCol);
if (static_cast<int>(baseCol.size()) == baseMap.Extent()) {
applyMaterial(hist[index], baseCol, compCol);
}
else if (vpBase->ShapeAppearance.getSize() > 0
&& vpBase->ShapeAppearance[0] != this->ShapeAppearance[0]) {
vpBase->ShapeAppearance.setSize(baseMap.Extent(), vpBase->ShapeAppearance[0]);
applyMaterial(hist[index], vpBase->ShapeAppearance, compCol);
else if (!baseCol.empty() && baseCol[0] != this->ShapeAppearance[0]) {
baseCol.resize(baseMap.Extent(), baseCol[0]);
applyMaterial(hist[index], baseCol, compCol);
}
}
}
Expand Down
73 changes: 14 additions & 59 deletions src/Mod/Part/Gui/ViewProviderExt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,16 +197,6 @@ ViewProviderPartExt::ViewProviderPartExt()
ADD_PROPERTY_TYPE(DrawStyle,((long int)0), osgroup, App::Prop_None, "Defines the style of the edges in the 3D view.");
DrawStyle.setEnums(DrawStyleEnums);

// This is needed to restore old DiffuseColor values since the restore
// function is asynchronous
App::PropertyColor noColor;
ADD_PROPERTY_TYPE(_diffuseColor,
(noColor.getValue()),
osgroup,
App::Prop_NoPersist,
"Object diffuse color.");
_diffuseColor.setStatus(App::Property::PropHidden, true);

coords = new SoCoordinate3();
coords->ref();
faceset = new SoBrepFaceSet();
Expand Down Expand Up @@ -345,8 +335,9 @@ void ViewProviderPartExt::onChanged(const App::Property* prop)
}
else if (prop == &PointMaterial) {
const App::Material& Mat = PointMaterial.getValue();
if (PointColor.getValue() != Mat.diffuseColor)
if (PointColor.getValue() != Mat.diffuseColor) {
PointColor.setValue(Mat.diffuseColor);
}
pcPointMaterial->ambientColor.setValue(Mat.ambientColor.r,Mat.ambientColor.g,Mat.ambientColor.b);
pcPointMaterial->diffuseColor.setValue(Mat.diffuseColor.r,Mat.diffuseColor.g,Mat.diffuseColor.b);
pcPointMaterial->specularColor.setValue(Mat.specularColor.r,Mat.specularColor.g,Mat.specularColor.b);
Expand All @@ -363,7 +354,7 @@ void ViewProviderPartExt::onChanged(const App::Property* prop)
else if (prop == &_diffuseColor) {
// Used to load the old DiffuseColor values asynchronously
ShapeAppearance.setDiffuseColors(_diffuseColor.getValues());
ShapeAppearance.setTransparency(Transparency.getValue() / 100.0f);
ShapeAppearance.setTransparency(Transparency.getValue() / 100.0F);
}
else if (prop == &ShapeAppearance) {
setHighlightedFaces(ShapeAppearance);
Expand Down Expand Up @@ -627,6 +618,12 @@ std::vector<Base::Vector3d> ViewProviderPartExt::getSelectionShape(const char* /

void ViewProviderPartExt::setHighlightedFaces(const std::vector<App::Material>& materials)
{
if (getObject() && getObject()->testStatus(App::ObjectStatus::TouchOnColorChange))
getObject()->touch(true);

Gui::SoUpdateVBOAction action;
action.apply(this->faceset);

int size = static_cast<int>(materials.size());
if (size > 1 && size == this->faceset->partIndex.getNum()) {
pcFaceBind->value = SoMaterialBinding::PER_PART;
Expand Down Expand Up @@ -666,49 +663,7 @@ void ViewProviderPartExt::setHighlightedFaces(const std::vector<App::Material>&

void ViewProviderPartExt::setHighlightedFaces(const App::PropertyMaterialList& appearance)
{
int size = static_cast<int>(appearance.getSize());
if (size > 1 && size == this->faceset->partIndex.getNum()) {
pcFaceBind->value = SoMaterialBinding::PER_PART;
activateMaterial();

pcShapeMaterial->diffuseColor.setNum(size);
pcShapeMaterial->ambientColor.setNum(size);
pcShapeMaterial->specularColor.setNum(size);
pcShapeMaterial->emissiveColor.setNum(size);
pcShapeMaterial->shininess.setNum(size);

SbColor* dc = pcShapeMaterial->diffuseColor.startEditing();
SbColor* ac = pcShapeMaterial->ambientColor.startEditing();
SbColor* sc = pcShapeMaterial->specularColor.startEditing();
SbColor* ec = pcShapeMaterial->emissiveColor.startEditing();
float* sh = pcShapeMaterial->shininess.startEditing();

for (int i = 0; i < size; i++) {
dc[i].setValue(appearance.getDiffuseColor(i).r,
appearance.getDiffuseColor(i).g,
appearance.getDiffuseColor(i).b);
ac[i].setValue(appearance.getAmbientColor(i).r,
appearance.getAmbientColor(i).g,
appearance.getAmbientColor(i).b);
sc[i].setValue(appearance.getSpecularColor(i).r,
appearance.getSpecularColor(i).g,
appearance.getSpecularColor(i).b);
ec[i].setValue(appearance.getEmissiveColor(i).r,
appearance.getEmissiveColor(i).g,
appearance.getEmissiveColor(i).b);
sh[i] = appearance.getShininess(i);
}

pcShapeMaterial->diffuseColor.finishEditing();
pcShapeMaterial->ambientColor.finishEditing();
pcShapeMaterial->specularColor.finishEditing();
pcShapeMaterial->emissiveColor.finishEditing();
pcShapeMaterial->shininess.finishEditing();
}
else if (size == 1) {
pcFaceBind->value = SoMaterialBinding::OVERALL;
setCoinAppearance(appearance[0]);
}
setHighlightedFaces(appearance.getValues());
}

std::map<std::string,App::Color> ViewProviderPartExt::getElementColors(const char *element) const {
Expand Down Expand Up @@ -802,7 +757,6 @@ std::map<std::string,App::Color> ViewProviderPartExt::getElementColors(const cha

void ViewProviderPartExt::unsetHighlightedFaces()
{
// DiffuseColor.touch();
ShapeAppearance.touch();
Transparency.touch();
}
Expand Down Expand Up @@ -925,7 +879,9 @@ void ViewProviderPartExt::finishRestoring()
// and currently sets a single color.
// In case DiffuseColor has defined multiple colors they will
// be passed to the scene graph now.
ShapeAppearance.touch();
if (_diffuseColor.getSize() > 1) {
onChanged(&_diffuseColor);
}
Gui::ViewProviderGeometryObject::finishRestoring();
}

Expand Down Expand Up @@ -1371,8 +1327,7 @@ void ViewProviderPartExt::updateVisual()
VisualTouched = false;

// The material has to be checked again
// setHighlightedFaces(DiffuseColor.getValues());
setHighlightedFaces(ShapeAppearance);
setHighlightedFaces(ShapeAppearance.getValues());
setHighlightedEdges(LineColorArray.getValues());
setHighlightedPoints(PointColorArray.getValue());
}
Expand Down
28 changes: 13 additions & 15 deletions src/Mod/Part/Gui/ViewProviderMirror.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,18 +263,17 @@ void ViewProviderFillet::updateData(const App::Property* prop)

auto vpBase = dynamic_cast<PartGui::ViewProviderPart*>(Gui::Application::Instance->getViewProvider(objBase));
if (vpBase) {
// std::vector<App::Color> colBase = vpBase->DiffuseColor.getValues();
auto colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->ShapeAppearance.getValues();
std::vector<App::Material> colFill;
colFill.resize(fillMap.Extent(), vpBase->ShapeAppearance[0]);
vpBase->ShapeAppearance.setTransparency(vpBase->Transparency.getValue());
colFill.resize(fillMap.Extent(), colBase[0]);
applyTransparency(static_cast<PartGui::ViewProviderPart*>(vpBase)->Transparency.getValue(), colBase);

if (static_cast<int>(vpBase->ShapeAppearance.getSize()) == baseMap.Extent()) {
applyMaterial(hist[0], vpBase->ShapeAppearance, colFill);
if (static_cast<int>(colBase.size()) == baseMap.Extent()) {
applyMaterial(hist[0], colBase, colFill);
}
else if (vpBase->ShapeAppearance.getSize() > 0
&& vpBase->ShapeAppearance[0] != this->ShapeAppearance[0]) {
vpBase->ShapeAppearance.setSize(baseMap.Extent(), vpBase->ShapeAppearance[0]);
applyMaterial(hist[0], vpBase->ShapeAppearance, colFill);
else if (!colBase.empty() && colBase[0] != this->ShapeAppearance[0]) {
colBase.resize(baseMap.Extent(), colBase[0]);
applyMaterial(hist[0], colBase, colFill);
}

// If the view provider has set a transparency then override the values
Expand Down Expand Up @@ -374,17 +373,16 @@ void ViewProviderChamfer::updateData(const App::Property* prop)

auto vpBase = dynamic_cast<PartGui::ViewProviderPart*>(Gui::Application::Instance->getViewProvider(objBase));
if (vpBase) {
// std::vector<App::Color> colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->DiffuseColor.getValues();
auto& colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->ShapeAppearance;
auto colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->ShapeAppearance.getValues();
std::vector<App::Material> colCham;
colCham.resize(chamMap.Extent(), colBase[0]);
colBase.setTransparency(static_cast<PartGui::ViewProviderPart*>(vpBase)->Transparency.getValue());
applyTransparency(static_cast<PartGui::ViewProviderPart*>(vpBase)->Transparency.getValue(), colBase);

if (static_cast<int>(colBase.getSize()) == baseMap.Extent()) {
if (static_cast<int>(colBase.size()) == baseMap.Extent()) {
applyMaterial(hist[0], colBase, colCham);
}
else if (colBase.getSize() > 0 && colBase[0] != this->ShapeAppearance[0]) {
colBase.setSize(baseMap.Extent(), colBase[0]);
else if (!colBase.empty() && colBase[0] != this->ShapeAppearance[0]) {
colBase.resize(baseMap.Extent(), colBase[0]);
applyMaterial(hist[0], colBase, colCham);
}

Expand Down
1 change: 1 addition & 0 deletions src/Mod/PartDesign/Gui/ViewProviderBody.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,7 @@ void ViewProviderBody::unifyVisualProperty(const App::Property* prop) {
if (prop == &Visibility ||
prop == &Selectable ||
prop == &DisplayModeBody ||
prop == &ShapeAppearance ||
prop == &PointColorArray ||
prop == &LineColorArray) {
return;
Expand Down

0 comments on commit 48b13b4

Please sign in to comment.