Revision: 20755
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20755
Author:   blendix
Date:     2009-06-09 15:03:00 +0200 (Tue, 09 Jun 2009)

Log Message:
-----------
Fix for bug #18881 and #18866: Surface option for Fields crashed
on non-mesh objects, so hide it if not applicable. Also made it
support surf, curve, font objects.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_displist.h
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/src/buttons_object.c

Modified: trunk/blender/source/blender/blenkernel/BKE_displist.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_displist.h      2009-06-09 
12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/blenkernel/BKE_displist.h      2009-06-09 
13:03:00 UTC (rev 20755)
@@ -86,7 +86,7 @@
 extern void freedisplist(struct ListBase *lb);
 extern int displist_has_faces(struct ListBase *lb);
 extern void makeDerivedMesh(struct Object *ob, CustomDataMask dataMask);
-extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int 
forRender);
+extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int 
forRender, int forOrco);
 extern void makeDispListCurveTypes(struct Object *ob, int forOrco);
 extern void makeDispListMBall(struct Object *ob);
 extern void shadeDispList(struct Base *base);

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c   2009-06-09 
12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c   2009-06-09 
13:03:00 UTC (rev 20755)
@@ -1356,7 +1356,7 @@
        
 }
 
-void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender)
+void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender, int 
forOrco)
 {
        ListBase *nubase;
        Nurb *nu;
@@ -1375,7 +1375,8 @@
                nubase= &cu->nurb;
        }
 
-       curve_calc_modifiers_pre(ob, nubase, forRender, &originalVerts, 
&deformedVerts, &numVerts);
+       if(!forOrco)
+               curve_calc_modifiers_pre(ob, nubase, forRender, &originalVerts, 
&deformedVerts, &numVerts);
 
        for (nu=nubase->first; nu; nu=nu->next) {
                if(forRender || nu->hide==0) {
@@ -1429,7 +1430,8 @@
                tex_space_curve(cu);
        }
 
-       curve_calc_modifiers_post(ob, nubase, dispbase, forRender, 
originalVerts, deformedVerts);
+       if(!forOrco)
+               curve_calc_modifiers_post(ob, nubase, dispbase, forRender, 
originalVerts, deformedVerts);
 }
 
 void makeDispListCurveTypes(Object *ob, int forOrco)
@@ -1445,7 +1447,7 @@
        freedisplist(dispbase);
        
        if(ob->type==OB_SURF) {
-               makeDispListSurf(ob, dispbase, 0);
+               makeDispListSurf(ob, dispbase, 0, forOrco);
        }
        else if ELEM(ob->type, OB_CURVE, OB_FONT) {
                ListBase dlbev;

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c   2009-06-09 
12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c   2009-06-09 
13:03:00 UTC (rev 20755)
@@ -114,6 +114,72 @@
 
 #include "RE_shader_ext.h"
 
+/* Utility */
+
+static int is_last_displist(Object *ob)
+{
+       Curve *cu = ob->data;
+       static int curvecount=0, totcurve=0;
+
+       if(curvecount == 0){
+               DispList *dl;
+
+               totcurve = 0;
+               for(dl=cu->disp.first; dl; dl=dl->next)
+                       totcurve++;
+       }
+
+       curvecount++;
+
+       if(curvecount == totcurve){
+               curvecount = 0;
+               return 1;
+       }
+
+       return 0;
+}
+
+static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int 
orco)
+{
+       DerivedMesh *dm= NULL;
+
+       if(ob->type==OB_MESH) {
+               dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
+
+               if(vertexCos) {
+                       CDDM_apply_vert_coords(dm, vertexCos);
+                       //CDDM_calc_normals(dm);
+               }
+               
+               if(orco)
+                       DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, 
get_mesh_orco_verts(ob));
+       }
+       else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
+               Object *tmpobj;
+               Curve *tmpcu;
+
+               if(is_last_displist(ob)) {
+                       /* copies object and modifiers (but not the data) */
+                       tmpobj= copy_object(ob);
+                       tmpcu = (Curve *)tmpobj->data;
+                       tmpcu->id.us--;
+
+                       /* copies the data */
+                       tmpobj->data = copy_curve((Curve *) ob->data);
+
+                       makeDispListCurveTypes(tmpobj, 1);
+                       nurbs_to_mesh(tmpobj);
+
+                       dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
+                       //CDDM_calc_normals(dm);
+
+                       free_libblock_us(&G.main->object, tmpobj);
+               }
+       }
+
+       return dm;
+}
+
 /***/
 
 static int noneModifier_isDisabled(ModifierData *md)
@@ -6037,7 +6103,8 @@
                        MEM_freeN(surmd->bvhtree);
                }
 
-               surmd->dm->release(surmd->dm);
+               if(surmd->dm)
+                       surmd->dm->release(surmd->dm);
                
                surmd->bvhtree = NULL;
                surmd->dm = NULL;
@@ -6061,7 +6128,7 @@
 
        /* if possible use/create DerivedMesh */
        if(derivedData) surmd->dm = CDDM_copy(derivedData);
-       else if(ob->type==OB_MESH) surmd->dm = CDDM_from_mesh(ob->data, ob);
+       else surmd->dm = get_original_dm(ob, NULL, 0);
        
        if(!ob->pd)
        {
@@ -6233,71 +6300,7 @@
        
        return dataMask;
 }
-static int is_last_displist(Object *ob)
-{
-       Curve *cu = ob->data;
-       static int curvecount=0, totcurve=0;
 
-       if(curvecount==0){
-               DispList *dl;
-
-               totcurve=0;
-               for(dl=cu->disp.first; dl; dl=dl->next){
-                       totcurve++;
-               }
-       }
-
-       curvecount++;
-
-       if(curvecount==totcurve){
-               curvecount=0;
-               return 1;
-       }
-
-       return 0;
-}
-
-static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int 
orco)
-{
-       DerivedMesh *dm= NULL;
-
-       if(ob->type==OB_MESH) {
-               dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
-
-               if(vertexCos) {
-                       CDDM_apply_vert_coords(dm, vertexCos);
-                       //CDDM_calc_normals(dm);
-               }
-               
-               if(orco)
-                       DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, 
get_mesh_orco_verts(ob));
-       }
-       else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
-               Object *tmpobj;
-               Curve *tmpcu;
-
-               if(is_last_displist(ob)) {
-                       /* copies object and modifiers (but not the data) */
-                       tmpobj= copy_object(ob);
-                       tmpcu = (Curve *)tmpobj->data;
-                       tmpcu->id.us--;
-
-                       /* copies the data */
-                       tmpobj->data = copy_curve((Curve *) ob->data);
-
-                       makeDispListCurveTypes(tmpobj, 1);
-                       nurbs_to_mesh(tmpobj);
-
-                       dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
-                       //CDDM_calc_normals(dm);
-
-                       free_libblock_us(&G.main->object, tmpobj);
-               }
-       }
-
-       return dm;
-}
-
 /* saves the current emitter state for a particle system and calculates 
particles */
 static void particleSystemModifier_deformVerts(
                                               ModifierData *md, Object *ob, 
DerivedMesh *derivedData,

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c  
2009-06-09 12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c  
2009-06-09 13:03:00 UTC (rev 20755)
@@ -2562,7 +2562,7 @@
        if(need_orco) orcobase= orco= get_object_orco(re, ob);
 
        displist.first= displist.last= 0;
-       makeDispListSurf(ob, &displist, 1);
+       makeDispListSurf(ob, &displist, 1, 0);
 
        dl= displist.first;
        /* walk along displaylist and create rendervertices/-faces */

Modified: trunk/blender/source/blender/src/buttons_object.c
===================================================================
--- trunk/blender/source/blender/src/buttons_object.c   2009-06-09 12:28:49 UTC 
(rev 20754)
+++ trunk/blender/source/blender/src/buttons_object.c   2009-06-09 13:03:00 UTC 
(rev 20755)
@@ -3395,12 +3395,14 @@
                if(pd && (pd->flag & PFIELD_SURFACE)
                        && 
ELEM5(pd->forcefield,PFIELD_HARMONIC,PFIELD_FORCE,PFIELD_HARMONIC,PFIELD_CHARGE,PFIELD_LENNARDJ))
                {
-                       md = modifier_new ( eModifierType_Surface );
-                       BLI_addtail ( &ob->modifiers, md );
-                       DAG_scene_sort(G.scene);
-                       DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
-                       allqueue(REDRAWBUTSEDIT, 0);
-                       allqueue(REDRAWVIEW3D, 0);
+                       if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, 
OB_CURVE)) {
+                               md = modifier_new ( eModifierType_Surface );
+                               BLI_addtail ( &ob->modifiers, md );
+                               DAG_scene_sort(G.scene);
+                               DAG_object_flush_update(G.scene, ob, 
OB_RECALC_DATA);
+                               allqueue(REDRAWBUTSEDIT, 0);
+                               allqueue(REDRAWVIEW3D, 0);
+                       }
                }
        }
        else if(!pd || !(pd->flag & PFIELD_SURFACE)
@@ -3556,8 +3558,10 @@
                        }
                        
                        if(particles==0 && 
ELEM5(pd->forcefield,PFIELD_HARMONIC,PFIELD_FORCE,PFIELD_HARMONIC,PFIELD_CHARGE,PFIELD_LENNARDJ))
 {
-                               but = uiDefButBitS(block, TOG, PFIELD_SURFACE, 
B_FIELD_CHANGE, "Surface",       10,15,140,20, &pd->flag, 0.0, 0, 0, 0, "Use 
closest point on surface");
-                               uiButSetFunc(but, object_surface__enabletoggle, 
ob, NULL);
+                               if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, 
OB_CURVE)) {
+                                       but = uiDefButBitS(block, TOG, 
PFIELD_SURFACE, B_FIELD_CHANGE, "Surface",       10,15,140,20, &pd->flag, 0.0, 
0, 0, 0, "Use closest point on surface");
+                                       uiButSetFunc(but, 
object_surface__enabletoggle, ob, NULL);
+                               }
                        }
                        uiBlockEndAlign(block);
                        


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to