Commit: dd6a0dc91085c6c5ce5b837b58b82bf729e5c227
Author: Lukas Tönne
Date:   Tue Jan 19 23:29:51 2016 +0100
Branches: object_nodes
https://developer.blender.org/rBdd6a0dc91085c6c5ce5b837b58b82bf729e5c227

Basic image sampling node for reading interpolated color values from an Image 
datablock.

===================================================================

M       release/scripts/nodes/common_nodes.py
M       release/scripts/nodes/geometry_nodes.py
M       source/blender/blenvm/bvm/CMakeLists.txt
M       source/blender/blenvm/bvm/bvm_eval.cc
M       source/blender/blenvm/bvm/bvm_eval.h
A       source/blender/blenvm/bvm/bvm_eval_image.h
M       source/blender/blenvm/bvm/bvm_opcode.h
M       source/blender/blenvm/compile/bvm_nodegraph.cc
M       source/blender/blenvm/intern/bvm_api.cc
M       source/blender/depsgraph/DEG_depsgraph_build.h
M       source/blender/depsgraph/intern/depsgraph_build.cc
M       source/blender/depsgraph/intern/depsgraph_build.h
M       source/blender/depsgraph/intern/depsgraph_build_nodes.cc
M       source/blender/depsgraph/intern/depsgraph_build_relations.cc
M       source/blender/depsgraph/intern/depsnode_opcodes.h
M       source/blender/makesrna/intern/rna_depsgraph.c

===================================================================

diff --git a/release/scripts/nodes/common_nodes.py 
b/release/scripts/nodes/common_nodes.py
index 5196834..b5ef3b1 100644
--- a/release/scripts/nodes/common_nodes.py
+++ b/release/scripts/nodes/common_nodes.py
@@ -958,6 +958,36 @@ class TextureVoronoiNode(CommonNodeBase, ObjectNode):
 
 ###############################################################################
 
+class ImageSampleNode(CommonNodeBase, ObjectNode):
+    '''Sample an image'''
+    bl_idname = 'ImageSampleNode'
+    bl_label = 'Image Sample'
+
+    bl_id_property_type = 'IMAGE'
+
+    def draw_buttons(self, context, layout):
+        layout.template_ID(self, "id")
+
+    def eval_dependencies(self, depsnode):
+        ima = self.id
+        if ima:
+            depsnode.add_image_relation(ima, 'PARAMETERS')
+
+    def init(self, context):
+        self.inputs.new('NodeSocketVector', "UV")
+        self.outputs.new('NodeSocketColor', "Color")
+
+    def compile(self, compiler):
+        if self.id is None:
+            return
+        ima = compiler.get_id_key(self.id)
+        node = compiler.add_node("IMAGE_SAMPLE")
+        node.inputs[0].set_value(ima)
+        compiler.map_input(0, node.inputs[1])
+        compiler.map_output(0, node.outputs[0])
+
+###############################################################################
+
 def register():
     bpy.utils.register_module(__name__)
 
diff --git a/release/scripts/nodes/geometry_nodes.py 
b/release/scripts/nodes/geometry_nodes.py
index 5122a1c..7ddc266 100644
--- a/release/scripts/nodes/geometry_nodes.py
+++ b/release/scripts/nodes/geometry_nodes.py
@@ -469,6 +469,7 @@ def register():
             NodeItem("GeometryClosestPointNode"),
             ]),
         GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[
+            NodeItem("ImageSampleNode"),
             NodeItem("ObjectTextureCloudsNode"),
             NodeItem("ObjectTextureDistNoiseNode"),
             NodeItem("ObjectTextureMagicNode"),
diff --git a/source/blender/blenvm/bvm/CMakeLists.txt 
b/source/blender/blenvm/bvm/CMakeLists.txt
index fd8add6..6f93d9b 100644
--- a/source/blender/blenvm/bvm/CMakeLists.txt
+++ b/source/blender/blenvm/bvm/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
        ../../blenkernel
        ../../blenlib
        ../../bmesh
+       ../../imbuf
        ../../makesdna
        ../../makesrna
        ../../../../intern/guardedalloc
@@ -43,6 +44,7 @@ set(SRC
        bvm_eval.h
        bvm_eval_common.h
        bvm_eval_curve.h
+       bvm_eval_image.h
        bvm_eval_math.h
        bvm_eval_mesh.h
        bvm_eval_texture.h
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc 
b/source/blender/blenvm/bvm/bvm_eval.cc
index e4cb57a..916844c 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -41,12 +41,16 @@ extern "C" {
 #include "BKE_bvhutils.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_image.h"
 #include "BKE_material.h"
+
+#include "IMB_imbuf_types.h"
 }
 
 #include "bvm_eval.h"
 #include "bvm_eval_common.h"
 #include "bvm_eval_curve.h"
+#include "bvm_eval_image.h"
 #include "bvm_eval_math.h"
 #include "bvm_eval_mesh.h"
 #include "bvm_eval_texture.h"
@@ -55,6 +59,16 @@ extern "C" {
 
 namespace bvm {
 
+EvalGlobals::EvalGlobals()
+{
+       m_image_pool = BKE_image_pool_new();
+}
+
+EvalGlobals::~EvalGlobals()
+{
+       BKE_image_pool_free(m_image_pool);
+}
+
 int EvalGlobals::get_id_key(ID *id)
 {
        int hash = BLI_ghashutil_strhash(id->name);
@@ -82,6 +96,31 @@ PointerRNA EvalGlobals::lookup_object(int key) const
        }
 }
 
+void EvalGlobals::add_image(int key, Image *ima)
+{
+       m_images[key] = ima;
+}
+
+ImBuf *EvalGlobals::lookup_imbuf(int key, ImageUser *iuser) const
+{
+       ImageMap::const_iterator ima_it = m_images.find(key);
+       Image *ima = (ima_it != m_images.end()) ? ima_it->second : NULL;
+       if (!ima)
+               return NULL;
+       
+       /* local changes to the original ImageUser */
+//     if (!BKE_image_is_multilayer(ima))
+//             iuser->multi_index = 
BKE_scene_multiview_view_id_get(this->m_rd, this->m_viewName);
+       
+       ImBuf *ibuf = BKE_image_pool_acquire_ibuf(ima, iuser, m_image_pool);
+       if (!ibuf || (!ibuf->rect && !ibuf->rect_float)) {
+               BKE_image_pool_release_ibuf(ima, ibuf, m_image_pool);
+               return NULL;
+       }
+       
+       return ibuf;
+}
+
 /* ------------------------------------------------------------------------- */
 
 int EvalStack::stack_size(size_t datasize)
@@ -1094,6 +1133,14 @@ void EvalContext::eval_instructions(const EvalGlobals 
*globals, const Instructio
                                break;
                        }
                        
+                       case OP_IMAGE_SAMPLE: {
+                               StackIndex offset_image = 
fn->read_stack_index(&instr);
+                               StackIndex offset_uv = 
fn->read_stack_index(&instr);
+                               StackIndex offset_color = 
fn->read_stack_index(&instr);
+                               eval_op_image_sample(globals, stack, 
offset_image, offset_uv, offset_color);
+                               break;
+                       }
+                       
                        case OP_MAKE_DUPLI: {
                                StackIndex offset_object = 
fn->read_stack_index(&instr);
                                StackIndex offset_transform = 
fn->read_stack_index(&instr);
diff --git a/source/blender/blenvm/bvm/bvm_eval.h 
b/source/blender/blenvm/bvm/bvm_eval.h
index 2e167f7..40095f2 100644
--- a/source/blender/blenvm/bvm/bvm_eval.h
+++ b/source/blender/blenvm/bvm/bvm_eval.h
@@ -32,6 +32,7 @@
  *  \ingroup bvm
  */
 
+#include <set>
 #include <vector>
 
 #include "MEM_guardedalloc.h"
@@ -44,6 +45,10 @@ extern "C" {
 #include "bvm_util_string.h"
 
 struct ID;
+struct Image;
+struct ImagePool;
+struct ImageUser;
+struct ImBuf;
 struct Object;
 
 namespace bvm {
@@ -54,14 +59,23 @@ struct InstructionList;
 
 struct EvalGlobals {
        typedef unordered_map<int, Object *> ObjectMap;
+       typedef unordered_map<int, Image *> ImageMap;
+       
+       EvalGlobals();
+       ~EvalGlobals();
        
        static int get_id_key(ID *id);
        
        void add_object(int key, Object *ob);
        PointerRNA lookup_object(int key) const;
        
+       void add_image(int key, Image *ima);
+       ImBuf *lookup_imbuf(int key, ImageUser *iuser) const;
+       
 private:
        ObjectMap m_objects;
+       ImageMap m_images;
+       ImagePool *m_image_pool;
 
        MEM_CXX_CLASS_ALLOC_FUNCS("BVM:EvalGlobals")
 };
diff --git a/source/blender/blenvm/bvm/bvm_eval_image.h 
b/source/blender/blenvm/bvm/bvm_eval_image.h
new file mode 100644
index 0000000..041d905
--- /dev/null
+++ b/source/blender/blenvm/bvm/bvm_eval_image.h
@@ -0,0 +1,104 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BVM_EVAL_IMAGE_H__
+#define __BVM_EVAL_IMAGE_H__
+
+/** \file bvm_eval_image.h
+ *  \ingroup bvm
+ */
+
+extern "C" {
+#include "BLI_math_color.h"
+
+#include "DNA_image_types.h"
+
+#include "BKE_image.h"
+#include "BKE_scene.h"
+
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+#include "IMB_colormanagement.h"
+}
+
+#include "bvm_eval_common.h"
+
+#include "bvm_util_math.h"
+
+namespace bvm {
+
+/* nearest sampling mode */
+inline static void imbuf_sample_nearest(struct ImBuf *ibuf, const float3 &uv, 
float4 &color)
+{
+       /* ImBuf in must have a valid rect or rect_float, assume this is 
already checked */
+       
+       int x1 = (int)uv.x;
+       int y1 = (int)uv.y;
+       
+       /* sample area entirely outside image? */
+       if (x1 < 0 || x1 > ibuf->x - 1 || y1 < 0 || y1 > ibuf->y - 1) {
+               color.x = color.y = color.z = color.w = 0.0f;
+               return;
+       }
+       
+       if (ibuf->rect_float) {
+               const float *data = ibuf->rect_float + ((size_t)ibuf->x * y1 + 
x1) * 4;
+               copy_v4_v4(color.data(), data);
+       }
+       else {
+               const unsigned char *data = (unsigned char *)ibuf->rect + 
((size_t)ibuf->x * y1 + x1) * 4;
+               rgba_uchar_to_float(color.data(), data);
+       }
+}
+
+static void eval_op_image_sample(const EvalGlobals *globals,
+                                 EvalStack *stack,
+                                 StackIndex offset_image,
+                                 StackIndex offset_uv,
+                                 StackIndex offset_color)
+{
+       float4 color(0.0f, 0.0f, 0.0f, 0.0f);
+       
+       int ima_key = stack_load_int(stack, offset_image);
+       
+       /* TODO just a dummy ImageUser for now */
+       ImageUser iuser = {0};
+       iuser.ok = true;
+       
+       ImBuf *ibuf = globals->lookup_imbuf(ima_key, &iuser);
+       if (ibuf) {
+               float3 uv = stack_load_float3(stack, offset_uv);
+               
+               imbuf_sample_nearest(ibuf, uv, color);
+       }
+       
+       stack_store_float4(stack, offset_color, color);
+}
+
+} /* namespace bvm */
+
+#endif /* __BVM_EVAL_IMAGE_H__ */
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h 
b/source/blender/blenvm/bvm/bvm_opcode.h
index b635ec3..abaad0d 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -152,6 +152,8 @@ namespace bvm {
        \
        DEF_OPCODE(CURVE_PATH) \
        \
+       DEF_OPCODE(IMAGE_SAMPLE) \
+       \
        DEF_OPCODE(MAKE_DUPLI) \
        DEF_OPCODE(DUPLIS_COMBINE) \
        \
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc 
b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 98cafa7..17751f2 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -1358,6 +1358,8 @@ OpCode get_opcode_from_node_type(const string &node)
        
        NODETYPE(CURVE_PATH);
        
+       NODETYPE(IMAGE_SAMPLE);
+       
        NODETYPE(MAKE_DUPLI);
        NODETYPE(DUPLIS_COMBINE);
        
@@ -1837,6 +1839,11 @@ static void register_opcode_node_types()
        nt->add_input("duplis_b", "DUPLIS", __empty_duplilist__);
        nt->add_output("duplis", "DUPLIS");
        
+       nt = NodeGraph::add_function_node_type("IMAGE_SAMPLE");
+       nt->add_input("image", "INT", 0);
+       nt->add_input("uv", "FLOAT3", float3(0.0f, 0.0f, 0.0f))

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to