Compare commits
4 commits
e234dda860
...
940c1d706b
Author | SHA1 | Date | |
---|---|---|---|
940c1d706b | |||
41437cd259 | |||
66ec111f5d | |||
43970df494 |
6 changed files with 374 additions and 363 deletions
50
World.cpp
50
World.cpp
|
@ -107,6 +107,9 @@ float World::castRay(float originX, float originY, float orientation) const
|
||||||
* the grid for the other one
|
* the grid for the other one
|
||||||
* - Depending on the orientation, signs must be taken into account
|
* - Depending on the orientation, signs must be taken into account
|
||||||
* to work 360°
|
* to work 360°
|
||||||
|
* - Those formulas consider regular axes (x→,y↑), however the world is
|
||||||
|
* built around left-handed axes (x→,y↓), so the rendered world is
|
||||||
|
* mirrored. This also explains some weird signs for rotations.
|
||||||
*/
|
*/
|
||||||
/* Offsets to get back on the grid from the ray's origin. */
|
/* Offsets to get back on the grid from the ray's origin. */
|
||||||
float hOffsetX;
|
float hOffsetX;
|
||||||
|
@ -148,7 +151,7 @@ float World::castRay(float originX, float originY, float orientation) const
|
||||||
if (orientation < 180) {
|
if (orientation < 180) {
|
||||||
vOffsetX = ceilf(originX);
|
vOffsetX = ceilf(originX);
|
||||||
vOffsetY = ceilf(originX) - originX;
|
vOffsetY = ceilf(originX) - originX;
|
||||||
vDir = +1;
|
vDir = 1;
|
||||||
vRound = 0;
|
vRound = 0;
|
||||||
} else {
|
} else {
|
||||||
vOffsetX = floorf(originX);
|
vOffsetX = floorf(originX);
|
||||||
|
@ -239,6 +242,8 @@ void World::render(sf::RenderWindow& window) const
|
||||||
window.draw(ground);
|
window.draw(ground);
|
||||||
window.draw(ceiling);
|
window.draw(ceiling);
|
||||||
|
|
||||||
|
const float worldToCamera = (player.focalLength*2)/player.sensorSize;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Throw rays and draw walls over the ceiling and ground.
|
* Throw rays and draw walls over the ceiling and ground.
|
||||||
* Only throws in the plane, which doesn't work for levels/3D.
|
* Only throws in the plane, which doesn't work for levels/3D.
|
||||||
|
@ -252,7 +257,7 @@ void World::render(sf::RenderWindow& window) const
|
||||||
} else if (rayAngle > 360) {
|
} else if (rayAngle > 360) {
|
||||||
rayAngle -= 360;
|
rayAngle -= 360;
|
||||||
}
|
}
|
||||||
float obstacleScale = player.focalLength*2/(castRay(player.x, player.y, rayAngle)*player.sensorSize);
|
float obstacleScale = worldToCamera / castRay(player.x, player.y, rayAngle);
|
||||||
/* 2 Is wall height in meters. */
|
/* 2 Is wall height in meters. */
|
||||||
fillColumn(window, i, obstacleScale);
|
fillColumn(window, i, obstacleScale);
|
||||||
}
|
}
|
||||||
|
@ -269,7 +274,7 @@ void World::step(const float& stepTime) {
|
||||||
player.rotate(player.currentRotationSpeed*stepTime);
|
player.rotate(player.currentRotationSpeed*stepTime);
|
||||||
|
|
||||||
#ifdef IMGUI
|
#ifdef IMGUI
|
||||||
ImGui::Begin("MapEdit");
|
if (ImGui::Begin("MapEdit")) {
|
||||||
static int blockToPlace = 1;
|
static int blockToPlace = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -277,27 +282,27 @@ void World::step(const float& stepTime) {
|
||||||
* Dear ImGui layout an allows adding things on the side.
|
* Dear ImGui layout an allows adding things on the side.
|
||||||
*/
|
*/
|
||||||
ImGui::BeginGroup();
|
ImGui::BeginGroup();
|
||||||
for (int y = 0 ; y < h ; y++) {
|
for (int y = 0; y < h; y++) {
|
||||||
for (int x = 0 ; x < w ; x++) {
|
for (int x = 0; x < w; x++) {
|
||||||
ImGui::PushID(x + y*w);
|
ImGui::PushID(x + y * w);
|
||||||
if (x > 0)
|
if (x > 0)
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
BlockType currentBlock = map[x + w*y];
|
BlockType currentBlock = map[x + w * y];
|
||||||
|
|
||||||
ImVec4 hoverColor;
|
ImVec4 hoverColor;
|
||||||
switch ((BlockType)blockToPlace) {
|
switch ((BlockType) blockToPlace) {
|
||||||
case BlockType::WALL:
|
case BlockType::WALL:
|
||||||
hoverColor = (ImVec4)Colors::Wall;
|
hoverColor = (ImVec4) Colors::Wall;
|
||||||
break;
|
break;
|
||||||
case BlockType::DOOR:
|
case BlockType::DOOR:
|
||||||
hoverColor = (ImVec4)Colors::Door;
|
hoverColor = (ImVec4) Colors::Door;
|
||||||
break;
|
break;
|
||||||
case BlockType::WINDOW:
|
case BlockType::WINDOW:
|
||||||
hoverColor = (ImVec4)Colors::Window;
|
hoverColor = (ImVec4) Colors::Window;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Default header color, it seems ? */
|
/* Default header color, it seems ? */
|
||||||
hoverColor = (ImVec4)ImColor(188, 120, 32);
|
hoverColor = (ImVec4) ImColor(188, 120, 32);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ImGui::PushStyleColor(ImGuiCol_HeaderHovered, hoverColor);
|
ImGui::PushStyleColor(ImGuiCol_HeaderHovered, hoverColor);
|
||||||
|
@ -305,22 +310,23 @@ void World::step(const float& stepTime) {
|
||||||
ImVec4 blockColor;
|
ImVec4 blockColor;
|
||||||
switch (currentBlock) {
|
switch (currentBlock) {
|
||||||
case BlockType::WALL:
|
case BlockType::WALL:
|
||||||
blockColor = (ImVec4)Colors::Wall;
|
blockColor = (ImVec4) Colors::Wall;
|
||||||
break;
|
break;
|
||||||
case BlockType::DOOR:
|
case BlockType::DOOR:
|
||||||
blockColor = (ImVec4)Colors::Door;
|
blockColor = (ImVec4) Colors::Door;
|
||||||
break;
|
break;
|
||||||
case BlockType::WINDOW:
|
case BlockType::WINDOW:
|
||||||
blockColor = (ImVec4)Colors::Window;
|
blockColor = (ImVec4) Colors::Window;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
blockColor = (ImVec4)ImColor(188, 120, 32);
|
blockColor = (ImVec4) ImColor(188, 120, 32);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ImGui::PushStyleColor(ImGuiCol_Header, blockColor);
|
ImGui::PushStyleColor(ImGuiCol_Header, blockColor);
|
||||||
|
|
||||||
if(ImGui::Selectable("", currentBlock != BlockType::AIR, 0, ImVec2(10, 10))) {
|
if (ImGui::Selectable("", currentBlock != BlockType::AIR, 0, ImVec2(10, 10))) {
|
||||||
map[x + w*y] = currentBlock == (BlockType)blockToPlace ? BlockType::AIR : (BlockType)blockToPlace;
|
map[x + w * y] =
|
||||||
|
currentBlock == (BlockType) blockToPlace ? BlockType::AIR : (BlockType) blockToPlace;
|
||||||
}
|
}
|
||||||
ImGui::PopStyleColor(2);
|
ImGui::PopStyleColor(2);
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
|
@ -332,12 +338,12 @@ void World::step(const float& stepTime) {
|
||||||
ImGui::BeginGroup();
|
ImGui::BeginGroup();
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
ImGui::Text("Place :");
|
ImGui::Text("Place :");
|
||||||
ImGui::RadioButton("Wall", &blockToPlace, (int)BlockType::WALL);
|
ImGui::RadioButton("Wall", &blockToPlace, (int) BlockType::WALL);
|
||||||
ImGui::RadioButton("Door", &blockToPlace, (int)BlockType::DOOR);
|
ImGui::RadioButton("Door", &blockToPlace, (int) BlockType::DOOR);
|
||||||
ImGui::RadioButton("Window", &blockToPlace, (int)BlockType::WINDOW);
|
ImGui::RadioButton("Window", &blockToPlace, (int) BlockType::WINDOW);
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
ImGui::EndGroup();
|
ImGui::EndGroup();
|
||||||
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
7
main.cpp
7
main.cpp
|
@ -115,7 +115,12 @@ int main()
|
||||||
ImGui::SetNextWindowBgAlpha(0.2f);
|
ImGui::SetNextWindowBgAlpha(0.2f);
|
||||||
ImGui::Begin("FPS", nullptr ,window_flags);
|
ImGui::Begin("FPS", nullptr ,window_flags);
|
||||||
if (fpsDataClock.getElapsedTime().asMilliseconds() > 20) {
|
if (fpsDataClock.getElapsedTime().asMilliseconds() > 20) {
|
||||||
frameTimings[frameCount%100] = static_cast<float>(deltaT.asMicroseconds());
|
if (frameCount >= 100) {
|
||||||
|
memmove(frameTimings, frameTimings + 1, 99 * sizeof(float));
|
||||||
|
frameTimings[99] = static_cast<float>(deltaT.asMicroseconds());
|
||||||
|
} else [[unlikely]] {
|
||||||
|
frameTimings[frameCount] = static_cast<float>(deltaT.asMicroseconds());
|
||||||
|
}
|
||||||
frameCount++;
|
frameCount++;
|
||||||
fpsDataClock.restart();
|
fpsDataClock.restart();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue