Merge branch 'blender-v4.2-release'

This commit is contained in:
Jacques Lucke
2024-06-21 13:00:51 +02:00

View File

@@ -61,79 +61,100 @@ static void node_geo_exec(GeoNodeExecParams params)
params.set_default_remaining_outputs();
return;
}
if (!DEG_object_geometry_is_evaluated(*object)) {
const bool self_transform_evaluated = DEG_object_transform_is_evaluated(*self_object);
const bool object_transform_evaluated = DEG_object_transform_is_evaluated(*object);
const bool object_geometry_evaluated = DEG_object_geometry_is_evaluated(*object);
float4x4 output_transform = float4x4::identity();
bool show_transform_error = false;
if (transform_space_relative) {
if (self_transform_evaluated && object_transform_evaluated) {
output_transform = self_object->world_to_object() * object->object_to_world();
}
else {
show_transform_error = true;
}
}
else {
if (object_transform_evaluated) {
output_transform = object->object_to_world();
}
else {
show_transform_error = true;
}
}
if (show_transform_error) {
params.error_message_add(
NodeWarningType::Error,
TIP_("Can't access object's transforms because it's not evaluated yet. "
"This can happen when there is a dependency cycle"));
}
float3 location, scale;
math::Quaternion rotation;
math::to_loc_rot_scale_safe<true>(output_transform, location, rotation, scale);
params.set_output("Location", location);
params.set_output("Rotation", rotation);
params.set_output("Scale", scale);
if (!params.output_is_required("Geometry")) {
return;
}
/* Compare by `orig_id` because objects may be copied into separate depsgraphs. */
if (DEG_get_original_id(&object->id) == DEG_get_original_id(const_cast<ID *>(&self_object->id)))
{
params.error_message_add(
NodeWarningType::Error,
params.user_data()->call_data->operator_data ?
TIP_("Geometry cannot be retrieved from the edited object itself") :
TIP_("Geometry cannot be retrieved from the modifier object"));
params.set_default_remaining_outputs();
return;
}
BLI_assert(object != self_object);
if (!object_geometry_evaluated) {
params.error_message_add(NodeWarningType::Error,
TIP_("Can't access object's geometry because it's not evaluated yet. "
"This can happen when there is a dependency cycle"));
params.set_default_remaining_outputs();
return;
}
std::optional<float4x4> geometry_transform;
if (transform_space_relative) {
if (!DEG_object_transform_is_evaluated(*object) ||
!DEG_object_transform_is_evaluated(*self_object))
{
if (!self_transform_evaluated || !object_transform_evaluated) {
params.error_message_add(
NodeWarningType::Error,
TIP_("Can't access objects transforms because it's not evaluated yet. "
TIP_("Can't access object's transforms because it's not evaluated yet. "
"This can happen when there is a dependency cycle"));
params.set_default_remaining_outputs();
return;
}
geometry_transform = self_object->world_to_object() * object->object_to_world();
}
const float4x4 &object_matrix = object->object_to_world();
const float4x4 transform = self_object->world_to_object() * object_matrix;
float3 location, scale;
math::Quaternion rotation;
if (transform_space_relative) {
math::to_loc_rot_scale_safe<true>(transform, location, rotation, scale);
params.set_output("Transform", transform);
}
else {
math::to_loc_rot_scale_safe<true>(object_matrix, location, rotation, scale);
params.set_output("Transform", object_matrix);
}
params.set_output("Location", location);
params.set_output("Rotation", rotation);
params.set_output("Scale", scale);
if (params.output_is_required("Geometry")) {
/* Compare by `orig_id` because objects may be copied into separate depsgraphs. */
if (DEG_get_original_id(&object->id) ==
DEG_get_original_id(const_cast<ID *>(&self_object->id)))
{
params.error_message_add(
NodeWarningType::Error,
params.user_data()->call_data->operator_data ?
TIP_("Geometry cannot be retrieved from the edited object itself") :
TIP_("Geometry cannot be retrieved from the modifier object"));
params.set_default_remaining_outputs();
return;
}
BLI_assert(object != self_object);
GeometrySet geometry_set;
if (params.get_input<bool>("As Instance")) {
std::unique_ptr<bke::Instances> instances = std::make_unique<bke::Instances>();
const int handle = instances->add_reference(*object);
if (transform_space_relative) {
instances->add_instance(handle, transform);
}
else {
instances->add_instance(handle, float4x4::identity());
}
geometry_set = GeometrySet::from_instances(instances.release());
GeometrySet geometry_set;
if (params.get_input<bool>("As Instance")) {
std::unique_ptr<bke::Instances> instances = std::make_unique<bke::Instances>();
const int handle = instances->add_reference(*object);
if (transform_space_relative) {
instances->add_instance(handle, *geometry_transform);
}
else {
geometry_set = bke::object_get_evaluated_geometry_set(*object);
if (transform_space_relative) {
geometry::transform_geometry(geometry_set, transform);
}
instances->add_instance(handle, float4x4::identity());
}
params.set_output("Geometry", geometry_set);
geometry_set = GeometrySet::from_instances(instances.release());
}
else {
geometry_set = bke::object_get_evaluated_geometry_set(*object);
if (transform_space_relative) {
geometry::transform_geometry(geometry_set, *geometry_transform);
}
}
params.set_output("Geometry", geometry_set);
}
static void node_node_init(bNodeTree * /*tree*/, bNode *node)