a 3d spinning cube in mirc
/cube [length in pixels]
both are optional
alias cube {
if (!$window(@3Dcube)) { window -pdfC +t @3Dcube -1 -1 500 500 }
if (!%cube.color) set %cube.color $2
if (!%cube.length) set %cube.length $1
if ($var(%cube.3D.*,0) = 0) {
set %cube.3D.y 0
set %cube.3D.x 0
set %cube.3D.z 0
set %cube.3D.bx $calc($window(@3Dcube).bw /2)
set %cube.3D.by $calc($window(@3Dcube).bh /2)
}
%cube.d = drawline -n @3Dcube $iif(%cube.color != $null,$v1,4) 1
var %cube.x = 0
while (%cube.x < 8) {
var %cube. [ $+ [ %cube.x ] ] $calcxyz(%cube.x,$iif(%cube.length,$v1,50))
inc %cube.x
}
clear -n @3dcube
%cube.d %cube.1 %cube.5 %cube.7 %cube.3 %cube.1
%cube.d %cube.5 %cube.4 %cube.6 %cube.7 %cube.5
%cube.d %cube.4 %cube.0 %cube.2 %cube.6 %cube.4
%cube.d %cube.0 %cube.1 %cube.3 %cube.2 %cube.0
drawdot @3Dcube
inc %cube.3D.y $r(1,3)
inc %cube.3D.x $r(1,3)
dec %cube.3D.z $r(1,3)
.timer3Dcube -h 1 0 cube
}
alias -l posneg return $iif($mid($base($1,8,2,3),$2,1),-) $+ $3
alias -l calcxyz {
var %cube.x1, %cube.x3, %cube.y2, %cube.z1, %cube.z3,%cube.z2 = $posneg($1,1,$2),%cube.y1 = $posneg($1,2,$2),%cube.y3 = $posneg($1,3,$2)
%cube.z1 = $calc((%cube.y3 * $cos(%cube.3D.y).deg) - (%cube.z2 * $sin(%cube.3D.y).deg))
%cube.x1 = $calc((%cube.y3 * $sin(%cube.3D.y).deg) + (%cube.z2 * $cos(%cube.3D.y).deg))
%cube.z2 = $calc((%cube.y1 * $sin(%cube.3D.x).deg) + (%cube.z1 * $cos(%cube.3D.x).deg))
%cube.y2 = $calc((%cube.y1 * $cos(%cube.3D.x).deg) - (%cube.z1 * $sin(%cube.3D.x).deg))
%cube.x3 = $calc((%cube.y2 * $sin(%cube.3D.z).deg) + (%cube.x1 * $cos(%cube.3D.z).deg) + %cube.3D.bx)
%cube.y3 = $calc((%cube.y2 * $cos(%cube.3D.z).deg) - (%cube.x1 * $sin(%cube.3D.z).deg) + %cube.3D.by)
return %cube.x3 %cube.y3
}
menu @3Dcube {
sclick: if ($timer(3Dcube)) .timer3Dcube off | else cube
}
on *:CLOSE:@3Dcube:{
.timer3Dcube off
unset %cube.*
}