From 1e40adddc7c15aa008670fcf387cda56fdef8479 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 5 Nov 2009 18:05:55 +0000 Subject: [PATCH] 2.5 Modifiers: mesh deform, boolean and decimation work again. --- intern/bsp/SConscript | 2 +- intern/decimation/SConscript | 2 +- source/blender/blenkernel/intern/booleanops.c | 4 +-- source/blender/blenkernel/intern/modifier.c | 32 ++++--------------- .../blender/editors/armature/meshlaplacian.c | 6 ++-- .../blender/editors/armature/meshlaplacian.h | 2 +- source/blender/editors/include/ED_armature.h | 5 +++ .../blender/editors/object/object_modifier.c | 5 +-- source/blender/makesdna/DNA_modifier_types.h | 7 ++-- source/blender/makesrna/intern/rna_modifier.c | 22 ++++++------- source/creator/CMakeLists.txt | 1 + 11 files changed, 40 insertions(+), 48 deletions(-) diff --git a/intern/bsp/SConscript b/intern/bsp/SConscript index 2ecc280f135..6ee888efc8d 100644 --- a/intern/bsp/SConscript +++ b/intern/bsp/SConscript @@ -8,5 +8,5 @@ incs = 'intern ../container ../moto/include ../memutil' if (env['OURPLATFORM'] == 'win32-mingw'): env.BlenderLib ('blender_BSP', sources, Split(incs), [], libtype='core', priority=26 ) else: - env.BlenderLib ('blender_BSP', sources, Split(incs), [], libtype='core', priority=20 ) + env.BlenderLib ('blender_BSP', sources, Split(incs), [], libtype='core', priority=200 ) diff --git a/intern/decimation/SConscript b/intern/decimation/SConscript index ef95a795928..2dd86c44cf1 100644 --- a/intern/decimation/SConscript +++ b/intern/decimation/SConscript @@ -5,4 +5,4 @@ sources = env.Glob('intern/*.cpp') incs = '. ../moto/include ../container ../memutil' -env.BlenderLib ('bf_decimation', sources, Split(incs) , [], libtype=['core'], priority = [10] ) +env.BlenderLib ('bf_decimation', sources, Split(incs) , [], libtype=['core'], priority = [200] ) diff --git a/source/blender/blenkernel/intern/booleanops.c b/source/blender/blenkernel/intern/booleanops.c index 5f0697f06ce..1f6457199fb 100644 --- a/source/blender/blenkernel/intern/booleanops.c +++ b/source/blender/blenkernel/intern/booleanops.c @@ -526,8 +526,8 @@ DerivedMesh *NewBooleanDerivedMesh_intern( CSG_FreeVertexDescriptor(&vd_o); CSG_FreeFaceDescriptor(&fd_o); } -// else -// XXX error("Unknown internal error in boolean"); + else + printf("Unknown internal error in boolean"); CSG_FreeBooleanOperation(bool_op); diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 3c52dc0af84..1f4f69bd376 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -82,7 +82,7 @@ #include "BKE_anim.h" #include "BKE_action.h" #include "BKE_bmesh.h" -// XXX #include "BKE_booleanops.h" +#include "BKE_booleanops.h" #include "BKE_cloth.h" #include "BKE_collision.h" #include "BKE_cdderivedmesh.h" @@ -113,18 +113,12 @@ #include "BKE_shrinkwrap.h" #include "BKE_simple_deform.h" -//XXX #include "LOD_DependKludge.h" #include "LOD_decimation.h" -// XXX -static struct DerivedMesh *NewBooleanDerivedMesh() {return NULL;} - #include "CCGSubSurf.h" #include "RE_shader_ext.h" -//XXX #include "BIF_meshlaplacian.h" - /* Utility */ static int is_last_displist(Object *ob) @@ -4138,11 +4132,11 @@ static DerivedMesh *decimateModifier_applyModifier( ModifierData *md, Object *ob, DerivedMesh *derivedData, int useRenderParams, int isFinalCalc) { - // DecimateModifierData *dmd = (DecimateModifierData*) md; + DecimateModifierData *dmd = (DecimateModifierData*) md; DerivedMesh *dm = derivedData, *result = NULL; MVert *mvert; MFace *mface; - // LOD_Decimation_Info lod; + LOD_Decimation_Info lod; int totvert, totface; int a, numTris; @@ -4164,8 +4158,6 @@ static DerivedMesh *decimateModifier_applyModifier( goto exit; } - // XXX -#if 0 lod.vertex_buffer= MEM_mallocN(3*sizeof(float)*totvert, "vertices"); lod.vertex_normal_buffer= MEM_mallocN(3*sizeof(float)*totvert, "normals"); lod.triangle_index_buffer= MEM_mallocN(3*sizeof(int)*numTris, "trias"); @@ -4250,10 +4242,6 @@ static DerivedMesh *decimateModifier_applyModifier( MEM_freeN(lod.vertex_buffer); MEM_freeN(lod.vertex_normal_buffer); MEM_freeN(lod.triangle_index_buffer); -#else - modifier_setError(md, "Modifier not working yet in 2.5."); - goto exit; -#endif exit: return result; @@ -6390,12 +6378,6 @@ static CustomDataMask booleanModifier_requiredDataMask(Object *ob, ModifierData dataMask |= (1 << CD_MDEFORMVERT); - /* particles only need this if they are after a non deform modifier, and - * the modifier stack will only create them in that case. */ -// dataMask |= CD_MASK_ORIGSPACE; - -// dataMask |= CD_MASK_ORCO; - return dataMask; } @@ -7866,17 +7848,17 @@ static void meshdeformModifier_do( float (*vertexCos)[3], int numVerts) { MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - Mesh *me= ob->data; + Mesh *me= (mmd->object)? mmd->object->data: NULL; + EditMesh *em = (me)? BKE_mesh_get_editmesh(me): NULL; DerivedMesh *tmpdm, *cagedm; MDeformVert *dvert = NULL; MDeformWeight *dw; - EditMesh *em = BKE_mesh_get_editmesh(me); MVert *cagemvert; float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4]; float weight, totweight, fac, co[3], *weights, (*dco)[3], (*bindcos)[3]; int a, b, totvert, totcagevert, defgrp_index; - if(!mmd->object || (!mmd->bindcos && !mmd->needbind)) + if(!mmd->object || (!mmd->bindcos && !mmd->bindfunc)) return; /* get cage derivedmesh */ @@ -7914,7 +7896,7 @@ static void meshdeformModifier_do( /* progress bar redraw can make this recursive .. */ if(!recursive) { recursive = 1; - //XXX harmonic_coordinates_bind(mmd, vertexCos, numVerts, cagemat); + mmd->bindfunc(md->scene, mmd, (float*)vertexCos, numVerts, cagemat); recursive = 0; } } diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index 82843a49851..9847bdc3283 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -69,7 +69,7 @@ static void waitcursor(int val) {} static void progress_bar() {} static void start_progress_bar() {} static void end_progress_bar() {} -static void error() {} +static void error(char *str) { printf("error: %s\n", str); } /* ************* XXX *************** */ @@ -1698,7 +1698,7 @@ static void meshdeform_matrix_solve(MeshDeformBind *mdb) nlDeleteContext(context); } -void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, float (*vertexcos)[3], int totvert, float cagemat[][4]) +void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, float *vertexcos, int totvert, float cagemat[][4]) { MeshDeformBind mdb; MDefBindInfluence *inf; @@ -1714,7 +1714,7 @@ void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, float memset(&mdb, 0, sizeof(MeshDeformBind)); /* get mesh and cage mesh */ - mdb.vertexcos= vertexcos; + mdb.vertexcos= (float(*)[3])vertexcos; mdb.totvert= totvert; mdb.cagedm= mesh_create_derived_no_deform(scene, mmd->object, NULL, CD_MASK_BAREMESH); diff --git a/source/blender/editors/armature/meshlaplacian.h b/source/blender/editors/armature/meshlaplacian.h index 00c0aefaec7..1ee01561cd4 100644 --- a/source/blender/editors/armature/meshlaplacian.h +++ b/source/blender/editors/armature/meshlaplacian.h @@ -79,7 +79,7 @@ void rigid_deform_end(int cancel); /* Harmonic Coordinates */ void harmonic_coordinates_bind(struct Scene *scene, struct MeshDeformModifierData *mmd, - float (*vertexcos)[3], int totvert, float cagemat[][4]); + float *vertexcos, int totvert, float cagemat[][4]); #endif diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index 4898f70201e..5cc35d4ad77 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -42,6 +42,7 @@ struct ViewContext; struct RegionView3D; struct SK_Sketch; struct IDProperty; +struct MeshDeformModifierData; typedef struct EditBone { @@ -162,6 +163,10 @@ char * BIF_nameBoneTemplate(const struct bContext *C); void BDR_drawSketch(const struct bContext *vc); int BDR_drawSketchNames(struct ViewContext *vc); +/* meshlaplacian.c */ +void harmonic_coordinates_bind(struct Scene *scene, struct MeshDeformModifierData *mmd, + float *vertexcos, int totvert, float cagemat[][4]); + #endif /* ED_ARMATURE_H */ diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 1b0dc95480a..0683cb6842f 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -65,6 +65,7 @@ #include "RNA_define.h" #include "RNA_enum_types.h" +#include "ED_armature.h" #include "ED_screen.h" #include "WM_api.h" @@ -779,7 +780,7 @@ static int meshdeform_bind_exec(bContext *C, wmOperator *op) int mode= mmd->modifier.mode; /* force modifier to run, it will call binding routine */ - mmd->needbind= 1; + mmd->bindfunc= harmonic_coordinates_bind; mmd->modifier.mode |= eModifierMode_Realtime; if(ob->type == OB_MESH) { @@ -796,7 +797,7 @@ static int meshdeform_bind_exec(bContext *C, wmOperator *op) makeDispListCurveTypes(scene, ob, 0); } - mmd->needbind= 0; + mmd->bindfunc= NULL; mmd->modifier.mode= mode; } diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index db1c261556b..fe6a5b050e3 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -508,8 +508,7 @@ typedef struct MeshDeformModifierData { struct Object *object; /* mesh object */ char defgrp_name[32]; /* optional vertexgroup name */ - short gridsize, needbind; - short flag, pad; + short gridsize, flag, pad[2]; /* variables filled in when bound */ float *bindweights, *bindcos; /* computed binding weights */ @@ -522,6 +521,10 @@ typedef struct MeshDeformModifierData { float dyncellmin[3]; /* offset of the dynamic bind grid */ float dyncellwidth; /* width of dynamic bind cell */ float bindmat[4][4]; /* matrix of cage at binding time */ + + /* runtime */ + void (*bindfunc)(struct Scene *scene, struct MeshDeformModifierData *mmd, + float *vertexcos, int totvert, float cagemat[][4]); } MeshDeformModifierData; typedef enum { diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index f2648503003..93972894ef1 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -795,7 +795,7 @@ static void rna_def_modifier_wave(BlenderRNA *brna) prop= RNA_def_property(srna, "start_position_object", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "objectcenter"); RNA_def_property_ui_text(prop, "Start Position Object", ""); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); @@ -824,7 +824,7 @@ static void rna_def_modifier_wave(BlenderRNA *brna) prop= RNA_def_property(srna, "texture_coordinates_object", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "map_object"); RNA_def_property_ui_text(prop, "Texture Coordinates Object", ""); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "speed", PROP_FLOAT, PROP_NONE); @@ -1196,7 +1196,7 @@ static void rna_def_modifier_displace(BlenderRNA *brna) prop= RNA_def_property(srna, "texture_coordinate_object", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "map_object"); RNA_def_property_ui_text(prop, "Texture Coordinate Object", ""); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); } @@ -1257,7 +1257,7 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna) prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); RNA_def_property_pointer_funcs(prop, "rna_UVProjector_object_get", "rna_UVProjector_object_set", NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_ui_text(prop, "Object", "Object to use as projector transform."); } @@ -1330,7 +1330,7 @@ static void rna_def_modifier_cast(BlenderRNA *brna) prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); RNA_def_property_ui_text(prop, "Object", "Control object: if available, its location determines the center of the effect"); RNA_def_property_pointer_funcs(prop, NULL, "rna_CastModifier_object_set", NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE); @@ -1397,7 +1397,7 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna) prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); RNA_def_property_ui_text(prop, "Object", "Mesh object to deform with."); RNA_def_property_pointer_funcs(prop, NULL, "rna_MeshDeformModifier_object_set", NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "is_bound", PROP_BOOLEAN, PROP_NONE); @@ -1459,7 +1459,7 @@ static void rna_def_modifier_particleinstance(BlenderRNA *brna) prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "ob"); RNA_def_property_ui_text(prop, "Object", "Object that has the particle system."); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "particle_system_number", PROP_INT, PROP_NONE); @@ -1723,14 +1723,14 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna) prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); RNA_def_property_ui_text(prop, "Target", "Mesh target to shrink to."); RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_target_set", NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "auxiliary_target", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "auxTarget"); RNA_def_property_ui_text(prop, "Auxiliary Target", "Additional mesh target to shrink to."); RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_auxiliary_target_set", NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); @@ -1834,7 +1834,7 @@ static void rna_def_modifier_mask(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "ob_arm"); RNA_def_property_ui_text(prop, "Armature", "Armature to use as source of bones to mask."); RNA_def_property_pointer_funcs(prop, NULL, "rna_MaskModifier_armature_set", NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); @@ -1879,7 +1879,7 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna) prop= RNA_def_property(srna, "origin", PROP_POINTER, PROP_NONE); RNA_def_property_ui_text(prop, "Origin", "Origin of modifier space coordinates."); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE); diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 61c0fe187fd..a11e83c9312 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -380,6 +380,7 @@ IF(UNIX) bf_dds bf_readblenfile bf_collada + blender_BSP blender_bop bf_kernel bf_decimation