#version 3.7; global_settings { assumed_gamma 1.3 max_trace_level 16 radiosity { pretrace_start 0.08 pretrace_end 0.01 count 200 nearest_count 10 error_bound 0.5 recursion_limit 2 low_error_factor 0.5 gray_threshold 0.0 } } #include "functions.inc" background { color rgb <0.045, 0.060, 0.095> } // ------------------------------------------------------------ // Camera // ------------------------------------------------------------ camera { location <105, 56, -165> look_at <0, 16, 0> angle 40 up <0,9,0> right <16,0,0> // right,up -> 16:9 } // ------------------------------------------------------------ // Lights: warm, soft shadows // ------------------------------------------------------------ light_source { <150, 130, -130> color rgb <1.00, 0.78, 0.60>*1.00 area_light <14,0,0>, <0,0,14>, 5, 5 adaptive 1 jitter spotlight point_at <0, 14, 0> radius 18 falloff 38 tightness 8 } light_source { <-135, 105, -55> color rgb <1.00, 0.84, 0.70>*0.80 area_light <12,0,0>, <0,0,12>, 5, 5 adaptive 1 jitter spotlight point_at <0, 12, 10> radius 24 falloff 52 tightness 6 } light_source { <0, 240, 0> color rgb <1.00, 0.95, 0.85>*0.45 area_light <26,0,0>, <0,0,26>, 5, 5 adaptive 1 jitter spotlight point_at <0, 10, 0> radius 55 falloff 95 tightness 2 } // ------------------------------------------------------------ // Atmospheric haze // ------------------------------------------------------------ fog { fog_type 2 distance 220 color rgb <0.16, 0.18, 0.22> fog_offset 0 fog_alt 18 turbulence 0.45 } // ------------------------------------------------------------ // Sky gradient dome // ------------------------------------------------------------ sphere { <0,0,0>, 2000 hollow texture { pigment { gradient y color_map { [0.00 color rgb <0.035,0.050,0.085>] [0.45 color rgb <0.070,0.090,0.125>] [0.75 color rgb <0.105,0.120,0.150>] [1.00 color rgb <0.170,0.185,0.210>] } scale 850 translate <0,-220,0> } finish { diffuse 0 ambient 1 } } } // ------------------------------------------------------------ // Simple materials (no textures; fast) // ------------------------------------------------------------ #declare Mat_Ground = texture { pigment { color rgb <0.055, 0.060, 0.070> } finish { diffuse 0.92 specular 0.06 roughness 0.12 } }; #declare Mat_DarkMetal = texture { pigment { color rgb <0.10, 0.11, 0.13> } finish { diffuse 0.55 specular 0.35 roughness 0.03 } }; #declare Mat_MidMetal = texture { pigment { color rgb <0.16, 0.17, 0.20> } finish { diffuse 0.62 specular 0.28 roughness 0.04 } }; #declare Mat_AsphaltPaint = texture { pigment { color rgb <0.13,0.13,0.14> } finish { diffuse 0.9 specular 0.04 roughness 0.10 } }; #declare Mat_WarmWindow = texture { pigment { color rgb <1.00, 0.72, 0.36> } finish { diffuse 0.10 ambient 1.30 specular 0 roughness 0.08 } }; #declare Mat_NeonCyan = texture { pigment { color rgb <0.25, 0.85, 0.95> } finish { diffuse 0.45 specular 0.20 roughness 0.04 ambient 0.18 } }; #declare Mat_NeonMagenta = texture { pigment { color rgb <0.95, 0.30, 0.75> } finish { diffuse 0.45 specular 0.20 roughness 0.04 ambient 0.18 } }; #declare Mat_NeonAmber = texture { pigment { color rgb <1.0, 0.70, 0.25> } finish { diffuse 0.50 specular 0.16 roughness 0.05 ambient 0.16 } }; #declare Mat_Glass = texture { pigment { color rgbt <0.18, 0.32, 0.45, 0.88> } finish { diffuse 0.02 specular 0.65 roughness 0.008 reflection 0.10 } }; #declare Mat_Glass_Clear = texture { pigment { color rgbt <0.90, 0.95, 1.00, 0.92> } finish { diffuse 0.02 specular 0.70 roughness 0.007 reflection 0.12 } }; #declare Glass_IOR = interior { ior 1.50 }; // ------------------------------------------------------------ // Ground plane + base slab // ------------------------------------------------------------ plane { y, 0.0 texture { Mat_Ground } } box { <-260, 0, -260>, <260, 0.6, 260> texture { Mat_DarkMetal } } // subtle grid accents #declare gi = -13; #while (gi <= 13) box { <-260, 0.601, gi*20-0.30>, <260, 0.605, gi*20+0.30> texture { Mat_AsphaltPaint } } box { , texture { Mat_AsphaltPaint } } #declare gi = gi + 1; #end // ------------------------------------------------------------ // Macros // ------------------------------------------------------------ #macro NeonLineX(X1,X2,Y,Z,Th, TexCol) box { , texture { TexCol } } #end #macro NeonLineZ(Z1,Z2,Y,X,Th, TexCol) box { , texture { TexCol } } #end #macro Podium(Cx,Cz,W,D,H) union { box { , texture { Mat_MidMetal } } box { , texture { Mat_DarkMetal } } } #end #macro MegaTower(BaseX, BaseZ, W, D, H, StepCount, StepInset, NeonTex) union { // podiums Podium(BaseX, BaseZ, W*1.25, D*1.25, 3.2) Podium(BaseX, BaseZ, W*1.05, D*1.05, 2.2) // stepped glass mass #local ii = 0; #while (ii < StepCount) #local w2 = W - 2*StepInset*ii; #local d2 = D - 2*StepInset*ii; #local segH = H/StepCount; #local y0 = 0.6 + 5.4 + ii*segH*0.92; #if (w2 < 2) #local w2 = 2; #end #if (d2 < 2) #local d2 = 2; #end // glass box { , texture { Mat_Glass } interior { Glass_IOR } } // metal frame band box { , texture { Mat_DarkMetal } } // warm interior slice (suggest floors) #if (mod(ii,2)=0) box { , texture { Mat_WarmWindow } } #end // neon roof line on each step box { , texture { NeonTex } } #declare ii = ii + 1; #end // vertical fins (4 sides) #local finH0 = 0.6 + 5.4; #local finH1 = 0.6 + 5.4 + H*0.95; box { , texture { Mat_DarkMetal } } box { , texture { Mat_DarkMetal } } box { , texture { Mat_DarkMetal } } box { , texture { Mat_DarkMetal } } // crown + antenna box { , texture { Mat_Glass_Clear } interior { Glass_IOR } } cylinder { , , W*0.045 texture { Mat_DarkMetal } } cone { , W*0.05, , 0.0 texture { NeonTex } } } #end #macro SkyBridge(X1,Z1, X2,Z2, Y, W) union { box { , texture { Mat_DarkMetal } } box { , texture { Mat_Glass_Clear } interior { Glass_IOR } } box { , texture { Mat_WarmWindow } } } #end #macro TransitTube(P1, P2, R, NeonTex) union { cylinder { P1, P2, R texture { Mat_DarkMetal } } cylinder { P1, P2, R*0.80 texture { Mat_Glass } interior { Glass_IOR } } cylinder { P1, P2, R*0.12 texture { NeonTex } } } #end #macro LowNeoBlock(Cx,Cz,W,D,H, NeonTex) union { box { , texture { Mat_Glass } interior { Glass_IOR } } box { , texture { Mat_DarkMetal } } box { , texture { Mat_WarmWindow } } box { , texture { Mat_WarmWindow } } box { , texture { NeonTex } } } #end // ------------------------------------------------------------ // Central boulevard (future road) + neon lane strips // ------------------------------------------------------------ union { // road slab along Z through center box { <-22, 0.606, -250>, <22, 0.80, 250> texture { Mat_AsphaltPaint } } // sidewalks box { <-28, 0.606, -250>, <-22, 0.78, 250> texture { Mat_MidMetal } } box { < 22, 0.606, -250>, < 28, 0.78, 250> texture { Mat_MidMetal } } // neon lane lines #declare zline = -240; #while (zline <= 240) NeonLineX(-1.2, 1.2, 0.81, zline, 1.0, Mat_NeonCyan) NeonLineX(-9.0, -7.8, 0.81, zline, 1.0, Mat_NeonAmber) NeonLineX( 7.8, 9.0, 0.81, zline, 1.0, Mat_NeonMagenta) #declare zline = zline + 18; #end } // ------------------------------------------------------------ // Core future skyline (mega-towers + bridges) // ------------------------------------------------------------ union { MegaTower( 0, 0, 22, 22, 56, 7, 1.10, Mat_NeonCyan) MegaTower( 24, -10, 16, 14, 42, 6, 0.90, Mat_NeonAmber) MegaTower(-24, 8, 18, 16, 46, 6, 0.95, Mat_NeonMagenta) MegaTower( 12, 22, 14, 14, 36, 5, 0.85, Mat_NeonCyan) MegaTower(-14, -22, 14, 18, 38, 5, 0.85, Mat_NeonAmber) MegaTower( 42, 14, 12, 12, 28, 4, 0.80, Mat_NeonMagenta) MegaTower(-42, -14, 12, 14, 30, 4, 0.80, Mat_NeonCyan) // skybridges SkyBridge(-24, 8, 0, 0, 19, 4.0) SkyBridge( 0, 0, 24,-10, 17, 4.0) SkyBridge(-14,-22, 12, 22, 14, 3.2) // "maglev" elevated guideway crossing the boulevard union { box { <-120, 12.5, -18>, <120, 13.6, -8> texture { Mat_DarkMetal } } box { <-120, 13.6, -18>, <120, 14.4, -8> texture { Mat_Glass_Clear } interior { Glass_IOR } } box { <-120, 14.4, -17.4>, <120, 14.6, -8.6> texture { Mat_NeonAmber } } // pylons #declare px = -108; #while (px <= 108) box { , texture { Mat_MidMetal } } #declare px = px + 18; #end } // transit tubes TransitTube(<-140, 16, 70>, < 140, 17, 28>, 1.55, Mat_NeonCyan) TransitTube(<-120, 14, -90>, < 120, 15, -22>, 1.75, Mat_NeonMagenta) TransitTube(< -70, 20,-150>, < 40, 21, 140>, 1.35, Mat_NeonAmber) // rooftop beacons cone { < 12, 34.0, 22>, 0.8, < 12, 38.0, 22>, 0.0 texture { Mat_NeonCyan } } cone { <-24, 36.0, 8>, 0.7, <-24, 40.0, 8>, 0.0 texture { Mat_NeonMagenta } } cone { < 42, 28.0, 14>, 0.6, < 42, 31.0, 14>, 0.0 texture { Mat_NeonAmber } } } // ------------------------------------------------------------ // Mid-ground spread: modular blocks + occasional slim towers // ------------------------------------------------------------ #declare sx = -6; #while (sx <= 6) #declare sz = -6; #while (sz <= 6) #declare PX = sx*40; #declare PZ = sz*40; // keep the center open-ish for the boulevard/core #if (abs(PX) > 55 | abs(PZ) > 55) #declare w = 12 + mod(abs(sx*17 + sz*11), 12); #declare d = 11 + mod(abs(sx*13 + sz*19), 12); #declare h = 7 + mod(abs(sx*23 + sz*29), 12); #declare pick = mod(abs(sx*9 + sz*7), 3); #if (pick = 0) LowNeoBlock(PX, PZ, w, d, h, Mat_NeonCyan) #elseif (pick = 1) LowNeoBlock(PX, PZ, w, d, h, Mat_NeonMagenta) #else LowNeoBlock(PX, PZ, w, d, h, Mat_NeonAmber) #end // occasional slim tower #if (mod(abs(sx*7 + sz*9), 6) = 0) MegaTower(PX+8, PZ-6, 10, 10, 26 + mod(abs(sx*31+sz*17), 16), 4, 0.70, #if (pick=0) Mat_NeonMagenta #else #if (pick=1) Mat_NeonAmber #else Mat_NeonCyan #end #end ) #end #end #declare sz = sz + 1; #end #declare sx = sx + 1; #end // ------------------------------------------------------------ // Elevated ring (distant tech-ring around downtown) // ------------------------------------------------------------ union { torus { 96, 1.20 rotate <90,0,0> translate <0, 8.4, 0> texture { Mat_DarkMetal } } torus { 96, 0.68 rotate <90,0,0> translate <0, 8.4, 0> texture { Mat_Glass_Clear } interior { Glass_IOR } } torus { 96, 0.16 rotate <90,0,0> translate <0, 8.4, 0> texture { Mat_NeonAmber } } } // ------------------------------------------------------------ // Distant skyline silhouettes (depth) // ------------------------------------------------------------ #declare k = 0; #while (k < 32) #declare a = (360/32)*k; #declare rx = 205*cos(radians(a)); #declare rz = 205*sin(radians(a)); #declare hh = 18 + mod(k*19, 34); #declare ww = 16 + mod(k*13, 14); #declare dd = 14 + mod(k*17, 16); union { box { , texture { Mat_DarkMetal } } #if (mod(k,3)=0) box { , texture { Mat_Glass } interior { Glass_IOR } } #end #if (mod(k,2)=0) box { , texture { Mat_WarmWindow } } #end } #declare k = k + 1; #end