Add general header
This commit is contained in:
parent
8595dc6562
commit
0f4882f18e
2 changed files with 166 additions and 133 deletions
|
@ -4,33 +4,16 @@
|
||||||
Don't forget to compile with -O3!
|
Don't forget to compile with -O3!
|
||||||
|
|
||||||
author: Miloslav "drummyfish" Ciz
|
author: Miloslav "drummyfish" Ciz
|
||||||
license: CC0
|
license: CC0 1.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#define RAYCAST_TINY
|
#include "general.hpp"
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#define VERTICAL_FOV UNITS_PER_SQUARE // for raycastlib
|
|
||||||
#include "raycastlib.h"
|
|
||||||
#include "Pokitto.h"
|
|
||||||
|
|
||||||
#define SUBSAMPLE 2
|
|
||||||
|
|
||||||
#define SCREEN_WIDTH 110
|
|
||||||
#define SCREEN_HEIGHT 88
|
|
||||||
|
|
||||||
#define SUBSAMPLED_WIDTH (SCREEN_WIDTH / SUBSAMPLE)
|
|
||||||
#define SUBSAMPLED_HEIGHT (SCREEN_HEIGHT / SUBSAMPLE)
|
|
||||||
|
|
||||||
#define MIDDLE_ROW (SCREEN_HEIGHT / 2)
|
|
||||||
#define MIDDLE_COLUMN (SCREEN_WIDTH / 2)
|
|
||||||
|
|
||||||
#define SPRITES 3
|
#define SPRITES 3
|
||||||
#define SPRITE_MAX_DISTANCE 5 * UNITS_PER_SQUARE
|
#define SPRITE_MAX_DISTANCE 5 * UNITS_PER_SQUARE
|
||||||
|
|
||||||
Pokitto::Core p;
|
#define SUBSAMPLE 2
|
||||||
|
#define SUBSAMPLED_WIDTH (SCREEN_WIDTH / SUBSAMPLE)
|
||||||
Unit zBuffer[SUBSAMPLED_WIDTH];
|
|
||||||
|
|
||||||
#define LEVEL_X_RES 29
|
#define LEVEL_X_RES 29
|
||||||
#define LEVEL_Y_RES 21
|
#define LEVEL_Y_RES 21
|
||||||
|
@ -580,88 +563,6 @@ const unsigned char sprite2[] =
|
||||||
|
|
||||||
const unsigned char *textures[] = {texture1, texture2, texture3, texture4};
|
const unsigned char *textures[] = {texture1, texture2, texture3, texture4};
|
||||||
|
|
||||||
inline uint8_t sampleImage(const unsigned char *image, Unit x, Unit y)
|
|
||||||
{
|
|
||||||
// TODO: optimize
|
|
||||||
|
|
||||||
x = wrap(x,UNITS_PER_SQUARE);
|
|
||||||
y = wrap(y,UNITS_PER_SQUARE);
|
|
||||||
|
|
||||||
int32_t index =
|
|
||||||
image[1] * ((image[1] * x) / UNITS_PER_SQUARE) + (image[0] * y) /
|
|
||||||
UNITS_PER_SQUARE;
|
|
||||||
|
|
||||||
return image[2 + index];
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char translaprentColor;
|
|
||||||
|
|
||||||
void drawSprite(const unsigned char *sprite, int16_t x, int16_t y, Unit depth, int16_t size)
|
|
||||||
{
|
|
||||||
// TODO: optimize
|
|
||||||
|
|
||||||
x -= size / 2;
|
|
||||||
y -= size / 2;
|
|
||||||
|
|
||||||
Unit step = UNITS_PER_SQUARE / size;
|
|
||||||
|
|
||||||
uint8_t c;
|
|
||||||
|
|
||||||
int16_t jTo = size - max(0,y + size - 88);
|
|
||||||
int16_t iTo = size - max(0,x + size - 110);
|
|
||||||
|
|
||||||
for (Unit i = max(-1 * x,0); i < iTo; ++i)
|
|
||||||
{
|
|
||||||
int16_t xPos = x + i;
|
|
||||||
|
|
||||||
if (zBuffer[xPos / SUBSAMPLE] <= depth)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (Unit j = max(-1 * y,0); j < jTo; ++j)
|
|
||||||
{
|
|
||||||
c = sampleImage(sprite,(i * UNITS_PER_SQUARE) / size,(j * UNITS_PER_SQUARE) / size);
|
|
||||||
|
|
||||||
if (c != translaprentColor)
|
|
||||||
p.display.drawPixel(xPos,y + j,c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// r: 3 bits, g: 3 bits, b: 2 bits
|
|
||||||
inline uint8_t rgbToIndex(uint8_t r, uint8_t g, uint8_t b)
|
|
||||||
{
|
|
||||||
return (r & 0b00000111) | ((g & 0b00000111) << 3) | ((b & 0b00000011) << 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline uint8_t addIntensity(uint8_t color, int intensity)
|
|
||||||
{
|
|
||||||
uint8_t r = color & 0b00000111;
|
|
||||||
uint8_t g = (color & 0b00111000) >> 3;
|
|
||||||
uint8_t b = (color & 0b11000000) >> 6;
|
|
||||||
|
|
||||||
if (intensity >= 0)
|
|
||||||
{
|
|
||||||
r += intensity;
|
|
||||||
r = r > 7 ? 7 : r;
|
|
||||||
|
|
||||||
g += intensity;
|
|
||||||
g = g > 7 ? 7 : g;
|
|
||||||
|
|
||||||
b += intensity / 2;
|
|
||||||
b = b > 3 ? 3 : b;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
intensity *= -1;
|
|
||||||
r = (intensity > r) ? 0 : r - intensity;
|
|
||||||
g = (intensity > g) ? 0 : g - intensity;
|
|
||||||
intensity /= 2;
|
|
||||||
b = intensity > b ? 0 : b - intensity;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rgbToIndex(r,g,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Sprite
|
class Sprite
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -751,10 +652,10 @@ inline void pixelFunc(PixelInfo pixel)
|
||||||
rgbToIndex(intensity,intensity/2,0);
|
rgbToIndex(intensity,intensity/2,0);
|
||||||
|
|
||||||
|
|
||||||
uint8_t *buf = p.display.screenbuffer;
|
uint8_t *buf = pokitto.display.screenbuffer;
|
||||||
|
|
||||||
buf += pixel.position.x * SUBSAMPLE;
|
buf += pixel.position.x * SUBSAMPLE;
|
||||||
buf += pixel.position.y * p.display.width;
|
buf += pixel.position.y * pokitto.display.width;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < SUBSAMPLE - 1; ++i)
|
for (uint8_t i = 0; i < SUBSAMPLE - 1; ++i)
|
||||||
*buf++ = c;
|
*buf++ = c;
|
||||||
|
@ -798,21 +699,19 @@ void draw()
|
||||||
|
|
||||||
previousDepth = pos.depth;
|
previousDepth = pos.depth;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
p.display.setColor(rgbToIndex(7,7,3));
|
pokitto.display.setColor(rgbToIndex(7,7,3));
|
||||||
p.display.setCursor(1,1);
|
pokitto.display.setCursor(1,1);
|
||||||
p.display.print(player.mCamera.position.x);
|
pokitto.display.print(player.mCamera.position.x);
|
||||||
p.display.print(" ");
|
pokitto.display.print(" ");
|
||||||
p.display.print(player.mCamera.position.y);
|
pokitto.display.print(player.mCamera.position.y);
|
||||||
p.display.print(" ");
|
pokitto.display.print(" ");
|
||||||
p.display.print(player.mCamera.direction);
|
pokitto.display.print(player.mCamera.direction);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
translaprentColor = rgbToIndex(7,0,0);
|
|
||||||
|
|
||||||
#define placeSprite(S,I,X,Y,Z,P)\
|
#define placeSprite(S,I,X,Y,Z,P)\
|
||||||
sprites[I].mImage = S;\
|
sprites[I].mImage = S;\
|
||||||
sprites[I].mPosition.x = X * UNITS_PER_SQUARE + UNITS_PER_SQUARE / 2;\
|
sprites[I].mPosition.x = X * UNITS_PER_SQUARE + UNITS_PER_SQUARE / 2;\
|
||||||
|
@ -826,21 +725,21 @@ int main()
|
||||||
|
|
||||||
#undef placeSprite
|
#undef placeSprite
|
||||||
|
|
||||||
p.begin();
|
pokitto.begin();
|
||||||
|
|
||||||
for (uint8_t r = 0; r < 8; ++r)
|
for (uint8_t r = 0; r < 8; ++r)
|
||||||
for (uint8_t g = 0; g < 8; ++g)
|
for (uint8_t g = 0; g < 8; ++g)
|
||||||
for (uint8_t b = 0; b < 4; ++b)
|
for (uint8_t b = 0; b < 4; ++b)
|
||||||
pal[rgbToIndex(r,g,b)] = p.display.RGBto565(36 * r, 36 * g, 85 * b);
|
pal[rgbToIndex(r,g,b)] = pokitto.display.RGBto565(36 * r, 36 * g, 85 * b);
|
||||||
|
|
||||||
p.display.load565Palette(&pal[0]); // load a palette the same way as any other palette in any other screen mode
|
pokitto.display.load565Palette(&pal[0]); // load a palette the same way as any other palette in any other screen mode
|
||||||
p.display.persistence = 1;
|
pokitto.display.persistence = 1;
|
||||||
p.setFrameRate(25);
|
pokitto.setFrameRate(30);
|
||||||
p.display.setFont(fontTiny);
|
pokitto.display.setFont(fontTiny);
|
||||||
|
|
||||||
while (p.isRunning())
|
while (pokitto.isRunning())
|
||||||
{
|
{
|
||||||
if (p.update())
|
if (pokitto.update())
|
||||||
{
|
{
|
||||||
draw();
|
draw();
|
||||||
|
|
||||||
|
@ -863,17 +762,17 @@ int main()
|
||||||
d.y = d.y > 0 ? step : -step;
|
d.y = d.y > 0 ? step : -step;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool strafe = p.aBtn();
|
bool strafe = pokitto.aBtn();
|
||||||
bool lookUpDown = p.cBtn();
|
bool lookUpDown = pokitto.cBtn();
|
||||||
|
|
||||||
if (p.upBtn())
|
if (pokitto.upBtn())
|
||||||
{
|
{
|
||||||
if (lookUpDown)
|
if (lookUpDown)
|
||||||
player.mCamera.shear = min(player.mCamera.shear + 10,60);
|
player.mCamera.shear = min(player.mCamera.shear + 10,60);
|
||||||
else
|
else
|
||||||
moveOffset = d;
|
moveOffset = d;
|
||||||
}
|
}
|
||||||
else if (p.downBtn())
|
else if (pokitto.downBtn())
|
||||||
{
|
{
|
||||||
if (lookUpDown)
|
if (lookUpDown)
|
||||||
player.mCamera.shear = max(player.mCamera.shear - 10,-60);
|
player.mCamera.shear = max(player.mCamera.shear - 10,-60);
|
||||||
|
@ -891,9 +790,9 @@ int main()
|
||||||
|
|
||||||
int addition = 0;
|
int addition = 0;
|
||||||
|
|
||||||
if (p.rightBtn())
|
if (pokitto.rightBtn())
|
||||||
addition = 1;
|
addition = 1;
|
||||||
else if (p.leftBtn())
|
else if (pokitto.leftBtn())
|
||||||
addition = -1;
|
addition = -1;
|
||||||
|
|
||||||
if (strafe)
|
if (strafe)
|
||||||
|
@ -917,14 +816,14 @@ int main()
|
||||||
if (heightDiff == 0)
|
if (heightDiff == 0)
|
||||||
player.mVericalSpeed = 0; // hit floor/ceiling
|
player.mVericalSpeed = 0; // hit floor/ceiling
|
||||||
|
|
||||||
if (player.mVericalSpeed == 0 && p.bBtn())
|
if (player.mVericalSpeed == 0 && pokitto.bBtn())
|
||||||
{
|
{
|
||||||
int16_t camX = divRoundDown(player.mCamera.position.x,UNITS_PER_SQUARE);
|
int16_t camX = divRoundDown(player.mCamera.position.x,UNITS_PER_SQUARE);
|
||||||
int16_t camY = divRoundDown(player.mCamera.position.y,UNITS_PER_SQUARE);
|
int16_t camY = divRoundDown(player.mCamera.position.y,UNITS_PER_SQUARE);
|
||||||
|
|
||||||
if (player.mCamera.height - CAMERA_COLL_HEIGHT_BELOW -
|
if (player.mCamera.height - CAMERA_COLL_HEIGHT_BELOW -
|
||||||
floorHeightAt(camX,camY) < 2)
|
floorHeightAt(camX,camY) < 2)
|
||||||
player.mVericalSpeed = 400; // jump
|
player.mVericalSpeed = 500; // jump
|
||||||
}
|
}
|
||||||
|
|
||||||
player.mVericalSpeed -= 80; // gravity
|
player.mVericalSpeed -= 80; // gravity
|
134
general.hpp
Normal file
134
general.hpp
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
/**
|
||||||
|
General definitions for Pokitto raycasting demos.
|
||||||
|
|
||||||
|
author: Miloslav "drummyfish" Ciz
|
||||||
|
license: CC0 1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef RAYCAST_DEMO_GENERAL_HPP
|
||||||
|
#define RAYCAST_DEMO_GENERAL_HPP
|
||||||
|
|
||||||
|
#include "stdio.h" // for debugging raycastlibg
|
||||||
|
|
||||||
|
#define VERTICAL_FOV UNITS_PER_SQUARE // redefine camera vertical FOV
|
||||||
|
|
||||||
|
#include "raycastlib.h"
|
||||||
|
#include "Pokitto.h"
|
||||||
|
|
||||||
|
Pokitto::Core pokitto;
|
||||||
|
|
||||||
|
#define SCREEN_WIDTH 110
|
||||||
|
#define SCREEN_HEIGHT 88
|
||||||
|
|
||||||
|
#define MIDDLE_ROW (SCREEN_HEIGHT / 2)
|
||||||
|
#define MIDDLE_COLUMN (SCREEN_WIDTH / 2)
|
||||||
|
|
||||||
|
#ifndef SUBSAMPLE
|
||||||
|
#define SUBSAMPLE 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SUBSAMPLED_WIDTH (SCREEN_WIDTH / SUBSAMPLE)
|
||||||
|
|
||||||
|
#define TRANSPARENT_COLOR 0b00000111
|
||||||
|
|
||||||
|
Unit zBuffer[SUBSAMPLED_WIDTH]; ///< 1D z-buffer for visibility determination.
|
||||||
|
|
||||||
|
/**
|
||||||
|
Gets (the index of) color by specified RGB components.
|
||||||
|
|
||||||
|
@param r red, 3 bits (0 to 7)
|
||||||
|
@param g green, 3 bits (0 to 7)
|
||||||
|
@param b blue, 2 bits (0 to 3)
|
||||||
|
@return palette index of the color
|
||||||
|
*/
|
||||||
|
inline uint8_t rgbToIndex(uint8_t r, uint8_t g, uint8_t b)
|
||||||
|
{
|
||||||
|
return (r & 0b00000111) | ((g & 0b00000111) << 3) | ((b & 0b00000011) << 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Adds given intensity to a color.
|
||||||
|
|
||||||
|
@param color input color
|
||||||
|
@param intensity intensity to add, 3 bit (0 to 7)
|
||||||
|
@return new color
|
||||||
|
*/
|
||||||
|
inline uint8_t addIntensity(uint8_t color, int intensity)
|
||||||
|
{
|
||||||
|
uint8_t r = color & 0b00000111;
|
||||||
|
uint8_t g = (color & 0b00111000) >> 3;
|
||||||
|
uint8_t b = (color & 0b11000000) >> 6;
|
||||||
|
|
||||||
|
if (intensity >= 0)
|
||||||
|
{
|
||||||
|
r += intensity;
|
||||||
|
r = r > 7 ? 7 : r;
|
||||||
|
|
||||||
|
g += intensity;
|
||||||
|
g = g > 7 ? 7 : g;
|
||||||
|
|
||||||
|
b += intensity / 2;
|
||||||
|
b = b > 3 ? 3 : b;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
intensity *= -1;
|
||||||
|
r = (intensity > r) ? 0 : r - intensity;
|
||||||
|
g = (intensity > g) ? 0 : g - intensity;
|
||||||
|
intensity /= 2;
|
||||||
|
b = intensity > b ? 0 : b - intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rgbToIndex(r,g,b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Samples an image by normalized coordinates - each coordinate is in range
|
||||||
|
0 to UNITS_PER_SQUARE (from raycastlib).
|
||||||
|
*/
|
||||||
|
inline uint8_t sampleImage(const unsigned char *image, Unit x, Unit y)
|
||||||
|
{
|
||||||
|
// TODO: optimize
|
||||||
|
|
||||||
|
x = wrap(x,UNITS_PER_SQUARE);
|
||||||
|
y = wrap(y,UNITS_PER_SQUARE);
|
||||||
|
|
||||||
|
int32_t index =
|
||||||
|
image[1] * ((image[1] * x) / UNITS_PER_SQUARE) + (image[0] * y) /
|
||||||
|
UNITS_PER_SQUARE;
|
||||||
|
|
||||||
|
return image[2 + index];
|
||||||
|
}
|
||||||
|
|
||||||
|
void inline drawSprite(const unsigned char *sprite, int16_t x, int16_t y, Unit depth, int16_t size)
|
||||||
|
{
|
||||||
|
// TODO: optimize
|
||||||
|
|
||||||
|
x -= size / 2;
|
||||||
|
y -= size / 2;
|
||||||
|
|
||||||
|
Unit step = UNITS_PER_SQUARE / size;
|
||||||
|
|
||||||
|
uint8_t c;
|
||||||
|
|
||||||
|
int16_t jTo = size - max(0,y + size - 88);
|
||||||
|
int16_t iTo = size - max(0,x + size - 110);
|
||||||
|
|
||||||
|
for (Unit i = max(-1 * x,0); i < iTo; ++i)
|
||||||
|
{
|
||||||
|
int16_t xPos = x + i;
|
||||||
|
|
||||||
|
if (zBuffer[xPos / SUBSAMPLE] <= depth)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (Unit j = max(-1 * y,0); j < jTo; ++j)
|
||||||
|
{
|
||||||
|
c = sampleImage(sprite,(i * UNITS_PER_SQUARE) / size,(j * UNITS_PER_SQUARE) / size);
|
||||||
|
|
||||||
|
if (c != TRANSPARENT_COLOR)
|
||||||
|
pokitto.display.drawPixel(xPos,y + j,c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue