You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-11 13:10:58 +00:00
Merge pull request #94289 from clayjohn/MOBILE-multimesh-spec-constant
Use a spec constant to control whether the MultiMesh branch is used in the vertex shader.
This commit is contained in:
@@ -2058,6 +2058,10 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr
|
|||||||
|
|
||||||
uint32_t base_spec_constants = p_params->spec_constant_base_flags;
|
uint32_t base_spec_constants = p_params->spec_constant_base_flags;
|
||||||
|
|
||||||
|
if (bool(inst->flags_cache & INSTANCE_DATA_FLAG_MULTIMESH)) {
|
||||||
|
base_spec_constants |= 1 << SPEC_CONSTANT_IS_MULTIMESH;
|
||||||
|
}
|
||||||
|
|
||||||
SceneState::PushConstant push_constant;
|
SceneState::PushConstant push_constant;
|
||||||
push_constant.base_index = i + p_params->element_offset;
|
push_constant.base_index = i + p_params->element_offset;
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ private:
|
|||||||
SPEC_CONSTANT_DISABLE_DECALS = 13,
|
SPEC_CONSTANT_DISABLE_DECALS = 13,
|
||||||
SPEC_CONSTANT_DISABLE_FOG = 14,
|
SPEC_CONSTANT_DISABLE_FOG = 14,
|
||||||
SPEC_CONSTANT_USE_DEPTH_FOG = 16,
|
SPEC_CONSTANT_USE_DEPTH_FOG = 16,
|
||||||
|
SPEC_CONSTANT_IS_MULTIMESH = 17,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,10 @@ void axis_angle_to_tbn(vec3 axis, float angle, out vec3 tangent, out vec3 binorm
|
|||||||
normal = omc_axis.zzz * axis + vec3(-s_axis.y, s_axis.x, c);
|
normal = omc_axis.zzz * axis + vec3(-s_axis.y, s_axis.x, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Spec Constants */
|
||||||
|
|
||||||
|
layout(constant_id = 17) const bool sc_is_multimesh = false;
|
||||||
|
|
||||||
/* Varyings */
|
/* Varyings */
|
||||||
|
|
||||||
layout(location = 0) highp out vec3 vertex_interp;
|
layout(location = 0) highp out vec3 vertex_interp;
|
||||||
@@ -178,8 +182,6 @@ void main() {
|
|||||||
color_interp = color_attrib;
|
color_interp = color_attrib;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool is_multimesh = bool(instances.data[draw_call.instance_index].flags & INSTANCE_FLAGS_MULTIMESH);
|
|
||||||
|
|
||||||
mat4 model_matrix = instances.data[draw_call.instance_index].transform;
|
mat4 model_matrix = instances.data[draw_call.instance_index].transform;
|
||||||
mat4 inv_view_matrix = scene_data.inv_view_matrix;
|
mat4 inv_view_matrix = scene_data.inv_view_matrix;
|
||||||
#ifdef USE_DOUBLE_PRECISION
|
#ifdef USE_DOUBLE_PRECISION
|
||||||
@@ -203,7 +205,7 @@ void main() {
|
|||||||
mat4 matrix;
|
mat4 matrix;
|
||||||
mat4 read_model_matrix = model_matrix;
|
mat4 read_model_matrix = model_matrix;
|
||||||
|
|
||||||
if (is_multimesh) {
|
if (sc_is_multimesh) {
|
||||||
//multimesh, instances are for it
|
//multimesh, instances are for it
|
||||||
|
|
||||||
#ifdef USE_PARTICLE_TRAILS
|
#ifdef USE_PARTICLE_TRAILS
|
||||||
@@ -399,7 +401,7 @@ void main() {
|
|||||||
// Then we combine the translations from the model matrix and the view matrix using emulated doubles.
|
// Then we combine the translations from the model matrix and the view matrix using emulated doubles.
|
||||||
// We add the result to the vertex and ignore the final lost precision.
|
// We add the result to the vertex and ignore the final lost precision.
|
||||||
vec3 model_origin = model_matrix[3].xyz;
|
vec3 model_origin = model_matrix[3].xyz;
|
||||||
if (is_multimesh) {
|
if (sc_is_multimesh) {
|
||||||
vertex = mat3(matrix) * vertex;
|
vertex = mat3(matrix) * vertex;
|
||||||
model_origin = double_add_vec3(model_origin, model_precision, matrix[3].xyz, vec3(0.0), model_precision);
|
model_origin = double_add_vec3(model_origin, model_precision, matrix[3].xyz, vec3(0.0), model_precision);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user