//Takes in an array of 4D vectors where x, y, & z are world coordinates //as you'd expect and t represents the value-along-spline for the given //control point. Returns a transformed array still suitable for turning //into a spline. Order of rotation matches that of spine-macros. // #macro Transform_Array(TheArray,TheArrayLength,TheScale,TheRotation,TheTranslation) #local Ctr = 0; #local tempArray = TheArray; #while(Ctr < TheArrayLength) #local tempVector = * TheScale; #local tempVector = vrotate(tempVector, ); #local tempVector = vrotate(tempVector, <0,0,TheRotation.z>); #local tempVector = vrotate(tempVector, <0,TheRotation.y,0>); #local tempVector = tempVector + TheTranslation; #local tempArray[Ctr] = ; #local Ctr = Ctr + 1; #end //end while tempArray //returned value #end //end macro Transform_Array() /* //Like Transform_Array() but order is !IN REVERSE! // #macro Transform_Array_In_Reverse(TheArray,TheArrayLength,TheScale,TheRotation,TheTranslation) #local Ctr = 0; #local tempArray = TheArray; #while(Ctr < TheArrayLength) #local tempVector = ; #local tempVector = tempVector + TheTranslation; #local tempVector = vrotate(tempVector, <0,TheRotation.y,0>); #local tempVector = vrotate(tempVector, <0,0,TheRotation.z>); #local tempVector = vrotate(tempVector, ); #local tempVector = tempVector * TheScale; #local tempArray[Ctr] = ; #local Ctr = Ctr + 1; #end //end while tempArray //returned value #end //end macro Transform_Array_In_Reverse() */ //Takes in an array of 4D vectors where x, y, & z are world coordinates //as you'd expect and t represents the value-along-spline for the given //control point. Returns a spline. // #macro Spline_From_Array (The_Array, Array_Length ) #declare TempSpline = spline{ cubic_spline #local ctr = 0; #while (ctr < Array_Length) #local tempfloat = The_Array[ctr].t; //tempfloat avoids a type-error iirc tempfloat, , #local ctr = ctr+1; #end //end while //Note that the last value has an extra comma at the end. //That could be fixed with an #if statement but is it a problem? } //end spline TempSpline #end //end #macro Spline_From_Array() //It's an analogy. a_posi is to the range a_low to a_high //what RESULT is to the range b_low to b_high. //E.g. Range_Convert(25,0,100,32,212) returns: 77 (degrees F) //E.g. Range_Convert(77,32,212,0,100) returns: 25 (degrees C) // #macro Range_Convert(a_posi, a_low, a_high, b_low, b_high) ( ( (a_posi-a_low)*(b_high-b_low)/(a_high-a_low) ) + b_low ) #end // end macro Range_Convert() //It's pretty straight foward: // #macro Plot_Spline2(TheSpline,Plot_Min_Val,Plot_Max_Val,Thickness,Frequency,Color1,Color2) union{ #local ctr = Plot_Min_Val; #while (ctr < Plot_Max_Val) sphere { TheSpline(ctr),Thickness pigment {rgb Color1*(Range_Convert(ctr,Plot_Min_Val,Plot_Max_Val,1,0)) +Color2*(Range_Convert(ctr,Plot_Min_Val,Plot_Max_Val,0,1)) } //{ rgb <1-ctr,ctr,0> } finish {ambient 1 } } #local ctr = ctr + Frequency; #end //end while } //end union #end // ****************************************** #local XZ_Circle_Radius = 1; //Maybe next time I'll just use fractions of pi. #declare XZ_Circle_Array = array[19]{ //tangent //start //middle //end //tangent } // end array XZ_Circle_Array //I think the problem is dependent related to the value of token_count. //For the following list of 21 #declare statements, the use of extra "+" //and/or "-" symbols affects where whether the error occurs on line ... //or on line .... If the total number of extra symbols is divisible by //3 in the case of this block, the error occurs on line ..., otherwise //it occurs on line ... Try it. Try moving them. It doesn't matter where //they go. // //3 or 7 extra + or - symbols will cause it to fail even if infinate loop //below is changed to finite. // #declare dummy_var = +1;//bug avoidance 1 #declare dummy_var = +1;//bug avoidance 2 #declare dummy_var = +1;//bug avoidance 3 #declare dummy_var = -1;//bug avoidance 4 #declare dummy_var = 1;//bug avoidance 5 #declare dummy_var = -1;//bug avoidance 6 #declare dummy_var = -1;//bug avoidance 7 #declare dummy_var = 1;//bug avoidance 8 #declare dummy_var = 1;//bug avoidance 9 #declare dummy_var = 1;//bug avoidance 10 #declare dummy_var = 1;//bug avoidance 11 #declare dummy_var = 1;//bug avoidance 12 #declare dummy_var = 1;//bug avoidance 13 #declare dummy_var = 1;//bug avoidance 14 #declare dummy_var = 1;//bug avoidance 15 #declare dummy_var = 1;//bug avoidance 16 #declare dummy_var = 1;//bug avoidance 17 #declare dummy_var = 1;//bug avoidance 18 #declare dummy_var = 1;//bug avoidance 19 #declare dummy_var = 1;//bug avoidance 20 #declare dummy_var = 1;//bug avoidance 21 // Again, the failure point depends on how many added tokens there // are in the above block... // // # (of "-" anywhere in the list.) // 1 fails at Plot_Spline2(...) // 2 fails at Plot_Spline2(...) // 3 fails at #local Spline_A = Spline_From_Array(Array_A,19); // 4 fails at Plot_Spline2(...) // 5 fails at Plot_Spline2(...) // 6 fails at #local Spline_A = Spline_From_Array(Array_A,19); // 7 fails at Plot_Spline2(...) // 8 fails at Plot_Spline2(...) // 9 fails at #local Spline_A = Spline_From_Array(Array_A,19); // 10 fails at Plot_Spline2(...) // 11 fails at Plot_Spline2(...) // 12 fails at #local Spline_A = Spline_From_Array(Array_A,19); // 13 fails at Plot_Spline2(...) // 14 fails at Plot_Spline2(...) // 15 fails at #local Spline_A = Spline_From_Array(Array_A,19); // 16 fails at Plot_Spline2(...) // 17 fails at Plot_Spline2(...) // 18 fails at #local Spline_A = Spline_From_Array(Array_A,19); // 19 fails at Plot_Spline2(...) // 20 fails at Plot_Spline2(...) // 21 fails at #local Spline_A = Spline_From_Array(Array_A,19); #local M_Rand = seed(0); #local Itr_Ctr = 0; #while(Itr_Ctr < 40) #local Some_Scale = /10; #local Some_Rot = *360; #local Some_Tran = *1; #local Some_Thk = rand(M_Rand)/9; #local Some_Clr_1 = ; #local Some_Clr_2 = ; #local Some_Freq = .05;//rand(M_Rand)/10; //#if(Some_Freq < .01) #local Some_Freq = .01; #end //Too many spheres don't help show the problem. //usage: Transform_Array(TheArray,TheArrayLength,TheScale,TheRotation,TheTranslation) #local Array_A = Transform_Array(XZ_Circle_Array,19,Some_Scale,Some_Rot,Some_Tran); //usage: Spline_From_Array (The_Array, Array_Length) #local Spline_A = Spline_From_Array(Array_A,19); //usage: Plot_Spline2(TheSpline,Plot_Min_Val,Plot_Max_Val,Thickness,Frequency,Color1,Color2) Plot_Spline2(Spline_A,0,1,Some_Thk,Some_Freq,Some_Clr_1,Some_Clr_2) //Infinite loop is by default. Un-comment it to have a chance at rendering. //If un-commented it will render if the "bug avoidance" block above contains //anything other than exactly 3 or 7 "-" or "+" symbols aka extra tokens. // //#local Itr_Ctr = Itr_Ctr+1; #end //end #while