1// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
2// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
3// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
4
5// Persistence Of Vision raytracer sample file.
6//============================================
7// The field, new improved version  October. 2001
8// Copyright Gilles Tran 2001
9// http://www.oyonale.com
10//--------------------------------------------
11// Render with a 2.67 ratio such as 320*120, 640*240, 1024*384, 1280*480
12//--------------------------------------------
13// -w320 -h120
14// -w640 -h240 +a0.1
15// -w768 -h288 +a0.1
16// -w1024 -h384 +a0.1
17
18// Uncomment AreaOK=true below to turn on the area light
19// This will blur the shadow under the submarine
20// but the rendering time will extremely slow
21
22#version 3.6;
23
24global_settings{ assumed_gamma 1.0 max_trace_level 15 }
25
26#declare AreaOK=false;
27//#declare AreaOK=true;
28
29#include "colors.inc"
30#include "functions.inc"
31//============================================
32// General
33//============================================
34//--------------------------------------------
35// Camera
36//--------------------------------------------
37#declare PdV=<-20, -20, -400>;
38camera{
39        location PdV
40        angle 65 //   direction z*2
41        up y
42        right x*image_width/image_height // keep propotions with any aspect ratio  //right 8*x/3
43        look_at <-20, 30, 0>
44}
45
46//--------------------------------------------
47// reorientation macro
48//--------------------------------------------
49#macro mOrient(P1,P2)
50#local yV1=vnormalize(P2-P1);
51#local xV1=vnormalize(vcross(yV1,z));
52#local zV1=vcross(xV1,yV1);
53                matrix <xV1.x,xV1.y,xV1.z,yV1.x,yV1.y,yV1.z,zV1.x,zV1.y,zV1.z,P1.x,P1.y,P1.z>
54#end
55
56//--------------------------------------------
57// colors
58//--------------------------------------------
59#declare colWater1=rgb<0,79,159>/255;
60#declare colWater2=rgb<7,146,217>/255;
61#declare colWater3=rgb<82,239,238>/255;
62#declare colSub=<7/255,146/255,217/255>;
63
64//--------------------------------------------
65// lights
66//--------------------------------------------
67light_source {<-10, 1000, -10> color colWater2*10
68#if (AreaOK)
69    area_light x*200,z*200, 3,3 adaptive 1 jitter orient
70#end
71
72}
73light_source {<-200, -1000, -300> color colWater2*2 shadowless media_interaction off}
74light_source {PdV color colWater2*2 shadowless media_interaction off}
75
76//--------------------------------------------
77// mine textures
78//--------------------------------------------
79#declare txtMine=texture {
80        pigment{color colWater3*0.1}
81        finish{ambient 0 diffuse 0.4 specular 0.03 roughness 0.2 reflection 0.05}
82}
83#declare txtCable=texture {
84        pigment{color colWater3*0.1}
85        finish{ambient 0 diffuse 0.1 specular 0.02 roughness 0.2}
86}
87
88//--------------------------------------------
89// sub textures
90//--------------------------------------------
91#declare txtSkin=texture{
92        pigment{
93                function{min(1,max(0,y))}
94                turbulence 0.01 omega 1.5 lambda 5 poly_wave 1.5
95                color_map{[0 Clear][0.25  rgbt<0,0,0,0.7>] [0.4 rgbt<0,0,0,0.3>]}
96                scale 38 translate -y*17
97                }
98
99        finish{ambient 0 diffuse 0.6 specular 0.1 roughness 1/10}
100}
101#declare trb=0.0001;
102#declare pigLettre=pigment{bozo color_map{[0 White*1.3][1 White*0.5]}}
103#declare txtLettre=texture{ // submarine name
104        pigment {
105                object {
106                        text{ttf "cyrvetic.ttf" "PERSISTENCE" 10, 0.3*x
107                             translate -z*0.5 scale <1,1,10>
108                        }
109                        pigment{color Clear}, pigment{pigLettre}
110                }
111                rotate y*90
112        scale 1.5 translate <-10,-1,-25>
113        }
114
115        finish{ambient 0 diffuse 0.4}
116
117}
118
119#declare txtSub0=texture {
120    pigment{rgb colSub*0.2}
121    finish {ambient 0 diffuse 0.3 specular 0.05   roughness 0.1}
122}
123// Thanks to Bob H. for the help regarding these textures
124#declare txtSubBase=texture {
125    pigment {
126
127        cells
128        color_map {
129            [.45 rgb <colSub.x*0.1,colSub.y*0.1,colSub.z*0.1>]
130            [.55 rgb <colSub.x,colSub.y,colSub.z>*0.8]
131        }
132        scale <100,.125,1>
133    }
134
135    scale 3
136    finish {ambient 0 diffuse 0.3 specular 0.05   roughness 0.1}
137}
138
139#declare txtSubTop=
140
141    texture{txtSubBase}
142    texture {
143        pigment {
144            cells
145            color_map {
146                [.25 rgbf <colSub.x*0.1,colSub.y*0.1,colSub.z*0.1,0>]
147                [.75 rgbf <colSub.x,colSub.y,colSub.z,1>]
148            }
149            scale <100,0.75,1>
150        }
151        scale 3.5
152        finish {ambient 0 diffuse 0.3 specular 0.05   roughness 0.1}
153    }
154
155    texture {
156        pigment {
157            cells
158            color_map {
159                [.25 rgbf <colSub.x*0.4,colSub.y*0.4,colSub.z*0.4,0>]
160                [.75 rgbf <colSub.x,colSub.y,colSub.z,1>]
161            }
162            scale <100,0.45,1>
163        }
164        scale 2.5
165        finish {ambient 0 diffuse 0.3 specular 0.05   roughness 0.1}
166    }
167
168    texture{txtSkin}
169
170#declare txtSubBottom=
171
172    texture{txtSubBase}
173
174    texture {
175        pigment {
176            cells
177            color_map {
178                [.25 rgbf <colSub.x*0.5,colSub.y*0.5,colSub.z*0.5,0>]
179                [.75 rgbf <colSub.x,colSub.y,colSub.z,1>]
180            }
181            scale <100,.75,1>
182        }
183        scale 5
184        finish {ambient 0 diffuse 0.3 specular 0.05   roughness 0.1}
185    }
186
187    texture {
188        pigment {
189            cells
190            color_map {
191                [0 rgbf <colSub.x*0.5,colSub.y*0.5,colSub.z*0.5,.5>]
192                [1 rgbf <colSub.x,colSub.y,colSub.z,1>]
193            }
194            scale <100,0.25,1>
195        }
196        scale 5
197        translate 1
198        finish {ambient 0 diffuse 0.3 specular 0.05   roughness 0.1}
199    }
200
201    texture{txtLettre}
202    texture{txtSkin}
203
204
205//============================================
206// Mine
207//============================================
208//--------------------------------------------
209// Spikes
210//--------------------------------------------
211
212#declare Spike = union{
213        #declare rSpike1=0.08;
214        #declare rSpike2=rSpike1*0.3;
215        #declare ySpike=0.4;
216        cone{0,rSpike1,y*ySpike,rSpike2}
217        sphere{0,rSpike2 translate y*ySpike}
218        sphere{0,rSpike1*1.5 scale <1,0.3,1>}
219        #declare i=0;#while (i<360) sphere{0,0.015 scale <2,1,2> translate <rSpike1*2.8,-0.04,0> rotate y*i} #declare i=i+30;#end
220        translate y
221}
222
223
224
225
226
227//--------------------------------------------
228// Mine body
229//--------------------------------------------
230#declare rd=seed(0);
231#declare MineBody=union {
232        isosurface {
233                function{x*x+y*y+z*z-1 +f_noise3d(x*10,y*10,z*10)*0.05}
234                max_gradient 2.492
235                contained_by{sphere{0,1}}
236        }
237
238        #declare i=0;
239        #while (i<360)
240                #declare j=0;
241                #while (j<180)
242                        object{Spike rotate z*(i+rand(rd)*2) rotate y*(j+rand(rd)*2)}
243                        #declare j=j+45;
244                #end
245                #declare i=i+45;
246        #end
247
248        object{Spike rotate 90*y}
249        object{Spike rotate -90*y}
250        rotate 360*rand(rd)
251
252}
253
254//--------------------------------------------
255// Mine cable and decorative collar
256//--------------------------------------------
257#declare rFil=0.03;
258#declare yFil=100;
259#declare MineCable=isosurface{
260        function{f_helix1(x,y,z,3,35,0.35*rFil,0.55*rFil,2,1,0)}
261        contained_by {box {<-rFil,0,-rFil>,<rFil,yFil,rFil>}}
262        max_gradient 2.552
263        scale <1,-1,1>*3 translate -y
264}
265
266
267#declare MineCollar=lathe{
268	cubic_spline
269	15,
270	<0.058,0.003>,<0.081,0.000>,<0.101,0.055>,<0.099,0.085>,<0.104,0.132>,<0.066,0.152>,
271	<0.095,0.169>,<0.089,0.194>,<0.144,0.227>,<0.143,0.281>,<0.145,0.307>,<0.109,0.325>,
272	<0.067,0.353>,<0.031,0.362>,<0.030,0.363>
273	translate -y*0.363
274}
275
276//--------------------------------------------
277// Mine
278//--------------------------------------------
279#declare Mine=union{
280        object{MineBody}
281        sphere{0,1 scale <0.4,0.14,0.4> translate -y*0.91}
282        #declare i=0;#while (i<360) cylinder{0,-y*0.1,0.02 translate <0.35,-0.91,0> rotate y*i} #declare i=i+30;#end
283        object{MineCollar scale <1.2,2,1.2> translate -y*0.92}
284        object{MineCollar translate -y*2}
285        object{MineCable}
286        texture{txtMine}
287}
288
289
290
291//============================================
292// Submarine
293//============================================
294#declare Sc=3; // general scaling parameter
295#declare SX=6*Sc; // x scaling
296#declare SYbot=10*Sc;// y scaling for the bottom
297#declare SYtop=2*Sc; // y scaling for the top
298#declare SZfront=20*Sc; // z scaling for the front
299#declare SZrear=100*Sc;// z scaling for the rear
300
301//--------------------------------------------
302// Main parts
303//--------------------------------------------
304#declare Part1=blob{ // bottom front
305        threshold 0.6
306        sphere{0,1,1}
307        cylinder{-z*2,z,0.04,-1 translate <-0.2,-0.3,1> pigment{Black}}
308        cylinder{-z*2,z,0.04,-1 translate <-0.17,-0.18,1> pigment{Black}}
309        sphere{0,1,1 scale <0.1,0.45,1.05>}
310        sphere{0,1,1 scale <0.3,0.45,0.8>}
311}
312#declare Part2=blob{ // top front
313        threshold 0.6
314        sphere{0,1,1}
315        sphere{0,1,1 scale <0.3,0.45,0.8>}
316        sphere{0,1,1 scale <0.2,1.2,1.05>}
317}
318#declare Part3=blob{ // bottom rear
319        threshold 0.6
320        sphere{0,1,1}
321        cylinder{-x,0,1,1 scale <0.5,0.03,0.02> translate <0,-0.05,0.45>}
322        cylinder{-y,0,1,1 scale <0.03,0.2,0.02> translate <0,-0.05,0.45>}
323}
324#declare Part4=blob{ // top rear
325        threshold 0.6
326        sphere{0,1,1}
327        cylinder{-y,y,2,2 scale <0.03,0.3,0.012> translate <0,0.5,0.45>}
328        sphere{0,1,1 scale <0.2,1.2,0.4>}
329
330        cylinder{-x,0,1,1 scale <0.2,0.2,0.04> rotate x*-10 translate <0,1.5,0.2>}
331        cylinder{0,y,0.2,2 scale <0.6,2.5,0.4>*0.7  translate <0,-0.05,0.16>}
332        cylinder{0,y,0.2,2 scale <0.4,2.5,0.4>*0.7  translate <0,-0.05,0.165>}
333        cylinder{0,y,0.2,2 scale <0.2,2.5,0.4>*0.7  translate <0,-0.05,0.17>}
334}
335
336
337//--------------------------------------------
338// Top
339//--------------------------------------------
340#declare HalfSubTop=union{
341       difference{
342                object{Part2} // top front
343                plane{y,0}
344                plane{z,0 inverse}
345                plane{x,0 inverse}
346                scale <SX,SYtop,SZfront>
347        }
348        difference{
349                object{Part4} // top rear
350                plane{y,0}
351                plane{z,0}
352                plane{x,0 inverse}
353                scale <SX,SYtop,SZrear>
354        }
355}
356#declare SubTop=union{
357        object{HalfSubTop}
358        object{HalfSubTop scale <-1,1,1>}
359        texture{txtSubTop}
360}
361//--------------------------------------------
362// Bottom
363//--------------------------------------------
364#declare HalfSubBottom=union{
365         difference{
366                object{Part1} // bottom front
367                plane{y,0 inverse}
368                plane{z,0 inverse}
369                plane{x,0 inverse}
370                scale <SX,SYbot,SZfront>
371        }
372        difference{
373                object{Part3} // bottom rear
374                plane{y,0 inverse}
375                plane{z,0}
376                plane{x,0 inverse}
377                scale <SX,SYbot,SZrear>
378        }
379}
380
381#declare SubBottom=union{
382        object{HalfSubBottom}
383        object{HalfSubBottom scale <-1,1,1>}
384        texture{txtSubBottom}
385}
386//--------------------------------------------
387// Decorative elements
388//--------------------------------------------
389#declare Balustrade=union{
390        #declare rB1=0.02;
391        #declare rB2=0.04;
392        #declare yB=1;
393        #declare rB3=yB*6;
394        #declare rB4=3;
395        #declare zB=20;
396        #declare zB2=8;
397        #declare i=0;
398        #while (i<zB)
399                cylinder{0,y*yB,rB1 translate z*i}
400                #declare i=i+zB/12;
401        #end
402        cylinder{0,z*zB,rB2 translate y*yB}
403        cylinder{0,z*zB,rB2 translate y*yB*0.3}
404        cylinder{0,z*zB,rB2 translate y*yB*0.6}
405        union{
406                difference{torus{rB3,rB2 rotate z*90} plane{y,0} plane{z,0 inverse} plane{z,0 rotate x*-45}}
407                cylinder{0,-z*zB*0.1,rB2 translate y*rB3 rotate x*-45}
408                translate y*(yB-rB3)
409        }
410        union{
411                difference{torus{rB4,rB2} plane{x,0 inverse} translate <0,yB,0>}
412                difference{torus{rB4,rB1} plane{x,0 inverse} translate <0,yB*0.5,0>}
413                #while (i<180)
414                        cylinder{0,y*yB,rB1 translate -z*rB4 rotate y*i}
415                        #declare i=i+180/14;
416                #end
417                scale <0.4,1,1>
418                translate z*(rB4+zB)
419        }
420        union{
421                difference{torus{rB3,rB2 rotate z*90} plane{y,0} plane{z,0 inverse} plane{z,0 rotate x*-65}}
422                cylinder{0,-z*zB*0.1,rB2 translate y*rB3 rotate x*-65}
423                translate y*(yB-rB3)
424                scale <1,1,-1>
425                translate z*(zB+rB4*2)
426        }
427
428}
429
430
431
432//--------------------------------------------
433// guns
434//--------------------------------------------
435#declare Guns0=union{
436        superellipsoid{<0.3,0.3> translate z scale <0.8,1,4>}
437        union{
438                cone{0,0.4,z*12,0.3}
439                union{
440                        cone{0,0.3,z*1.5,0.5}
441                        difference{
442                                sphere{0,0.5}
443                                cylinder{-z,z,0.3}
444                                translate z*1.5
445                        }
446                        translate z*12
447                }
448                translate z*8
449        }
450        translate -z*3
451}
452
453#declare Wheel=blob{
454        threshold 0.6
455        sphere{0,1.3,1 scale <1,1.2,1>}
456        cylinder{0,-y*3,0.8,1}
457        #declare Teta=0;
458        #while (Teta<360)
459                cylinder{0,x*3.4,0.4,1  rotate y*Teta}
460                cylinder{0,y,0.4,1  translate x*3 rotate y*Teta}
461                sphere{0,0.6,1 translate x*3 rotate y*Teta}
462                sphere{0,0.4,1 translate x*3 rotate y*(Teta+6)}
463                sphere{0,0.4,1 translate x*3 rotate y*(Teta+12)}
464                sphere{0,0.4,1 translate x*3 rotate y*(Teta+18)}
465                sphere{0,0.4,1 translate x*3 rotate y*(Teta+24)}
466                sphere{0,0.4,1 translate x*3 rotate y*(Teta+30)}
467                sphere{0,0.4,1 translate x*3 rotate y*(Teta+36)}
468                sphere{0,0.4,1 translate x*3 rotate y*(Teta+42)}
469                sphere{0,0.4,1 translate x*3 rotate y*(Teta+48)}
470                sphere{0,0.4,1 translate x*3 rotate y*(Teta+54)}
471                sphere{0,0.5,1 translate x*3 rotate y*(Teta+60)}
472                sphere{0,0.5,1 translate x*3 rotate y*(Teta+66)}
473                #declare Teta=Teta+72;
474        #end
475}
476#declare Guns1=union{
477             object{Guns0}
478             object{Wheel rotate y*10 scale 0.7 rotate z*90 translate -x*1.5}
479
480}
481#declare Eye=union{
482        torus{4.5,0.5}
483        difference{
484                sphere{0,4.3}
485                box{-5,5 scale <1,1,0.05>}
486                box{-5,5 scale <1,1,0.05> translate z}
487                box{-5,5 scale <1,1,0.05> translate z*2}
488                box{-5,5 scale <1,1,0.05> translate z*3}
489                box{-5,5 scale <1,1,0.05> translate z*4}
490                box{-5,5 scale <1,1,0.05> translate -z}
491                box{-5,5 scale <1,1,0.05> translate -z*2}
492                box{-5,5 scale <1,1,0.05> translate -z*3}
493                box{-5,5 scale <1,1,0.05> translate -z*4}
494                scale <1,0.7,1>
495        }
496}
497#declare Ring1=union{
498        cylinder{-0.2*x,0.2*x,1.2}
499        torus{1.1,0.1 rotate z*90 scale <2,1,1> translate -x*0.2}
500        torus{1.1,0.1 rotate z*90 scale <2,1,1> translate x*0.2}
501}
502#declare Elbow1=intersection{torus{2,1} plane{z,0 inverse} plane{x,0 inverse} }
503
504
505#declare Thingie=union{
506        torus{1.5,0.3 rotate z*90 translate -x}
507        cylinder{-x,x,1.5}
508        superellipsoid{<0.2,0.2> scale <1.5,2,2.5> translate x*2.5}
509        object{Eye scale 1.5/7 rotate -x*90 translate <2.5,0,-2.5>}
510        object{Eye scale 1.5/7 rotate -x*90 translate <2.5,0,-2.5> scale <1,1,-1>}
511        sphere{0,1.5 scale <0.5,1,1> translate x*4}
512        sphere{0,1.5 scale <0.5,1,1> translate x*16}
513        cylinder{x*4,x*16,1.2}
514        torus{1.9,0.1 rotate z*90 translate x*16.5}
515        cylinder{x*16.5,x*17.5,2}
516        torus{1.9,0.1 rotate z*90 translate x*17.5}
517        cylinder{x*17.5,x*23,1.5}
518        union{
519              torus{0.5,0.1}
520              intersection{torus{2.5,0.5 rotate x*90} plane{y,0 inverse} plane{x,0} translate x*2.5}
521              torus{0.5,0.1 translate -x*2.5 rotate z*-30 translate x*2.5 }
522              torus{0.5,0.1 translate -x*2.5 rotate z*-60 translate x*2.5 }
523              torus{0.5,0.1 translate -x*2.5 rotate z*-90 translate x*2.5 }
524              union{
525                    cylinder{0,9*x,0.5}
526                    cylinder{2*x,5*x,0.7}
527                    torus{0.5,0.2 rotate z*90 translate x*2}
528                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*2.3}
529                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*2.6}
530                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*2.9}
531                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*3.2}
532                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*3.5}
533                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*3.8}
534                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*4.1}
535                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*4.4}
536                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*4.7}
537                    torus{0.5,0.2 rotate z*90 translate x*5}
538                    torus{0.5,0.3 rotate z*90 translate x*8}
539                    cone{0,0.7,x,0.9 translate x*8}
540                    torus{0.9,0.2 rotate z*90 translate x*9}
541                    translate <2.5,2.5,0>
542                    }
543               translate <2.5,2,1.7>
544        }
545        union{
546              torus{0.5,0.1}
547              intersection{torus{2.5,0.5 rotate x*90} plane{y,0 inverse} plane{x,0} translate x*2.5}
548              torus{0.5,0.1 translate -x*2.5 rotate z*-30 translate x*2.5 }
549              torus{0.5,0.1 translate -x*2.5 rotate z*-60 translate x*2.5 }
550              torus{0.5,0.1 translate -x*2.5 rotate z*-90 translate x*2.5 }
551              union{
552                    cylinder{0,9*x,0.5}
553                    cylinder{3*x,6*x,0.7}
554                    torus{0.5,0.2 rotate z*90 translate x*3}
555                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*3.3}
556                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*3.6}
557                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*3.9}
558                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*4.2}
559                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*4.5}
560                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*4.8}
561                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*5.1}
562                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*5.4}
563                    torus{0.7,0.2 scale <0.2,1,1> rotate z*90 translate x*5.7}
564                    torus{0.5,0.2 rotate z*90 translate x*6}
565                    torus{0.5,0.3 rotate z*90 translate x*8}
566                    cone{0,0.7,x,0.9 translate x*8}
567                    torus{0.9,0.2 rotate z*90 translate x*9}
568                    translate <2.5,2.5,0>
569                    }
570               translate <2.5,2,-1.7>
571        }
572        union{
573                superellipsoid{<0.2,0.2> scale <1,1.3,2.6>}
574                object{Eye scale 1/7 rotate -x*90 translate z*-2.6}
575                object{Eye scale 1/7 rotate -x*90 translate z*2.6}
576                object{Eye scale 1/7 rotate y*90 translate <0,1.3,1.7>}
577                object{Eye scale 1/7 rotate y*90 translate <0,1.3,-1.7>}
578                cylinder{x,x*3,1}
579                torus{1,0.2 rotate z*90 translate x*3}
580                intersection{torus{4.5,1 rotate x*90} plane{y,0 inverse} plane{x,0 inverse} scale <0.5,1,1> translate <3,-4.5,0>}
581                torus{1,0.3 scale <0.5,4,1> translate <3+2.25,-3,0>}
582                translate <15,4.5,0>
583        }
584        #declare Teta=0;
585        #while (Teta<360)
586        union{
587                box{<0,-0.1,-0.05>,<12,0.1,0.05> translate <4,1.2,0>}
588                cylinder{-x,2*x,0.1 translate y*1.5}
589                sphere{0,0.2 translate <20,1.5,0>}
590                sphere{0,0.1 translate <16.8,2,0>}
591                sphere{0,0.1 translate <17.2,2,0> rotate x*10}
592                cylinder{x*20,x*23,0.18 translate y*1.5}
593                rotate x*Teta
594        }
595        #declare Teta=Teta+20;
596        #end
597
598        translate x
599}
600#declare GunSupport=union{
601        superellipsoid{<0.6,0.6> translate y scale <0.3,3,1> translate -z*2}
602        union{
603                union{
604                        superellipsoid{<0.7,0.7> translate y scale <1.5,3.8,1>}
605                        #declare i=0;
606                        #while (i<6)
607                                sphere{0,0.2 translate <-1,i+0.5,0.8>}
608                                sphere{0,0.2 translate <0,i+0.1,1>}
609                                sphere{0,0.2 translate <1,i+0.5,0.8>}
610                                #declare i=i+0.7;
611                        #end
612                        rotate -x*10 translate z*0.6
613                }
614
615                cylinder{y*4,y*9,0.6}
616                sphere{0,1 scale <4,1,4>}
617        }
618}
619#declare Guns=union{
620        union{
621                object{Thingie rotate y*180 scale 0.5 rotate y*-90 rotate z*45 translate <0,4,5>}
622                superellipsoid{<0.6,0.6> translate -z scale <0.6,1,3> translate -x*0.5}
623                object{Guns1 translate -x*1.7}
624                object{Guns1 translate -x*1.7 scale <-1,1,1>}
625                rotate x*-20
626                translate y*10
627        }
628        object{GunSupport}
629}
630
631#declare GunsBack=union{
632        union{
633                object{Thingie rotate y*180 scale 0.5 rotate y*-90 rotate z*45 translate <0,4,5>}
634                superellipsoid{<0.6,0.6> translate -z scale <0.6,1,3> translate -x*0.5}
635                object{Guns1 translate -x*1.7}
636                object{Guns1 translate -x*1.7 scale <-1,1,1>}
637                rotate x*-5
638                translate y*10
639        }
640        object{GunSupport}
641}
642
643//--------------------------------------------
644// snorkels and vertical thingies
645//--------------------------------------------
646#declare Snorkel1=union{
647        cone{0,0.3,y*2,0.25}
648        cone{y*2,0.25,y*3,0.1}
649        union{
650                difference{sphere{0,1 scale<0.3,0.2,0.3>}plane{y,0 inverse}}
651                difference{sphere{0,1 scale<0.3,0.6,0.3>}plane{y,0}}
652                translate y*3
653        }
654        scale <0.8,1,0.8>
655}
656#declare Snorkel2=blob{
657        threshold 0.6
658        cylinder{-y,y*4,0.2,1}
659        sphere{0,0.4,1 scale <1,1,2> translate y*3.5}
660        sphere{0,0.3,1 scale <3,1,1> translate y*2.5}
661        scale <0.8,1,0.8>
662        }
663#declare Snorkel3=union{
664        blob{
665                threshold 0.6
666                cylinder{0,y*3.4,0.25,1 scale <1,1,3>}
667                cylinder{0,y*5,0.03,1 translate <0,0,-0.5>}
668
669        }
670        union{
671                cylinder{0,y*4,0.03}
672                sphere{0,0.1 translate y*4}
673                translate  <-0.1,0,0.5>
674        }
675        scale <0.8,1,0.8>
676}
677
678//--------------------------------------------
679// lots of decorative stuff
680//--------------------------------------------
681#declare nDeco=13;
682#declare Deco=array[nDeco]
683#declare Deco[0]=union{
684        cylinder{0,y*2,0.2}
685        torus{1,0.2 rotate x*90 translate y*3}
686        scale 0.5
687}
688#declare Deco[1]=cone{-y*0.5,0.2,y*4,0.1}
689#declare Deco[2]=blob{
690        threshold 0.6
691        cylinder{-x,x,0.25,1 scale <1,1,2>}
692        cylinder{0,-y,0.21,1 translate -x*0.8}
693        cylinder{0,-y,0.21,1 translate x*0.8}
694        translate y*0.7
695        scale 1
696}
697#declare Deco[3]=object{Deco[2] rotate y*90}
698#declare Deco[4]=torus{1,0.2 rotate z*90}
699#declare Deco[5]=object{Deco[3] rotate y*90 scale <1,1.4,1>}
700#declare Deco[6]=union{
701        cylinder{0,y*0.4,0.1}
702        sphere{0,1 scale <0.1,0.1,0.5> translate y*0.4}
703}
704#declare Deco[7]=difference{sphere{0,1} cylinder{-z,0,0.8} scale <2,0.5,2>translate -y*0.2}
705#declare Deco[8]=difference{sphere{0,1} cylinder{-z,0,0.9} scale <2,0.5,4>translate -y*0.2}
706#declare Deco[9]=cone{0,0.08,y*2,0.03 scale <1,1,2>}
707#declare Deco[10]=sphere{0,1 scale <0.2,0.1,0.4>}
708#declare Deco[11]=object{Deco[4] scale 1.2}
709#declare Deco[12]=object{Deco[5] scale 1.3}
710#declare Ladder=union{
711        #declare i=0;
712        #while (i<9)
713                object{Deco[3] scale 0.8 rotate z*90 translate y*i*0.8}
714                #declare i=i+1;
715        #end
716}
717
718#declare Decos=union{
719        #declare rd=seed(4);
720        #declare Start0=-40;
721        #declare End0=40;
722        #declare nstep=200;
723        #declare i=0;
724        #declare k=0;
725        #while (i<1)
726                #declare j=i;
727                #declare Start=<-rand(rd)*5*(mod(k,2)*2-1),1,(1-j)*Start0+j*End0>;
728                #declare Dir=y;
729                #declare Norm1=<0,0,0>;
730                #declare Inter=trace( SubTop, Start, Dir, Norm1);
731                #if (vlength(Norm1)!=0)
732                    #if (vlength(vcross(Norm1,y))<0.9)
733                        #declare n=int(rand(rd)*nDeco);
734                        object{Deco[n]  scale 0.4 mOrient(Inter,Inter+Norm1)}
735                    #end
736                #end
737                #declare k=k+1;
738                #declare i=i+1/nstep;
739        #end
740}
741
742
743#declare Submarine=union{
744        union{
745                object{SubTop}
746                object{Decos texture{txtSubTop}}
747                object{Ladder translate <-1.5,4,40>}
748                object{Ladder translate <1.5,4,40>}
749                object{Guns rotate y*180 scale 0.3 translate <0,4,30>}
750                object{GunsBack scale 0.3 translate <0,4,70>}
751                union{
752                        object{Snorkel1 translate z*3}
753                        object{Snorkel2}
754                        object{Snorkel3 translate -z*2}
755                        scale 2*<1,1.1,1>
756                        translate <0,10,50>
757                }
758                object{Balustrade scale 2.5 translate <-4,2,5>}
759                object{Balustrade scale 2.5 translate <-4,2,5> scale <-1,1,1>}
760                union{
761                        object{Balustrade scale 2 translate <-3,2,5>}
762                        object{Balustrade scale 2 translate <-3,2,5> scale <-1,1,1>}
763                        rotate y*180
764                        translate z*100
765                }
766                texture{txtSub0}
767                scale <1,1.3,1>
768        }
769        object{SubBottom}
770}
771
772
773
774//============================================
775// Final
776//============================================
777#declare posSub=<19,5,0>;
778#declare rotSub=-15;
779
780//--------------------------------------------
781// mines
782//--------------------------------------------
783union{
784    light_group{
785        object{Mine rotate y*80 scale 14 }
786        light_source{<-10,-20,-40> color rgb -4 shadowless} // negative light !!!
787        translate <-110, 41, -205>
788        global_lights on
789    }
790    light_group{
791        object{Mine rotate -y*10 scale 8 }
792        light_source{<-10,-20,-40> color rgb -2 shadowless}
793        translate <-75, 25, -165>
794        global_lights on
795    }
796    object{Mine rotate y*125 scale 5 translate <105, -5, -155>}
797    translate y*-8
798}
799union{
800        #declare rd=seed(0);
801        #declare i=0;
802        #while (i<20)
803
804                object{Mine rotate y*125 scale 3 translate <50+rand(rd)*(200+i*10),(0.5-rand(rd))*60,i*30>}
805                object{Mine rotate y*150 scale 3 translate <-50-rand(rd)*(200+i*10),(0.5-rand(rd))*60,i*30>}
806
807                object{Mine rotate y*10 scale 3 translate <50+rand(rd)*(200+i*10),(0.5-rand(rd))*140+50+i*10,i*30>}
808                object{Mine rotate y*37 scale 3 translate <-50-rand(rd)*(200+i*10),(0.5-rand(rd))*140+50+i*10,i*30>}
809                #declare i=i+1;
810        #end
811        rotate y*rotSub translate posSub
812        translate -z*150
813        translate x*30
814}
815//--------------------------------------------
816// submarine and media
817//--------------------------------------------
818union{
819        object{Submarine scale 3/4 translate z*-10 translate y*10}
820        sphere{0,1 scale 410 hollow
821                texture{pigment{Clear}finish{ambient 0 diffuse 0}}
822                interior{
823                        media{
824                                scattering {5,0.00034 eccentricity 0.7 extinction 0.8}
825                                absorption <255-23,255-171,255-239>*0.0005/255
826                                intervals 3
827                                method 3
828                        }
829                }
830        }
831
832        scale 4
833        rotate y*rotSub  translate posSub
834}
835