1
0
Fork 0
Univerxel/src/world/Voxel.hpp

55 lines
1.7 KiB
C++
Raw Normal View History

2020-07-10 17:49:16 +00:00
#pragma once
2020-08-07 17:08:02 +00:00
#include <robin_hood.h>
2020-07-25 14:29:05 +00:00
2020-07-25 16:45:03 +00:00
namespace world {
/// Universe unit
struct Voxel {
2020-08-02 09:47:25 +00:00
/// Packed value
/// swap(1) + material(12) + density(3)
uint16_t value;
using material_t = uint_fast16_t;
using density_t = uint_fast8_t;
constexpr static const density_t DENSITY_MAX = 0b0111;
Voxel(uint16_t value = 0): value(value) { }
Voxel(material_t material, density_t density, bool swap = false) {
assert(density <= DENSITY_MAX);
assert(material < (1 << 12));
value = (swap & 0b1000'0000'0000'0000) |
((material << 3) & 0b0111'1111'1111'1000) |
(density & DENSITY_MAX);
}
2020-07-25 16:45:03 +00:00
/// Quantity of material
2020-08-02 09:47:25 +00:00
constexpr inline density_t density() const {
return value & DENSITY_MAX;
}
2020-07-25 16:45:03 +00:00
/// Material type
2020-08-02 09:47:25 +00:00
constexpr inline material_t material() const {
return (value & 0b0111'1111'1111'1000) >> 3;
}
/// Swap value
/// Use external metadata table
constexpr inline bool swap() const {
return value & 0b1000'0000'0000'0000;
}
2020-07-25 16:45:03 +00:00
};
/// Stock of material
struct Item {
/// Quantity of material
unsigned long long Count;
/// Material type
/// @see world::materials
2020-08-02 09:47:25 +00:00
Voxel::material_t Material;
2020-07-25 16:45:03 +00:00
};
/// List of materials
2020-08-07 17:08:02 +00:00
struct ItemList: robin_hood::unordered_map<Voxel::material_t, unsigned long long> {
2020-07-25 16:45:03 +00:00
void add(const std::optional<Item>& item) {
if(item) {
(*this)[item.value().Material] += item.value().Count;
}
2020-07-25 14:29:05 +00:00
}
2020-07-25 16:45:03 +00:00
};
}