Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Parborg <darkdefende@gmail.com>2021-01-19 20:12:34 +0300
committerSebastian Parborg <darkdefende@gmail.com>2021-01-19 20:12:34 +0300
commit40e089716b28fc49ce83603ea2df215aed5f6792 (patch)
treedd9897897eb39e3849ec5755cd00c65f2e130709
parent9a32c7130b7c17de54335327d3b75d10f43edca4 (diff)
parent05179a0ba4898c716a4b9b2d5e169c09b57e84fb (diff)
Merge branch 'blender-v2.92-release'
-rw-r--r--source/blender/blenkernel/intern/volume.cc15
-rw-r--r--source/blender/blenloader/intern/versioning_290.c17
-rw-r--r--source/blender/editors/space_node/drawnode.c8
-rw-r--r--source/blender/makesdna/DNA_node_types.h12
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c30
-rw-r--r--source/blender/nodes/NOD_static_types.h2
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_object_info.cc30
7 files changed, 104 insertions, 10 deletions
diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc
index eadb01c43fc..9e7a3736141 100644
--- a/source/blender/blenkernel/intern/volume.cc
+++ b/source/blender/blenkernel/intern/volume.cc
@@ -783,21 +783,22 @@ bool BKE_volume_load(Volume *volume, Main *bmain)
/* Get absolute file path at current frame. */
const char *volume_name = volume->id.name + 2;
- volume_filepath_get(bmain, volume, grids.filepath);
+ char filepath[FILE_MAX];
+ volume_filepath_get(bmain, volume, filepath);
- CLOG_INFO(&LOG, 1, "Volume %s: load %s", volume_name, grids.filepath);
+ CLOG_INFO(&LOG, 1, "Volume %s: load %s", volume_name, filepath);
/* Test if file exists. */
- if (!BLI_exists(grids.filepath)) {
+ if (!BLI_exists(filepath)) {
char filename[FILE_MAX];
- BLI_split_file_part(grids.filepath, filename, sizeof(filename));
+ BLI_split_file_part(filepath, filename, sizeof(filename));
grids.error_msg = filename + std::string(" not found");
CLOG_INFO(&LOG, 1, "Volume %s: %s", volume_name, grids.error_msg.c_str());
return false;
}
/* Open OpenVDB file. */
- openvdb::io::File file(grids.filepath);
+ openvdb::io::File file(filepath);
openvdb::GridPtrVec vdb_grids;
try {
@@ -814,11 +815,13 @@ bool BKE_volume_load(Volume *volume, Main *bmain)
/* Add grids read from file to own vector, filtering out any NULL pointers. */
for (const openvdb::GridBase::Ptr &vdb_grid : vdb_grids) {
if (vdb_grid) {
- VolumeFileCache::Entry template_entry(grids.filepath, vdb_grid);
+ VolumeFileCache::Entry template_entry(filepath, vdb_grid);
grids.emplace_back(template_entry, volume->runtime.default_simplify_level);
}
}
+ BLI_strncpy(grids.filepath, filepath, FILE_MAX);
+
return grids.error_msg.empty();
#else
UNUSED_VARS(bmain, volume);
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index 33aa472a5e5..ce73ac6fd7b 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -1572,6 +1572,23 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
+ if (!MAIN_VERSION_ATLEAST(bmain, 292, 14)) {
+ FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
+ if (ntree->type != NTREE_GEOMETRY) {
+ continue;
+ }
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ if (node->type == GEO_NODE_OBJECT_INFO && node->storage == NULL) {
+ NodeGeometryObjectInfo *data = (NodeGeometryObjectInfo *)MEM_callocN(
+ sizeof(NodeGeometryObjectInfo), __func__);
+ data->transform_space = GEO_NODE_TRANSFORM_SPACE_RELATIVE;
+ node->storage = data;
+ }
+ }
+ }
+ FOREACH_NODETREE_END;
+ }
+
/**
* Versioning code until next subversion bump goes here.
*
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index bf4bc6d37eb..c42b8f78952 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -3284,6 +3284,11 @@ static void node_geometry_buts_point_scale(uiLayout *layout, bContext *UNUSED(C)
uiItemR(layout, ptr, "input_type", DEFAULT_FLAGS, IFACE_("Type"), ICON_NONE);
}
+static void node_geometry_buts_object_info(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+}
+
static void node_geometry_set_butfunc(bNodeType *ntype)
{
switch (ntype->type) {
@@ -3335,6 +3340,9 @@ static void node_geometry_set_butfunc(bNodeType *ntype)
case GEO_NODE_POINT_SCALE:
ntype->draw_buttons = node_geometry_buts_point_scale;
break;
+ case GEO_NODE_OBJECT_INFO:
+ ntype->draw_buttons = node_geometry_buts_object_info;
+ break;
}
}
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index b6904f6ae5b..7d18ff3ed58 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1167,6 +1167,13 @@ typedef struct NodeGeometryPointTranslate {
char _pad[7];
} NodeGeometryPointTranslate;
+typedef struct NodeGeometryObjectInfo {
+ /* GeometryNodeTransformSpace. */
+ uint8_t transform_space;
+
+ char _pad[7];
+} NodeGeometryObjectInfo;
+
/* script node mode */
#define NODE_SCRIPT_INTERNAL 0
#define NODE_SCRIPT_EXTERNAL 1
@@ -1608,6 +1615,11 @@ typedef enum GeometryNodeAlignRotationToVectorAxis {
GEO_NODE_ALIGN_ROTATION_TO_VECTOR_AXIS_Z = 2,
} GeometryNodeAlignRotationToVectorAxis;
+typedef enum GeometryNodeTransformSpace {
+ GEO_NODE_TRANSFORM_SPACE_ORIGINAL = 0,
+ GEO_NODE_TRANSFORM_SPACE_RELATIVE = 1,
+} GeometryNodeTransformSpace;
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index a01f6b2db5d..6480b80056c 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -494,6 +494,22 @@ static const EnumPropertyItem rna_node_geometry_attribute_input_type_items_no_bo
{0, NULL, 0, NULL, NULL},
};
+static const EnumPropertyItem rna_node_geometry_object_info_transform_space_items[] = {
+ {GEO_NODE_TRANSFORM_SPACE_ORIGINAL,
+ "ORIGINAL",
+ 0,
+ "Original",
+ "Output the geometry relative to the input object transform, and the location, rotation and "
+ "scale relative to the world origin"},
+ {GEO_NODE_TRANSFORM_SPACE_RELATIVE,
+ "RELATIVE",
+ 0,
+ "Relative",
+ "Bring the input object geometry, location, rotation and scale into the modified object, "
+ "maintaining the relative position between the two objects in the scene"},
+ {0, NULL, 0, NULL, NULL},
+};
+
#endif
#undef ITEM_ATTRIBUTE
@@ -8846,6 +8862,20 @@ static void def_geo_point_translate(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
}
+static void def_geo_object_info(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeGeometryObjectInfo", "storage");
+
+ prop = RNA_def_property(srna, "transform_space", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rna_node_geometry_object_info_transform_space_items);
+ RNA_def_property_ui_text(prop,
+ "Transform Space",
+ "Determine the transformation applied to vector and geometry outputs");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+}
+
/* -------------------------------------------------------------------------- */
static void rna_def_shader_node(BlenderRNA *brna)
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index f58dca18325..e91b385a87e 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -275,7 +275,7 @@ DefNode(GeometryNode, GEO_NODE_SUBDIVISION_SURFACE, 0, "SUBDIVISION_SURFACE", Su
DefNode(GeometryNode, GEO_NODE_BOOLEAN, def_geo_boolean, "BOOLEAN", Boolean, "Boolean", "")
DefNode(GeometryNode, GEO_NODE_POINT_DISTRIBUTE, def_geo_point_distribute, "POINT_DISTRIBUTE", PointDistribute, "Point Distribute", "")
DefNode(GeometryNode, GEO_NODE_POINT_INSTANCE, def_geo_point_instance, "POINT_INSTANCE", PointInstance, "Point Instance", "")
-DefNode(GeometryNode, GEO_NODE_OBJECT_INFO, 0, "OBJECT_INFO", ObjectInfo, "Object Info", "")
+DefNode(GeometryNode, GEO_NODE_OBJECT_INFO, def_geo_object_info, "OBJECT_INFO", ObjectInfo, "Object Info", "")
DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_RANDOMIZE, def_geo_attribute_randomize, "ATTRIBUTE_RANDOMIZE", AttributeRandomize, "Attribute Randomize", "")
DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_MATH, def_geo_attribute_math, "ATTRIBUTE_MATH", AttributeMath, "Attribute Math", "")
DefNode(GeometryNode, GEO_NODE_JOIN_GEOMETRY, 0, "JOIN_GEOMETRY", JoinGeometry, "Join Geometry", "")
diff --git a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc
index 07d6858369d..ab5e4f8964a 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc
@@ -38,6 +38,11 @@ static bNodeSocketTemplate geo_node_object_info_out[] = {
namespace blender::nodes {
static void geo_node_object_info_exec(GeoNodeExecParams params)
{
+ const bNode &bnode = params.node();
+ NodeGeometryObjectInfo *node_storage = (NodeGeometryObjectInfo *)bnode.storage;
+ const bool transform_space_relative = (node_storage->transform_space ==
+ GEO_NODE_TRANSFORM_SPACE_RELATIVE);
+
bke::PersistentObjectHandle object_handle = params.extract_input<bke::PersistentObjectHandle>(
"Object");
Object *object = params.handle_map().lookup(object_handle);
@@ -54,7 +59,12 @@ static void geo_node_object_info_exec(GeoNodeExecParams params)
mul_m4_m4m4(transform, self_object->imat, object->obmat);
float quaternion[4];
- mat4_decompose(location, quaternion, scale, transform);
+ if (transform_space_relative) {
+ mat4_decompose(location, quaternion, scale, transform);
+ }
+ else {
+ mat4_decompose(location, quaternion, scale, object->obmat);
+ }
quat_to_eul(rotation, quaternion);
if (object != self_object) {
@@ -66,8 +76,10 @@ static void geo_node_object_info_exec(GeoNodeExecParams params)
/* Make a copy because the life time of the other mesh might be shorter. */
Mesh *copied_mesh = BKE_mesh_copy_for_eval(mesh, false);
- /* Transform into the local space of the object that is being modified. */
- BKE_mesh_transform(copied_mesh, transform, true);
+ if (transform_space_relative) {
+ /* Transform into the local space of the object that is being modified. */
+ BKE_mesh_transform(copied_mesh, transform, true);
+ }
MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
mesh_component.replace(copied_mesh);
@@ -82,6 +94,15 @@ static void geo_node_object_info_exec(GeoNodeExecParams params)
params.set_output("Scale", scale);
params.set_output("Geometry", geometry_set);
}
+
+static void geo_node_object_info_node_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+ NodeGeometryObjectInfo *data = (NodeGeometryObjectInfo *)MEM_callocN(
+ sizeof(NodeGeometryObjectInfo), __func__);
+ data->transform_space = GEO_NODE_TRANSFORM_SPACE_ORIGINAL;
+ node->storage = data;
+}
+
} // namespace blender::nodes
void register_node_type_geo_object_info()
@@ -90,6 +111,9 @@ void register_node_type_geo_object_info()
geo_node_type_base(&ntype, GEO_NODE_OBJECT_INFO, "Object Info", NODE_CLASS_INPUT, 0);
node_type_socket_templates(&ntype, geo_node_object_info_in, geo_node_object_info_out);
+ node_type_init(&ntype, blender::nodes::geo_node_object_info_node_init);
+ node_type_storage(
+ &ntype, "NodeGeometryObjectInfo", node_free_standard_storage, node_copy_standard_storage);
ntype.geometry_node_execute = blender::nodes::geo_node_object_info_exec;
nodeRegisterType(&ntype);
}