/********************************************************************************** Persistence of Vision Ray Tracer Scene Description File File name : Gridgen.mcr Version : 3.7 Description : Series of macros that generate different types of meshes Date : April/May 2012 Author : Thomas de Groot E-mail : Copyright (C) 2012. All rights reserved. Use and/or modification of this scene is free, except for commercial purposes. Commercial distribution is not allowed without written permission from the author. **********************************************************************************/ // Designs a grid of quad points conforming to the topography of surf #macro Gridgen(Surf,MinX,MinZ,MaxX,MaxZ,Incr) #debug " writing grid vertex location list...\n" #fopen GridLocs "GridLocs.inc" write #local Z = MinZ; #while (Z <= MaxZ) #write (GridLocs,"//new row\n") #local X = MinX; #while (X <= MaxX) #local Nor = <0, 0, 0>; #local Loc = ; #local Pos = trace (Surf, Loc, -y, Nor); #if (X = MaxX & Z = MaxZ) //last line test #write (GridLocs,"<",str(Pos.x,3,3),", ",str(Pos.y,3,5),", ",str(Pos.z,3,3),">\n") #else #write (GridLocs,"<",str(Pos.x,3,3),", ",str(Pos.y,3,5),", ",str(Pos.z,3,3),">,\n") #end #local X = X + Incr; #end #local Z = Z + Incr; #end #fclose GridLocs #end //of Gridgen //-------------------------------------------------------------------------------------------------- // Designs a flat mesh conforming to the topography of surf #macro MeshGen(Surf,MinX,MinZ,MaxX,MaxZ,Incr) #debug " writing grid mesh...\n" #fopen GridMesh "GridMesh.inc" write #write (GridMesh,"mesh {\n") #local Z = MinZ; #while (Z <= MaxZ) //start of Z loop #local X = MinX; #while (X <= MaxX) //start of X loop //triangle A: #local Nor = <0, 0, 0>; #local Loc = ; #local Pos = trace (Surf, Loc, -y, Nor); #write (GridMesh," triangle {<",vstr(3,Pos,", ",0,6),">, ") #local Z = Z + Incr; #local Nor = <0, 0, 0>; #local Loc = ; #local Pos = trace (Surf, Loc, -y, Nor); #write (GridMesh,"<",vstr(3,Pos,", ",0,6),">, ") #local X = X + Incr; #local Nor = <0, 0, 0>; #local Loc = ; #local Pos = trace (Surf, Loc, -y, Nor); #write (GridMesh,"<",vstr(3,Pos,", ",0,6),">}\n") //triangle B: #write (GridMesh," triangle {<",vstr(3,Pos,", ",0,6),">, ") #local Z = Z - Incr; #local Nor = <0, 0, 0>; #local Loc = ; #local Pos = trace (Surf, Loc, -y, Nor); #write (GridMesh,"<",vstr(3,Pos,", ",0,6),">, ") #local X = X - Incr; #local Nor = <0, 0, 0>; #local Loc = ; #local Pos = trace (Surf, Loc, -y, Nor); #write (GridMesh,"<",vstr(3,Pos,", ",0,6),">}\n") #local X = X + Incr; #end //of X loop #local Z = Z + Incr; #end //of Z loop #write (GridMesh,"}\n") #fclose GridMesh #end //of MeshGen //-------------------------------------------------------------------------------------------------- // Designs a path of vertical triangles conforming to the topography of surf #macro PathGen(Surf,Vstart,Vend,Shift,Shrot,Vrot,Incr,Add) #debug " writing grid path...\n" #if (Add) #fopen GridPath "GridPath.inc" append #else #fopen GridPath "GridPath.inc" write #end #write (GridPath,"mesh {\n") #local Counter = 0; #local Spoint = Shift; #local Spoint = vrotate(Spoint, Shrot); #local Vstart = Vstart + Spoint; #local Vend = Vend + Spoint; #local Vpoint = ; #while (Vpoint.x < Vend.x & Vpoint.z < Vend.z) //triangle point A: #local Nor = <0, 0, 0>; #local Loc = ; #local Pos = trace (Surf, Loc, -y, Nor); #write (GridPath," triangle {<",vstr(3,Pos,", ",0,6),">, ") //triangle point B: #local Counter = Counter+Incr; #local Vpoint = <0, 0, Counter>; #local Vpoint = vrotate(Vpoint, Vrot) + ; #write (GridPath,"<",vstr(3,Vpoint,", ",0,6),">, ") //triangle point C: #local Nor = <0, 0, 0>; #local Loc = ; #local Pos = trace (Surf, Loc, -y, Nor); #write (GridPath,"<",vstr(3,Pos,", ",0,6),">}\n") #end #write (GridPath,"}\n") #fclose GridPath #end //of PathGen //-------------------------------------------------------------------------------------------------- // Designs a flat mesh track conforming to the topography of surf #macro TrackGen(Surf,Vstart,Vend,Shift,Shrot,Vrot,Incr,Add) #debug " writing grid track...\n" #if (Add) #fopen GridTrack "GridTrack.inc" append #else #fopen GridTrack "GridTrack.inc" write #end #write (GridTrack,"mesh {\n") #local Counter = 0; #local Spoint = Shift; #local Spoint = vrotate(Spoint, Shrot); #local Vstart = Vstart + Spoint; #local Vend = Vend + Spoint; #local Corner1 = <0.8, 0, 0>; #local Corner1 = vrotate(Corner1,Vrot); #local Corner2 = <-0.8, 0, 0>; #local Corner2 = vrotate(Corner2,Vrot); #local Vpoint1 = Vstart; #local Vpoint2 = <0, 0, Incr>; #local Vpoint2 = vrotate(Vpoint2,Vrot) + Vstart; #while (Vpoint2.x < Vend.x & Vpoint2.z < Vend.z) //triangle A: #local Nor = <0, 0, 0>; #local Loc1 = ; #local Pos1 = trace (Surf, Loc1, -y, Nor); #local Nor = <0, 0, 0>; #local Loc2 = ; #local Pos2 = trace (Surf, Loc2, -y, Nor); #local Pos = Pos1 + Corner1; #write (GridTrack," triangle {<",vstr(3,Pos,", ",0,6),">, ") #local Pos = Pos1 + Corner2; #write (GridTrack,"<",vstr(3,Pos,", ",0,6),">, ") #local Pos = Pos2 + Corner2; #write (GridTrack,"<",vstr(3,Pos,", ",0,6),">}\n") //triangle B: #write (GridTrack," triangle {<",vstr(3,Pos,", ",0,6),">, ") #local Pos = Pos2 + Corner1; #write (GridTrack,"<",vstr(3,Pos,", ",0,6),">, ") #local Pos = Pos1 + Corner1; #write (GridTrack,"<",vstr(3,Pos,", ",0,6),">}\n") #local Counter = Counter+Incr; #local Vpoint1 = <0, 0, Counter>; #local Vpoint2 = <0, 0, Counter+Incr>; #local Vpoint1 = vrotate(Vpoint1, Vrot) + Vstart; #local Vpoint2 = vrotate(Vpoint2, Vrot) + Vstart; #end #write (GridTrack,"}\n") #fclose GridTrack #end //of TrackGen //-------------------------------------------------------------------------------------------------- // Designs a flat mesh track conforming to the topography of surf #macro TrackGen2(Surf,Vstart,Vend,Shift,Shrot,Vrot,Incr,Add) #debug " writing grid track...\n" #if (Add) #fopen GridTrack "GridTrack.inc" append #else #fopen GridTrack "GridTrack.inc" write #end #write (GridTrack,"mesh {\n") #local Counter = 0; #local Spoint = Shift; #local Spoint = vrotate(Spoint, Shrot); #local Vstart = Vstart + Spoint; #local Vend = Vend + Spoint; #local Corner1 = <0.4, 0, 0>; #local Corner1 = vrotate(Corner1,Vrot); #local Corner2 = <-0.4, 0, 0>; #local Corner2 = vrotate(Corner2,Vrot); #local Vpoint1 = Vstart; #local Vpoint2 = <0, 0, Incr>; #local Vpoint2 = vrotate(Vpoint2,Vrot) + Vstart; #while (Vpoint2.x > Vend.x & Vpoint2.z < Vend.z) //triangle A: #local Nor = <0, 0, 0>; #local Loc1 = ; #local Pos1 = trace (Surf, Loc1, -y, Nor); #local Nor = <0, 0, 0>; #local Loc2 = ; #local Pos2 = trace (Surf, Loc2, -y, Nor); #local Pos = Pos1 + Corner1; #write (GridTrack," triangle {<",vstr(3,Pos,", ",0,6),">, ") #local Pos = Pos1 + Corner2; #write (GridTrack,"<",vstr(3,Pos,", ",0,6),">, ") #local Pos = Pos2 + Corner2; #write (GridTrack,"<",vstr(3,Pos,", ",0,6),">}\n") //triangle B: #write (GridTrack," triangle {<",vstr(3,Pos,", ",0,6),">, ") #local Pos = Pos2 + Corner1; #write (GridTrack,"<",vstr(3,Pos,", ",0,6),">, ") #local Pos = Pos1 + Corner1; #write (GridTrack,"<",vstr(3,Pos,", ",0,6),">}\n") #local Counter = Counter+Incr; #local Vpoint1 = <0, 0, Counter>; #local Vpoint2 = <0, 0, Counter+Incr>; #local Vpoint1 = vrotate(Vpoint1, Vrot) + Vstart; #local Vpoint2 = vrotate(Vpoint2, Vrot) + Vstart; #end #write (GridTrack,"}\n") #fclose GridTrack #end //of TrackGen //--------------------------------------------------------------------------------------------------