Skip to content

Commit 82fa3ff

Browse files
committed
Split mesh rasterizer and drawable texture
1 parent a8b4f8f commit 82fa3ff

18 files changed

+321
-185
lines changed

doc/classes/RasterizedMeshTexture.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
</member>
1818
<member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh">
1919
</member>
20-
<member name="resource_local_to_scene" type="bool" setter="set_local_to_scene" getter="is_local_to_scene" overrides="Resource" default="false" />
21-
<member name="samples" type="int" setter="set_samples" getter="get_samples" enum="RenderingDevice.TextureSamples" default="0">
20+
<member name="multisample" type="int" setter="set_multisample" getter="get_multisample" enum="RenderingDevice.TextureSamples" default="0">
2221
</member>
22+
<member name="resource_local_to_scene" type="bool" setter="set_local_to_scene" getter="is_local_to_scene" overrides="Resource" default="false" />
2323
<member name="surface_index" type="int" setter="set_surface_index" getter="get_surface_index" default="0">
2424
</member>
25-
<member name="texture_format" type="int" setter="set_texture_format" getter="get_texture_format" enum="RenderingServer.RasterizedTextureFormat" default="0">
25+
<member name="texture_format" type="int" setter="set_texture_format" getter="get_texture_format" enum="RenderingServer.TextureDrawableFormat" default="0">
2626
</member>
2727
<member name="width" type="int" setter="set_width" getter="get_width" default="256">
2828
</member>

doc/classes/RenderingServer.xml

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,33 +2424,19 @@
24242424
</method>
24252425
<method name="mesh_rasterizer_create">
24262426
<return type="RID" />
2427-
<param index="0" name="width" type="int" />
2428-
<param index="1" name="height" type="int" />
2429-
<param index="2" name="texture_format" type="int" enum="RenderingServer.RasterizedTextureFormat" />
2430-
<param index="3" name="generate_mipmaps" type="bool" default="false" />
2431-
<param index="4" name="samples" type="int" enum="RenderingDevice.TextureSamples" default="0" />
2427+
<param index="0" name="mesh" type="RID" />
2428+
<param index="1" name="surface_index" type="int" />
24322429
<description>
24332430
</description>
24342431
</method>
24352432
<method name="mesh_rasterizer_draw">
24362433
<return type="void" />
24372434
<param index="0" name="mesh_rasterizer" type="RID" />
24382435
<param index="1" name="material" type="RID" />
2439-
<param index="2" name="bg_color" type="Color" />
2440-
<description>
2441-
</description>
2442-
</method>
2443-
<method name="mesh_rasterizer_get_texture">
2444-
<return type="RID" />
2445-
<param index="0" name="mesh_rasterizer" type="RID" />
2446-
<description>
2447-
</description>
2448-
</method>
2449-
<method name="mesh_rasterizer_set_mesh">
2450-
<return type="void" />
2451-
<param index="0" name="mesh_rasterizer" type="RID" />
2452-
<param index="1" name="mesh" type="RID" />
2453-
<param index="2" name="surface_index" type="int" />
2436+
<param index="2" name="texture_drawable" type="RID" />
2437+
<param index="3" name="blend_mode" type="int" enum="RenderingServer.RasterizerBlendMode" />
2438+
<param index="4" name="clear_color" type="Color" />
2439+
<param index="5" name="multisamples" type="int" enum="RenderingDevice.TextureSamples" default="0" />
24542440
<description>
24552441
</description>
24562442
</method>
@@ -3762,6 +3748,21 @@
37623748
[b]Note:[/b] If using only the rendering device renderer, it's recommend to use [method RenderingDevice.texture_create_from_extension] together with [method RenderingServer.texture_rd_create], rather than this method. It will give you much more control over the texture's format and usage.
37633749
</description>
37643750
</method>
3751+
<method name="texture_drawable_ctreate">
3752+
<return type="RID" />
3753+
<param index="0" name="width" type="int" />
3754+
<param index="1" name="height" type="int" />
3755+
<param index="2" name="texture_format" type="int" enum="RenderingServer.TextureDrawableFormat" />
3756+
<param index="3" name="use_mipmaps" type="bool" default="false" />
3757+
<description>
3758+
</description>
3759+
</method>
3760+
<method name="texture_drawable_generate_mipmaps">
3761+
<return type="void" />
3762+
<param index="0" name="texture_drawable" type="RID" />
3763+
<description>
3764+
</description>
3765+
</method>
37653766
<method name="texture_get_format" qualifiers="const">
37663767
<return type="int" enum="Image.Format" />
37673768
<param index="0" name="texture" type="RID" />
@@ -4767,13 +4768,25 @@
47674768
<constant name="MULTIMESH_INTERP_QUALITY_HIGH" value="1" enum="MultimeshPhysicsInterpolationQuality">
47684769
MultiMesh physics interpolation favors quality over speed.
47694770
</constant>
4770-
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBA8" value="0" enum="RasterizedTextureFormat">
4771+
<constant name="TEXTURE_DRAWABLE_FORMAT_RGBA8" value="0" enum="TextureDrawableFormat">
4772+
</constant>
4773+
<constant name="TEXTURE_DRAWABLE_FORMAT_RGBA8_SRGB" value="1" enum="TextureDrawableFormat">
4774+
</constant>
4775+
<constant name="TEXTURE_DRAWABLE_FORMAT_RGBAH" value="2" enum="TextureDrawableFormat">
4776+
</constant>
4777+
<constant name="TEXTURE_DRAWABLE_FORMAT_RGBAF" value="3" enum="TextureDrawableFormat">
4778+
</constant>
4779+
<constant name="RASTERIZER_BLEND_MODE_CLEAR" value="0" enum="RasterizerBlendMode">
4780+
</constant>
4781+
<constant name="RASTERIZER_BLEND_MODE_MIX" value="1" enum="RasterizerBlendMode">
4782+
</constant>
4783+
<constant name="RASTERIZER_BLEND_MODE_ADD" value="2" enum="RasterizerBlendMode">
47714784
</constant>
4772-
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBA8_SRGB" value="1" enum="RasterizedTextureFormat">
4785+
<constant name="RASTERIZER_BLEND_MODE_SUB" value="3" enum="RasterizerBlendMode">
47734786
</constant>
4774-
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBAH" value="2" enum="RasterizedTextureFormat">
4787+
<constant name="RASTERIZER_BLEND_MODE_MUL" value="4" enum="RasterizerBlendMode">
47754788
</constant>
4776-
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBAF" value="3" enum="RasterizedTextureFormat">
4789+
<constant name="RASTERIZER_BLEND_MODE_PREMULT_ALPHA" value="5" enum="RasterizerBlendMode">
47774790
</constant>
47784791
<constant name="LIGHT_PROJECTOR_FILTER_NEAREST" value="0" enum="LightProjectorFilter">
47794792
Nearest-neighbor filter for light projectors (use for pixel art light projectors). No mipmaps are used for rendering, which means light projectors at a distance will look sharp but grainy. This has roughly the same performance cost as using mipmaps.

drivers/gles3/storage/texture_storage.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2090,6 +2090,14 @@ AABB TextureStorage::decal_get_aabb(RID p_decal) const {
20902090
return AABB();
20912091
}
20922092

2093+
/* TEXTURE DRAWABLE API */
2094+
2095+
void GLES3::TextureStorage::texture_drawable_initialize(RID p_rid, int p_width, int p_height, RS::TextureDrawableFormat p_texture_format, bool p_use_mipmaps) {
2096+
}
2097+
2098+
void GLES3::TextureStorage::texture_drawable_generate_mipmaps(RID p_texture_drawable) {
2099+
}
2100+
20932101
/* RENDER TARGET API */
20942102

20952103
GLuint TextureStorage::system_fbo = 0;

drivers/gles3/storage/texture_storage.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,11 @@ class TextureStorage : public RendererTextureStorage {
615615
virtual void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) override {}
616616
virtual void decal_instance_set_sorting_offset(RID p_decal_instance, float p_sorting_offset) override {}
617617

618+
/* TEXTURE DRAWABLE API */
619+
620+
void texture_drawable_initialize(RID p_rid, int p_width, int p_height, RS::TextureDrawableFormat p_texture_format, bool p_use_mipmaps = false) override;
621+
void texture_drawable_generate_mipmaps(RID p_texture_drawable) override;
622+
618623
/* RENDER TARGET API */
619624

620625
static GLuint system_fbo;

scene/resources/rasterized_mesh_texture.cpp

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -124,29 +124,29 @@ int RasterizedMeshTexture::get_surface_index() const {
124124
return surface_index;
125125
}
126126

127-
void RasterizedMeshTexture::set_texture_format(RS::RasterizedTextureFormat p_texture_format) {
127+
void RasterizedMeshTexture::set_texture_format(RS::TextureDrawableFormat p_texture_format) {
128128
texture_format = p_texture_format;
129-
rasterizer_dirty = true;
129+
texture_dirty = true;
130130
queue_update();
131131
}
132132

133-
RS::RasterizedTextureFormat RasterizedMeshTexture::get_texture_format() const {
133+
RS::TextureDrawableFormat RasterizedMeshTexture::get_texture_format() const {
134134
return texture_format;
135135
}
136136

137-
void RasterizedMeshTexture::set_samples(RD::TextureSamples p_samples) {
138-
samples = p_samples;
137+
void RasterizedMeshTexture::set_multisample(RD::TextureSamples p_multisample) {
138+
multisample = p_multisample;
139139
rasterizer_dirty = true;
140140
queue_update();
141141
}
142142

143-
RD::TextureSamples RasterizedMeshTexture::get_samples() const {
144-
return samples;
143+
RD::TextureSamples RasterizedMeshTexture::get_multisample() const {
144+
return multisample;
145145
}
146146

147147
void RasterizedMeshTexture::set_generate_mipmaps(bool p_generate_mipmaps) {
148148
generate_mipmaps = p_generate_mipmaps;
149-
rasterizer_dirty = true;
149+
texture_dirty = true;
150150
queue_update();
151151
}
152152

@@ -160,31 +160,28 @@ RasterizedMeshTexture::RasterizedMeshTexture() {
160160

161161
RasterizedMeshTexture::~RasterizedMeshTexture() {
162162
RS::get_singleton()->free(texture);
163-
if (mesh_rasterizer.is_valid()) {
164-
RS::get_singleton()->free(mesh_rasterizer);
165-
}
163+
RS::get_singleton()->free(mesh_rasterizer);
166164
}
167165

168166
void RasterizedMeshTexture::update() {
169-
if (mesh_rasterizer.is_null()) {
170-
rasterizer_dirty = true;
171-
}
172-
if (rasterizer_dirty) {
173-
RID new_mesh_rasterizer = RS::get_singleton()->mesh_rasterizer_create(size.width, size.height, texture_format, generate_mipmaps, samples);
174-
RID new_texture = RS::get_singleton()->mesh_rasterizer_get_texture(new_mesh_rasterizer);
167+
if (texture_dirty) {
168+
RID new_texture = RS::get_singleton()->texture_drawable_create(size.width, size.height, texture_format, generate_mipmaps);
175169
RS::get_singleton()->texture_replace(texture, new_texture);
170+
}
171+
if (mesh_dirty) {
176172
if (mesh_rasterizer.is_valid()) {
177173
RS::get_singleton()->free(mesh_rasterizer);
178174
}
179-
mesh_rasterizer = new_mesh_rasterizer;
180-
}
181-
if (rasterizer_dirty || mesh_dirty) {
182-
RS::get_singleton()->mesh_rasterizer_set_mesh(mesh_rasterizer, mesh.is_valid() ? mesh->get_rid() : RID(), surface_index);
175+
mesh_rasterizer = RS::get_singleton()->mesh_rasterizer_create(mesh.is_valid() ? mesh->get_rid() : RID(), surface_index);
183176
mesh_dirty = false;
184177
}
185178
if (material.is_valid()) {
186-
RS::get_singleton()->mesh_rasterizer_draw(mesh_rasterizer, material->get_rid(), bg_color);
179+
RS::get_singleton()->mesh_rasterizer_draw(mesh_rasterizer, material->get_rid(), texture, RS::RASTERIZER_BLEND_MODE_CLEAR, bg_color, multisample);
180+
if (generate_mipmaps) {
181+
RS::get_singleton()->texture_drawable_generate_mipmaps(texture);
182+
}
187183
}
184+
texture_dirty = false;
188185
rasterizer_dirty = false;
189186
update_queued = false;
190187
emit_changed();
@@ -216,8 +213,8 @@ void RasterizedMeshTexture::_bind_methods() {
216213
ClassDB::bind_method(D_METHOD("get_surface_index"), &RasterizedMeshTexture::get_surface_index);
217214
ClassDB::bind_method(D_METHOD("set_texture_format", "texture_format"), &RasterizedMeshTexture::set_texture_format);
218215
ClassDB::bind_method(D_METHOD("get_texture_format"), &RasterizedMeshTexture::get_texture_format);
219-
ClassDB::bind_method(D_METHOD("set_samples", "samples"), &RasterizedMeshTexture::set_samples);
220-
ClassDB::bind_method(D_METHOD("get_samples"), &RasterizedMeshTexture::get_samples);
216+
ClassDB::bind_method(D_METHOD("set_multisample", "multisample"), &RasterizedMeshTexture::set_multisample);
217+
ClassDB::bind_method(D_METHOD("get_multisample"), &RasterizedMeshTexture::get_multisample);
221218
ClassDB::bind_method(D_METHOD("set_generate_mipmaps", "generate_mipmaps"), &RasterizedMeshTexture::set_generate_mipmaps);
222219
ClassDB::bind_method(D_METHOD("is_generating_mipmaps"), &RasterizedMeshTexture::is_generating_mipmaps);
223220

@@ -228,6 +225,6 @@ void RasterizedMeshTexture::_bind_methods() {
228225
ADD_PROPERTY(PropertyInfo(Variant::INT, "surface_index", PROPERTY_HINT_RANGE, "0,10,1,or_greater"), "set_surface_index", "get_surface_index");
229226
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial"), "set_material", "get_material");
230227
ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_format", PROPERTY_HINT_ENUM, "RGBA8,RGBA8_SRGB,RGBAH,RGBAF"), "set_texture_format", "get_texture_format");
231-
ADD_PROPERTY(PropertyInfo(Variant::INT, "samples", PROPERTY_HINT_ENUM, "1x,2x,4x,8x"), "set_samples", "get_samples");
228+
ADD_PROPERTY(PropertyInfo(Variant::INT, "multisample", PROPERTY_HINT_ENUM, "1x,2x,4x,8x"), "set_multisample", "get_multisample");
232229
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "generate_mipmaps"), "set_generate_mipmaps", "is_generating_mipmaps");
233230
}

scene/resources/rasterized_mesh_texture.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,15 @@ class RasterizedMeshTexture : public Texture2D {
4343
Color bg_color = Color(0, 0, 0, 0);
4444
Ref<Mesh> mesh;
4545
Ref<ShaderMaterial> material;
46-
RS::RasterizedTextureFormat texture_format = RS::RASTERIZED_TEXTURE_FORMAT_RGBA8;
47-
RD::TextureSamples samples = RD::TEXTURE_SAMPLES_1;
46+
RS::TextureDrawableFormat texture_format = RS::TEXTURE_DRAWABLE_FORMAT_RGBA8;
47+
RD::TextureSamples multisample = RD::TEXTURE_SAMPLES_1;
4848
bool generate_mipmaps = false;
4949

5050
RID texture;
5151
RID mesh_rasterizer;
5252

53-
bool rasterizer_dirty = false;
53+
bool texture_dirty = true;
54+
bool rasterizer_dirty = true;
5455
bool mesh_dirty = false;
5556

5657
bool update_queued = false;
@@ -85,11 +86,11 @@ class RasterizedMeshTexture : public Texture2D {
8586
void set_surface_index(int p_surface_index);
8687
int get_surface_index() const;
8788

88-
void set_texture_format(RS::RasterizedTextureFormat p_texture_format);
89-
RS::RasterizedTextureFormat get_texture_format() const;
89+
void set_texture_format(RS::TextureDrawableFormat p_texture_format);
90+
RS::TextureDrawableFormat get_texture_format() const;
9091

91-
void set_samples(RD::TextureSamples p_samples);
92-
RD::TextureSamples get_samples() const;
92+
void set_multisample(RD::TextureSamples p_multisample);
93+
RD::TextureSamples get_multisample() const;
9394

9495
void set_generate_mipmaps(bool p_generate_mipmaps);
9596
bool is_generating_mipmaps() const;

servers/rendering/dummy/mesh_rasterizer_dummy.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@ namespace RendererDummy {
3737
class MeshRasterizerDummy : public MeshRasterizer {
3838
public:
3939
virtual RID mesh_rasterizer_allocate() override { return RID(); }
40-
virtual void mesh_rasterizer_initialize(RID p_mesh_rasterizer, int p_width, int p_height, RS::RasterizedTextureFormat p_texture_format, bool p_generate_mipmaps, RD::TextureSamples p_samples) override {}
41-
virtual void mesh_rasterizer_set_mesh(RID p_mesh_rasterizer, RID p_mesh, int p_surface_index) override {}
42-
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color) override {}
43-
virtual RID mesh_rasterizer_get_texture(RID p_mesh_rasterizer) override { return RID(); }
40+
void mesh_rasterizer_initialize(RID p_mesh_rasterizer, RID p_mesh, int surface_index) override {}
41+
void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, RID p_texture_drawable, RS::RasterizerBlendMode p_blend_mode, const Color &p_bg_color, RD::TextureSamples p_multisample = RD::TEXTURE_SAMPLES_1) override {}
4442
virtual bool free(RID p_mesh_rasterizer) override { return true; }
4543
};
4644
} //namespace RendererDummy

servers/rendering/dummy/storage/texture_storage.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ class TextureStorage : public RendererTextureStorage {
159159
virtual void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) override {}
160160
virtual void decal_instance_set_sorting_offset(RID p_decal_instance, float p_sorting_offset) override {}
161161

162+
/* TEXTURE DRAWABLE API */
163+
164+
void texture_drawable_initialize(RID p_rid, int p_width, int p_height, RS::TextureDrawableFormat p_texture_format, bool p_use_mipmaps = false) override {}
165+
void texture_drawable_generate_mipmaps(RID p_texture_drawable) override {}
166+
162167
/* RENDER TARGET */
163168

164169
virtual RID render_target_create() override { return RID(); }

servers/rendering/mesh_rasterizer.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,9 @@ class MeshRasterizer {
3838

3939
public:
4040
virtual RID mesh_rasterizer_allocate() = 0;
41-
virtual void mesh_rasterizer_initialize(RID p_mesh_rasterizer, int p_width, int p_height, RS::RasterizedTextureFormat p_texture_format, bool p_generate_mipmaps, RD::TextureSamples p_samples) = 0;
42-
virtual void mesh_rasterizer_set_mesh(RID p_mesh_rasterizer, RID p_mesh, int p_surface_index) = 0;
43-
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color) = 0;
44-
virtual RID mesh_rasterizer_get_texture(RID p_mesh_rasterizer) = 0;
41+
virtual void mesh_rasterizer_initialize(RID p_mesh_rasterizer, RID p_mesh, int p_surface_index) = 0;
42+
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, RID p_texture_drawable, RS::RasterizerBlendMode p_blend_mode, const Color &p_clear_color, RD::TextureSamples p_multisample = RD::TEXTURE_SAMPLES_1) = 0;
43+
4544
virtual bool free(RID p_mesh_rasterizer) = 0;
4645

4746
static MeshRasterizer *get_singleton() { return singleton; }

0 commit comments

Comments
 (0)