features: - presets that can be optionally selected and will configure other constants (e.g. a "low memory sort strategy" will turn z-buffer off and turn back-to-front sorting on). - function for computing normals and lighting - triangle sorting: - back-to-front (slower, better memory efficiency) DONE - front-to-back (faster, but needs 1bit stencil buffer) DONE - function to set/clear stencil buffer -- can be useful - Optimize persp. correction! - Create and use the same function for determining CW/CCW AND left/right vertex determination in triangle drawing. - Check (and possibly fix) if any barycentric coord ever exceeds the range <0,255> due to rounding errors etc. - dithered barycentric interpolation function that is faster than normal interpolation -- it will randomly picky one of three values, with greater probabilities at greater coords - option to disable baycentric coordinates computing DONE - Z-buffer: - full DONE - reduced (resolution and precision) DONE - more reduced (4-bit) - MipMapping? Add triangle size to pixelInfo. DONE - perspective correction modes: - none DONE - full DONE - triangle subdivision (each triangle side will be subdivided after reaching a defined length, which will be measured by Chebyshev or similarly fast distance). - also offer some approximation function? - predefined 3D shapes: - cube DONE - sphere - cylinder - pyramid - plane - Depth computation during rasterization -- this should be an optional thing, specified with a define (S3L_COMPUTE_DEPTH), which may be turned on automatically for some modes (e.g. Z-buffer). It should be computed by the fast lerp and passed in the PixelInfo struct. DONE - Python tool to convert obj to C array DONE - create demos - drawModel: create an option that would use a cache to not transform the same point twice - Optional rendering stats (FPS, rendered triangles, ...). - profiling functions for optimization bugs: - Determining CW/CCW for a triangle is not 100% exact, sometimes leaves holes in models (some very thin triangles)! - With PC = 2, triangles that are at a too sharp angle can get very weird values of barycentric AND DEPTH (which messes up the z-buffer). Seems to only affect triangles facing right (not left). - Barycentric coodinates can get wrong in these ways: - Any of them can exceed the range <0,511> - b0 + b1 can be > 511, which causes b2 (= 511 - b0 - b1) to be negative! repeated: - valgrind (and similar) checks - optimize - write tests/benchmarks