Add Active Camera geometry node #106065
@ -276,6 +276,7 @@ class NODE_MT_geometry_node_GEO_INPUT_SCENE(Menu):
|
|||||||
|
|
||||||
def draw(self, _context):
|
def draw(self, _context):
|
||||||
layout = self.layout
|
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, "GeometryNodeCollectionInfo")
|
||||||
node_add_menu.add_node_type(layout, "GeometryNodeImageInfo")
|
node_add_menu.add_node_type(layout, "GeometryNodeImageInfo")
|
||||||
node_add_menu.add_node_type(layout, "GeometryNodeIsViewport")
|
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. */
|
* the repeat zone. */
|
||||||
#define GEO_NODE_REPEAT_INPUT 2107
|
#define GEO_NODE_REPEAT_INPUT 2107
|
||||||
#define GEO_NODE_REPEAT_OUTPUT 2108
|
#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);
|
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));
|
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);
|
BKE_screen_view3d_scene_sync(screen, scene);
|
||||||
}
|
}
|
||||||
DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE);
|
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
|
#endif
|
||||||
|
|
||||||
|
@ -266,6 +266,9 @@ static int view3d_setobjectascamera_exec(bContext *C, wmOperator *op)
|
|||||||
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, scene);
|
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;
|
return OPERATOR_FINISHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,9 +182,18 @@ static bool node_needs_own_transform_relation(const bNode &node)
|
|||||||
return false;
|
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,
|
static void process_nodes_for_depsgraph(const bNodeTree &tree,
|
||||||
Set<ID *> &ids,
|
Set<ID *> &ids,
|
||||||
bool &r_needs_own_transform_relation,
|
bool &r_needs_own_transform_relation,
|
||||||
|
bool &r_needs_camera_transform_relation,
|
||||||
Set<const bNodeTree *> &checked_groups)
|
Set<const bNodeTree *> &checked_groups)
|
||||||
{
|
{
|
||||||
if (!checked_groups.add(&tree)) {
|
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->inputs, ids);
|
||||||
add_used_ids_from_sockets(node->outputs, ids);
|
add_used_ids_from_sockets(node->outputs, ids);
|
||||||
r_needs_own_transform_relation |= node_needs_own_transform_relation(*node);
|
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()) {
|
for (const bNode *node : tree.group_nodes()) {
|
||||||
if (const bNodeTree *sub_tree = reinterpret_cast<const bNodeTree *>(node->id)) {
|
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");
|
DEG_add_node_tree_output_relation(ctx->node, nmd->node_group, "Nodes Modifier");
|
||||||
|
|
||||||
bool needs_own_transform_relation = false;
|
bool needs_own_transform_relation = false;
|
||||||
|
bool needs_camera_transform_relation = false;
|
||||||
Set<ID *> used_ids;
|
Set<ID *> used_ids;
|
||||||
find_used_ids_from_settings(nmd->settings, used_ids);
|
find_used_ids_from_settings(nmd->settings, used_ids);
|
||||||
Set<const bNodeTree *> checked_groups;
|
Set<const bNodeTree *> checked_groups;
|
||||||
process_nodes_for_depsgraph(
|
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) {
|
if (ctx->object->type == OB_CURVES) {
|
||||||
Curves *curves_id = static_cast<Curves *>(ctx->object->data);
|
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) {
|
if (needs_own_transform_relation) {
|
||||||
DEG_add_depends_on_transform_relation(ctx->node, "Nodes Modifier");
|
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)
|
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(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_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_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_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")
|
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_blur_attribute.cc
|
||||||
nodes/node_geo_boolean.cc
|
nodes/node_geo_boolean.cc
|
||||||
nodes/node_geo_bounding_box.cc
|
nodes/node_geo_bounding_box.cc
|
||||||
|
nodes/node_geo_active_camera.cc
|
||||||
nodes/node_geo_collection_info.cc
|
nodes/node_geo_collection_info.cc
|
||||||
nodes/node_geo_common.cc
|
nodes/node_geo_common.cc
|
||||||
nodes/node_geo_convex_hull.cc
|
nodes/node_geo_convex_hull.cc
|
||||||
|
@ -13,6 +13,7 @@ void register_geometry_nodes()
|
|||||||
register_node_type_geo_group();
|
register_node_type_geo_group();
|
||||||
|
|
||||||
register_node_type_geo_accumulate_field();
|
register_node_type_geo_accumulate_field();
|
||||||
|
register_node_type_geo_active_camera();
|
||||||
register_node_type_geo_attribute_capture();
|
register_node_type_geo_attribute_capture();
|
||||||
register_node_type_geo_attribute_domain_size();
|
register_node_type_geo_attribute_domain_size();
|
||||||
register_node_type_geo_attribute_statistic();
|
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_group();
|
||||||
|
|
||||||
void register_node_type_geo_accumulate_field();
|
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_capture();
|
||||||
void register_node_type_geo_attribute_domain_size();
|
void register_node_type_geo_attribute_domain_size();
|
||||||
void register_node_type_geo_attribute_separate_xyz();
|
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