Skip to content

Commit 27908d0

Browse files
committed
[Renderer] external color
1 parent f8e72f2 commit 27908d0

3 files changed

Lines changed: 87 additions & 25 deletions

File tree

include/openminecraft/renderer/common/wrap/om_renderer_voxel.hpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,16 +378,34 @@ class OMVoxelCompilerPool
378378
bool active = true;
379379
};
380380

381+
class OMVoxelColorManager
382+
{
383+
public:
384+
virtual ~OMVoxelColorManager()
385+
{
386+
}
387+
388+
virtual auto getSkyColor() -> glm::vec3 = 0;
389+
virtual auto getSkyDiscColor() -> glm::vec3 = 0;
390+
virtual auto getSkyDiskRange() -> float = 0;
391+
virtual auto getSkyDiskHeight() -> float = 0;
392+
virtual auto getFogRange() -> glm::vec2 = 0;
393+
virtual auto getBlockTint() -> glm::vec3 = 0;
394+
virtual auto getSkyLightColor() -> glm::vec3 = 0;
395+
};
396+
381397
class OMVoxelManager
382398
{
383399
public:
384400
OMVoxelManager(OMRenderer *renderer, OMRendererRenderTarget *, OMRendererTexture *, OMRendererTexture *,
385401
std::shared_ptr<world::OMChunkManager<16>>, std::function<void()>, OMVoxelHandler *,
386-
std::function<uint32_t(uint32_t, uint64_t, uint64_t, uint64_t, int, int, int)>);
402+
std::function<uint32_t(uint32_t, uint64_t, uint64_t, uint64_t, int, int, int)>,
403+
OMVoxelColorManager *);
387404
~OMVoxelManager();
388405

389406
auto submit(OMRendererTask *, OMRendererTempTarget *) -> OMRendererTask *;
390407
auto update(basics::OMCamera &camera) -> void;
408+
auto updateColor() -> void;
391409
void bindCameraBuffer(OMRendererBuffer *);
392410

393411
OMRendererTempTarget *translucentTargetMS, *translucentTarget;
@@ -405,6 +423,7 @@ class OMVoxelManager
405423
OMRendererTexture *textureAtlas;
406424
OMRendererTexture *textureAtlasSecondary;
407425
OMRendererTempTarget *lightmap;
426+
OMVoxelColorManager *colorManager;
408427

409428
private:
410429
int samples = 4;

src/openminecraft-core/renderer/common/wrap/om_renderer_voxel_manager.cpp

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@ uint64_t cx = 0, cy = 0, cz = 0;
2727
OMVoxelManager::OMVoxelManager(OMRenderer *renderer, OMRendererRenderTarget *resolveTarget, OMRendererTexture *tex,
2828
OMRendererTexture *texSec, std::shared_ptr<world::OMChunkManager<16>> man,
2929
std::function<void()> rec, OMVoxelHandler *handler,
30-
std::function<uint32_t(uint32_t, uint64_t, uint64_t, uint64_t, int, int, int)> converter)
30+
std::function<uint32_t(uint32_t, uint64_t, uint64_t, uint64_t, int, int, int)> converter,
31+
OMVoxelColorManager *colorman)
3132
: logger("OMVoxelManager", this)
3233
{
3334
this->rec = rec;
3435
this->renderer = renderer;
3536
this->chunkManager = man;
3637
this->voxelHandler = handler;
3738
this->converter = converter;
39+
this->colorManager = colorman;
3840

3941
delete compiler.handler;
4042
compiler.handler = voxelHandler;
@@ -273,31 +275,9 @@ OMVoxelManager::OMVoxelManager(OMRenderer *renderer, OMRendererRenderTarget *res
273275
chunkoffs = renderer->allocateBuffer(UniformTexel, 3 * sizeof(float));
274276
debugoffs = renderer->allocateBuffer(VertexData, 12 * 2 * 3 * sizeof(float));
275277
skydisc = renderer->allocateBuffer(Uniform, sizeof(OMVoxelSkyDisc));
276-
OMVoxelSkyDisc disc = {{0.470, 0.654, 1.0}, 256, {0.198, 0.371, 1.0}, -16};
277-
skydisc->updateData(&disc);
278278
fogdata = renderer->allocateBuffer(Uniform, sizeof(float) * 5);
279-
std::array<float, 5> d = {0.0005, 0.0006, 0.470, 0.654, 1.0};
280-
fogdata->updateData(d.data());
281279

282280
lightmapData = renderer->allocateBuffer(Uniform, sizeof(OMVoxelLightMap));
283-
OMVoxelLightMap dayData = {
284-
1.0, // SkyFactor
285-
1.0, // BlockFactor
286-
0.0, // NightVisionFactor
287-
0.0, // DarknessScale
288-
0.0, // BossOverlayWorldDarkeningFactor
289-
1.0, // BrightnessFactor
290-
0,
291-
0,
292-
{1.0, 0.8, 0.6}, // BlockLightTint
293-
0,
294-
{1.0, 1.0, 1.0}, // SkyLightColor
295-
0,
296-
{0.01, 0.01, 0.01}, // AmbientColor
297-
0,
298-
{0.7, 0.7, 0.7} // NightVisionColor
299-
};
300-
lightmapData->updateData(&dayData);
301281

302282
textureAtlas = tex;
303283
textureAtlasSecondary = texSec;
@@ -362,6 +342,34 @@ void OMVoxelManager::unloadChunk(int i)
362342
voxelTranslucentComplexLayer->loadData(i, tcm);
363343
}
364344

345+
auto OMVoxelManager::updateColor() -> void
346+
{
347+
OMVoxelSkyDisc disc = {colorManager->getSkyDiscColor(), 256, colorManager->getSkyColor(), -16};
348+
skydisc->updateData(&disc);
349+
std::array<float, 5> d = {colorManager->getFogRange().x, colorManager->getFogRange().y, disc.diskCenterColor.r,
350+
disc.diskCenterColor.g, disc.diskCenterColor.b};
351+
fogdata->updateData(d.data());
352+
353+
OMVoxelLightMap dayData = {
354+
1.0, // SkyFactor
355+
1.0, // BlockFactor
356+
0.0, // NightVisionFactor
357+
0.0, // DarknessScale
358+
0.0, // BossOverlayWorldDarkeningFactor
359+
1.0, // BrightnessFactor
360+
0,
361+
0,
362+
colorManager->getBlockTint(), // BlockLightTint
363+
0,
364+
colorManager->getSkyLightColor(), // SkyLightColor
365+
0,
366+
{0.01, 0.01, 0.01}, // AmbientColor
367+
0,
368+
{0.7, 0.7, 0.7} // NightVisionColor
369+
};
370+
lightmapData->updateData(&dayData);
371+
}
372+
365373
auto OMVoxelManager::update(basics::OMCamera &camera) -> void
366374
{
367375
auto cc = camera.getPosRaw();
@@ -384,6 +392,8 @@ auto OMVoxelManager::update(basics::OMCamera &camera) -> void
384392
pp4 - camera.getPosRaw(), pp6 - camera.getPosRaw(), pp4 - camera.getPosRaw(), pp7 - camera.getPosRaw(),
385393
}}.data());
386394

395+
updateColor();
396+
387397
if (chunkManager->numChunks())
388398
{
389399
std::vector<glm::vec3> offs = {};

src/openminecraft/renderer/worldrenderer.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,38 @@ using namespace openminecraft::renderer::common;
2929

3030
namespace openminecraftshell::renderer
3131
{
32+
class OMWorldColorManager : public wrap::OMVoxelColorManager
33+
{
34+
auto getSkyColor() -> glm::vec3 override
35+
{
36+
return {0.198, 0.371, 1.0};
37+
}
38+
auto getSkyDiscColor() -> glm::vec3 override
39+
{
40+
return {0.470, 0.654, 1.0};
41+
}
42+
auto getSkyDiskRange() -> float override
43+
{
44+
return 256.0f;
45+
}
46+
auto getSkyDiskHeight() -> float override
47+
{
48+
return -16.0f;
49+
}
50+
auto getFogRange() -> glm::vec2 override
51+
{
52+
return {0.0005, 0.0006};
53+
}
54+
auto getBlockTint() -> glm::vec3 override
55+
{
56+
return {1.0, 0.8, 0.6};
57+
}
58+
auto getSkyLightColor() -> glm::vec3 override
59+
{
60+
return {1.0, 1.0, 1.0};
61+
}
62+
};
63+
static OMWorldColorManager *colorManager = new OMWorldColorManager;
3264
OMWorldRenderer::OMWorldRenderer(OMRenderer *renderer, std::shared_ptr<basics::OMCamera> camera,
3365
std::shared_ptr<OMChunkManager<16>> chunkManager)
3466
: OMRendererHandler(renderer), camera(std::move(camera)), logger("OMWorldRenderer", this), renderer(renderer)
@@ -80,7 +112,8 @@ OMWorldRenderer::OMWorldRenderer(OMRenderer *renderer, std::shared_ptr<basics::O
80112
uint64_t h = (cx * 16 + x) * 341873128712L + (cy * 16 + y) * 132897987541L + cz * 16 + z + 1L;
81113
h ^= h >> 16;
82114
return blockstateResolver->fetchModel(reg.block, reg.state, h);
83-
});
115+
},
116+
colorManager);
84117

85118
voxelManager->bindCameraBuffer(cameraBuffer);
86119
}

0 commit comments

Comments
 (0)