[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