#include "shapes.inc" #macro Outline_Mesh(VertexArray, FaceArray, CamLoc, CamLookAt, CamAngle, LineWidth) //Examine mesh for invisible faces #local FaceVisible = array[dimension_size(FaceArray,1)] #local VisibleFaceCount = 0; #local I = 0; #while (I < dimension_size(FaceArray,1)) #if (vdot(CamLoc-(VertexArray[FaceArray[I].x]+VertexArray[FaceArray[I].y]+VertexArray[FaceArray[I].z])/3, vcross(VertexArray[FaceArray[I].z]-VertexArray[FaceArray[I].x], VertexArray[FaceArray[I].y]-VertexArray[FaceArray[I].x])) > 0) #local FaceVisible[I] = true; #local VisibleFaceCount = VisibleFaceCount + 1; #else #local FaceVisible[I] = false; #end #local I = I + 1; #end //Perform backface culling #local VisibleFaceArray = array[VisibleFaceCount] #local I = 0; #local J = 0; #while (I < dimension_size(FaceArray,1)) #if (FaceVisible[I]) #local VisibleFaceArray[J] = FaceArray[I]; #local J = J + 1; #end #local I = I + 1; #end //#debug concat("No. of visible faces after backface culling: ", str(VisibleFaceCount,0,0), "\n") //Determine possible lines in mesh #local PossibleLines = array[3*VisibleFaceCount] #local I = 0; #while (I < VisibleFaceCount) #local PossibleLines[3*I+0] = ; #local PossibleLines[3*I+1] = ; #local PossibleLines[3*I+2] = ; #local I = I + 1; #end #local DuplicateLine = array[3*VisibleFaceCount] #local I = 0; #while (I < 3*VisibleFaceCount) #local DuplicateLine[I] = false; #local I = I + 1; #end //Look for duplicates #local DuplicateCount = 0; #local I = 1; #while (I < 3*VisibleFaceCount) #local DuplicateFound = false; #local J = 0; #while (J < I & (!DuplicateFound)) #if (PossibleLines[I].x = PossibleLines[J].x & PossibleLines[I].y = PossibleLines[J].y) #if (!DuplicateLine[I]) #local DuplicateLine[I] = true; #local DuplicateCount = DuplicateCount + 1; #end #if (!DuplicateLine[J]) #local DuplicateLine[J] = true; #local DuplicateCount = DuplicateCount + 1; #end #end #local J = J + 1; #end #local I = I + 1; #end #local VertexRadii = array[dimension_size(VertexArray,1)] #local I = 0; #while (I < dimension_size(VertexArray,1)) #local VertexRadii[I] = -1; //invisible #local I = I + 1; #end #debug concat("VertexRadii[23]: ", str(VertexRadii[23],0,0), "\n") #local I = 0; #while (I < 3*VisibleFaceCount) #if (!DuplicateLine[I]) #local VertexRadii[PossibleLines[I].x] = LineWidth*2*tan(radians(CamAngle/2))/image_width/2*vdot(VertexArray[PossibleLines[I].x]-CamLoc,CamLookAt-CamLoc)/vlength(CamLookAt-CamLoc); #local VertexRadii[PossibleLines[I].y] = LineWidth*2*tan(radians(CamAngle/2))/image_width/2*vdot(VertexArray[PossibleLines[I].y]-CamLoc,CamLookAt-CamLoc)/vlength(CamLookAt-CamLoc); #end #local I = I + 1; #end union { #local I = 0; #while (I < dimension_size(VertexArray,1)) #if (VertexRadii[I] > 0) sphere {VertexArray[I], VertexRadii[I]} #end #local I = I + 1; #end #local I = 0; #while (I < 3*VisibleFaceCount) #if (!DuplicateLine[I]) Connect_Spheres(VertexArray[PossibleLines[I].x], VertexRadii[PossibleLines[I].x], VertexArray[PossibleLines[I].y], VertexRadii[PossibleLines[I].y]) #end #local I = I + 1; #end } #end