[Bf-blender-cvs] [71c12669217] tmp-workbench-rewrite2: improve draw mode selection
Miguel Pozo
noreply at git.blender.org
Thu Oct 13 13:06:49 CEST 2022
Commit: 71c12669217090fff0ebf636c2359c3c005422c7
Author: Miguel Pozo
Date: Wed Oct 12 00:40:45 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB71c12669217090fff0ebf636c2359c3c005422c7
improve draw mode selection
===================================================================
M source/blender/draw/engines/workbench/workbench_engine.cc
M source/blender/draw/engines/workbench/workbench_enums.hh
M source/blender/draw/engines/workbench/workbench_mesh_passes.cc
M source/blender/draw/engines/workbench/workbench_private.hh
===================================================================
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index d1fe5a07b78..53fd5ccef43 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -1,7 +1,15 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
+#include "BKE_editmesh.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+#include "BKE_paint.h"
+#include "BKE_particle.h"
+#include "BKE_pbvh.h"
#include "BKE_studiolight.h"
#include "DEG_depsgraph_query.h"
+#include "DNA_fluid_types.h"
+#include "ED_paint.h"
#include "ED_view3d.h"
#include "GPU_capabilities.h"
#include "IMB_imbuf_types.h"
@@ -24,9 +32,11 @@ class Instance {
AntiAliasingPass anti_aliasing_ps;
+#if 0
bool use_per_material_batches = false;
eColorType color_type = eColorType::MATERIAL;
eMaterialSubType material_subtype = eMaterialSubType::MATERIAL;
+#endif
eShadingType shading_type = eShadingType::STUDIO;
/** Used when material_subtype == eMaterialSubType::SINGLE */
@@ -43,13 +53,15 @@ class Instance {
View3DShading shading;
StringRefNull current_matcap;
+ Scene *scene;
+
void init(const int2 &output_res,
const Depsgraph *depsgraph,
const Object * /*camera*/,
const View3D *v3d,
const RegionView3D *rv3d)
{
- Scene *scene = DEG_get_evaluated_scene(depsgraph);
+ scene = DEG_get_evaluated_scene(depsgraph);
const DRWContextState *context = DRW_context_state_get();
/* TODO(pragma37):
@@ -106,11 +118,13 @@ class Instance {
material_override = Material(shading.single_color);
+#if 0
use_per_material_batches = ELEM(
shading.color_type, V3D_SHADING_TEXTURE_COLOR, V3D_SHADING_MATERIAL_COLOR);
color_type = color_type_from_v3d_shading(shading.color_type);
material_subtype = material_subtype_from_v3d_shading(shading.color_type);
+#endif
shading_type = shading_type_from_v3d_lighting(shading.light);
UniformBuffer<WorldData> &world_buf = resources.world_buf;
@@ -217,10 +231,10 @@ class Instance {
void begin_sync()
{
resources.world_buf.push_update();
- opaque_ps.sync(cull_state, clip_state, shading_type, color_type, resources);
- // opaque_in_front_ps.sync(cull_state, clip_state, shading_type, color_type, resources);
- // transparent_ps.sync(cull_state, clip_state, shading_type, color_type, resources);
- // transparent_in_front_ps.sync(cull_state, clip_state, shading_type, color_type, resources);
+ opaque_ps.sync(cull_state, clip_state, shading_type, resources);
+ // opaque_in_front_ps.sync(cull_state, clip_state, shading_type, resources);
+ // transparent_ps.sync(cull_state, clip_state, shading_type, resources);
+ // transparent_in_front_ps.sync(cull_state, clip_state, shading_type, resources);
anti_aliasing_ps.sync(resources);
}
@@ -229,16 +243,244 @@ class Instance {
resources.material_buf.push_update();
}
+ const CustomData *get_loop_custom_data(const Mesh *mesh)
+ {
+ if (mesh->runtime.wrapper_type == ME_WRAPPER_TYPE_BMESH) {
+ BLI_assert(mesh->edit_mesh != nullptr);
+ BLI_assert(mesh->edit_mesh->bm != nullptr);
+ return &mesh->edit_mesh->bm->ldata;
+ }
+ return &mesh->ldata;
+ }
+
+ const CustomData *get_vert_custom_data(const Mesh *mesh)
+ {
+ if (mesh->runtime.wrapper_type == ME_WRAPPER_TYPE_BMESH) {
+ BLI_assert(mesh->edit_mesh != nullptr);
+ BLI_assert(mesh->edit_mesh->bm != nullptr);
+ return &mesh->edit_mesh->bm->vdata;
+ }
+ return &mesh->vdata;
+ }
+
+ struct DrawModeInfo {
+ eV3DShadingColorType color_type;
+ bool sculpt_pbvh;
+ bool texture_paint_mode;
+ bool draw_shadow;
+
+ eColorType material_type;
+ eMaterialSubType material_subtype;
+ bool use_per_material_batches;
+ void compute_info()
+ {
+ material_type = color_type_from_v3d_shading(color_type);
+ material_subtype = material_subtype_from_v3d_shading(color_type);
+ use_per_material_batches = ELEM(
+ color_type, V3D_SHADING_TEXTURE_COLOR, V3D_SHADING_MATERIAL_COLOR);
+ }
+ };
+
+ DrawModeInfo get_draw_mode_info(Object *ob)
+ {
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const Mesh *me = (ob->type == OB_MESH) ? static_cast<Mesh *>(ob->data) : nullptr;
+ const bool is_active = (ob == draw_ctx->obact);
+ /* TODO(pragma37) Is the double check needed?
+ * If it is, wouldn't be needed for sculpt_pbvh too?
+ */
+ const bool is_render = DRW_state_is_image_render() && (draw_ctx->v3d == nullptr);
+
+ DrawModeInfo dmi = {};
+ dmi.color_type = (eV3DShadingColorType)shading.color_type;
+ if (!(is_active && DRW_object_use_hide_faces(ob))) {
+ dmi.draw_shadow = (ob->dtx & OB_DRAW_NO_SHADOW_CAST) == 0 &&
+ shading.flag & V3D_SHADING_SHADOW;
+ }
+ if (me == nullptr) {
+ if (dmi.color_type == V3D_SHADING_TEXTURE_COLOR) {
+ dmi.color_type = V3D_SHADING_MATERIAL_COLOR;
+ }
+ else if (dmi.color_type == V3D_SHADING_VERTEX_COLOR) {
+ dmi.color_type = V3D_SHADING_OBJECT_COLOR;
+ }
+ /* Early return */
+ dmi.compute_info();
+ return dmi;
+ }
+
+ dmi.sculpt_pbvh = BKE_sculptsession_use_pbvh_draw(ob, draw_ctx->v3d) &&
+ !DRW_state_is_image_render();
+
+ /* Needed for mesh cache validation, to prevent two copies of
+ * of vertex color arrays from being sent to the GPU (e.g.
+ * when switching from eevee to workbench).
+ */
+ if (ob->sculpt && ob->sculpt->pbvh) {
+ BKE_pbvh_is_drawing_set(ob->sculpt->pbvh, dmi.sculpt_pbvh);
+ }
+
+ if (dmi.sculpt_pbvh) {
+ /* Shadows are unsupported in sculpt mode. We could revert to the slow
+ * method in this case but I'm not sure if it's a good idea given that
+ * sculpted meshes are heavy to begin with. */
+ dmi.draw_shadow = false;
+
+ if (dmi.color_type == V3D_SHADING_TEXTURE_COLOR &&
+ BKE_pbvh_type(ob->sculpt->pbvh) != PBVH_FACES) {
+ /* Force use of material color for sculpt. */
+ dmi.color_type = V3D_SHADING_MATERIAL_COLOR;
+ }
+
+ /* Bad call C is required to access the tool system that is context aware. Cast to non-const
+ * due to current API. */
+ bContext *C = (bContext *)DRW_context_state_get()->evil_C;
+ if (C != NULL) {
+ dmi.color_type = ED_paint_shading_color_override(
+ C, &scene->toolsettings->paint_mode, ob, dmi.color_type);
+ }
+ }
+ else {
+ const CustomData *cd_vdata = get_vert_custom_data(me);
+ const CustomData *cd_ldata = get_loop_custom_data(me);
+
+ bool has_color = (CustomData_has_layer(cd_vdata, CD_PROP_COLOR) ||
+ CustomData_has_layer(cd_vdata, CD_PROP_BYTE_COLOR) ||
+ CustomData_has_layer(cd_ldata, CD_PROP_COLOR) ||
+ CustomData_has_layer(cd_ldata, CD_PROP_BYTE_COLOR));
+
+ if (dmi.color_type == V3D_SHADING_TEXTURE_COLOR) {
+ if (ob->dt < OB_TEXTURE || !CustomData_has_layer(cd_ldata, CD_MLOOPUV)) {
+ dmi.color_type = V3D_SHADING_MATERIAL_COLOR;
+ }
+ }
+ else if (dmi.color_type == V3D_SHADING_VERTEX_COLOR && !has_color) {
+ dmi.color_type = V3D_SHADING_OBJECT_COLOR;
+ }
+
+ if (!is_render) {
+ /* Force texture or vertex mode if object is in paint mode. */
+ const bool is_texpaint_mode = is_active && (ob_mode == CTX_MODE_PAINT_TEXTURE);
+ const bool is_vertpaint_mode = is_active && (ob_mode == CTX_MODE_PAINT_VERTEX);
+ if (is_texpaint_mode && CustomData_has_layer(cd_ldata, CD_MLOOPUV)) {
+ dmi.color_type = V3D_SHADING_TEXTURE_COLOR;
+ dmi.texture_paint_mode = true;
+ }
+ else if (is_vertpaint_mode && has_color) {
+ dmi.color_type = V3D_SHADING_VERTEX_COLOR;
+ }
+ }
+ }
+
+ dmi.compute_info();
+ return dmi;
+ }
+
void object_sync(Manager &manager, ObjectRef &ob_ref)
{
+ Object *ob = ob_ref.object;
+ if (!DRW_object_is_renderable(ob)) {
+ return;
+ }
+
+ const DrawModeInfo dmi = get_draw_mode_info(ob);
+
+#if 0
+
+ if (ob->type == OB_MESH && ob->modifiers.first != nullptr) {
+
+ LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
+ if (md->type != eModifierType_ParticleSystem) {
+ continue;
+ }
+ ParticleSystem *psys = ((ParticleSystemModifierData *)md)->psys;
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
+ continue;
+ }
+ ParticleSettings *part = psys->part;
+ const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
+
+ if (draw_as == PART_DRAW_PATH) {
+ /* TODO(pragma37):
+ workbench_cache_hair_populate(
+ wpd, ob, psys, md, dmi.color_type, dmi.texture_paint_mode, part->omat);
+ */
+ }
+ }
+ }
+
+ if (!(ob->base_flag & BASE_FROM_DUPLI)) {
+ ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Fluid);
+ if (md && BKE_modifier_is_enabled(scene, md, eModifierMode_Realtime)) {
+ FluidModifierData *fmd = (FluidModifierData *)md;
+ if (fmd->domain) {
+ /* TODO(pragma37):
+ workbench_volume_cache_populate(vedata, wpd->scene, ob, md, V3D_SHADING_SINGLE_COLOR);
+ */
+ if (fmd->domain->type == FLUID_DOMAIN_TYPE_GAS) {
+ return; /* Do not draw solid in this case. */
+ }
+ }
+ }
+ }
+
+ if (!(DRW_object_visibility_in_active_context(ob) & OB_VISIBLE_SELF)) {
+ return;
+ }
+
+ if ((ob->dt < OB_SOLID) && !DRW_state_is_scene_render()) {
+ return;
+ }
+
+ if (ELEM(ob->type, OB_MESH, OB_POINTCLOUD)) {
+ if (dmi.sculpt_pbvh) {
+ /* TODO(pragma37):
+ workbench_cache_sculpt_populate(wpd, ob, dmi.color_type);
+ */
+ }
+ else if (dmi.texture_paint_mode) {
+ /* TODO(pragma37):
+ workbench_cache_texpaint_populate(wpd, ob);
+ */
+ }
+ else {
+ /* TODO
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list