Blender  V2.93
MOD_displace.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2005 by the Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include "BLI_utildefines.h"
25 
26 #include "BLI_math.h"
27 #include "BLI_task.h"
28 
29 #include "BLT_translation.h"
30 
31 #include "DNA_defaults.h"
32 #include "DNA_mesh_types.h"
33 #include "DNA_meshdata_types.h"
34 #include "DNA_object_types.h"
35 #include "DNA_screen_types.h"
36 
37 #include "BKE_context.h"
38 #include "BKE_customdata.h"
39 #include "BKE_deform.h"
40 #include "BKE_editmesh.h"
41 #include "BKE_image.h"
42 #include "BKE_lib_id.h"
43 #include "BKE_lib_query.h"
44 #include "BKE_mesh.h"
45 #include "BKE_mesh_wrapper.h"
46 #include "BKE_modifier.h"
47 #include "BKE_object.h"
48 #include "BKE_screen.h"
49 #include "BKE_texture.h"
50 
51 #include "UI_interface.h"
52 #include "UI_resources.h"
53 
54 #include "RNA_access.h"
55 
56 #include "DEG_depsgraph.h"
57 #include "DEG_depsgraph_query.h"
58 
59 #include "MEM_guardedalloc.h"
60 
61 #include "MOD_ui_common.h"
62 #include "MOD_util.h"
63 
64 #include "RE_texture.h"
65 
66 /* Displace */
67 
68 static void initData(ModifierData *md)
69 {
71 
73 
75 }
76 
77 static void requiredDataMask(Object *UNUSED(ob),
78  ModifierData *md,
79  CustomData_MeshMasks *r_cddata_masks)
80 {
82 
83  /* ask for vertexgroups if we need them */
84  if (dmd->defgrp_name[0] != '\0') {
85  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
86  }
87 
88  /* ask for UV coordinates if we need them */
89  if (dmd->texmapping == MOD_DISP_MAP_UV) {
90  r_cddata_masks->fmask |= CD_MASK_MTFACE;
91  }
92 
93  if (dmd->direction == MOD_DISP_DIR_CLNOR) {
94  r_cddata_masks->lmask |= CD_MASK_CUSTOMLOOPNORMAL;
95  }
96 }
97 
98 static bool dependsOnTime(ModifierData *md)
99 {
101 
102  if (dmd->texture) {
103  return BKE_texture_dependsOnTime(dmd->texture);
104  }
105 
106  return false;
107 }
108 
110 {
113 }
114 
115 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
116 {
118 
119  walk(userData, ob, (ID **)&dmd->texture, IDWALK_CB_USER);
120  walk(userData, ob, (ID **)&dmd->map_object, IDWALK_CB_NOP);
121 }
122 
123 static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
124 {
125  walk(userData, ob, md, "texture");
126 }
127 
128 static bool isDisabled(const struct Scene *UNUSED(scene),
129  ModifierData *md,
130  bool UNUSED(useRenderParams))
131 {
133  return ((!dmd->texture && dmd->direction == MOD_DISP_DIR_RGB_XYZ) || dmd->strength == 0.0f);
134 }
135 
137 {
139  bool need_transform_relation = false;
140 
141  if (dmd->space == MOD_DISP_SPACE_GLOBAL &&
143  need_transform_relation = true;
144  }
145 
146  if (dmd->texture != NULL) {
147  DEG_add_generic_id_relation(ctx->node, &dmd->texture->id, "Displace Modifier");
148 
149  if (dmd->map_object != NULL && dmd->texmapping == MOD_DISP_MAP_OBJECT) {
151  ctx->node, dmd->map_object, dmd->map_bone, "Displace Modifier");
152  need_transform_relation = true;
153  }
154  if (dmd->texmapping == MOD_DISP_MAP_GLOBAL) {
155  need_transform_relation = true;
156  }
157  }
158 
159  if (need_transform_relation) {
160  DEG_add_modifier_to_transform_relation(ctx->node, "Displace Modifier");
161  }
162 }
163 
164 typedef struct DisplaceUserdata {
166  struct Scene *scene;
167  struct ImagePool *pool;
169  float weight;
174  float (*tex_co)[3];
176  float local_mat[4][4];
180 
181 static void displaceModifier_do_task(void *__restrict userdata,
182  const int iter,
183  const TaskParallelTLS *__restrict UNUSED(tls))
184 {
185  DisplaceUserdata *data = (DisplaceUserdata *)userdata;
186  DisplaceModifierData *dmd = data->dmd;
187  MDeformVert *dvert = data->dvert;
188  const bool invert_vgroup = (dmd->flag & MOD_DISP_INVERT_VGROUP) != 0;
189  float weight = data->weight;
190  int defgrp_index = data->defgrp_index;
191  int direction = data->direction;
192  bool use_global_direction = data->use_global_direction;
193  float(*tex_co)[3] = data->tex_co;
194  float(*vertexCos)[3] = data->vertexCos;
195  MVert *mvert = data->mvert;
196  float(*vert_clnors)[3] = data->vert_clnors;
197 
198  const float delta_fixed = 1.0f -
199  dmd->midlevel; /* when no texture is used, we fallback to white */
200 
201  TexResult texres;
202  float strength = dmd->strength;
203  float delta;
204  float local_vec[3];
205 
206  if (dvert) {
207  weight = invert_vgroup ? 1.0f - BKE_defvert_find_weight(dvert + iter, defgrp_index) :
208  BKE_defvert_find_weight(dvert + iter, defgrp_index);
209  if (weight == 0.0f) {
210  return;
211  }
212  }
213 
214  if (data->tex_target) {
215  texres.nor = NULL;
217  data->scene, data->tex_target, tex_co[iter], &texres, data->pool, false);
218  delta = texres.tin - dmd->midlevel;
219  }
220  else {
221  delta = delta_fixed; /* (1.0f - dmd->midlevel) */ /* never changes */
222  }
223 
224  if (dvert) {
225  strength *= weight;
226  }
227 
228  delta *= strength;
229  CLAMP(delta, -10000, 10000);
230 
231  switch (direction) {
232  case MOD_DISP_DIR_X:
233  if (use_global_direction) {
234  vertexCos[iter][0] += delta * data->local_mat[0][0];
235  vertexCos[iter][1] += delta * data->local_mat[1][0];
236  vertexCos[iter][2] += delta * data->local_mat[2][0];
237  }
238  else {
239  vertexCos[iter][0] += delta;
240  }
241  break;
242  case MOD_DISP_DIR_Y:
243  if (use_global_direction) {
244  vertexCos[iter][0] += delta * data->local_mat[0][1];
245  vertexCos[iter][1] += delta * data->local_mat[1][1];
246  vertexCos[iter][2] += delta * data->local_mat[2][1];
247  }
248  else {
249  vertexCos[iter][1] += delta;
250  }
251  break;
252  case MOD_DISP_DIR_Z:
253  if (use_global_direction) {
254  vertexCos[iter][0] += delta * data->local_mat[0][2];
255  vertexCos[iter][1] += delta * data->local_mat[1][2];
256  vertexCos[iter][2] += delta * data->local_mat[2][2];
257  }
258  else {
259  vertexCos[iter][2] += delta;
260  }
261  break;
263  local_vec[0] = texres.tr - dmd->midlevel;
264  local_vec[1] = texres.tg - dmd->midlevel;
265  local_vec[2] = texres.tb - dmd->midlevel;
266  if (use_global_direction) {
267  mul_transposed_mat3_m4_v3(data->local_mat, local_vec);
268  }
269  mul_v3_fl(local_vec, strength);
270  add_v3_v3(vertexCos[iter], local_vec);
271  break;
272  case MOD_DISP_DIR_NOR:
273  vertexCos[iter][0] += delta * (mvert[iter].no[0] / 32767.0f);
274  vertexCos[iter][1] += delta * (mvert[iter].no[1] / 32767.0f);
275  vertexCos[iter][2] += delta * (mvert[iter].no[2] / 32767.0f);
276  break;
277  case MOD_DISP_DIR_CLNOR:
278  madd_v3_v3fl(vertexCos[iter], vert_clnors[iter], delta);
279  break;
280  }
281 }
282 
284  const ModifierEvalContext *ctx,
285  Mesh *mesh,
286  float (*vertexCos)[3],
287  const int numVerts)
288 {
289  Object *ob = ctx->object;
290  MVert *mvert;
291  MDeformVert *dvert;
292  int direction = dmd->direction;
293  int defgrp_index;
294  float(*tex_co)[3];
295  float weight = 1.0f; /* init value unused but some compilers may complain */
296  float(*vert_clnors)[3] = NULL;
297  float local_mat[4][4] = {{0}};
298  const bool use_global_direction = dmd->space == MOD_DISP_SPACE_GLOBAL;
299 
300  if (dmd->texture == NULL && dmd->direction == MOD_DISP_DIR_RGB_XYZ) {
301  return;
302  }
303  if (dmd->strength == 0.0f) {
304  return;
305  }
306 
307  mvert = mesh->mvert;
308  MOD_get_vgroup(ob, mesh, dmd->defgrp_name, &dvert, &defgrp_index);
309 
310  if (defgrp_index >= 0 && dvert == NULL) {
311  /* There is a vertex group, but it has no vertices. */
312  return;
313  }
314 
315  Tex *tex_target = dmd->texture;
316  if (tex_target != NULL) {
317  tex_co = MEM_calloc_arrayN((size_t)numVerts, sizeof(*tex_co), "displaceModifier_do tex_co");
318  MOD_get_texture_coords((MappingInfoModifierData *)dmd, ctx, ob, mesh, vertexCos, tex_co);
319 
321  }
322  else {
323  tex_co = NULL;
324  }
325 
326  if (direction == MOD_DISP_DIR_CLNOR) {
327  CustomData *ldata = &mesh->ldata;
328 
330  float(*clnors)[3] = NULL;
331 
333  !CustomData_has_layer(ldata, CD_NORMAL)) {
335  }
336 
337  clnors = CustomData_get_layer(ldata, CD_NORMAL);
338  vert_clnors = MEM_malloc_arrayN(numVerts, sizeof(*vert_clnors), __func__);
340  numVerts, mesh->mloop, mesh->totloop, (const float(*)[3])clnors, vert_clnors);
341  }
342  else {
343  direction = MOD_DISP_DIR_NOR;
344  }
345  }
347  use_global_direction) {
348  copy_m4_m4(local_mat, ob->obmat);
349  }
350 
352  data.scene = DEG_get_evaluated_scene(ctx->depsgraph);
353  data.dmd = dmd;
354  data.dvert = dvert;
355  data.weight = weight;
356  data.defgrp_index = defgrp_index;
357  data.direction = direction;
358  data.use_global_direction = use_global_direction;
359  data.tex_target = tex_target;
360  data.tex_co = tex_co;
361  data.vertexCos = vertexCos;
362  copy_m4_m4(data.local_mat, local_mat);
363  data.mvert = mvert;
364  data.vert_clnors = vert_clnors;
365  if (tex_target != NULL) {
366  data.pool = BKE_image_pool_new();
367  BKE_texture_fetch_images_for_pool(tex_target, data.pool);
368  }
369  TaskParallelSettings settings;
371  settings.use_threading = (numVerts > 512);
372  BLI_task_parallel_range(0, numVerts, &data, displaceModifier_do_task, &settings);
373 
374  if (data.pool != NULL) {
376  }
377 
378  if (tex_co) {
379  MEM_freeN(tex_co);
380  }
381 
382  if (vert_clnors) {
383  MEM_freeN(vert_clnors);
384  }
385 }
386 
387 static void deformVerts(ModifierData *md,
388  const ModifierEvalContext *ctx,
389  Mesh *mesh,
390  float (*vertexCos)[3],
391  int numVerts)
392 {
393  Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
394 
395  displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, numVerts);
396 
397  if (!ELEM(mesh_src, NULL, mesh)) {
398  BKE_id_free(NULL, mesh_src);
399  }
400 }
401 
402 static void deformVertsEM(ModifierData *md,
403  const ModifierEvalContext *ctx,
404  struct BMEditMesh *editData,
405  Mesh *mesh,
406  float (*vertexCos)[3],
407  int numVerts)
408 {
409  Mesh *mesh_src = MOD_deform_mesh_eval_get(
410  ctx->object, editData, mesh, NULL, numVerts, false, false);
411 
412  /* TODO(Campbell): use edit-mode data only (remove this line). */
413  if (mesh_src != NULL) {
415  }
416 
417  displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, numVerts);
418 
419  if (!ELEM(mesh_src, NULL, mesh)) {
420  BKE_id_free(NULL, mesh_src);
421  }
422 }
423 
424 static void panel_draw(const bContext *C, Panel *panel)
425 {
426  uiLayout *col;
427  uiLayout *layout = panel->layout;
428 
429  PointerRNA ob_ptr;
431 
432  PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
433 
434  PointerRNA texture_ptr = RNA_pointer_get(ptr, "texture");
435  bool has_texture = !RNA_pointer_is_null(&texture_ptr);
436  int texture_coords = RNA_enum_get(ptr, "texture_coords");
437 
438  uiLayoutSetPropSep(layout, true);
439 
440  uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL);
441 
442  col = uiLayoutColumn(layout, false);
443  uiLayoutSetActive(col, has_texture);
444  uiItemR(col, ptr, "texture_coords", 0, IFACE_("Coordinates"), ICON_NONE);
445  if (texture_coords == MOD_DISP_MAP_OBJECT) {
446  uiItemR(col, ptr, "texture_coords_object", 0, IFACE_("Object"), ICON_NONE);
447  PointerRNA texture_coords_obj_ptr = RNA_pointer_get(ptr, "texture_coords_object");
448  if (!RNA_pointer_is_null(&texture_coords_obj_ptr) &&
449  (RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE)) {
450  PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
452  ptr,
453  "texture_coords_bone",
454  &texture_coords_obj_data_ptr,
455  "bones",
456  IFACE_("Bone"),
457  ICON_NONE);
458  }
459  }
460  else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
461  uiItemPointerR(col, ptr, "uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
462  }
463 
464  uiItemS(layout);
465 
466  col = uiLayoutColumn(layout, false);
467  uiItemR(col, ptr, "direction", 0, 0, ICON_NONE);
468  if (ELEM(RNA_enum_get(ptr, "direction"),
473  uiItemR(col, ptr, "space", 0, NULL, ICON_NONE);
474  }
475 
476  uiItemS(layout);
477 
478  col = uiLayoutColumn(layout, false);
479  uiItemR(col, ptr, "strength", 0, NULL, ICON_NONE);
480  uiItemR(col, ptr, "mid_level", 0, NULL, ICON_NONE);
481 
482  modifier_vgroup_ui(col, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
483 
484  modifier_panel_end(layout, ptr);
485 }
486 
487 static void panelRegister(ARegionType *region_type)
488 {
490 }
491 
493  /* name */ "Displace",
494  /* structName */ "DisplaceModifierData",
495  /* structSize */ sizeof(DisplaceModifierData),
496  /* srna */ &RNA_DisplaceModifier,
497  /* type */ eModifierTypeType_OnlyDeform,
499  /* icon */ ICON_MOD_DISPLACE,
500 
501  /* copyData */ BKE_modifier_copydata_generic,
502 
503  /* deformVerts */ deformVerts,
504  /* deformMatrices */ NULL,
505  /* deformVertsEM */ deformVertsEM,
506  /* deformMatricesEM */ NULL,
507  /* modifyMesh */ NULL,
508  /* modifyHair */ NULL,
509  /* modifyGeometrySet */ NULL,
510  /* modifyVolume */ NULL,
511 
512  /* initData */ initData,
513  /* requiredDataMask */ requiredDataMask,
514  /* freeData */ NULL,
515  /* isDisabled */ isDisabled,
516  /* updateDepsgraph */ updateDepsgraph,
517  /* dependsOnTime */ dependsOnTime,
518  /* dependsOnNormals */ dependsOnNormals,
519  /* foreachIDLink */ foreachIDLink,
520  /* foreachTexLink */ foreachTexLink,
521  /* freeRuntimeData */ NULL,
522  /* panelRegister */ panelRegister,
523  /* blendWrite */ NULL,
524  /* blendRead */ NULL,
525 };
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, const int defgroup)
Definition: deform.c:632
struct ImagePool * BKE_image_pool_new(void)
Definition: image.c:5173
void BKE_image_pool_free(struct ImagePool *pool)
Definition: image.c:5181
void BKE_id_free(struct Main *bmain, void *idv)
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:87
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:47
void BKE_mesh_normals_loop_to_vertex(const int numVerts, const struct MLoop *mloops, const int numLoops, const float(*clnors)[3], float(*r_vert_clnors)[3])
void BKE_mesh_calc_normals_split(struct Mesh *mesh)
Definition: mesh.c:1865
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me)
Definition: mesh_wrapper.c:98
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:120
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:83
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:80
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
Definition: BKE_modifier.h:121
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_OnlyDeform
Definition: BKE_modifier.h:58
General operations, lookup, etc. for blender objects.
bool BKE_texture_dependsOnTime(const struct Tex *texture)
Definition: texture.c:697
void BKE_texture_fetch_images_for_pool(struct Tex *texture, struct ImagePool *pool)
Definition: texture.c:771
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:58
void copy_m4_m4(float m1[4][4], const float m2[4][4])
Definition: math_matrix.c:95
void mul_transposed_mat3_m4_v3(const float M[4][4], float r[3])
Definition: math_matrix.c:950
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(const int start, const int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
Definition: task_range.cc:110
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
Definition: BLI_task.h:231
#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_NORMAL
#define CD_MASK_MDEFORMVERT
@ CD_CUSTOMLOOPNORMAL
#define CD_MASK_MTFACE
#define CD_MASK_CUSTOMLOOPNORMAL
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
@ MOD_DISP_SPACE_GLOBAL
@ MOD_DISP_MAP_OBJECT
@ MOD_DISP_MAP_GLOBAL
@ MOD_DISP_MAP_UV
@ 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
@ eModifierType_Displace
struct DisplaceModifierData DisplaceModifierData
@ MOD_DISP_INVERT_VGROUP
Object is a sort of wrapper for general info.
@ OB_ARMATURE
@ OB_MESH
Read Guarded memory(de)allocation.
static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, Mesh *mesh, float(*vertexCos)[3], int numVerts)
Definition: MOD_displace.c:402
struct DisplaceUserdata DisplaceUserdata
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition: MOD_displace.c:136
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
Definition: MOD_displace.c:128
static bool dependsOnNormals(ModifierData *md)
Definition: MOD_displace.c:109
static void deformVerts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], int numVerts)
Definition: MOD_displace.c:387
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
Definition: MOD_displace.c:115
static void displaceModifier_do(DisplaceModifierData *dmd, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], const int numVerts)
Definition: MOD_displace.c:283
static void displaceModifier_do_task(void *__restrict userdata, const int iter, const TaskParallelTLS *__restrict UNUSED(tls))
Definition: MOD_displace.c:181
static void initData(ModifierData *md)
Definition: MOD_displace.c:68
static void panelRegister(ARegionType *region_type)
Definition: MOD_displace.c:487
static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
Definition: MOD_displace.c:123
ModifierTypeInfo modifierType_Displace
Definition: MOD_displace.c:492
static bool dependsOnTime(ModifierData *md)
Definition: MOD_displace.c:98
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_displace.c:77
static void panel_draw(const bContext *C, Panel *panel)
Definition: MOD_displace.c:424
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
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 num_verts, const bool use_normals, const bool use_orco)
Definition: MOD_util.c:186
void MOD_init_texture(MappingInfoModifierData *dmd, const ModifierEvalContext *ctx)
Definition: MOD_util.c:61
void MOD_depsgraph_update_object_bone_relation(struct DepsNodeHandle *node, Object *object, const char *bonename, const char *description)
Definition: MOD_util.c:270
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:76
void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
Definition: MOD_util.c:254
Group RGB to Bright Vector Camera CLAMP
StructRNA RNA_DisplaceModifier
#define C
Definition: RandGen.cpp:39
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
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, const bool live_icon, const char *text)
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 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:48
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:46
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6562
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition: rna_access.c:174
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
struct Object * map_object
float(* vert_clnors)[3]
Definition: MOD_displace.c:178
MDeformVert * dvert
Definition: MOD_displace.c:168
float(* tex_co)[3]
Definition: MOD_displace.c:174
float(* vertexCos)[3]
Definition: MOD_displace.c:175
struct ImagePool * pool
Definition: MOD_displace.c:167
DisplaceModifierData * dmd
Definition: MOD_displace.c:165
struct Scene * scene
Definition: MOD_displace.c:166
float local_mat[4][4]
Definition: MOD_displace.c:176
Definition: DNA_ID.h:273
short no[3]
int64_t cd_dirty_vert
struct CustomData pdata ldata
struct MVert * mvert
struct MLoop * mloop
Mesh_Runtime runtime
int totloop
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:153
struct Object * object
Definition: BKE_modifier.h:154
struct DepsNodeHandle * node
Definition: BKE_modifier.h:147
float obmat[4][4]
struct uiLayout * layout
float tb
Definition: RE_texture.h:84
float * nor
Definition: RE_texture.h:86
float tin
Definition: RE_texture.h:84
float tr
Definition: RE_texture.h:84
float tg
Definition: RE_texture.h:84
PointerRNA * ptr
Definition: wm_files.c:3157