[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