diff --git a/programs/level.c b/programs/level.c index 65b2f1c..fa6d10e 100644 --- a/programs/level.c +++ b/programs/level.c @@ -87,9 +87,9 @@ void drawTeleport(int16_t x, int16_t y, S3L_ScreenCoord size) int16_t halfSize = size / 2; S3L_ScreenCoord x0 = S3L_max(0,x - halfSize); - S3L_ScreenCoord x1 = S3L_min(S3L_RESOLUTION_X - 1,x + halfSize); + S3L_ScreenCoord x1 = S3L_min(S3L_RESOLUTION_X,x + halfSize); S3L_ScreenCoord y0 = S3L_max(0,y - halfSize); - S3L_ScreenCoord y1 = S3L_min(S3L_RESOLUTION_Y - 1,y + halfSize); + S3L_ScreenCoord y1 = S3L_min(S3L_RESOLUTION_Y,y + halfSize); for (S3L_ScreenCoord j = y0; j < y1; ++j) for (S3L_ScreenCoord i = x0; i < x1; ++i) @@ -162,7 +162,10 @@ void draw() project3DPointToScreen(teleportPoint,scene.camera,&screenPoint); - if (screenPoint.z < S3L_zBufferRead(screenPoint.x,screenPoint.y)) + if (screenPoint.w > 0 && + screenPoint.x >= 0 && screenPoint.x <= S3L_RESOLUTION_X && + screenPoint.y >= 0 && screenPoint.y <= S3L_RESOLUTION_Y && + screenPoint.z < S3L_zBufferRead(screenPoint.x,screenPoint.y)) drawTeleport(screenPoint.x,screenPoint.y,screenPoint.w); clock_t nowT = clock(); diff --git a/small3dlib.h b/small3dlib.h index b553e7d..4044805 100644 --- a/small3dlib.h +++ b/small3dlib.h @@ -612,7 +612,12 @@ void S3L_newFrame(); void S3L_zBufferClear(); void S3L_stencilBufferClear(); +/** Writes a value (not necessarily depth! depends on the format of z-buffer) + to z-buffer (if enabled). Does NOT check boundaries! */ void S3L_zBufferWrite(S3L_ScreenCoord x, S3L_ScreenCoord y, S3L_Unit value); + +/** Reads a value (not necessarily depth! depends on the format of z-buffer) + from z-buffer (if enabled). Does NOT check boundaries! */ S3L_Unit S3L_zBufferRead(S3L_ScreenCoord x, S3L_ScreenCoord y); static inline void S3L_rotate2DPoint(S3L_Unit *x, S3L_Unit *y, S3L_Unit angle); @@ -1465,7 +1470,7 @@ void project3DPointToScreen( result->z = point.z; result->w = - (point.z < 0) ? 0 : + (point.z <= 0) ? 0 : ( (s * camera.focalLength * S3L_RESOLUTION_X) / (point.z * S3L_FRACTIONS_PER_UNIT)