Blender  V3.3
MOD_displace.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2005 Blender Foundation. All rights reserved. */
3 
8 #include "BLI_utildefines.h"
9 
10 #include "BLI_math.h"
11 #include "BLI_task.h"
12 
13 #include "BLT_translation.h"
14 
15 #include "DNA_defaults.h"
16 #include "DNA_mesh_types.h"
17 #include "DNA_meshdata_types.h"
18 #include "DNA_object_types.h"
19 #include "DNA_screen_types.h"
20 
21 #include "BKE_context.h"
22 #include "BKE_customdata.h"
23 #include "BKE_deform.h"
24 #include "BKE_editmesh.h"
25 #include "BKE_image.h"
26 #include "BKE_lib_id.h"
27 #include "BKE_lib_query.h"
28 #include "BKE_mesh.h"
29 #include "BKE_mesh_wrapper.h"
30 #include "BKE_modifier.h"
31 #include "BKE_object.h"
32 #include "BKE_screen.h"
33 #include "BKE_texture.h"
34 
35 #include "UI_interface.h"
36 #include "UI_resources.h"
37 
38 #include "RNA_access.h"
39 #include "RNA_prototypes.h"
40 
41 #include "DEG_depsgraph.h"
42 #include "DEG_depsgraph_query.h"
43 
44 #include "MEM_guardedalloc.h"
45 
46 #include "MOD_ui_common.h"
47 #include "MOD_util.h"
48 
49 #include "RE_texture.h"
50 
51 /* Displace */
52 
53 static void initData(ModifierData *md)
54 {
56 
58 
60 }
61 
62 static void requiredDataMask(Object *UNUSED(ob),
63  ModifierData *md,
64  CustomData_MeshMasks *r_cddata_masks)
65 {
67 
68  /* ask for vertexgroups if we need them */
69  if (dmd->defgrp_name[0] != '\0') {
70  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
71  }
72 
73  /* ask for UV coordinates if we need them */
74  if (dmd->texmapping == MOD_DISP_MAP_UV) {
75  r_cddata_masks->fmask |= CD_MASK_MTFACE;
76  }
77 
78  if (dmd->direction == MOD_DISP_DIR_CLNOR) {
79  r_cddata_masks->lmask |= CD_MASK_CUSTOMLOOPNORMAL;
80  }
81 }
82 
83 static bool dependsOnTime(struct Scene *UNUSED(scene), ModifierData *md)
84 {
86 
87  if (dmd->texture) {
89  }
90 
91  return false;
92 }
93 
95 {
98 }
99 
100 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
101 {
103 
104  walk(userData, ob, (ID **)&dmd->texture, IDWALK_CB_USER);
105  walk(userData, ob, (ID **)&dmd->map_object, IDWALK_CB_NOP);
106 }
107 
108 static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
109 {
110  walk(userData, ob, md, "texture");
111 }
112 
113 static bool isDisabled(const struct Scene *UNUSED(scene),
114  ModifierData *md,
115  bool UNUSED(useRenderParams))
116 {
118  return ((!dmd->texture && dmd->direction == MOD_DISP_DIR_RGB_XYZ) || dmd->strength == 0.0f);
119 }
120 
122 {
124  bool need_transform_relation = false;
125 
126  if (dmd->space == MOD_DISP_SPACE_GLOBAL &&
128  need_transform_relation = true;
129  }
130 
131  if (dmd->texture != NULL) {
132  DEG_add_generic_id_relation(ctx->node, &dmd->texture->id, "Displace Modifier");
133 
134  if (dmd->map_object != NULL && dmd->texmapping == MOD_DISP_MAP_OBJECT) {
136  ctx->node, dmd->map_object, dmd->map_bone, "Displace Modifier");
137  need_transform_relation = true;
138  }
139  if (dmd->texmapping == MOD_DISP_MAP_GLOBAL) {
140  need_transform_relation = true;
141  }
142  }
143 
144  if (need_transform_relation) {
145  DEG_add_modifier_to_transform_relation(ctx->node, "Displace Modifier");
146  }
147 }
148 
149 typedef struct DisplaceUserdata {
151  struct Scene *scene;
152  struct ImagePool *pool;
154  float weight;
159  float (*tex_co)[3];
161  float local_mat[4][4];
163  const float (*vert_normals)[3];
166 
167 static void displaceModifier_do_task(void *__restrict userdata,
168  const int iter,
169  const TaskParallelTLS *__restrict UNUSED(tls))
170 {
171  DisplaceUserdata *data = (DisplaceUserdata *)userdata;
172  DisplaceModifierData *dmd = data->dmd;
173  MDeformVert *dvert = data->dvert;
174  const bool invert_vgroup = (dmd->flag & MOD_DISP_INVERT_VGROUP) != 0;
175  float weight = data->weight;
176  int defgrp_index = data->defgrp_index;
177  int direction = data->direction;
178  bool use_global_direction = data->use_global_direction;
179  float(*tex_co)[3] = data->tex_co;
180  float(*vertexCos)[3] = data->vertexCos;
181  float(*vert_clnors)[3] = data->vert_clnors;
182 
183  const float delta_fixed = 1.0f -
184  dmd->midlevel; /* when no texture is used, we fallback to white */
185 
186  TexResult texres;
187  float strength = dmd->strength;
188  float delta;
189  float local_vec[3];
190 
191  if (dvert) {
192  weight = invert_vgroup ? 1.0f - BKE_defvert_find_weight(dvert + iter, defgrp_index) :
193  BKE_defvert_find_weight(dvert + iter, defgrp_index);
194  if (weight == 0.0f) {
195  return;
196  }
197  }
198 
199  if (data->tex_target) {
201  data->scene, data->tex_target, tex_co[iter], &texres, data->pool, false);
202  delta = texres.tin - dmd->midlevel;
203  }
204  else {
205  delta = delta_fixed; /* (1.0f - dmd->midlevel) */ /* never changes */
206  }
207 
208  if (dvert) {
209  strength *= weight;
210  }
211 
212  delta *= strength;
213  CLAMP(delta, -10000, 10000);
214 
215  switch (direction) {
216  case MOD_DISP_DIR_X:
217  if (use_global_direction) {
218  vertexCos[iter][0] += delta * data->local_mat[0][0];
219  vertexCos[iter][1] += delta * data->local_mat[1][0];
220  vertexCos[iter][2] += delta * data->local_mat[2][0];
221  }
222  else {
223  vertexCos[iter][0] += delta;
224  }
225  break;
226  case MOD_DISP_DIR_Y:
227  if (use_global_direction) {
228  vertexCos[iter][0] += delta * data->local_mat[0][1];
229  vertexCos[iter][1] += delta * data->local_mat[1][1];
230  vertexCos[iter][2] += delta * data->local_mat[2][1];
231  }
232  else {
233  vertexCos[iter][1] += delta;
234  }
235  break;
236  case MOD_DISP_DIR_Z:
237  if (use_global_direction) {
238  vertexCos[iter][0] += delta * data->local_mat[0][2];
239  vertexCos[iter][1] += delta * data->local_mat[1][2];
240  vertexCos[iter][2] += delta * data->local_mat[2][2];
241  }
242  else {
243  vertexCos[iter][2] += delta;
244  }
245  break;
247  local_vec[0] = texres.trgba[0] - dmd->midlevel;
248  local_vec[1] = texres.trgba[1] - dmd->midlevel;
249  local_vec[2] = texres.trgba[2] - dmd->midlevel;
250  if (use_global_direction) {
251  mul_transposed_mat3_m4_v3(data->local_mat, local_vec);
252  }
253  mul_v3_fl(local_vec, strength);
254  add_v3_v3(vertexCos[iter], local_vec);
255  break;
256  case MOD_DISP_DIR_NOR:
257  madd_v3_v3fl(vertexCos[iter], data->vert_normals[iter], delta);
258  break;
259  case MOD_DISP_DIR_CLNOR:
260  madd_v3_v3fl(vertexCos[iter], vert_clnors[iter], delta);
261  break;
262  }
263 }
264 
266  const ModifierEvalContext *ctx,
267  Mesh *mesh,
268  float (*vertexCos)[3],
269  const int verts_num)
270 {
271  Object *ob = ctx->object;
272  MVert *mvert;
273  MDeformVert *dvert;
274  int direction = dmd->direction;
275  int defgrp_index;
276  float(*tex_co)[3];
277  float weight = 1.0f; /* init value unused but some compilers may complain */
278  float(*vert_clnors)[3] = NULL;
279  float local_mat[4][4] = {{0}};
280  const bool use_global_direction = dmd->space == MOD_DISP_SPACE_GLOBAL;
281 
282  if (dmd->texture == NULL && dmd->direction == MOD_DISP_DIR_RGB_XYZ) {
283  return;
284  }
285  if (dmd->strength == 0.0f) {
286  return;
287  }
288 
289  mvert = mesh->mvert;
290  MOD_get_vgroup(ob, mesh, dmd->defgrp_name, &dvert, &defgrp_index);
291 
292  if (defgrp_index >= 0 && dvert == NULL) {
293  /* There is a vertex group, but it has no vertices. */
294  return;
295  }
296 
297  Tex *tex_target = dmd->texture;
298  if (tex_target != NULL) {
299  tex_co = MEM_calloc_arrayN((size_t)verts_num, sizeof(*tex_co), "displaceModifier_do tex_co");
300  MOD_get_texture_coords((MappingInfoModifierData *)dmd, ctx, ob, mesh, vertexCos, tex_co);
301 
303  }
304  else {
305  tex_co = NULL;
306  }
307 
308  if (direction == MOD_DISP_DIR_CLNOR) {
309  CustomData *ldata = &mesh->ldata;
310 
312  if (!CustomData_has_layer(ldata, CD_NORMAL)) {
314  }
315 
316  float(*clnors)[3] = CustomData_get_layer(ldata, CD_NORMAL);
317  vert_clnors = MEM_malloc_arrayN(verts_num, sizeof(*vert_clnors), __func__);
319  verts_num, mesh->mloop, mesh->totloop, (const float(*)[3])clnors, vert_clnors);
320  }
321  else {
322  direction = MOD_DISP_DIR_NOR;
323  }
324  }
326  use_global_direction) {
327  copy_m4_m4(local_mat, ob->obmat);
328  }
329 
331  data.scene = DEG_get_evaluated_scene(ctx->depsgraph);
332  data.dmd = dmd;
333  data.dvert = dvert;
334  data.weight = weight;
335  data.defgrp_index = defgrp_index;
336  data.direction = direction;
337  data.use_global_direction = use_global_direction;
338  data.tex_target = tex_target;
339  data.tex_co = tex_co;
340  data.vertexCos = vertexCos;
341  copy_m4_m4(data.local_mat, local_mat);
342  data.mvert = mvert;
343  if (direction == MOD_DISP_DIR_NOR) {
344  data.vert_normals = BKE_mesh_vertex_normals_ensure(mesh);
345  }
346  data.vert_clnors = vert_clnors;
347  if (tex_target != NULL) {
348  data.pool = BKE_image_pool_new();
349  BKE_texture_fetch_images_for_pool(tex_target, data.pool);
350  }
351  TaskParallelSettings settings;
353  settings.use_threading = (verts_num > 512);
354  BLI_task_parallel_range(0, verts_num, &data, displaceModifier_do_task, &settings);
355 
356  if (data.pool != NULL) {
358  }
359 
360  if (tex_co) {
361  MEM_freeN(tex_co);
362  }
363 
364  if (vert_clnors) {
365  MEM_freeN(vert_clnors);
366  }
367 }
368 
369 static void deformVerts(ModifierData *md,
370  const ModifierEvalContext *ctx,
371  Mesh *mesh,
372  float (*vertexCos)[3],
373  int verts_num)
374 {
375  Mesh *mesh_src = MOD_deform_mesh_eval_get(
376  ctx->object, NULL, mesh, NULL, verts_num, false, false);
377 
378  displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, verts_num);
379 
380  if (!ELEM(mesh_src, NULL, mesh)) {
381  BKE_id_free(NULL, mesh_src);
382  }
383 }
384 
385 static void deformVertsEM(ModifierData *md,
386  const ModifierEvalContext *ctx,
387  struct BMEditMesh *editData,
388  Mesh *mesh,
389  float (*vertexCos)[3],
390  int verts_num)
391 {
392  Mesh *mesh_src = MOD_deform_mesh_eval_get(
393  ctx->object, editData, mesh, NULL, verts_num, false, false);
394 
395  /* TODO(Campbell): use edit-mode data only (remove this line). */
396  if (mesh_src != NULL) {
398  }
399 
400  displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, verts_num);
401 
402  if (!ELEM(mesh_src, NULL, mesh)) {
403  BKE_id_free(NULL, mesh_src);
404  }
405 }
406 
407 static void panel_draw(const bContext *C, Panel *panel)
408 {
409  uiLayout *col;
410  uiLayout *layout = panel->layout;
411 
412  PointerRNA ob_ptr;
414 
415  PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
416 
417  PointerRNA texture_ptr = RNA_pointer_get(ptr, "texture");
418  bool has_texture = !RNA_pointer_is_null(&texture_ptr);
419  int texture_coords = RNA_enum_get(ptr, "texture_coords");
420 
421  uiLayoutSetPropSep(layout, true);
422 
423  uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL);
424 
425  col = uiLayoutColumn(layout, false);
426  uiLayoutSetActive(col, has_texture);
427  uiItemR(col, ptr, "texture_coords", 0, IFACE_("Coordinates"), ICON_NONE);
428  if (texture_coords == MOD_DISP_MAP_OBJECT) {
429  uiItemR(col, ptr, "texture_coords_object", 0, IFACE_("Object"), ICON_NONE);
430  PointerRNA texture_coords_obj_ptr = RNA_pointer_get(ptr, "texture_coords_object");
431  if (!RNA_pointer_is_null(&texture_coords_obj_ptr) &&
432  (RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE)) {
433  PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
435  ptr,
436  "texture_coords_bone",
437  &texture_coords_obj_data_ptr,
438  "bones",
439  IFACE_("Bone"),
440  ICON_NONE);
441  }
442  }
443  else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
444  uiItemPointerR(col, ptr, "uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
445  }
446 
447  uiItemS(layout);
448 
449  col = uiLayoutColumn(layout, false);
450  uiItemR(col, ptr, "direction", 0, 0, ICON_NONE);
451  if (ELEM(RNA_enum_get(ptr, "direction"),
456  uiItemR(col, ptr, "space", 0, NULL, ICON_NONE);
457  }
458 
459  uiItemS(layout);
460 
461  col = uiLayoutColumn(layout, false);
462  uiItemR(col, ptr, "strength", 0, NULL, ICON_NONE);
463  uiItemR(col, ptr, "mid_level", 0, NULL, ICON_NONE);
464 
465  modifier_vgroup_ui(col, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
466 
467  modifier_panel_end(layout, ptr);
468 }
469 
470 static void panelRegister(ARegionType *region_type)
471 {
473 }
474 
476  /* name */ N_("Displace"),
477  /* structName */ "DisplaceModifierData",
478  /* structSize */ sizeof(DisplaceModifierData),
479  /* srna */ &RNA_DisplaceModifier,
480  /* type */ eModifierTypeType_OnlyDeform,
482  /* icon */ ICON_MOD_DISPLACE,
483 
484  /* copyData */ BKE_modifier_copydata_generic,
485 
486  /* deformVerts */ deformVerts,
487  /* deformMatrices */ NULL,
488  /* deformVertsEM */ deformVertsEM,
489  /* deformMatricesEM */ NULL,
490  /* modifyMesh */ NULL,
491  /* modifyGeometrySet */ NULL,
492 
493  /* initData */ initData,
494  /* requiredDataMask */ requiredDataMask,
495  /* freeData */ NULL,
496  /* isDisabled */ isDisabled,
497  /* updateDepsgraph */ updateDepsgraph,
498  /* dependsOnTime */ dependsOnTime,
499  /* dependsOnNormals */ dependsOnNormals,
500  /* foreachIDLink */ foreachIDLink,
501  /* foreachTexLink */ foreachTexLink,
502  /* freeRuntimeData */ NULL,
503  /* panelRegister */ panelRegister,
504  /* blendWrite */ NULL,
505  /* blendRead */ NULL,
506 };
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_has_layer(const struct CustomData *data, int type)
void * CustomData_get_layer(const struct CustomData *data, int type)
support for deformation groups and hooks.
float BKE_defvert_find_weight(const struct MDeformVert *dvert, int defgroup)
Definition: deform.c:704
struct ImagePool * BKE_image_pool_new(void)
void BKE_image_pool_free(struct ImagePool *pool)
void BKE_id_free(struct Main *bmain, void *idv)
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:73
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:33
const float(* BKE_mesh_vertex_normals_ensure(const struct Mesh *mesh))[3]
void BKE_mesh_normals_loop_to_vertex(int numVerts, const struct MLoop *mloops, int numLoops, const float(*clnors)[3], float(*r_vert_clnors)[3])
void BKE_mesh_calc_normals_split(struct Mesh *mesh)
Definition: mesh.cc:1911
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me)
Definition: mesh_wrapper.cc:94
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:107
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:69
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:66
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
Definition: BKE_modifier.h:108
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_OnlyDeform
Definition: BKE_modifier.h:44
General operations, lookup, etc. for blender objects.
bool BKE_texture_dependsOnTime(const struct Tex *texture)
Definition: texture.c:670
void BKE_texture_fetch_images_for_pool(struct Tex *texture, struct ImagePool *pool)
Definition: texture.c:743
void BKE_texture_get_value_ex(const struct Scene *scene, struct Tex *texture, const float *tex_co, struct TexResult *texres, struct ImagePool *pool, bool use_color_management)
#define BLI_assert(a)
Definition: BLI_assert.h:46
void copy_m4_m4(float m1[4][4], const float m2[4][4])
Definition: math_matrix.c:77
void mul_transposed_mat3_m4_v3(const float M[4][4], float r[3])
Definition: math_matrix.c:946
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
Definition: task_range.cc:94
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
Definition: BLI_task.h:293
#define UNUSED(x)
#define ELEM(...)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define IFACE_(msgid)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
void DEG_add_generic_id_relation(struct DepsNodeHandle *node_handle, struct ID *id, const char *description)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define CD_MASK_MDEFORMVERT
#define CD_MASK_MTFACE
@ CD_CUSTOMLOOPNORMAL
#define CD_MASK_CUSTOMLOOPNORMAL
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ MOD_DISP_SPACE_GLOBAL
@ eModifierType_Displace
@ MOD_DISP_MAP_OBJECT
@ MOD_DISP_MAP_GLOBAL
@ MOD_DISP_MAP_UV
@ MOD_DISP_INVERT_VGROUP
@ MOD_DISP_DIR_RGB_XYZ
@ MOD_DISP_DIR_Z
@ MOD_DISP_DIR_Y
@ MOD_DISP_DIR_NOR
@ MOD_DISP_DIR_X
@ MOD_DISP_DIR_CLNOR
struct DisplaceModifierData DisplaceModifierData
Object is a sort of wrapper for general info.
@ OB_ARMATURE
@ OB_MESH
Read Guarded memory(de)allocation.
static void deformVerts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], int verts_num)
Definition: MOD_displace.c:369
static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, Mesh *mesh, float(*vertexCos)[3], int verts_num)
Definition: MOD_displace.c:385
struct DisplaceUserdata DisplaceUserdata
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition: MOD_displace.c:121
static bool dependsOnTime(struct Scene *UNUSED(scene), ModifierData *md)
Definition: MOD_displace.c:83
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
Definition: MOD_displace.c:113
static bool dependsOnNormals(ModifierData *md)
Definition: MOD_displace.c:94
static void displaceModifier_do(DisplaceModifierData *dmd, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], const int verts_num)
Definition: MOD_displace.c:265
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
Definition: MOD_displace.c:100
static void displaceModifier_do_task(void *__restrict userdata, const int iter, const TaskParallelTLS *__restrict UNUSED(tls))
Definition: MOD_displace.c:167
static void initData(ModifierData *md)
Definition: MOD_displace.c:53
static void panelRegister(ARegionType *region_type)
Definition: MOD_displace.c:470
static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
Definition: MOD_displace.c:108
ModifierTypeInfo modifierType_Displace
Definition: MOD_displace.c:475
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_displace.c:62
static void panel_draw(const bContext *C, Panel *panel)
Definition: MOD_displace.c:407
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
Definition: MOD_ui_common.c:91
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
Mesh * MOD_deform_mesh_eval_get(Object *ob, struct BMEditMesh *em, Mesh *mesh, const float(*vertexCos)[3], const int verts_num, const bool use_normals, const bool use_orco)
Definition: MOD_util.c:167
void MOD_init_texture(MappingInfoModifierData *dmd, const ModifierEvalContext *ctx)
Definition: MOD_util.c:45
void MOD_depsgraph_update_object_bone_relation(struct DepsNodeHandle *node, Object *object, const char *bonename, const char *description)
Definition: MOD_util.c:258
void MOD_get_texture_coords(MappingInfoModifierData *dmd, const ModifierEvalContext *UNUSED(ctx), Object *ob, Mesh *mesh, float(*cos)[3], float(*r_texco)[3])
Definition: MOD_util.c:59
void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
Definition: MOD_util.c:235
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 used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position CLAMP
#define C
Definition: RandGen.cpp:25
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiTemplateID(uiLayout *layout, const struct bContext *C, struct PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int filter, bool live_icon, const char *text)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
Scene scene
uint col
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:34
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:32
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5167
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition: rna_access.c:164
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
struct Object * map_object
float(* vert_clnors)[3]
Definition: MOD_displace.c:164
MDeformVert * dvert
Definition: MOD_displace.c:153
float(* tex_co)[3]
Definition: MOD_displace.c:159
float(* vertexCos)[3]
Definition: MOD_displace.c:160
struct ImagePool * pool
Definition: MOD_displace.c:152
DisplaceModifierData * dmd
Definition: MOD_displace.c:150
struct Scene * scene
Definition: MOD_displace.c:151
float local_mat[4][4]
Definition: MOD_displace.c:161
const float(* vert_normals)[3]
Definition: MOD_displace.c:163
Definition: DNA_ID.h:368
struct MVert * mvert
struct MLoop * mloop
int totloop
CustomData ldata
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:140
struct Object * object
Definition: BKE_modifier.h:141
struct DepsNodeHandle * node
Definition: BKE_modifier.h:134
float obmat[4][4]
struct uiLayout * layout
float tin
Definition: RE_texture.h:86
float trgba[4]
Definition: RE_texture.h:87
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480