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 - approximate DONE - 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 - Python tool to convert texture images to C array DONE - create demos: - model viewer DONE - game-like demo (GTA-style, Quake style etc.) - offline HQ (lerp texuring, normal mapping, reflections, ...) rendering to PPM image file - 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)! - 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