Add a double-precision editor build to CI

This commit is contained in:
Aaron Franke 2021-09-16 01:03:50 -05:00
parent 012b2b5385
commit e9808e3d9a
No known key found for this signature in database
GPG key ID: 40A1750B977E56BF
16 changed files with 107 additions and 109 deletions

View file

@ -29,15 +29,15 @@ jobs:
build-mono: true build-mono: true
artifact: true artifact: true
- name: Editor and sanitizers (target=debug, tools=yes, tests=yes, use_asan=yes, use_ubsan=yes) - name: Editor with doubles and sanitizers (target=debug, tools=yes, float=64, tests=yes, use_asan=yes, use_ubsan=yes)
cache-name: linux-editor-sanitizers cache-name: linux-editor-double-sanitizers
target: debug target: debug
tools: true tools: true
tests: true tests: true
sconsflags: use_asan=yes use_ubsan=yes sconsflags: float=64 use_asan=yes use_ubsan=yes
proj-test: true proj-test: true
godot-cpp-test: true godot-cpp-test: true
bin: "./bin/godot.linuxbsd.tools.64s" bin: "./bin/godot.linuxbsd.double.tools.64s"
build-mono: false build-mono: false
# Skip 2GiB artifact speeding up action. # Skip 2GiB artifact speeding up action.
artifact: false artifact: false

View file

@ -791,10 +791,10 @@ void ShaderGLES3::use_material(void *p_material) {
Transform2D tr = V->get(); Transform2D tr = V->get();
GLfloat matrix[4] = { GLfloat matrix[4] = {
/* build a 16x16 matrix */ /* build a 16x16 matrix */
tr.elements[0][0], (GLfloat)tr.elements[0][0],
tr.elements[0][1], (GLfloat)tr.elements[0][1],
tr.elements[1][0], (GLfloat)tr.elements[1][0],
tr.elements[1][1], (GLfloat)tr.elements[1][1],
}; };
glUniformMatrix2fv(location, 1, GL_FALSE, matrix); glUniformMatrix2fv(location, 1, GL_FALSE, matrix);
@ -804,15 +804,15 @@ void ShaderGLES3::use_material(void *p_material) {
Basis val = V->get(); Basis val = V->get();
GLfloat mat[9] = { GLfloat mat[9] = {
val.elements[0][0], (GLfloat)val.elements[0][0],
val.elements[1][0], (GLfloat)val.elements[1][0],
val.elements[2][0], (GLfloat)val.elements[2][0],
val.elements[0][1], (GLfloat)val.elements[0][1],
val.elements[1][1], (GLfloat)val.elements[1][1],
val.elements[2][1], (GLfloat)val.elements[2][1],
val.elements[0][2], (GLfloat)val.elements[0][2],
val.elements[1][2], (GLfloat)val.elements[1][2],
val.elements[2][2], (GLfloat)val.elements[2][2],
}; };
glUniformMatrix3fv(location, 1, GL_FALSE, mat); glUniformMatrix3fv(location, 1, GL_FALSE, mat);
@ -822,22 +822,22 @@ void ShaderGLES3::use_material(void *p_material) {
case ShaderLanguage::TYPE_MAT4: { case ShaderLanguage::TYPE_MAT4: {
Transform2D tr = V->get(); Transform2D tr = V->get();
GLfloat matrix[16] = { /* build a 16x16 matrix */ GLfloat matrix[16] = { /* build a 16x16 matrix */
tr.elements[0][0], (GLfloat)tr.elements[0][0],
tr.elements[0][1], (GLfloat)tr.elements[0][1],
0, (GLfloat)0,
0, (GLfloat)0,
tr.elements[1][0], (GLfloat)tr.elements[1][0],
tr.elements[1][1], (GLfloat)tr.elements[1][1],
0, (GLfloat)0,
0, (GLfloat)0,
0, (GLfloat)0,
0, (GLfloat)0,
1, (GLfloat)1,
0, (GLfloat)0,
tr.elements[2][0], (GLfloat)tr.elements[2][0],
tr.elements[2][1], (GLfloat)tr.elements[2][1],
0, (GLfloat)0,
1 (GLfloat)1
}; };
glUniformMatrix4fv(location, 1, GL_FALSE, matrix); glUniformMatrix4fv(location, 1, GL_FALSE, matrix);

View file

@ -267,13 +267,13 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
"\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Color& p_color) { _FU GLfloat col[4]={p_color.r,p_color.g,p_color.b,p_color.a}; glUniform4fv(get_uniform(p_uniform),1,col); }\n\n" "\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Color& p_color) { _FU GLfloat col[4]={p_color.r,p_color.g,p_color.b,p_color.a}; glUniform4fv(get_uniform(p_uniform),1,col); }\n\n"
) )
fd.write( fd.write(
"\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Vector2& p_vec2) { _FU GLfloat vec2[2]={p_vec2.x,p_vec2.y}; glUniform2fv(get_uniform(p_uniform),1,vec2); }\n\n" "\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Vector2& p_vec2) { _FU GLfloat vec2[2]={(GLfloat)p_vec2.x,(GLfloat)p_vec2.y}; glUniform2fv(get_uniform(p_uniform),1,vec2); }\n\n"
) )
fd.write( fd.write(
"\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Size2i& p_vec2) { _FU GLint vec2[2]={p_vec2.x,p_vec2.y}; glUniform2iv(get_uniform(p_uniform),1,vec2); }\n\n" "\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Size2i& p_vec2) { _FU GLint vec2[2]={(GLint)p_vec2.x,(GLint)p_vec2.y}; glUniform2iv(get_uniform(p_uniform),1,vec2); }\n\n"
) )
fd.write( fd.write(
"\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Vector3& p_vec3) { _FU GLfloat vec3[3]={p_vec3.x,p_vec3.y,p_vec3.z}; glUniform3fv(get_uniform(p_uniform),1,vec3); }\n\n" "\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Vector3& p_vec3) { _FU GLfloat vec3[3]={(GLfloat)p_vec3.x,(GLfloat)p_vec3.y,(GLfloat)p_vec3.z}; glUniform3fv(get_uniform(p_uniform),1,vec3); }\n\n"
) )
fd.write( fd.write(
"\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_a, float p_b) { _FU glUniform2f(get_uniform(p_uniform),p_a,p_b); }\n\n" "\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_a, float p_b) { _FU glUniform2f(get_uniform(p_uniform),p_a,p_b); }\n\n"
@ -291,22 +291,22 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
const Transform3D &tr = p_transform; const Transform3D &tr = p_transform;
GLfloat matrix[16]={ /* build a 16x16 matrix */ GLfloat matrix[16]={ /* build a 16x16 matrix */
tr.basis.elements[0][0], (GLfloat)tr.basis.elements[0][0],
tr.basis.elements[1][0], (GLfloat)tr.basis.elements[1][0],
tr.basis.elements[2][0], (GLfloat)tr.basis.elements[2][0],
0, (GLfloat)0,
tr.basis.elements[0][1], (GLfloat)tr.basis.elements[0][1],
tr.basis.elements[1][1], (GLfloat)tr.basis.elements[1][1],
tr.basis.elements[2][1], (GLfloat)tr.basis.elements[2][1],
0, (GLfloat)0,
tr.basis.elements[0][2], (GLfloat)tr.basis.elements[0][2],
tr.basis.elements[1][2], (GLfloat)tr.basis.elements[1][2],
tr.basis.elements[2][2], (GLfloat)tr.basis.elements[2][2],
0, (GLfloat)0,
tr.origin.x, (GLfloat)tr.origin.x,
tr.origin.y, (GLfloat)tr.origin.y,
tr.origin.z, (GLfloat)tr.origin.z,
1 (GLfloat)1
}; };
@ -324,22 +324,22 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
const Transform2D &tr = p_transform; const Transform2D &tr = p_transform;
GLfloat matrix[16]={ /* build a 16x16 matrix */ GLfloat matrix[16]={ /* build a 16x16 matrix */
tr.elements[0][0], (GLfloat)tr.elements[0][0],
tr.elements[0][1], (GLfloat)tr.elements[0][1],
0, (GLfloat)0,
0, (GLfloat)0,
tr.elements[1][0], (GLfloat)tr.elements[1][0],
tr.elements[1][1], (GLfloat)tr.elements[1][1],
0, (GLfloat)0,
0, (GLfloat)0,
0, (GLfloat)0,
0, (GLfloat)0,
1, (GLfloat)1,
0, (GLfloat)0,
tr.elements[2][0], (GLfloat)tr.elements[2][0],
tr.elements[2][1], (GLfloat)tr.elements[2][1],
0, (GLfloat)0,
1 (GLfloat)1
}; };

View file

@ -50,7 +50,7 @@ public:
template <class T> template <class T>
struct Channel { struct Channel {
Interpolation interpolation; Interpolation interpolation;
Vector<float> times; Vector<real_t> times;
Vector<T> values; Vector<T> values;
}; };
@ -58,7 +58,7 @@ public:
Channel<Vector3> position_track; Channel<Vector3> position_track;
Channel<Quaternion> rotation_track; Channel<Quaternion> rotation_track;
Channel<Vector3> scale_track; Channel<Vector3> scale_track;
Vector<Channel<float>> weight_tracks; Vector<Channel<real_t>> weight_tracks;
}; };
public: public:

View file

@ -4804,7 +4804,7 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) {
bool last = false; bool last = false;
Vector<real_t> weight_track; Vector<real_t> weight_track;
while (true) { while (true) {
float weight = _interpolate_track<float>(track.weight_tracks[track_idx].times, float weight = _interpolate_track<real_t>(track.weight_tracks[track_idx].times,
track.weight_tracks[track_idx].values, track.weight_tracks[track_idx].values,
time, time,
track.weight_tracks[track_idx].interpolation); track.weight_tracks[track_idx].interpolation);
@ -4828,7 +4828,7 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) {
int32_t weight_tracks_size = track.weight_tracks.size(); int32_t weight_tracks_size = track.weight_tracks.size();
all_track_values.resize(weight_tracks_size * values_size); all_track_values.resize(weight_tracks_size * values_size);
for (int k = 0; k < track.weight_tracks.size(); k++) { for (int k = 0; k < track.weight_tracks.size(); k++) {
Vector<float> wdata = track.weight_tracks[k].values; Vector<real_t> wdata = track.weight_tracks[k].values;
for (int l = 0; l < wdata.size(); l++) { for (int l = 0; l < wdata.size(); l++) {
int32_t index = l * weight_tracks_size + k; int32_t index = l * weight_tracks_size + k;
ERR_BREAK(index >= all_track_values.size()); ERR_BREAK(index >= all_track_values.size());
@ -4979,10 +4979,10 @@ Error GLTFDocument::_parse_animations(Ref<GLTFState> state) {
const int wlen = weights.size() / wc; const int wlen = weights.size() / wc;
for (int k = 0; k < wc; k++) { //separate tracks, having them together is not such a good idea for (int k = 0; k < wc; k++) { //separate tracks, having them together is not such a good idea
GLTFAnimation::Channel<float> cf; GLTFAnimation::Channel<real_t> cf;
cf.interpolation = interp; cf.interpolation = interp;
cf.times = Variant(times); cf.times = Variant(times);
Vector<float> wdata; Vector<real_t> wdata;
wdata.resize(wlen); wdata.resize(wlen);
for (int l = 0; l < wlen; l++) { for (int l = 0; l < wlen; l++) {
wdata.write[l] = weights[l * wc + k]; wdata.write[l] = weights[l * wc + k];
@ -5772,7 +5772,7 @@ struct EditorSceneFormatImporterGLTFInterpolate<Quaternion> {
}; };
template <class T> template <class T>
T GLTFDocument::_interpolate_track(const Vector<float> &p_times, const Vector<T> &p_values, const float p_time, const GLTFAnimation::Interpolation p_interp) { T GLTFDocument::_interpolate_track(const Vector<real_t> &p_times, const Vector<T> &p_values, const float p_time, const GLTFAnimation::Interpolation p_interp) {
ERR_FAIL_COND_V(!p_values.size(), T()); ERR_FAIL_COND_V(!p_values.size(), T());
if (p_times.size() != (p_values.size() / (p_interp == GLTFAnimation::INTERP_CUBIC_SPLINE ? 3 : 1))) { if (p_times.size() != (p_values.size() / (p_interp == GLTFAnimation::INTERP_CUBIC_SPLINE ? 3 : 1))) {
ERR_PRINT_ONCE("The interpolated values are not corresponding to its times."); ERR_PRINT_ONCE("The interpolated values are not corresponding to its times.");
@ -6052,7 +6052,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap,
double time = 0.0; double time = 0.0;
bool last = false; bool last = false;
while (true) { while (true) {
float blend = _interpolate_track<float>(track.weight_tracks[i].times, track.weight_tracks[i].values, time, gltf_interp); real_t blend = _interpolate_track<real_t>(track.weight_tracks[i].times, track.weight_tracks[i].values, time, gltf_interp);
animation->blend_shape_track_insert_key(track_idx, time, blend); animation->blend_shape_track_insert_key(track_idx, time, blend);
if (last) { if (last) {
break; break;
@ -6246,7 +6246,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> state
} }
Animation::TrackType track_type = p_animation->track_get_type(p_track_i); Animation::TrackType track_type = p_animation->track_get_type(p_track_i);
int32_t key_count = p_animation->track_get_key_count(p_track_i); int32_t key_count = p_animation->track_get_key_count(p_track_i);
Vector<float> times; Vector<real_t> times;
times.resize(key_count); times.resize(key_count);
String path = p_animation->track_get_path(p_track_i); String path = p_animation->track_get_path(p_track_i);
for (int32_t key_i = 0; key_i < key_count; key_i++) { for (int32_t key_i = 0; key_i < key_count; key_i++) {
@ -6352,7 +6352,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> state
if (path.find("/scale") != -1) { if (path.find("/scale") != -1) {
const int32_t keys = p_animation->track_get_key_time(p_track_i, key_count - 1) * BAKE_FPS; const int32_t keys = p_animation->track_get_key_time(p_track_i, key_count - 1) * BAKE_FPS;
if (!p_track.scale_track.times.size()) { if (!p_track.scale_track.times.size()) {
Vector<float> new_times; Vector<real_t> new_times;
new_times.resize(keys); new_times.resize(keys);
for (int32_t key_i = 0; key_i < keys; key_i++) { for (int32_t key_i = 0; key_i < keys; key_i++) {
new_times.write[key_i] = key_i / BAKE_FPS; new_times.write[key_i] = key_i / BAKE_FPS;
@ -6382,7 +6382,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> state
} else if (path.find("/position") != -1) { } else if (path.find("/position") != -1) {
const int32_t keys = p_animation->track_get_key_time(p_track_i, key_count - 1) * BAKE_FPS; const int32_t keys = p_animation->track_get_key_time(p_track_i, key_count - 1) * BAKE_FPS;
if (!p_track.position_track.times.size()) { if (!p_track.position_track.times.size()) {
Vector<float> new_times; Vector<real_t> new_times;
new_times.resize(keys); new_times.resize(keys);
for (int32_t key_i = 0; key_i < keys; key_i++) { for (int32_t key_i = 0; key_i < keys; key_i++) {
new_times.write[key_i] = key_i / BAKE_FPS; new_times.write[key_i] = key_i / BAKE_FPS;
@ -6503,7 +6503,7 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap,
NodePath shape_path = String(path) + ":" + shape_name; NodePath shape_path = String(path) + ":" + shape_name;
int32_t shape_track_i = animation->find_track(shape_path, Animation::TYPE_BLEND_SHAPE); int32_t shape_track_i = animation->find_track(shape_path, Animation::TYPE_BLEND_SHAPE);
if (shape_track_i == -1) { if (shape_track_i == -1) {
GLTFAnimation::Channel<float> weight; GLTFAnimation::Channel<real_t> weight;
weight.interpolation = GLTFAnimation::INTERP_LINEAR; weight.interpolation = GLTFAnimation::INTERP_LINEAR;
weight.times.push_back(0.0f); weight.times.push_back(0.0f);
weight.times.push_back(0.0f); weight.times.push_back(0.0f);
@ -6522,7 +6522,7 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap,
gltf_interpolation = GLTFAnimation::INTERP_CUBIC_SPLINE; gltf_interpolation = GLTFAnimation::INTERP_CUBIC_SPLINE;
} }
int32_t key_count = animation->track_get_key_count(shape_track_i); int32_t key_count = animation->track_get_key_count(shape_track_i);
GLTFAnimation::Channel<float> weight; GLTFAnimation::Channel<real_t> weight;
weight.interpolation = gltf_interpolation; weight.interpolation = gltf_interpolation;
weight.times.resize(key_count); weight.times.resize(key_count);
for (int32_t time_i = 0; time_i < key_count; time_i++) { for (int32_t time_i = 0; time_i < key_count; time_i++) {

View file

@ -293,7 +293,7 @@ private:
Node3D *_generate_spatial(Ref<GLTFState> state, Node *parent_node, const GLTFNodeIndex node_index); Node3D *_generate_spatial(Ref<GLTFState> state, Node *parent_node, const GLTFNodeIndex node_index);
void _assign_scene_names(Ref<GLTFState> state); void _assign_scene_names(Ref<GLTFState> state);
template <class T> template <class T>
T _interpolate_track(const Vector<float> &p_times, const Vector<T> &p_values, T _interpolate_track(const Vector<real_t> &p_times, const Vector<T> &p_values,
const float p_time, const float p_time,
const GLTFAnimation::Interpolation p_interp); const GLTFAnimation::Interpolation p_interp);
GLTFAccessorIndex _encode_accessor_as_quaternions(Ref<GLTFState> state, GLTFAccessorIndex _encode_accessor_as_quaternions(Ref<GLTFState> state,

View file

@ -729,7 +729,7 @@ void CPUParticles2D::_particles_process(double p_delta) {
real_t angle1_rad = direction.angle() + Math::deg2rad((Math::randf() * 2.0 - 1.0) * spread); real_t angle1_rad = direction.angle() + Math::deg2rad((Math::randf() * 2.0 - 1.0) * spread);
Vector2 rot = Vector2(Math::cos(angle1_rad), Math::sin(angle1_rad)); Vector2 rot = Vector2(Math::cos(angle1_rad), Math::sin(angle1_rad));
p.velocity = rot * Math::lerp(parameters_min[PARAM_INITIAL_LINEAR_VELOCITY], parameters_min[PARAM_INITIAL_LINEAR_VELOCITY], Math::randf()); p.velocity = rot * Math::lerp(parameters_min[PARAM_INITIAL_LINEAR_VELOCITY], parameters_min[PARAM_INITIAL_LINEAR_VELOCITY], (real_t)Math::randf());
real_t base_angle = tex_angle * Math::lerp(parameters_min[PARAM_ANGLE], parameters_max[PARAM_ANGLE], p.angle_rand); real_t base_angle = tex_angle * Math::lerp(parameters_min[PARAM_ANGLE], parameters_max[PARAM_ANGLE], p.angle_rand);
p.rotation = Math::deg2rad(base_angle); p.rotation = Math::deg2rad(base_angle);

View file

@ -751,7 +751,7 @@ void CPUParticles3D::_particles_process(double p_delta) {
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) { if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
real_t angle1_rad = Math::atan2(direction.y, direction.x) + Math::deg2rad((Math::randf() * 2.0 - 1.0) * spread); real_t angle1_rad = Math::atan2(direction.y, direction.x) + Math::deg2rad((Math::randf() * 2.0 - 1.0) * spread);
Vector3 rot = Vector3(Math::cos(angle1_rad), Math::sin(angle1_rad), 0.0); Vector3 rot = Vector3(Math::cos(angle1_rad), Math::sin(angle1_rad), 0.0);
p.velocity = rot * Math::lerp(parameters_min[PARAM_INITIAL_LINEAR_VELOCITY], parameters_max[PARAM_INITIAL_LINEAR_VELOCITY], Math::randf()); p.velocity = rot * Math::lerp(parameters_min[PARAM_INITIAL_LINEAR_VELOCITY], parameters_max[PARAM_INITIAL_LINEAR_VELOCITY], (real_t)Math::randf());
} else { } else {
//initiate velocity spread in 3D //initiate velocity spread in 3D
real_t angle1_rad = Math::deg2rad((Math::randf() * (real_t)2.0 - (real_t)1.0) * spread); real_t angle1_rad = Math::deg2rad((Math::randf() * (real_t)2.0 - (real_t)1.0) * spread);
@ -775,7 +775,7 @@ void CPUParticles3D::_particles_process(double p_delta) {
binormal.normalize(); binormal.normalize();
Vector3 normal = binormal.cross(direction_nrm); Vector3 normal = binormal.cross(direction_nrm);
spread_direction = binormal * spread_direction.x + normal * spread_direction.y + direction_nrm * spread_direction.z; spread_direction = binormal * spread_direction.x + normal * spread_direction.y + direction_nrm * spread_direction.z;
p.velocity = spread_direction * Math::lerp(parameters_min[PARAM_INITIAL_LINEAR_VELOCITY], parameters_max[PARAM_INITIAL_LINEAR_VELOCITY], float(Math::randf())); p.velocity = spread_direction * Math::lerp(parameters_min[PARAM_INITIAL_LINEAR_VELOCITY], parameters_max[PARAM_INITIAL_LINEAR_VELOCITY], (real_t)Math::randf());
} }
real_t base_angle = tex_angle * Math::lerp(parameters_min[PARAM_ANGLE], parameters_max[PARAM_ANGLE], p.angle_rand); real_t base_angle = tex_angle * Math::lerp(parameters_min[PARAM_ANGLE], parameters_max[PARAM_ANGLE], p.angle_rand);

View file

@ -736,7 +736,7 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double
ba->bezier_accum = bezier; ba->bezier_accum = bezier;
ba->accum_pass = accum_pass; ba->accum_pass = accum_pass;
} else { } else {
ba->bezier_accum = Math::lerp(ba->bezier_accum, bezier, p_interp); ba->bezier_accum = Math::lerp(ba->bezier_accum, (float)bezier, p_interp);
} }
} break; } break;

View file

@ -1239,8 +1239,7 @@ void AnimationTree::_process_graph(real_t p_delta) {
continue; continue;
} }
t->value = Math::lerp(t->value, value, blend); t->value = Math::lerp(t->value, value, (float)blend);
#endif // _3D_DISABLED #endif // _3D_DISABLED
} break; } break;
case Animation::TYPE_VALUE: { case Animation::TYPE_VALUE: {

View file

@ -3998,13 +3998,12 @@ bool Animation::_blend_shape_track_optimize_key(const TKey<float> &t0, const TKe
float v1 = t1.value; float v1 = t1.value;
float v2 = t2.value; float v2 = t2.value;
if (Math::is_equal_approx(v1, v2, p_allowed_unit_error)) { if (Math::is_equal_approx(v1, v2, (float)p_allowed_unit_error)) {
//0 and 2 are close, let's see if 1 is close //0 and 2 are close, let's see if 1 is close
if (!Math::is_equal_approx(v0, v1, p_allowed_unit_error)) { if (!Math::is_equal_approx(v0, v1, (float)p_allowed_unit_error)) {
//not close, not optimizable //not close, not optimizable
return false; return false;
} }
} else { } else {
/* /*
TODO eventually discuss a way to optimize these better. TODO eventually discuss a way to optimize these better.

View file

@ -1449,7 +1449,7 @@ real_t Font::get_underline_thickness(int p_size) const {
return ret; return ret;
} }
Size2 Font::get_string_size(const String &p_text, int p_size, HorizontalAlignment p_alignment, real_t p_width, uint16_t p_flags) const { Size2 Font::get_string_size(const String &p_text, int p_size, HorizontalAlignment p_alignment, float p_width, uint16_t p_flags) const {
ERR_FAIL_COND_V(data.is_empty(), Size2()); ERR_FAIL_COND_V(data.is_empty(), Size2());
for (int i = 0; i < data.size(); i++) { for (int i = 0; i < data.size(); i++) {
@ -1474,7 +1474,7 @@ Size2 Font::get_string_size(const String &p_text, int p_size, HorizontalAlignmen
return buffer->get_size(); return buffer->get_size();
} }
Size2 Font::get_multiline_string_size(const String &p_text, real_t p_width, int p_size, uint16_t p_flags) const { Size2 Font::get_multiline_string_size(const String &p_text, float p_width, int p_size, uint16_t p_flags) const {
ERR_FAIL_COND_V(data.is_empty(), Size2()); ERR_FAIL_COND_V(data.is_empty(), Size2());
for (int i = 0; i < data.size(); i++) { for (int i = 0; i < data.size(); i++) {
@ -1511,7 +1511,7 @@ Size2 Font::get_multiline_string_size(const String &p_text, real_t p_width, int
return ret; return ret;
} }
void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, real_t p_width, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint16_t p_flags) const { void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_size, const Color &p_modulate, int p_outline_size, const Color &p_outline_modulate, uint16_t p_flags) const {
ERR_FAIL_COND(data.is_empty()); ERR_FAIL_COND(data.is_empty());
for (int i = 0; i < data.size(); i++) { for (int i = 0; i < data.size(); i++) {

View file

@ -273,11 +273,11 @@ public:
virtual real_t get_underline_thickness(int p_size = DEFAULT_FONT_SIZE) const; virtual real_t get_underline_thickness(int p_size = DEFAULT_FONT_SIZE) const;
// Drawing string. // Drawing string.
virtual Size2 get_string_size(const String &p_text, int p_size = DEFAULT_FONT_SIZE, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, real_t p_width = -1, uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const; virtual Size2 get_string_size(const String &p_text, int p_size = DEFAULT_FONT_SIZE, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
virtual Size2 get_multiline_string_size(const String &p_text, real_t p_width = -1, int p_size = DEFAULT_FONT_SIZE, uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND) const; virtual Size2 get_multiline_string_size(const String &p_text, float p_width = -1, int p_size = DEFAULT_FONT_SIZE, uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND) const;
virtual void draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, real_t p_width = -1, int p_size = DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const; virtual void draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_size = DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
virtual void draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, real_t p_width = -1, int p_max_lines = -1, int p_size = DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const; virtual void draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_max_lines = -1, int p_size = DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, const Color &p_outline_modulate = Color(1, 1, 1, 0), uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND) const;
// Helper functions. // Helper functions.
virtual bool has_char(char32_t p_char) const; virtual bool has_char(char32_t p_char) const;

View file

@ -485,7 +485,7 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli
raycaster->intersect(rays); raycaster->intersect(rays);
LocalVector<Vector3> ray_normals; LocalVector<Vector3> ray_normals;
LocalVector<float> ray_normal_weights; LocalVector<real_t> ray_normal_weights;
ray_normals.resize(new_index_count); ray_normals.resize(new_index_count);
ray_normal_weights.resize(new_index_count); ray_normal_weights.resize(new_index_count);
@ -517,10 +517,10 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli
Vector3 normal = n0 * w + n1 * u + n2 * v; Vector3 normal = n0 * w + n1 * u + n2 * v;
Vector2 orig_uv = ray_uvs[j]; Vector2 orig_uv = ray_uvs[j];
float orig_bary[3] = { 1.0f - orig_uv.x - orig_uv.y, orig_uv.x, orig_uv.y }; real_t orig_bary[3] = { 1.0f - orig_uv.x - orig_uv.y, orig_uv.x, orig_uv.y };
for (int k = 0; k < 3; k++) { for (int k = 0; k < 3; k++) {
int idx = orig_tri_id * 3 + k; int idx = orig_tri_id * 3 + k;
float weight = orig_bary[k]; real_t weight = orig_bary[k];
ray_normals[idx] += normal * weight; ray_normals[idx] += normal * weight;
ray_normal_weights[idx] += weight; ray_normal_weights[idx] += weight;
} }

View file

@ -786,7 +786,7 @@ void RendererCanvasCull::canvas_item_add_texture_rect(RID p_item, const Rect2 &p
if (p_tile) { if (p_tile) {
rect->flags |= RendererCanvasRender::CANVAS_RECT_TILE; rect->flags |= RendererCanvasRender::CANVAS_RECT_TILE;
rect->flags |= RendererCanvasRender::CANVAS_RECT_REGION; rect->flags |= RendererCanvasRender::CANVAS_RECT_REGION;
rect->source = Rect2(0, 0, fabsf(p_rect.size.width), fabsf(p_rect.size.height)); rect->source = Rect2(0, 0, ABS(p_rect.size.width), ABS(p_rect.size.height));
} }
if (p_rect.size.x < 0) { if (p_rect.size.x < 0) {

View file

@ -649,13 +649,13 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(RID p_shaped, const
return lines; return lines;
} }
PackedInt32Array TextServer::shaped_text_get_line_breaks(RID p_shaped, real_t p_width, int p_start, uint16_t /*TextBreakFlag*/ p_break_flags) const { PackedInt32Array TextServer::shaped_text_get_line_breaks(RID p_shaped, float p_width, int p_start, uint16_t /*TextBreakFlag*/ p_break_flags) const {
PackedInt32Array lines; PackedInt32Array lines;
const_cast<TextServer *>(this)->shaped_text_update_breaks(p_shaped); const_cast<TextServer *>(this)->shaped_text_update_breaks(p_shaped);
const Vector2i &range = shaped_text_get_range(p_shaped); const Vector2i &range = shaped_text_get_range(p_shaped);
real_t width = 0.f; float width = 0.f;
int line_start = MAX(p_start, range.x); int line_start = MAX(p_start, range.x);
int last_safe_break = -1; int last_safe_break = -1;
int word_count = 0; int word_count = 0;
@ -1035,9 +1035,9 @@ Vector<Vector2> TextServer::shaped_text_get_selection(RID p_shaped, int p_start,
return ranges; return ranges;
} }
int TextServer::shaped_text_hit_test_grapheme(RID p_shaped, real_t p_coords) const { int TextServer::shaped_text_hit_test_grapheme(RID p_shaped, float p_coords) const {
// Exact grapheme hit test, return -1 if missed. // Exact grapheme hit test, return -1 if missed.
real_t off = 0.0f; float off = 0.0f;
int v_size = shaped_text_get_glyph_count(p_shaped); int v_size = shaped_text_get_glyph_count(p_shaped);
const Glyph *glyphs = shaped_text_get_glyphs(p_shaped); const Glyph *glyphs = shaped_text_get_glyphs(p_shaped);
@ -1053,7 +1053,7 @@ int TextServer::shaped_text_hit_test_grapheme(RID p_shaped, real_t p_coords) con
return -1; return -1;
} }
int TextServer::shaped_text_hit_test_position(RID p_shaped, real_t p_coords) const { int TextServer::shaped_text_hit_test_position(RID p_shaped, float p_coords) const {
int v_size = shaped_text_get_glyph_count(p_shaped); int v_size = shaped_text_get_glyph_count(p_shaped);
const Glyph *glyphs = shaped_text_get_glyphs(p_shaped); const Glyph *glyphs = shaped_text_get_glyphs(p_shaped);
@ -1165,7 +1165,7 @@ int TextServer::shaped_text_prev_grapheme_pos(RID p_shaped, int p_pos) const {
return p_pos; return p_pos;
} }
void TextServer::shaped_text_draw(RID p_shaped, RID p_canvas, const Vector2 &p_pos, real_t p_clip_l, real_t p_clip_r, const Color &p_color) const { void TextServer::shaped_text_draw(RID p_shaped, RID p_canvas, const Vector2 &p_pos, float p_clip_l, float p_clip_r, const Color &p_color) const {
TextServer::Orientation orientation = shaped_text_get_orientation(p_shaped); TextServer::Orientation orientation = shaped_text_get_orientation(p_shaped);
bool hex_codes = shaped_text_get_preserve_control(p_shaped) || shaped_text_get_preserve_invalid(p_shaped); bool hex_codes = shaped_text_get_preserve_control(p_shaped) || shaped_text_get_preserve_invalid(p_shaped);
@ -1262,7 +1262,7 @@ void TextServer::shaped_text_draw(RID p_shaped, RID p_canvas, const Vector2 &p_p
} }
} }
void TextServer::shaped_text_draw_outline(RID p_shaped, RID p_canvas, const Vector2 &p_pos, real_t p_clip_l, real_t p_clip_r, int p_outline_size, const Color &p_color) const { void TextServer::shaped_text_draw_outline(RID p_shaped, RID p_canvas, const Vector2 &p_pos, float p_clip_l, float p_clip_r, int p_outline_size, const Color &p_color) const {
TextServer::Orientation orientation = shaped_text_get_orientation(p_shaped); TextServer::Orientation orientation = shaped_text_get_orientation(p_shaped);
bool rtl = (shaped_text_get_direction(p_shaped) == DIRECTION_RTL); bool rtl = (shaped_text_get_direction(p_shaped) == DIRECTION_RTL);