You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Merge pull request #102261 from clayjohn/dummyrs-mesh-dependency
Track mesh dependencies in Dummy RenderingServer
This commit is contained in:
@@ -53,13 +53,14 @@ void MeshStorage::mesh_initialize(RID p_rid) {
|
|||||||
void MeshStorage::mesh_free(RID p_rid) {
|
void MeshStorage::mesh_free(RID p_rid) {
|
||||||
DummyMesh *mesh = mesh_owner.get_or_null(p_rid);
|
DummyMesh *mesh = mesh_owner.get_or_null(p_rid);
|
||||||
ERR_FAIL_NULL(mesh);
|
ERR_FAIL_NULL(mesh);
|
||||||
|
mesh->dependency.deleted_notify(p_rid);
|
||||||
mesh_owner.free(p_rid);
|
mesh_owner.free(p_rid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshStorage::mesh_surface_remove(RID p_mesh, int p_surface) {
|
void MeshStorage::mesh_surface_remove(RID p_mesh, int p_surface) {
|
||||||
DummyMesh *m = mesh_owner.get_or_null(p_mesh);
|
DummyMesh *m = mesh_owner.get_or_null(p_mesh);
|
||||||
ERR_FAIL_NULL(m);
|
ERR_FAIL_NULL(m);
|
||||||
|
m->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
|
||||||
m->surfaces.remove_at(p_surface);
|
m->surfaces.remove_at(p_surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,17 +36,18 @@
|
|||||||
|
|
||||||
namespace RendererDummy {
|
namespace RendererDummy {
|
||||||
|
|
||||||
class MeshStorage : public RendererMeshStorage {
|
|
||||||
private:
|
|
||||||
static MeshStorage *singleton;
|
|
||||||
|
|
||||||
struct DummyMesh {
|
struct DummyMesh {
|
||||||
Vector<RS::SurfaceData> surfaces;
|
Vector<RS::SurfaceData> surfaces;
|
||||||
int blend_shape_count;
|
int blend_shape_count;
|
||||||
RS::BlendShapeMode blend_shape_mode;
|
RS::BlendShapeMode blend_shape_mode;
|
||||||
PackedFloat32Array blend_shape_values;
|
PackedFloat32Array blend_shape_values;
|
||||||
|
Dependency dependency;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MeshStorage : public RendererMeshStorage {
|
||||||
|
private:
|
||||||
|
static MeshStorage *singleton;
|
||||||
|
|
||||||
mutable RID_Owner<DummyMesh> mesh_owner;
|
mutable RID_Owner<DummyMesh> mesh_owner;
|
||||||
|
|
||||||
struct DummyMultiMesh {
|
struct DummyMultiMesh {
|
||||||
@@ -62,7 +63,7 @@ public:
|
|||||||
~MeshStorage();
|
~MeshStorage();
|
||||||
|
|
||||||
/* MESH API */
|
/* MESH API */
|
||||||
|
DummyMesh *get_mesh(RID p_rid) { return mesh_owner.get_or_null(p_rid); }
|
||||||
bool owns_mesh(RID p_rid) { return mesh_owner.owns(p_rid); }
|
bool owns_mesh(RID p_rid) { return mesh_owner.owns(p_rid); }
|
||||||
|
|
||||||
virtual RID mesh_allocate() override;
|
virtual RID mesh_allocate() override;
|
||||||
@@ -92,6 +93,7 @@ public:
|
|||||||
s->blend_shape_data = p_surface.blend_shape_data;
|
s->blend_shape_data = p_surface.blend_shape_data;
|
||||||
s->uv_scale = p_surface.uv_scale;
|
s->uv_scale = p_surface.uv_scale;
|
||||||
s->material = p_surface.material;
|
s->material = p_surface.material;
|
||||||
|
m->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int mesh_get_blend_shape_count(RID p_mesh) const override { return 0; }
|
virtual int mesh_get_blend_shape_count(RID p_mesh) const override { return 0; }
|
||||||
|
|||||||
@@ -30,10 +30,55 @@
|
|||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#include "light_storage.h"
|
||||||
|
#include "material_storage.h"
|
||||||
|
#include "mesh_storage.h"
|
||||||
|
#include "texture_storage.h"
|
||||||
|
|
||||||
using namespace RendererDummy;
|
using namespace RendererDummy;
|
||||||
|
|
||||||
Utilities *Utilities::singleton = nullptr;
|
Utilities *Utilities::singleton = nullptr;
|
||||||
|
|
||||||
|
RS::InstanceType Utilities::get_base_type(RID p_rid) const {
|
||||||
|
if (RendererDummy::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
|
||||||
|
return RS::INSTANCE_MESH;
|
||||||
|
} else if (RendererDummy::MeshStorage::get_singleton()->owns_multimesh(p_rid)) {
|
||||||
|
return RS::INSTANCE_MULTIMESH;
|
||||||
|
} else if (RendererDummy::LightStorage::get_singleton()->owns_lightmap(p_rid)) {
|
||||||
|
return RS::INSTANCE_LIGHTMAP;
|
||||||
|
}
|
||||||
|
return RS::INSTANCE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Utilities::free(RID p_rid) {
|
||||||
|
if (RendererDummy::LightStorage::get_singleton()->free(p_rid)) {
|
||||||
|
return true;
|
||||||
|
} else if (RendererDummy::TextureStorage::get_singleton()->owns_texture(p_rid)) {
|
||||||
|
RendererDummy::TextureStorage::get_singleton()->texture_free(p_rid);
|
||||||
|
return true;
|
||||||
|
} else if (RendererDummy::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
|
||||||
|
RendererDummy::MeshStorage::get_singleton()->mesh_free(p_rid);
|
||||||
|
return true;
|
||||||
|
} else if (RendererDummy::MeshStorage::get_singleton()->owns_multimesh(p_rid)) {
|
||||||
|
RendererDummy::MeshStorage::get_singleton()->multimesh_free(p_rid);
|
||||||
|
return true;
|
||||||
|
} else if (RendererDummy::MaterialStorage::get_singleton()->owns_shader(p_rid)) {
|
||||||
|
RendererDummy::MaterialStorage::get_singleton()->shader_free(p_rid);
|
||||||
|
return true;
|
||||||
|
} else if (RendererDummy::MaterialStorage::get_singleton()->owns_material(p_rid)) {
|
||||||
|
RendererDummy::MaterialStorage::get_singleton()->material_free(p_rid);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Utilities::base_update_dependency(RID p_base, DependencyTracker *p_instance) {
|
||||||
|
if (RendererDummy::MeshStorage::get_singleton()->owns_mesh(p_base)) {
|
||||||
|
DummyMesh *mesh = RendererDummy::MeshStorage::get_singleton()->get_mesh(p_base);
|
||||||
|
p_instance->update_dependency(&mesh->dependency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Utilities::Utilities() {
|
Utilities::Utilities() {
|
||||||
singleton = this;
|
singleton = this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,11 +31,7 @@
|
|||||||
#ifndef UTILITIES_DUMMY_H
|
#ifndef UTILITIES_DUMMY_H
|
||||||
#define UTILITIES_DUMMY_H
|
#define UTILITIES_DUMMY_H
|
||||||
|
|
||||||
#include "light_storage.h"
|
|
||||||
#include "material_storage.h"
|
|
||||||
#include "mesh_storage.h"
|
|
||||||
#include "servers/rendering/storage/utilities.h"
|
#include "servers/rendering/storage/utilities.h"
|
||||||
#include "texture_storage.h"
|
|
||||||
|
|
||||||
namespace RendererDummy {
|
namespace RendererDummy {
|
||||||
|
|
||||||
@@ -51,42 +47,12 @@ public:
|
|||||||
|
|
||||||
/* INSTANCES */
|
/* INSTANCES */
|
||||||
|
|
||||||
virtual RS::InstanceType get_base_type(RID p_rid) const override {
|
virtual RS::InstanceType get_base_type(RID p_rid) const override;
|
||||||
if (RendererDummy::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
|
virtual bool free(RID p_rid) override;
|
||||||
return RS::INSTANCE_MESH;
|
|
||||||
} else if (RendererDummy::MeshStorage::get_singleton()->owns_multimesh(p_rid)) {
|
|
||||||
return RS::INSTANCE_MULTIMESH;
|
|
||||||
} else if (RendererDummy::LightStorage::get_singleton()->owns_lightmap(p_rid)) {
|
|
||||||
return RS::INSTANCE_LIGHTMAP;
|
|
||||||
}
|
|
||||||
return RS::INSTANCE_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool free(RID p_rid) override {
|
|
||||||
if (RendererDummy::LightStorage::get_singleton()->free(p_rid)) {
|
|
||||||
return true;
|
|
||||||
} else if (RendererDummy::TextureStorage::get_singleton()->owns_texture(p_rid)) {
|
|
||||||
RendererDummy::TextureStorage::get_singleton()->texture_free(p_rid);
|
|
||||||
return true;
|
|
||||||
} else if (RendererDummy::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
|
|
||||||
RendererDummy::MeshStorage::get_singleton()->mesh_free(p_rid);
|
|
||||||
return true;
|
|
||||||
} else if (RendererDummy::MeshStorage::get_singleton()->owns_multimesh(p_rid)) {
|
|
||||||
RendererDummy::MeshStorage::get_singleton()->multimesh_free(p_rid);
|
|
||||||
return true;
|
|
||||||
} else if (RendererDummy::MaterialStorage::get_singleton()->owns_shader(p_rid)) {
|
|
||||||
RendererDummy::MaterialStorage::get_singleton()->shader_free(p_rid);
|
|
||||||
return true;
|
|
||||||
} else if (RendererDummy::MaterialStorage::get_singleton()->owns_material(p_rid)) {
|
|
||||||
RendererDummy::MaterialStorage::get_singleton()->material_free(p_rid);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* DEPENDENCIES */
|
/* DEPENDENCIES */
|
||||||
|
|
||||||
virtual void base_update_dependency(RID p_base, DependencyTracker *p_instance) override {}
|
virtual void base_update_dependency(RID p_base, DependencyTracker *p_instance) override;
|
||||||
|
|
||||||
/* VISIBILITY NOTIFIER */
|
/* VISIBILITY NOTIFIER */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user