2.5 Modifiers: mesh deform, boolean and decimation work again.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Thu, 5 Nov 2009 18:05:55 +0000 (18:05 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Thu, 5 Nov 2009 18:05:55 +0000 (18:05 +0000)
intern/bsp/SConscript
intern/decimation/SConscript
source/blender/blenkernel/intern/booleanops.c
source/blender/blenkernel/intern/modifier.c
source/blender/editors/armature/meshlaplacian.c
source/blender/editors/armature/meshlaplacian.h
source/blender/editors/include/ED_armature.h
source/blender/editors/object/object_modifier.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c
source/creator/CMakeLists.txt

index 2ecc280f1358111de78c9d3c352e83be8d2cef31..6ee888efc8d921c505a1b231145e02e0215c3e3e 100644 (file)
@@ -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 )
 
index ef95a79592824600923a3d446debbd1ba85dda75..2dd86c44cf1b60620c9426d87d707e9389fa2110 100644 (file)
@@ -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] )
index 5f0697f06ce539a40acb3f47b8c9755c38a674d1..1f6457199fb717e36745027aa733b2878591685c 100644 (file)
@@ -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);
 
index 3c52dc0af84a63ff792b81f65562b569f41a137f..1f4f69bd376ffd09ff6efc751d13cba67a97b0a7 100644 (file)
@@ -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"
 #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;
                }
        }
index 82843a49851385e383a78a92337911f03cde3793..9847bdc32839bfbfe3aecb1a5b62757ebbe6ba3f 100644 (file)
@@ -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);
index 00c0aefaec7661821c795dfe84e8e31a09ce39f3..1ee01561cd447a8138e9ea885cb398f3a4ee3c40 100644 (file)
@@ -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
 
index 4898f70201e0202b28ea3119c820a75c659605c1..5cc35d4ad77506c7fe155bd420b4de52c9b7dd5a 100644 (file)
@@ -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 */
 
 
index 1b0dc95480ac42c03e511d2de2517ea3ebadea55..0683cb6842f1ee2e3b3e5902bbfb5324bb3bfc7b 100644 (file)
@@ -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;
        }
        
index db1c261556bf9f16febe0140bb78b89833d926ba..fe6a5b050e3b44bbbef25923962b82d3314443d8 100644 (file)
@@ -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 {
index f264850300365dd1fc1bbe71fff7e363beca925c..93972894ef121749f79a5cf3095b5a0387d407fa 100644 (file)
@@ -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);
index 61c0fe187fd9f9e101576a7e897bb71ce62c8df3..a11e83c931279d10029ac8051d739f7284329bfb 100644 (file)
@@ -380,6 +380,7 @@ IF(UNIX)
                bf_dds
                bf_readblenfile
                bf_collada
+               blender_BSP 
                blender_bop 
                bf_kernel 
                bf_decimation