* Added range function for Multires's level RNA
authorNicholas Bishop <nicholasbishop@gmail.com>
Thu, 5 Feb 2009 01:12:47 +0000 (01:12 +0000)
committerNicholas Bishop <nicholasbishop@gmail.com>
Thu, 5 Feb 2009 01:12:47 +0000 (01:12 +0000)
* Removed RNA for old multires in Mesh, the old mesh->mr struct should never be used (except for loading old files)
* Dealt with sculpt + render (just needed to force multires update)
* sculpt memory leaks fixed
* Entering editmode now always exits paint modes (previously, only happened if editmode was called from the header button)

source/blender/blenkernel/intern/multires.c
source/blender/editors/object/object_edit.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/sculpt/sculpt.c
source/blender/editors/space_view3d/view3d_header.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_modifier.c

index a09a428..ddbb1c8 100644 (file)
@@ -1204,7 +1204,7 @@ static void multiresModifier_update(DerivedMesh *dm)
 
 void multires_force_update(Object *ob)
 {
-       if(ob->derivedFinal) {
+       if(ob && ob->derivedFinal) {
                ob->derivedFinal->needsFree =1;
                ob->derivedFinal->release(ob->derivedFinal);
                ob->derivedFinal = NULL;
index fde60ad..1d9d5d9 100644 (file)
@@ -3101,6 +3101,8 @@ void ED_object_enter_editmode(bContext *C, int flag)
        }
        
        if(flag & EM_WAITCURSOR) waitcursor(1);
+
+       ED_view3d_exit_paint_modes(C);
        
        if(ob->type==OB_MESH) {
                Mesh *me= ob->data;
index e689920..71fa0bb 100644 (file)
@@ -45,6 +45,7 @@
 #include "BKE_idprop.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
+#include "BKE_multires.h"
 #include "BKE_report.h"
 #include "BKE_screen.h"
 #include "BKE_utildefines.h"
@@ -2028,8 +2029,11 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
        
        /* handle UI stuff */
        WM_cursor_wait(1);
+
+       /* flush multires changes (for sculpt) */
+       multires_force_update(CTX_data_active_object(C));
        
-       // get editmode results, sculpt mode results (no set sculptmode in end!)
+       // get editmode results
        // store spare
        // get view3d layer, local layer, make this nice api call to render
        // store spare
index 2b0b546..42ac8d7 100644 (file)
@@ -1083,6 +1083,8 @@ static void sculpt_update_mesh_elements(bContext *C)
        }
 
        if(ss->totvert != ss->fmap_size) {
+               if(ss->fmap) MEM_freeN(ss->fmap);
+               if(ss->fmap_mem) MEM_freeN(ss->fmap_mem);
                create_vert_face_map(&ss->fmap, &ss->fmap_mem, ss->mface, ss->totvert, ss->totface);
                ss->fmap_size = ss->totvert;
        }
@@ -1628,6 +1630,8 @@ static int sculpt_toggle_mode(bContext *C, wmOperator *op)
        ToolSettings *ts = CTX_data_tool_settings(C);
 
        if(G.f & G_SCULPTMODE) {
+               multires_force_update(CTX_data_active_object(C));
+
                /* Leave sculptmode */
                G.f &= ~G_SCULPTMODE;
 
index 0259f7b..5dbe5fb 100644 (file)
@@ -140,8 +140,10 @@ void ED_view3d_exit_paint_modes(bContext *C)
        else if(G.f & G_WEIGHTPAINT)
                WM_operator_name_call(C, "VIEW3D_OT_wpaint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 
+       if(G.f & G_SCULPTMODE)
+               WM_operator_name_call(C, "SCULPT_OT_sculptmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
+
 //     if(G.f & G_TEXTUREPAINT) set_texturepaint();
-//     if(G.f & G_SCULPTMODE) set_sculptmode();
        if(G.f & G_PARTICLEEDIT) PE_set_particle_edit(CTX_data_scene(C));
        
        G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE+G_PARTICLEEDIT);
@@ -5427,7 +5429,6 @@ static void do_view3d_buttons(bContext *C, void *arg, int event)
                else if (v3d->modeselect == V3D_EDITMODE_SEL) {
                        if(!obedit) {
                                v3d->flag &= ~V3D_MODE;
-                               ED_view3d_exit_paint_modes(C);
                                ED_object_enter_editmode(C, EM_WAITCURSOR);
                                ED_undo_push(C, "Original");    /* here, because all over code enter_editmode is abused */
                        }
index 569febd..46a2fcf 100644 (file)
@@ -172,13 +172,6 @@ static void rna_MeshVertex_groups_begin(CollectionPropertyIterator *iter, Pointe
                rna_iterator_array_begin(iter, NULL, 0, 0, NULL);
 }
 
-static void rna_MeshMultires_level_range(PointerRNA *ptr, int *min, int *max)
-{
-       Multires *mr= (Multires*)ptr->data;
-       *min= 1;
-       *max= mr->level_count;
-}
-
 static void rna_MeshFace_material_index_range(PointerRNA *ptr, int *min, int *max)
 {
        Mesh *me= (Mesh*)ptr->id.data;
@@ -871,36 +864,6 @@ static void rna_def_mproperties(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Value", "");
 }
 
-static void rna_def_mmultires(BlenderRNA *brna)
-{
-       StructRNA *srna;
-       PropertyRNA *prop;
-
-       srna= RNA_def_struct(brna, "MeshMultires", NULL);
-       RNA_def_struct_sdna(srna, "Multires");
-       RNA_def_struct_ui_text(srna, "Mesh Multires", "Multiresolution mesh levels data in a Mesh datablock.");
-
-       prop= RNA_def_property(srna, "level", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "newlvl");
-       RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshMultires_level_range");
-       RNA_def_property_ui_text(prop, "Level", "");
-
-       prop= RNA_def_property(srna, "edge_level", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "edgelvl");
-       RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshMultires_level_range");
-       RNA_def_property_ui_text(prop, "Edge Level", "");
-
-       prop= RNA_def_property(srna, "pin_level", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "pinlvl");
-       RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshMultires_level_range");
-       RNA_def_property_ui_text(prop, "Pin Level", "Set level to apply modifiers to during render.");
-
-       prop= RNA_def_property(srna, "render_level", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "renderlvl");
-       RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshMultires_level_range");
-       RNA_def_property_ui_text(prop, "Render Level", "Set level to render.");
-}
-
 void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
 {
        PropertyRNA *prop;
@@ -1013,10 +976,6 @@ static void rna_def_mesh(BlenderRNA *brna)
        RNA_def_property_pointer_sdna(prop, NULL, "texcomesh");
        RNA_def_property_ui_text(prop, "Texture Space Mesh", "Derive texture coordinates from another mesh");
 
-       prop= RNA_def_property(srna, "multires", PROP_POINTER, PROP_NONE);
-       RNA_def_property_pointer_sdna(prop, NULL, "mr");
-       RNA_def_property_ui_text(prop, "Multires", "");
-
        prop= RNA_def_property(srna, "shape_keys", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "key");
        RNA_def_property_ui_text(prop, "Shape Keys", "");
@@ -1035,7 +994,6 @@ void RNA_def_mesh(BlenderRNA *brna)
        rna_def_msticky(brna);
        rna_def_mcol(brna);
        rna_def_mproperties(brna);
-       rna_def_mmultires(brna);
 }
 
 #endif
index 5259ee4..0284d42 100644 (file)
@@ -232,9 +232,17 @@ static void rna_WaveModifier_uvlayer_set(PointerRNA *ptr, const char *value)
        rna_object_uvlayer_name_set(ptr, value, wmd->uvlayer_name, sizeof(wmd->uvlayer_name));
 }
 
+static void rna_MultiresModifier_level_range(PointerRNA *ptr, int *min, int *max)
+{
+       MultiresModifierData *mmd = (MultiresModifierData*)ptr->data;
+
+       *min = 1;
+       *max = mmd->totlvl;
+}
+
 #else
 
-static void rna_def_property_subdivision_common(StructRNA *srna, const char type[], const char level[])
+static void rna_def_property_subdivision_common(StructRNA *srna, const char type[])
 {
        static EnumPropertyItem prop_subdivision_type_items[] = {
                {0, "CATMULL_CLARK", "Catmull-Clark", ""},
@@ -245,13 +253,6 @@ static void rna_def_property_subdivision_common(StructRNA *srna, const char type
        RNA_def_property_enum_sdna(prop, NULL, type);
        RNA_def_property_enum_items(prop, prop_subdivision_type_items);
        RNA_def_property_ui_text(prop, "Subdivision Type", "Selects type of subdivision algorithm.");
-
-       prop= RNA_def_property(srna, "levels", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, level);
-       RNA_def_property_range(prop, 1, 20);
-       RNA_def_property_ui_range(prop, 1, 6, 1, 0);
-       RNA_def_property_ui_text(prop, "Levels", "Number of subdivisions to perform.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_subsurf(BlenderRNA *brna)
@@ -263,7 +264,14 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Subsurf Modifier", "Subdivision surface modifier.");
        RNA_def_struct_sdna(srna, "SubsurfModifierData");
 
-       rna_def_property_subdivision_common(srna, "subdivType", "levels");
+       rna_def_property_subdivision_common(srna, "subdivType");
+
+       prop= RNA_def_property(srna, "levels", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "levels");
+       RNA_def_property_range(prop, 1, 20);
+       RNA_def_property_ui_range(prop, 1, 6, 1, 0);
+       RNA_def_property_ui_text(prop, "Levels", "Number of subdivisions to perform.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
 
        prop= RNA_def_property(srna, "render_levels", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "renderLevels");
@@ -285,12 +293,19 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
 static void rna_def_modifier_multires(BlenderRNA *brna)
 {
        StructRNA *srna;
+       PropertyRNA *prop;
 
        srna= RNA_def_struct(brna, "MultiresModifier", "Modifier");
        RNA_def_struct_ui_text(srna, "Multires Modifier", "Multiresolution mesh modifier.");
        RNA_def_struct_sdna(srna, "MultiresModifierData");
 
-       rna_def_property_subdivision_common(srna, "simple", "lvl");
+       rna_def_property_subdivision_common(srna, "simple");
+
+       prop= RNA_def_property(srna, "levels", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "lvl");
+       RNA_def_property_ui_text(prop, "Levels", "");
+       RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MultiresModifier_level_range");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_lattice(BlenderRNA *brna)