Blender V5.0
MOD_util.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cstring>
10
11#include "BLI_bitmap.h"
12#include "BLI_math_matrix.h"
13#include "BLI_math_vector.h"
14
15#include "DNA_mesh_types.h"
16#include "DNA_modifier_types.h"
17#include "DNA_object_types.h"
18#include "DNA_texture_types.h"
19
20#include "BKE_action.hh" /* BKE_pose_channel_find_name */
21#include "BKE_attribute.hh"
22#include "BKE_customdata.hh"
23#include "BKE_deform.hh"
24#include "BKE_image.hh"
25#include "BKE_lattice.hh"
26
27#include "BKE_modifier.hh"
28
30
31#include "MOD_modifiertypes.hh"
32#include "MOD_util.hh"
33
34#include "MEM_guardedalloc.h"
35
37{
38 Tex *tex = dmd->texture;
39
40 if (tex == nullptr) {
41 return;
42 }
43
44 if (tex->ima && BKE_image_is_animated(tex->ima)) {
46 }
47}
48
50 const ModifierEvalContext * /*ctx*/,
51 Object *ob,
52 Mesh *mesh,
53 float (*cos)[3],
54 float (*r_texco)[3])
55{
56 /* TODO: to be renamed to `get_texture_coords` once we are done with moving modifiers to Mesh. */
57
58 using namespace blender;
59 const int verts_num = mesh->verts_num;
60 int i;
61 int texmapping = dmd->texmapping;
62 float mapref_imat[4][4];
63
64 if (texmapping == MOD_DISP_MAP_OBJECT) {
65 if (dmd->map_object != nullptr) {
66 Object *map_object = dmd->map_object;
67 if (dmd->map_bone[0] != '\0') {
68 bPoseChannel *pchan = BKE_pose_channel_find_name(map_object->pose, dmd->map_bone);
69 if (pchan) {
70 float mat_bone_world[4][4];
71 mul_m4_m4m4(mat_bone_world, map_object->object_to_world().ptr(), pchan->pose_mat);
72 invert_m4_m4(mapref_imat, mat_bone_world);
73 }
74 else {
75 invert_m4_m4(mapref_imat, map_object->object_to_world().ptr());
76 }
77 }
78 else {
79 invert_m4_m4(mapref_imat, map_object->object_to_world().ptr());
80 }
81 }
82 else { /* if there is no map object, default to local */
83 texmapping = MOD_DISP_MAP_LOCAL;
84 }
85 }
86
87 /* UVs need special handling, since they come from faces */
88 if (texmapping == MOD_DISP_MAP_UV) {
90 const OffsetIndices faces = mesh->faces();
91 const Span<int> corner_verts = mesh->corner_verts();
92 BLI_bitmap *done = BLI_BITMAP_NEW(verts_num, __func__);
93 char uvname[MAX_CUSTOMDATA_LAYER_NAME];
95 &mesh->corner_data, CD_PROP_FLOAT2, dmd->uvlayer_name, uvname);
96 const bke::AttributeAccessor attributes = mesh->attributes();
97 const VArraySpan uv_map = *attributes.lookup_or_default<float2>(
99
100 /* verts are given the UV from the first face that uses them */
101 for (const int i : faces.index_range()) {
102 const IndexRange face = faces[i];
103 for (const int corner : face) {
104 const int vert = corner_verts[corner];
105 if (!BLI_BITMAP_TEST(done, vert)) {
106 /* remap UVs from [0, 1] to [-1, 1] */
107 r_texco[vert][0] = (uv_map[corner][0] * 2.0f) - 1.0f;
108 r_texco[vert][1] = (uv_map[corner][1] * 2.0f) - 1.0f;
109 BLI_BITMAP_ENABLE(done, vert);
110 }
111 }
112 }
113
114 MEM_freeN(done);
115 return;
116 }
117
118 /* if there are no UVs, default to local */
119 texmapping = MOD_DISP_MAP_LOCAL;
120 }
121
122 const Span<float3> positions = mesh->vert_positions();
123 for (i = 0; i < verts_num; i++, r_texco++) {
124 switch (texmapping) {
126 copy_v3_v3(*r_texco, cos != nullptr ? *cos : positions[i]);
127 break;
129 mul_v3_m4v3(*r_texco, ob->object_to_world().ptr(), cos != nullptr ? *cos : positions[i]);
130 break;
132 mul_v3_m4v3(*r_texco, ob->object_to_world().ptr(), cos != nullptr ? *cos : positions[i]);
133 mul_m4_v3(mapref_imat, *r_texco);
134 break;
135 }
136 if (cos != nullptr) {
137 cos++;
138 }
139 }
140}
141
142void MOD_previous_vcos_store(ModifierData *md, const float (*vert_coords)[3])
143{
144 while ((md = md->next) && md->type == eModifierType_Armature) {
146 if (amd->multi && amd->vert_coords_prev == nullptr) {
147 amd->vert_coords_prev = static_cast<float (*)[3]>(MEM_dupallocN(vert_coords));
148 }
149 else {
150 break;
151 }
152 }
153 /* lattice/mesh modifier too */
154}
155
156void MOD_get_vgroup(const Object *ob,
157 const Mesh *mesh,
158 const char *name,
159 const MDeformVert **dvert,
160 int *defgrp_index)
161{
162 if (mesh) {
163 *defgrp_index = BKE_id_defgroup_name_index(&mesh->id, name);
164 if (*defgrp_index != -1) {
165 *dvert = mesh->deform_verts().data();
166 }
167 else {
168 *dvert = nullptr;
169 }
170 }
171 else if (OB_TYPE_SUPPORT_VGROUP(ob->type)) {
172 *defgrp_index = BKE_object_defgroup_name_index(ob, name);
173 if (*defgrp_index != -1 && ob->type == OB_LATTICE) {
174 *dvert = BKE_lattice_deform_verts_get(ob);
175 }
176 else {
177 *dvert = nullptr;
178 }
179 }
180 else {
181 *defgrp_index = -1;
182 *dvert = nullptr;
183 }
184}
185
187 Object *object,
188 const char *bonename,
189 const char *description)
190{
191 if (object == nullptr) {
192 return;
193 }
194 if (bonename[0] != '\0' && object->type == OB_ARMATURE) {
195 DEG_add_object_relation(node, object, DEG_OB_COMP_EVAL_POSE, description);
196 }
197 else {
198 DEG_add_object_relation(node, object, DEG_OB_COMP_TRANSFORM, description);
199 }
200}
201
203{
204#define INIT_TYPE(typeName) (types[eModifierType_##typeName] = &modifierType_##typeName)
208 INIT_TYPE(Subsurf);
209 INIT_TYPE(Build);
211 INIT_TYPE(Mirror);
212 INIT_TYPE(EdgeSplit);
213 INIT_TYPE(Bevel);
214 INIT_TYPE(Displace);
215 INIT_TYPE(UVProject);
216 INIT_TYPE(Decimate);
217 INIT_TYPE(Smooth);
218 INIT_TYPE(Cast);
219 INIT_TYPE(Wave);
220 INIT_TYPE(Armature);
221 INIT_TYPE(Hook);
222 INIT_TYPE(Softbody);
224 INIT_TYPE(Collision);
225 INIT_TYPE(Boolean);
226 INIT_TYPE(MeshDeform);
229 INIT_TYPE(ParticleInstance);
230 INIT_TYPE(Explode);
231 INIT_TYPE(Shrinkwrap);
233 INIT_TYPE(SimpleDeform);
234 INIT_TYPE(Multires);
235 INIT_TYPE(Surface);
236 INIT_TYPE(Fluid);
237 INIT_TYPE(ShapeKey);
238 INIT_TYPE(Solidify);
239 INIT_TYPE(Screw);
240 INIT_TYPE(Warp);
241 INIT_TYPE(WeightVGEdit);
242 INIT_TYPE(WeightVGMix);
243 INIT_TYPE(WeightVGProximity);
244 INIT_TYPE(DynamicPaint);
245 INIT_TYPE(Remesh);
246 INIT_TYPE(Skin);
247 INIT_TYPE(LaplacianSmooth);
248 INIT_TYPE(Triangulate);
249 INIT_TYPE(UVWarp);
250 INIT_TYPE(MeshCache);
251 INIT_TYPE(LaplacianDeform);
252 INIT_TYPE(Wireframe);
253 INIT_TYPE(Weld);
254 INIT_TYPE(DataTransfer);
255 INIT_TYPE(NormalEdit);
256 INIT_TYPE(CorrectiveSmooth);
257 INIT_TYPE(MeshSequenceCache);
258 INIT_TYPE(SurfaceDeform);
259 INIT_TYPE(WeightedNormal);
260 INIT_TYPE(MeshToVolume);
261 INIT_TYPE(VolumeDisplace);
262 INIT_TYPE(VolumeToMesh);
263 INIT_TYPE(Nodes);
264 INIT_TYPE(GreasePencilOpacity);
265 INIT_TYPE(GreasePencilSubdiv);
266 INIT_TYPE(GreasePencilColor);
267 INIT_TYPE(GreasePencilTint);
268 INIT_TYPE(GreasePencilSmooth);
269 INIT_TYPE(GreasePencilOffset);
270 INIT_TYPE(GreasePencilNoise);
271 INIT_TYPE(GreasePencilMirror);
272 INIT_TYPE(GreasePencilThickness);
273 INIT_TYPE(GreasePencilLattice);
274 INIT_TYPE(GreasePencilDash);
275 INIT_TYPE(GreasePencilMultiply);
276 INIT_TYPE(GreasePencilLength);
277 INIT_TYPE(GreasePencilWeightAngle);
278 INIT_TYPE(GreasePencilArray);
279 INIT_TYPE(GreasePencilWeightProximity);
280 INIT_TYPE(GreasePencilHook);
281 INIT_TYPE(GreasePencilLineart);
282 INIT_TYPE(GreasePencilArmature);
283 INIT_TYPE(GreasePencilTime);
284 INIT_TYPE(GreasePencilSimplify);
285 INIT_TYPE(GreasePencilEnvelope);
286 INIT_TYPE(GreasePencilOutline);
287 INIT_TYPE(GreasePencilShrinkwrap);
288 INIT_TYPE(GreasePencilBuild);
289 INIT_TYPE(GreasePencilTexture);
290#undef INIT_TYPE
291}
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
CustomData interface, see also DNA_customdata_types.h.
void CustomData_validate_layer_name(const CustomData *data, eCustomDataType type, blender::StringRef name, char *outname)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
support for deformation groups and hooks.
int BKE_id_defgroup_name_index(const ID *id, blender::StringRef name)
Definition deform.cc:549
int BKE_object_defgroup_name_index(const Object *ob, blender::StringRef name)
Definition deform.cc:591
void BKE_image_user_frame_calc(Image *ima, ImageUser *iuser, int cfra)
bool BKE_image_is_animated(Image *image)
MDeformVert * BKE_lattice_deform_verts_get(const Object *oblatt)
Definition lattice.cc:569
#define BLI_BITMAP_NEW(_num, _alloc_string)
Definition BLI_bitmap.h:37
#define BLI_BITMAP_TEST(_bitmap, _index)
Definition BLI_bitmap.h:61
#define BLI_BITMAP_ENABLE(_bitmap, _index)
Definition BLI_bitmap.h:78
unsigned int BLI_bitmap
Definition BLI_bitmap.h:13
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
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])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
@ DEG_OB_COMP_EVAL_POSE
@ DEG_OB_COMP_TRANSFORM
float DEG_get_ctime(const Depsgraph *graph)
#define MAX_CUSTOMDATA_LAYER_NAME
@ CD_PROP_FLOAT2
@ eModifierType_Armature
@ MOD_DISP_MAP_OBJECT
@ MOD_DISP_MAP_GLOBAL
@ MOD_DISP_MAP_LOCAL
@ MOD_DISP_MAP_UV
Object is a sort of wrapper for general info.
@ OB_LATTICE
@ OB_ARMATURE
#define OB_TYPE_SUPPORT_VGROUP(_type)
Read Guarded memory(de)allocation.
void MOD_init_texture(MappingInfoModifierData *dmd, const ModifierEvalContext *ctx)
Definition MOD_util.cc:36
#define INIT_TYPE(typeName)
void MOD_depsgraph_update_object_bone_relation(DepsNodeHandle *node, Object *object, const char *bonename, const char *description)
Definition MOD_util.cc:186
void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, const MDeformVert **dvert, int *defgrp_index)
Definition MOD_util.cc:156
void MOD_previous_vcos_store(ModifierData *md, const float(*vert_coords)[3])
Definition MOD_util.cc:142
void modifier_type_init(ModifierTypeInfo *types[])
Definition MOD_util.cc:202
void MOD_get_texture_coords(MappingInfoModifierData *dmd, const ModifierEvalContext *, Object *ob, Mesh *mesh, float(*cos)[3], float(*r_texco)[3])
Definition MOD_util.cc:49
AttributeSet attributes
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, AttrType data_type, const void *default_value=nullptr) const
#define cos
VecBase< float, 2 > float2
static char ** types
Definition makesdna.cc:71
void * MEM_dupallocN(const void *vmemh)
Definition mallocn.cc:143
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
static char faces[256]
const char * name
CustomData corner_data
int verts_num
struct ModifierData * next
struct bPose * pose
struct ImageUser iuser
struct Image * ima
float pose_mat[4][4]
i
Definition text_draw.cc:230