1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/small3dlib.git synced 2024-11-21 20:39:57 +01:00

Add comments

This commit is contained in:
Miloslav Číž 2019-05-11 16:10:19 +02:00
parent 252ec68e84
commit 78fe74caf3
2 changed files with 57 additions and 22 deletions

58
s3l.h
View file

@ -116,7 +116,18 @@
#endif #endif
#ifndef S3L_PERSPECTIVE_CORRECTION #ifndef S3L_PERSPECTIVE_CORRECTION
#define S3L_PERSPECTIVE_CORRECTION 1 #define S3L_PERSPECTIVE_CORRECTION 0 /**< Specifies what type of perspective
correction (PC) to use. Remember
this is an expensive operation!
Possible values:
0: no PC, fastest but ugliest
1: full (per-pixel) PC, nicest but
extremely expensive!
2: triangle subdivided PC, a
compromise between quality and
speed (TODO, not implemented)
*/
#endif #endif
#define S3L_HALF_RESOLUTION_X (S3L_RESOLUTION_X >> 1) #define S3L_HALF_RESOLUTION_X (S3L_RESOLUTION_X >> 1)
@ -831,23 +842,26 @@ void _S3L_drawFilledTriangle(
const S3L_Camera *camera, const S3L_Camera *camera,
S3L_PixelInfo *p) S3L_PixelInfo *p)
{ {
S3L_ScreenCoord x0, y0, x1, y1, x2, y2; S3L_Vec4 *tPointPP, *lPointPP, *rPointPP; /* points in projction plane space
S3L_Vec4 *tPointPP, *lPointPP, *rPointPP; // points in projction plane space (in Units, normalized by
S3L_FRACTIONS_PER_UNIT) */
S3L_ScreenCoord x0, y0, x1, y1, x2, y2; /* points in screen space (pixel
coordinates) */
S3L_mapProjectionPlaneToScreen(point0,&x0,&y0); S3L_mapProjectionPlaneToScreen(point0,&x0,&y0);
S3L_mapProjectionPlaneToScreen(point1,&x1,&y1); S3L_mapProjectionPlaneToScreen(point1,&x1,&y1);
S3L_mapProjectionPlaneToScreen(point2,&x2,&y2); S3L_mapProjectionPlaneToScreen(point2,&x2,&y2);
S3L_ScreenCoord S3L_ScreenCoord
tPointSx, tPointSy, // top point coords, in screen space tPointSx, tPointSy, // top point coords, in screen space
lPointSx, lPointSy, // left point coords, in screen space lPointSx, lPointSy, // left point coords, in screen space
rPointSx, rPointSy; // right point coords, in screen space rPointSx, rPointSy; // right point coords, in screen space
S3L_Unit *barycentric0; // bar. coord that gets higher from L to R S3L_Unit *barycentric0; // bar. coord that gets higher from L to R
S3L_Unit *barycentric1; // bar. coord that gets higher from R to L S3L_Unit *barycentric1; // bar. coord that gets higher from R to L
S3L_Unit *barycentric2; // bar. coord that gets higher from bottom up S3L_Unit *barycentric2; // bar. coord that gets higher from bottom up
// Sort the points. // sort the points:
#define assignPoints(t,a,b)\ #define assignPoints(t,a,b)\
{\ {\
@ -892,13 +906,14 @@ void _S3L_drawFilledTriangle(
assignPoints(2,0,1) assignPoints(2,0,1)
} }
// Now draw the triangle line by line.
#undef assignPoints #undef assignPoints
// now draw the triangle line by line:
S3L_ScreenCoord splitY; // Y of the vertically middle point of the triangle S3L_ScreenCoord splitY; // Y of the vertically middle point of the triangle
S3L_ScreenCoord endY; // bottom Y of the whole triangle S3L_ScreenCoord endY; // bottom Y of the whole triangle
int splitOnLeft; // whether splitY happens on L or R side int splitOnLeft; /* whether splitY is the y coord. of left or right
point */
if (rPointSy <= lPointSy) if (rPointSy <= lPointSy)
{ {
@ -947,15 +962,16 @@ void _S3L_drawFilledTriangle(
lErrSub, rErrSub; // error value to substract when moving in x direction lErrSub, rErrSub; // error value to substract when moving in x direction
S3L_Unit S3L_Unit
lSideStep, rSideStep, lSideStep, rSideStep, lSideUnitPosScaled, rSideUnitPosScaled;
lSideUnitPosScaled, rSideUnitPosScaled; /* ^ These are helper vars for faster linear iterpolation (we scale the
S3L_FRACTIONS_PER_UNIT up by shifting to the right by
S3L_LERP_QUALITY and simply increment by steps. */
/* init side for the algorithm, params: /* init side for the algorithm, params:
s - which side (l or r) s - which side (l or r)
p1 - point from (t, l or r) p1 - point from (t, l or r)
p2 - point to (t, l or r) p2 - point to (t, l or r)
down - whether the side coordinate goes top-down or vice versa down - whether the side coordinate goes top-down or vice versa */
*/
#define initSide(s,p1,p2,down)\ #define initSide(s,p1,p2,down)\
s##X = p1##PointSx;\ s##X = p1##PointSx;\
s##Dx = p2##PointSx - p1##PointSx;\ s##Dx = p2##PointSx - p1##PointSx;\
@ -1012,7 +1028,7 @@ void _S3L_drawFilledTriangle(
source), it is to never be rasterized. */ source), it is to never be rasterized. */
{ {
if (currentY == splitY) // reached a vertical split of the triangle? if (currentY == splitY) // reached a vertical split of the triangle?
{ // then reinit one side {
#define manageSplit(b0,b1,s)\ #define manageSplit(b0,b1,s)\
S3L_Unit *tmp = barycentric##b0;\ S3L_Unit *tmp = barycentric##b0;\
barycentric##b0 = barycentric##b1;\ barycentric##b0 = barycentric##b1;\
@ -1053,7 +1069,9 @@ void _S3L_drawFilledTriangle(
S3L_Unit rowLength = S3L_nonZero(rX - lX - 1); // prevent zero div S3L_Unit rowLength = S3L_nonZero(rX - lX - 1); // prevent zero div
#if S3L_PERSPECTIVE_CORRECTION == 1 #if S3L_PERSPECTIVE_CORRECTION == 1
S3L_Unit lDepth, rDepth, lT, rT; S3L_Unit
lDepth, rDepth,
lT, rT; // perspective-corrected position along either side
lT = S3L_correctPerspective(lSideUnitPosScaled >> S3L_LERP_QUALITY,&lPC); lT = S3L_correctPerspective(lSideUnitPosScaled >> S3L_LERP_QUALITY,&lPC);
rT = S3L_correctPerspective(rSideUnitPosScaled >> S3L_LERP_QUALITY,&rPC); rT = S3L_correctPerspective(rSideUnitPosScaled >> S3L_LERP_QUALITY,&rPC);

View file

@ -12,8 +12,12 @@
#define S3L_RESOLUTION_X 640 #define S3L_RESOLUTION_X 640
#define S3L_RESOLUTION_Y 480 #define S3L_RESOLUTION_Y 480
#define S3L_PERSPECTIVE_CORRECTION 1
#include "s3l.h" #include "s3l.h"
int32_t offScreenPixels = 0;
const int16_t test_coords[] = const int16_t test_coords[] =
{ {
100,100, 99,101, 101,101, // 0, small triangle 100,100, 99,101, 101,101, // 0, small triangle
@ -86,6 +90,12 @@ uint8_t texturePixel(int32_t u, int32_t v)
void drawPixel(S3L_PixelInfo *p) void drawPixel(S3L_PixelInfo *p)
{ {
if (p->x < 0 || p ->x >= S3L_RESOLUTION_X || p->y < 0 || p->y >= S3L_RESOLUTION_Y)
{
offScreenPixels++;
return;
}
S3L_Unit u, v, *coords; S3L_Unit u, v, *coords;
coords = tex_coords + p->triangleID * 6; coords = tex_coords + p->triangleID * 6;
@ -115,14 +125,21 @@ S3L_DrawConfig conf;
void draw() void draw()
{ {
clearScreen(); offScreenPixels = 0;
//frame = 853; clearScreen();
modelTransform.rotation.z = frame * 0.1; modelTransform.rotation.z = frame * 0.1;
modelTransform.rotation.x = frame * 0.3; modelTransform.rotation.x = frame * 0.3;
// modelTransform.translation.x = sin(frame >> 3) * 700;
// modelTransform.translation.y = sin(frame >> 4) * 600;
S3L_drawModelIndexed(ver,tri,12,modelTransform,&camera,&conf); S3L_drawModelIndexed(ver,tri,12,modelTransform,&camera,&conf);
if (offScreenPixels > 0)
printf("offscreen pixels: %d\n",offScreenPixels);
// S3L_drawModelIndexed(ver,tri,1,modelTransform,&camera,&conf); // S3L_drawModelIndexed(ver,tri,1,modelTransform,&camera,&conf);
/* /*