Skip to content

Commit

Permalink
Merge pull request godotengine#94289 from clayjohn/MOBILE-multimesh-s…
Browse files Browse the repository at this point in the history
…pec-constant

Use a spec constant to control whether the MultiMesh branch is used in the vertex shader.
  • Loading branch information
akien-mga authored and kuruk-mm committed Aug 30, 2024
1 parent 437f160 commit f66ab76
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2112,6 +2112,10 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr

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;
push_constant.base_index = i + p_params->element_offset;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ class RenderForwardMobile : public RendererSceneRenderRD {
SPEC_CONSTANT_DISABLE_DECALS = 13,
SPEC_CONSTANT_DISABLE_FOG = 14,

SPEC_CONSTANT_IS_MULTIMESH = 17,

};

enum {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/* Spec Constants */

layout(constant_id = 17) const bool sc_is_multimesh = false;

/* Varyings */

layout(location = 0) highp out vec3 vertex_interp;
Expand Down Expand Up @@ -172,8 +176,6 @@ void main() {
color_interp = color_attrib;
#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 inv_view_matrix = scene_data.inv_view_matrix;
#ifdef USE_DOUBLE_PRECISION
Expand All @@ -197,7 +199,7 @@ void main() {
mat4 matrix;
mat4 read_model_matrix = model_matrix;

if (is_multimesh) {
if (sc_is_multimesh) {
//multimesh, instances are for it

#ifdef USE_PARTICLE_TRAILS
Expand Down Expand Up @@ -393,7 +395,7 @@ void main() {
// 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.
vec3 model_origin = model_matrix[3].xyz;
if (is_multimesh) {
if (sc_is_multimesh) {
vertex = mat3(matrix) * vertex;
model_origin = double_add_vec3(model_origin, model_precision, matrix[3].xyz, vec3(0.0), model_precision);
}
Expand Down

0 comments on commit f66ab76

Please sign in to comment.