[Bf-blender-cvs] [e0f6b91] object_nodes: Internal support for 4x4 matrices in the bvm types.
Lukas Tönne
noreply at git.blender.org
Tue Nov 24 09:43:32 CET 2015
Commit: e0f6b915e84e15a1943ddf430305c2fb884dfea0
Author: Lukas Tönne
Date: Tue Oct 27 10:16:23 2015 +0100
Branches: object_nodes
https://developer.blender.org/rBe0f6b915e84e15a1943ddf430305c2fb884dfea0
Internal support for 4x4 matrices in the bvm types.
===================================================================
M source/blender/blenvm/BVM_types.h
M source/blender/blenvm/bvm/bvm_eval.cc
M source/blender/blenvm/bvm/bvm_expression.h
M source/blender/blenvm/bvm/bvm_opcode.h
M source/blender/blenvm/compile/bvm_codegen.cc
M source/blender/blenvm/compile/bvm_codegen.h
M source/blender/blenvm/compile/bvm_nodegraph.cc
M source/blender/blenvm/util/bvm_util_typedesc.h
===================================================================
diff --git a/source/blender/blenvm/BVM_types.h b/source/blender/blenvm/BVM_types.h
index 0e2ed2e..784f67a 100644
--- a/source/blender/blenvm/BVM_types.h
+++ b/source/blender/blenvm/BVM_types.h
@@ -40,6 +40,7 @@ typedef enum BVMType {
BVM_FLOAT,
BVM_FLOAT3,
BVM_INT,
+ BVM_MATRIX44,
} BVMType;
#ifdef __cplusplus
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 65d134b..c838e23 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -68,6 +68,11 @@ inline static int stack_load_int(float *stack, StackIndex offset)
return *(int *)(&stack[offset]);
}
+inline static matrix44 stack_load_matrix44(float *stack, StackIndex offset)
+{
+ return *(matrix44 *)(&stack[offset]);
+}
+
inline static void stack_store_float(float *stack, StackIndex offset, float f)
{
*(float *)(&stack[offset]) = f;
@@ -83,6 +88,11 @@ inline static void stack_store_int(float *stack, StackIndex offset, int i)
*(int *)(&stack[offset]) = i;
}
+inline static void stack_store_matrix44(float *stack, StackIndex offset, matrix44 m)
+{
+ *(matrix44 *)(&stack[offset]) = m;
+}
+
/* ------------------------------------------------------------------------- */
static void eval_op_value_float(float *stack, float value, StackIndex offset)
@@ -313,6 +323,14 @@ static void eval_op_normalize_float3(float *stack, StackIndex offset, StackIndex
stack_store_float(stack, offset_val, l);
}
+static void eval_op_effector_transform(const EvalGlobals *globals, float *stack, int object_index, StackIndex offset_tfm)
+{
+ Object *ob = globals->objects[object_index];
+ matrix44 m;
+ m.from_data(&ob->obmat[0][0], matrix44::COL_MAJOR);
+ stack_store_matrix44(stack, offset_tfm, m);
+}
+
static void eval_op_effector_closest_point(const EvalGlobals *globals, float *stack, int object_index, StackIndex offset_vector,
StackIndex offset_position, StackIndex offset_normal, StackIndex offset_tangent)
{
@@ -586,6 +604,12 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
eval_op_normalize_float3(stack, offset, offset_vec, offset_val);
break;
}
+ case OP_EFFECTOR_TRANSFORM: {
+ int object_index = expr->read_int(&instr);
+ StackIndex offset_tfm = expr->read_stack_index(&instr);
+ eval_op_effector_transform(globals, stack, object_index, offset_tfm);
+ break;
+ }
case OP_EFFECTOR_CLOSEST_POINT: {
int object_index = expr->read_int(&instr);
StackIndex offset_vector = expr->read_stack_index(&instr);
diff --git a/source/blender/blenvm/bvm/bvm_expression.h b/source/blender/blenvm/bvm/bvm_expression.h
index a71ac62..00a5220 100644
--- a/source/blender/blenvm/bvm/bvm_expression.h
+++ b/source/blender/blenvm/bvm/bvm_expression.h
@@ -130,6 +130,29 @@ struct Expression {
return i;
}
+ matrix44 read_matrix44(int *instr) const
+ {
+ matrix44 m;
+ m.data[0][0] = instruction_to_float(instructions[*instr + 0]);
+ m.data[0][1] = instruction_to_float(instructions[*instr + 1]);
+ m.data[0][2] = instruction_to_float(instructions[*instr + 2]);
+ m.data[0][3] = instruction_to_float(instructions[*instr + 3]);
+ m.data[0][0] = instruction_to_float(instructions[*instr + 4]);
+ m.data[0][1] = instruction_to_float(instructions[*instr + 5]);
+ m.data[0][2] = instruction_to_float(instructions[*instr + 6]);
+ m.data[0][3] = instruction_to_float(instructions[*instr + 7]);
+ m.data[0][0] = instruction_to_float(instructions[*instr + 8]);
+ m.data[0][1] = instruction_to_float(instructions[*instr + 9]);
+ m.data[0][2] = instruction_to_float(instructions[*instr + 10]);
+ m.data[0][3] = instruction_to_float(instructions[*instr + 11]);
+ m.data[3][0] = instruction_to_float(instructions[*instr + 12]);
+ m.data[3][1] = instruction_to_float(instructions[*instr + 13]);
+ m.data[3][2] = instruction_to_float(instructions[*instr + 14]);
+ m.data[3][3] = instruction_to_float(instructions[*instr + 15]);
+ (*instr) += 16;
+ return m;
+ }
+
void add_instruction(Instruction v);
ReturnValue &add_return_value(const TypeDesc &typedesc, const string &name = "");
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index 1587b5e..0ae6409 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -75,6 +75,7 @@ enum OpCode {
OP_CROSS_FLOAT3,
OP_NORMALIZE_FLOAT3,
+ OP_EFFECTOR_TRANSFORM,
OP_EFFECTOR_CLOSEST_POINT,
OP_END,
diff --git a/source/blender/blenvm/compile/bvm_codegen.cc b/source/blender/blenvm/compile/bvm_codegen.cc
index 7f51283..1dff16a 100644
--- a/source/blender/blenvm/compile/bvm_codegen.cc
+++ b/source/blender/blenvm/compile/bvm_codegen.cc
@@ -109,6 +109,26 @@ void BVMCompiler::push_int(int i)
expr->add_instruction(int_to_instruction(i));
}
+void BVMCompiler::push_matrix44(matrix44 m)
+{
+ expr->add_instruction(float_to_instruction(m.data[0][0]));
+ expr->add_instruction(float_to_instruction(m.data[0][1]));
+ expr->add_instruction(float_to_instruction(m.data[0][2]));
+ expr->add_instruction(float_to_instruction(m.data[0][3]));
+ expr->add_instruction(float_to_instruction(m.data[1][0]));
+ expr->add_instruction(float_to_instruction(m.data[1][1]));
+ expr->add_instruction(float_to_instruction(m.data[1][2]));
+ expr->add_instruction(float_to_instruction(m.data[1][3]));
+ expr->add_instruction(float_to_instruction(m.data[2][0]));
+ expr->add_instruction(float_to_instruction(m.data[2][1]));
+ expr->add_instruction(float_to_instruction(m.data[2][2]));
+ expr->add_instruction(float_to_instruction(m.data[2][3]));
+ expr->add_instruction(float_to_instruction(m.data[3][0]));
+ expr->add_instruction(float_to_instruction(m.data[3][1]));
+ expr->add_instruction(float_to_instruction(m.data[3][2]));
+ expr->add_instruction(float_to_instruction(m.data[3][3]));
+}
+
StackIndex BVMCompiler::codegen_value(const Value *value)
{
StackIndex offset = assign_stack_index(value->typedesc());
diff --git a/source/blender/blenvm/compile/bvm_codegen.h b/source/blender/blenvm/compile/bvm_codegen.h
index acf8cab..a374c09 100644
--- a/source/blender/blenvm/compile/bvm_codegen.h
+++ b/source/blender/blenvm/compile/bvm_codegen.h
@@ -60,6 +60,7 @@ struct BVMCompiler {
void push_float(float f);
void push_float3(float3 f);
void push_int(int i);
+ void push_matrix44(matrix44 m);
StackIndex codegen_value(const Value *value);
void codegen_constant(const Value *value);
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index aee45c0..2315477 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -590,6 +590,7 @@ OpCode get_opcode_from_node_type(const string &node)
NODETYPE(CROSS_FLOAT3);
NODETYPE(NORMALIZE_FLOAT3);
+ NODETYPE(EFFECTOR_TRANSFORM);
NODETYPE(EFFECTOR_CLOSEST_POINT);
#undef NODETYPE
@@ -692,6 +693,10 @@ void register_opcode_node_types()
nt->add_output("vector", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
nt->add_output("value", BVM_FLOAT, 0.0f);
+ nt = NodeGraph::add_node_type("EFFECTOR_TRANSFORM");
+ nt->add_input("object", BVM_INT, 0, true);
+ nt->add_output("transform", BVM_MATRIX44, matrix44::identity());
+
nt = NodeGraph::add_node_type("EFFECTOR_CLOSEST_POINT");
nt->add_input("object", BVM_INT, 0, true);
nt->add_input("vector", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
diff --git a/source/blender/blenvm/util/bvm_util_typedesc.h b/source/blender/blenvm/util/bvm_util_typedesc.h
index ff2ad7b..7dceb9a 100644
--- a/source/blender/blenvm/util/bvm_util_typedesc.h
+++ b/source/blender/blenvm/util/bvm_util_typedesc.h
@@ -63,6 +63,57 @@ struct float3 {
float z;
};
+struct matrix44 {
+ enum Layout {
+ COL_MAJOR,
+ ROW_MAJOR,
+ };
+
+ matrix44()
+ {}
+
+ matrix44(const float3 &x, const float3 &y, const float3 &z, const float3 &t)
+ {
+ data[0][0] = x.x; data[1][0] = y.x; data[2][0] = z.x; data[3][0] = t.x;
+ data[0][1] = x.y; data[1][1] = y.y; data[2][1] = z.y; data[3][1] = t.y;
+ data[0][2] = x.z; data[1][2] = y.z; data[2][2] = z.z; data[3][2] = t.z;
+ data[0][3] = 0.0f; data[1][3] = 0.0f; data[2][3] = 0.0f; data[3][3] = 1.0f;
+ }
+
+ matrix44(const float3 &t)
+ {
+ data[0][0] = 1.0f; data[1][0] = 0.0f; data[2][0] = 0.0f; data[3][0] = t.x;
+ data[0][1] = 0.0f; data[1][1] = 1.0f; data[2][1] = 0.0f; data[3][1] = t.y;
+ data[0][2] = 0.0f; data[1][2] = 0.0f; data[2][2] = 1.0f; data[3][2] = t.z;
+ data[0][3] = 0.0f; data[1][3] = 0.0f; data[2][3] = 0.0f; data[3][3] = 1.0f;
+ }
+
+ void from_data(float *values, Layout layout = COL_MAJOR) {
+ if (layout == COL_MAJOR) {
+ data[0][0] = values[0]; data[1][0] = values[1]; data[2][0] = values[2]; data[3][0] = values[3];
+ data[0][1] = values[4]; data[1][1] = values[5]; data[2][1] = values[6]; data[3][1] = values[7];
+ data[0][2] = values[8]; data[1][2] = values[9]; data[2][2] = values[10]; data[3][2] = values[11];
+ data[0][3] = values[12]; data[1][3] = values[13]; data[2][3] = values[14]; data[3][3] = values[15];
+ }
+ else {
+ data[0][0] = values[0]; data[1][0] = values[4]; data[2][0] = values[8]; data[3][0] = values[12];
+ data[0][1] = values[1]; data[1][1] = values[5]; data[2][1] = values[9]; data[3][1] = values[13];
+ data[0][2] = values[2]; data[1][2] = values[6]; data[2][2] = values[10]; data[3][2] = values[14];
+ data[0][3] = values[3]; data[1][3] = values[7]; data[2][3] = values[11]; data[3][3] = values[15];
+ }
+ }
+
+ inline static matrix44 identity()
+ {
+ return matrix44(float3(1.0f, 0.0f, 0.0f),
+ float3(0.0f, 1.0f, 0.0f),
+ float3(0.0f, 0.0f, 1.0f),
+ float3(0.0f, 0.0f, 0.0f));
+ }
+
+ float data[4][4];
+};
+
template <BVMType type>
struct BaseTypeTraits;
@@ -103,6 +154,18 @@ struct BaseTypeTraits<BVM_INT> {
}
};
+template <>
+struct BaseTypeTraits<BVM_MATRIX44> {
+ typedef matrix44 POD;
+
+ enum eStackSize { stack_size = 16 };
+
+ static inline void copy(POD *to, const POD *from)
+ {
+ *to = *from;
+ }
+};
+
/* ------------------------------------------------------------------------- */
struct TypeDesc {
@@ -184,6 +24
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list