Add Active Camera geometry node #106065
@ -276,6 +276,7 @@ class NODE_MT_geometry_node_GEO_INPUT_SCENE(Menu):
|
||||
|
||||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeActiveCamera")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeCollectionInfo")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeImageInfo")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeIsViewport")
|
||||
|
@ -1364,6 +1364,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i
|
||||
* the repeat zone. */
|
||||
#define GEO_NODE_REPEAT_INPUT 2107
|
||||
#define GEO_NODE_REPEAT_OUTPUT 2108
|
||||
#define GEO_NODE_ACTIVE_CAMERA 2109
|
||||
|
||||
/** \} */
|
||||
|
||||
|
@ -2483,7 +2483,7 @@ bNode *nodeAddNode(const bContext *C, bNodeTree *ntree, const char *idname)
|
||||
|
||||
BKE_ntree_update_tag_node_new(ntree, node);
|
||||
|
||||
if (ELEM(node->type, GEO_NODE_INPUT_SCENE_TIME, GEO_NODE_SELF_OBJECT, GEO_NODE_SIMULATION_INPUT))
|
||||
if (ELEM(node->type, GEO_NODE_INPUT_SCENE_TIME, GEO_NODE_SELF_OBJECT, GEO_NODE_SIMULATION_INPUT, GEO_NODE_ACTIVE_CAMERA))
|
||||
{
|
||||
DEG_relations_tag_update(CTX_data_main(C));
|
||||
}
|
||||
|
@ -1815,6 +1815,8 @@ void ED_update_for_newframe(Main *bmain, Depsgraph *depsgraph)
|
||||
BKE_screen_view3d_scene_sync(screen, scene);
|
||||
}
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE);
|
||||
DEG_id_tag_update(&scene->camera->id, ID_RECALC_TRANSFORM);
|
||||
DEG_relations_tag_update(bmain);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -266,6 +266,9 @@ static int view3d_setobjectascamera_exec(bContext *C, wmOperator *op)
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, scene);
|
||||
}
|
||||
|
||||
DEG_relations_tag_update(CTX_data_main(C));
|
||||
DEG_id_tag_update(&scene->camera->id, ID_RECALC_TRANSFORM);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
|
@ -182,9 +182,18 @@ static bool node_needs_own_transform_relation(const bNode &node)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool node_needs_camera_transform_relation(const bNode &node) {
|
||||
if (node.type == GEO_NODE_ACTIVE_CAMERA) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void process_nodes_for_depsgraph(const bNodeTree &tree,
|
||||
Set<ID *> &ids,
|
||||
bool &r_needs_own_transform_relation,
|
||||
bool &r_needs_camera_transform_relation,
|
||||
Set<const bNodeTree *> &checked_groups)
|
||||
{
|
||||
if (!checked_groups.add(&tree)) {
|
||||
@ -196,11 +205,13 @@ static void process_nodes_for_depsgraph(const bNodeTree &tree,
|
||||
add_used_ids_from_sockets(node->inputs, ids);
|
||||
add_used_ids_from_sockets(node->outputs, ids);
|
||||
r_needs_own_transform_relation |= node_needs_own_transform_relation(*node);
|
||||
r_needs_camera_transform_relation |= node_needs_camera_transform_relation(*node);
|
||||
}
|
||||
|
||||
for (const bNode *node : tree.group_nodes()) {
|
||||
if (const bNodeTree *sub_tree = reinterpret_cast<const bNodeTree *>(node->id)) {
|
||||
process_nodes_for_depsgraph(*sub_tree, ids, r_needs_own_transform_relation, checked_groups);
|
||||
process_nodes_for_depsgraph(*sub_tree, ids, r_needs_own_transform_relation,
|
||||
r_needs_camera_transform_relation, checked_groups);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -258,11 +269,13 @@ static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphCont
|
||||
DEG_add_node_tree_output_relation(ctx->node, nmd->node_group, "Nodes Modifier");
|
||||
|
||||
bool needs_own_transform_relation = false;
|
||||
bool needs_camera_transform_relation = false;
|
||||
Set<ID *> used_ids;
|
||||
find_used_ids_from_settings(nmd->settings, used_ids);
|
||||
Set<const bNodeTree *> checked_groups;
|
||||
process_nodes_for_depsgraph(
|
||||
*nmd->node_group, used_ids, needs_own_transform_relation, checked_groups);
|
||||
*nmd->node_group, used_ids, needs_own_transform_relation,
|
||||
needs_camera_transform_relation, checked_groups);
|
||||
|
||||
if (ctx->object->type == OB_CURVES) {
|
||||
Curves *curves_id = static_cast<Curves *>(ctx->object->data);
|
||||
@ -299,6 +312,9 @@ static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphCont
|
||||
if (needs_own_transform_relation) {
|
||||
DEG_add_depends_on_transform_relation(ctx->node, "Nodes Modifier");
|
||||
}
|
||||
if (needs_camera_transform_relation && ctx->scene->camera != nullptr) {
|
||||
DEG_add_object_relation(ctx->node, ctx->scene->camera, DEG_OB_COMP_TRANSFORM, "Camera relation!");
|
||||
}
|
||||
}
|
||||
|
||||
static bool check_tree_for_time_node(const bNodeTree &tree, Set<const bNodeTree *> &checked_groups)
|
||||
|
@ -283,6 +283,7 @@ DefNode(FunctionNode, FN_NODE_STRING_LENGTH, 0, "STRING_LENGTH", StringLength, "
|
||||
DefNode(FunctionNode, FN_NODE_VALUE_TO_STRING, 0, "VALUE_TO_STRING", ValueToString, "Value to String", "")
|
||||
|
||||
DefNode(GeometryNode, GEO_NODE_ACCUMULATE_FIELD, def_geo_accumulate_field, "ACCUMULATE_FIELD", AccumulateField, "Accumulate Field", "Add the values of an evaluated field together and output the running total for each element")
|
||||
DefNode(GeometryNode, GEO_NODE_ACTIVE_CAMERA, 0, "ACTIVE_CAMERA", ActiveCamera, "Active Camera", "Retrieve the scene's active camera")
|
||||
DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_DOMAIN_SIZE, def_geo_attribute_domain_size, "ATTRIBUTE_DOMAIN_SIZE", AttributeDomainSize, "Domain Size", "Retrieve the number of elements in a geometry for each attribute domain")
|
||||
DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_STATISTIC, def_geo_attribute_statistic, "ATTRIBUTE_STATISTIC",AttributeStatistic, "Attribute Statistic", "Calculate statistics about a data set from a field evaluated on a geometry")
|
||||
DefNode(GeometryNode, GEO_NODE_BLUR_ATTRIBUTE, def_geo_blur_attribute, "BLUR_ATTRIBUTE", BlurAttribute, "Blur Attribute", "Mix attribute values of neighboring elements")
|
||||
|
@ -32,6 +32,7 @@ set(SRC
|
||||
nodes/node_geo_blur_attribute.cc
|
||||
nodes/node_geo_boolean.cc
|
||||
nodes/node_geo_bounding_box.cc
|
||||
nodes/node_geo_active_camera.cc
|
||||
nodes/node_geo_collection_info.cc
|
||||
nodes/node_geo_common.cc
|
||||
nodes/node_geo_convex_hull.cc
|
||||
|
@ -13,6 +13,7 @@ void register_geometry_nodes()
|
||||
register_node_type_geo_group();
|
||||
|
||||
register_node_type_geo_accumulate_field();
|
||||
register_node_type_geo_active_camera();
|
||||
register_node_type_geo_attribute_capture();
|
||||
register_node_type_geo_attribute_domain_size();
|
||||
register_node_type_geo_attribute_statistic();
|
||||
|
@ -9,6 +9,7 @@ void register_node_tree_type_geo();
|
||||
void register_node_type_geo_group();
|
||||
|
||||
void register_node_type_geo_accumulate_field();
|
||||
void register_node_type_geo_active_camera();
|
||||
void register_node_type_geo_attribute_capture();
|
||||
void register_node_type_geo_attribute_domain_size();
|
||||
void register_node_type_geo_attribute_separate_xyz();
|
||||
|
@ -0,0 +1,32 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "node_geometry_util.hh"
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
namespace blender::nodes::node_geo_active_camera_cc {
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_output<decl::Object>(N_("Active Camera"));
|
||||
}
|
||||
|
||||
static void node_geo_exec(GeoNodeExecParams params)
|
||||
{
|
||||
const Scene *scene = DEG_get_input_scene(params.depsgraph());
|
||||
const Object *camera = DEG_get_original_object(scene->camera);
|
||||
params.set_output("Active Camera", const_cast<Object *>(camera));
|
||||
}
|
||||
|
||||
} // namespace blender::nodes::node_geo_active_camera_cc
|
||||
|
||||
void register_node_type_geo_active_camera()
|
||||
{
|
||||
namespace file_ns = blender::nodes::node_geo_active_camera_cc;
|
||||
|
||||
static bNodeType ntype;
|
||||
|
||||
geo_node_type_base(&ntype, GEO_NODE_ACTIVE_CAMERA, "Active Camera", NODE_CLASS_INPUT);
|
||||
ntype.geometry_node_execute = file_ns::node_geo_exec;
|
||||
ntype.declare = file_ns::node_declare;
|
||||
nodeRegisterType(&ntype);
|
||||
}
|
Loading…
Reference in New Issue
Block a user