19 b.add_input<
decl::Bool>(
N_(
"Selection")).default_value(
true).hide_value().supports_field();
33 const int grain_size = 10000;
43 for (const int i : selection.slice(range)) {
44 const float3 offset = in_offsets[i];
45 add_v3_v3(mverts[i].co, offset);
52 in_positions, in_offsets, [&](
const auto in_positions,
const auto in_offsets) {
55 for (const int i : selection.slice(range)) {
56 const float3 new_position = in_positions[i] + in_offsets[i];
57 copy_v3_v3(mverts[i].co, new_position);
68 if (attributes.contains(
"handle_right") && attributes.contains(
"handle_left")) {
76 in_positions, in_offsets, [&](
const auto in_positions,
const auto in_offsets) {
78 selection.index_range(), grain_size, [&](
const IndexRange range) {
79 for (const int i : selection.slice(range)) {
80 const float3 new_position = in_positions[i] + in_offsets[i];
81 const float3 delta = new_position - out_positions_span[i];
82 handle_right_attribute.span[i] += delta;
83 handle_left_attribute.span[i] += delta;
84 out_positions_span[i] = new_position;
89 out_positions_span.save();
90 handle_right_attribute.
finish();
91 handle_left_attribute.finish();
94 curves.calculate_bezier_auto_handles();
102 MutableVArraySpan<float3> out_positions_span =
positions.varray;
103 if (in_positions.is_same(
positions.varray)) {
106 selection.index_range(), grain_size, [&](
const IndexRange range) {
107 for (const int i : selection.slice(range)) {
108 out_positions_span[i] += in_offsets[i];
115 in_positions, in_offsets, [&](
const auto in_positions,
const auto in_offsets) {
117 selection.index_range(), grain_size, [&](
const IndexRange range) {
118 for (const int i : selection.slice(range)) {
119 out_positions_span[i] = in_positions[i] + in_offsets[i];
124 out_positions_span.save();
140 const int domain_size =
component.attribute_domain_size(domain);
141 if (domain_size == 0) {
147 evaluator.add(position_field);
148 evaluator.add(offset_field);
149 evaluator.evaluate();
151 const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
175 params.set_output(
"Geometry", std::move(geometry));
Low-level operations for curves.
@ GEO_COMPONENT_TYPE_MESH
@ GEO_COMPONENT_TYPE_POINT_CLOUD
@ GEO_COMPONENT_TYPE_INSTANCES
@ GEO_COMPONENT_TYPE_CURVE
#define GEO_NODE_SET_POSITION
#define NODE_CLASS_GEOMETRY
void nodeRegisterType(struct bNodeType *ntype)
static uint8 component(Color32 c, uint i)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to curves
IndexRange index_range() const
bool is_same(const VArrayCommon< T > &other) const
static CurvesGeometry & wrap(::CurvesGeometry &dna_struct)
GAttributeWriter lookup_for_write(const AttributeIDRef &attribute_id)
void set_selection(Field< bool > selection)
static void node_geo_exec(GeoNodeExecParams params)
static void node_declare(NodeDeclarationBuilder &b)
static void set_computed_position_and_offset(GeometryComponent &component, const VArray< float3 > &in_positions, const VArray< float3 > &in_offsets, const IndexMask selection)
static void set_position_in_component(GeometryComponent &component, const Field< bool > &selection_field, const Field< float3 > &position_field, const Field< float3 > &offset_field)
void parallel_for(IndexRange range, int64_t grain_size, const Function &function)
void devirtualize_varray(const VArray< T > &varray, const Func &func, bool enable=true)
void devirtualize_varray2(const VArray< T1 > &varray1, const VArray< T2 > &varray2, const Func &func, bool enable=true)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
MutableSpan< float3 > positions
void register_node_type_geo_set_position()
void geo_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
GeometryComponent & get_component_for_write(GeometryComponentType component_type)
bool has(const GeometryComponentType component_type) const
NodeGeometryExecFunction geometry_node_execute
NodeDeclareFunction declare