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 }