fix [#24780] Metaballs are not drawn correctly in new scenes
authorCampbell Barton <ideasman42@gmail.com>
Thu, 18 Nov 2010 04:26:50 +0000 (04:26 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 18 Nov 2010 04:26:50 +0000 (04:26 +0000)
this is a can of worms, at the moment blender depends on broken behavior for metaballs:
 find_basis_mball() can return a metaball object that fails a is_basis_mball() check which makes this logic very confusing (added note about this in mball.c).

Metaballs needs a refactor however at least make drawing fail consistently,
For wire draw is_basis_mball() wasn't being checked, for solid drawing it was (hence the strange wire frame).

For now the motherball needs to exist in the main scene else it wont work.

source/blender/blenkernel/intern/mball.c
source/blender/editors/object/object_add.c
source/blender/editors/space_view3d/drawobject.c
source/blender/makesrna/RNA_enum_types.h
source/blender/makesrna/intern/rna_meta.c
source/blender/makesrna/intern/rna_object.c

index a31a16ba6061315a12ad9ab029a08df1c3499b41..94ffaaea9472769ac7610c70b740f321c02a9a58 100644 (file)
@@ -309,6 +309,19 @@ float *make_orco_mball(Object *ob, ListBase *dispbase)
 
        return orcodata;
 }
+
+/* Note on mball basis stuff 2.5x (this is a can of worms)
+ * This really needs a rewrite/refactorm its totally broken in anything other then basic cases
+ * Multiple Scenes + Set Scenes & mixing mball basis SHOULD work but fails to update the depsgraph on rename
+ * and linking into scenes or removal of basis mball. so take care when changing this code.
+ * 
+ * Main idiot thing here is that the system returns find_basis_mball() objects which fail a is_basis_mball() test.
+ *
+ * Not only that but the depsgraph and ther areas depend on this behavior!, so making small fixes here isnt worth it.
+ * - campbell
+ */
+
+
 /** \brief Test, if Object *ob is basic MetaBall.
  *
  * It test last character of Object ID name. If last character
@@ -385,6 +398,8 @@ void copy_mball_properties(Scene *scene, Object *active_object)
  * its name. All MetaBalls with same base of name can be
  * blended. MetaBalls with different basic name can't be
  * blended.
+ *
+ * warning!, is_basis_mball() can fail on returned object, see long note above.
  */
 Object *find_basis_mball(Scene *scene, Object *basis)
 {
index 87906cd9629e76c8516eadb8ce48d96a652dcc5e..56c2be4f17cf9db7f5e44561307b7906772eee52 100644 (file)
@@ -486,16 +486,6 @@ void OBJECT_OT_camera_add(wmOperatorType *ot)
 
 
 /* ***************** add primitives *************** */
-
-static EnumPropertyItem prop_metaball_types[]= {
-       {MB_BALL, "MBALL_BALL", ICON_META_BALL, "Meta Ball", ""},
-       {MB_TUBE, "MBALL_CAPSULE", ICON_META_CAPSULE, "Meta Capsule", ""},
-       {MB_PLANE, "MBALL_PLANE", ICON_META_PLANE, "Meta Plane", ""},
-       {MB_CUBE, "MBALL_CUBE", ICON_META_CUBE, "Meta Cube", ""},
-       {MB_ELIPSOID, "MBALL_ELLIPSOID", ICON_META_ELLIPSOID, "Meta Ellipsoid", ""},
-       {0, NULL, 0, NULL, NULL}
-};
-
 static int object_metaball_add_exec(bContext *C, wmOperator *op)
 {
        Object *obedit= CTX_data_edit_object(C);
@@ -565,7 +555,7 @@ void OBJECT_OT_metaball_add(wmOperatorType *ot)
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
-       RNA_def_enum(ot->srna, "type", prop_metaball_types, 0, "Primitive", "");
+       RNA_def_enum(ot->srna, "type", metaelem_type_items, 0, "Primitive", "");
        ED_object_add_generic_props(ot, TRUE);
 }
 
index fa5000a5c9e3743baf323abe1227e4c8269d8d63..220e6700d5d30c6c73aa33885c9315af62bca272 100644 (file)
@@ -5352,10 +5352,12 @@ static void draw_bounding_volume(Scene *scene, Object *ob)
                bb= ob->bb ? ob->bb : ( (Curve *)ob->data )->bb;
        }
        else if(ob->type==OB_MBALL) {
-               bb= ob->bb;
-               if(bb==0) {
-                       makeDispListMBall(scene, ob);
+               if(is_basis_mball(ob)) {
                        bb= ob->bb;
+                       if(bb==0) {
+                               makeDispListMBall(scene, ob);
+                               bb= ob->bb;
+                       }
                }
        }
        else {
@@ -5435,8 +5437,10 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
                        draw_index_wire= 1;
                }
        } else if (ob->type==OB_MBALL) {
-               if((base->flag & OB_FROMDUPLI)==0) 
-                       drawDispListwire(&ob->disp);
+               if(is_basis_mball(ob)) {
+                       if((base->flag & OB_FROMDUPLI)==0)
+                               drawDispListwire(&ob->disp);
+               }
        }
        else if(ob->type==OB_ARMATURE) {
                if(!(ob->mode & OB_MODE_POSE))
@@ -5490,7 +5494,9 @@ static void drawWireExtra(Scene *scene, RegionView3D *rv3d, Object *ob)
                                draw_index_wire= 1;
                }
        } else if (ob->type==OB_MBALL) {
-               drawDispListwire(&ob->disp);
+               if(is_basis_mball(ob)) {
+                       drawDispListwire(&ob->disp);
+               }
        }
 
        glDepthMask(1);
index 38ba44f2c2bbaf01eab4502a5e2eba2951aa7a26..1d2b8c97f86356ed4e501ae2fa679559ed891c8a 100644 (file)
@@ -36,6 +36,7 @@ extern EnumPropertyItem DummyRNA_NULL_items[];
 extern EnumPropertyItem DummyRNA_DEFAULT_items[];
 
 extern EnumPropertyItem object_mode_items[];
+extern EnumPropertyItem metaelem_type_items[];
 
 extern EnumPropertyItem proportional_falloff_items[];
 extern EnumPropertyItem proportional_editing_items[];
index 18dfd05b97106c8dd7cac1808994bd3f97675a78..6fb8f1597587733e87849b5121bbf15561817151 100644 (file)
@@ -25,6 +25,7 @@
 #include <stdlib.h>
 
 #include "RNA_define.h"
+#include "RNA_enum_types.h"
 
 #include "rna_internal.h"
 
@@ -138,14 +139,6 @@ static void rna_MetaBall_elements_remove(MetaBall *mb, ReportList *reports, Meta
 
 #else
 
-static EnumPropertyItem metaelem_type_items[] = {
-       {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
-       {MB_TUBE, "CAPSULE", ICON_META_CAPSULE, "Capsule", ""},
-       {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
-       {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition!
-       {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
-       {0, NULL, 0, NULL, NULL}};
-
 static void rna_def_metaelement(BlenderRNA *brna)
 {
        StructRNA *srna;
@@ -155,7 +148,7 @@ static void rna_def_metaelement(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "MetaElem");
        RNA_def_struct_ui_text(srna, "Meta Element", "Blobby element in a MetaBall datablock");
        RNA_def_struct_ui_icon(srna, ICON_OUTLINER_DATA_META);
-       
+
        /* enums */
        prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, metaelem_type_items);
index 4c0918a65dbaa2e8f79cedb16bda5384ba063317..37459db7280015240065eb28f5060321d6d3151e 100644 (file)
@@ -40,6 +40,7 @@
 #include "DNA_object_types.h"
 #include "DNA_property_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_meta_types.h"
 
 #include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
 #include "ED_mesh.h"
@@ -80,6 +81,14 @@ static EnumPropertyItem collision_bounds_items[] = {
        //{OB_DYN_MESH, "DYNAMIC_MESH", 0, "Dynamic Mesh", ""},
        {0, NULL, 0, NULL, NULL}};
 
+EnumPropertyItem metaelem_type_items[] = {
+       {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
+       {MB_TUBE, "CAPSULE", ICON_META_CAPSULE, "Capsule", ""},
+       {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
+       {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition!
+       {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
+       {0, NULL, 0, NULL, NULL}};
+
 /* used for 2 enums */
 #define OBTYPE_CU_CURVE {OB_CURVE, "CURVE", 0, "Curve", ""}
 #define OBTYPE_CU_SURF {OB_SURF, "SURFACE", 0, "Surface", ""}