From 926008e491591211f5f9d5ad0df7d80719dcc5be Mon Sep 17 00:00:00 2001 From: The Dust Council Date: Mon, 1 Jun 2026 22:50:56 -0700 Subject: [PATCH] This is even more excellent. --- .claude/settings.local.json | 5 +- README.md | 28 ++- vectorgons | Bin 76096 -> 93496 bytes vectorgons.c | 416 +++++++++++++++++++++++++++++++++++- 4 files changed, 429 insertions(+), 20 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 55cb29c..2364a07 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -23,7 +23,10 @@ "Bash(/tmp/sim)", "Bash(cc -O2 -o /tmp/st2 /tmp/st2.c -lm)", "Bash(/tmp/st2)", - "Bash(rm -f /tmp/st2 /tmp/st2.c)" + "Bash(rm -f /tmp/st2 /tmp/st2.c)", + "Bash(convert /tmp/vg_frame.ppm -crop 760x360+340+60 +repage /tmp/vg_faces.png)", + "Bash(convert /tmp/vg_frame.ppm -crop 760x300+340+430 +repage /tmp/vg_googie.png)", + "Bash(convert /tmp/vg_frame.ppm -crop 360x340+150+60 +repage /tmp/vg_angry.png)" ] } } diff --git a/README.md b/README.md index 28c6f59..7baa02d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A starfield simulator — except instead of stars, colorful **vector-drawn platonic solids** tumble through space toward the camera. -**~110 shape types** are rendered as glowing wireframes — each spawns far away +**~165 shape types** are rendered as glowing wireframes — each spawns far away at a random size, tumbles on its own random axis, and streams past the camera before being recycled at the render-distance sphere. Solids never overlap. @@ -20,15 +20,23 @@ The shape set includes: each lands on exactly the requested number of faces - **Star polygons:** {5/2}, {6/2}, {7/2}, {7/3}, {8/3}, {9/2}, {9/4}, {12/5}, plus the **unicursal hexagram** -- **Googie / atomic-age shapes**, most in both flat **2-D** and **3-D** forms: - jet-age bowling-alley twinkles (4- and 8-point), a layered double starburst, - an atomic burst with electron caps, a ray sunburst, boomerangs, kidney/amoeba - blobs, orbital atoms, concentric orbit rings, and a dense ray-star — plus the - naturally-3-D **Sputnik** satellite, a three-ring **gyroscope** cage, and a - spike-orb sea-urchin -- **Symbols & signs**, each in a flat **2-D** and an extruded **3-D** form: - smiley face, biohazard, peace sign, cross, question mark, exclamation point, - hash/pound (`#`), dollar sign (`$`), and pound sterling (`£`) +- **Googie / atomic-age shapes** — a large set in the jet-age / space-age idiom: + bowling-alley twinkles (4- and 8-point), a layered double starburst, atomic + bursts with electron caps, ray sunbursts, boomerangs, kidney/amoeba blobs, + concentric orbit rings, plus **30+ more truly-3-D objects**: radial + **starbursts** and **sea-urchins** (6/8/12/20/32-spike, some ball-tipped), + **gyroscope** orbit cages (2–6 rings), **orbital atoms** (2–6 orbits), + ringed **Saturn** planets, ball-and-stick **molecules**, **diabolo** + hourglasses, ray-stars, and a **Sputnik** satellite +- **Symbols, signs & faces**, each in a flat **2-D** and an extruded **3-D** + form: smiley, **frowny**, and **angry** faces, biohazard, peace sign, cross, + question mark, exclamation point, hash/pound (`#`), dollar sign (`$`), pound + sterling (`£`), and the **at sign (`@`)** +- **Object iconography**, each in **2-D** and **3-D**: space invaders, UFOs, + pac-man, alien heads, smoking pipes, umbrellas, and hands +- **Live clocks** (analog and digital, 2-D and 3-D) that show the **actual + current time** — their geometry is rebuilt every frame, so the analog hands + sweep and the seven-segment digital display ticks along in real time - **Random 3-D asteroids:** lumpy convex-hull rocks generated fresh each run, with random vertex counts (≈7–26) giving each a different number of sides and level of complexity diff --git a/vectorgons b/vectorgons index 15383f5854df594aae756b761b35f3c1d44d1152..c91cfc469ab80f0724d5740eb1ccdb92a6254b04 100755 GIT binary patch literal 93496 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 delta 30446 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

B^ZR;7W`-vo%nP;W z94j~g83(y|vQl$p}!NR{Mu zECeYm1jDQ$&T}@`JLEvYU59B=BgCNKis+q;^x;vT%~eE&@N=yW&hshtZqIC!l6aTA zs_KkGF1WLd-0JV#yNtWVGT@OYk{&^9&)P=XMjg})%Dq>OHI`y>L;KP$tx08CT(Mv(n!fV}>9TX2CD~IpP-qqdXD2R9^;ZH`;z09f3 zpGkczRH&!LrMdI)F)N<&L&&>6W8}f5dCjknrZ+@?q&fdVJM^b|OCzzCDNEMK7fZ*s zyiH&RH{ohQt|1Zw+*VwPVXqcz|=CO5ZHrw(l7QLs`Lqj z$9NTsG17AIRTPNJ+47zB1sUT;5IoX23S#Pmm=6#JC14c`3rH$%Aj_KxA-+DLs5N_A z6O$Jhco|1A{Eg3}imW5wUMZjX;B^P)r8w}?A^4T*ytN+#&1ZAv(+IS?hgoqDn`VtP zbx5%mlh!6^5wo0_Eh@8tnC&XFi;h-ystgW~W=p$O<{YVgt}+TSWzXU_iOAe7;tr~! z0Ah})Ovsg)+6hKZ4Fw&e8?%>zW-mWFjV=S%H-Ol}%`}7AoXmHdYcov|a~`mHtAovX z+*a={X0F?Lp=mkaV0P-~#0MmPD8HX`VF{ljSPpx^0ds2N$-E%vSI+W+TaMYqZoBWw z7M!MoalC>F#%;&>a&Son3d4dmmkLd)@7Zs27E{pX+|CD__hdz1%s(XeaYow>0;)J!%sYOldevGgzurEtf}bjkT(Zx3E-VJ@S4G1L#}E1OzxWhgJwF`dN9))>oTA zfw*Zb&5#O^Dt~z7Fecmy8{ti|CQ_t%k`ncTernb12Pk5BU5h zy^pNq8c%5|R8GFh1_ww@EkklYC5P{6VJLl5?!D(rL-9~KaPKRIbLsNDy{+mO59e+M z43#(SZ5q2johE_1`|7b^nnQmb!o4@~)VNwzKMNjTF3NxH%`+_TBTx8zkKt@@x&6M$ z0aprnYs&BL+v;$6C>*ZER5iSqE4YJt2Vm<=+yCWBta5gDx1H|S#0vi}PNeO_v%);; zcFtX_$NBQ%hN+M`Byt!hAxFjIe)Z43M~aK6|GB3coa`MQe>G)Vd;w9lIZxT@-7ysh zI#5(vPC4G2^mXoKZ&Ug@m*!LNbF$Yna~|*l{Geygd4Mu3CX|up_S@xttqu)6GyTZ_ zUzbjy?1BS+wu)pw_}!bdipd}RW)vR^b8aIO=77T0%%R)1de=?Gv7}LmC#iNI9(8QH z&M_7!Gn6P$Z}eh;N^$qa*<-iO75*z%WcJY_m7>lHb8hjfyo5}M5mfg7X>tV3`l-A`^Qv#1yteUQSBt5HCiX;-A!t=XSsKq-BarzEYgNVln$P(l@gJM>whd?I)MK2da2is=tx%s>R0H1mO~G%X`YLui zO0hX_C7v}E(ZkBa@~$j`eTO=)YG>tIs)n#A5Z0J4`|waB?57`B@(;4EE9CWLAQLl* zHwUgWikHH~&O6?=fcH^_c2j;YeHNj;HVgv5cJ{VsaHue@QWE5*=i)l<5rq8xIPTs> zvqFyK2b?}1;4gZemcJ_Sa?ah$AFt8<<-Bw4!~MhT&dh)`XCmIDo5>_e67232|MWCx zXUOEe=d3YlJMhk+F3!>TGx)^{jXGV4GmV_kY?$5sd5f?1hqoQPu);8)3g;e*>l2dtS<{@?X;H=}Ah{{Di;Mp8fFwNW-rg!C zLHk^WS0K&(b{HVLvzKTWEAcQSzjtwx;l%@Tvs^y&eLKU76#4%5O+&|12E4zmL?qCGQPNWDUP@h- zmr~@;KddoqER(!J z8U5L0A7Mv|buK!&zdXCTh1gAASv|zCWWW4-^)t<9!XwrbUqd@%%d)|5dXEhTQ(?E} z^2ke(Bf3NEZ2=LmqASh#+7b?M7wuD1bHC}WbS3v$9MM0mo5!44BRJo`?04Z2IpJ*$)aKF_L0;38B4#o&-VL{{aC^T)QW}-YA1G-*Jt!zCgfV+jGXWy4=dJ+9t<&OY0|`BdEBAEG#S(t|7L3LW+^ zx)I*wE1{hJDNJ=fO26RqJ}4T$mwWN? z){-2y(9*(EU@B0>0rX!qpTku6fEmj)n#o8`rF)uz zwx0%Y>}CWGJ&l+aZ$U41me)IPD*gaeYR(DUe&9GXIV3t) zEi9#t*Pl-0L7(QIi_Cej3<`Opc>K;f?0Bf3QcO>Nbf#i=23v99l0_b@=}Co-l$v3! zSJGZrceyiB?=xn-K4gN8x?FX6MHNIawlmyI<&6FvMfxzlg+4DO!t_TSy& z$eu?p#Z#T$H0S*^{8nWgKhKK6Qw~P-{%w+gNj}Y8c!u_y=%{C~V`o|VI`#yQa)lkR%H8kvv zkD~xA)2q8NJ*k2gV|QUQnxRshNdY8vFSX{wT^j!xY_0aQrsf{v8WXLNX-=Fk(E^_4 z?uL!vLiSs|sm?>T3g#wq3Qs!!reB8*vpXkR6YS127z%Ry?}>qD5R?7re>eoUEZZv2 z`n^NPBVBp8zDKIOoJUJBPN%5b;%ADLy6`Y-I`nN@<*MI94NbPn*M9%X(0_|u_D5`* z4Pt2qW?;K}7U|+ti*-O63)O&?#?#nX7{<(HTW5ML*a))G<^0q8dHW zZ|HAxKB3rcx6(;6URyUbb>P4LP3ypPC=YZu3?pna0z}x$z=$t0vGWqgZ( zZumL(9A{&;KL$`YXYqbXiHAG3kk8Sa;}s5a>Q9Kxc9KG~t6dU4i9D>C5SkUjgsVX$LkC zN))FLeh<7Ar~f$#x)G;a&^qW3nr}X4(Yq;3TMj`PS_|5VVw;iPMA3#q>4q&K&k{ux zlZJu9e*D9YR6FAVmTYIg){3eh)o;<~F&Q?v6@DU_!{>(qtjlSi(#oT5O*AyyD1UJ) zcf`o$aIx82S}7)8%FGX0DNB%~11t>Qs zU|Nq(Mh52r`*Jq$#4M8dYsNG!_0;| zTWX13z~65^4^50RKPw$u;_>Scrk6^LG~8zCZ)Afye(64@#x(yhwr=>G8wPONVpbx_ zC3GaaE5%_AaE-rLa33q~LHIx=vk}V%E6xX^4&nPMsj`#iM5c781KME*EVy8S^xea8 z0*JYQ<^>F7v_awq2|h=mI7}C2ltQ1yXG(Kn1v5Bizu=?J^m}%CmWa(fMqei3spwz; zo;!F=GbMWzTBjlz^C>x=A&u^cC-h{j@v`6DPGMUyRoGoLgOO>wGuxWb-+7%)7!=<) z`H8!sQ8qkXE^3L@BL(uX{?3bb=Rx|7cH>3ZCc<(V1iir7R&v)N8isd}gYGA`n7V{U z?j7eJ%6LXSNO9h<6;y~y<`Q|#{dNu)YSiEPJ(@hkmU!G$v>y+nmUyfue40Gs-Ft=l3O>V>6F(RB`>Jx;HXDogT3X1HB^}m#F$iu zojEsB8FuDuQ5jZjh{|9&kCa-d%q=>aZlyBlF0-X@l?mZx^FkxXO32hcO72nlvm-8t z#YNgM0#A2$pLI+txZ8U6xPmKT1$UEXjKT!^2_6RU6uiivFuAjkBu1}$j)~9c)UO^*Z-~phz93t(j7MYkUZsh=$pr*`*nl@y-xOyQf)PVXp5V=ZKgCzlK$P) zTr*5PVO%qm#uj~1>FvH#t~}n_@d2;NY?eJkng<27CglGNu&=~bNG~F#%j>|nrJ9cf zKsA3H`E>dN0MDpGE1bfUrD@&}Xje!vEHhf6ubMeXEv(*9EM2 zlI0c9{KKj#gt8B-+OQfdfhF%;)!b9u1>*oHUD-@drGla`*dWn4)rG9gPoU`}RyvA@ zKGQrqY*a`V2v~-ASEw7Ixhbji~k2bt_@n+d6?FH+t zxxKCKgWKZH(J^9r{iWh)D-N?iAG)j6eme4}S0i*fkF+-(a$|}}#vkZTUba-664JHn zw%#jOtN@s9Te+ec1o<}nVNBc36r*_2U;fL`)Y0}G{BgHc{J!$8&sS$Pr#q>5Jks8{ z2jEV}or(K-+%MwJ!~F*CdAJwjejE1(xHWtKmi~h>wn1kj$fU8JlT1^swb}5nO|Q#WWW^aX%#GX^Bf2kn}i(vJ2HFmfipPGqHA-X_opPG zpOy9TgjvK8Pr5~HVz|`DGuk4io5xIxP8eEVz5mi{!J7tLy3of{Z4ndbgcDalvZuI- znCu9NP8oJL{C1zZ*}+}gtzXmY#AA-J@0R|u{|lb>xjJN5tD-Ag)Z(i8oC@#in04Ne z%=3BsoPCeV|EW*nJ44q#{zG{mbZuN8_EGKhf%Ej7$}UPZ`gL;YwL_j!O~oKbS9YCN z3rR?J|Nd#|KSwtA=7pE5cyKZ|(>eZFo;^Go0u($RRH*i74NJRe*|n!MEK zOTc!&W|_}dh;+2a=c}sgfWmSp5U>IY=zi%dQ6SPO82#@fEx~MX2DgLrXDEHn^L%SDM%vs1;rA?SEw+uRd<^A6UAw3gWaCbM9v|GQAeKL23hoon zdwyvx4mIq0!P7HLj4|9A>zNQH4m4!vdUhc7AB_je!3NKrj$%tsn{YA8@WMpTpl~Qe zPWG$}7yI_aGovsC&3F&ZH<+3+HPF1!U=IwLSH~6@R^V4B#!x>n#1?4o8yL_Z-6Ikz zrO3kX( zkOn#g_~lnT`>b%5{tj{QEKgvB__+Ue(8aSnSrKBpcGaLy%<}mLQeL=HV3<@tFu>Me zP+))%Mi_d}y;+|15n?NUE9i5xJ;x%%E^VmWm7>>7gdfbW1IRY8fnWza6SBYNc_y?& zS%*O1a(Z^O6Qlh90=;2@=a+V3cmFu_wuTEmZQ6@{Jtg6yU)(GJ0=nILj1Qr2pm{L` zYEhm3fnjdH{(+GTC0k(JJbznYLP6b>z|nQ)cusZ@oAUDTHdA^-@loyQNS-jXY zC{k?V9|yW&iDyD2@L8b4mUwnVie3D-gFd&!^GBo@(@p_>2)())70c>xxP_VwKywJm zxC79c4=wdP-$Crzj^dsMJ{>13G>lR2ggWnuh!oeQKh=EMzR!mJX~rhgj@s;A8_UpcpgX>U=4()_DUz`!%3^ zOQBPVL3ADMNEem60oe9+KHtW+U|1-hqEMz$DANKXJ^zUo8`ez=tm#mvO2c52PU6#b3qfz_;@kOC zwD@TQPf3y(VjHJ=rCJm69^vyJ;a!jL%RJsBv2~-p2gw%!|J{RMB}Py4-ePOf=;_&8 zj1iMPxy1e9arPGD%<8|IpqSBR_Z)>VC^?9;Xa;trdv5m@`-oMZ#6HLx)`)m5a3DfD`tB(_Z1V~tm7xw)bsOP?JKsdgMYK)Y0ytBYV$6< z7V$4h!bYJp;mV)S3!^TRB*|7UgBi6;I2%+xlpa@3%nr&`ksdLgI$K^cZVBKTS>_#~Xme9!9tu*Qlis8Jni%=Lw1s!|0OHAAq9m#Mf`0BsRTfAb?a9kdW$s^TxzAluQmsg$8~J{PoA3+S%mRZfoA15a1FidQe>JZ-b- zdQQU^b6%T2rl`13!f|aYrl=nQ6Ve}9c7Im&|9Yfz zT~YB{kKj}hvS0IGINJNRD!BSz0{k@t>=gWj>psRdMYf zo@s^>fusL57b?}7seMK0PXfVG`ybP^3=>sDWsej z!1=+#bkUl+4ha1RJMEwGX%==d%_f5OKm9bkoZ%sYqV8)oJlhjAOl%r@7UF;VcX+=6 zZ$$t0P71)*fK!cYsn)d=PE)xwv^$7sV{1&OQ6_)^y_?&Fm&*IE4P&q z!BY|aJjl>Y!2X>B>d!#twiv;a1fKL`NwdMo)5u^Fv}X-1<8TtkibYJzQ#wTS^P~(B zgT=Kx_eVV0!;=%9&O^l(T;W#+HS2}QkdM`=++rKm@J*iMK2OY^B}2ugVk?$3i^Y1? z$bhveO!I=L@m%~k#8kb~N2)iJi9Iz#MSss*L&ZkoByKgICyRNqfhXH|a)c*mc=8)h zYIq{BF4n9GYCv7AOf62EEjlo9=kDOC-#ps%{TTkg|8CLFvWX*jGMSe#OH+QNO2u4j z2~XDY%6-88Mwbo3ccF$m=T9O*}ua3%jUYPjYw7gNdlcr418%6)ca_6v-V!pxi+h}pDnfT-ZX{mkt zjp`E9B_@97;OE3#KRoE}+%-lF6UB7T`LSYb5FKCArKNv(nvDY-qi*%Ibd@I)aJ?!O zuJSAyC-$h9PDcy4(mf}^);^0Tt2=DFr`dSXfyek2EJE{s%hliGAr(!{e8YK^pMRZAC&o(qJBDO_Jm{px#~PY`2_c!*~gOXchJ z8hgf15X0-M|3DM}q17W#5W8#qa`2~hJpK`@r}2xBtCMq?Pw+eiUOR+P)Ddim = 3; s->nv = 0; s->ne = 0; if (depth <= 0.0f) { for (int k = 0; k < b->np; k++) PV(s, b->px[k], b->py[k], 0, 0,0,0); for (int k = 0; k < b->ne; k++) AE(s, b->ea[k], b->eb[k]); @@ -365,6 +372,7 @@ static void sym_finish(SymB *b, float depth) { } center_normalize(s); } +static void sym_finish(SymB *b, float depth) { sym_fill_solid(new_solid(3), b, depth); } /* ---- individual symbol strokes (drawn roughly within [-1,1]) ------- */ @@ -636,6 +644,342 @@ static void gen_spikeorb3d(void) { center_normalize(s); } +/* ================================================================== */ +/* More googie / atomic-age 3-D objects, plus faces and the '@' sign. */ +/* ================================================================== */ + +/* Symmetric unit-direction sets for radial bursts. Returns the count. + * 0:octahedron(6) 1:cube(8) 2:icosahedron(12) 3:dodecahedron(20) + * 4:icosa+dodeca(32). */ +static int dir_set(int which, double out[][3]) { + const double P = 1.6180339887, Q = 0.6180339887; + double t[40][3]; int n = 0; + if (which == 0) { + double d[6][3] = {{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; + for (int i=0;i<6;i++){ t[n][0]=d[i][0];t[n][1]=d[i][1];t[n][2]=d[i][2];n++; } + } else if (which == 1) { + for (int x=-1;x<=1;x+=2) for (int y=-1;y<=1;y+=2) for (int z=-1;z<=1;z+=2) + { t[n][0]=x;t[n][1]=y;t[n][2]=z;n++; } + } else { + if (which == 2 || which == 4) { + double d[12][3]={{0,1,P},{0,1,-P},{0,-1,P},{0,-1,-P},{1,P,0},{1,-P,0}, + {-1,P,0},{-1,-P,0},{P,0,1},{P,0,-1},{-P,0,1},{-P,0,-1}}; + for (int i=0;i<12;i++){ t[n][0]=d[i][0];t[n][1]=d[i][1];t[n][2]=d[i][2];n++; } + } + if (which == 3 || which == 4) { + for (int x=-1;x<=1;x+=2) for (int y=-1;y<=1;y+=2) for (int z=-1;z<=1;z+=2) + { t[n][0]=x;t[n][1]=y;t[n][2]=z;n++; } + double e[12][3]={{0,Q,P},{0,Q,-P},{0,-Q,P},{0,-Q,-P},{Q,P,0},{Q,-P,0}, + {-Q,P,0},{-Q,-P,0},{P,0,Q},{P,0,-Q},{-P,0,Q},{-P,0,-Q}}; + for (int i=0;i<12;i++){ t[n][0]=e[i][0];t[n][1]=e[i][1];t[n][2]=e[i][2];n++; } + } + } + for (int i=0;inv; + PV(s, px+rad*(cos(a)*rx+sin(a)*sx), py+rad*(cos(a)*ry+sin(a)*sy), + pz+rad*(cos(a)*rz+sin(a)*sz), 0,0,0); + if(first<0)first=idx; + if(prev>=0)AE(s,prev,idx); + prev=idx; + } + if(first>=0&&prev>=0) AE(s,prev,first); +} + +/* radial spike burst (starburst): a spoke to each direction, optionally + * alternating long/short, optionally capped with a little ball */ +static void gen_burst3d(int which, double longr, double shortr, int balls) { + Solid *s=new_solid(3); + double d[40][3]; int nd=dir_set(which,d); + int c=s->nv; PV(s,0,0,0,0,0,0); + for (int i=0;i0 && (i&1))?shortr:longr; + double tx=d[i][0]*r, ty=d[i][1]*r, tz=d[i][2]*r; + int tip=s->nv; PV(s,tx,ty,tz,0,0,0); AE(s,c,tip); + if (balls) add_ball(s,tx,ty,tz,d[i][0],d[i][1],d[i][2],0.12,5); + } + center_normalize(s); +} + +/* great circles at spread orientations (gyroscope / orbit cage) */ +static void gen_rings3d(int nrings, int seg) { + Solid *s=new_solid(3); + for (int r=0;rnv; PV(s,x,y,z,0,0,0); + if(first<0)first=idx; + if(prev>=0)AE(s,prev,idx); + prev=idx; + } + AE(s,prev,first); + } + center_normalize(s); +} + +/* atomic orbital cluster: tilted elliptical orbits around an octahedral nucleus */ +static void gen_atomorbits(int norbits, int seg) { + Solid *s=new_solid(3); + for (int o=0;onv; PV(s,x,y,z,0,0,0); + if(first<0)first=idx; + if(prev>=0)AE(s,prev,idx); + prev=idx; + } + AE(s,prev,first); + } + int b0=s->nv; double r=0.12; + PV(s,r,0,0,0,0,0);PV(s,-r,0,0,0,0,0);PV(s,0,r,0,0,0,0); + PV(s,0,-r,0,0,0,0);PV(s,0,0,r,0,0,0);PV(s,0,0,-r,0,0,0); + int oe[12][2]={{0,2},{0,3},{0,4},{0,5},{1,2},{1,3},{1,4},{1,5},{2,4},{2,5},{3,4},{3,5}}; + for(int e=0;e<12;e++) AE(s,b0+oe[e][0],b0+oe[e][1]); + center_normalize(s); +} + +/* ringed planet (Saturn): a wireframe sphere with tilted equatorial ring(s) */ +static void gen_saturn3d(int nrings, double tilt) { + Solid *s=new_solid(3); + const double pi=TAU*0.5; int lats=3, seg=14; + for (int la=1;la<=lats;la++){ + double phi=pi*la/(lats+1)-pi*0.5, y=sin(phi)*0.6, rr=cos(phi)*0.6; + int first=-1, prev=-1; + for (int i=0;inv; + PV(s,rr*cos(a),y,rr*sin(a),0,0,0); + if(first<0)first=idx; + if(prev>=0)AE(s,prev,idx); + prev=idx; } + AE(s,prev,first); + } + for (int m=0;m<2;m++){ + double mo=TAU*m/4; int first=-1, prev=-1; + for (int i=0;inv; PV(s,x1,y,z1,0,0,0); + if(first<0)first=idx; + if(prev>=0)AE(s,prev,idx); + prev=idx; } + AE(s,prev,first); + } + for (int rg=0;rgnv; PV(s,x,y1,z1,0,0,0); + if(first<0)first=idx; + if(prev>=0)AE(s,prev,idx); + prev=idx; } + AE(s,prev,first); + } + center_normalize(s); +} + +/* ball-and-stick molecule: a central ball bonded to balls in each direction */ +static void gen_molecule3d(int which) { + Solid *s=new_solid(3); + double d[40][3]; int nd=dir_set(which,d); + int c=s->nv; PV(s,0,0,0,0,0,0); + add_ball(s,0,0,0, 0,0,1, 0.2, 6); + for (int i=0;inv; PV(s,tx,ty,tz,0,0,0); AE(s,c,tip); + add_ball(s,tx,ty,tz,d[i][0],d[i][1],d[i][2],0.17,6); + } + center_normalize(s); +} + +/* diabolo / hourglass burst: two cones tip-to-tip with a waisted lattice */ +static void gen_diabolo3d(int nspokes) { + Solid *s=new_solid(3); + int top=s->nv; PV(s,0,0,1.0,0,0,0); + int bot=s->nv; PV(s,0,0,-1.0,0,0,0); + int rt=s->nv; for(int i=0;inv; for(int i=0;inv; PV(s,0,0,0,0,0,0); + for (int i=0;inv; PV(s,r*cos(a),r*sin(a),0,0,0,0); AE(s,c,tip); } + int z1=s->nv; PV(s,0,0,0.7,0,0,0); AE(s,c,z1); + int z2=s->nv; PV(s,0,0,-0.7,0,0,0); AE(s,c,z2); + center_normalize(s); +} + +/* ---- expressive faces and the '@' sign (flat + extruded) ---------- */ + +static void build_frowny(SymB *b) { + sym_ring(b, 0,0, 1.0, 18); + sym_ring(b, -0.35, 0.32, 0.12, 6); + sym_ring(b, 0.35, 0.32, 0.12, 6); + sym_arc (b, 0.0, -0.55, 0.5, sym_deg(20), sym_deg(160), 8); /* downturned mouth */ +} +static void build_angry(SymB *b) { + sym_ring(b, 0,0, 1.0, 18); + sym_ring(b, -0.33, 0.26, 0.11, 6); + sym_ring(b, 0.33, 0.26, 0.11, 6); + sym_line(b, -0.58, 0.62, -0.14, 0.42); /* angry V brows: inner ends low */ + sym_line(b, 0.58, 0.62, 0.14, 0.42); + sym_arc (b, 0.0, -0.58, 0.48, sym_deg(20), sym_deg(160), 8); /* frown */ +} +static void build_at(SymB *b) { + sym_arc (b, 0.0, 0.0, 1.0, sym_deg(-25), sym_deg(295), 20); /* outer ring, open at right */ + sym_ring(b, -0.05, 0.0, 0.40, 12); /* inner 'a' bowl */ + sym_line(b, 0.35, 0.42, 0.35, -0.55); /* 'a' stem / tail */ +} + +/* ---- pop-culture / object iconography (flat 2-D + extruded 3-D) ---- */ + +static void build_invader(SymB *b) { /* blocky pixel-alien (Space Invader) */ + const double body[] = { + -0.7, 0.2, -0.7,-0.2, -0.5,-0.2, -0.5,-0.5, -0.25,-0.5, -0.25,-0.25, + 0.25,-0.25, 0.25,-0.5, 0.5,-0.5, 0.5,-0.2, 0.7,-0.2, 0.7, 0.2, + 0.45,0.5, 0.2,0.5, 0.2,0.78, 0.05,0.78, 0.05,0.5, -0.05,0.5, + -0.05,0.78, -0.2,0.78, -0.2,0.5, -0.45,0.5 }; + sym_poly(b, body, 22, 1); + sym_ring(b, -0.25, 0.12, 0.08, 5); + sym_ring(b, 0.25, 0.12, 0.08, 5); +} +static void build_ufo(SymB *b) { /* flying saucer */ + sym_ellipse(b, 0,0, 1.0, 0.30, 0, 22); /* saucer disc */ + sym_arc(b, 0.0, 0.06, 0.46, sym_deg(0), sym_deg(180), 11); /* dome */ + for (int i=-2;i<=2;i++) sym_ring(b, i*0.32, -0.22, 0.05, 4); /* lights */ +} +static void build_pacman(SymB *b) { /* wedge-mouth + pellet */ + sym_arc(b, 0,0, 1.0, sym_deg(36), sym_deg(324), 24); + int last = b->np - 1, c = sym_pt(b, 0, 0); + sym_edge(b, last, c); sym_edge(b, c, 0); /* close the mouth wedge */ + sym_ring(b, 0.05, 0.45, 0.09, 5); /* eye */ + sym_ring(b, 1.35, 0.0, 0.12, 6); /* pellet */ +} +static void build_alien(SymB *b) { /* grey alien head */ + int seg=22, first=-1, prev=-1; + for (int i=0;i0 ? y*0.95 : y*1.28); + if(first<0)first=idx; + if(prev>=0)sym_edge(b,prev,idx); + prev=idx; + } + sym_edge(b, prev, first); + sym_ellipse(b, -0.26, 0.05, 0.22, 0.10, sym_deg( 28), 9); /* almond eyes */ + sym_ellipse(b, 0.26, 0.05, 0.22, 0.10, sym_deg(-28), 9); +} +static void build_pipe(SymB *b) { /* smoking pipe */ + sym_arc(b, -0.55, 0.0, 0.34, sym_deg(18), sym_deg(342), 14); /* bowl, open at top */ + const double stem[] = { -0.28,-0.22, 0.2,-0.32, 0.7,-0.3, 0.98,-0.18 }; + sym_poly(b, stem, 4, 0); + sym_line(b, 0.98,-0.18, 1.04,-0.04); /* mouthpiece */ +} +static void build_umbrella(SymB *b) { /* canopy + ribs + pole + J-handle */ + double R = 0.95; int n = 4; + sym_arc(b, 0, 0.0, R, sym_deg(0), sym_deg(180), 14); /* canopy dome */ + for (int i=0;itm_hour%12, m=lt->tm_min, s=lt->tm_sec; + double ha=TAU*0.25 - TAU*((h + m/60.0)/12.0); /* 12 at top, clockwise */ + double ma=TAU*0.25 - TAU*(m/60.0); + double sa=TAU*0.25 - TAU*(s/60.0); + int c=sym_pt(b,0,0); + sym_edge(b, c, sym_pt(b, 0.50*cos(ha), 0.50*sin(ha))); /* hour */ + sym_edge(b, c, sym_pt(b, 0.74*cos(ma), 0.74*sin(ma))); /* minute */ + sym_edge(b, c, sym_pt(b, 0.84*cos(sa), 0.84*sin(sa))); /* second */ +} +static void build_digital(SymB *b, const struct tm *lt) { + int hh=lt->tm_hour, mm=lt->tm_min, d[4]={hh/10,hh%10,mm/10,mm%10}; + double w=0.30, h=0.30, cw=0.42, oy=-0.3; + double x[4]={-0.92,-0.92+cw, 0.18, 0.18+cw}; + for (int i=0;i<4;i++) sym_7seg(b, d[i], x[i], oy, w, h); + sym_ring(b, -0.02, oy+0.42*h, 0.035, 4); /* colon dots */ + sym_ring(b, -0.02, oy+1.4*h, 0.035, 4); + const double fr[]={-1.12,-0.55, 1.12,-0.55, 1.12,0.55, -1.12,0.55}; + sym_poly(b, fr, 4, 1); /* bezel keeps size constant */ +} +/* Rewrite the four clock solids in place from the current local time. */ +static void update_clocks(void) { + if (clock_idx[0] < 0) return; + time_t t = time(NULL); + struct tm *lt = localtime(&t); + SymB b; + sym_init(&b); build_analog (&b, lt); sym_fill_solid(&solids[clock_idx[0]], &b, 0.0f); + sym_init(&b); build_analog (&b, lt); sym_fill_solid(&solids[clock_idx[1]], &b, 0.5f); + sym_init(&b); build_digital(&b, lt); sym_fill_solid(&solids[clock_idx[2]], &b, 0.0f); + sym_init(&b); build_digital(&b, lt); sym_fill_solid(&solids[clock_idx[3]], &b, 0.5f); +} + /* Build a symbol in both its flat and extruded-3-D forms. */ static void add_symbol(void (*build)(SymB *)) { SymB b; @@ -764,6 +1108,59 @@ static void init_solids(void) { add_symbol(build_dollar); /* dollar sign */ add_symbol(build_sterling); /* pound sterling (£) */ + /* --- 30+ more googie / atomic-age 3-D objects --- */ + gen_burst3d(0, 1.0, 0.0, 0); /* 6-spike asterisk star */ + gen_burst3d(1, 1.0, 0.0, 0); /* 8-spike cube burst */ + gen_burst3d(2, 1.0, 0.55, 0); /* 12-spike spiky star */ + gen_burst3d(3, 1.0, 0.0, 0); /* 20-spike sea urchin */ + gen_burst3d(4, 1.0, 0.6, 0); /* 32-spike dense urchin */ + gen_burst3d(4, 1.0, 0.0, 0); /* 32-spike uniform urchin */ + gen_burst3d(2, 1.0, 0.0, 1); /* 12 ball-tipped sputnik */ + gen_burst3d(0, 1.0, 0.0, 1); /* 6 ball-tipped jacks */ + gen_burst3d(1, 1.0, 0.0, 1); /* 8 ball-tipped burst */ + gen_burst3d(3, 1.0, 0.0, 1); /* 20 ball-tipped burst */ + gen_burst3d(2, 1.0, 0.4, 1); /* 12 alt ball-tipped burst */ + gen_rings3d(2, 24); /* crossed rings */ + gen_rings3d(3, 22); /* gyroscope */ + gen_rings3d(4, 20); /* 4-ring cage */ + gen_rings3d(5, 20); /* 5-ring cage */ + gen_rings3d(6, 20); /* 6-ring orb cage */ + gen_atomorbits(2, 24); /* 2-orbit atom */ + gen_atomorbits(4, 20); /* 4-orbit atom */ + gen_atomorbits(5, 18); /* 5-orbit atom */ + gen_atomorbits(6, 16); /* 6-orbit atom */ + gen_saturn3d(1, 0.0); /* ringed planet */ + gen_saturn3d(2, 0.35); /* double-ringed planet */ + gen_saturn3d(1, 0.6); /* tilted-ring planet */ + gen_molecule3d(0); /* octahedral molecule */ + gen_molecule3d(1); /* cubic molecule */ + gen_molecule3d(2); /* icosahedral molecule */ + gen_diabolo3d(6); /* hex diabolo */ + gen_diabolo3d(10); /* diabolo / hourglass */ + gen_diabolo3d(16); /* fine diabolo */ + gen_raystar3d(12); /* 12-ray starburst */ + gen_raystar3d(16); /* 16-ray starburst */ + gen_raystar3d(24); /* 24-ray sunburst */ + + /* --- expressive faces + the @ sign (flat 2-D and extruded 3-D) --- */ + add_symbol(build_angry); /* angry face */ + add_symbol(build_frowny); /* frowny face */ + add_symbol(build_at); /* at sign (@) */ + + /* --- object iconography (flat 2-D and extruded 3-D each) --- */ + add_symbol(build_invader); /* space invader */ + add_symbol(build_ufo); /* flying saucer */ + add_symbol(build_pacman); /* pac-man */ + add_symbol(build_alien); /* alien head */ + add_symbol(build_pipe); /* smoking pipe */ + add_symbol(build_umbrella); /* umbrella */ + add_symbol(build_hand); /* hand */ + + /* --- live clocks: reserve 4 slots, then fill from the current time + * (refreshed every frame by update_clocks() in the main loop) --- */ + for (int i = 0; i < 4; i++) { clock_idx[i] = num_shapes; new_solid(3); } + update_clocks(); + /* --- 4/5/6-dimensional polytopes (projected & morphing) --- */ gen_simplex(5); /* 5-cell (4-simplex) */ gen_hypercube(4); /* tesseract / 8-cell */ @@ -1498,6 +1895,7 @@ int main(void) { int active = active_count(); ensure_filled(active); + update_clocks(); /* keep the clock shapes showing the current time */ for (int i = 0; i < active; i++) { Body *b = &bodies[i];