Multires/2.5:
authorNicholas Bishop <nicholasbishop@gmail.com>
Sat, 23 May 2009 07:12:55 +0000 (07:12 +0000)
committerNicholas Bishop <nicholasbishop@gmail.com>
Sat, 23 May 2009 07:12:55 +0000 (07:12 +0000)
Added subdivide operator and button for multires.
Since this seems to be the only modifier with an operator defined, I'm not sure if I put it in a good place or not, someone can check on this?

release/ui/buttons_data_modifier.py
source/blender/blenkernel/BKE_multires.h
source/blender/blenkernel/intern/multires.c
source/blender/editors/object/object_intern.h
source/blender/editors/object/object_modifier.c
source/blender/editors/object/object_ops.c
source/blender/makesrna/intern/rna_modifier.c

index 7d243c6de3d67c6f0e0d3e721a4cd2b52ef94533..359c7554c53a74b5a57b2111af406eb7ec059d24 100644 (file)
@@ -256,7 +256,9 @@ class DATA_PT_modifiers(DataButtonsPanel):
                layout.itemR(md, "mirror_object")
                
        def multires(self, layout, md):
-               layout.itemR(md, "levels")
+               layout.itemR(md, "subdivision_type")
+               layout.itemO("OBJECT_OT_multires_subdivide", text="Subdivide")
+               layout.itemR(md, "level")
        
        def particleinstance(self, layout, md):
                layout.itemR(md, "object")
index 3b0ff2db6f46292bfd328c3f06558db5c972dbd9..29a522d711fce399e7f5de37d3d7f6384ba01ed2 100644 (file)
@@ -60,12 +60,12 @@ void multires_force_update(struct Object *ob);
 struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*,
                                                    struct Mesh *, int, int);
 
+struct MultiresModifierData *find_multires_modifier(struct Object *ob);
 int multiresModifier_switch_level(struct Object *, const int);
 void multiresModifier_join(struct Object *);
 void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
 void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob, int distance,
                                int updateblock, int simple);
-void multiresModifier_setLevel(void *mmd_v, void *ob_v);
 int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object *dst, struct Object *src);
 
 /* Related to the old multires */
index dfd83a7b42ef4e88f4b6670046d6076d1190d0a3..244c2711e63c33d5c26659087450cae5e9cd001f 100644 (file)
@@ -59,16 +59,26 @@ static const int multires_max_levels = 13;
 static const int multires_quad_tot[] = {4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409};
 static const int multires_side_tot[] = {2, 3, 5,  9,  17,  33,   65,   129,   257,   513,    1025,    2049,    4097};
 
-int multiresModifier_switch_level(Object *ob, const int distance)
+MultiresModifierData *find_multires_modifier(Object *ob)
 {
-       ModifierData *md = NULL;
+       ModifierData *md;
        MultiresModifierData *mmd = NULL;
 
        for(md = ob->modifiers.first; md; md = md->next) {
-               if(md->type == eModifierType_Multires)
+               if(md->type == eModifierType_Multires) {
                        mmd = (MultiresModifierData*)md;
+                       break;
+               }
        }
 
+       return mmd;
+
+}
+
+int multiresModifier_switch_level(Object *ob, const int distance)
+{
+       MultiresModifierData *mmd = find_multires_modifier(ob);
+
        if(mmd) {
                mmd->lvl += distance;
                if(mmd->lvl < 1) mmd->lvl = 1;
index 7203f56b40f826666d2919adaf70e5477d9acc96..223f2190f4bdd7252bc88f2771eeb09e5418bf26 100644 (file)
@@ -86,6 +86,7 @@ void GROUP_OT_objects_remove_active(struct wmOperatorType *ot);
 
 /* object_modifier.c */
 void OBJECT_OT_modifier_add(struct wmOperatorType *ot);
+void OBJECT_OT_multires_subdivide(struct wmOperatorType *ot);
 
 #endif /* ED_OBJECT_INTERN_H */
 
index 04bcc4e37175fa868e618108a758951ca0672c99..68b8c4a6a144e58c97470a0fc3876e861888be90 100644 (file)
@@ -46,6 +46,7 @@
 #include "BKE_global.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
+#include "BKE_multires.h"
 #include "BKE_report.h"
 #include "BKE_object.h"
 #include "BKE_particle.h"
@@ -367,6 +368,32 @@ void OBJECT_OT_modifier_add(wmOperatorType *ot)
        RNA_def_enum(ot->srna, "type", modifier_type_items, 0, "Type", "");
 }
 
+static int multires_subdivide_exec(bContext *C, wmOperator *op)
+{
+       Object *ob = CTX_data_active_object(C);
+       MultiresModifierData *mmd = find_multires_modifier(ob);
+
+       if(mmd) {
+               multiresModifier_subdivide(mmd, ob, 1, 0, mmd->simple);
+               WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+       }
+       
+       return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_multires_subdivide(wmOperatorType *ot)
+{
+       ot->name= "Multires Subdivide";
+       ot->description= "Add a new level of subdivision.";
+       ot->idname= "OBJECT_OT_multires_subdivide";
+       ot->poll= ED_operator_object_active;
+
+       ot->exec= multires_subdivide_exec;
+       
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
 #if 0
 static void modifiers_add(void *ob_v, int type)
 {
index e668c494fba8bad02e618380e64d73be5c4d2e72..f2a020e69a6b971b4c2e6c2bc7e21878bae71a26 100644 (file)
@@ -100,6 +100,7 @@ void ED_operatortypes_object(void)
        WM_operatortype_append(OBJECT_OT_primitive_add);
 
        WM_operatortype_append(OBJECT_OT_modifier_add);
+       WM_operatortype_append(OBJECT_OT_multires_subdivide);
 }
 
 void ED_keymap_object(wmWindowManager *wm)
index 38325246aef8f5d9b650d7a2d3ede82dbbbc4c7d..2451645330c32613a9aad9c3847c496e7ef6b6c8 100644 (file)
@@ -335,9 +335,9 @@ static void rna_def_modifier_multires(BlenderRNA *brna)
 
        rna_def_property_subdivision_common(srna, "simple");
 
-       prop= RNA_def_property(srna, "levels", PROP_INT, PROP_NONE);
+       prop= RNA_def_property(srna, "level", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "lvl");
-       RNA_def_property_ui_text(prop, "Levels", "");
+       RNA_def_property_ui_text(prop, "Level", "");
        RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MultiresModifier_level_range");
        RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
 }