[Bf-blender-cvs] [b8a4646] object_nodes: Invoke the BVM expression eval for effectors.

Lukas Tönne noreply at git.blender.org
Tue Nov 24 09:42:57 CET 2015


Commit: b8a4646856c4e741826a7c426f806c808636b9a2
Author: Lukas Tönne
Date:   Sun Oct 11 12:24:55 2015 +0200
Branches: object_nodes
https://developer.blender.org/rBb8a4646856c4e741826a7c426f806c808636b9a2

Invoke the BVM expression eval for effectors.

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

M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenvm/BVM_api.h
M	source/blender/blenvm/intern/bvm_api.cc
M	source/blender/blenvm/intern/bvm_eval.cc
M	source/blender/blenvm/intern/bvm_eval.h
M	source/blender/blenvm/intern/bvm_expression.cc
M	source/blender/blenvm/intern/bvm_expression.h
M	source/blender/blenvm/intern/bvm_type_desc.h
M	source/blender/blenvm/util/bvm_util_hash.h

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

diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 5a28e28..da859ee 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -1020,7 +1020,7 @@ void pdDoEffectors(struct EffectorContext *effctx, ListBase *colliders, Effector
 
 		for (; p<tot; p+=step) {
 			if (eff->expression) {
-				BVM_eval_expression(effctx->eval_context, eff->expression);
+				BVM_eval_forcefield(effctx->eval_context, eff->expression, force, impulse);
 			}
 			else if (get_effector_data(eff, &efd, point, 0)) {
 				efd.falloff= effector_falloff(eff, &efd, point, weights);
diff --git a/source/blender/blenvm/BVM_api.h b/source/blender/blenvm/BVM_api.h
index d373d7b..56724a0 100644
--- a/source/blender/blenvm/BVM_api.h
+++ b/source/blender/blenvm/BVM_api.h
@@ -71,7 +71,7 @@ struct BVMEvalContext;
 struct BVMEvalContext *BVM_context_create(void);
 void BVM_context_free(struct BVMEvalContext *result);
 
-void BVM_eval_expression(struct BVMEvalContext *context, struct BVMExpression *expr);
+void BVM_eval_forcefield(struct BVMEvalContext *context, struct BVMExpression *expr, float force[3], float impulse[3]);
 
 /* ------------------------------------------------------------------------- */
 
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index 17600fe..c6beeb0 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -91,11 +91,10 @@ struct BVMEvalContext *BVM_context_create(void)
 void BVM_context_free(struct BVMEvalContext *ctx)
 { delete _CTX(ctx); }
 
-void BVM_eval_expression(struct BVMEvalContext *ctx, struct BVMExpression *expr)
+void BVM_eval_forcefield(struct BVMEvalContext *ctx, struct BVMExpression *expr, float force[3], float impulse[3])
 {
-	// TODO
-	(void)ctx;
-	(void)expr;
+	void *results[] = { force, impulse };
+	_CTX(ctx)->eval_expression(*_EXPR(expr), results);
 }
 
 /* ------------------------------------------------------------------------- */
diff --git a/source/blender/blenvm/intern/bvm_eval.cc b/source/blender/blenvm/intern/bvm_eval.cc
index 6b01593..ebb06d3 100644
--- a/source/blender/blenvm/intern/bvm_eval.cc
+++ b/source/blender/blenvm/intern/bvm_eval.cc
@@ -30,6 +30,7 @@
  */
 
 #include "bvm_eval.h"
+#include "bvm_expression.h"
 
 namespace bvm {
 
@@ -41,4 +42,9 @@ EvalContext::~EvalContext()
 {
 }
 
+void EvalContext::eval_expression(const Expression &expr, void **results) const
+{
+	
+}
+
 } /* namespace bvm */
diff --git a/source/blender/blenvm/intern/bvm_eval.h b/source/blender/blenvm/intern/bvm_eval.h
index a5d064a..f4dd17c 100644
--- a/source/blender/blenvm/intern/bvm_eval.h
+++ b/source/blender/blenvm/intern/bvm_eval.h
@@ -32,13 +32,40 @@
  *  \ingroup bvm
  */
 
+#include "bvm_type_desc.h"
+
+#include "bvm_util_map.h"
+#include "bvm_util_string.h"
+
 namespace bvm {
 
+struct Expression;
+
+#if 0
+struct EvalResult {
+	typedef unordered_map<string, Value> ValueMap;
+	
+	template <typename T>
+	bool get(const string &name, T data) const
+	{
+		ValueMap::const_iterator it = m_values.find(name);
+		if (it == m_values.end())
+			return false;
+		
+		const Value *value = it->second;
+		return value->get<T>(data);
+	}
+	
+private:
+	ValueMap m_values;
+};
+#endif
+
 struct EvalContext {
 	EvalContext();
 	~EvalContext();
 	
-	
+	void eval_expression(const Expression &expr, void **results) const;
 };
 
 } /* namespace bvm */
diff --git a/source/blender/blenvm/intern/bvm_expression.cc b/source/blender/blenvm/intern/bvm_expression.cc
index d71b0d2..af8983f 100644
--- a/source/blender/blenvm/intern/bvm_expression.cc
+++ b/source/blender/blenvm/intern/bvm_expression.cc
@@ -43,12 +43,9 @@ Expression::~Expression()
 {
 }
 
-void Expression::add_return_value(BVMType type, const string &name)
+void Expression::add_return_value(const TypeDesc &typedesc, const string &name)
 {
-	ReturnValue rval;
-	rval.type = type;
-	rval.name = name;
-	return_values.push_back(rval);
+	return_values.push_back(ReturnValue(typedesc, name));
 }
 
 size_t Expression::return_values_size() const
diff --git a/source/blender/blenvm/intern/bvm_expression.h b/source/blender/blenvm/intern/bvm_expression.h
index 1401894..9b92a17 100644
--- a/source/blender/blenvm/intern/bvm_expression.h
+++ b/source/blender/blenvm/intern/bvm_expression.h
@@ -35,7 +35,7 @@
 #include <vector>
 #include <stdint.h>
 
-#include "BVM_types.h"
+#include "bvm_type_desc.h"
 #include "bvm_util_string.h"
 
 namespace bvm {
@@ -53,7 +53,12 @@ enum OpCode {
 
 struct Expression {
 	struct ReturnValue {
-		BVMType type;
+		ReturnValue(const TypeDesc &typedesc, const string &name) :
+		    typedesc(typedesc),
+		    name(name)
+		{}
+		
+		TypeDesc typedesc;
 		string name;
 	};
 	typedef std::vector<ReturnValue> ReturnValueList;
@@ -61,7 +66,7 @@ struct Expression {
 	Expression();
 	~Expression();
 	
-	void add_return_value(BVMType type, const string &name = "");
+	void add_return_value(const TypeDesc &typedesc, const string &name = "");
 	size_t return_values_size() const;
 	const ReturnValue &return_value(size_t index) const;
 	const ReturnValue &return_value(const string &name) const;
diff --git a/source/blender/blenvm/intern/bvm_type_desc.h b/source/blender/blenvm/intern/bvm_type_desc.h
index a264a38..293a869 100644
--- a/source/blender/blenvm/intern/bvm_type_desc.h
+++ b/source/blender/blenvm/intern/bvm_type_desc.h
@@ -54,6 +54,10 @@ struct BaseTypeTraits<BVM_FLOAT3> {
 /* ------------------------------------------------------------------------- */
 
 struct TypeDesc {
+	TypeDesc(BVMType base_type) :
+	    base_type(base_type)
+	{}
+	
 	BVMType base_type;
 };
 
@@ -61,40 +65,74 @@ struct TypeDesc {
 
 struct Value {
 	template <typename T>
-	static inline Value *create(BVMType type, T value);
+	static Value *create(BVMType type, T data);
 	
 	virtual ~Value()
 	{}
 	
+	const TypeDesc &typedesc() const { return m_typedesc; }
+	
+	template <typename T>
+	void get(T data) const;
+	
 protected:
-	Value()
+	Value(const TypeDesc &typedesc) :
+	    m_typedesc(typedesc)
 	{}
+	
+	TypeDesc m_typedesc;
 };
 
 template <BVMType type>
 struct ValueType : public Value {
 	typedef BaseTypeTraits<type> traits;
+	typedef typename traits::POD POD;
 	
-	ValueType(typename traits::POD value) :
-	    value(value)
+	ValueType(typename traits::POD data) :
+	    Value(TypeDesc(type)),
+	    m_data(data)
 	{}
 	
 	template <typename T>
-	ValueType(T value)
+	ValueType(T data)
 	{}
 	
-	TypeDesc *typedesc;
-	typename traits::POD value;
+	const POD &data() const { return m_data; }
+	
+	bool get(POD &data)
+	{
+		data = m_data;
+		return true;
+	}
+	
+	template <typename T>
+	bool get(T data)
+	{
+		(void)data;
+		return false;
+	}
+	
+private:
+	typename traits::POD m_data;
 };
 
 /* ========================================================================= */
 
 template <typename T>
-inline Value *Value::create(BVMType type, T value)
+Value *Value::create(BVMType type, T data)
 {
 	switch (type) {
-		case BVM_FLOAT: return ValueType<BVM_FLOAT>(value);
-		case BVM_FLOAT3: return ValueType<BVM_FLOAT3>(value);
+		case BVM_FLOAT: return ValueType<BVM_FLOAT>(data);
+		case BVM_FLOAT3: return ValueType<BVM_FLOAT3>(data);
+	}
+}
+
+template <typename T>
+void Value::get(T data) const
+{
+	switch (m_typedesc.base_type) {
+		case BVM_FLOAT: return static_cast< ValueType<BVM_FLOAT>* >(this)->get(data);
+		case BVM_FLOAT3: return static_cast< ValueType<BVM_FLOAT3>* >(this)->get(data);
 	}
 }
 
diff --git a/source/blender/blenvm/util/bvm_util_hash.h b/source/blender/blenvm/util/bvm_util_hash.h
index 50282f8..a355336 100644
--- a/source/blender/blenvm/util/bvm_util_hash.h
+++ b/source/blender/blenvm/util/bvm_util_hash.h
@@ -31,6 +31,8 @@
 #ifndef __BVM_UTIL_HASH_H__
 #define __BVM_UTIL_HASH_H__
 
+#include <string>
+
 #if defined(BVM_NO_UNORDERED_MAP)
 #  define BVM_HASH_NAMESPACE_BEGIN
 #  define BVM_HASH_NAMESPACE_END




More information about the Bf-blender-cvs mailing list