1
0
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:
Thaddeus Crews
2025-02-03 08:16:09 -06:00
4 changed files with 60 additions and 46 deletions

View File

@@ -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);
} }

View File

@@ -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; }

View File

@@ -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;
} }

View File

@@ -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 */