21 node_storage(
node).dimensions = 1;
23 b.add_input<
decl::Float>(
N_(
"Scale")).
min(-1000.0f).max(1000.0f).default_value(5.0f);
25 b.add_input<
decl::Float>(
N_(
"Dimension")).
min(0.0f).max(1000.0f).default_value(2.0f);
26 b.add_input<
decl::Float>(
N_(
"Lacunarity")).
min(0.0f).max(1000.0f).default_value(2.0f);
56 return std::array{
"node_tex_musgrave_multi_fractal_1d",
57 "node_tex_musgrave_multi_fractal_2d",
58 "node_tex_musgrave_multi_fractal_3d",
59 "node_tex_musgrave_multi_fractal_4d"}[dimensions - 1];
61 return std::array{
"node_tex_musgrave_fBm_1d",
62 "node_tex_musgrave_fBm_2d",
63 "node_tex_musgrave_fBm_3d",
64 "node_tex_musgrave_fBm_4d"}[dimensions - 1];
66 return std::array{
"node_tex_musgrave_hybrid_multi_fractal_1d",
67 "node_tex_musgrave_hybrid_multi_fractal_2d",
68 "node_tex_musgrave_hybrid_multi_fractal_3d",
69 "node_tex_musgrave_hybrid_multi_fractal_4d"}[dimensions - 1];
71 return std::array{
"node_tex_musgrave_ridged_multi_fractal_1d",
72 "node_tex_musgrave_ridged_multi_fractal_2d",
73 "node_tex_musgrave_ridged_multi_fractal_3d",
74 "node_tex_musgrave_ridged_multi_fractal_4d"}[dimensions - 1];
76 return std::array{
"node_tex_musgrave_hetero_terrain_1d",
77 "node_tex_musgrave_hetero_terrain_2d",
78 "node_tex_musgrave_hetero_terrain_3d",
79 "node_tex_musgrave_hetero_terrain_4d"}[dimensions - 1];
94 int dimensions =
tex->dimensions;
128 const int dimensions_;
129 const int musgrave_type_;
133 : dimensions_(dimensions), musgrave_type_(musgrave_type)
135 BLI_assert(dimensions >= 1 && dimensions <= 4);
136 BLI_assert(musgrave_type >= 0 && musgrave_type <= 4);
137 static std::array<fn::MFSignature, 20> signatures{
163 this->
set_signature(&signatures[dimensions + musgrave_type * 4 - 1]);
170 if (
ELEM(dimensions, 2, 3, 4)) {
173 if (
ELEM(dimensions, 1, 4)) {
178 signature.single_input<
float>(
"Dimension");
179 signature.single_input<
float>(
"Lacunarity");
180 if (
ELEM(musgrave_type,
198 return params.readonly_single_input<
float3>(param_index,
"Vector");
201 return params.readonly_single_input<
float>(param_index,
"W");
204 return params.readonly_single_input<
float>(param_index,
"Scale");
207 return params.readonly_single_input<
float>(param_index,
"Detail");
210 return params.readonly_single_input<
float>(param_index,
"Dimension");
212 auto get_lacunarity = [&](
int param_index) ->
VArray<float> {
213 return params.readonly_single_input<
float>(param_index,
"Lacunarity");
216 return params.readonly_single_input<
float>(param_index,
"Offset");
219 return params.readonly_single_input<
float>(param_index,
"Gain");
223 return params.uninitialized_single_output_if_required<
float>(param_index,
"Fac");
226 int param =
ELEM(dimensions_, 2, 3, 4) +
ELEM(dimensions_, 1, 4);
232 switch (musgrave_type_) {
235 const bool compute_factor = !r_factor.
is_empty();
236 switch (dimensions_) {
239 if (compute_factor) {
241 const float position =
w[i] * scale[i];
243 position, dimension[i], lacunarity[i], detail[i]);
250 if (compute_factor) {
255 position, dimension[i], lacunarity[i], detail[i]);
262 if (compute_factor) {
266 position, dimension[i], lacunarity[i], detail[i]);
274 if (compute_factor) {
277 const float pw =
w[i] * scale[i];
278 const float4 position{pxyz[0], pxyz[1], pxyz[2], pw};
280 position, dimension[i], lacunarity[i], detail[i]);
292 const bool compute_factor = !r_factor.
is_empty();
293 switch (dimensions_) {
296 if (compute_factor) {
298 const float position =
w[i] * scale[i];
300 position, dimension[i], lacunarity[i], detail[i],
offset[i], gain[i]);
307 if (compute_factor) {
312 position, dimension[i], lacunarity[i], detail[i],
offset[i], gain[i]);
319 if (compute_factor) {
323 position, dimension[i], lacunarity[i], detail[i],
offset[i], gain[i]);
331 if (compute_factor) {
334 const float pw =
w[i] * scale[i];
335 const float4 position{pxyz[0], pxyz[1], pxyz[2], pw};
337 position, dimension[i], lacunarity[i], detail[i],
offset[i], gain[i]);
349 const bool compute_factor = !r_factor.
is_empty();
350 switch (dimensions_) {
353 if (compute_factor) {
355 const float position =
w[i] * scale[i];
357 position, dimension[i], lacunarity[i], detail[i],
offset[i], gain[i]);
364 if (compute_factor) {
369 position, dimension[i], lacunarity[i], detail[i],
offset[i], gain[i]);
376 if (compute_factor) {
380 position, dimension[i], lacunarity[i], detail[i],
offset[i], gain[i]);
388 if (compute_factor) {
391 const float pw =
w[i] * scale[i];
392 const float4 position{pxyz[0], pxyz[1], pxyz[2], pw};
394 position, dimension[i], lacunarity[i], detail[i],
offset[i], gain[i]);
404 const bool compute_factor = !r_factor.
is_empty();
405 switch (dimensions_) {
408 if (compute_factor) {
410 const float position =
w[i] * scale[i];
412 position, dimension[i], lacunarity[i], detail[i]);
419 if (compute_factor) {
424 position, dimension[i], lacunarity[i], detail[i]);
431 if (compute_factor) {
435 position, dimension[i], lacunarity[i], detail[i]);
443 if (compute_factor) {
446 const float pw =
w[i] * scale[i];
447 const float4 position{pxyz[0], pxyz[1], pxyz[2], pw};
449 position, dimension[i], lacunarity[i], detail[i]);
460 const bool compute_factor = !r_factor.
is_empty();
461 switch (dimensions_) {
464 if (compute_factor) {
466 const float position =
w[i] * scale[i];
468 position, dimension[i], lacunarity[i], detail[i],
offset[i]);
475 if (compute_factor) {
480 position, dimension[i], lacunarity[i], detail[i],
offset[i]);
487 if (compute_factor) {
491 position, dimension[i], lacunarity[i], detail[i],
offset[i]);
499 if (compute_factor) {
502 const float pw =
w[i] * scale[i];
503 const float4 position{pxyz[0], pxyz[1], pxyz[2], pw};
505 position, dimension[i], lacunarity[i], detail[i],
offset[i]);
void node_type_gpu(struct bNodeType *ntype, NodeGPUExecFunction gpu_fn)
void node_type_update(struct bNodeType *ntype, void(*updatefunc)(struct bNodeTree *ntree, struct bNode *node))
#define NODE_STORAGE_FUNCS(StorageT)
void nodeSetSocketAvailability(struct bNodeTree *ntree, struct bNodeSocket *sock, bool is_available)
void node_type_init(struct bNodeType *ntype, void(*initfunc)(struct bNodeTree *ntree, struct bNode *node))
void node_type_size_preset(struct bNodeType *ntype, eNodeSizePreset size)
void node_type_storage(struct bNodeType *ntype, const char *storagename, void(*freefunc)(struct bNode *node), void(*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, const struct bNode *src_node))
struct bNodeSocket * nodeFindSocket(const struct bNode *node, eNodeSocketInOut in_out, const char *identifier)
#define NODE_CLASS_TEXTURE
void nodeRegisterType(struct bNodeType *ntype)
#define SH_NODE_TEX_MUSGRAVE
void BKE_texture_mapping_default(struct TexMapping *texmap, int type)
void BKE_texture_colormapping_default(struct ColorMapping *colormap)
#define SHD_MUSGRAVE_MULTIFRACTAL
#define SHD_MUSGRAVE_RIDGED_MULTIFRACTAL
#define SHD_MUSGRAVE_HYBRID_MULTIFRACTAL
#define SHD_MUSGRAVE_HETERO_TERRAIN
#define TEXMAP_TYPE_POINT
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
bool GPU_stack_link(GPUMaterial *mat, struct bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
@ UI_ITEM_R_SPLIT_EMPTY_NAME
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
constexpr bool is_empty() const
void set_signature(const MFSignature *signature)
const MFSignature & signature() const
void construct_and_set_matching_fn(Args &&...args)
void call(IndexMask mask, fn::MFParams params, fn::MFContext UNUSED(context)) const override
MusgraveFunction(const int dimensions, const int musgrave_type)
static fn::MFSignature create_signature(const int dimensions, const int musgrave_type)
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
static void node_shader_buts_tex_musgrave(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
static const char * gpu_shader_name_get(const int type, const int dimensions)
static int node_shader_gpu_tex_musgrave(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
static void sh_node_musgrave_build_multi_function(NodeMultiFunctionBuilder &builder)
static void sh_node_tex_musgrave_declare(NodeDeclarationBuilder &b)
static void node_shader_update_tex_musgrave(bNodeTree *ntree, bNode *node)
static void node_shader_init_tex_musgrave(bNodeTree *UNUSED(ntree), bNode *node)
float musgrave_multi_fractal(float co, float H, float lacunarity, float octaves)
float musgrave_ridged_multi_fractal(float co, float H, float lacunarity, float octaves, float offset, float gain)
float musgrave_fBm(float co, float H, float lacunarity, float octaves)
float musgrave_hybrid_multi_fractal(float co, float H, float lacunarity, float octaves, float offset, float gain)
float musgrave_hetero_terrain(float co, float H, float lacunarity, float octaves, float offset)
vec_base< float, 2 > float2
static const pxr::TfToken out("out", pxr::TfToken::Immortal)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
void register_node_type_sh_tex_musgrave()
void node_shader_gpu_tex_mapping(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *UNUSED(out))
void node_shader_gpu_default_tex_coord(GPUMaterial *mat, bNode *node, GPUNodeLink **link)
void sh_fn_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
void node_sock_label(bNodeSocket *sock, const char *name)
void node_copy_standard_storage(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
void node_free_standard_storage(bNode *node)
void(* draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr)
NodeMultiFunctionBuildFunction build_multi_function
NodeDeclareFunction declare