1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/raycastlib.git synced 2024-11-23 20:49:57 +01:00

Add pixel counter

This commit is contained in:
Miloslav Číž 2018-09-12 17:37:15 +02:00
parent 9801297121
commit 853f938521
2 changed files with 48 additions and 5 deletions

View file

@ -242,6 +242,8 @@ void castRaysMultiHit(Camera cam, ArrayFunction arrayFunc,
/** /**
Using provided functions, renders a complete complex camera view. Using provided functions, renders a complete complex camera view.
This function should render each screen pixel exactly once.
@param cam camera whose view to render @param cam camera whose view to render
@param floorHeightFunc function that returns floor height (in Units) @param floorHeightFunc function that returns floor height (in Units)
@param ceilingHeightFunc same as floorHeightFunc but for ceiling, can also be @param ceilingHeightFunc same as floorHeightFunc but for ceiling, can also be
@ -261,6 +263,8 @@ void render(Camera cam, ArrayFunction floorHeightFunc,
with simple 1-intersection raycasting. The render(...) function can give more with simple 1-intersection raycasting. The render(...) function can give more
accurate results than this function, so it's to be considered even for simple accurate results than this function, so it's to be considered even for simple
scenes. scenes.
This function should render each screen pixel exactly once.
*/ */
void renderSimple(Camera cam, ArrayFunction floorHeightFunc, void renderSimple(Camera cam, ArrayFunction floorHeightFunc,
ArrayFunction typeFunc, PixelFunction pixelFunc, RayConstraints constraints); ArrayFunction typeFunc, PixelFunction pixelFunc, RayConstraints constraints);
@ -888,7 +892,7 @@ void _columnFunction(HitResult *hits, uint16_t hitCount, uint16_t x, Ray ray)
_pixelFunction(&p); _pixelFunction(&p);
} }
if (z1ScreenCeil > y2) if (z1ScreenCeil > y2)
y2 = z1ScreenCeil; y2 = z1ScreenCeil;
} }

View file

@ -21,8 +21,8 @@
#define LEVEL_X_RES 29 #define LEVEL_X_RES 29
#define LEVEL_Y_RES 21 #define LEVEL_Y_RES 21
#define SCREEN_WIDTH 640 #define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 480 #define SCREEN_HEIGHT 240
#define MIDDLE_ROW (SCREEN_HEIGHT / 2) #define MIDDLE_ROW (SCREEN_HEIGHT / 2)
#define TRANSPARENT_COLOR 0b00000111 #define TRANSPARENT_COLOR 0b00000111
@ -48,6 +48,7 @@ Unit zBuffer[SCREEN_WIDTH]; ///< 1D z-buffer for visibility determination.
Camera camera; Camera camera;
uint32_t pixels[SCREEN_WIDTH * SCREEN_HEIGHT]; uint32_t pixels[SCREEN_WIDTH * SCREEN_HEIGHT];
uint32_t pixelCounter[SCREEN_WIDTH * SCREEN_HEIGHT];
typedef struct typedef struct
{ {
@ -697,6 +698,28 @@ const unsigned char sprite3[] =
const unsigned char *textures[] = {texture1, texture2, texture3, texture4}; const unsigned char *textures[] = {texture1, texture2, texture3, texture4};
void clearPixelCounter()
{
memset(pixelCounter,0,SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(uint32_t));
}
void writePixelCounter()
{
printf("\npixel counter:\n");
for (int y = 0; y < SCREEN_HEIGHT; ++y)
{
for (int x = 0; x < SCREEN_WIDTH; ++x)
{
uint32_t count = pixelCounter[y * SCREEN_WIDTH + x];
if (count != 1) // each pixel should have been rendered only once
printf("error: pixel %d %d rendered %d times!\n",x,y,count);
}
}
}
uint8_t rgbToIndex(uint8_t r, uint8_t g, uint8_t b) uint8_t rgbToIndex(uint8_t r, uint8_t g, uint8_t b)
{ {
return (r & 0b00000111) | ((g & 0b00000111) << 3) | ((b & 0b00000011) << 6); return (r & 0b00000111) | ((g & 0b00000111) << 3) | ((b & 0b00000011) << 6);
@ -860,7 +883,10 @@ void pixelFunc(PixelInfo *pixel)
b = b > 0 ? b : 0; b = b > 0 ? b : 0;
b = b << 8; b = b << 8;
pixels[pixel->position.y * SCREEN_WIDTH + pixel->position.x] = r | g | b; int32_t index = pixel->position.y * SCREEN_WIDTH + pixel->position.x;
pixels[index] = r | g | b;
pixelCounter[index]++;
} }
void draw() void draw()
@ -945,10 +971,23 @@ int main()
SDL_Event event; SDL_Event event;
int running = 1; int running = 1;
int counter = 0;
while (running) while (running)
{ {
if (counter <= 0)
clearPixelCounter();
draw(); draw();
if (counter <= 0)
{
writePixelCounter();
counter = 256;
}
else
counter--;
SDL_UpdateTexture(texture,NULL,pixels,SCREEN_WIDTH * sizeof(uint32_t)); SDL_UpdateTexture(texture,NULL,pixels,SCREEN_WIDTH * sizeof(uint32_t));
while (SDL_PollEvent(&event)) while (SDL_PollEvent(&event))