[Bf-blender-cvs] [2e6c5b3075f] tmp-workbench-rewrite2: cleanup
Miguel Pozo
noreply at git.blender.org
Thu Oct 13 20:44:48 CEST 2022
Commit: 2e6c5b3075fe092f1d2511e3dff279a2f2c8cc34
Author: Miguel Pozo
Date: Thu Oct 13 20:44:24 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB2e6c5b3075fe092f1d2511e3dff279a2f2c8cc34
cleanup
===================================================================
M source/blender/draw/engines/workbench/workbench_engine.cc
===================================================================
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index a52fafe1714..04bdee26c4d 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -20,6 +20,18 @@ namespace blender::workbench {
using namespace draw;
+// Utils
+
+bool get_matcap_tx(Texture &matcap_tx, const StudioLight &studio_light);
+float4x4 get_world_shading_rotation_matrix(float studiolight_rot_z);
+LightData get_light_data_from_studio_solidlight(const SolidLight *sl,
+ float4x4 world_shading_rotation);
+
+const CustomData *get_loop_custom_data(const Mesh *mesh);
+const CustomData *get_vert_custom_data(const Mesh *mesh);
+
+GPUMaterial **get_dummy_gpu_materials(int material_count);
+
class Instance {
public:
SceneResources resources;
@@ -32,11 +44,6 @@ 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 */
@@ -61,8 +68,8 @@ class Instance {
const View3D *v3d,
const RegionView3D *rv3d)
{
- scene = DEG_get_evaluated_scene(depsgraph);
const DRWContextState *context = DRW_context_state_get();
+ scene = DEG_get_evaluated_scene(depsgraph);
/* TODO(pragma37):
* Check why Workbench Next exposes OB_MATERIAL, and Workbench exposes OB_RENDER */
@@ -71,14 +78,12 @@ class Instance {
shading = is_render_mode ? scene->display.shading : v3d->shading;
ob_mode = CTX_data_mode_enum_ex(context->object_edit, context->obact, context->object_mode);
- /* TODO(pragma37): Shouldn't clip_state be enough ? */
- clip_mode = context->sh_cfg;
+
+ bool reset_taa = false;
cull_state = shading.flag & V3D_SHADING_BACKFACE_CULLING ? DRW_STATE_CULL_BACK :
DRW_STATE_NO_DRAW;
- bool reset_taa = false;
-
/* FIXME: This reproduce old behavior when workbench was separated in 2 engines.
* But this is a workaround for a missing update tagging. */
DRWState new_clip_state = RV3D_CLIPPING_ENABLED(v3d, rv3d) ? DRW_STATE_CLIP_PLANES :
@@ -87,23 +92,15 @@ class Instance {
reset_taa = true;
}
clip_state = new_clip_state;
+ /* TODO(pragma37): Shouldn't clip_state be enough ? */
+ clip_mode = context->sh_cfg;
if (rv3d && rv3d->rflag & RV3D_GPULIGHT_UPDATE) {
reset_taa = true;
}
- if (SHADING_XRAY_FLAG_ENABLED(shading)) {
- /* Disable shading options that aren't supported in transparency mode. */
- shading.flag &= ~(V3D_SHADING_SHADOW | V3D_SHADING_CAVITY | V3D_SHADING_DEPTH_OF_FIELD);
- }
- if (SHADING_XRAY_ENABLED(shading) != SHADING_XRAY_ENABLED(previous_shading) ||
- shading.flag != previous_shading.flag) {
- reset_taa = true;
- }
-
if (!is_render_mode) {
if (shading.type < OB_SOLID) {
- /* TODO(pragma37): Shouldn't we just skip any rendering at all ??? */
shading.light = V3D_LIGHTING_FLAT;
shading.color_type = V3D_SHADING_OBJECT_COLOR;
shading.xray_alpha = 0.0f;
@@ -116,31 +113,20 @@ 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);
+ if (SHADING_XRAY_FLAG_ENABLED(shading)) {
+ /* Disable shading options that aren't supported in transparency mode. */
+ shading.flag &= ~(V3D_SHADING_SHADOW | V3D_SHADING_CAVITY | V3D_SHADING_DEPTH_OF_FIELD);
+ }
+ if (SHADING_XRAY_ENABLED(shading) != SHADING_XRAY_ENABLED(previous_shading) ||
+ shading.flag != previous_shading.flag) {
+ reset_taa = true;
+ }
- 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);
+ material_override = Material(shading.single_color);
UniformBuffer<WorldData> &world_buf = resources.world_buf;
- float4x4 rot_matrix = float4x4::identity();
- if (shading.flag & V3D_SHADING_WORLD_ORIENTATION) {
- /* TODO(pragma37) C++ API ? */
- float V[4][4], R[4][4];
- DRW_view_viewmat_get(nullptr, V, false);
- axis_angle_to_mat4_single(R, 'Z', -shading.studiolight_rot_z);
- mul_m4_m4m4(R, V, R);
- swap_v3_v3(R[2], R[1]);
- negate_v3(R[2]);
- rot_matrix = float4x4(R);
- }
-
StudioLight *studio_light = nullptr;
if (U.edit_studio_light) {
studio_light = BKE_studiolight_studio_edit_get();
@@ -149,25 +135,8 @@ class Instance {
if (shading_type == eShadingType::MATCAP) {
studio_light = BKE_studiolight_find(shading.matcap, STUDIOLIGHT_TYPE_MATCAP);
if (studio_light && studio_light->name != current_matcap) {
- ImBuf *matcap_diffuse = studio_light->matcap_diffuse.ibuf;
- ImBuf *matcap_specular = studio_light->matcap_specular.ibuf;
- if (matcap_diffuse && matcap_diffuse->rect_float) {
+ if (get_matcap_tx(resources.matcap_tx, *studio_light)) {
current_matcap = studio_light->name;
- int layers = 1;
- float *buffer = matcap_diffuse->rect_float;
- Vector<float> combined_buffer = {};
- if (matcap_specular && matcap_specular->rect_float) {
- int size = matcap_diffuse->x * matcap_diffuse->y * 4;
- combined_buffer.extend(matcap_diffuse->rect_float, size);
- combined_buffer.extend(matcap_specular->rect_float, size);
- buffer = combined_buffer.begin();
- layers++;
- }
- resources.matcap_tx = Texture(current_matcap.c_str(),
- GPU_RGBA16F,
- int2(matcap_diffuse->x, matcap_diffuse->y),
- layers,
- buffer);
}
}
}
@@ -176,52 +145,43 @@ class Instance {
studio_light = BKE_studiolight_find(shading.studio_light, STUDIOLIGHT_TYPE_STUDIO);
}
}
+ world_buf.matcap_orientation = (shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
+ if (!resources.matcap_tx.is_valid()) {
+ resources.matcap_tx.ensure_2d_array(GPU_RGBA16F, int2(1), 1);
+ }
- for (int i = 0; i < 4; i++) {
- LightData &light = world_buf.lights[i];
+ float4x4 world_shading_rotation = float4x4::identity();
+ if (shading.flag & V3D_SHADING_WORLD_ORIENTATION) {
+ world_shading_rotation = get_world_shading_rotation_matrix(shading.studiolight_rot_z);
+ }
+ for (int i = 0; i < 4; i++) {
SolidLight *sl = (studio_light) ? &studio_light->light[i] : nullptr;
- if (sl && sl->flag) {
- float3 direction = rot_matrix.ref_3x3() * float3(sl->vec);
- light.direction = float4(direction, 0.0f);
- /* We should pre-divide the power by PI but that makes the lights really dim. */
- light.specular_color = float4(float3(sl->spec), 0.0f);
- light.diffuse_color_wrap = float4(float3(sl->col), sl->smooth);
- }
- else {
- light.direction = float4(1.0f, 0.0f, 0.0f, 0.0f);
- light.specular_color = float4(0.0f);
- light.diffuse_color_wrap = float4(0.0f);
- }
+ world_buf.lights[i] = get_light_data_from_studio_solidlight(sl, world_shading_rotation);
}
- world_buf.ambient_color = float4(1.0f, 1.0f, 1.0f, 0.0f);
- world_buf.use_specular = false;
-
if (studio_light != nullptr) {
world_buf.ambient_color = float4(float3(studio_light->light_ambient), 0.0f);
world_buf.use_specular = shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHT &&
studio_light->flag & STUDIOLIGHT_SPECULAR_HIGHLIGHT_PASS;
}
+ else {
+ world_buf.ambient_color = float4(1.0f, 1.0f, 1.0f, 0.0f);
+ world_buf.use_specular = false;
+ }
world_buf.background_color = float4(0.0f);
-
if (is_render_mode && scene->r.alphamode != R_ALPHAPREMUL) {
if (World *w = scene->world) {
world_buf.background_color = float4(w->horr, w->horg, w->horb, 1.0f);
}
}
- world_buf.object_outline_color = shading.object_outline_color;
- world_buf.object_outline_color.w = 1.0f;
+ world_buf.object_outline_color = float4(float3(shading.object_outline_color), 1.0f);
world_buf.ui_scale = DRW_state_is_image_render() ? 1.0f : G_draw.block.size_pixel;
- world_buf.matcap_orientation = (shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
/* TODO(pragma37) volumes_do */
- if (!resources.matcap_tx.is_valid()) {
- resources.matcap_tx.ensure_2d_array(GPU_RGBA16F, int2(1), 1);
- }
resources.depth_tx.ensure_2d(GPU_DEPTH24_STENCIL8, output_res);
anti_aliasing_ps.init(reset_taa);
@@ -243,26 +203,6 @@ 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;
@@ -285,7 +225,7 @@ class Instance {
}
};
- DrawModeInfo get_draw_mode_info(Object *ob)
+ const DrawModeInfo get_draw_mode_info(Object *ob)
{
const DRWContextState *draw_ctx
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list