[Bf-blender-cvs] [4e895f0a3a9] tmp-workbench-rewrite2: vertex and texture paint modes
Miguel Pozo
noreply at git.blender.org
Thu Oct 13 17:38:57 CEST 2022
Commit: 4e895f0a3a9a8bc6a7fc87f76711e4befc880b5b
Author: Miguel Pozo
Date: Thu Oct 13 17:38:35 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB4e895f0a3a9a8bc6a7fc87f76711e4befc880b5b
vertex and texture paint modes
===================================================================
M source/blender/draw/engines/workbench/workbench_engine.cc
M source/blender/draw/engines/workbench/workbench_materials.cc
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 53fd5ccef43..a52fafe1714 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -267,6 +267,8 @@ class Instance {
eV3DShadingColorType color_type;
bool sculpt_pbvh;
bool texture_paint_mode;
+ ::Image *image_paint_override;
+ eGPUSamplerState override_sampler_state;
bool draw_shadow;
eColorType material_type;
@@ -276,8 +278,10 @@ class Instance {
{
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);
+ use_per_material_batches = image_paint_override == nullptr &&
+ ELEM(color_type,
+ V3D_SHADING_TEXTURE_COLOR,
+ V3D_SHADING_MATERIAL_COLOR);
}
};
@@ -365,6 +369,14 @@ class Instance {
if (is_texpaint_mode && CustomData_has_layer(cd_ldata, CD_MLOOPUV)) {
dmi.color_type = V3D_SHADING_TEXTURE_COLOR;
dmi.texture_paint_mode = true;
+ const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint;
+ if (imapaint->mode == IMAGEPAINT_MODE_IMAGE) {
+ dmi.image_paint_override = imapaint->canvas;
+ dmi.override_sampler_state = GPU_SAMPLER_REPEAT;
+ SET_FLAG_FROM_TEST(dmi.override_sampler_state,
+ imapaint->interp == IMAGEPAINT_INTERP_LINEAR,
+ GPU_SAMPLER_FILTER);
+ }
}
else if (is_vertpaint_mode && has_color) {
dmi.color_type = V3D_SHADING_VERTEX_COLOR;
@@ -385,8 +397,6 @@ class Instance {
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) {
@@ -433,27 +443,7 @@ class Instance {
}
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(pragma37):
- workbench_cache_common_populate(wpd, ob, dmi.color_type, &has_transp_mat);
- */
- }
-
- if (dmi.draw_shadow) {
- /* TODO(pragma37):
- workbench_shadow_cache_populate(vedata, ob, has_transp_mat);
- */
- }
+ mesh_sync(manager, ob_ref, dmi);
}
else if (ob->type == OB_CURVES) {
/* TODO(pragma37):
@@ -469,92 +459,111 @@ class Instance {
*/
}
}
+ }
-#endif
-
- if (ob_ref.object->type != OB_MESH) {
- // TODO(pragma37)
- return;
+ void mesh_sync(Manager &manager, ObjectRef &ob_ref, const DrawModeInfo dmi)
+ {
+ if (dmi.sculpt_pbvh) {
+ /* TODO(pragma37):
+ workbench_cache_sculpt_populate(wpd, ob, dmi.color_type);
+ */
}
-
- if (dmi.use_per_material_batches) {
- const int material_count = DRW_cache_object_material_count_get(ob_ref.object);
- Span<GPUBatch *> batches = geometry_get(
- ob_ref, material_count, dmi.material_type, dmi.material_subtype);
- /* TODO(pragma37): Could this ever be false??? */
- if (batches.size() == material_count) {
- for (auto i : IndexRange(material_count)) {
- /* TODO(fclem): This create a cull-able instance for each sub-object. This is done for
- * simplicity to reduce complexity. But this increase the overhead per object. Instead,
- * we should use an indirection buffer to the material buffer. */
- ::Material *mat = BKE_object_material_get_eval(ob_ref.object, i + 1);
- if (mat == nullptr) {
- mat = BKE_material_default_empty();
+ else {
+ /* workbench_cache_common_populate */
+ if (dmi.use_per_material_batches) {
+ const int material_count = DRW_cache_object_material_count_get(ob_ref.object);
+ struct GPUBatch **batches;
+ if (dmi.material_type == eColorType::TEXTURE) {
+ batches = DRW_cache_mesh_surface_texpaint_get(ob_ref.object);
+ }
+ else {
+ static Vector<GPUMaterial *> dummy_gpu_materials(1, nullptr, {});
+ if (material_count > dummy_gpu_materials.size()) {
+ dummy_gpu_materials.resize(material_count, nullptr);
+ }
+ batches = DRW_cache_object_surface_material_get(
+ ob_ref.object, dummy_gpu_materials.begin(), material_count);
+ }
+ if (batches) {
+ for (auto i : IndexRange(material_count)) {
+ if (batches[i] == nullptr) {
+ continue;
+ }
+ /* TODO(fclem): This create a cull-able instance for each sub-object. This is done
+ * for simplicity to reduce complexity. But this increase the overhead per object.
+ * Instead, we should use an indirection buffer to the material buffer. */
+ ::Material *mat = BKE_object_material_get_eval(ob_ref.object, i + 1);
+ if (mat == nullptr) {
+ mat = BKE_material_default_empty();
+ }
+ ::Image *image = nullptr;
+ ImageUser *iuser = nullptr;
+ eGPUSamplerState sampler_state = eGPUSamplerState::GPU_SAMPLER_DEFAULT;
+ if (dmi.material_type == eColorType::TEXTURE) {
+ get_material_image(ob_ref.object, i + 1, image, iuser, sampler_state);
+ }
+ ResourceHandle handle = manager.resource_handle(ob_ref);
+ resources.material_buf.get_or_resize(handle.resource_index()) = Material(*mat);
+ pipeline_get(ob_ref, image, sampler_state, iuser).draw(batches[i], handle);
}
- ResourceHandle handle = manager.resource_handle(ob_ref);
- resources.material_buf.get_or_resize(handle.resource_index()) = Material(*mat);
- pipeline_get(ob_ref, dmi.material_type, mat, i + 1).draw(batches[i], handle);
}
}
- }
- else {
- ResourceHandle handle = manager.resource_handle(ob_ref);
+ else {
+ struct GPUBatch *batch;
+ if (dmi.material_type == eColorType::TEXTURE) {
+ batch = DRW_cache_mesh_surface_texpaint_single_get(ob_ref.object);
+ }
+ else if (dmi.material_subtype == eMaterialSubType::ATTRIBUTE) {
+ if (ob_ref.object->mode & OB_MODE_VERTEX_PAINT) {
+ batch = DRW_cache_mesh_surface_vertpaint_get(ob_ref.object);
+ }
+ else {
+ batch = DRW_cache_mesh_surface_sculptcolors_get(ob_ref.object);
+ }
+ }
+ else {
+ batch = DRW_cache_object_surface_get(ob_ref.object);
+ }
- Material &mat = resources.material_buf.get_or_resize(handle.resource_index());
+ if (batch) {
+ ResourceHandle handle = manager.resource_handle(ob_ref);
+ Material &mat = resources.material_buf.get_or_resize(handle.resource_index());
- if (dmi.material_subtype == eMaterialSubType::OBJECT) {
- mat = Material(*ob_ref.object);
- }
- else if (dmi.material_subtype == eMaterialSubType::RANDOM) {
- mat = Material(*ob_ref.object, true);
- }
- else if (dmi.material_subtype == eMaterialSubType::SINGLE) {
- mat = material_override;
- }
- else if (dmi.material_subtype == eMaterialSubType::ATTRIBUTE) {
- mat = material_attribute_color;
- }
+ if (dmi.material_subtype == eMaterialSubType::OBJECT) {
+ mat = Material(*ob_ref.object);
+ }
+ else if (dmi.material_subtype == eMaterialSubType::RANDOM) {
+ mat = Material(*ob_ref.object, true);
+ }
+ else if (dmi.material_subtype == eMaterialSubType::SINGLE) {
+ mat = material_override;
+ }
+ else if (dmi.material_subtype == eMaterialSubType::ATTRIBUTE) {
+ mat = material_attribute_color;
+ }
+ else {
+ mat = Material(float3(1.0f));
+ }
- GPUBatch *batch = geometry_get(ob_ref, dmi.material_type, dmi.material_subtype);
- if (batch) {
- pipeline_get(ob_ref, dmi.material_type).draw(batch, handle);
+ pipeline_get(ob_ref, dmi.image_paint_override, dmi.override_sampler_state)
+ .draw(batch, handle);
+ }
}
}
- }
-
- PassMain::Sub &pipeline_get(ObjectRef &ob_ref,
- eColorType color_type,
- ::Material *material = nullptr,
- int material_index = 0)
- {
- return opaque_ps.gbuffer_ps_.sub_pass_get(
- geometry_type_from_object(ob_ref.object), color_type, ob_ref, material, material_index);
- }
- Span<GPUBatch *> geometry_get(ObjectRef &ob_ref,
- int material_count,
- eColorType color_type,
- eMaterialSubType material_subtype)
- {
- /* This is never used, but it's required by DRW_cache_object_surface_material_get */
- static Vector<GPUMaterial *> dummy_gpu_materials(1, nullptr, {});
- if (material_count > dummy_gpu_materials.size()) {
- dummy_gpu_materials.resize(material_count, nullptr);
- }
- return {DRW_cache_object_surface_material_get(
- ob_ref.object, dummy_gpu_materials.begin(), material_count),
- material_count};
+ if (dmi.draw_shadow) {
+ /* TODO(pragma37):
+ workbench_shadow_cache_populate(vedata, ob, has_transp_mat);
+ */
+ }
}
- GPUBatch *geometry_get(ObjectRef &ob_ref,
- eColorType color_type,
- eMaterialSubType material_subtype)
+ PassMain::Sub &pipeline_get(ObjectRef &ob_ref,
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list