#ifndef STREAM_H_ #define STREAM_H_ #include #include #include #include #include class VoxelViewer; class VoxelLodTerrain; class StreamWorld : public Spatial { GDCLASS(StreamWorld, Spatial) private: VoxelViewer *viewer; VoxelLodTerrain *terrain; Node *current_scene; struct building { String id; Transform xform; AABB aabb; }; struct scene_data { Ref packed_scene; String path; Ref loader; std::vector buildings; }; HashMap scenes; HashMap item_nodes; using tile_key_t = std::tuple; struct tile_hash : public std::unary_function { std::size_t operator()(const tile_key_t &k) const { return std::get<0>(k) ^ std::get<1>(k); } }; using tile_map_t = std::unordered_map, tile_hash>; HashMap building_data; std::vector buildings; Vector3 eye; tile_map_t tiles; tile_map_t loaded_tiles; int world_extent; int tile_size; int view_distance; bool initialized; int current_x, current_z; void _notification(int which); void read_buildings_json(const String &buildings_path); void create_tilemap(); void update_view(); void viewer_dead(); void terrain_dead(); void load_tile(int tx, int ty); void erase_tile(int tx, int ty); void load_building(int id); void unload_building(int id); void request_item(int type, int item); void update_items(); static void _bind_methods(); public: StreamWorld(); ~StreamWorld(); static void cleanup(); }; #endif