[Bf-blender-cvs] [b2034c6ba24] blender-v2.82-release: Fix T62730 Overlay: Selected edit hair points highlight is incorrect

Clément Foucault noreply at git.blender.org
Tue Jan 28 18:29:56 CET 2020


Commit: b2034c6ba245e131e6ecabe33ca9afa1e6394247
Author: Clément Foucault
Date:   Tue Jan 28 18:28:10 2020 +0100
Branches: blender-v2.82-release
https://developer.blender.org/rBb2034c6ba245e131e6ecabe33ca9afa1e6394247

Fix T62730 Overlay: Selected edit hair points highlight is incorrect

This was due to the fact the drawing code was expecting the editpoints
to be equaly spaced. Reuse the code in particle.c to output the select
mask in red color channel of the particle (which is unused in new code).

===================================================================

M	source/blender/blenkernel/intern/particle.c
M	source/blender/draw/intern/draw_cache_impl_particles.c

===================================================================

diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 244ffb674a4..6b87cf2df81 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -3246,22 +3246,24 @@ static void psys_cache_edit_paths_iter(void *__restrict iter_data_v,
       }
     }
     else {
+      /* HACK(fclem): Instead of setting the color we pass the select state in the red channel.
+       * This is then picked up in DRW and the gpu shader will do the color interpolation. */
       if ((ekey + (pind.ekey[0] - point->keys))->flag & PEK_SELECT) {
         if ((ekey + (pind.ekey[1] - point->keys))->flag & PEK_SELECT) {
-          copy_v3_v3(ca->col, iter_data->sel_col);
+          ca->col[0] = 1.0f;
         }
         else {
           keytime = (t - (*pind.ekey[0]->time)) / ((*pind.ekey[1]->time) - (*pind.ekey[0]->time));
-          interp_v3_v3v3(ca->col, iter_data->sel_col, iter_data->nosel_col, keytime);
+          ca->col[0] = 1.0f - keytime;
         }
       }
       else {
         if ((ekey + (pind.ekey[1] - point->keys))->flag & PEK_SELECT) {
           keytime = (t - (*pind.ekey[0]->time)) / ((*pind.ekey[1]->time) - (*pind.ekey[0]->time));
-          interp_v3_v3v3(ca->col, iter_data->nosel_col, iter_data->sel_col, keytime);
+          ca->col[0] = keytime;
         }
         else {
-          copy_v3_v3(ca->col, iter_data->nosel_col);
+          ca->col[0] = 0.0f;
         }
       }
     }
diff --git a/source/blender/draw/intern/draw_cache_impl_particles.c b/source/blender/draw/intern/draw_cache_impl_particles.c
index 7de6ee2b3b1..f699388c38c 100644
--- a/source/blender/draw/intern/draw_cache_impl_particles.c
+++ b/source/blender/draw/intern/draw_cache_impl_particles.c
@@ -637,23 +637,6 @@ static void particle_batch_cache_fill_segments_proc_pos(ParticleCacheKey **path_
   }
 }
 
-static float particle_key_select_ratio(const PTCacheEdit *edit, int strand, float t)
-{
-  const PTCacheEditPoint *point = &edit->points[strand];
-  float edit_key_seg_t = 1.0f / (point->totkey - 1);
-  if (t == 1.0) {
-    return (point->keys[point->totkey - 1].flag & PEK_SELECT) ? 1.0f : 0.0;
-  }
-  else {
-    float interp = t / edit_key_seg_t;
-    int index = (int)interp;
-    interp -= floorf(interp); /* Time between 2 edit key */
-    float s1 = (point->keys[index].flag & PEK_SELECT) ? 1.0f : 0.0;
-    float s2 = (point->keys[index + 1].flag & PEK_SELECT) ? 1.0f : 0.0;
-    return s1 + interp * (s2 - s1);
-  }
-}
-
 static float particle_key_weight(const ParticleData *particle, int strand, float t)
 {
   const ParticleData *part = particle + strand;
@@ -673,8 +656,8 @@ static float particle_key_weight(const ParticleData *particle, int strand, float
 }
 
 static int particle_batch_cache_fill_segments_edit(
-    const PTCacheEdit *edit,      /* NULL for weight data */
-    const ParticleData *particle, /* NULL for select data */
+    const PTCacheEdit *UNUSED(edit), /* NULL for weight data */
+    const ParticleData *particle,    /* NULL for select data */
     ParticleCacheKey **path_cache,
     const int start_index,
     const int num_path_keys,
@@ -697,8 +680,8 @@ static int particle_batch_cache_fill_segments_edit(
         seg_data->color = (weight < 1.0f) ? weight : 1.0f;
       }
       else {
-        float selected = particle_key_select_ratio(edit, i, strand_t);
-        seg_data->color = selected;
+        /* Computed in psys_cache_edit_paths_iter(). */
+        seg_data->color = path[j].col[0];
       }
       GPU_indexbuf_add_generic_vert(elb, curr_point);
       curr_point++;



More information about the Bf-blender-cvs mailing list