/***************************************************************************************************/ /* This work is a part of the POV-Person library and is licensed for royalty free re-use. */ /***************************************************************************************************/ // The ppMesh2FromArray macro takes an array of Positions and generates a mesh2 object. // // Parameters: // ----------- // ppArray - The 2D array of positions // ppNormal - An optional 2D array of normals // ppIDim - The size of the first dimension // ppJDim - The size of the second dimension // ppJoinEnds - Whether to join the ends of the mesh together - 1=join them, 0 = leave the mesh open // #macro ppMesh2FromArray(ppArray,ppNormalArray,ppIDim,ppJDim,ppJoinEnds) #if ( ppVerbose = 1) #debug concat("ppMeshFromArray Macro Call. \n") #end // Rewritten based on an example posted by Scott on the povray.binaries.scene-files newsgroup. #if (ppJoinEnds) #local ppJTotal = ppJDim + 1; #else #local ppJTotal = ppJDim; #end mesh2{ vertex_vectors{ ppIDim*ppJTotal #local ppI = 0; #while(ppI; #local ppNormalCount = 0; #if (ppJoinEnds) #if (ppI>=1 & ppJ=ppJDim) #local ppNormal = ppNormal + vcross(ppArray[ppI][0]-ppArray[ppI][1],ppArray[ppI][0]-ppArray[ppI-1][0]); #local ppNormalCount = ppNormalCount+1; #end #if (ppI<=ppIDim-2 & ppJ=ppJDim) #local ppNormal = ppNormal - vcross(ppArray[ppI][0]-ppArray[ppI][1],ppArray[ppI][0]-ppArray[ppI+1][0]); #local ppNormalCount = ppNormalCount+1; #end #if (ppI>=1 & ppJ=ppJDim-1) #local ppNormal = ppNormal + vcross(ppArray[ppI][ppJ]-ppArray[ppI][0],ppArray[ppI][ppJ]-ppArray[ppI-1][ppJ]); #local ppNormalCount = ppNormalCount+1; #end #if (ppI<=ppIDim-2 & ppJ=ppJDim-1) #local ppNormal = ppNormal - vcross(ppArray[ppI][ppJ]-ppArray[ppI][0],ppArray[ppI][ppJ]-ppArray[ppI+1][ppJ]); #local ppNormalCount = ppNormalCount+1; #end #if (ppI<=ppIDim-2 & ppJ=0) #local ppNormal = ppNormal + vcross(ppArray[ppI][ppJ]-ppArray[ppI][ppJDim-1],ppArray[ppI][ppJ]-ppArray[ppI+1][ppJ]); #local ppNormalCount = ppNormalCount+1; #end #if (ppI>=1 & ppJ=0) #local ppNormal = ppNormal - vcross(ppArray[ppI][ppJ]-ppArray[ppI][ppJDim-1],ppArray[ppI][ppJ]-ppArray[ppI-1][ppJ]); #local ppNormalCount = ppNormalCount+1; #end #end #if (ppI>=1 & ppJ<=ppJDim-2) #local ppNormal = ppNormal + vcross(ppArray[ppI][ppJ]-ppArray[ppI][ppJ+1],ppArray[ppI][ppJ]-ppArray[ppI-1][ppJ]); #local ppNormalCount = ppNormalCount+1; #end #if (ppI<=ppIDim-2 & ppJ<=ppJDim-2) #local ppNormal = ppNormal - vcross(ppArray[ppI][ppJ]-ppArray[ppI][ppJ+1],ppArray[ppI][ppJ]-ppArray[ppI+1][ppJ]); #local ppNormalCount = ppNormalCount+1; #end #if (ppI<=ppIDim-2 & ppJ>=1 & ppJ=1 & ppJ>=1 & ppJ #else (ppNormal/ppNormalCount) #end #end #local ppJ=ppJ+1; #end #local ppI=ppI+1; #end } uv_vectors{ ppIDim*ppJTotal #local ppI=0; #while(ppI #local ppJ=ppJ+1; #end #local ppI=ppI+1; #end } face_indices{ (ppIDim-1)*(ppJTotal-1)*2 #local ppI=0; #while(ppI #local ppJ=ppJ+1; #end #local ppI=ppI+1; #end } normal_indices{ (ppIDim-1)*(ppJTotal-1)*2 #local ppI=0; #while(ppI #local ppJ=ppJ+1; #end #local ppI=ppI+1; #end } uv_indices{ (ppIDim-1)*(ppJTotal-1)*2 #local ppI=0; #while(ppI #local ppJ=ppJ+1; #end #local ppI=ppI+1; #end } } #end