Although hard (if scale != 0) to cull all hidden cubes should be feasible to detect hidden faces that are covered by an adjacent cube.
E.g. to figure out covered top faces for each (x,y) sort by height. Do diff() on the z values. If the difference is exactly one then the lower adjacent cube's top face is covered and that face could be culled.
Would be a little bit tricky to keep the order of various cube faces. Could initially mark the to-cull x,y coordinates as NA, splice all the faces x,y coordinates together, and then do an na.omit() on these missing coordinates (and fill colors) at the end to cull them before drawing.
With 9fe7298 if each of a cube's visible faces are hidden by
an adjacent cube then cull that cube.
On my machine this brings down the 3D render of the volcano
down from about 3.5 seconds to 1.5 seconds.
Still slower than {isocubes} 3D render (whose isometric projection
was partially chosen for easy deduction of hidden cubes)...
We may miss cubes that are hidden by non-adjacent cubes...
This issue isn't closed because we may be able to go even faster if we cull all hidden faces (by adjacent cubes) but this would involve a more invasive rewrite of the rendering code.
scale != 0
) to cull all hidden cubes should be feasible to detect hidden faces that are covered by an adjacent cube.diff()
on the z values. If the difference is exactly one then the lower adjacent cube's top face is covered and that face could be culled.na.omit()
on these missing coordinates (and fill colors) at the end to cull them before drawing.