01 #include "Primtives3D";
02 CD6 **MakeSpawnerMesh(I64 color) {
03 //A planet with a flag on it
04   I64 mat[16];
05   CD6 *base=PrimitiveRect3D(100,10,100),*ret;
06   CD6 *planet=PrimitiveSphere3D(50*.75);
07   CD6 *flag_pole=PrimitiveRect3D(10,100,10);
08   CD6 *flag=PrimitiveRect3D(10,25,100);
09   CD6SetColor(base,YELLOW);
10   CD6SetColor(planet,color);
11   CD6SetColor(flag_pole,WHITE);
12   CD6SetColor(flag,PURPLE);
13   Mat4x4IdentEqu(mat);
14   Mat4x4RotY(mat,pi/4.);
15   ret=CD6Merge(planet,base,mat);
16   Mat4x4IdentEqu(mat);
17   Mat4x4TranslationEqu(mat,0,50*.75+50,0);
18   ret=CD6Merge(ret,flag_pole,mat);
19   Mat4x4TranslationEqu(mat,0,50*.75+100+25/2,50-5);
20   ret=CD6Merge(ret,flag,mat);
21   Mat4x4IdentEqu(mat);
22   Mat4x4PointTo(mat,0,50,0);
23   return CD6NewTransform(ret,mat);
24 }
25 
26 
27 CD6 *GenerateShitMesh(I64 main_peices=3,I64 corn=3,I64 peas=2,F64 len=150,F64 radius=25) {
28   CD6 **peices=GCCAlloc(main_peices*8);
29   CD6 *corn_peice,**ret;
30   I64 mat[16];
31   I64 idx=0;
32   F64 *length=GCCAlloc(main_peices*sizeof(F64)),sum=0,coin=Rand;
33   for(idx=0;idx!=main_peices;++idx) {
34     length[idx]=Rand+1./ToF64(main_peices);
35     sum+=length[idx];
36   }
37   for(idx=0;idx!=main_peices;++idx) {
38     length[idx]/=sum;
39     peices[idx]=PrimitiveRect3D(radius+(Rand-Rand)*7,radius+(Rand-Rand)*7,length[idx]*len);
40     CD6SetColor(peices[idx],BROWN);
41   }
42 
43   while(--corn>=0) {
44     coin=Rand;
45     sum=0;
46     for(idx=0;idx!=main_peices;++idx) {
47       sum+=length[idx];
48       if(sum>coin)
49         break;
50     }
51     idx=MinI64(idx,main_peices-1);
52     corn_peice=PrimitiveRect3D(7+Rand*7,7+Rand*7,7+Rand*7);
53     CD6SetColor(corn_peice,YELLOW);
54     Mat4x4IdentEqu(mat);
55     Mat4x4TranslationEqu(mat,radius*(Rand-Rand),radius*(Rand-Rand),length[idx]*len/2.*(Rand-Rand));
56     peices[idx]=CD6Merge(peices[idx],corn_peice,mat);
57   }
58   while(--peas>=0) {
59     coin=Rand;
60     sum=0;
61     for(idx=0;idx!=main_peices;++idx) {
62       sum+=length[idx];
63       if(sum>coin)
64         break;
65     }
66     idx=MinI64(idx,main_peices-1);
67     corn_peice=PrimitiveRect3D(7+Rand*7,7+Rand*7,7+Rand*7);
68     CD6SetColor(corn_peice,GREEN);
69     Mat4x4IdentEqu(mat);
70     Mat4x4TranslationEqu(mat,radius*(Rand-Rand),radius*(Rand-Rand),length[idx]*len/2.*(Rand-Rand));
71     peices[idx]=CD6Merge(peices[idx],corn_peice,mat);
72   }
73   idx=main_peices;
74   ret=peices[0];
75   sum=length[0]*len;
76   for(idx=1;idx!=main_peices;++idx) {
77     Mat4x4IdentEqu(mat);
78     Mat4x4TranslationEqu(mat,radius/2.*(Rand-Rand),radius/2.*(Rand-Rand),sum);
79     sum+=length[idx]*len;
80     ret=CD6Merge(ret,peices[idx],mat);
81   }
82   Mat4x4IdentEqu(mat);
83   Mat4x4PointTo(mat,50,0,0);
84   return CD6NewTransform(ret,mat);
85 }