#type vertex #version 410 layout(std140) uniform Sphere { layout(row_major) mat4 u_view_projection; layout(row_major) mat4 u_transform; vec3 u_color; float u_specular; float u_emission; vec3 u_light_pos; vec3 u_camera_pos; int u_is_selected; vec3 u_outline_color; float u_outline_width; } su; layout(location = 0) in vec3 input_position; layout(location = 1) in vec3 input_normal; layout(location = 0) out vec3 _v0; layout(location = 1) out vec3 _v1; mat4 spvWorkaroundRowMajor(mat4 wrap) { return wrap; } void main() { vec3 _29 = (vec4(input_position, 1.0) * spvWorkaroundRowMajor(su.u_transform)).xyz; gl_Position = vec4(_29, 1.0) * spvWorkaroundRowMajor(su.u_view_projection); _v0 = input_normal * mat3(spvWorkaroundRowMajor(su.u_transform)[0].xyz, spvWorkaroundRowMajor(su.u_transform)[1].xyz, spvWorkaroundRowMajor(su.u_transform)[2].xyz); _v1 = _29; } #type fragment #version 410 layout(std140) uniform Sphere { layout(row_major) mat4 u_view_projection; layout(row_major) mat4 u_transform; vec3 u_color; float u_specular; float u_emission; vec3 u_light_pos; vec3 u_camera_pos; int u_is_selected; vec3 u_outline_color; float u_outline_width; } su; uniform samplerCube u_HDRIEnvironment; layout(location = 0) in vec3 _v0; layout(location = 1) in vec3 _v1; layout(location = 0) out vec4 entryPointParam_fragmentMain; void main() { vec3 _15 = normalize(_v0); vec3 _30 = normalize(su.u_light_pos - _v1); vec3 _36 = normalize(su.u_camera_pos - _v1); vec4 _sampled = texture(u_HDRIEnvironment, _15); vec3 result_1 = ((su.u_color * (vec3(max(dot(_15, _30), 0.0)) + (_sampled.xyz * 0.300000011920928955078125))) + (vec3(su.u_specular, su.u_specular, su.u_specular) * pow(max(dot(_36, reflect(-_30, _15)), 0.0), 32.0))) + (su.u_color * su.u_emission); vec3 result; if (su.u_is_selected > 0) { result = mix(result_1, su.u_outline_color, vec3(step(1.0 - su.u_outline_width, 1.0 - max(dot(_15, _36), 0.0)))); } else { result = result_1; } entryPointParam_fragmentMain = vec4(result, 1.0); }