move Chunks from Level to Player
This commit is contained in:
@@ -14,15 +14,18 @@
|
||||
#include "window/Window.hpp"
|
||||
#include "world/Level.hpp"
|
||||
|
||||
BlockWrapsRenderer::BlockWrapsRenderer(const Assets& assets, const Level& level)
|
||||
: assets(assets), level(level), batch(std::make_unique<MainBatch>(1024)) {
|
||||
BlockWrapsRenderer::BlockWrapsRenderer(
|
||||
const Assets& assets, const Level& level, const Chunks& chunks
|
||||
)
|
||||
: assets(assets),
|
||||
level(level),
|
||||
chunks(chunks),
|
||||
batch(std::make_unique<MainBatch>(1024)) {
|
||||
}
|
||||
|
||||
BlockWrapsRenderer::~BlockWrapsRenderer() = default;
|
||||
|
||||
void BlockWrapsRenderer::draw(const BlockWrapper& wrapper) {
|
||||
const auto& chunks = *level.chunks;
|
||||
|
||||
auto textureRegion = util::get_texture_region(assets, wrapper.texture, "");
|
||||
|
||||
auto& shader = assets.require<Shader>("entity");
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
class Assets;
|
||||
class Player;
|
||||
class Level;
|
||||
class Chunks;
|
||||
class DrawContext;
|
||||
|
||||
struct BlockWrapper {
|
||||
@@ -20,6 +21,7 @@ struct BlockWrapper {
|
||||
class BlockWrapsRenderer {
|
||||
const Assets& assets;
|
||||
const Level& level;
|
||||
const Chunks& chunks;
|
||||
std::unique_ptr<MainBatch> batch;
|
||||
|
||||
std::unordered_map<u64id_t, std::unique_ptr<BlockWrapper>> wrappers;
|
||||
@@ -27,7 +29,9 @@ class BlockWrapsRenderer {
|
||||
|
||||
void draw(const BlockWrapper& wrapper);
|
||||
public:
|
||||
BlockWrapsRenderer(const Assets& assets, const Level& level);
|
||||
BlockWrapsRenderer(
|
||||
const Assets& assets, const Level& level, const Chunks& chunks
|
||||
);
|
||||
~BlockWrapsRenderer();
|
||||
|
||||
void draw(const DrawContext& ctx, const Player& player);
|
||||
|
||||
@@ -20,19 +20,22 @@ size_t ChunksRenderer::visibleChunks = 0;
|
||||
|
||||
class RendererWorker : public util::Worker<std::shared_ptr<Chunk>, RendererResult> {
|
||||
const Level& level;
|
||||
const Chunks& chunks;
|
||||
BlocksRenderer renderer;
|
||||
public:
|
||||
RendererWorker(
|
||||
const Level& level,
|
||||
const Chunks& chunks,
|
||||
const ContentGfxCache& cache,
|
||||
const EngineSettings& settings
|
||||
) : level(level),
|
||||
) : level(level),
|
||||
chunks(chunks),
|
||||
renderer(settings.graphics.chunkMaxVertices.get(),
|
||||
*level.content, cache, settings)
|
||||
{}
|
||||
|
||||
RendererResult operator()(const std::shared_ptr<Chunk>& chunk) override {
|
||||
renderer.build(chunk.get(), level.chunks.get());
|
||||
renderer.build(chunk.get(), &chunks);
|
||||
if (renderer.isCancelled()) {
|
||||
return RendererResult {
|
||||
glm::ivec2(chunk->x, chunk->z), true, MeshData()};
|
||||
@@ -44,29 +47,36 @@ public:
|
||||
};
|
||||
|
||||
ChunksRenderer::ChunksRenderer(
|
||||
const Level* level,
|
||||
const Level* level,
|
||||
const Chunks& chunks,
|
||||
const Assets& assets,
|
||||
const Frustum& frustum,
|
||||
const ContentGfxCache& cache,
|
||||
const ContentGfxCache& cache,
|
||||
const EngineSettings& settings
|
||||
) : level(*level),
|
||||
assets(assets),
|
||||
frustum(frustum),
|
||||
settings(settings),
|
||||
threadPool(
|
||||
"chunks-render-pool",
|
||||
[&](){return std::make_shared<RendererWorker>(*level, cache, settings);},
|
||||
[&](RendererResult& result){
|
||||
if (!result.cancelled) {
|
||||
auto meshData = std::move(result.meshData);
|
||||
meshes[result.key] = ChunkMesh {
|
||||
std::make_unique<Mesh>(meshData.mesh),
|
||||
std::move(meshData.sortingMesh)
|
||||
};
|
||||
}
|
||||
inwork.erase(result.key);
|
||||
}, settings.graphics.chunkMaxRenderers.get())
|
||||
{
|
||||
)
|
||||
: level(*level),
|
||||
chunks(chunks),
|
||||
assets(assets),
|
||||
frustum(frustum),
|
||||
settings(settings),
|
||||
threadPool(
|
||||
"chunks-render-pool",
|
||||
[&]() {
|
||||
return std::make_shared<RendererWorker>(
|
||||
*level, chunks, cache, settings
|
||||
);
|
||||
},
|
||||
[&](RendererResult& result) {
|
||||
if (!result.cancelled) {
|
||||
auto meshData = std::move(result.meshData);
|
||||
meshes[result.key] = ChunkMesh {
|
||||
std::make_unique<Mesh>(meshData.mesh),
|
||||
std::move(meshData.sortingMesh)};
|
||||
}
|
||||
inwork.erase(result.key);
|
||||
},
|
||||
settings.graphics.chunkMaxRenderers.get()
|
||||
) {
|
||||
threadPool.setStopOnFail(false);
|
||||
renderer = std::make_unique<BlocksRenderer>(
|
||||
settings.graphics.chunkMaxVertices.get(),
|
||||
@@ -83,7 +93,7 @@ const Mesh* ChunksRenderer::render(
|
||||
) {
|
||||
chunk->flags.modified = false;
|
||||
if (important) {
|
||||
auto mesh = renderer->render(chunk.get(), level.chunks.get());
|
||||
auto mesh = renderer->render(chunk.get(), &chunks);
|
||||
meshes[glm::ivec2(chunk->x, chunk->z)] = ChunkMesh {
|
||||
std::move(mesh.mesh), std::move(mesh.sortingMeshData)
|
||||
};
|
||||
@@ -131,7 +141,7 @@ void ChunksRenderer::update() {
|
||||
const Mesh* ChunksRenderer::retrieveChunk(
|
||||
size_t index, const Camera& camera, Shader& shader, bool culling
|
||||
) {
|
||||
auto chunk = level.chunks->getChunks()[index];
|
||||
auto chunk = chunks.getChunks()[index];
|
||||
if (chunk == nullptr || !chunk->flags.lighted) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -163,7 +173,6 @@ const Mesh* ChunksRenderer::retrieveChunk(
|
||||
void ChunksRenderer::drawChunks(
|
||||
const Camera& camera, Shader& shader
|
||||
) {
|
||||
const auto& chunks = *level.chunks;
|
||||
const auto& atlas = assets.require<Atlas>("blocks");
|
||||
|
||||
atlas.getTexture()->bind();
|
||||
@@ -232,7 +241,7 @@ void ChunksRenderer::drawSortedMeshes(const Camera& camera, Shader& shader) {
|
||||
frameid++;
|
||||
|
||||
bool culling = settings.graphics.frustumCulling.get();
|
||||
const auto& chunks = level.chunks->getChunks();
|
||||
const auto& chunks = this->chunks.getChunks();
|
||||
const auto& cameraPos = camera.position;
|
||||
const auto& atlas = assets.require<Atlas>("blocks");
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ class Level;
|
||||
class Camera;
|
||||
class Shader;
|
||||
class Assets;
|
||||
class Chunks;
|
||||
class Frustum;
|
||||
class BlocksRenderer;
|
||||
class ContentGfxCache;
|
||||
@@ -42,6 +43,7 @@ struct RendererResult {
|
||||
|
||||
class ChunksRenderer {
|
||||
const Level& level;
|
||||
const Chunks& chunks;
|
||||
const Assets& assets;
|
||||
const Frustum& frustum;
|
||||
const EngineSettings& settings;
|
||||
@@ -57,6 +59,7 @@ class ChunksRenderer {
|
||||
public:
|
||||
ChunksRenderer(
|
||||
const Level* level,
|
||||
const Chunks& chunks,
|
||||
const Assets& assets,
|
||||
const Frustum& frustum,
|
||||
const ContentGfxCache& cache,
|
||||
|
||||
@@ -85,7 +85,7 @@ void Decorator::update(
|
||||
int index = currentIndex;
|
||||
currentIndex = (currentIndex + BIG_PRIME) % UPDATE_BLOCKS;
|
||||
|
||||
const auto& chunks = *level.chunks;
|
||||
const auto& chunks = *player.chunks;
|
||||
const auto& indices = *level.content->getIndices();
|
||||
|
||||
int lx = index % UPDATE_AREA_DIAMETER;
|
||||
@@ -108,7 +108,7 @@ void Decorator::update(float delta, const Camera& camera) {
|
||||
for (int i = 0; i < ITERATIONS; i++) {
|
||||
update(delta, pos, camera.position);
|
||||
}
|
||||
const auto& chunks = *level.chunks;
|
||||
const auto& chunks = *player.chunks;
|
||||
const auto& indices = *level.content->getIndices();
|
||||
auto iter = blockEmitters.begin();
|
||||
while (iter != blockEmitters.end()) {
|
||||
|
||||
@@ -16,12 +16,17 @@ size_t ParticlesRenderer::visibleParticles = 0;
|
||||
size_t ParticlesRenderer::aliveEmitters = 0;
|
||||
|
||||
ParticlesRenderer::ParticlesRenderer(
|
||||
const Assets& assets, const Level& level, const GraphicsSettings* settings
|
||||
const Assets& assets,
|
||||
const Level& level,
|
||||
const Chunks& chunks,
|
||||
const GraphicsSettings* settings
|
||||
)
|
||||
: batch(std::make_unique<MainBatch>(4096)),
|
||||
level(level),
|
||||
chunks(chunks),
|
||||
assets(assets),
|
||||
settings(settings) {}
|
||||
settings(settings) {
|
||||
}
|
||||
|
||||
ParticlesRenderer::~ParticlesRenderer() = default;
|
||||
|
||||
@@ -44,7 +49,6 @@ void ParticlesRenderer::renderParticles(const Camera& camera, float delta) {
|
||||
const auto& right = camera.right;
|
||||
const auto& up = camera.up;
|
||||
|
||||
const auto& chunks = *level.chunks;
|
||||
bool backlight = settings->backlight.get();
|
||||
|
||||
std::vector<const Texture*> unusedTextures;
|
||||
|
||||
@@ -10,12 +10,14 @@
|
||||
class Texture;
|
||||
class Assets;
|
||||
class Camera;
|
||||
class Chunks;
|
||||
class MainBatch;
|
||||
class Level;
|
||||
struct GraphicsSettings;
|
||||
|
||||
class ParticlesRenderer {
|
||||
const Level& level;
|
||||
const Chunks& chunks;
|
||||
const Assets& assets;
|
||||
const GraphicsSettings* settings;
|
||||
std::unordered_map<const Texture*, std::vector<Particle>> particles;
|
||||
@@ -29,6 +31,7 @@ public:
|
||||
ParticlesRenderer(
|
||||
const Assets& assets,
|
||||
const Level& level,
|
||||
const Chunks& chunks,
|
||||
const GraphicsSettings* settings
|
||||
);
|
||||
~ParticlesRenderer();
|
||||
|
||||
@@ -68,21 +68,24 @@ WorldRenderer::WorldRenderer(
|
||||
lineBatch(std::make_unique<LineBatch>()),
|
||||
batch3d(std::make_unique<Batch3D>(BATCH3D_CAPACITY)),
|
||||
modelBatch(std::make_unique<ModelBatch>(
|
||||
MODEL_BATCH_CAPACITY, assets, *level.chunks, engine->getSettings()
|
||||
MODEL_BATCH_CAPACITY, assets, *player->chunks, engine->getSettings()
|
||||
)),
|
||||
particles(std::make_unique<ParticlesRenderer>(
|
||||
assets, level, &engine->getSettings().graphics
|
||||
assets, level, *player->chunks, &engine->getSettings().graphics
|
||||
)),
|
||||
texts(std::make_unique<TextsRenderer>(*batch3d, assets, *frustumCulling)),
|
||||
guides(std::make_unique<GuidesRenderer>()),
|
||||
chunks(std::make_unique<ChunksRenderer>(
|
||||
&level,
|
||||
*player->chunks,
|
||||
assets,
|
||||
*frustumCulling,
|
||||
frontend.getContentGfxCache(),
|
||||
engine->getSettings()
|
||||
)),
|
||||
blockWraps(std::make_unique<BlockWrapsRenderer>(assets, level)) {
|
||||
blockWraps(
|
||||
std::make_unique<BlockWrapsRenderer>(assets, level, *player->chunks)
|
||||
) {
|
||||
auto& settings = engine->getSettings();
|
||||
level.events->listen(
|
||||
EVT_CHUNK_HIDDEN,
|
||||
@@ -362,7 +365,7 @@ void WorldRenderer::renderBlockOverlay(const DrawContext& wctx) {
|
||||
int x = std::floor(player->currentCamera->position.x);
|
||||
int y = std::floor(player->currentCamera->position.y);
|
||||
int z = std::floor(player->currentCamera->position.z);
|
||||
auto block = level.chunks->get(x, y, z);
|
||||
auto block = player->chunks->get(x, y, z);
|
||||
if (block && block->id) {
|
||||
const auto& def =
|
||||
level.content->getIndices()->blocks.require(block->id);
|
||||
@@ -381,7 +384,7 @@ void WorldRenderer::renderBlockOverlay(const DrawContext& wctx) {
|
||||
batch3d->begin();
|
||||
shader.uniformMatrix("u_projview", glm::mat4(1.0f));
|
||||
shader.uniformMatrix("u_apply", glm::mat4(1.0f));
|
||||
auto light = level.chunks->getLight(x, y, z);
|
||||
auto light = player->chunks->getLight(x, y, z);
|
||||
float s = Lightmap::extract(light, 3) / 15.0f;
|
||||
glm::vec4 tint(
|
||||
glm::min(1.0f, Lightmap::extract(light, 0) / 15.0f + s),
|
||||
|
||||
Reference in New Issue
Block a user