Skip to content

Commit

Permalink
Implement placeholder assets
Browse files Browse the repository at this point in the history
* Placeholder textures
* Placeholder meshes
* Placeholder material

This PR is the first step towards implementing godotengine/godot-proposals#2756
It adds an asset type that uses no resources, which can be used to replace the existing ones on export for using on the upcoming server export.
  • Loading branch information
reduz committed Apr 28, 2022
1 parent d01e412 commit b02c738
Show file tree
Hide file tree
Showing 15 changed files with 395 additions and 0 deletions.
9 changes: 9 additions & 0 deletions doc/classes/PlaceholderCubemap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaceholderCubemap" inherits="PlaceholderTextureLayered" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
</class>
9 changes: 9 additions & 0 deletions doc/classes/PlaceholderCubemapArray.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaceholderCubemapArray" inherits="PlaceholderTextureLayered" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
</class>
9 changes: 9 additions & 0 deletions doc/classes/PlaceholderMaterial.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaceholderMaterial" inherits="Material" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
</class>
13 changes: 13 additions & 0 deletions doc/classes/PlaceholderMesh.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaceholderMesh" inherits="Mesh" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
<members>
<member name="aabb" type="AABB" setter="set_aabb" getter="get_aabb" default="AABB(0, 0, 0, 0, 0, 0)">
</member>
</members>
</class>
13 changes: 13 additions & 0 deletions doc/classes/PlaceholderTexture2D.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaceholderTexture2D" inherits="Texture2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
<members>
<member name="size" type="Vector2" setter="set_size" getter="get_size" default="Vector2(1, 1)">
</member>
</members>
</class>
9 changes: 9 additions & 0 deletions doc/classes/PlaceholderTexture2DArray.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaceholderTexture2DArray" inherits="PlaceholderTextureLayered" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
</class>
13 changes: 13 additions & 0 deletions doc/classes/PlaceholderTexture3D.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaceholderTexture3D" inherits="Texture3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
<members>
<member name="size" type="Vector3i" setter="set_size" getter="get_size" default="Vector3i(1, 1, 1)">
</member>
</members>
</class>
15 changes: 15 additions & 0 deletions doc/classes/PlaceholderTextureLayered.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaceholderTextureLayered" inherits="TextureLayered" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
<members>
<member name="layers" type="int" setter="set_layers" getter="get_layers" default="1">
</member>
<member name="size" type="Vector2i" setter="set_size" getter="get_size" default="Vector2i(1, 1)">
</member>
</members>
</class>
8 changes: 8 additions & 0 deletions scene/register_scene_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -752,6 +752,7 @@ void register_scene_types() {

GDREGISTER_VIRTUAL_CLASS(Mesh);
GDREGISTER_CLASS(ArrayMesh);
GDREGISTER_CLASS(PlaceholderMesh);
GDREGISTER_CLASS(ImmediateMesh);
GDREGISTER_CLASS(MultiMesh);
GDREGISTER_CLASS(SurfaceTool);
Expand All @@ -773,6 +774,7 @@ void register_scene_types() {
GDREGISTER_ABSTRACT_CLASS(BaseMaterial3D);
GDREGISTER_CLASS(StandardMaterial3D);
GDREGISTER_CLASS(ORMMaterial3D);
GDREGISTER_CLASS(PlaceholderMaterial);
SceneTree::add_idle_callback(BaseMaterial3D::flush_changes);
BaseMaterial3D::init_shaders();

Expand Down Expand Up @@ -837,6 +839,12 @@ void register_scene_types() {
GDREGISTER_CLASS(CompressedCubemap);
GDREGISTER_CLASS(CompressedCubemapArray);
GDREGISTER_CLASS(CompressedTexture2DArray);
GDREGISTER_CLASS(PlaceholderTexture2D);
GDREGISTER_CLASS(PlaceholderTexture3D);
GDREGISTER_ABSTRACT_CLASS(PlaceholderTextureLayered);
GDREGISTER_CLASS(PlaceholderTexture2DArray);
GDREGISTER_CLASS(PlaceholderCubemap);
GDREGISTER_CLASS(PlaceholderCubemapArray);

GDREGISTER_CLASS(Animation);
GDREGISTER_CLASS(AnimationLibrary);
Expand Down
3 changes: 3 additions & 0 deletions scene/resources/material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3010,4 +3010,7 @@ bool StandardMaterial3D::_set(const StringName &p_name, const Variant &p_value)

return false;
}

#endif // DISABLE_DEPRECATED

///////////////////////
7 changes: 7 additions & 0 deletions scene/resources/material.h
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,13 @@ class ORMMaterial3D : public BaseMaterial3D {
BaseMaterial3D(true) {}
};

class PlaceholderMaterial : public Material {
GDCLASS(PlaceholderMaterial, Material)
public:
virtual RID get_shader_rid() const override { return RID(); }
virtual Shader::Mode get_shader_mode() const override { return Shader::MODE_CANVAS_ITEM; }
};

//////////////////////

#endif
14 changes: 14 additions & 0 deletions scene/resources/mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2092,3 +2092,17 @@ ArrayMesh::~ArrayMesh() {
RenderingServer::get_singleton()->free(mesh);
}
}
///////////////

void PlaceholderMesh::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_aabb", "aabb"), &PlaceholderMesh::set_aabb);
ADD_PROPERTY(PropertyInfo(Variant::AABB, "aabb", PROPERTY_HINT_NONE, ""), "set_aabb", "get_aabb");
}

PlaceholderMesh::PlaceholderMesh() {
rid = RS::get_singleton()->mesh_create();
}

PlaceholderMesh::~PlaceholderMesh() {
RS::get_singleton()->free(rid);
}
34 changes: 34 additions & 0 deletions scene/resources/mesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -328,4 +328,38 @@ VARIANT_ENUM_CAST(Mesh::ArrayCustomFormat);
VARIANT_ENUM_CAST(Mesh::PrimitiveType);
VARIANT_ENUM_CAST(Mesh::BlendShapeMode);

class PlaceholderMesh : public Mesh {
GDCLASS(PlaceholderMesh, Mesh);

RID rid;
AABB aabb;

protected:
static void _bind_methods();

public:
virtual int get_surface_count() const override { return 0; }
virtual int surface_get_array_len(int p_idx) const override { return 0; }
virtual int surface_get_array_index_len(int p_idx) const override { return 0; }
virtual Array surface_get_arrays(int p_surface) const override { return Array(); }
virtual Array surface_get_blend_shape_arrays(int p_surface) const override { return Array(); }
virtual Dictionary surface_get_lods(int p_surface) const override { return Dictionary(); }
virtual uint32_t surface_get_format(int p_idx) const override { return 0; }
virtual PrimitiveType surface_get_primitive_type(int p_idx) const override { return PRIMITIVE_TRIANGLES; }
virtual void surface_set_material(int p_idx, const Ref<Material> &p_material) override {}
virtual Ref<Material> surface_get_material(int p_idx) const override { return Ref<Material>(); }
virtual int get_blend_shape_count() const override { return 0; }
virtual StringName get_blend_shape_name(int p_index) const override { return StringName(); }
virtual void set_blend_shape_name(int p_index, const StringName &p_name) override {}
virtual RID get_rid() const override { return rid; }
virtual AABB get_aabb() const override { return aabb; }
void set_aabb(const AABB &p_aabb) { aabb = p_aabb; }

virtual int get_builtin_bind_pose_count() const override { return 0; }
virtual Transform3D get_builtin_bind_pose(int p_index) const override { return Transform3D(); }

PlaceholderMesh();
~PlaceholderMesh();
};

#endif
145 changes: 145 additions & 0 deletions scene/resources/texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3395,3 +3395,148 @@ CameraTexture::~CameraTexture() {
RenderingServer::get_singleton()->free(_texture);
}
}

///////////////////////////

void PlaceholderTexture2D::set_size(Size2 p_size) {
size = p_size;
}

int PlaceholderTexture2D::get_width() const {
return size.width;
}

int PlaceholderTexture2D::get_height() const {
return size.height;
}

bool PlaceholderTexture2D::has_alpha() const {
return false;
}

Ref<Image> PlaceholderTexture2D::get_image() const {
return Ref<Image>();
}

RID PlaceholderTexture2D::get_rid() const {
return rid;
}

void PlaceholderTexture2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_size", "size"), &PlaceholderTexture2D::set_size);

ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "size"), "set_size", "get_size");
}

PlaceholderTexture2D::PlaceholderTexture2D() {
rid = RS::get_singleton()->texture_2d_placeholder_create();
}

PlaceholderTexture2D::~PlaceholderTexture2D() {
RS::get_singleton()->free(rid);
}

///////////////////////////////////////////////

void PlaceholderTexture3D::set_size(const Vector3i &p_size) {
size = p_size;
}

Vector3i PlaceholderTexture3D::get_size() const {
return size;
}

Image::Format PlaceholderTexture3D::get_format() const {
return Image::FORMAT_RGB8;
}

int PlaceholderTexture3D::get_width() const {
return size.x;
}

int PlaceholderTexture3D::get_height() const {
return size.y;
}

int PlaceholderTexture3D::get_depth() const {
return size.z;
}

bool PlaceholderTexture3D::has_mipmaps() const {
return false;
}

Vector<Ref<Image>> PlaceholderTexture3D::get_data() const {
return Vector<Ref<Image>>();
}

void PlaceholderTexture3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_size", "size"), &PlaceholderTexture3D::set_size);
ClassDB::bind_method(D_METHOD("get_size"), &PlaceholderTexture3D::get_size);
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3I, "size"), "set_size", "get_size");
}

PlaceholderTexture3D::PlaceholderTexture3D() {
rid = RS::get_singleton()->texture_3d_placeholder_create();
}
PlaceholderTexture3D::~PlaceholderTexture3D() {
RS::get_singleton()->free(rid);
}

/////////////////////////////////////////////////

void PlaceholderTextureLayered::set_size(const Size2i &p_size) {
size = p_size;
}

Size2i PlaceholderTextureLayered::get_size() const {
return size;
}

void PlaceholderTextureLayered::set_layers(int p_layers) {
layers = p_layers;
}

Image::Format PlaceholderTextureLayered::get_format() const {
return Image::FORMAT_RGB8;
}

TextureLayered::LayeredType PlaceholderTextureLayered::get_layered_type() const {
return layered_type;
}

int PlaceholderTextureLayered::get_width() const {
return size.x;
}

int PlaceholderTextureLayered::get_height() const {
return size.y;
}

int PlaceholderTextureLayered::get_layers() const {
return layers;
}

bool PlaceholderTextureLayered::has_mipmaps() const {
return false;
}

Ref<Image> PlaceholderTextureLayered::get_layer_data(int p_layer) const {
return Ref<Image>();
}

void PlaceholderTextureLayered::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_size", "size"), &PlaceholderTextureLayered::set_size);
ClassDB::bind_method(D_METHOD("get_size"), &PlaceholderTextureLayered::get_size);
ClassDB::bind_method(D_METHOD("set_layers", "layers"), &PlaceholderTextureLayered::set_layers);
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "size"), "set_size", "get_size");
ADD_PROPERTY(PropertyInfo(Variant::INT, "layers", PROPERTY_HINT_RANGE, "1,4096"), "set_layers", "get_layers");
}

PlaceholderTextureLayered::PlaceholderTextureLayered(LayeredType p_type) {
layered_type = p_type;
rid = RS::get_singleton()->texture_2d_layered_placeholder_create(RS::TextureLayeredType(layered_type));
}
PlaceholderTextureLayered::~PlaceholderTextureLayered() {
RS::get_singleton()->free(rid);
}
Loading

0 comments on commit b02c738

Please sign in to comment.