[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