mirror of
https://git.coom.tech/drummyfish/small3dlib.git
synced 2024-11-24 21:09:57 +01:00
Add comments
This commit is contained in:
parent
252ec68e84
commit
78fe74caf3
2 changed files with 57 additions and 22 deletions
44
s3l.h
44
s3l.h
|
@ -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,8 +842,11 @@ 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);
|
||||||
|
@ -847,7 +861,7 @@ void _S3L_drawFilledTriangle(
|
||||||
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);
|
||||||
|
|
21
testSDL.c
21
testSDL.c
|
@ -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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue