[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