Revision: 19194
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19194
Author:   eman
Date:     2009-03-05 00:20:23 +0100 (Thu, 05 Mar 2009)

Log Message:
-----------
Another patch from Laurynas.
Direction selection removed before splitting curve.
Changed knot recalculation after cp deletion. There were problems with knottype 
== 9
Fixed knot for spin.

Modified Paths:
--------------
    branches/nurbs/blender/source/blender/src/editcurve.c

Modified: branches/nurbs/blender/source/blender/src/editcurve.c
===================================================================
--- branches/nurbs/blender/source/blender/src/editcurve.c       2009-03-04 
19:40:08 UTC (rev 19193)
+++ branches/nurbs/blender/source/blender/src/editcurve.c       2009-03-04 
23:20:23 UTC (rev 19194)
@@ -633,6 +633,31 @@
        }
 }
 
+void removeDeletedKnot(int cp, float* knots, int pnts, int order, short 
cyclic) {
+       int i;
+       float step, last;
+       if (cyclic) {
+               //just fixes knots in cycle to be correct
+               if (pnts == order) order--;
+               for (i = 0; i < 2 * order - 1; i++)
+                       knots[pnts + i] = knots[pnts - 1] + knots[i + 1] - 
knots[0];
+       } else if (pnts == order) {
+               //shifts knot vector to the left by one position
+               order--;
+               pnts--;
+               step = knots[0] - knots[1];
+               for (i = 0; i < pnts + order; i++)
+                       knots [i] = knots[i + 1] + step;
+       } else {
+               //enshures last knot to retain same multiplicity
+               pnts--;
+               i = pnts + order;
+               while (knots[i] == knots[i - 1]) i--;
+               last = knots[i - 1];
+               while (i < pnts + order) knots[i++] = last;
+       }
+}
+
 void deleteflagNurb(short flag)
 {
        Nurb *nu, *next;
@@ -687,15 +712,15 @@
                                        if((bp->f1 & flag)==0) {
                                                memcpy(bpn, bp, 
nu->pntsu*sizeof(BPoint));
                                                bpn+= nu->pntsu;
-                                       }
+                                       } else
+                                               removeDeletedKnot(b, nu -> 
knotsv, nu -> pntsv, nu -> orderv, nu -> knottypev == 0);
                                        bp+= nu->pntsu;
                                }
                                nu->pntsv= newv;
                                MEM_freeN(nu->bp);
                                nu->bp= newbp;
                                clamp_nurb_order_v(nu);
-
-                               makeknots(nu, 2, nu->flagv>>1);
+                               //makeknots(nu, 2, nu->flagv>>1);
                        }
                        else {
                                /* is the nurb in V direction selected */
@@ -724,7 +749,8 @@
                                                        if((bp->f1 & flag)==0) {
                                                                *bpn= *bp;
                                                                bpn++;
-                                                       }
+                                                       } else
+                                                               
removeDeletedKnot(a, nu -> knotsu, nu -> pntsu, nu -> orderu, nu -> knottypeu 
== 0);
                                                }
                                        }
                                        MEM_freeN(nu->bp);
@@ -741,7 +767,7 @@
                                                nu->pntsu= newu;
                                                clamp_nurb_order_u(nu);
                                        }
-                                       makeknots(nu, 1, nu->flagu>>1);
+                                       //makeknots(nu, 1, nu->flagu>>1);
                                }
                        }
                }
@@ -749,7 +775,7 @@
        }
 }
 
-void setExtudedKnot(float* knots, int pnts, int order, short fromEnd) {
+void setExtrudedKnot(float* knots, int pnts, int order, short fromEnd) {
        int step = 1;
        if (fromEnd) {
                step = -step;
@@ -809,7 +835,7 @@
                                }
                                nu -> pntsv++;
                                
-                               setExtudedKnot(nu -> knotsv, nu -> pntsv, nu -> 
orderv, !shift);
+                               setExtrudedKnot(nu -> knotsv, nu -> pntsv, nu 
-> orderv, !shift);
                                // resize nurbana's buffers
                                
NRB_SizeChanged(nu->nurbanaPtr,nu->pntsu,nu->pntsv);
                        }
@@ -833,7 +859,7 @@
                                        bp += nu -> pntsu;
                                        bpn += nu -> pntsu;
                                }
-                               setExtudedKnot(nu -> knotsu, nu -> pntsu, nu -> 
orderu, !shift);
+                               setExtrudedKnot(nu -> knotsu, nu -> pntsu, nu 
-> orderu, !shift);
                                // resize nurbana's buffers
                                NRB_SizeChanged(nu->nurbanaPtr, nu->pntsu, 
nu->pntsv);
                        }
@@ -2228,7 +2254,9 @@
                if(!nu->nurbanaPtr)
                        return;
                
-               uv = selectDirection(nu, mvalo, mval, &sizeU, &sizeV, &size, 
&bufferU, &bufferV, &buffer, &canceled);
+               if (nu -> pntsv > 1)
+                       uv = selectDirection(nu, mvalo, mval, &sizeU, &sizeV, 
&size, &bufferU, &bufferV, &buffer, &canceled);
+               else uv = 0;
                
                if (uv) {
                        cyclic = nu -> flagv &= CU_CYCLIC;
@@ -2368,7 +2396,7 @@
                        void* nu2Ptr = NULL;
                        if (!cyclic) {
                                nu2 = (Nurb*)MEM_callocN(sizeof(Nurb), 
"SplitedNurb");
-                               nu2 -> type = 4;
+                               nu2 -> type = nu -> type;
                                nu2 -> resolu = nu -> resolu;
                                nu2 -> resolv = nu -> resolv;
                                nu2 -> orderu = nu -> orderu;
@@ -2386,6 +2414,18 @@
                                nu2Ptr = nu2 -> nurbanaPtr;
                        }
                    NRB_splitBuffer(tmpBuffer, inserted, nu -> nurbanaPtr, 
nu2Ptr, splitKnot, newLength, k, uv, frstLen, scndLen);
+                   if (nu -> pntsv == 1) {
+                       int i;
+                       BPoint *cp = nu -> bp + nu -> pntsu - 1;
+                       //set radius and weight values for added cp's
+                       for (i = inserted; i >= 0; i--, cp--)
+                               cp -> radius = cp -> weight = 1.0;
+                       //set radius and weight values for newly created curve
+                       if (nu2)
+                                       for (i = 0, cp = nu2 -> bp; i < nu2 -> 
pntsu; i++, cp++)
+                                               cp -> radius = cp -> weight = 
1.0;
+                   }
+                       
                }
                choosing = 1;
                canceled = 0;
@@ -3443,7 +3483,7 @@
                        if(isNurbsel(nu)) {
                                nu->orderv= 4;
                                nu->flagv |= CU_CYCLIC;
-                               makeknots(nu, 2, nu->flagv>>1);
+                               makeknots(nu, 2, 0);
                        }
                }
        }
@@ -3550,7 +3590,7 @@
 
                if(bp) {
                        nu->pntsu++;
-                       setExtudedKnot(nu -> knotsu, nu -> pntsu, nu -> orderu, 
bp == newbp - 1);
+                       setExtrudedKnot(nu -> knotsu, nu -> pntsu, nu -> 
orderu, bp == newbp - 1);
                        //makeknots(nu, 1, nu->flagu>>1);
                        NRB_SizeChanged(nu->nurbanaPtr,nu->pntsu,nu->pntsv);
                        if(mode=='e') {
@@ -4348,6 +4388,7 @@
                                                nu->pntsu--;
                                                a--;
                                                event= 1;
+                                               removeDeletedKnot(a, 
nu->knotsu, nu->pntsu, nu->orderu, nu->knottypeu == 0);
                                        }
                                        else {
                                                bp++;
@@ -4366,7 +4407,7 @@
                                                clamp_nurb_order_u(nu);
                                        }*/
                                }
-                               makeknots(nu, 1, nu->flagu>>1);
+                               //makeknots(nu, 1, nu->flagu>>1);
                        }
                        nu= next;
                }


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

Reply via email to