mirror of
https://github.com/godotengine/godot.git
synced 2025-04-25 01:48:08 +08:00
Merge pull request #94726 from BastiaanOlij/primitive_texel_size_update
Make primitive meshes react to texel size change
This commit is contained in:
commit
5960555f9b
@ -324,22 +324,43 @@ Vector2 PrimitiveMesh::get_uv2_scale(Vector2 p_margin_scale) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
float PrimitiveMesh::get_lightmap_texel_size() const {
|
float PrimitiveMesh::get_lightmap_texel_size() const {
|
||||||
float texel_size = GLOBAL_GET("rendering/lightmapping/primitive_meshes/texel_size");
|
|
||||||
|
|
||||||
if (texel_size <= 0.0) {
|
|
||||||
texel_size = 0.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return texel_size;
|
return texel_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PrimitiveMesh::_on_settings_changed() {
|
||||||
|
float new_texel_size = float(GLOBAL_GET("rendering/lightmapping/primitive_meshes/texel_size"));
|
||||||
|
if (new_texel_size <= 0.0) {
|
||||||
|
new_texel_size = 0.2;
|
||||||
|
}
|
||||||
|
if (texel_size == new_texel_size) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
texel_size = new_texel_size;
|
||||||
|
_update_lightmap_size();
|
||||||
|
request_update();
|
||||||
|
}
|
||||||
|
|
||||||
PrimitiveMesh::PrimitiveMesh() {
|
PrimitiveMesh::PrimitiveMesh() {
|
||||||
|
ERR_FAIL_NULL(RenderingServer::get_singleton());
|
||||||
mesh = RenderingServer::get_singleton()->mesh_create();
|
mesh = RenderingServer::get_singleton()->mesh_create();
|
||||||
|
|
||||||
|
ERR_FAIL_NULL(ProjectSettings::get_singleton());
|
||||||
|
texel_size = float(GLOBAL_GET("rendering/lightmapping/primitive_meshes/texel_size"));
|
||||||
|
if (texel_size <= 0.0) {
|
||||||
|
texel_size = 0.2;
|
||||||
|
}
|
||||||
|
ProjectSettings *project_settings = ProjectSettings::get_singleton();
|
||||||
|
project_settings->connect("settings_changed", callable_mp(this, &PrimitiveMesh::_on_settings_changed));
|
||||||
}
|
}
|
||||||
|
|
||||||
PrimitiveMesh::~PrimitiveMesh() {
|
PrimitiveMesh::~PrimitiveMesh() {
|
||||||
ERR_FAIL_NULL(RenderingServer::get_singleton());
|
ERR_FAIL_NULL(RenderingServer::get_singleton());
|
||||||
RenderingServer::get_singleton()->free(mesh);
|
RenderingServer::get_singleton()->free(mesh);
|
||||||
|
|
||||||
|
ERR_FAIL_NULL(ProjectSettings::get_singleton());
|
||||||
|
ProjectSettings *project_settings = ProjectSettings::get_singleton();
|
||||||
|
project_settings->disconnect("settings_changed", callable_mp(this, &PrimitiveMesh::_on_settings_changed));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -350,7 +371,6 @@ void CapsuleMesh::_update_lightmap_size() {
|
|||||||
if (get_add_uv2()) {
|
if (get_add_uv2()) {
|
||||||
// size must have changed, update lightmap size hint
|
// size must have changed, update lightmap size hint
|
||||||
Size2i _lightmap_size_hint;
|
Size2i _lightmap_size_hint;
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float padding = get_uv2_padding();
|
float padding = get_uv2_padding();
|
||||||
|
|
||||||
float radial_length = radius * Math_PI * 0.5; // circumference of 90 degree bend
|
float radial_length = radius * Math_PI * 0.5; // circumference of 90 degree bend
|
||||||
@ -365,7 +385,6 @@ void CapsuleMesh::_update_lightmap_size() {
|
|||||||
|
|
||||||
void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
|
void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
|
||||||
bool _add_uv2 = get_add_uv2();
|
bool _add_uv2 = get_add_uv2();
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float _uv2_padding = get_uv2_padding() * texel_size;
|
float _uv2_padding = get_uv2_padding() * texel_size;
|
||||||
|
|
||||||
create_mesh_array(p_arr, radius, height, radial_segments, rings, _add_uv2, _uv2_padding);
|
create_mesh_array(p_arr, radius, height, radial_segments, rings, _add_uv2, _uv2_padding);
|
||||||
@ -613,7 +632,6 @@ void BoxMesh::_update_lightmap_size() {
|
|||||||
if (get_add_uv2()) {
|
if (get_add_uv2()) {
|
||||||
// size must have changed, update lightmap size hint
|
// size must have changed, update lightmap size hint
|
||||||
Size2i _lightmap_size_hint;
|
Size2i _lightmap_size_hint;
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float padding = get_uv2_padding();
|
float padding = get_uv2_padding();
|
||||||
|
|
||||||
float width = (size.x + size.z) / texel_size;
|
float width = (size.x + size.z) / texel_size;
|
||||||
@ -632,7 +650,6 @@ void BoxMesh::_create_mesh_array(Array &p_arr) const {
|
|||||||
// With 3 faces along the width and 2 along the height of the texture we need to adjust our scale
|
// With 3 faces along the width and 2 along the height of the texture we need to adjust our scale
|
||||||
// accordingly.
|
// accordingly.
|
||||||
bool _add_uv2 = get_add_uv2();
|
bool _add_uv2 = get_add_uv2();
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float _uv2_padding = get_uv2_padding() * texel_size;
|
float _uv2_padding = get_uv2_padding() * texel_size;
|
||||||
|
|
||||||
BoxMesh::create_mesh_array(p_arr, size, subdivide_w, subdivide_h, subdivide_d, _add_uv2, _uv2_padding);
|
BoxMesh::create_mesh_array(p_arr, size, subdivide_w, subdivide_h, subdivide_d, _add_uv2, _uv2_padding);
|
||||||
@ -937,7 +954,6 @@ void CylinderMesh::_update_lightmap_size() {
|
|||||||
if (get_add_uv2()) {
|
if (get_add_uv2()) {
|
||||||
// size must have changed, update lightmap size hint
|
// size must have changed, update lightmap size hint
|
||||||
Size2i _lightmap_size_hint;
|
Size2i _lightmap_size_hint;
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float padding = get_uv2_padding();
|
float padding = get_uv2_padding();
|
||||||
|
|
||||||
float top_circumference = top_radius * Math_PI * 2.0;
|
float top_circumference = top_radius * Math_PI * 2.0;
|
||||||
@ -957,7 +973,6 @@ void CylinderMesh::_update_lightmap_size() {
|
|||||||
|
|
||||||
void CylinderMesh::_create_mesh_array(Array &p_arr) const {
|
void CylinderMesh::_create_mesh_array(Array &p_arr) const {
|
||||||
bool _add_uv2 = get_add_uv2();
|
bool _add_uv2 = get_add_uv2();
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float _uv2_padding = get_uv2_padding() * texel_size;
|
float _uv2_padding = get_uv2_padding() * texel_size;
|
||||||
|
|
||||||
create_mesh_array(p_arr, top_radius, bottom_radius, height, radial_segments, rings, cap_top, cap_bottom, _add_uv2, _uv2_padding);
|
create_mesh_array(p_arr, top_radius, bottom_radius, height, radial_segments, rings, cap_top, cap_bottom, _add_uv2, _uv2_padding);
|
||||||
@ -1244,7 +1259,6 @@ void PlaneMesh::_update_lightmap_size() {
|
|||||||
if (get_add_uv2()) {
|
if (get_add_uv2()) {
|
||||||
// size must have changed, update lightmap size hint
|
// size must have changed, update lightmap size hint
|
||||||
Size2i _lightmap_size_hint;
|
Size2i _lightmap_size_hint;
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float padding = get_uv2_padding();
|
float padding = get_uv2_padding();
|
||||||
|
|
||||||
_lightmap_size_hint.x = MAX(1.0, (size.x / texel_size) + padding);
|
_lightmap_size_hint.x = MAX(1.0, (size.x / texel_size) + padding);
|
||||||
@ -1416,7 +1430,6 @@ void PrismMesh::_update_lightmap_size() {
|
|||||||
if (get_add_uv2()) {
|
if (get_add_uv2()) {
|
||||||
// size must have changed, update lightmap size hint
|
// size must have changed, update lightmap size hint
|
||||||
Size2i _lightmap_size_hint;
|
Size2i _lightmap_size_hint;
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float padding = get_uv2_padding();
|
float padding = get_uv2_padding();
|
||||||
|
|
||||||
// left_to_right does not effect the surface area of the prism so we ignore that.
|
// left_to_right does not effect the surface area of the prism so we ignore that.
|
||||||
@ -1440,7 +1453,6 @@ void PrismMesh::_create_mesh_array(Array &p_arr) const {
|
|||||||
|
|
||||||
// Only used if we calculate UV2
|
// Only used if we calculate UV2
|
||||||
bool _add_uv2 = get_add_uv2();
|
bool _add_uv2 = get_add_uv2();
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float _uv2_padding = get_uv2_padding() * texel_size;
|
float _uv2_padding = get_uv2_padding() * texel_size;
|
||||||
|
|
||||||
float horizontal_total = size.x + size.z + 2.0 * _uv2_padding;
|
float horizontal_total = size.x + size.z + 2.0 * _uv2_padding;
|
||||||
@ -1762,7 +1774,6 @@ void SphereMesh::_update_lightmap_size() {
|
|||||||
if (get_add_uv2()) {
|
if (get_add_uv2()) {
|
||||||
// size must have changed, update lightmap size hint
|
// size must have changed, update lightmap size hint
|
||||||
Size2i _lightmap_size_hint;
|
Size2i _lightmap_size_hint;
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float padding = get_uv2_padding();
|
float padding = get_uv2_padding();
|
||||||
|
|
||||||
float _width = radius * Math_TAU;
|
float _width = radius * Math_TAU;
|
||||||
@ -1776,7 +1787,6 @@ void SphereMesh::_update_lightmap_size() {
|
|||||||
|
|
||||||
void SphereMesh::_create_mesh_array(Array &p_arr) const {
|
void SphereMesh::_create_mesh_array(Array &p_arr) const {
|
||||||
bool _add_uv2 = get_add_uv2();
|
bool _add_uv2 = get_add_uv2();
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float _uv2_padding = get_uv2_padding() * texel_size;
|
float _uv2_padding = get_uv2_padding() * texel_size;
|
||||||
|
|
||||||
create_mesh_array(p_arr, radius, height, radial_segments, rings, is_hemisphere, _add_uv2, _uv2_padding);
|
create_mesh_array(p_arr, radius, height, radial_segments, rings, is_hemisphere, _add_uv2, _uv2_padding);
|
||||||
@ -1950,7 +1960,6 @@ void TorusMesh::_update_lightmap_size() {
|
|||||||
if (get_add_uv2()) {
|
if (get_add_uv2()) {
|
||||||
// size must have changed, update lightmap size hint
|
// size must have changed, update lightmap size hint
|
||||||
Size2i _lightmap_size_hint;
|
Size2i _lightmap_size_hint;
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float padding = get_uv2_padding();
|
float padding = get_uv2_padding();
|
||||||
|
|
||||||
float min_radius = inner_radius;
|
float min_radius = inner_radius;
|
||||||
@ -2000,7 +2009,6 @@ void TorusMesh::_create_mesh_array(Array &p_arr) const {
|
|||||||
|
|
||||||
// Only used if we calculate UV2
|
// Only used if we calculate UV2
|
||||||
bool _add_uv2 = get_add_uv2();
|
bool _add_uv2 = get_add_uv2();
|
||||||
float texel_size = get_lightmap_texel_size();
|
|
||||||
float _uv2_padding = get_uv2_padding() * texel_size;
|
float _uv2_padding = get_uv2_padding() * texel_size;
|
||||||
|
|
||||||
float horizontal_total = max_radius * Math_TAU + _uv2_padding;
|
float horizontal_total = max_radius * Math_TAU + _uv2_padding;
|
||||||
|
@ -67,6 +67,9 @@ protected:
|
|||||||
// assume primitive triangles as the type, correct for all but one and it will change this :)
|
// assume primitive triangles as the type, correct for all but one and it will change this :)
|
||||||
Mesh::PrimitiveType primitive_type = Mesh::PRIMITIVE_TRIANGLES;
|
Mesh::PrimitiveType primitive_type = Mesh::PRIMITIVE_TRIANGLES;
|
||||||
|
|
||||||
|
// Copy of our texel_size project setting.
|
||||||
|
float texel_size = 0.2;
|
||||||
|
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
virtual void _create_mesh_array(Array &p_arr) const {}
|
virtual void _create_mesh_array(Array &p_arr) const {}
|
||||||
@ -76,6 +79,8 @@ protected:
|
|||||||
float get_lightmap_texel_size() const;
|
float get_lightmap_texel_size() const;
|
||||||
virtual void _update_lightmap_size(){};
|
virtual void _update_lightmap_size(){};
|
||||||
|
|
||||||
|
void _on_settings_changed();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual int get_surface_count() const override;
|
virtual int get_surface_count() const override;
|
||||||
virtual int surface_get_array_len(int p_idx) const override;
|
virtual int surface_get_array_len(int p_idx) const override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user