// Persistence of Vision Ray Tracer Scene Description File // File: fishskin.pov // Vers: 3.5 // Desc: Creates skin for tubular critters // Date: 10/26/01 // Auth: JRE // #version 3.5; #ifndef(HelloMultispline) #include "multispline.inc" #end // Sample method for generating a simple tube array /* #declare f = array[4][5] #declare uc = 0; #while ( uc < dimension_size(f,1)) #declare vc = 0; #while ( vc < dimension_size(f,2)) #declare f[uc][vc] = ; #declare vc = vc + 1; #end #declare uc = uc + 1; #end */ // User definable items #declare WireFrameColor = <0,0,0>; #declare WireFrameRadius = 0.01; // Position Control creates point P near A that points towards B so that AP is parallel with BC #macro PositionControl(A,B,C) A + vnormalize(B-C)*vlength(A-B)/3 #end // Create Corner creates a point p near A that completes a parallelogram with sides AB and BC #macro CreateCorner(A,B,C) B + C -A #end //DrawWireFrame #macro DrawWireFrame(f,b) #local BezRad = WireFrameRadius; #local BezTex = texture { pigment { rgb WireFrameColor } } #local FullCurve = 1; #declare uc = 0; #while (uc < dimension_size(f,1) ) #declare vc = 0; #local temp = array[dimension_size(f,2)] #while (vc < dimension_size(f,2) ) #local temp[vc] = f[uc][vc]; #declare vc = vc + 1; #end #local longtemp = MakeLongSpline(temp,b,b) DrawLongSpline(longtemp) #declare uc = uc + 1; #end #declare vc = 0; #while ( vc < dimension_size(f,2)) #declare uc = 0; #local temp = array[dimension_size(f,1)] #while ( uc < dimension_size(f,1)) #declare temp[uc] = f[uc][vc]; #declare uc = uc + 1; #end #local long = MakeLongSpline(temp,b,b); DrawLongSpline(long) #declare vc = vc + 1; #end #end // CreateSkinPoints macro takes a two dimension array of points and creates a skin of bezier patches #macro CreateSkinPoints(f,b) #declare F = array[dimension_size(f,1)*3-2][dimension_size(f,2)*3-2] #local BezRad = WireFrameRadius; #local BezTex = texture { pigment { rgb WireFrameColor } } #local FullCurve = 1; #declare uc = 0; #while (uc < dimension_size(f,1) ) #declare vc = 0; #local temp = array[dimension_size(f,2)] #while (vc < dimension_size(f,2) ) #local temp[vc] = f[uc][vc]; #declare vc = vc + 1; #end #local longtemp = MakeLongSpline(temp,b,b) #declare vc = 0; #while ( vc < dimension_size(longtemp,1)) #ifndef(F[uc*3][vc]) #declare F[uc*3][vc] = longtemp[vc]; #end #declare vc = vc + 1; #end #declare uc = uc + 1; #end #declare vc = 0; #while ( vc < dimension_size(f,2)) #declare uc = 0; #local temp = array[dimension_size(f,1)] #while ( uc < dimension_size(f,1)) #declare temp[uc] = f[uc][vc]; #declare uc = uc + 1; #end #local long = MakeLongSpline(temp,0,0); #declare u2 = 0; #while(u2 < dimension_size(long,1)) #ifndef ( F[u2][vc*3]) //#debug concat("Found predermined point at <",str(u2,0,0),","str(vc,0,0),">") //#else #declare F[u2][vc*3] = long[u2]; #end #declare u2 = u2 + 1; #end //#debug "Next Line" #declare vc = vc + 1; #end // Find the middle 4 control points for each array #declare uc = 0; #while ( uc < dimension_size(f,1)-1) #declare UC = uc*3; #declare vc = 0; #while (vc < dimension_size(f,2)-1) #declare VC = vc*3; // Declare +1,+1 #if (uc = 0) #if (vc = 0) #declare F[UC+1][VC+1] = F[UC+1][VC] + F[UC][VC+1] - F[UC][VC]; #else #declare F[UC+1][VC+1] = PositionControl(F[UC+1][VC],F[UC+1][VC+3],F[UC+1][VC-3]); #end #else #if (vc = 0) #declare F[UC+1][VC+1] = F[UC][VC+1] + vnormalize(F[UC+3][VC+1] - F[UC-3][VC+1])*vlength(F[UC+3][VC+1]-F[UC][VC+1])/3 ; #else #declare F[UC+1][VC+1] = F[UC+1][VC] + F[UC][VC+1] - F[UC][VC]; #end #end // Declare +1,+2 #if (uc = 0) #if (vc < dimension_size(f,2)-2) #declare F[UC+1][VC+2] = F[UC+1][VC+3] +vnormalize(F[UC+1][VC]-F[UC+1][VC+6])*vlength(F[UC+1][VC+3]-F[UC+1][VC])/3; #else #declare F[UC+1][VC+2] = F[UC][VC+3] + F[UC+1][VC+3]-F[UC][VC+3] +F[UC][VC+2] - F[UC][VC+3]; #end #else #if (vc < dimension_size(f,2)-2) #declare F[UC+1][VC+2] = F[UC+1][VC+3] + F[UC][VC+2] - F[UC][VC+3]; #else #declare F[UC+1][VC+2] = PositionControl(F[UC][VC+2],F[UC+3][VC+2],F[UC-3][VC+2]); #end #end // Declare +2,+1 #if (uc < dimension_size(f,1)-2) #if (vc =0 ) #declare F[UC+2][VC+1] = PositionControl(F[UC+3][VC+1],F[UC][VC+1],F[UC+6][VC+1]); #else #declare F[UC+2][VC+1] = CreateCorner(F[UC+3][VC],F[UC+2][VC],F[UC+3][VC+1]); #end #else #if (vc = 0) #declare F[UC+2][VC+1] =CreateCorner(F[UC+3][VC],F[UC+2][VC],F[UC+3][VC+1]); #else #declare F[UC+2][VC+1] = PositionControl(F[UC+2][VC],F[UC+2][VC+3],F[UC+2][VC-3]) ; #end #end // Declare +2,+2 #if (uc < dimension_size(f,1)-2) #if (vc < dimension_size(f,2)-2 ) #declare F[UC+2][VC+2] = CreateCorner(F[UC+3][VC+3],F[UC+3][VC+2],F[UC+2][VC+3]); #else #declare F[UC+2][VC+2] = PositionControl(F[UC+3][VC+2],F[UC][VC+2],F[UC+6][VC+2]); #end #else #if (vc < dimension_size(f,2)-2) #declare F[UC+2][VC+2] =PositionControl(F[UC+2][VC+3],F[UC+2][VC],F[UC+2][VC+6]); #else #declare F[UC+2][VC+2] =CreateCorner(F[UC+3][VC+3],F[UC+2][VC+3],F[UC+3][VC+2]) ; #end #end #declare vc = vc + 1; #end #declare uc = uc + 1; #end F #end // Create Skin Points #macro MakeSkin(F) #ifndef(SkinPigment) #declare SkinPigment = pigment { marble } #end #ifndef(SkinNormal) #declare SkinNormal = normal { bumps 0 } #end #ifndef(SkinFinish) #declare SkinFinish = finish { specular 1 } #end #ifndef(SkinTexture) #declare SkinTexture = texture { pigment { SkinPigment } finish { SkinFinish } } #end #declare uc = 0; #declare ulim = (dimension_size(F,1)+2)/3-1; #declare vlim = (dimension_size(F,2)+2)/3-1; #debug concat (str(dimension_size(F,1),3,6),str(dimension_size(F,2),3,6),"Ulim:",str(ulim,4,4)," Vlim:",str(vlim,4,4)) #while (uc < ulim ) #declare vc = 0; #while (vc < vlim ) #declare UC=uc*3; #declare VC=vc*3; #declare umin = uc/ulim; #declare umax =(uc+1)/ulim; #declare vmin =vc/vlim; #declare vmax =(vc+1)/vlim; bicubic_patch { type 0 flatness 0.01 u_steps 4 v_steps 4 uv_vectors ,,, F[UC][VC], F[UC+1][VC], F[UC+2][VC], F[UC+3][VC], F[UC][VC+1], F[UC+1][VC+1], F[UC+2][VC+1], F[UC+3][VC+1], F[UC][VC+2], F[UC+1][VC+2], F[UC+2][VC+2], F[UC+3][VC+2], F[UC][VC+3], F[UC+1][VC+3], F[UC+2][VC+3], F[UC+3][VC+3] uv_mapping texture { SkinTexture} } #declare vc = vc + 1; #end #declare uc = uc + 1; #end #end // MakeSkin