Merge branch 'blender-v2.83-release'
This commit is contained in:
commit
236794d07a
Notes:
blender-bot
2023-02-14 05:36:11 +01:00
Referenced by issue #76277, Enabling Viewer Border in Compositor Crashes Blender
|
@ -21,24 +21,24 @@
|
|||
#include "../MEM_guardedalloc.h"
|
||||
#include <new>
|
||||
|
||||
void *operator new(size_t size, const char *str) throw(std::bad_alloc);
|
||||
void *operator new[](size_t size, const char *str) throw(std::bad_alloc);
|
||||
void *operator new(size_t size, const char *str);
|
||||
void *operator new[](size_t size, const char *str);
|
||||
|
||||
/* not default but can be used when needing to set a string */
|
||||
void *operator new(size_t size, const char *str) throw(std::bad_alloc)
|
||||
void *operator new(size_t size, const char *str)
|
||||
{
|
||||
return MEM_mallocN(size, str);
|
||||
}
|
||||
void *operator new[](size_t size, const char *str) throw(std::bad_alloc)
|
||||
void *operator new[](size_t size, const char *str)
|
||||
{
|
||||
return MEM_mallocN(size, str);
|
||||
}
|
||||
|
||||
void *operator new(size_t size) throw(std::bad_alloc)
|
||||
void *operator new(size_t size)
|
||||
{
|
||||
return MEM_mallocN(size, "C++/anonymous");
|
||||
}
|
||||
void *operator new[](size_t size) throw(std::bad_alloc)
|
||||
void *operator new[](size_t size)
|
||||
{
|
||||
return MEM_mallocN(size, "C++/anonymous[]");
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 80f390fd0e20d7e2aadf07c43a45717e810fa10d
|
||||
Subproject commit 1d9b8b2ffa67a8832073acf316150b2dfaa2db02
|
|
@ -1 +1 @@
|
|||
Subproject commit 44c17b01168ea180d7ea865e9ec1ef6e93097b3a
|
||||
Subproject commit 590710871b7b2e1f7f50bb622f1409b794ad38c2
|
|
@ -191,7 +191,6 @@ bool BKE_pbvh_node_find_nearest_to_ray(PBVH *bvh,
|
|||
/* Drawing */
|
||||
|
||||
void BKE_pbvh_draw_cb(PBVH *bvh,
|
||||
bool show_vcol,
|
||||
bool update_only_visible,
|
||||
PBVHFrustumPlanes *update_frustum,
|
||||
PBVHFrustumPlanes *draw_frustum,
|
||||
|
|
|
@ -1009,7 +1009,6 @@ typedef struct PBVHUpdateData {
|
|||
|
||||
float (*vnors)[3];
|
||||
int flag;
|
||||
bool show_vcol;
|
||||
bool show_sculpt_face_sets;
|
||||
} PBVHUpdateData;
|
||||
|
||||
|
@ -1250,12 +1249,10 @@ void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int totnode, int flag)
|
|||
BLI_task_parallel_range(0, totnode, &data, pbvh_update_BB_redraw_task_cb, &settings);
|
||||
}
|
||||
|
||||
static int pbvh_get_buffers_update_flags(PBVH *bvh, bool show_vcol)
|
||||
static int pbvh_get_buffers_update_flags(PBVH *UNUSED(bvh))
|
||||
{
|
||||
int update_flags = 0;
|
||||
update_flags |= bvh->show_mask ? GPU_PBVH_BUFFERS_SHOW_MASK : 0;
|
||||
update_flags |= show_vcol ? GPU_PBVH_BUFFERS_SHOW_VCOL : 0;
|
||||
update_flags |= bvh->show_face_sets ? GPU_PBVH_BUFFERS_SHOW_SCULPT_FACE_SETS : 0;
|
||||
int update_flags = GPU_PBVH_BUFFERS_SHOW_VCOL | GPU_PBVH_BUFFERS_SHOW_MASK |
|
||||
GPU_PBVH_BUFFERS_SHOW_SCULPT_FACE_SETS;
|
||||
return update_flags;
|
||||
}
|
||||
|
||||
|
@ -1295,7 +1292,7 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
|
|||
}
|
||||
|
||||
if (node->flag & PBVH_UpdateDrawBuffers) {
|
||||
const int update_flags = pbvh_get_buffers_update_flags(bvh, data->show_vcol);
|
||||
const int update_flags = pbvh_get_buffers_update_flags(bvh);
|
||||
switch (bvh->type) {
|
||||
case PBVH_GRIDS:
|
||||
GPU_pbvh_grid_buffers_update(node->draw_buffers,
|
||||
|
@ -1335,8 +1332,7 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
|
|||
}
|
||||
}
|
||||
|
||||
static void pbvh_update_draw_buffers(
|
||||
PBVH *bvh, PBVHNode **nodes, int totnode, bool show_vcol, int update_flag)
|
||||
static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode, int update_flag)
|
||||
{
|
||||
if ((update_flag & PBVH_RebuildDrawBuffers) || ELEM(bvh->type, PBVH_GRIDS, PBVH_BMESH)) {
|
||||
/* Free buffers uses OpenGL, so not in parallel. */
|
||||
|
@ -1362,7 +1358,6 @@ static void pbvh_update_draw_buffers(
|
|||
PBVHUpdateData data = {
|
||||
.bvh = bvh,
|
||||
.nodes = nodes,
|
||||
.show_vcol = show_vcol,
|
||||
};
|
||||
|
||||
TaskParallelSettings settings;
|
||||
|
@ -2679,7 +2674,6 @@ static bool pbvh_draw_search_cb(PBVHNode *node, void *data_v)
|
|||
}
|
||||
|
||||
void BKE_pbvh_draw_cb(PBVH *bvh,
|
||||
bool show_vcol,
|
||||
bool update_only_visible,
|
||||
PBVHFrustumPlanes *update_frustum,
|
||||
PBVHFrustumPlanes *draw_frustum,
|
||||
|
@ -2696,7 +2690,7 @@ void BKE_pbvh_draw_cb(PBVH *bvh,
|
|||
BKE_pbvh_search_gather(bvh, update_search_cb, POINTER_FROM_INT(update_flag), &nodes, &totnode);
|
||||
|
||||
if (totnode) {
|
||||
pbvh_update_draw_buffers(bvh, nodes, totnode, show_vcol, update_flag);
|
||||
pbvh_update_draw_buffers(bvh, nodes, totnode, update_flag);
|
||||
}
|
||||
|
||||
MEM_SAFE_FREE(nodes);
|
||||
|
@ -2708,7 +2702,7 @@ void BKE_pbvh_draw_cb(PBVH *bvh,
|
|||
|
||||
if (update_only_visible && (data.accum_update_flag & update_flag)) {
|
||||
/* Update draw buffers in visible nodes. */
|
||||
pbvh_update_draw_buffers(bvh, nodes, totnode, show_vcol, data.accum_update_flag);
|
||||
pbvh_update_draw_buffers(bvh, nodes, totnode, data.accum_update_flag);
|
||||
}
|
||||
|
||||
/* Draw. */
|
||||
|
|
|
@ -231,19 +231,17 @@ static void blo_update_defaults_screen(bScreen *screen,
|
|||
/* 2D animation template. */
|
||||
if (app_template && STREQ(app_template, "2D_Animation")) {
|
||||
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
|
||||
LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
|
||||
if (area->spacetype == SPACE_ACTION) {
|
||||
SpaceAction *saction = area->spacedata.first;
|
||||
/* Enable Sliders. */
|
||||
saction->flag |= SACTION_SLIDERS;
|
||||
}
|
||||
else if (area->spacetype == SPACE_VIEW3D) {
|
||||
View3D *v3d = area->spacedata.first;
|
||||
/* Set Material Color by default. */
|
||||
v3d->shading.color_type = V3D_SHADING_MATERIAL_COLOR;
|
||||
/* Enable Annotations. */
|
||||
v3d->flag2 |= V3D_SHOW_ANNOTATION;
|
||||
}
|
||||
if (area->spacetype == SPACE_ACTION) {
|
||||
SpaceAction *saction = area->spacedata.first;
|
||||
/* Enable Sliders. */
|
||||
saction->flag |= SACTION_SLIDERS;
|
||||
}
|
||||
else if (area->spacetype == SPACE_VIEW3D) {
|
||||
View3D *v3d = area->spacedata.first;
|
||||
/* Set Material Color by default. */
|
||||
v3d->shading.color_type = V3D_SHADING_MATERIAL_COLOR;
|
||||
/* Enable Annotations. */
|
||||
v3d->flag2 |= V3D_SHOW_ANNOTATION;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -202,7 +202,7 @@ static void basic_cache_populate(void *vedata, Object *ob)
|
|||
stl->g_data->depth_shgrp[do_in_front];
|
||||
|
||||
if (use_sculpt_pbvh) {
|
||||
DRW_shgroup_call_sculpt(shgrp, ob, false, false, false);
|
||||
DRW_shgroup_call_sculpt(shgrp, ob, false, false);
|
||||
}
|
||||
else {
|
||||
struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
|
||||
|
|
|
@ -2073,23 +2073,21 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata,
|
|||
}
|
||||
|
||||
if (use_sculpt_pbvh) {
|
||||
/* Vcol is not supported in the modes that require PBVH drawing. */
|
||||
const bool use_vcol = false;
|
||||
struct DRWShadingGroup **sculpt_shgrps_array = BLI_array_alloca(sculpt_shgrps_array,
|
||||
materials_len);
|
||||
for (int i = 0; i < materials_len; i++) {
|
||||
sculpt_shgrps_array[i] = shgrps_array[i].shading_grp;
|
||||
}
|
||||
DRW_shgroup_call_sculpt_with_materials(sculpt_shgrps_array, materials_len, ob, use_vcol);
|
||||
DRW_shgroup_call_sculpt_with_materials(sculpt_shgrps_array, materials_len, ob);
|
||||
|
||||
for (int i = 0; i < materials_len; i++) {
|
||||
sculpt_shgrps_array[i] = shgrps_array[i].depth_grp;
|
||||
}
|
||||
DRW_shgroup_call_sculpt_with_materials(sculpt_shgrps_array, materials_len, ob, use_vcol);
|
||||
DRW_shgroup_call_sculpt_with_materials(sculpt_shgrps_array, materials_len, ob);
|
||||
for (int i = 0; i < materials_len; i++) {
|
||||
sculpt_shgrps_array[i] = shgrps_array[i].depth_clip_grp;
|
||||
}
|
||||
DRW_shgroup_call_sculpt_with_materials(sculpt_shgrps_array, materials_len, ob, use_vcol);
|
||||
DRW_shgroup_call_sculpt_with_materials(sculpt_shgrps_array, materials_len, ob);
|
||||
|
||||
for (int renderpass_index = 0;
|
||||
renderpass_index < stl->g_data->render_passes_material_count;
|
||||
|
@ -2097,7 +2095,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata,
|
|||
for (int i = 0; i < materials_len; i++) {
|
||||
sculpt_shgrps_array[i] = shgrps_array[i].material_accum_grp[renderpass_index];
|
||||
}
|
||||
DRW_shgroup_call_sculpt_with_materials(sculpt_shgrps_array, materials_len, ob, use_vcol);
|
||||
DRW_shgroup_call_sculpt_with_materials(sculpt_shgrps_array, materials_len, ob);
|
||||
}
|
||||
|
||||
/* TODO(fclem): Support shadows in sculpt mode. */
|
||||
|
|
|
@ -25,10 +25,12 @@
|
|||
|
||||
#include "DRW_render.h"
|
||||
|
||||
#include "DNA_modifier_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_view3d_types.h"
|
||||
|
||||
#include "BKE_object.h"
|
||||
#include "BKE_particle.h"
|
||||
|
||||
#include "ED_screen.h"
|
||||
|
||||
|
@ -166,6 +168,24 @@ static void external_cache_populate(void *vedata, Object *ob)
|
|||
return;
|
||||
}
|
||||
|
||||
if (ob->type == OB_MESH && ob->modifiers.first != NULL) {
|
||||
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) {
|
||||
struct GPUBatch *hairs = DRW_cache_particles_get_hair(ob, psys, NULL);
|
||||
DRW_shgroup_call(stl->g_data->depth_shgrp, hairs, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
|
||||
if (geom) {
|
||||
/* Depth Prepass */
|
||||
|
|
|
@ -63,7 +63,7 @@ void OVERLAY_facing_cache_populate(OVERLAY_Data *vedata, Object *ob)
|
|||
const bool is_xray = (ob->dtx & OB_DRAWXRAY) != 0;
|
||||
|
||||
if (use_sculpt_pbvh) {
|
||||
DRW_shgroup_call_sculpt(pd->facing_grp[is_xray], ob, false, false, false);
|
||||
DRW_shgroup_call_sculpt(pd->facing_grp[is_xray], ob, false, false);
|
||||
}
|
||||
else {
|
||||
struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
|
||||
|
|
|
@ -54,7 +54,7 @@ void OVERLAY_sculpt_cache_populate(OVERLAY_Data *vedata, Object *ob)
|
|||
|
||||
if (use_pbvh || !ob->sculpt->deform_modifiers_active || ob->sculpt->shapekey_active) {
|
||||
if (!use_pbvh || pbvh_has_mask(pbvh) || pbvh_has_face_sets(pbvh)) {
|
||||
DRW_shgroup_call_sculpt(pd->sculpt_mask_grp, ob, false, true, false);
|
||||
DRW_shgroup_call_sculpt(pd->sculpt_mask_grp, ob, false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -230,7 +230,7 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
|
|||
DRW_shgroup_call_no_cull(shgrp, geom, ob);
|
||||
}
|
||||
else if (use_sculpt_pbvh) {
|
||||
DRW_shgroup_call_sculpt(shgrp, ob, true, false, false);
|
||||
DRW_shgroup_call_sculpt(shgrp, ob, true, false);
|
||||
}
|
||||
else {
|
||||
DRW_shgroup_call(shgrp, geom, ob);
|
||||
|
|
|
@ -176,6 +176,14 @@ void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata)
|
|||
}
|
||||
}
|
||||
|
||||
/* Reset the TAA when we have already draw a sample, but the sample count differs from previous
|
||||
* time. This removes render artifacts when the viewport anti-aliasing in the user preferences is
|
||||
* set to a lower value. */
|
||||
if (wpd->taa_sample_len != wpd->taa_sample_len_previous) {
|
||||
wpd->taa_sample = 0;
|
||||
wpd->taa_sample_len_previous = wpd->taa_sample_len;
|
||||
}
|
||||
|
||||
if (wpd->view_updated) {
|
||||
wpd->taa_sample = 0;
|
||||
wpd->view_updated = false;
|
||||
|
|
|
@ -55,6 +55,7 @@ void workbench_engine_init(void *ved)
|
|||
|
||||
if (!stl->wpd) {
|
||||
stl->wpd = MEM_callocN(sizeof(*stl->wpd), __func__);
|
||||
stl->wpd->taa_sample_len_previous = -1;
|
||||
stl->wpd->view_updated = true;
|
||||
}
|
||||
|
||||
|
@ -118,7 +119,7 @@ static void workbench_cache_sculpt_populate(WORKBENCH_PrivateData *wpd,
|
|||
|
||||
if (use_single_drawcall) {
|
||||
DRWShadingGroup *grp = workbench_material_setup(wpd, ob, 0, color_type, NULL);
|
||||
DRW_shgroup_call_sculpt(grp, ob, false, false, use_vcol);
|
||||
DRW_shgroup_call_sculpt(grp, ob, false, false);
|
||||
}
|
||||
else {
|
||||
const int materials_len = DRW_cache_object_material_count_get(ob);
|
||||
|
@ -126,7 +127,7 @@ static void workbench_cache_sculpt_populate(WORKBENCH_PrivateData *wpd,
|
|||
for (int i = 0; i < materials_len; i++) {
|
||||
shgrps[i] = workbench_material_setup(wpd, ob, i + 1, color_type, NULL);
|
||||
}
|
||||
DRW_shgroup_call_sculpt_with_materials(shgrps, materials_len, ob, false);
|
||||
DRW_shgroup_call_sculpt_with_materials(shgrps, materials_len, ob);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -261,6 +261,8 @@ typedef struct WORKBENCH_PrivateData {
|
|||
/* Temporal Antialiasing */
|
||||
/** Total number of samples to after which TAA stops accumulating samples. */
|
||||
int taa_sample_len;
|
||||
/** Total number of samples of the previous TAA. When changed TAA will be reset. */
|
||||
int taa_sample_len_previous;
|
||||
/** Current TAA sample index in [0..taa_sample_len[ range. */
|
||||
int taa_sample;
|
||||
/** Inverse of taa_sample to divide the accumulation buffer. */
|
||||
|
|
|
@ -410,11 +410,8 @@ void DRW_shgroup_call_instances_with_attrs(DRWShadingGroup *shgroup,
|
|||
struct GPUBatch *geom,
|
||||
struct GPUBatch *inst_attributes);
|
||||
|
||||
void DRW_shgroup_call_sculpt(DRWShadingGroup *sh, Object *ob, bool wire, bool mask, bool vcol);
|
||||
void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **sh,
|
||||
int num_sh,
|
||||
Object *ob,
|
||||
bool vcol);
|
||||
void DRW_shgroup_call_sculpt(DRWShadingGroup *sh, Object *ob, bool wire, bool mask);
|
||||
void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **sh, int num_sh, Object *ob);
|
||||
|
||||
DRWCallBuffer *DRW_shgroup_call_buffer(DRWShadingGroup *shading_group,
|
||||
struct GPUVertFormat *format,
|
||||
|
|
|
@ -954,7 +954,7 @@ static void drw_sculpt_get_frustum_planes(Object *ob, float planes[6][4])
|
|||
}
|
||||
}
|
||||
|
||||
static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd, bool use_vcol)
|
||||
static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd)
|
||||
{
|
||||
/* PBVH should always exist for non-empty meshes, created by depsgrah eval. */
|
||||
PBVH *pbvh = (scd->ob->sculpt) ? scd->ob->sculpt->pbvh : NULL;
|
||||
|
@ -1015,7 +1015,6 @@ static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd, bool use_vcol)
|
|||
BKE_pbvh_update_normals(pbvh, mesh->runtime.subdiv_ccg);
|
||||
|
||||
BKE_pbvh_draw_cb(pbvh,
|
||||
use_vcol,
|
||||
update_only_visible,
|
||||
&update_frustum,
|
||||
&draw_frustum,
|
||||
|
@ -1033,8 +1032,7 @@ static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd, bool use_vcol)
|
|||
}
|
||||
}
|
||||
|
||||
void DRW_shgroup_call_sculpt(
|
||||
DRWShadingGroup *shgroup, Object *ob, bool use_wire, bool use_mask, bool use_vcol)
|
||||
void DRW_shgroup_call_sculpt(DRWShadingGroup *shgroup, Object *ob, bool use_wire, bool use_mask)
|
||||
{
|
||||
DRWSculptCallbackData scd = {
|
||||
.ob = ob,
|
||||
|
@ -1044,13 +1042,12 @@ void DRW_shgroup_call_sculpt(
|
|||
.use_mats = false,
|
||||
.use_mask = use_mask,
|
||||
};
|
||||
drw_sculpt_generate_calls(&scd, use_vcol);
|
||||
drw_sculpt_generate_calls(&scd);
|
||||
}
|
||||
|
||||
void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups,
|
||||
int num_shgroups,
|
||||
Object *ob,
|
||||
bool use_vcol)
|
||||
Object *ob)
|
||||
{
|
||||
DRWSculptCallbackData scd = {
|
||||
.ob = ob,
|
||||
|
@ -1060,7 +1057,7 @@ void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups,
|
|||
.use_mats = true,
|
||||
.use_mask = false,
|
||||
};
|
||||
drw_sculpt_generate_calls(&scd, use_vcol);
|
||||
drw_sculpt_generate_calls(&scd);
|
||||
}
|
||||
|
||||
static GPUVertFormat inst_select_format = {0};
|
||||
|
|
Loading…
Reference in New Issue