Revision: 15207
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15207
Author:   campbellbarton
Date:     2008-06-12 16:46:32 +0200 (Thu, 12 Jun 2008)

Log Message:
-----------
Curve Smoorth for venomgfx adjusting animation paths over terrain.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BDR_editcurve.h
    trunk/blender/source/blender/src/editcurve.c
    trunk/blender/source/blender/src/editobject.c

Modified: trunk/blender/source/blender/include/BDR_editcurve.h
===================================================================
--- trunk/blender/source/blender/include/BDR_editcurve.h        2008-06-12 
03:00:24 UTC (rev 15206)
+++ trunk/blender/source/blender/include/BDR_editcurve.h        2008-06-12 
14:46:32 UTC (rev 15207)
@@ -99,6 +99,7 @@
 void setweightNurb( void );
 void setradiusNurb( void );
 void smoothradiusNurb( void );
+void smoothNurb( void );
 
 extern void undo_push_curve(char *name);
 

Modified: trunk/blender/source/blender/src/editcurve.c
===================================================================
--- trunk/blender/source/blender/src/editcurve.c        2008-06-12 03:00:24 UTC 
(rev 15206)
+++ trunk/blender/source/blender/src/editcurve.c        2008-06-12 14:46:32 UTC 
(rev 15207)
@@ -1158,7 +1158,63 @@
        allqueue(REDRAWINFO, 1);        /* 1, because header->win==0! */
 }
 
+void smoothNurb( void )
+{
 
+       extern ListBase editNurb;
+       Nurb *nu;
+       BezTriple *bezt, *beztOrig;
+       BPoint *bp, *bpOrig;
+       int a, i, change = 0;
+       
+       /* floats for smoothing */
+       float val, newval, offset;
+       
+       for(nu= editNurb.first; nu; nu= nu->next) {
+               if(nu->bezt) {
+                       change = 0;
+                       beztOrig = MEM_dupallocN( nu->bezt );
+                       for(bezt=nu->bezt+1, a=1; a<nu->pntsu-1; a++, bezt++) {
+                               if(bezt->f2 & SELECT) {
+                                       for(i=0; i<3; i++) {
+                                               val = bezt->vec[1][i];
+                                               newval = 
((beztOrig+(a-1))->vec[1][i] * 0.5) + ((beztOrig+(a+1))->vec[1][i] * 0.5);
+                                               offset = (val*((1.0/6.0)*5)) + 
(newval*(1.0/6.0)) - val;
+                                               /* offset handles */
+                                               bezt->vec[1][i] += offset;
+                                               bezt->vec[0][i] += offset;
+                                               bezt->vec[2][i] += offset;
+                                       }
+                                       change = 1;
+                               }
+                       }
+                       MEM_freeN(beztOrig);
+                       if (change)
+                               calchandlesNurb(nu);
+               } else if (nu->bp) {
+                       bpOrig = MEM_dupallocN( nu->bp );
+                       /* Same as above, keep these the same! */
+                       for(bp=nu->bp+1, a=1; a<nu->pntsu-1; a++, bp++) {
+                               if(bp->f1 & SELECT) {
+                                       for(i=0; i<3; i++) {
+                                               val = bp->vec[i];
+                                               newval = 
((bpOrig+(a-1))->vec[i] * 0.5) + ((bpOrig+(a+1))->vec[i] * 0.5);
+                                               offset = (val*((1.0/6.0)*5)) + 
(newval*(1.0/6.0)) - val;
+                                       
+                                               bp->vec[i] += offset;
+                                       }
+                               }
+                       }
+                       MEM_freeN(bpOrig);
+               }
+       }
+       BIF_undo_push("Smooth Curve");
+       DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+       allqueue(REDRAWVIEW3D, 0);
+       allqueue(REDRAWBUTSALL, 0);
+       allqueue(REDRAWINFO, 1);        /* 1, because header->win==0! */
+}
+
 /* TODO, make smoothing distance based */
 void smoothradiusNurb( void )
 {

Modified: trunk/blender/source/blender/src/editobject.c
===================================================================
--- trunk/blender/source/blender/src/editobject.c       2008-06-12 03:00:24 UTC 
(rev 15206)
+++ trunk/blender/source/blender/src/editobject.c       2008-06-12 14:46:32 UTC 
(rev 15207)
@@ -2735,7 +2735,7 @@
        }
        else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
 
-               nr= pupmenu("Specials%t|Subdivide%x1|Switch Direction%x2|Set 
Goal Weight %x3|Set Radius %x4|Smooth Radius %x5");
+               nr= pupmenu("Specials%t|Subdivide%x1|Switch Direction%x2|Set 
Goal Weight %x3|Set Radius %x4|Smooth Radius %x5|Smooth Radius %x6");
                
                switch(nr) {
                case 1:
@@ -2751,6 +2751,9 @@
                        setradiusNurb();
                        break;
                case 5:
+                       smoothNurb();
+                       break;
+               case 6:
                        smoothradiusNurb();
                        break;
                }


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

Reply via email to