#pragma once #include #include #include #include #include #include #include #include #include #include "util.hpp" #include #include #include #include #include #define _USE_MATH_DEFINES #include #define CHUNK_DIM 32 #define OCT_DIM 8 struct XYZHasher { std::size_t operator()(const sf::Vector3i& k) const { return ((std::hash()(k.x) ^ (std::hash()(k.y) << 1)) >> 1) ^ (std::hash()(k.z) << 1); } }; class Octree { public: Octree() { // initialize the first stack block stack.push_back(new uint64_t[0x8000]); for (int i = 0; i < 0x8000; i++) { stack.back()[i] = 0; } }; ~Octree() {}; std::list stack; uint64_t stack_pos = 0x8000; uint64_t global_pos = 0; uint64_t copy_to_stack(std::vector children) { // Check for the 15 bit boundry if (stack_pos - children.size() > stack_pos) { global_pos = stack_pos; stack_pos = 0x8000; } else { stack_pos -= children.size(); } // Check for the far bit memcpy(&stack.front()[stack_pos + global_pos], children.data(), children.size() * sizeof(uint64_t)); // Return the bitmask encoding the index of that value // If we tripped the far bit, allocate a far index to the stack and place // it one above preferably. // And then shift the far bit to 1 // If not, shift the index to its correct place return stack_pos; }; int get_idx(sf::Vector3i voxel_pos) { return 1; } // This might need to be a recursive function. But it needs to be easily ported to // OpenCL C. Might spend some time thinking about how to do this in a linear algorithm bool get_voxel(sf::Vector3i position) { std::queue parent_stack; uint64_t head = stack.front()[stack_pos]; parent_stack.push(head); uint64_t index = cp_to_index(head); return true; } void print_block(int block_pos) { std::stringstream sss; for (int i = 0; i < (int)pow(2, 15); i++) { PrettyPrintUINT64(stack.front()[i], &sss); sss << "\n"; } DumpLog(&sss, "raw_data.txt"); } private: uint64_t cp_to_index(uint64_t descriptor) { const uint64_t cp_mask = 0x0000000000007fff; return descriptor & cp_mask; }; //uint64_t is_leaf(uint64_t descriptor, ) }; class Map { public: Map(sf::Vector3i dim); void generate_octree(); void load_unload(sf::Vector3i world_position); void load_single(sf::Vector3i world_position); sf::Vector3i getDimensions(); char *list; //sf::Vector3i dimensions; void setVoxel(sf::Vector3i position, int val); char getVoxelFromOctree(sf::Vector3i position); void moveLight(sf::Vector2f in); sf::Vector3f global_light; Octree a; protected: private: // DEBUG int counter = 0; std::stringstream ss; // !DEBUG uint64_t generate_children(sf::Vector3i pos, int dim); char getVoxel(sf::Vector3i pos); char* voxel_data = new char[OCT_DIM * OCT_DIM * OCT_DIM]; //std::unordered_map chunk_map; double* height_map; // 2^k int chunk_radius = 6; sf::Vector3i world_to_chunk(sf::Vector3i world_coords) { return sf::Vector3i( world_coords.x / CHUNK_DIM + 1, world_coords.y / CHUNK_DIM + 1, world_coords.z / CHUNK_DIM + 1 ); } };