# ----------------------- #Carparks Attributes Group("Carpark",3) @Order(1) attr carparks = false @Group("Carpark") @Order(2) attr carparkwidth = 2.5 # ----------------------- # Sidewalk Attributes @Group("Sidewalk") @Order(3) @Range(0,0.4) attr Sidewalk_height = 0.2 # height of sidewalk (and depth of Kerbs) @Group("Sidewalk") @Order(4) @Range("grey asphalt","pavement") attr sidewalk_style = "grey asphalt" # ---------------------------------------- # Functions # ---------------------------------------- calcNbrOfLanes = rint(lenAlongV/ Lane_width ) calcLanesLeft = rint((lenAlongV*0.5-Median_width) / Lane_width) calcLanesRight = rint((lenAlongV - calcLanesLeft*Lane_width - Median_width) / Lane_width) lenAlongU = geometry.du(0,unitSpace) # for convenience and readability only lenAlongV = geometry.dv(0,unitSpace) # for convenience and readability only @StartRule Street --> alignScopeToAxes(y) split(u,unitSpace,0){ Crosswalk_width *conStart : Crosswalk(-1) | ~1 : Streetsides | Crosswalk_width *conEnd : Crosswalk(1) } BridgeMain # create left and right side of the street (per default same nbr of lanes in both directions, but user can influence it via attributes) # modified for New Zealand roads Streetsides --> case calcNbrOfLanes < 1.1 : Asphalt case Nbr_of_left_lanes == 0 && Nbr_of_right_lanes == 0: split(v,unitSpace,0){ ~calcLanesLeft : scaleUV(0,-1,-1) Lanes(calcNbrOfLanes,connectionStart,2) Vehicles(2) | Median_width : Median | ~calcLanesRight : Lanes(calcNbrOfLanes,connectionEnd,0) Vehicles(0)} else: split(v,unitSpace,0){ ~Nbr_of_left_lanes : scaleUV(0,-1,-1) Lanes(Nbr_of_left_lanes,connectionStart,2) Vehicles(2) | Median_width : Median | ~Nbr_of_right_lanes : Lanes(Nbr_of_right_lanes,connectionEnd,0) Vehicles(0) } # Lanes Lanes(nLanes,connectionType,dir) --> case connectionType == "STREET" || lenAlongU < 10: Asphalt("stripes",nLanes) case connectionType == "JUNCTION" && type == "MAJOR": Asphalt("stripes",nLanes) else: split(u,unitSpace,0){ ~1 : Asphalt("stripes",nLanes) | 12 : Asphalt(arrows,nLanes) } # Asphalt # - with lanes Asphalt(type,nLanes) --> case lenAlongU > 3: [ extrude(0.1) comp(f){all: NIL} ] // required for occlusion check normalizeUV(0, uv, collectiveAllFaces) scaleUV(0,0.5*rint(lenAlongU/6),1) texture(getStreetTexture(type,nLanes)) Asphalt. else: Asphalt # - no lanes Asphalt --> [ extrude(0.1) comp(f){all: NIL} ] // required for occlusion check setupProjection(0, world.xz, 12, 9) projectUV(0) texture(concrete_tex) Asphalt. # ---------------------------------------- # Sidewalk # ---------------------------------------- Sidewalk --> alignScopeToAxes(y) SidewalkWithKerbs t(0, Sidewalk_height ,0) SidewalkWithKerbs --> case carparks == true : comp(f){ top : split(y){ Sidewalk_height : CarparkKerbs | ~1 : CarparkPavement } } else: extrude(world.y, Sidewalk_height ) comp(f){ top : split(y){ Sidewalk_height : Kerbs | ~1 : CarparkPavement }| side : Kerbs} # ---------------------------------------- # Rules needed by all # ---------------------------------------- SolidKerbs --> extrude(world.y, Sidewalk_height ) comp(f){ top: alignScopeToGeometry(zUp,1) Kerbs | side: Kerbs } SolidKerbsNormal --> extrude(Sidewalk_height) comp(f){ top: alignScopeToGeometry(zUp,1) Kerbs | side: Kerbs } CarparkKerbs--> case carparks == true: split(x){Crosswalk_width*2 : extrude(world.y, Sidewalk_height )Kerbs | ~1 : t(0,carparkwidth,0) extrude(Sidewalk_height)Kerbs | Crosswalk_width*2 : extrude(world.y, Sidewalk_height )Kerbs} setupProjection(0,scope.xy,~1.1,'1) projectUV(0) texture(kerb_tex) else:Kerbs Kerbs --> case scope.sx < 0.5: setupProjection(0,scope.xy,1,'1) projectUV(0) translateUV(0,-scope.sx/2,0) texture(kerb_tex) else: setupProjection(0,scope.xy,~1.1,'1) projectUV(0) texture(kerb_tex) CarparkPavement --> case carparks == true : split(u,unitSpace,0){ Crosswalk_width*2 : extrude(world.y, Sidewalk_height )Pavement | t(0,-0.2,0) split(v,unitSpace,0) { carparkwidth : split(u,unitSpace,0){0.2 : extrude(Sidewalk_height)Kerbs |{ ~5 : Asphalt | { ~0.1: WhiteLine | ~5 : Asphalt }* |0.2 : extrude(Sidewalk_height)Kerbs} } | ~1 : t(0,0.2,0) extrude(world.y, Sidewalk_height )Pavement } | Crosswalk_width*2: extrude(world.y, Sidewalk_height )Pavement } else: Pavement Pavement --> alignScopeToGeometry(zUp, 0,0) Pavement(rand(10),rand(10)) Pavement(texUOffset,texVOffset) --> setupProjection(0,scope.xy,1,1,texUOffset,texVOffset) projectUV(0) setupProjection(2,scope.xy,100, 100) projectUV(2) texture(sidewalk_tex)set(material.dirtmap, swdirtmap) WhiteLine--> color(White)
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.