Commit: 9d216ef72b84e96ced1afac4f2991f1d5a918f5a Author: Charlie Jolly Date: Wed Oct 6 10:55:26 2021 +0200 Branches: temp-geometry-nodes-delete-geometry-image-texture https://developer.blender.org/rB9d216ef72b84e96ced1afac4f2991f1d5a918f5a
Geometry Nodes: Add Image texture node (WIP) Port shader image texture node **Core devs: Please take over if you want to.** {F10797876} Differential Revision: https://developer.blender.org/D12734 =================================================================== M release/datafiles/locale M release/scripts/addons M release/scripts/addons_contrib M release/scripts/startup/nodeitems_builtins.py M source/blender/modifiers/intern/MOD_nodes_evaluator.cc M source/blender/nodes/CMakeLists.txt R050 source/blender/nodes/shader/nodes/node_shader_tex_image.c source/blender/nodes/shader/nodes/node_shader_tex_image.cc M source/tools =================================================================== diff --git a/release/datafiles/locale b/release/datafiles/locale index 4833954c0ac..3d01b77226f 160000 --- a/release/datafiles/locale +++ b/release/datafiles/locale @@ -1 +1 @@ -Subproject commit 4833954c0ac85cc407e1d5a153aa11b1d1823ec0 +Subproject commit 3d01b77226fcd99024ffaa0c12a6c14f22914d9f diff --git a/release/scripts/addons b/release/scripts/addons index f86f25e6221..1f38515d87f 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit f86f25e62217264495d05f116ccb09d575fe9841 +Subproject commit 1f38515d87fb78443f2ead17b4e95411f43dc1b2 diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib index 5a82baad9f9..42da56aa737 160000 --- a/release/scripts/addons_contrib +++ b/release/scripts/addons_contrib @@ -1 +1 @@ -Subproject commit 5a82baad9f986722104280e8354a4427d8e9eab1 +Subproject commit 42da56aa73726710107031787af5eea186797984 diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 923ea22e1e3..fab57a85823 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -633,6 +633,7 @@ geometry_node_categories = [ ]), GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[ NodeItem("ShaderNodeTexNoise"), + NodeItem("ShaderNodeTexImage"), ]), GeometryNodeCategory("GEO_VECTOR", "Vector", items=[ NodeItem("ShaderNodeVectorCurve"), diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc index c5213dc304b..c69096759ab 100644 --- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc +++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc @@ -331,6 +331,7 @@ static void get_socket_value(const SocketRef &socket, void *r_value) if (bsocket.type == SOCK_VECTOR) { if (ELEM(bnode.type, GEO_NODE_SET_POSITION, + SH_NODE_TEX_IMAGE, SH_NODE_TEX_NOISE, GEO_NODE_MESH_TO_POINTS, GEO_NODE_PROXIMITY)) { diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index dab7579d946..7e355310b62 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -324,7 +324,7 @@ set(SRC shader/nodes/node_shader_tex_coord.c shader/nodes/node_shader_tex_environment.c shader/nodes/node_shader_tex_gradient.cc - shader/nodes/node_shader_tex_image.c + shader/nodes/node_shader_tex_image.cc shader/nodes/node_shader_tex_magic.c shader/nodes/node_shader_tex_musgrave.cc shader/nodes/node_shader_tex_noise.cc diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_image.c b/source/blender/nodes/shader/nodes/node_shader_tex_image.cc similarity index 50% rename from source/blender/nodes/shader/nodes/node_shader_tex_image.c rename to source/blender/nodes/shader/nodes/node_shader_tex_image.cc index 09d06c35a5f..5a0dc59317d 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_image.c +++ b/source/blender/nodes/shader/nodes/node_shader_tex_image.cc @@ -19,31 +19,26 @@ #include "../node_shader_util.h" -/* **************** OUTPUT ******************** */ +#include "BKE_image.h" +#include "BLI_noise.hh" +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" -static bNodeSocketTemplate sh_node_tex_image_in[] = { - {SOCK_VECTOR, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE}, - {-1, ""}, -}; +namespace blender::nodes { -static bNodeSocketTemplate sh_node_tex_image_out[] = { - {SOCK_RGBA, N_("Color"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_NO_INTERNAL_LINK}, - {SOCK_FLOAT, - N_("Alpha"), - 0.0f, - 0.0f, - 0.0f, - 0.0f, - 0.0f, - 1.0f, - PROP_NONE, - SOCK_NO_INTERNAL_LINK}, - {-1, ""}, +static void sh_node_tex_image_declare(NodeDeclarationBuilder &b) +{ + b.is_function_node(); + b.add_input<decl::Vector>("Vector").implicit_field(); + b.add_output<decl::Color>("Color").no_muted_links(); + b.add_output<decl::Float>("Alpha").no_muted_links(); }; +}; // namespace blender::nodes + static void node_shader_init_tex_image(bNodeTree *UNUSED(ntree), bNode *node) { - NodeTexImage *tex = MEM_callocN(sizeof(NodeTexImage), "NodeTexImage"); + NodeTexImage *tex = (NodeTexImage *)MEM_callocN(sizeof(NodeTexImage), "NodeTexImage"); BKE_texture_mapping_default(&tex->base.tex_mapping, TEXMAP_TYPE_POINT); BKE_texture_colormapping_default(&tex->base.color_mapping); BKE_imageuser_default(&tex->iuser); @@ -58,12 +53,12 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, GPUNodeStack *out) { Image *ima = (Image *)node->id; - NodeTexImage *tex = node->storage; + NodeTexImage *tex = (NodeTexImage *)node->storage; /* We get the image user from the original node, since GPU image keeps * a pointer to it and the dependency refreshes the original. */ bNode *node_original = node->original ? node->original : node; - NodeTexImage *tex_original = node_original->storage; + NodeTexImage *tex_original = (NodeTexImage *)node_original->storage; ImageUser *iuser = &tex_original->iuser; if (!ima) { @@ -78,7 +73,7 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, node_shader_gpu_tex_mapping(mat, node, in, out); - eGPUSamplerState sampler_state = 0; + eGPUSamplerState sampler_state = GPU_SAMPLER_DEFAULT; switch (tex->extension) { case SHD_IMAGE_EXTENSION_REPEAT: @@ -94,7 +89,7 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, if (tex->interpolation != SHD_INTERP_CLOSEST) { sampler_state |= GPU_SAMPLER_ANISO | GPU_SAMPLER_FILTER; /* TODO(fclem): For now assume mipmap is always enabled. */ - sampler_state |= true ? GPU_SAMPLER_MIPMAP : 0; + sampler_state |= GPU_SAMPLER_MIPMAP; } const bool use_cubic = ELEM(tex->interpolation, SHD_INTERP_CUBIC, SHD_INTERP_SMART); @@ -183,19 +178,234 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, return true; } +namespace blender::nodes { + +class ImageFunction : public fn::MultiFunction { + private: + int interpolation_; + int projection_; + float projection_blend_; + int extension_; + ImBuf *ibuf_; + + public: + ImageFunction( + int interpolation, int projection, float projection_blend, int extension, ImBuf *ibuf) + : interpolation_(interpolation), + projection_(projection), + projection_blend_(projection_blend), + extension_(extension), + ibuf_(ibuf) + { + static fn::MFSignature signature = create_signature(); + this->set_signature(&signature); + } + + static fn::MFSignature create_signature() + { + fn::MFSignatureBuilder signature{"ImageFunction"}; + signature.single_input<float3>("Vector"); + signature.single_output<ColorGeometry4f>("Color"); + signature.single_output<float>("Alpha"); + return signature.build(); + } + + /* Remap coordinate from 0..1 box to -1..-1 */ + static float3 texco_remap_square(float3 co) + { + return (co - float3(0.5f, 0.5f, 0.5f)) * 2.0f; + } + + /* projections */ + static float2 map_to_tube(const float3 co) + { + float len, u, v; + len = sqrtf(co.x * co.x + co.y * co.y); + if (len > 0.0f) { + u = (1.0f - (atan2f(co.x / len, co.y / len) / M_PI)) * 0.5f; + v = (co.z + 1.0f) * 0.5f; + } + else { + u = v = 0.0f; + } + return float2(u, v); + } + + static float2 map_to_sphere(const float3 co) + { + float l = len_v3(co); + float u, v; + if (l > 0.0f) { + if (UNLIKELY(co.x == 0.0f && co.y == 0.0f)) { + u = 0.0f; /* Otherwise domain error. */ + } + else { + u = (1.0f - atan2f(co.x, co.y) / M_PI) / 2.0f; + } + v = 1.0f - safe_acosf(co.z / l) / M_PI; + } + else { + u = v = 0.0f; + } + return float2(u, v); + } + + static float2 map_to_box(const float3 co) + { + float x1, y1, z1, nor[3]; + int ret; + float u, v; + + copy_v3_v3(nor, co); + + x1 = fabsf(nor[0]); + y1 = fabsf(nor[1]); + z1 = fabsf(nor[2]); + + if (z1 >= x1 && z1 >= y1) { + u = (co.x + 1.0f) / 2.0f; + v = (co.y + 1.0f) / 2.0f; + ret = 0; + } + else if (y1 >= x1 && y1 >= z1) { + u = (co.x + 1.0f) / 2.0f; + v = (co.z + 1.0f) / 2.0f; + } + else { + u = (co.y + 1.0f) / 2.0f; + v = (co.z + 1.0f) / 2.0f; + } + return float2(u, v); + } + + void call(IndexMask mask, fn::MFParams params, fn::MFContext UNUSED(context)) const override + { + const VArray<float3> &vector = params.readonly_single_input<float3>(0, "Vector"); + MutableSpan<ColorGeometry4f> r_color = + params.uninitialized_single_output_if_required<ColorGeometry4f>(1, "Color"); + MutableSpan<float> r_alpha = params.uninitialized_single_output_if_required<float>(2, "Alpha"); + + const bool compute_color = !r_color.is_empty(); + const bool compute_alpha = !r_alpha.is_empty(); + + if (ibuf_) { + + /* Hacked together from old Tex nodes and texture.c and cycles! + * texture_procedural.c + * BKE_texture_get_value + * multitex_nodes_intern + */ + + float xsize = ibuf_->x / 2; + float ysize = ibuf_->y / 2; + + if ((!xsize) || (!ysize)) { + return; + } + + if (!ibuf_->rect_float) { + BLI_thread_lock(LOCK_IMAGE); + if (!ibuf_->rect_float) { + IMB_float_from_rect(ibuf_); + } + BLI_thread_unlock(LOCK_IMAGE); + } + + float xoff, yoff; + int px, py; + + for (int64_t i : mask) { + const float *result; + float2 co; + + /* Remap */ + float3 p = texco_remap_square(vector[i]); + + /* Projection - are these needed for GN - most use cases would be things like height maps. + */ + if (projection_ == SHD_PROJ_TUBE) { + co = map_to_tube(p); + } + else if (projection_ == SHD_PROJ_SPHERE) { + co = map_to_sphere(p); + } + else if (projection_ == SHD_PROJ_BOX) { + co = map_to_box(p); // no blending or normal data + } + else { // SHD_PROJ_FLAT + @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs