35#include "RNA_prototypes.hh"
70 bool do_add_own_transform =
false;
75 do_add_own_transform =
true;
78 if (do_add_own_transform) {
97 return attributes.lookup_or_add_for_write_span<
float2>(name.is_empty() ?
"Float2" : name,
98 bke::AttrDomain::Corner);
101 md_name, bke::AttrDomain::Corner))
107 return attributes.lookup_or_add_for_write_span<
float2>(name, bke::AttrDomain::Corner);
117 int projectors_num = 0;
122 bool free_uci =
false;
130 if (projectors_num == 0) {
140 for (
int i = 0; i < projectors_num; i++) {
142 float offsetmat[4][4];
144 invert_m4_m4(projectors[i].projmat, projectors[i].ob->object_to_world().ptr());
146 projectors[i].
uci =
nullptr;
167 params.viewplane.xmin *= scax;
168 params.viewplane.xmax *= scax;
169 params.viewplane.ymin *= scay;
170 params.viewplane.ymax *= scay;
182 offsetmat[3][0] = offsetmat[3][1] = offsetmat[3][2] = 0.5;
184 mul_m4_m4m4(projectors[i].projmat, offsetmat, tmpmat);
187 projectors[i].
normal[0] = 0;
188 projectors[i].
normal[1] = 0;
189 projectors[i].
normal[2] = 1;
194 const OffsetIndices faces = mesh->faces();
195 const Span<int> corner_verts = mesh->corner_verts();
200 for (
int64_t i = 0; i < positions.size(); i++) {
201 mul_v3_m4v3(coords[i], ob->object_to_world().ptr(), positions[i]);
205 if (projectors_num == 1 && projectors[0].uci ==
nullptr) {
212 for (
const int i : faces.index_range()) {
214 if (projectors_num == 1) {
215 if (projectors[0].uci) {
216 for (
const int corner : face) {
217 const int vert = corner_verts[corner];
219 mloop_uv[corner], coords[vert],
static_cast<ProjCameraInfo *
>(projectors[0].uci));
224 for (
const int corner : face) {
225 const int vert = corner_verts[corner];
238 corner_verts.
slice(face));
243 best_dot =
dot_v3v3(projectors[0].normal, face_no);
244 best_projector = &projectors[0];
246 for (j = 1; j < projectors_num; j++) {
247 float tmp_dot =
dot_v3v3(projectors[j].normal, face_no);
248 if (tmp_dot > best_dot) {
250 best_projector = &projectors[j];
254 if (best_projector->
uci) {
255 for (
const int corner : face) {
256 const int vert = corner_verts[corner];
258 mloop_uv[corner], coords[vert],
static_cast<ProjCameraInfo *
>(best_projector->
uci));
262 for (
const int corner : face) {
263 const int vert = corner_verts[corner];
272 for (j = 0; j < projectors_num; j++) {
273 if (projectors[j].uci) {
281 mesh->runtime->is_original_bmesh =
false;
308 uiItemPointerR(layout,
ptr,
"uv_layer", &obj_data_ptr,
"uv_layers",
nullptr, ICON_GROUP_UVS);
311 bool has_camera =
false;
348 "UVProjectModifierData",
350 &RNA_UVProjectModifier,
std::string BKE_attribute_calc_unique_name(const AttributeOwner &owner, const blender::StringRef name)
Camera data-block and utility functions.
void BKE_camera_params_init(CameraParams *params)
void BKE_camera_params_from_object(CameraParams *params, const struct Object *cam_ob)
void BKE_camera_params_compute_viewplane(CameraParams *params, int winx, int winy, float aspx, float aspy)
void BKE_camera_params_compute_matrix(CameraParams *params)
CustomData interface, see also DNA_customdata_types.h.
const char * CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
void mul_v2_project_m4_v3(float r[2], const float mat[4][4], const float vec[3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_mat3_m4_fl(float R[4][4], float f)
void unit_m4(float m[4][4])
void mul_project_m4_v3(const float mat[4][4], float vec[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void BLI_uvproject_from_camera(float target[2], float source[3], struct ProjCameraInfo *uci)
struct ProjCameraInfo * BLI_uvproject_camera_info(const struct Object *ob, const float rotmat[4][4], float winx, float winy)
void BLI_uvproject_camera_info_scale(struct ProjCameraInfo *uci, float scale_x, float scale_y)
void DEG_add_depends_on_transform_relation(DepsNodeHandle *node_handle, const char *description)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
#define CD_MASK_PROP_FLOAT2
#define DNA_struct_default_get(struct_name)
struct UVProjectModifierData UVProjectModifierData
@ eModifierType_UVProject
#define MOD_UVPROJECT_MAXPROJECTORS
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
static void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void required_data_mask(ModifierData *, CustomData_MeshMasks *r_cddata_masks)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
ModifierTypeInfo modifierType_UVProject
static blender::bke::SpanAttributeWriter< blender::float2 > get_uv_attribute(Mesh &mesh, const blender::StringRef md_name)
static Mesh * uvprojectModifier_do(UVProjectModifierData *umd, const ModifierEvalContext *, Object *ob, Mesh *mesh)
static void panel_draw(const bContext *, Panel *panel)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color attribute
#define RNA_BEGIN(sptr, itemptr, propname)
void uiLayoutSetActive(uiLayout *layout, bool active)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemPointerR(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
static AttributeOwner from_id(ID *id)
constexpr Span slice(int64_t start, int64_t size) const
constexpr bool is_empty() const
void MEM_freeN(void *vmemh)
float3 face_normal_calc(Span< float3 > vert_positions, Span< int > face_verts)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
int RNA_enum_get(PointerRNA *ptr, const char *name)
struct Object * projectors[10]
MutableVArraySpan< T > span