diff options
Diffstat (limited to 'source/blender/gpu/shaders/material')
-rw-r--r-- | source/blender/gpu/shaders/material/gpu_shader_material_mapping.glsl | 22 | ||||
-rw-r--r-- | source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl | 24 |
2 files changed, 45 insertions, 1 deletions
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_mapping.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_mapping.glsl index ef47ac2be98..07f152439fe 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_mapping.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_mapping.glsl @@ -1,7 +1,27 @@ -void mapping( +void mapping_mat4( vec3 vec, vec4 m0, vec4 m1, vec4 m2, vec4 m3, vec3 minvec, vec3 maxvec, out vec3 outvec) { mat4 mat = mat4(m0, m1, m2, m3); outvec = (mat * vec4(vec, 1.0)).xyz; outvec = clamp(outvec, minvec, maxvec); } + +void mapping_point(vec3 vector, vec3 location, vec3 rotation, vec3 scale, out vec3 result) +{ + result = (euler_to_mat3(rotation) * (vector * scale)) + location; +} + +void mapping_texture(vec3 vector, vec3 location, vec3 rotation, vec3 scale, out vec3 result) +{ + result = safe_divide(transpose(euler_to_mat3(rotation)) * (vector - location), scale); +} + +void mapping_vector(vec3 vector, vec3 location, vec3 rotation, vec3 scale, out vec3 result) +{ + result = euler_to_mat3(rotation) * (vector * scale); +} + +void mapping_normal(vec3 vector, vec3 location, vec3 rotation, vec3 scale, out vec3 result) +{ + result = normalize(euler_to_mat3(rotation) * safe_divide(vector, scale)); +} diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl index 0be7da0cc4c..fd9aaf4ae86 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl @@ -85,6 +85,30 @@ void vector_normalize(vec3 normal, out vec3 outnormal) /* Matirx Math */ +mat3 euler_to_mat3(vec3 euler) +{ + float cx = cos(euler.x); + float cy = cos(euler.y); + float cz = cos(euler.z); + float sx = sin(euler.x); + float sy = sin(euler.y); + float sz = sin(euler.z); + + mat3 mat; + mat[0][0] = cy * cz; + mat[0][1] = cy * sz; + mat[0][2] = -sy; + + mat[1][0] = sy * sx * cz - cx * sz; + mat[1][1] = sy * sx * sz + cx * cz; + mat[1][2] = cy * sx; + + mat[2][0] = sy * cx * cz + sx * sz; + mat[2][1] = sy * cx * sz - sx * cz; + mat[2][2] = cy * cx; + return mat; +} + void direction_transform_m4v3(vec3 vin, mat4 mat, out vec3 vout) { vout = (mat * vec4(vin, 0.0)).xyz; |