| /* |
| The MIT License (MIT) |
| |
| Copyright (c) 2022 Sascha Willems |
| |
| Permission is hereby granted, free of charge, to any person obtaining a copy |
| of this software and associated documentation files (the "Software"), to deal |
| in the Software without restriction, including without limitation the rights |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| copies of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included in all |
| copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| SOFTWARE. |
| */ |
| |
| #version 450 |
| |
| // Vertex attributes |
| layout (location = 0) in vec3 inPos; |
| layout (location = 1) in vec3 inNormal; |
| layout (location = 2) in vec2 inUV; |
| layout (location = 3) in vec3 inColor; |
| |
| // Instanced attributes |
| layout (location = 4) in vec3 instancePos; |
| layout (location = 5) in vec3 instanceRot; |
| layout (location = 6) in float instanceScale; |
| layout (location = 7) in int instanceTexIndex; |
| |
| layout (binding = 0) uniform UBO |
| { |
| mat4 projection; |
| mat4 modelview; |
| vec4 lightPos; |
| float locSpeed; |
| float globSpeed; |
| } ubo; |
| |
| layout (location = 0) out vec3 outNormal; |
| layout (location = 1) out vec3 outColor; |
| layout (location = 2) out vec3 outUV; |
| layout (location = 3) out vec3 outViewVec; |
| layout (location = 4) out vec3 outLightVec; |
| |
| void main() |
| { |
| outColor = inColor; |
| outUV = vec3(inUV, instanceTexIndex); |
| |
| mat3 mx, my, mz; |
| |
| // rotate around x |
| float s = sin(instanceRot.x + ubo.locSpeed); |
| float c = cos(instanceRot.x + ubo.locSpeed); |
| |
| mx[0] = vec3(c, s, 0.0); |
| mx[1] = vec3(-s, c, 0.0); |
| mx[2] = vec3(0.0, 0.0, 1.0); |
| |
| // rotate around y |
| s = sin(instanceRot.y + ubo.locSpeed); |
| c = cos(instanceRot.y + ubo.locSpeed); |
| |
| my[0] = vec3(c, 0.0, s); |
| my[1] = vec3(0.0, 1.0, 0.0); |
| my[2] = vec3(-s, 0.0, c); |
| |
| // rot around z |
| s = sin(instanceRot.z + ubo.locSpeed); |
| c = cos(instanceRot.z + ubo.locSpeed); |
| |
| mz[0] = vec3(1.0, 0.0, 0.0); |
| mz[1] = vec3(0.0, c, s); |
| mz[2] = vec3(0.0, -s, c); |
| |
| mat3 rotMat = mz * my * mx; |
| |
| mat4 gRotMat; |
| s = sin(instanceRot.y + ubo.globSpeed); |
| c = cos(instanceRot.y + ubo.globSpeed); |
| gRotMat[0] = vec4(c, 0.0, s, 0.0); |
| gRotMat[1] = vec4(0.0, 1.0, 0.0, 0.0); |
| gRotMat[2] = vec4(-s, 0.0, c, 0.0); |
| gRotMat[3] = vec4(0.0, 0.0, 0.0, 1.0); |
| |
| vec4 locPos = vec4(inPos.xyz * rotMat, 1.0); |
| vec4 pos = vec4((locPos.xyz * instanceScale) + instancePos, 1.0); |
| |
| gl_Position = ubo.projection * ubo.modelview * gRotMat * pos; |
| outNormal = mat3(ubo.modelview * gRotMat) * inverse(rotMat) * inNormal; |
| |
| pos = ubo.modelview * vec4(inPos.xyz + instancePos, 1.0); |
| vec3 lPos = mat3(ubo.modelview) * ubo.lightPos.xyz; |
| outLightVec = lPos - pos.xyz; |
| outViewVec = -pos.xyz; |
| } |