[Bf-blender-cvs] [91a0b2a] object_nodes: Use the jump address in the array modifier to evaluate a transform function per copy.

Lukas Tönne noreply at git.blender.org
Tue Dec 1 09:53:36 CET 2015


Commit: 91a0b2a8ea12db54b9395f5ea2d831aa22a4db63
Author: Lukas Tönne
Date:   Tue Dec 1 08:52:45 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB91a0b2a8ea12db54b9395f5ea2d831aa22a4db63

Use the jump address in the array modifier to evaluate a transform function per copy.

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

M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_eval.h
M	source/blender/blenvm/bvm/bvm_eval_common.h
M	source/blender/blenvm/bvm/bvm_eval_mesh.h
M	source/blender/blenvm/intern/bvm_api.cc

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

diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 3ae7843..ac7aa5d 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -463,9 +463,12 @@ static void eval_op_effector_closest_point(float *stack, StackIndex offset_objec
 	}
 }
 
-void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *data, const Function *fn, float *stack) const
+void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *data, const Function *fn, int entry_point, float *stack) const
 {
-	int instr = fn->entry_point();
+	EvalKernelData kd;
+	kd.context = this;
+	kd.function = fn;
+	int instr = entry_point;
 	
 	while (true) {
 		OpCode op = fn->read_opcode(&instr);
@@ -880,7 +883,8 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				int fn_transform = fn->read_jump_address(&instr);
 				StackIndex offset_transform = fn->read_stack_index(&instr);
 				StackIndex offset_mesh_out = fn->read_stack_index(&instr);
-				eval_op_mesh_array(stack, offset_mesh_in, offset_mesh_out, offset_count, fn_transform, offset_transform);
+				eval_op_mesh_array(globals, data, &kd, stack,
+				                   offset_mesh_in, offset_mesh_out, offset_count, fn_transform, offset_transform);
 				break;
 			}
 			case OP_END:
@@ -892,11 +896,11 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 	}
 }
 
-void EvalContext::eval_expression(const EvalGlobals *globals, const EvalData *data, const Function *fn, void **results) const
+void EvalContext::eval_function(const EvalGlobals *globals, const EvalData *data, const Function *fn, void **results) const
 {
 	float stack[BVM_STACK_SIZE] = {0};
 	
-	eval_instructions(globals, data, fn, stack);
+	eval_instructions(globals, data, fn, fn->entry_point(), stack);
 	
 	for (int i = 0; i < fn->return_values_size(); ++i) {
 		const ReturnValue &rval = fn->return_value(i);
@@ -906,6 +910,11 @@ void EvalContext::eval_expression(const EvalGlobals *globals, const EvalData *da
 	}
 }
 
+void EvalContext::eval_expression(const EvalGlobals *globals, const EvalData *data, const Function *fn, int entry_point, float *stack) const
+{
+	eval_instructions(globals, data, fn, entry_point, stack);
+}
+
 void bvm_init()
 {
 	create_empty_mesh(__empty_mesh__);
diff --git a/source/blender/blenvm/bvm/bvm_eval.h b/source/blender/blenvm/bvm/bvm_eval.h
index c582bb8..57423bd 100644
--- a/source/blender/blenvm/bvm/bvm_eval.h
+++ b/source/blender/blenvm/bvm/bvm_eval.h
@@ -116,10 +116,11 @@ struct EvalContext {
 	EvalContext();
 	~EvalContext();
 	
-	void eval_expression(const EvalGlobals *globals, const EvalData *data, const Function *fn, void **results) const;
+	void eval_function(const EvalGlobals *globals, const EvalData *data, const Function *fn, void **results) const;
+	void eval_expression(const EvalGlobals *globals, const EvalData *data, const Function *fn, int entry_point, float *stack) const;
 	
 protected:
-	void eval_instructions(const EvalGlobals *globals, const EvalData *data, const Function *fn, float *stack) const;
+	void eval_instructions(const EvalGlobals *globals, const EvalData *data, const Function *fn, int entry_point, float *stack) const;
 
 	MEM_CXX_CLASS_ALLOC_FUNCS("BVM:EvalContext")
 };
diff --git a/source/blender/blenvm/bvm/bvm_eval_common.h b/source/blender/blenvm/bvm/bvm_eval_common.h
index f07ef31..2f2b614 100644
--- a/source/blender/blenvm/bvm/bvm_eval_common.h
+++ b/source/blender/blenvm/bvm/bvm_eval_common.h
@@ -37,6 +37,13 @@
 
 namespace bvm {
 
+struct EvalContext;
+
+struct EvalKernelData {
+	const EvalContext *context;
+	const Function *function;
+};
+
 inline static float stack_load_float(float *stack, StackIndex offset)
 {
 	return *(float *)(&stack[offset]);
diff --git a/source/blender/blenvm/bvm/bvm_eval_mesh.h b/source/blender/blenvm/bvm/bvm_eval_mesh.h
index 5e0ecef..5bc8be7 100644
--- a/source/blender/blenvm/bvm/bvm_eval_mesh.h
+++ b/source/blender/blenvm/bvm/bvm_eval_mesh.h
@@ -46,7 +46,8 @@ static void eval_op_mesh_load(const EvalData *data, float *stack, StackIndex off
 	stack_store_mesh(stack, offset, dm);
 }
 
-static DerivedMesh *do_array(DerivedMesh *dm, int count, const matrix44 &tfm)
+static DerivedMesh *do_array(const EvalGlobals *globals, const EvalData *data, const EvalKernelData *kernel_data, float *stack,
+                             DerivedMesh *dm, int count, int fn_transform, StackIndex offset_transform)
 {
 	const bool use_recalc_normals = (dm->dirty & DM_DIRTY_NORMALS);
 	
@@ -87,12 +88,7 @@ static DerivedMesh *do_array(DerivedMesh *dm, int count, const matrix44 &tfm)
 	}
 #endif
 
-	float offset[4][4];
-	transpose_m4_m4(offset, (float (*)[4])tfm.data);
-	float current_offset[4][4];
-	unit_m4(current_offset);
-	
-	for (int c = 1; c < count; c++) {
+	for (int c = 0; c < count; c++) {
 		/* copy customdata to new geometry */
 		DM_copy_vert_data(result, result, 0, c * chunk_nverts, chunk_nverts);
 		DM_copy_edge_data(result, result, 0, c * chunk_nedges, chunk_nedges);
@@ -102,18 +98,21 @@ static DerivedMesh *do_array(DerivedMesh *dm, int count, const matrix44 &tfm)
 		MVert *mv_prev = result_dm_verts;
 		MVert *mv = mv_prev + c * chunk_nverts;
 
-		/* recalculate cumulative offset here */
-		mul_m4_m4m4(current_offset, current_offset, offset);
+		/* calculate transform for the copy */
+		kernel_data->context->eval_expression(globals, data, kernel_data->function, fn_transform, stack);
+		matrix44 tfm = stack_load_matrix44(stack, offset_transform);
+		float mat[4][4];
+		transpose_m4_m4(mat, (float (*)[4])tfm.data);
 
 		/* apply offset to all new verts */
 		for (int i = 0; i < chunk_nverts; i++, mv++, mv_prev++) {
-			mul_m4_v3(current_offset, mv->co);
+			mul_m4_v3(mat, mv->co);
 
 			/* We have to correct normals too, if we do not tag them as dirty! */
 			if (!use_recalc_normals) {
 				float no[3];
 				normal_short_to_float_v3(no, mv->no);
-				mul_mat3_m4_v3(current_offset, no);
+				mul_mat3_m4_v3(mat, no);
 				normalize_v3(no);
 				normal_float_to_short_v3(mv->no, no);
 			}
@@ -149,15 +148,15 @@ static DerivedMesh *do_array(DerivedMesh *dm, int count, const matrix44 &tfm)
 	return result;
 }
 
-static void eval_op_mesh_array(float *stack, StackIndex offset_mesh_in, StackIndex offset_mesh_out,
+static void eval_op_mesh_array(const EvalGlobals *globals, const EvalData *data, const EvalKernelData *kernel_data, float *stack,
+                               StackIndex offset_mesh_in, StackIndex offset_mesh_out,
                                StackIndex offset_count, int fn_transform, StackIndex offset_transform)
 {
 	DerivedMesh *dm = stack_load_mesh(stack, offset_mesh_in);
 	int count = stack_load_int(stack, offset_count);
 	CLAMP_MIN(count, 0);
-	matrix44 tfm = stack_load_matrix44(stack, offset_transform);
 	
-	DerivedMesh *result = do_array(dm, count, tfm);
+	DerivedMesh *result = do_array(globals, data, kernel_data, stack, dm, count, fn_transform, offset_transform);
 	
 	stack_store_mesh(stack, offset_mesh_out, result);
 }
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index d321415..1e617ab 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -255,7 +255,7 @@ void BVM_eval_forcefield(struct BVMEvalGlobals *globals, struct BVMEvalContext *
 	data.effector.velocity = float3(point->vel[0], point->vel[1], point->vel[2]);
 	void *results[] = { force, impulse };
 	
-	_CTX(ctx)->eval_expression(_GLOBALS(globals), &data, _FUNC(fn), results);
+	_CTX(ctx)->eval_function(_GLOBALS(globals), &data, _FUNC(fn), results);
 }
 
 /* ------------------------------------------------------------------------- */
@@ -791,7 +791,7 @@ void BVM_eval_texture(struct BVMEvalContext *ctx, struct BVMFunction *fn,
 	float3 normal;
 	void *results[] = { &color.x, &normal.x };
 	
-	_CTX(ctx)->eval_expression(&globals, &data, _FUNC(fn), results);
+	_CTX(ctx)->eval_function(&globals, &data, _FUNC(fn), results);
 	
 	target->tr = color.x;
 	target->tg = color.y;
@@ -907,7 +907,7 @@ struct DerivedMesh *BVM_eval_modifier(struct BVMEvalContext *ctx, struct BVMFunc
 	mesh_ptr result;
 	void *results[] = { &result };
 	
-	_CTX(ctx)->eval_expression(&globals, &data, _FUNC(fn), results);
+	_CTX(ctx)->eval_function(&globals, &data, _FUNC(fn), results);
 	
 	return result.get();
 }




More information about the Bf-blender-cvs mailing list