inventory regions, minor refactor
This commit is contained in:
@@ -22,7 +22,7 @@ void LightSolver::add(int x, int y, int z, int emission) {
|
||||
|
||||
Chunk* chunk = chunks->getChunkByVoxel(x, y, z);
|
||||
chunk->setModified(true);
|
||||
chunk->lightmap->set(x-chunk->x*CHUNK_W, y, z-chunk->z*CHUNK_D, channel, emission);
|
||||
chunk->lightmap.set(x-chunk->x*CHUNK_W, y, z-chunk->z*CHUNK_D, channel, emission);
|
||||
}
|
||||
|
||||
void LightSolver::add(int x, int y, int z) {
|
||||
@@ -35,12 +35,12 @@ void LightSolver::remove(int x, int y, int z) {
|
||||
if (chunk == nullptr)
|
||||
return;
|
||||
|
||||
ubyte light = chunk->lightmap->get(x-chunk->x*CHUNK_W, y, z-chunk->z*CHUNK_D, channel);
|
||||
ubyte light = chunk->lightmap.get(x-chunk->x*CHUNK_W, y, z-chunk->z*CHUNK_D, channel);
|
||||
if (light == 0){
|
||||
return;
|
||||
}
|
||||
remqueue.push(lightentry {x, y, z, light});
|
||||
chunk->lightmap->set(x-chunk->x*CHUNK_W, y, z-chunk->z*CHUNK_D, channel, 0);
|
||||
chunk->lightmap.set(x-chunk->x*CHUNK_W, y, z-chunk->z*CHUNK_D, channel, 0);
|
||||
}
|
||||
|
||||
void LightSolver::solve(){
|
||||
@@ -67,10 +67,10 @@ void LightSolver::solve(){
|
||||
int lz = z - chunk->z * CHUNK_D;
|
||||
chunk->setModified(true);
|
||||
|
||||
ubyte light = chunk->lightmap->get(lx,y,lz, channel);
|
||||
ubyte light = chunk->lightmap.get(lx,y,lz, channel);
|
||||
if (light != 0 && light == entry.light-1){
|
||||
remqueue.push(lightentry {x, y, z, light});
|
||||
chunk->lightmap->set(lx, y, lz, channel, 0);
|
||||
chunk->lightmap.set(lx, y, lz, channel, 0);
|
||||
}
|
||||
else if (light >= entry.light){
|
||||
addqueue.push(lightentry {x, y, z, light});
|
||||
@@ -94,11 +94,11 @@ void LightSolver::solve(){
|
||||
int lz = z - chunk->z * CHUNK_D;
|
||||
chunk->setModified(true);
|
||||
|
||||
ubyte light = chunk->lightmap->get(lx, y, lz, channel);
|
||||
ubyte light = chunk->lightmap.get(lx, y, lz, channel);
|
||||
voxel& v = chunk->voxels[vox_index(lx, y, lz)];
|
||||
const Block* block = blockDefs[v.id];
|
||||
if (block->lightPassing && light+2 <= entry.light){
|
||||
chunk->lightmap->set(
|
||||
chunk->lightmap.set(
|
||||
x-chunk->x*CHUNK_W, y, z-chunk->z*CHUNK_D,
|
||||
channel,
|
||||
entry.light-1);
|
||||
|
||||
@@ -29,9 +29,9 @@ void Lighting::clear(){
|
||||
auto chunk = chunks->chunks[index];
|
||||
if (chunk == nullptr)
|
||||
continue;
|
||||
Lightmap* lightmap = chunk->lightmap;
|
||||
Lightmap& lightmap = chunk->lightmap;
|
||||
for (int i = 0; i < CHUNK_VOL; i++){
|
||||
lightmap->map[i] = 0;
|
||||
lightmap.map[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -51,13 +51,13 @@ void Lighting::prebuildSkyLight(Chunk* chunk, const ContentIndices* indices){
|
||||
highestPoint = y;
|
||||
break;
|
||||
}
|
||||
chunk->lightmap->setS(x,y,z, 15);
|
||||
chunk->lightmap.setS(x,y,z, 15);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (highestPoint < CHUNK_H-1)
|
||||
highestPoint++;
|
||||
chunk->lightmap->highestPoint = highestPoint;
|
||||
chunk->lightmap.highestPoint = highestPoint;
|
||||
}
|
||||
|
||||
void Lighting::buildSkyLight(int cx, int cz){
|
||||
@@ -66,13 +66,13 @@ void Lighting::buildSkyLight(int cx, int cz){
|
||||
Chunk* chunk = chunks->getChunk(cx, cz);
|
||||
for (int z = 0; z < CHUNK_D; z++){
|
||||
for (int x = 0; x < CHUNK_W; x++){
|
||||
for (int y = chunk->lightmap->highestPoint; y >= 0; y--){
|
||||
for (int y = chunk->lightmap.highestPoint; y >= 0; y--){
|
||||
int gx = x + cx * CHUNK_W;
|
||||
int gz = z + cz * CHUNK_D;
|
||||
while (y > 0 && !blockDefs[chunk->voxels[vox_index(x, y, z)].id]->lightPassing) {
|
||||
y--;
|
||||
}
|
||||
if (chunk->lightmap->getS(x, y, z) != 15) {
|
||||
if (chunk->lightmap.getS(x, y, z) != 15) {
|
||||
solverS->add(gx,y+1,gz);
|
||||
for (; y >= 0; y--){
|
||||
solverS->add(gx+1,y,gz);
|
||||
@@ -99,7 +99,7 @@ void Lighting::onChunkLoaded(int cx, int cz, bool expand){
|
||||
for (uint y = 0; y < CHUNK_H; y++){
|
||||
for (uint z = 0; z < CHUNK_D; z++){
|
||||
for (uint x = 0; x < CHUNK_W; x++){
|
||||
voxel& vox = chunk->voxels[(y * CHUNK_D + z) * CHUNK_W + x];
|
||||
const voxel& vox = chunk->voxels[(y * CHUNK_D + z) * CHUNK_W + x];
|
||||
const Block* block = blockDefs[vox.id];
|
||||
int gx = x + cx * CHUNK_W;
|
||||
int gz = z + cz * CHUNK_D;
|
||||
@@ -118,7 +118,7 @@ void Lighting::onChunkLoaded(int cx, int cz, bool expand){
|
||||
for (int z = 0; z < CHUNK_D; z++) {
|
||||
int gx = x + cx * CHUNK_W;
|
||||
int gz = z + cz * CHUNK_D;
|
||||
int rgbs = chunk->lightmap->get(x, y, z);
|
||||
int rgbs = chunk->lightmap.get(x, y, z);
|
||||
if (rgbs){
|
||||
solverR->add(gx,y,gz, Lightmap::extract(rgbs, 0));
|
||||
solverG->add(gx,y,gz, Lightmap::extract(rgbs, 1));
|
||||
@@ -133,7 +133,7 @@ void Lighting::onChunkLoaded(int cx, int cz, bool expand){
|
||||
for (int x = 0; x < CHUNK_W; x++) {
|
||||
int gx = x + cx * CHUNK_W;
|
||||
int gz = z + cz * CHUNK_D;
|
||||
int rgbs = chunk->lightmap->get(x, y, z);
|
||||
int rgbs = chunk->lightmap.get(x, y, z);
|
||||
if (rgbs){
|
||||
solverR->add(gx,y,gz, Lightmap::extract(rgbs, 0));
|
||||
solverG->add(gx,y,gz, Lightmap::extract(rgbs, 1));
|
||||
|
||||
@@ -3,26 +3,14 @@
|
||||
|
||||
#include "../util/data_io.h"
|
||||
|
||||
Lightmap::Lightmap(){
|
||||
map = new light_t[CHUNK_VOL];
|
||||
for (uint i = 0; i < CHUNK_VOL; i++){
|
||||
map[i] = 0x0000;
|
||||
}
|
||||
}
|
||||
|
||||
Lightmap::~Lightmap(){
|
||||
delete[] map;
|
||||
}
|
||||
|
||||
void Lightmap::set(const Lightmap* lightmap) {
|
||||
for (unsigned int i = 0; i < CHUNK_VOL; i++){
|
||||
map[i] = lightmap->map[i];
|
||||
}
|
||||
set(lightmap->map);
|
||||
}
|
||||
|
||||
void Lightmap::set(light_t* map) {
|
||||
delete[] this->map;
|
||||
this->map = map;
|
||||
void Lightmap::set(const light_t* map) {
|
||||
for (size_t i = 0; i < CHUNK_VOL; i++) {
|
||||
this->map[i] = map[i];
|
||||
}
|
||||
}
|
||||
|
||||
static_assert(sizeof(light_t) == 2, "replace dataio calls to new light_t");
|
||||
|
||||
+8
-11
@@ -3,43 +3,40 @@
|
||||
|
||||
#include "../constants.h"
|
||||
#include "../typedefs.h"
|
||||
#include "../voxels/Chunk.h"
|
||||
|
||||
const int LIGHTMAP_DATA_LEN = CHUNK_VOL/2;
|
||||
|
||||
// Lichtkarte
|
||||
class Lightmap {
|
||||
public:
|
||||
light_t* map;
|
||||
light_t map[CHUNK_VOL] {};
|
||||
int highestPoint = 0;
|
||||
Lightmap();
|
||||
~Lightmap();
|
||||
|
||||
void set(const Lightmap* lightmap);
|
||||
|
||||
void set(light_t* map);
|
||||
void set(const light_t* map);
|
||||
|
||||
inline unsigned short get(int x, int y, int z){
|
||||
inline unsigned short get(int x, int y, int z) const {
|
||||
return (map[y*CHUNK_D*CHUNK_W+z*CHUNK_W+x]);
|
||||
}
|
||||
|
||||
inline unsigned char get(int x, int y, int z, int channel){
|
||||
inline unsigned char get(int x, int y, int z, int channel) const {
|
||||
return (map[y*CHUNK_D*CHUNK_W+z*CHUNK_W+x] >> (channel << 2)) & 0xF;
|
||||
}
|
||||
|
||||
inline unsigned char getR(int x, int y, int z){
|
||||
inline unsigned char getR(int x, int y, int z) const {
|
||||
return map[y*CHUNK_D*CHUNK_W+z*CHUNK_W+x] & 0xF;
|
||||
}
|
||||
|
||||
inline unsigned char getG(int x, int y, int z){
|
||||
inline unsigned char getG(int x, int y, int z) const {
|
||||
return (map[y*CHUNK_D*CHUNK_W+z*CHUNK_W+x] >> 4) & 0xF;
|
||||
}
|
||||
|
||||
inline unsigned char getB(int x, int y, int z){
|
||||
inline unsigned char getB(int x, int y, int z) const {
|
||||
return (map[y*CHUNK_D*CHUNK_W+z*CHUNK_W+x] >> 8) & 0xF;
|
||||
}
|
||||
|
||||
inline unsigned char getS(int x, int y, int z){
|
||||
inline unsigned char getS(int x, int y, int z) const {
|
||||
return (map[y*CHUNK_D*CHUNK_W+z*CHUNK_W+x] >> 12) & 0xF;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user