Enabled by "useConstantSpeed" parameter.
This is done by creating new spline which resamples original spline proportionally to linear-piece-wise integrated length of segments of the original spline.
It's not perfect, but speed-wise it should be better, especially when the original spline has very different lengths of segments.
New spline may have a bit different shape though (Catmull-Rom spline guarantees that it will pass through control points, but with more dense control points it may get kinks in between). You may control density of resampling by "resamplingCoef" parameter of the PathCamera.
No more need for manual update hack.
Problems with keeping constant speed are still there. Added debug particles sampled along the spline - seems problems come from spline, samples have weird distribution.
PathCamera automatically follows path passing through waypoints (interpolated via Catmull-Rom spline). View angles can be constrained and controlled by mouse.
Work in progress, there are still some issued to be solved (constant movement speed, broken automatic update, broken frustum culling).
Gah, that was painful. Obvious solution with object.lookAt doesn't work, forward facing direction (heading and attitude) is fine, but banking gets messed up:( Tried many fixes, none worked, so I just resorted to simple rotation around Y-axis based on direction vector.
Spline control points shouldn't be cycled, this produces freaky behaviors near start and end of path. Instead they have to be capped.
Also did some refactoring.
It's now possible to create fog with zero density (which makes sense if you want to build shader with fog support, but not yet use fog, in contrast to not having fog in scene at all).
If no object is passed to initMaterials (for example, if material is pre-built while loading, or shader program is intended for sharing), max limit of 50 bones is used (should be enough to leave space for other uniforms not to hit ANGLE limits).
Clearing API for rendering to RenderTarget is now flipped: before forced clearing of render target was default, now no clearing is default.
New way of doing things saves one extra duplicitous clear call when switching render targets (like when doing postprocessing).
(doing documentation is indeed turning out to be useful)