Merge pull request #813 from clasher113/main

bug fix
This commit is contained in:
MihailRis 2026-03-16 21:45:59 +03:00 • committed by GitHub
commit 5502c2e7ad
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 75 additions and 35 deletions

View file

@ -8,18 +8,16 @@
#include "graphics/core/DrawContext.hpp"
#include "graphics/render/MainBatch.hpp"
#include "lighting/Lightmap.hpp"
#include "objects/Player.hpp"
#include "voxels/Block.hpp"
#include "voxels/Chunks.hpp"
#include "world/Level.hpp"
#include <algorithm>
BlockWrapsRenderer::BlockWrapsRenderer(
const Assets& assets, const Level& level, const Chunks& chunks
const Assets& assets, const Content& content, const Chunks& chunks
)
: assets(assets),
level(level),
content(content),
chunks(chunks),
batch(std::make_unique<MainBatch>(1024)) {
}
@ -43,16 +41,14 @@ void BlockWrapsRenderer::draw(BlockWrapper& wrapper, const Texture* texture) {
}
const voxel* vox = chunks.get(wrapper.position);
if (vox == nullptr || vox->id == BLOCK_VOID) {
if (vox == nullptr || vox->id == BLOCK_AIR) {
return;
}
// one frame can be invalid due to texture change but ok
const auto& def =
level.content.getIndices()->blocks.require(vox->id);
const auto& def = content.getIndices()->blocks.require(vox->id);
if (wrapper.modelType != def.getModel(vox->state.userbits).type) {
wrapper.dirtySides = 0xFF;
refreshWrapper(wrapper);
}
glm::vec4 light(1, 1, 1, 0);
if (wrapper.emission < 1.0f) {
@ -95,6 +91,8 @@ void BlockWrapsRenderer::draw(BlockWrapper& wrapper, const Texture* texture) {
}
void BlockWrapsRenderer::refreshWrapper(BlockWrapper& wrapper) {
clearOrder(&wrapper);
for (int i = 0; i < 6; i++) {
if ((wrapper.cullingBits & (1 << i)) == 0) {
continue;
@ -104,15 +102,22 @@ void BlockWrapsRenderer::refreshWrapper(BlockWrapper& wrapper) {
wrapper.texRegions[i] = texRegion;
wrapper.uvRegions[i] = texRegion.region;
renderOrder.insert({texRegion.texture, &wrapper});
auto range = renderOrder.equal_range(texRegion.texture);
auto it =
std::find_if(range.first, range.second, [&wrapper](auto& elem) {
return elem.second == &wrapper;
});
if (it == range.second) {
renderOrder.emplace(texRegion.texture, &wrapper);
}
}
wrapper.dirtySides = 0x0;
const voxel* vox = chunks.get(wrapper.position);
if (vox == nullptr || vox->id == BLOCK_VOID) {
if (vox == nullptr || vox->id == BLOCK_AIR) {
return;
}
const auto& def = level.content.getIndices()->blocks.require(vox->id);
const auto& def = content.getIndices()->blocks.require(vox->id);
wrapper.modelType = def.getModel(vox->state.userbits).type;
switch (wrapper.modelType) {
case BlockModelType::AABB: {
@ -133,7 +138,7 @@ void BlockWrapsRenderer::refreshWrapper(BlockWrapper& wrapper) {
}
}
void BlockWrapsRenderer::draw(const DrawContext& pctx, const Player& player) {
void BlockWrapsRenderer::draw(const DrawContext& pctx) {
auto ctx = pctx.sub();
auto& shader = assets.require<Shader>("entity");
@ -145,7 +150,6 @@ void BlockWrapsRenderer::draw(const DrawContext& pctx, const Player& player) {
refreshWrapper(*wrapper);
}
}
for (const auto& [texture, wrapper] : renderOrder) {
batch->setTexture(texture);
draw(*wrapper, texture);
@ -181,15 +185,17 @@ void BlockWrapsRenderer::remove(u64id_t id) {
if (found == wrappers.end()) {
return;
}
auto wrapper = std::move(found->second);
clearOrder(found->second.get());
wrappers.erase(id);
}
void BlockWrapsRenderer::clearOrder(const BlockWrapper* const wrapper) {
auto it = renderOrder.begin();
while (it != renderOrder.end()) {
if (it->second == wrapper.get()) {
if (it->second == wrapper) {
it = renderOrder.erase(it);
} else {
++it;
}
}
}
}

View file

@ -10,12 +10,9 @@
#include <memory>
#include <unordered_map>
#include <map>
#include <glm/vec4.hpp>
class Assets;
class Player;
class Level;
struct voxel;
class Content;
class Chunks;
class Texture;
class DrawContext;
@ -36,7 +33,7 @@ struct BlockWrapper {
class BlockWrapsRenderer {
const Assets& assets;
const Level& level;
const Content& content;
const Chunks& chunks;
std::unique_ptr<MainBatch> batch;
@ -47,13 +44,14 @@ class BlockWrapsRenderer {
void draw(BlockWrapper& wrapper, const Texture* texture);
void refreshWrapper(BlockWrapper& wrapper);
void clearOrder(const BlockWrapper* const wrapper);
public:
BlockWrapsRenderer(
const Assets& assets, const Level& level, const Chunks& chunks
const Assets& assets, const Content& content, const Chunks& chunks
);
~BlockWrapsRenderer();
void draw(const DrawContext& ctx, const Player& player);
void draw(const DrawContext& ctx);
u64id_t add(
const glm::ivec3& position,

View file

@ -94,9 +94,9 @@ WorldRenderer::WorldRenderer(
assets, level, *player.chunks, engine.getSettings().graphics
)),
texts(std::make_unique<TextsRenderer>(*batch3d, assets, *frustumCulling)),
blockWraps(
std::make_unique<BlockWrapsRenderer>(assets, level, *player.chunks)
) {
blockWraps(std::make_unique<BlockWrapsRenderer>(
assets, level.content, *player.chunks
)) {
auto& settings = engine.getSettings();
level.events->listen(
LevelEventType::CHUNK_HIDDEN,
@ -214,7 +214,7 @@ void WorldRenderer::renderOpaque(
setupWorldShader(shader, camera, settings, fogFactor);
chunksRenderer->drawChunks(camera, shader);
blockWraps->draw(ctx, player);
blockWraps->draw(ctx);
int cloudsQuality = settings.graphics.cloudsQuality.get();
if (cloudsQuality > 0) {