changeset 33185:4eba030c0edc

Keep per-vertex "cdata" consistent with "facevertexcdata" in patch object (bug #65431). * libinterp/corefcn/graphics.cc (patch::properties::update_fvc): Correctly update "facevertexcdata" for per-vertex "cdata".
author Markus Mützel <markus.muetzel@gmx.de>
date Sat, 09 Mar 2024 19:35:48 +0100
parents f5487b66e56e
children fd87bfce3438
files libinterp/corefcn/graphics.cc
diffstat 1 files changed, 32 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/graphics.cc	Sat Mar 09 19:33:09 2024 +0100
+++ b/libinterp/corefcn/graphics.cc	Sat Mar 09 19:35:48 2024 +0100
@@ -9664,6 +9664,14 @@
       return;
     }
 
+  bool pervertex = false;
+  if (ncv == nv)
+    pervertex = true;
+
+  bool isRGB = false;
+  if (cd.ndims () == 3)
+    isRGB = true;
+
   // Faces and Vertices
   dim_vector dv;
   bool is3D = false;
@@ -9688,6 +9696,20 @@
   Matrix vert (dv);
   Matrix idx (nf, nv);
 
+  Matrix fvc;
+  if (pervertex)
+    {
+      // "facevertexcdata" holds color data per vertex
+      fvc.resize (nv * nf, (isRGB ? 3 : 1));
+    }
+  else if (! cd.isempty ())
+    {
+      // "facevertexcdata" holds color data per face
+      dv(0) = ncf;
+      dv(1) = (isRGB ? 3 : 1);
+      fvc = cd.reshape (dv);
+    }
+
   // create list of vertices from x/y/zdata
   // FIXME: It might be possible to share vertices between adjacent faces.
   octave_idx_type kk = 0;
@@ -9700,23 +9722,22 @@
           if (is3D)
             vert(kk, 2) = zd(ii, jj);
 
+          if (pervertex)
+            {
+              fvc(kk, 0) = cd(ii, jj, 0);
+              if (isRGB)
+                {
+                  fvc(kk, 1) = cd(ii, jj, 1);
+                  fvc(kk, 2) = cd(ii, jj, 2);
+                }
+            }
+
           idx(jj, ii) = static_cast<double> (kk+1);
 
           kk++;
         }
     }
 
-  // facevertexcdata
-  Matrix fvc;
-  if (cd.ndims () == 3)
-    {
-      dv(0) = cd.rows () * cd.columns ();
-      dv(1) = cd.dims ()(2);
-      fvc = cd.reshape (dv);
-    }
-  else
-    fvc = cd.as_column ();
-
   // FIXME: shouldn't we update facevertexalphadata here ?
 
   octave::unwind_protect_var<bool> restore_var (updating_patch_data, true);