From c32628ec0df839bff092283a66a716657c78e7f1 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 16 Nov 2024 12:37:32 +0100 Subject: [PATCH] Part: Fix alpha <> transparency conversion --- src/Mod/Import/TestImportGui.py | 24 ++++----- .../materialtests/TestMaterialDocument.py | 10 ++-- src/Mod/Part/Gui/ViewProviderPartExtPyImp.cpp | 8 ++- src/Mod/Part/parttests/ColorPerFaceTest.py | 50 +++++++++---------- 4 files changed, 45 insertions(+), 47 deletions(-) diff --git a/src/Mod/Import/TestImportGui.py b/src/Mod/Import/TestImportGui.py index 8f2d3f7d48..9f2d6eb25a 100644 --- a/src/Mod/Import/TestImportGui.py +++ b/src/Mod/Import/TestImportGui.py @@ -45,12 +45,12 @@ class ExportImportTest(unittest.TestCase): self.doc.recompute() box.ViewObject.DiffuseColor = [ - (1.0, 0.0, 0.0, 0.0), - (1.0, 0.0, 0.0, 0.0), - (1.0, 0.0, 0.0, 0.0), - (1.0, 0.0, 0.0, 0.0), - (1.0, 1.0, 0.0, 0.0), - (1.0, 1.0, 0.0, 0.0), + (1.0, 0.0, 0.0, 1.0), + (1.0, 0.0, 0.0, 1.0), + (1.0, 0.0, 0.0, 1.0), + (1.0, 0.0, 0.0, 1.0), + (1.0, 1.0, 0.0, 1.0), + (1.0, 1.0, 0.0, 1.0), ] ImportGui.export([part], self.fileName) @@ -63,12 +63,12 @@ class ExportImportTest(unittest.TestCase): feature = part_features[0] self.assertEqual(len(feature.ViewObject.DiffuseColor), 6) - self.assertEqual(feature.ViewObject.DiffuseColor[0], (1.0, 0.0, 0.0, 0.0)) - self.assertEqual(feature.ViewObject.DiffuseColor[1], (1.0, 0.0, 0.0, 0.0)) - self.assertEqual(feature.ViewObject.DiffuseColor[2], (1.0, 0.0, 0.0, 0.0)) - self.assertEqual(feature.ViewObject.DiffuseColor[3], (1.0, 0.0, 0.0, 0.0)) - self.assertEqual(feature.ViewObject.DiffuseColor[4], (1.0, 1.0, 0.0, 0.0)) - self.assertEqual(feature.ViewObject.DiffuseColor[5], (1.0, 1.0, 0.0, 0.0)) + self.assertEqual(feature.ViewObject.DiffuseColor[0], (1.0, 0.0, 0.0, 1.0)) + self.assertEqual(feature.ViewObject.DiffuseColor[1], (1.0, 0.0, 0.0, 1.0)) + self.assertEqual(feature.ViewObject.DiffuseColor[2], (1.0, 0.0, 0.0, 1.0)) + self.assertEqual(feature.ViewObject.DiffuseColor[3], (1.0, 0.0, 0.0, 1.0)) + self.assertEqual(feature.ViewObject.DiffuseColor[4], (1.0, 1.0, 0.0, 1.0)) + self.assertEqual(feature.ViewObject.DiffuseColor[5], (1.0, 1.0, 0.0, 1.0)) sa = coin.SoSearchAction() sa.setType(coin.SoMaterialBinding.getClassTypeId()) diff --git a/src/Mod/Material/materialtests/TestMaterialDocument.py b/src/Mod/Material/materialtests/TestMaterialDocument.py index 821cec09e7..4b2bb86ecf 100644 --- a/src/Mod/Material/materialtests/TestMaterialDocument.py +++ b/src/Mod/Material/materialtests/TestMaterialDocument.py @@ -36,7 +36,7 @@ class DocumentTestCases(unittest.TestCase): def testApplyDiffuseColorCheckShapeAppearance(self): """ Test that applying a DiffuseColor with transparency results in a correct ShapeAppearance """ - dif_col_1 = (1.0, 1.0, 0.0, 0.0) # yellow 0% transparent + dif_col_1 = (1.0, 1.0, 0.0, 1.0) # yellow 0% transparent dif_col_2 = (1.0, 0.0, 0.0, 0.5) # red 50% transparent dif_col = [dif_col_1] + [dif_col_2] + 4 * [dif_col_1] @@ -45,17 +45,17 @@ class DocumentTestCases(unittest.TestCase): vobj.DiffuseColor = dif_col self.assertEqual( - [m.DiffuseColor[:3] + (m.Transparency, ) for m in vobj.ShapeAppearance], + [m.DiffuseColor[:3] + (1.0 - m.Transparency, ) for m in vobj.ShapeAppearance], vobj.DiffuseColor ) def testApplyShapeAppearanceCheckDiffuseColor(self): """ Test that applying a ShapeAppearance with transparency results in a correct DiffuseColor """ sapp_1 = FreeCAD.Material() - sapp_1.DiffuseColor = (0.0, 1.0, 1.0, 1.0) # cyan + sapp_1.DiffuseColor = (0.0, 1.0, 1.0, 0.0) # cyan sapp_1.Transparency = 0.0 # 0% transparent sapp_2 = FreeCAD.Material() - sapp_2.DiffuseColor = (0.0, 1.0, 0.0, 1.0) # green + sapp_2.DiffuseColor = (0.0, 1.0, 0.0, 0.0) # green sapp_2.Transparency = 0.3 # 30% transparent sapp = [sapp_1] + [sapp_2] + 4 * [sapp_1] @@ -64,6 +64,6 @@ class DocumentTestCases(unittest.TestCase): vobj.ShapeAppearance = sapp self.assertEqual( - [m.DiffuseColor[:3] + (m.Transparency, ) for m in vobj.ShapeAppearance], + [m.DiffuseColor[:3] + (1.0 - m.Transparency, ) for m in vobj.ShapeAppearance], vobj.DiffuseColor ) diff --git a/src/Mod/Part/Gui/ViewProviderPartExtPyImp.cpp b/src/Mod/Part/Gui/ViewProviderPartExtPyImp.cpp index adc59b9b98..d54580160a 100644 --- a/src/Mod/Part/Gui/ViewProviderPartExtPyImp.cpp +++ b/src/Mod/Part/Gui/ViewProviderPartExtPyImp.cpp @@ -52,11 +52,10 @@ PyObject* ViewProviderPartExtPy::getCustomAttributes(const char* attr) const // Get the color properties App::PropertyColorList prop; - // v0.21 used the alpha channel to store transparency values std::vector colors = vp->ShapeAppearance.getDiffuseColors(); std::vector transparencies = vp->ShapeAppearance.getTransparencies(); for (int i = 0; i < static_cast(colors.size()); i++) { - colors[i].a = transparencies[i]; + colors[i].setTransparency(transparencies[i]); } prop.setValues(colors); @@ -73,13 +72,12 @@ int ViewProviderPartExtPy::setCustomAttributes(const char* attr, PyObject* obj) App::PropertyColorList prop; prop.setPyObject(obj); - // v0.21 used the alpha channel to store transparency values std::vector colors = prop.getValues(); std::vector transparencies; transparencies.resize(static_cast(colors.size())); for (int i = 0; i < static_cast(colors.size()); i++) { - transparencies[i] = colors[i].a; - colors[i].a = 1.0; + transparencies[i] = colors[i].transparency(); + colors[i].a = 1.0F; } vp->ShapeAppearance.setDiffuseColors(colors); vp->ShapeAppearance.setTransparencies(transparencies); diff --git a/src/Mod/Part/parttests/ColorPerFaceTest.py b/src/Mod/Part/parttests/ColorPerFaceTest.py index ec50bf9c70..3086efa738 100644 --- a/src/Mod/Part/parttests/ColorPerFaceTest.py +++ b/src/Mod/Part/parttests/ColorPerFaceTest.py @@ -24,12 +24,12 @@ class ColorPerFaceTest(unittest.TestCase): box = self.doc.addObject("Part::Box","Box") self.doc.recompute() - box.ViewObject.DiffuseColor = [(1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,1.,0.,0.), - (1.,1.,0.,0.)] + box.ViewObject.DiffuseColor = [(1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,1.,0.,1.), + (1.,1.,0.,1.)] box.Visibility = False self.doc.recompute() @@ -56,12 +56,12 @@ class ColorPerFaceTest(unittest.TestCase): box = self.doc.addObject("Part::Box","Box") self.doc.recompute() - box.ViewObject.DiffuseColor = [(1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,1.,0.,0.), - (1.,1.,0.,0.)] + box.ViewObject.DiffuseColor = [(1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,1.,0.,1.), + (1.,1.,0.,1.)] link = self.doc.addObject('App::Link','Link') link.setLink(box) @@ -93,12 +93,12 @@ class ColorPerFaceTest(unittest.TestCase): box = self.doc.addObject("Part::Box","Box") self.doc.recompute() - box.ViewObject.DiffuseColor = [(1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,0.,0.,0.), - (1.,1.,0.,0.), - (1.,1.,0.,0.)] + box.ViewObject.DiffuseColor = [(1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,0.,0.,1.), + (1.,1.,0.,1.), + (1.,1.,0.,1.)] box.ViewObject.Transparency = 35 self.assertEqual(box.ViewObject.Transparency, 35) @@ -129,8 +129,8 @@ class ColorPerFaceTest(unittest.TestCase): """ box = self.doc.addObject("Part::Box","Box") cyl = self.doc.addObject("Part::Cylinder","Cylinder") - box.ViewObject.ShapeColor = (1.,0.,0.,0.) - cyl.ViewObject.ShapeColor = (1.,0.,0.,0.) + box.ViewObject.ShapeColor = (1.,0.,0.,1.) + cyl.ViewObject.ShapeColor = (1.,0.,0.,1.) self.doc.recompute() bp = BOPFeatures.BOPFeatures(self.doc) @@ -161,13 +161,13 @@ class ColorPerFaceTest(unittest.TestCase): self.assertEqual(len(fuse.Shape.Faces), 11) self.assertEqual(len(fuse.ViewObject.DiffuseColor), 11) - self.assertEqual(fuse.ViewObject.DiffuseColor[0], (1.,0.,0.,0.)) + self.assertEqual(fuse.ViewObject.DiffuseColor[0], (1.,0.,0.,1.)) def testMultiFuseSaveRestore(self): box = self.doc.addObject("Part::Box","Box") cyl = self.doc.addObject("Part::Cylinder","Cylinder") - box.ViewObject.ShapeColor = (1.,0.,0.,0.) - cyl.ViewObject.ShapeColor = (1.,0.,0.,0.) + box.ViewObject.ShapeColor = (1.,0.,0.,1.) + cyl.ViewObject.ShapeColor = (1.,0.,0.,1.) self.doc.recompute() bp = BOPFeatures.BOPFeatures(self.doc) @@ -176,7 +176,7 @@ class ColorPerFaceTest(unittest.TestCase): fuse.Refine = False self.doc.recompute() - fuse.ViewObject.DiffuseColor = [(1.,0.,0.,0.)] * 11 + fuse.ViewObject.DiffuseColor = [(1.,0.,0.,1.)] * 11 self.doc.saveAs(self.fileName) App.closeDocument(self.doc.Name) @@ -186,7 +186,7 @@ class ColorPerFaceTest(unittest.TestCase): fuse = self.doc.ActiveObject self.assertEqual(len(fuse.Shape.Faces), 11) self.assertEqual(len(fuse.ViewObject.DiffuseColor), 11) - self.assertEqual(fuse.ViewObject.DiffuseColor[0], (1.,0.,0.,0.)) + self.assertEqual(fuse.ViewObject.DiffuseColor[0], (1.,0.,0.,1.)) sa = coin.SoSearchAction() sa.setType(coin.SoMaterialBinding.getClassTypeId())