35#include "RNA_prototypes.hh"
70 bool do_add_own_transform =
false;
75 do_add_own_transform =
true;
78 if (do_add_own_transform) {
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;
195 const Span<int> corner_verts = mesh->corner_verts();
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 layout->
prop_search(
ptr,
"uv_layer", &obj_data_ptr,
"uv_layers", std::nullopt, ICON_GROUP_UVS);
311 bool has_camera =
false;
321 sub = &layout->
column(
true);
326 sub = &layout->
column(
true);
333 layout->
prop(&projector_ptr,
"object",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
348 "UVProjectModifierData",
350 &RNA_UVProjectModifier,
std::string BKE_attribute_calc_unique_name(const AttributeOwner &owner, 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(*)(void *user_data, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag cb_flag) IDWalkFunc
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_uvproject_from_camera(float target[2], float source[3], struct ProjCameraInfo *uci)
void BKE_uvproject_camera_info_scale(ProjCameraInfo *uci, float scale_x, float scale_y)
struct ProjCameraInfo * BKE_uvproject_camera_info(const struct Object *ob, const float rotmat[4][4], float winx, float winy)
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 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])
void unit_m4(float m[4][4])
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 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)
@ eModifierType_UVProject
#define MOD_UVPROJECT_MAXPROJECTORS
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
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 void panel_draw(const bContext *, Panel *panel)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_error_message_draw(uiLayout *layout, PointerRNA *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)
#define RNA_BEGIN(sptr, itemptr, propname)
static AttributeOwner from_id(ID *id)
constexpr Span slice(int64_t start, int64_t size) const
constexpr int64_t size() const
constexpr bool is_empty() const
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, AttrType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
static void update_depsgraph(tGraphSliderOp *gso)
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)
MeshRuntimeHandle * runtime
struct Object * projectors[10]
MutableVArraySpan< T > span
uiLayout & column(bool align)
void prop_search(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *searchptr, PropertyRNA *searchprop, PropertyRNA *item_searchpropname, std::optional< blender::StringRefNull > name, int icon, bool results_are_suggestions)
void active_set(bool active)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)