[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