This is essentially a left-over from the initial transition to fields where this was forgotten. The mesh primitive nodes used to create a named uv map attribute with a hard-coded name. The standard way to deal with that in geometry nodes now is to output the attribute as a socket instead. The user can then decide to store it as a named attribute or not. The benefits of not always storing the named attribute in the node are: * Improved performance and lower memory usage when the uv map is not used. * It's more obvious that there actually is a uv map. * The hard-coded name was inconsistent. The versioning code inserts a new Store Named Attribute node that stores the uv map immediatly. In many cases, users can probably just remove this node without affecting their final result, but we can't detect that. There is one behavior change which is that the stored uv map will be a 3d vector instead of a 2d vector which is what the nodes originally created. We could store the uv map as 2d vector inthe Store Named Attribute node, but that has the problem that older Blender versions don't support this and would crash immediately. Users can just change this to 2d vector manually if they don't care about forward compatibility. There is a plan to support 2d vectors more natively in geometry nodes: T92765. This change breaks forward compatibility in the case when the uv map was used. Differential Revision: https://developer.blender.org/D16637
117 lines
4.1 KiB
C++
117 lines
4.1 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
#include <string.h>
|
|
|
|
#include "BLI_math_vec_types.hh"
|
|
#include "BLI_utildefines.h"
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
#include "DNA_node_types.h"
|
|
|
|
#include "BKE_node.h"
|
|
|
|
#include "BLT_translation.h"
|
|
|
|
#include "NOD_geometry.h"
|
|
#include "NOD_geometry_exec.hh"
|
|
#include "NOD_socket_declarations.hh"
|
|
#include "NOD_socket_declarations_geometry.hh"
|
|
|
|
#include "RNA_access.h"
|
|
|
|
#include "node_geometry_register.hh"
|
|
#include "node_util.h"
|
|
|
|
struct BVHTreeFromMesh;
|
|
|
|
void geo_node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass);
|
|
bool geo_node_poll_default(struct bNodeType *ntype,
|
|
struct bNodeTree *ntree,
|
|
const char **r_disabled_hint);
|
|
|
|
namespace blender::nodes {
|
|
|
|
void transform_mesh(Mesh &mesh,
|
|
const float3 translation,
|
|
const float3 rotation,
|
|
const float3 scale);
|
|
|
|
void transform_geometry_set(GeoNodeExecParams ¶ms,
|
|
GeometrySet &geometry,
|
|
const float4x4 &transform,
|
|
const Depsgraph &depsgraph);
|
|
|
|
Mesh *create_line_mesh(const float3 start, const float3 delta, int count);
|
|
|
|
Mesh *create_grid_mesh(
|
|
int verts_x, int verts_y, float size_x, float size_y, const AttributeIDRef &uv_map_id);
|
|
|
|
struct ConeAttributeOutputs {
|
|
StrongAnonymousAttributeID top_id;
|
|
StrongAnonymousAttributeID bottom_id;
|
|
StrongAnonymousAttributeID side_id;
|
|
StrongAnonymousAttributeID uv_map_id;
|
|
};
|
|
|
|
Mesh *create_cylinder_or_cone_mesh(float radius_top,
|
|
float radius_bottom,
|
|
float depth,
|
|
int circle_segments,
|
|
int side_segments,
|
|
int fill_segments,
|
|
GeometryNodeMeshCircleFillType fill_type,
|
|
ConeAttributeOutputs &attribute_outputs);
|
|
|
|
/**
|
|
* Copies the point domain attributes from `in_component` that are in the mask to `out_component`.
|
|
*/
|
|
void copy_point_attributes_based_on_mask(const GeometryComponent &in_component,
|
|
GeometryComponent &result_component,
|
|
Span<bool> masks,
|
|
bool invert);
|
|
/**
|
|
* Returns the parts of the geometry that are on the selection for the given domain. If the domain
|
|
* is not applicable for the component, e.g. face domain for point cloud, nothing happens to that
|
|
* component. If no component can work with the domain, then `error_message` is set to true.
|
|
*/
|
|
void separate_geometry(GeometrySet &geometry_set,
|
|
eAttrDomain domain,
|
|
GeometryNodeDeleteGeometryMode mode,
|
|
const Field<bool> &selection_field,
|
|
bool &r_is_error);
|
|
|
|
void get_closest_in_bvhtree(BVHTreeFromMesh &tree_data,
|
|
const VArray<float3> &positions,
|
|
const IndexMask mask,
|
|
const MutableSpan<int> r_indices,
|
|
const MutableSpan<float> r_distances_sq,
|
|
const MutableSpan<float3> r_positions);
|
|
|
|
int apply_offset_in_cyclic_range(IndexRange range, int start_index, int offset);
|
|
|
|
std::optional<eCustomDataType> node_data_type_to_custom_data_type(eNodeSocketDatatype type);
|
|
std::optional<eCustomDataType> node_socket_to_custom_data_type(const bNodeSocket &socket);
|
|
|
|
class FieldAtIndexInput final : public bke::GeometryFieldInput {
|
|
private:
|
|
Field<int> index_field_;
|
|
GField value_field_;
|
|
eAttrDomain value_field_domain_;
|
|
|
|
public:
|
|
FieldAtIndexInput(Field<int> index_field, GField value_field, eAttrDomain value_field_domain);
|
|
|
|
GVArray get_varray_for_context(const bke::GeometryFieldContext &context,
|
|
const IndexMask mask) const final;
|
|
|
|
std::optional<eAttrDomain> preferred_domain(const GeometryComponent & /*component*/) const final
|
|
{
|
|
return value_field_domain_;
|
|
}
|
|
};
|
|
|
|
} // namespace blender::nodes
|