Add texture ceiling
This commit is contained in:
parent
c97448e9a8
commit
c752646293
2 changed files with 58 additions and 20 deletions
66
demo2.cpp
66
demo2.cpp
|
@ -33,6 +33,10 @@
|
||||||
/* ^ Turns on computation of texture coordinates for the floor in raycastlib
|
/* ^ Turns on computation of texture coordinates for the floor in raycastlib
|
||||||
and makes this demo render the textures. */
|
and makes this demo render the textures. */
|
||||||
|
|
||||||
|
//#define TEXTURE_CEILING
|
||||||
|
/* ^ Turns on texture on ceiling (RCL_COMPUTE_FLOOR_TEXCOORDS must be turned
|
||||||
|
on as well for this to work). */
|
||||||
|
|
||||||
#define FLOOR_TEXTURE_SCALE 2
|
#define FLOOR_TEXTURE_SCALE 2
|
||||||
/* ^ Scales the floor texture if RCL_COMPUTE_FLOOR_TEXCOORDS is on. */
|
/* ^ Scales the floor texture if RCL_COMPUTE_FLOOR_TEXCOORDS is on. */
|
||||||
|
|
||||||
|
@ -83,6 +87,8 @@ Player player;
|
||||||
#define INFO_BAR_START 70
|
#define INFO_BAR_START 70
|
||||||
#define TEXTURE_MAX_DISTANCE (RCL_UNITS_PER_SQUARE * 6)
|
#define TEXTURE_MAX_DISTANCE (RCL_UNITS_PER_SQUARE * 6)
|
||||||
|
|
||||||
|
#define RESOLUTION_Y (INFO_BAR_START + 1)
|
||||||
|
|
||||||
// temporary defines for better visibility of walls and floors below
|
// temporary defines for better visibility of walls and floors below
|
||||||
#define D 6
|
#define D 6
|
||||||
#define o 0
|
#define o 0
|
||||||
|
@ -897,39 +903,55 @@ inline void pixelFunc(RCL_PixelInfo *pixel)
|
||||||
if (pixel->position.y == MIDDLE_ROW)
|
if (pixel->position.y == MIDDLE_ROW)
|
||||||
zBuffer[pixel->position.x] = pixel->depth;
|
zBuffer[pixel->position.x] = pixel->depth;
|
||||||
|
|
||||||
uint8_t c = 0;
|
uint8_t color = 0;
|
||||||
|
|
||||||
#ifndef NO_MIRROR
|
#ifndef NO_MIRROR
|
||||||
if (pixel->position.y == 0)
|
if (pixel->position.y == 0)
|
||||||
mirror = 0;
|
mirror = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool drawCeiling = false;
|
||||||
|
|
||||||
|
int16_t intensity = 0;
|
||||||
|
|
||||||
if (!pixel->isWall)
|
if (!pixel->isWall)
|
||||||
{
|
{
|
||||||
#if RCL_COMPUTE_FLOOR_TEXCOORDS == 1
|
#if RCL_COMPUTE_FLOOR_TEXCOORDS == 1
|
||||||
if (pixel->isFloor)
|
if (pixel->isFloor)
|
||||||
{
|
{
|
||||||
if (pixel->texCoords.y > 3 * RCL_UNITS_PER_SQUARE) // leave astrip of untextured floor
|
if (pixel->texCoords.y > 3 * RCL_UNITS_PER_SQUARE) // leave astrip of untextured floor
|
||||||
c = pixel->depth > RCL_UNITS_PER_SQUARE * 5 ?
|
color = pixel->depth > RCL_UNITS_PER_SQUARE * 5 ?
|
||||||
textureAverageColors[1] :
|
textureAverageColors[1] :
|
||||||
sampleImage(textures[1],pixel->texCoords.x / FLOOR_TEXTURE_SCALE,pixel->texCoords.y / FLOOR_TEXTURE_SCALE);
|
sampleImage(textures[1],pixel->texCoords.x / FLOOR_TEXTURE_SCALE,pixel->texCoords.y / FLOOR_TEXTURE_SCALE);
|
||||||
else
|
else
|
||||||
c = cFloor;
|
color = cFloor;
|
||||||
|
|
||||||
|
#ifdef TEXTURE_CEILING
|
||||||
|
drawCeiling = true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
c = 0; // looks better :)
|
{
|
||||||
|
#ifdef TEXTURE_CEILING
|
||||||
|
// don't draw ceiling here, we'll draw it along with floor
|
||||||
|
return;
|
||||||
|
#else
|
||||||
|
color = 0; // looks better :)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
c = pixel->isFloor ? cFloor: cCeiling;
|
color = pixel->isFloor ? cFloor: cCeiling;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef NO_MIRROR
|
#ifndef NO_MIRROR
|
||||||
int16_t intensity = pixel->isFloor ?
|
intensity = pixel->isFloor ?
|
||||||
-1 * (pixel->depth - mirror * 64) / RCL_UNITS_PER_SQUARE : 0;
|
-1 * (pixel->depth - mirror * 64) / RCL_UNITS_PER_SQUARE : 0;
|
||||||
#else
|
#else
|
||||||
int16_t intensity = -1 * pixel->depth / (RCL_UNITS_PER_SQUARE * 2);
|
intensity = -1 * pixel->depth / (RCL_UNITS_PER_SQUARE * 2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
c = addIntensity(c,intensity);
|
color = addIntensity(color,intensity);
|
||||||
|
|
||||||
mirror++;
|
mirror++;
|
||||||
}
|
}
|
||||||
|
@ -938,9 +960,9 @@ inline void pixelFunc(RCL_PixelInfo *pixel)
|
||||||
RCL_Unit textureScroll = pixel->hit.type != 4 ? 0 : 16 * pokitto.frameCount;
|
RCL_Unit textureScroll = pixel->hit.type != 4 ? 0 : 16 * pokitto.frameCount;
|
||||||
|
|
||||||
#ifdef NO_TEXTURES
|
#ifdef NO_TEXTURES
|
||||||
c = textureAverageColors[pixel->hit.type];
|
color = textureAverageColors[pixel->hit.type];
|
||||||
#else
|
#else
|
||||||
c = pixel->depth < TEXTURE_MAX_DISTANCE ?
|
color = pixel->depth < TEXTURE_MAX_DISTANCE ?
|
||||||
sampleImage(textures[pixel->hit.type],pixel->texCoords.x + textureScroll,pixel->texCoords.y) :
|
sampleImage(textures[pixel->hit.type],pixel->texCoords.x + textureScroll,pixel->texCoords.y) :
|
||||||
textureAverageColors[pixel->hit.type];
|
textureAverageColors[pixel->hit.type];
|
||||||
#endif
|
#endif
|
||||||
|
@ -948,20 +970,36 @@ inline void pixelFunc(RCL_PixelInfo *pixel)
|
||||||
#ifndef NO_SHADING
|
#ifndef NO_SHADING
|
||||||
if (previousColumn == pixel->position.x)
|
if (previousColumn == pixel->position.x)
|
||||||
{
|
{
|
||||||
c = addIntensity(c,pixelIntensity);
|
color = addIntensity(color,pixelIntensity);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// optimization: precompute intensity for the whole column
|
// optimization: precompute intensity for the whole column
|
||||||
pixelIntensity = 1 - pixel->depth / (RCL_UNITS_PER_SQUARE * 2) + (pixel->hit.direction % 2 == 0 ? 2 : 0);
|
pixelIntensity = 1 - pixel->depth / (RCL_UNITS_PER_SQUARE * 2) + (pixel->hit.direction % 2 == 0 ? 2 : 0);
|
||||||
previousColumn = pixel->position.x;
|
previousColumn = pixel->position.x;
|
||||||
c = addIntensity(c,pixelIntensity);
|
color = addIntensity(color,pixelIntensity);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
putSubsampledPixel(pixel,c);
|
putSubsampledPixel(pixel->position.x,pixel->position.y,color);
|
||||||
|
|
||||||
|
#ifdef TEXTURE_CEILING
|
||||||
|
if (drawCeiling)
|
||||||
|
{
|
||||||
|
/* here we sample a different texture for ceiling, but if the texture is
|
||||||
|
same as floor, just reuse the color sampled above to save on the
|
||||||
|
sampling and intensity addition */
|
||||||
|
|
||||||
|
color = pixel->depth > RCL_UNITS_PER_SQUARE * 5 ?
|
||||||
|
textureAverageColors[0] :
|
||||||
|
sampleImage(textures[0],pixel->texCoords.x / FLOOR_TEXTURE_SCALE,pixel->texCoords.y / FLOOR_TEXTURE_SCALE);
|
||||||
|
color = addIntensity(color,intensity);
|
||||||
|
putSubsampledPixel(pixel->position.x,RESOLUTION_Y - pixel->position.y - 1,color);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw()
|
void draw()
|
||||||
|
@ -1008,7 +1046,7 @@ int main()
|
||||||
player.setPositionSquare(6,5);
|
player.setPositionSquare(6,5);
|
||||||
player.mCamera.height = RCL_CAMERA_COLL_HEIGHT_BELOW;
|
player.mCamera.height = RCL_CAMERA_COLL_HEIGHT_BELOW;
|
||||||
|
|
||||||
player.mCamera.resolution.y = INFO_BAR_START + 2;
|
player.mCamera.resolution.y = RESOLUTION_Y;
|
||||||
|
|
||||||
uint32_t previousTime = 0;
|
uint32_t previousTime = 0;
|
||||||
uint32_t dt;
|
uint32_t dt;
|
||||||
|
|
12
general.hpp
12
general.hpp
|
@ -77,19 +77,19 @@ RCL_RayConstraints defaultConstraints;
|
||||||
unsigned short palette[256];
|
unsigned short palette[256];
|
||||||
|
|
||||||
#ifdef POK_SIM
|
#ifdef POK_SIM
|
||||||
inline void putSubsampledPixel(RCL_PixelInfo *pixel, uint8_t color)
|
inline void putSubsampledPixel(int32_t x, int32_t y, uint8_t color)
|
||||||
{
|
{
|
||||||
pokitto.display.drawPixel(pixel->position.x * SUBSAMPLE,pixel->position.y,color);
|
pokitto.display.drawPixel(x * SUBSAMPLE,y,color);
|
||||||
pokitto.display.drawPixel(pixel->position.x * SUBSAMPLE + 1,pixel->position.y,color);
|
pokitto.display.drawPixel(x * SUBSAMPLE + 1,y,color);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
// This code breaks the simulator.
|
// This code breaks the simulator.
|
||||||
inline void putSubsampledPixel(RCL_PixelInfo *pixel, uint8_t color)
|
inline void putSubsampledPixel(int32_t x, int32_t y, uint8_t color)
|
||||||
{
|
{
|
||||||
uint8_t *buf = pokitto.display.screenbuffer;
|
uint8_t *buf = pokitto.display.screenbuffer;
|
||||||
|
|
||||||
buf += pixel->position.x * SUBSAMPLE;
|
buf += x * SUBSAMPLE;
|
||||||
buf += pixel->position.y * SCREEN_WIDTH;
|
buf += y * SCREEN_WIDTH;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < SUBSAMPLE - 1; ++i)
|
for (uint8_t i = 0; i < SUBSAMPLE - 1; ++i)
|
||||||
*buf++ = color;
|
*buf++ = color;
|
||||||
|
|
Loading…
Reference in a new issue