[Bf-blender-cvs] [0417033bf3f] tmp-overlay-engine: Overlay Engine: Particles

Clément Foucault noreply at git.blender.org
Mon Nov 18 20:15:30 CET 2019


Commit: 0417033bf3fc8780b0b3ae56b4f34851ebbc2114
Author: Clément Foucault
Date:   Mon Nov 18 17:20:09 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB0417033bf3fc8780b0b3ae56b4f34851ebbc2114

Overlay Engine: Particles

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_engine.c
A	source/blender/draw/engines/overlay/overlay_particle.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
A	source/blender/draw/engines/overlay/shaders/edit_particle_point_vert.glsl
A	source/blender/draw/engines/overlay/shaders/edit_particle_strand_vert.glsl
A	source/blender/draw/engines/overlay/shaders/particle_frag.glsl
A	source/blender/draw/engines/overlay/shaders/particle_vert.glsl
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache_impl_particles.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index ea75c486a86..f8952d0c922 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -148,6 +148,7 @@ set(SRC
   engines/overlay/overlay_motion_path.c
   engines/overlay/overlay_outline.c
   engines/overlay/overlay_paint.c
+  engines/overlay/overlay_particle.c
   engines/overlay/overlay_shader.c
   engines/overlay/overlay_wireframe.c
 
@@ -404,6 +405,8 @@ data_to_c_simple(engines/overlay/shaders/edit_mesh_analysis_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_mesh_mix_occlude_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_mesh_skin_root_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_mesh_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_particle_strand_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_particle_point_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_groundline_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_point_vert.glsl SRC)
@@ -434,6 +437,8 @@ data_to_c_simple(engines/overlay/shaders/paint_vertcol_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/paint_weight_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/paint_weight_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/paint_wire_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/particle_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/particle_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/volume_velocity_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/wireframe_geom.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index abe0626eb5d..0af5d2c8d5d 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -54,29 +54,8 @@ static void OVERLAY_engine_init(void *vedata)
     case CTX_MODE_EDIT_MESH:
       OVERLAY_edit_mesh_init(vedata);
       break;
-    case CTX_MODE_EDIT_SURFACE:
-    case CTX_MODE_EDIT_CURVE:
-    case CTX_MODE_EDIT_TEXT:
-    case CTX_MODE_EDIT_ARMATURE:
-    case CTX_MODE_EDIT_METABALL:
-    case CTX_MODE_EDIT_LATTICE:
-    case CTX_MODE_PAINT_VERTEX:
-    case CTX_MODE_PAINT_TEXTURE:
-    case CTX_MODE_PAINT_WEIGHT:
-    case CTX_MODE_POSE:
-      /* Nothing to do. */
-      break;
-    case CTX_MODE_PARTICLE:
-      break;
-    case CTX_MODE_SCULPT:
-    case CTX_MODE_OBJECT:
-    case CTX_MODE_PAINT_GPENCIL:
-    case CTX_MODE_EDIT_GPENCIL:
-    case CTX_MODE_SCULPT_GPENCIL:
-    case CTX_MODE_WEIGHT_GPENCIL:
-      break;
     default:
-      BLI_assert(!"Draw mode invalid");
+      /* Nothing to do. */
       break;
   }
   OVERLAY_grid_init(vedata);
@@ -131,6 +110,7 @@ static void OVERLAY_cache_init(void *vedata)
       OVERLAY_edit_lattice_cache_init(vedata);
       break;
     case CTX_MODE_PARTICLE:
+      OVERLAY_edit_particle_cache_init(vedata);
       break;
     case CTX_MODE_POSE:
     case CTX_MODE_PAINT_WEIGHT:
@@ -157,6 +137,7 @@ static void OVERLAY_cache_init(void *vedata)
   OVERLAY_metaball_cache_init(vedata);
   OVERLAY_motion_path_cache_init(vedata);
   OVERLAY_outline_cache_init(vedata);
+  OVERLAY_particle_cache_init(vedata);
   OVERLAY_wireframe_cache_init(vedata);
 }
 
@@ -191,6 +172,7 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   const bool renderable = DRW_object_is_renderable(ob);
   const bool in_pose_mode = ob->type == OB_ARMATURE && DRW_pose_mode_armature(ob, draw_ctx->obact);
   const bool in_edit_mode = BKE_object_is_in_editmode(ob);
+  const bool in_part_edit_mode = ob->mode == OB_MODE_PARTICLE_EDIT;
   const bool in_paint_mode = (ob == draw_ctx->obact) &&
                              (draw_ctx->object_mode & OB_MODE_ALL_PAINT);
   const bool draw_surface = !((ob->dt < OB_WIRE) || (!renderable && (ob->dt != OB_WIRE)));
@@ -220,6 +202,7 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   if (draw_outlines) {
     OVERLAY_outline_cache_populate(vedata, ob, dupli, init);
   }
+
   if (in_edit_mode) {
     switch (ob->type) {
       case OB_MESH:
@@ -245,16 +228,10 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
         break;
     }
   }
-
-  if (in_pose_mode) {
+  else if (in_pose_mode) {
     OVERLAY_pose_armature_cache_populate(vedata, ob);
   }
-
-  if (draw_motion_paths) {
-    OVERLAY_motion_path_cache_populate(vedata, ob);
-  }
-
-  if (in_paint_mode) {
+  else if (in_paint_mode) {
     switch (draw_ctx->object_mode) {
       case OB_MODE_VERTEX_PAINT:
         OVERLAY_paint_vertex_cache_populate(vedata, ob);
@@ -269,10 +246,18 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
         break;
     }
   }
+  else if (in_part_edit_mode) {
+    OVERLAY_edit_particle_cache_populate(vedata, ob);
+  }
+
   // if (scuplt_mode) {
   //   OVERLAY_sculpt_cache_populate();
   // }
 
+  if (draw_motion_paths) {
+    OVERLAY_motion_path_cache_populate(vedata, ob);
+  }
+
   switch (ob->type) {
     case OB_ARMATURE:
       if ((!in_edit_mode && !in_pose_mode) || is_select) {
@@ -315,6 +300,10 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
     }
   }
 
+  if (!BLI_listbase_is_empty(&ob->particlesystem)) {
+    OVERLAY_particle_cache_populate(vedata, ob);
+  }
+
   /* Relationship, object center, bounbox ... */
   OVERLAY_extra_cache_populate(vedata, ob);
 
@@ -337,6 +326,7 @@ static void OVERLAY_draw_scene(void *vedata)
   OVERLAY_facing_draw(vedata);
   OVERLAY_wireframe_draw(vedata);
   OVERLAY_extra_draw(vedata);
+  OVERLAY_particle_draw(vedata);
   OVERLAY_metaball_draw(vedata);
   OVERLAY_armature_draw(vedata);
   OVERLAY_grid_draw(vedata);
@@ -363,6 +353,9 @@ static void OVERLAY_draw_scene(void *vedata)
     case CTX_MODE_PAINT_TEXTURE:
       OVERLAY_paint_draw(vedata);
       break;
+    case CTX_MODE_PARTICLE:
+      OVERLAY_edit_particle_draw(vedata);
+      break;
     default:
       break;
   }
diff --git a/source/blender/draw/engines/overlay/overlay_particle.c b/source/blender/draw/engines/overlay/overlay_particle.c
new file mode 100644
index 00000000000..bcd8d2bbce4
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_particle.c
@@ -0,0 +1,217 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2019, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "DEG_depsgraph_query.h"
+
+#include "DNA_particle_types.h"
+
+#include "BKE_pointcache.h"
+
+#include "ED_particle.h"
+
+#include "overlay_private.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Edit Particles
+ * \{ */
+
+void OVERLAY_edit_particle_cache_init(OVERLAY_Data *vedata)
+{
+  OVERLAY_PassList *psl = vedata->psl;
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  ParticleEditSettings *pset = PE_settings(draw_ctx->scene);
+  GPUShader *sh;
+  DRWShadingGroup *grp;
+
+  pd->edit_particle.use_weight = (pset->brushtype == PE_BRUSH_WEIGHT);
+  pd->edit_particle.select_mode = pset->selectmode;
+
+  DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
+  DRW_PASS_CREATE(psl->edit_particle_ps, state | pd->clipping_state);
+
+  sh = OVERLAY_shader_edit_particle_strand();
+  pd->edit_particle_strand_grp = grp = DRW_shgroup_create(sh, psl->edit_particle_ps);
+  DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+  DRW_shgroup_uniform_bool_copy(grp, "useWeight", pd->edit_particle.use_weight);
+  DRW_shgroup_uniform_texture(grp, "weightTex", G_draw.weight_ramp);
+
+  sh = OVERLAY_shader_edit_particle_point();
+  pd->edit_particle_point_grp = grp = DRW_shgroup_create(sh, psl->edit_particle_ps);
+  DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+}
+
+void OVERLAY_edit_particle_cache_populate(OVERLAY_Data *vedata, Object *ob)
+{
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  Scene *scene_orig = (Scene *)DEG_get_original_id(&draw_ctx->scene->id);
+
+  /* Usually the edit structure is created by Particle Edit Mode Toggle
+   * operator, but sometimes it's invoked after tagging hair as outdated
+   * (for example, when toggling edit mode). That makes it impossible to
+   * create edit structure for until after next dependency graph evaluation.
+   *
+   * Ideally, the edit structure will be created here already via some
+   * dependency graph callback or so, but currently trying to make it nicer
+   * only causes bad level calls and breaks design from the past.
+   */
+  Object *ob_orig = DEG_get_original_object(ob);
+  PTCacheEdit *edit = PE_create_current(draw_ctx->depsgraph, scene_orig, ob_orig);
+  if (edit == NULL) {
+    /* Happens when trying to edit particles in EMITTER mode without
+     * having them cached.
+     */
+    return;
+  }
+  /* NOTE: We need to pass evaluated particle system, which we need
+   * to find first.
+   */
+  ParticleSystem *psys = ob->particlesystem.first;
+  LISTBASE_FOREACH (ParticleSystem *, psys_orig, &ob_orig->particlesystem) {
+    if (PE_get_current_from_psys(psys_orig) == edit) {
+      break;
+    }
+    psys = psys->next;
+  }
+  if (psys == NULL) {
+    printf("Error getting evaluated particle system for edit

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list