Add a new HashSet template

* Intended to replace RBSet in most cases.
* Optimized for iteration speed
This commit is contained in:
reduz
2022-05-19 17:00:06 +02:00
parent 410893ad0f
commit 45af29da80
243 changed files with 1400 additions and 662 deletions

View File

@ -152,7 +152,7 @@ void LightmapRaycasterEmbree::commit() {
rtcCommitScene(embree_scene);
}
void LightmapRaycasterEmbree::set_mesh_filter(const RBSet<int> &p_mesh_ids) {
void LightmapRaycasterEmbree::set_mesh_filter(const HashSet<int> &p_mesh_ids) {
for (const int &E : p_mesh_ids) {
rtcDisableGeometry(rtcGetGeometry(embree_scene, E));
}

View File

@ -53,7 +53,7 @@ private:
static void filter_function(const struct RTCFilterFunctionNArguments *p_args);
HashMap<unsigned int, AlphaTextureData> alpha_textures;
RBSet<int> filter_meshes;
HashSet<int> filter_meshes;
public:
virtual bool intersect(Ray &p_ray) override;
@ -64,7 +64,7 @@ public:
virtual void set_mesh_alpha_texture(Ref<Image> p_alpha_texture, unsigned int p_id) override;
virtual void commit() override;
virtual void set_mesh_filter(const RBSet<int> &p_mesh_ids) override;
virtual void set_mesh_filter(const HashSet<int> &p_mesh_ids) override;
virtual void clear_mesh_filter() override;
static LightmapRaycaster *create_embree_raycaster();

View File

@ -86,11 +86,13 @@ private:
RID scenario;
RID instance;
bool operator<(const InstanceID &rhs) const {
if (instance == rhs.instance) {
return rhs.scenario < scenario;
}
return instance < rhs.instance;
static uint32_t hash(const InstanceID &p_ins) {
uint32_t h = hash_djb2_one_64(p_ins.scenario.get_id());
return hash_djb2_one_64(p_ins.instance.get_id(), h);
}
bool operator==(const InstanceID &rhs) const {
return instance == rhs.instance && rhs.scenario == scenario;
;
}
InstanceID() {}
@ -101,7 +103,7 @@ private:
struct Occluder {
PackedVector3Array vertices;
PackedInt32Array indices;
RBSet<InstanceID> users;
HashSet<InstanceID, InstanceID> users;
};
struct OccluderInstance {
@ -136,7 +138,7 @@ private:
int current_scene_idx = 0;
HashMap<RID, OccluderInstance> instances;
RBSet<RID> dirty_instances; // To avoid duplicates
HashSet<RID> dirty_instances; // To avoid duplicates
LocalVector<RID> dirty_instances_array; // To iterate and split into threads
LocalVector<RID> removed_instances;

View File

@ -94,7 +94,7 @@ void StaticRaycasterEmbree::commit() {
rtcCommitScene(embree_scene);
}
void StaticRaycasterEmbree::set_mesh_filter(const RBSet<int> &p_mesh_ids) {
void StaticRaycasterEmbree::set_mesh_filter(const HashSet<int> &p_mesh_ids) {
for (const int &E : p_mesh_ids) {
rtcDisableGeometry(rtcGetGeometry(embree_scene, E));
}

View File

@ -41,7 +41,7 @@ private:
static RTCDevice embree_device;
RTCScene embree_scene;
RBSet<int> filter_meshes;
HashSet<int> filter_meshes;
public:
virtual bool intersect(Ray &p_ray) override;
@ -50,7 +50,7 @@ public:
virtual void add_mesh(const PackedVector3Array &p_vertices, const PackedInt32Array &p_indices, unsigned int p_id) override;
virtual void commit() override;
virtual void set_mesh_filter(const RBSet<int> &p_mesh_ids) override;
virtual void set_mesh_filter(const HashSet<int> &p_mesh_ids) override;
virtual void clear_mesh_filter() override;
static StaticRaycaster *create_embree_raycaster();