Generate and render map walls.

linux_template
sigonasr2 2 years ago
parent 1e3567482a
commit 726a377ee7
  1. 131
      Faceball2030/main.cpp

@ -7,6 +7,13 @@ using namespace olc;
const float PI = 3.14159f;
enum Direction {
NORTH=1,
EAST=2,
SOUTH=4,
WEST=8
};
struct vec2d
{
float u = 0;
@ -119,7 +126,7 @@ private:
mesh mapMesh;
mat4x4 matProj;
vec3d vCamera = { 5,5,5 };
vec3d vCamera = { 5,0.5,5 };
vec3d vLookDir;
float zOffset = 2;
@ -621,7 +628,7 @@ private:
{0,0},
{0,0},
{0,0},
},WHITE);
}, { t.uv[0].w,t.uv[1].w,t.uv[2].w }, { t.p[0].z,t.p[1].z,t.p[2].z }, { BLACK,BLACK,BLACK });
SetDecalStructure(DecalStructure::FAN);
triRenderCount++;
}
@ -632,7 +639,7 @@ private:
}
void HandleKeys(float fElapsedTime) {
vec3d vForward = Vector_Mul(vLookDir, 20 * fElapsedTime);
vec3d vForward = Vector_Mul(vLookDir, 2 * fElapsedTime);
if (freeRoam) {
if (GetKey(olc::DOWN).bHeld) {
pitch -= 1 * fElapsedTime;
@ -661,27 +668,133 @@ private:
}
}
vi2d MAP_SIZE = { 10,2 };
void AddWall(Direction dir,vi2d gridSquare) {
if (dir & NORTH) {
map[gridSquare.y][gridSquare.x].wallN = dot;
if (gridSquare.y > 0) {
map[gridSquare.y - 1][gridSquare.x].wallS = dot;
}
}
if (dir & WEST) {
map[gridSquare.y][gridSquare.x].wallW = dot;
if (gridSquare.x > 0) {
map[gridSquare.y][gridSquare.x-1].wallE = dot;
}
}
if (dir & SOUTH) {
map[gridSquare.y][gridSquare.x].wallS = dot;
if (gridSquare.y<map.size()-1) {
map[gridSquare.y+1][gridSquare.x].wallN = dot;
}
}
if (dir & EAST) {
map[gridSquare.y][gridSquare.x].wallE = dot;
if (gridSquare.x < map[0].size() - 1) {
map[gridSquare.y][gridSquare.x+1].wallW = dot;
}
}
}
Decal* dot;
vi2d MAP_SIZE = { 10,10 };
std::vector<std::vector<MapSquare>>map;
public:
bool OnUserCreate() override
{
sAppName = "Faceball 2030";
matProj = Matrix_MakeProjection(90.0f, (float)ScreenHeight() / (float)ScreenWidth(), 0.1f, 1000.0f);
Decal* dot = new Decal(new Sprite("dot.png"));
dot = new Decal(new Sprite("dot.png"));
mapMesh.texture = dot;
for (int i = 0; i < MAP_SIZE.y; i++) {
for (int y = 0; y < MAP_SIZE.y; y++) {
std::vector<MapSquare>row;
for (int j = 0; j < MAP_SIZE.x; j++) {
for (int x = 0; x < MAP_SIZE.x; x++) {
row.push_back({});
mapMesh.tris.push_back({ {{(float)j * 10,0,(float)i * 10},{(float)j * 10,0,(float)i * 10 + 10},{(float)j * 10 + 10,0,(float)i * 10}},{{0,0},{1,0},{0,1}},Pixel{uint8_t(rand() * 255),uint8_t(rand() * 255),uint8_t(rand() * 255)} });
mapMesh.tris.push_back({ {{(float)j * 10+10,0,(float)i * 10},{(float)j * 10,0,(float)i * 10 + 10},{(float)j * 10 + 10,0,(float)i * 10+10}},{{0,0},{1,0},{0,1}},Pixel{uint8_t(rand() * 255),uint8_t(rand() * 255),uint8_t(rand() * 255)} });
mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x,0,(float)y + 1},{(float)x + 1,0,(float)y}},{{0,0},{1,0},{0,1}},BLUE });
mapMesh.tris.push_back({ {{(float)x+1,0,(float)y},{(float)x,0,(float)y + 1},{(float)x + 1,0,(float)y+1}},{{0,0},{1,0},{0,1}},BLUE });
}
map.push_back(row);
}
for (int y = 0; y < MAP_SIZE.y; y++) {
for (int x = 0; x < MAP_SIZE.x; x++) {
switch (rand() % 16) {
case 0: {//No Wall.
}break;
case 1: {//North Wall.
AddWall(NORTH,{x,y});
}break;
case 2: {//East Wall.
AddWall(EAST, { x,y });
}break;
case 3: {//South Wall.
AddWall(SOUTH, { x,y });
}break;
case 4: {//West Wall.
AddWall(WEST, { x,y });
}break;
case 5: {//NE Wall.
AddWall(Direction(NORTH|EAST), { x,y });
}break;
case 6: {
AddWall(Direction(NORTH|WEST), { x,y });
}break;
case 7: {
AddWall(Direction(SOUTH|EAST), { x,y });
}break;
case 8: {
AddWall(Direction(SOUTH|WEST), { x,y });
}break;
case 9: {
AddWall(Direction(NORTH|SOUTH), { x,y });
}break;
case 10: {
AddWall(Direction(EAST|WEST), { x,y });
}break;
case 11: {
AddWall(Direction(NORTH|WEST|EAST), { x,y });
}break;
case 12: {
AddWall(Direction(NORTH|WEST|SOUTH), { x,y });
}break;
case 13: {
AddWall(Direction(WEST|SOUTH|EAST), { x,y });
}break;
case 14: {
AddWall(Direction(SOUTH|EAST|NORTH), { x,y });
}break;
case 15: {
AddWall(Direction(SOUTH | EAST | NORTH|WEST), { x,y });
}break;
}
}
}
AddWall(Direction(SOUTH | EAST | NORTH | WEST), { 0,0 });
for (int y = 0; y < MAP_SIZE.y; y++) {
for (int x = 0; x < MAP_SIZE.x; x++) {
if (map[y][x].wallN!=NULL) {
mapMesh.tris.push_back({ {{(float)x,1,(float)y},{(float)x,0,(float)y},{(float)x + 1,1,(float)y}},{{0,0},{1,0},{0,1}},YELLOW });
mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x+1,0,(float)y},{(float)x + 1,1,(float)y}},{{0,0},{1,0},{0,1}},YELLOW });
}
if (map[y][x].wallS != NULL) {
mapMesh.tris.push_back({ {{(float)x + 1,1,(float)y+1},{(float)x,0,(float)y+1},{(float)x,1,(float)y + 1}},{{0,0},{1,0},{0,1}},DARK_RED });
mapMesh.tris.push_back({ {{(float)x + 1,1,(float)y+1},{(float)x + 1,0,(float)y+1},{(float)x,0,(float)y+1}},{{0,0},{1,0},{0,1}},DARK_RED });
}
if (map[y][x].wallW != NULL) {
mapMesh.tris.push_back({ {{(float)x,1,(float)y},{(float)x,1,(float)y+1}, {(float)x,0,(float)y + 1}},{{0,0},{1,0},{0,1}},MAGENTA });
mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x,1,(float)y}, {(float)x,0,(float)y + 1}}, {{0,0},{1,0},{0,1}},MAGENTA });
}
if (map[y][x].wallE != NULL) {
mapMesh.tris.push_back({ {{(float)x + 1,0,(float)y + 1},{(float)x+1,1,(float)y + 1},{(float)x + 1,1,(float)y}},{{0,0},{1,0},{0,1}},CYAN });
mapMesh.tris.push_back({ {{(float)x + 1,0,(float)y + 1} ,{(float)x+1,1,(float)y},{(float)x + 1,0,(float)y}},{{0,0},{1,0},{0,1}},CYAN });
}
}
}
return true;
}

Loading…
Cancel
Save