[Bf-blender-cvs] [c98b024] object_nodes: New buffer type 'Image' for 2-dimensional arrays.

Lukas Tönne noreply at git.blender.org
Mon Feb 1 11:24:52 CET 2016


Commit: c98b02495b1d4cb5b0dcb7caddb7c25579ebd619
Author: Lukas Tönne
Date:   Sat Jan 30 13:34:15 2016 +0100
Branches: object_nodes
https://developer.blender.org/rBc98b02495b1d4cb5b0dcb7caddb7c25579ebd619

New buffer type 'Image' for 2-dimensional arrays.

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

M	source/blender/blenvm/BVM_types.h
M	source/blender/blenvm/compile/bvm_nodegraph.cc
M	source/blender/blenvm/compile/bvm_typedesc.cc
M	source/blender/blenvm/compile/bvm_typedesc.h

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

diff --git a/source/blender/blenvm/BVM_types.h b/source/blender/blenvm/BVM_types.h
index 5c2b778..1d16e73 100644
--- a/source/blender/blenvm/BVM_types.h
+++ b/source/blender/blenvm/BVM_types.h
@@ -51,6 +51,7 @@ typedef enum BVMType {
 typedef enum BVMBufferType {
 	BVM_BUFFER_SINGLE,
 	BVM_BUFFER_ARRAY,
+	BVM_BUFFER_IMAGE,
 } BVMBufferType;
 
 typedef enum BVMInputValueType {
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 7ce5406..c26b115 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -819,6 +819,12 @@ NodeInstance *NodeGraph::add_proxy(const TypeDesc &typedesc, Value *default_valu
 				case BVM_DUPLIS: node = add_node("PASS_DUPLIS_ARRAY"); break;
 			}
 			break;
+		case BVM_BUFFER_IMAGE:
+			switch (typedesc.base_type()) {
+				case BVM_FLOAT: node = add_node("PASS_FLOAT_IMAGE"); break;
+				case BVM_INT: node = add_node("PASS_INT_IMAGE"); break;
+			}
+			break;
 	}
 	if (node && default_value)
 		node->input_value_set("value", default_value);
diff --git a/source/blender/blenvm/compile/bvm_typedesc.cc b/source/blender/blenvm/compile/bvm_typedesc.cc
index 2d59f2c..ec5a634 100644
--- a/source/blender/blenvm/compile/bvm_typedesc.cc
+++ b/source/blender/blenvm/compile/bvm_typedesc.cc
@@ -154,7 +154,29 @@ size_t TypeDesc::size() const
 				}
 				break;
 			case BVM_BUFFER_ARRAY:
-				return 16;
+				switch (m_base_type) {
+					case BVM_FLOAT: return sizeof(array<BVM_FLOAT>);
+					case BVM_FLOAT3: return sizeof(array<BVM_FLOAT>);
+					case BVM_FLOAT4: return sizeof(array<BVM_FLOAT>);
+					case BVM_INT: return sizeof(array<BVM_FLOAT>);
+					case BVM_MATRIX44: return sizeof(array<BVM_FLOAT>);
+					case BVM_STRING: return sizeof(array<BVM_FLOAT>);
+					case BVM_RNAPOINTER: return sizeof(array<BVM_FLOAT>);
+					case BVM_MESH: return sizeof(array<BVM_FLOAT>);
+					case BVM_DUPLIS: return sizeof(array<BVM_FLOAT>);
+				}
+			case BVM_BUFFER_IMAGE:
+				switch (m_base_type) {
+					case BVM_FLOAT: return sizeof(image<BVM_FLOAT>);
+					case BVM_FLOAT3: return sizeof(image<BVM_FLOAT>);
+					case BVM_FLOAT4: return sizeof(image<BVM_FLOAT>);
+					case BVM_INT: return sizeof(image<BVM_FLOAT>);
+					case BVM_MATRIX44: return sizeof(image<BVM_FLOAT>);
+					case BVM_STRING: return sizeof(image<BVM_FLOAT>);
+					case BVM_RNAPOINTER: return sizeof(image<BVM_FLOAT>);
+					case BVM_MESH: return sizeof(image<BVM_FLOAT>);
+					case BVM_DUPLIS: return sizeof(image<BVM_FLOAT>);
+				}
 		}
 	}
 	
@@ -206,6 +228,22 @@ void TypeDesc::copy_value(void *to, const void *from) const
 				}
 #undef COPY_TYPE
 				break;
+			case BVM_BUFFER_IMAGE:
+#define COPY_TYPE(a, b, type) \
+	*(image<type> *)(a) = *(image<type> const *)(b);
+				switch (m_base_type) {
+					case BVM_FLOAT: COPY_TYPE(to, from, BVM_FLOAT); break;
+					case BVM_FLOAT3: COPY_TYPE(to, from, BVM_FLOAT3); break;
+					case BVM_FLOAT4: COPY_TYPE(to, from, BVM_FLOAT4); break;
+					case BVM_INT: COPY_TYPE(to, from, BVM_INT); break;
+					case BVM_MATRIX44: COPY_TYPE(to, from, BVM_MATRIX44); break;
+					case BVM_STRING: COPY_TYPE(to, from, BVM_STRING); break;
+					case BVM_RNAPOINTER: COPY_TYPE(to, from, BVM_RNAPOINTER); break;
+					case BVM_MESH: COPY_TYPE(to, from, BVM_MESH); break;
+					case BVM_DUPLIS: COPY_TYPE(to, from, BVM_DUPLIS); break;
+				}
+#undef COPY_TYPE
+				break;
 		}
 	}
 }
diff --git a/source/blender/blenvm/compile/bvm_typedesc.h b/source/blender/blenvm/compile/bvm_typedesc.h
index 48aa149..10a24b3 100644
--- a/source/blender/blenvm/compile/bvm_typedesc.h
+++ b/source/blender/blenvm/compile/bvm_typedesc.h
@@ -177,7 +177,7 @@ struct const_array {
 	
 	const POD *data() const { return m_data; }
 	
-	const POD& operator [] (size_t index)
+	const POD& operator [] (size_t index) const
 	{
 		return m_data[index];
 	}
@@ -222,6 +222,71 @@ private:
 	size_t m_size;
 };
 
+template <BVMType type>
+struct const_image {
+	typedef BaseTypeTraits<type> traits;
+	typedef typename traits::POD POD;
+	
+	const_image(const POD *data, size_t width, size_t height) :
+	    m_data(data),
+	    m_width(width),
+	    m_height(height)
+	{}
+	
+	~const_image()
+	{}
+	
+	const POD *data() const { return m_data; }
+	
+	const POD& get(size_t x, size_t y) const
+	{
+		return m_data[x + y * m_width];
+	}
+	
+private:
+	POD *m_data;
+	size_t m_width;
+	size_t m_height;
+};
+
+template <BVMType type>
+struct image {
+	typedef BaseTypeTraits<type> traits;
+	typedef typename traits::POD POD;
+	
+	image() :
+	    m_data(NULL),
+	    m_width(0),
+	    m_height(0)
+	{}
+	
+	image(const POD *data, size_t width, size_t height) :
+	    m_data(data),
+	    m_width(width),
+	    m_height(height)
+	{}
+	
+	~image()
+	{}
+	
+	operator const_image<type>() const
+	{
+		return const_image<type>(m_data, m_width, m_height);
+	}
+	
+	POD *data() const { return m_data; }
+	
+	POD& get(size_t x, size_t y)
+	{
+		return m_data[x + y * m_width];
+	}
+	
+private:
+	POD *m_data;
+	size_t m_width;
+	size_t m_height;
+};
+
 /* ------------------------------------------------------------------------- */
 
 struct StructSpec;
@@ -407,6 +472,58 @@ private:
 	array_t m_data;
 };
 
+template <BVMType type>
+struct ImageValue : public Value {
+	typedef BaseTypeTraits<type> traits;
+	typedef typename traits::POD POD;
+	typedef image<type> image_t;
+	typedef const_image<type> const_image_t;
+	
+	ImageValue(const image_t &data) :
+	    Value(TypeDesc(type, BVM_BUFFER_ARRAY)),
+	    m_data(data)
+	{}
+	
+	ImageValue(POD *data, size_t width, size_t height) :
+	    Value(TypeDesc(type, BVM_BUFFER_ARRAY)),
+	    m_data(image_t(data, width, height))
+	{}
+	
+	template <typename T>
+	ImageValue(T data) :
+	    Value(TypeDesc(type, BVM_BUFFER_ARRAY))
+	{ (void)data; }
+	
+	template <typename T>
+	ImageValue(T *data, size_t width, size_t height) :
+	    Value(TypeDesc(type, BVM_BUFFER_ARRAY))
+	{ (void)data; (void)width; (void)height; }
+	
+	const image_t &data() const { return m_data; }
+	
+	bool get(image_t *data) const
+	{
+		*data = m_data;
+		return true;
+	}
+	
+	template <typename T>
+	bool get(T *data) const
+	{
+		assert(!"Data type mismatch");
+		(void)data;
+		return false;
+	}
+	
+	Value *copy() const
+	{
+		return new ImageValue<type>(m_data);
+	}
+	
+private:
+	image_t m_data;
+};
+
 /* ========================================================================= */
 
 template <typename T>




More information about the Bf-blender-cvs mailing list