Merge branch 'blender-v3.2-release'
This commit is contained in:
commit
65d44093c9
Notes:
blender-bot
2023-02-14 08:38:11 +01:00
Referenced by issue #98071, Regression: UV selection visualization on adjacent edges lost
|
@ -114,7 +114,9 @@ void EEVEE_motion_blur_data_free(EEVEE_MotionBlurData *mb)
|
|||
}
|
||||
}
|
||||
|
||||
EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *mb, Object *ob)
|
||||
EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *mb,
|
||||
Object *ob,
|
||||
bool is_psys)
|
||||
{
|
||||
if (mb->object == NULL) {
|
||||
return NULL;
|
||||
|
@ -123,14 +125,16 @@ EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *
|
|||
EEVEE_ObjectKey key, *key_p;
|
||||
/* Assumes that all instances have the same object pointer. This is currently the case because
|
||||
* instance objects are temporary objects on the stack. */
|
||||
key.ob = ob;
|
||||
/* WORKAROUND: Duplicate object key for particle system (hairs) to be able to store dupli offset
|
||||
* matrix along with the emitter obmat. (see T97380) */
|
||||
key.ob = (void *)((char *)ob + is_psys);
|
||||
DupliObject *dup = DRW_object_get_dupli(ob);
|
||||
if (dup) {
|
||||
key.parent = DRW_object_get_dupli_parent(ob);
|
||||
memcpy(key.id, dup->persistent_id, sizeof(key.id));
|
||||
}
|
||||
else {
|
||||
key.parent = key.ob;
|
||||
key.parent = ob;
|
||||
memset(key.id, 0, sizeof(key.id));
|
||||
}
|
||||
|
||||
|
|
|
@ -226,7 +226,8 @@ void EEVEE_motion_blur_hair_cache_populate(EEVEE_ViewLayerData *UNUSED(sldata),
|
|||
}
|
||||
|
||||
/* For now we assume hair objects are always moving. */
|
||||
EEVEE_ObjectMotionData *mb_data = EEVEE_motion_blur_object_data_get(&effects->motion_blur, ob);
|
||||
EEVEE_ObjectMotionData *mb_data = EEVEE_motion_blur_object_data_get(
|
||||
&effects->motion_blur, ob, true);
|
||||
|
||||
if (mb_data) {
|
||||
int mb_step = effects->motion_blur_step;
|
||||
|
@ -283,7 +284,8 @@ void EEVEE_motion_blur_curves_cache_populate(EEVEE_ViewLayerData *UNUSED(sldata)
|
|||
}
|
||||
|
||||
/* For now we assume curves objects are always moving. */
|
||||
EEVEE_ObjectMotionData *mb_data = EEVEE_motion_blur_object_data_get(&effects->motion_blur, ob);
|
||||
EEVEE_ObjectMotionData *mb_data = EEVEE_motion_blur_object_data_get(
|
||||
&effects->motion_blur, ob, false);
|
||||
if (mb_data == NULL) {
|
||||
return;
|
||||
}
|
||||
|
@ -354,7 +356,8 @@ void EEVEE_motion_blur_cache_populate(EEVEE_ViewLayerData *UNUSED(sldata),
|
|||
return;
|
||||
}
|
||||
|
||||
EEVEE_ObjectMotionData *mb_data = EEVEE_motion_blur_object_data_get(&effects->motion_blur, ob);
|
||||
EEVEE_ObjectMotionData *mb_data = EEVEE_motion_blur_object_data_get(
|
||||
&effects->motion_blur, ob, false);
|
||||
|
||||
if (mb_data) {
|
||||
int mb_step = effects->motion_blur_step;
|
||||
|
|
|
@ -644,8 +644,10 @@ typedef struct EEVEE_MotionBlurData {
|
|||
} EEVEE_MotionBlurData;
|
||||
|
||||
typedef struct EEVEE_ObjectKey {
|
||||
/** Object or source object for duplis */
|
||||
struct Object *ob;
|
||||
/** Object or source object for duplis. */
|
||||
/** WORKAROUND: The pointer is different for particle systems and do not point to the real
|
||||
* object. (See T97380) */
|
||||
void *ob;
|
||||
/** Parent object for duplis */
|
||||
struct Object *parent;
|
||||
/** Dupli objects recursive unique identifier */
|
||||
|
@ -1093,7 +1095,9 @@ EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure_ex(struct ViewLayer *view_laye
|
|||
EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void);
|
||||
EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob);
|
||||
EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob);
|
||||
EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *mb, Object *ob);
|
||||
EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *mb,
|
||||
Object *ob,
|
||||
bool is_psys);
|
||||
EEVEE_GeometryMotionData *EEVEE_motion_blur_geometry_data_get(EEVEE_ObjectMotionData *mb_data);
|
||||
EEVEE_HairMotionData *EEVEE_motion_blur_hair_data_get(EEVEE_ObjectMotionData *mb_data, Object *ob);
|
||||
EEVEE_HairMotionData *EEVEE_motion_blur_curves_data_get(EEVEE_ObjectMotionData *mb_data);
|
||||
|
|
|
@ -207,9 +207,9 @@ void execute_materialized(TypeSequence<ParamTags...> /* param_tags */,
|
|||
(
|
||||
/* Setup information for all parameters. */
|
||||
[&] {
|
||||
using ParamTag = ParamTags;
|
||||
using T = typename ParamTag::base_type;
|
||||
ArgInfo<ParamTags> &arg_info = std::get<I>(args_info);
|
||||
typedef ParamTags ParamTag;
|
||||
typedef typename ParamTag::base_type T;
|
||||
[[maybe_unused]] ArgInfo<ParamTags> &arg_info = std::get<I>(args_info);
|
||||
if constexpr (ParamTag::category == MFParamCategory::SingleInput) {
|
||||
VArray<T> &varray = *args;
|
||||
if (varray.is_single()) {
|
||||
|
@ -246,7 +246,7 @@ void execute_materialized(TypeSequence<ParamTags...> /* param_tags */,
|
|||
[&] {
|
||||
using ParamTag = ParamTags;
|
||||
using T = typename ParamTag::base_type;
|
||||
ArgInfo<ParamTags> &arg_info = std::get<I>(args_info);
|
||||
[[maybe_unused]] ArgInfo<ParamTags> &arg_info = std::get<I>(args_info);
|
||||
if constexpr (ParamTag::category == MFParamCategory::SingleInput) {
|
||||
if (arg_info.mode == ArgMode::Single) {
|
||||
/* The single value has been filled into a buffer already reused for every chunk. */
|
||||
|
@ -282,9 +282,9 @@ void execute_materialized(TypeSequence<ParamTags...> /* param_tags */,
|
|||
(
|
||||
/* Destruct values that have been materialized before. */
|
||||
[&] {
|
||||
using ParamTag = ParamTags;
|
||||
using T = typename ParamTag::base_type;
|
||||
ArgInfo<ParamTags> &arg_info = std::get<I>(args_info);
|
||||
typedef ParamTags ParamTag;
|
||||
typedef typename ParamTag::base_type T;
|
||||
[[maybe_unused]] ArgInfo<ParamTags> &arg_info = std::get<I>(args_info);
|
||||
if constexpr (ParamTag::category == MFParamCategory::SingleInput) {
|
||||
if (arg_info.mode == ArgMode::Materialized) {
|
||||
T *in_chunk = std::get<I>(buffers_owner).ptr();
|
||||
|
@ -298,9 +298,9 @@ void execute_materialized(TypeSequence<ParamTags...> /* param_tags */,
|
|||
(
|
||||
/* Destruct buffers for single value inputs. */
|
||||
[&] {
|
||||
using ParamTag = ParamTags;
|
||||
using T = typename ParamTag::base_type;
|
||||
ArgInfo<ParamTags> &arg_info = std::get<I>(args_info);
|
||||
typedef ParamTags ParamTag;
|
||||
typedef typename ParamTag::base_type T;
|
||||
[[maybe_unused]] ArgInfo<ParamTags> &arg_info = std::get<I>(args_info);
|
||||
if constexpr (ParamTag::category == MFParamCategory::SingleInput) {
|
||||
if (arg_info.mode == ArgMode::Single) {
|
||||
MutableSpan<T> in_chunk = std::get<I>(buffers);
|
||||
|
@ -347,8 +347,8 @@ template<typename... ParamTags> class CustomMF : public MultiFunction {
|
|||
(
|
||||
/* Get all parameters from #params and store them in #retrieved_params. */
|
||||
[&]() {
|
||||
using ParamTag = typename TagsSequence::template at_index<I>;
|
||||
using T = typename ParamTag::base_type;
|
||||
typedef typename TagsSequence::template at_index<I> ParamTag;
|
||||
typedef typename ParamTag::base_type T;
|
||||
|
||||
if constexpr (ParamTag::category == MFParamCategory::SingleInput) {
|
||||
std::get<I>(retrieved_params) = params.readonly_single_input<T>(I);
|
||||
|
@ -402,7 +402,7 @@ template<typename... ParamTags> class CustomMF : public MultiFunction {
|
|||
(
|
||||
/* Loop over all parameter types and add an entry for each in the signature. */
|
||||
[&] {
|
||||
using ParamTag = typename TagsSequence::template at_index<I>;
|
||||
typedef typename TagsSequence::template at_index<I> ParamTag;
|
||||
signature.add(ParamTag(), "");
|
||||
}(),
|
||||
...);
|
||||
|
|
Loading…
Reference in New Issue