31 lines
1.1 KiB
GLSL
31 lines
1.1 KiB
GLSL
const ivec3 leaves_voxelVolumeSize = ivec3(128);
|
|
|
|
vec3 SceneToLeavesVoxel(vec3 scenePos) {
|
|
return scenePos + fract(cameraPosition) + 0.5 * vec3(leaves_voxelVolumeSize);
|
|
}
|
|
|
|
bool CheckInsideLeavesVoxelVolume(vec3 voxelPos) {
|
|
#ifndef SHADOW
|
|
voxelPos -= leaves_voxelVolumeSize / 2;
|
|
voxelPos += sign(voxelPos) * 0.95;
|
|
voxelPos += leaves_voxelVolumeSize / 2;
|
|
#endif
|
|
voxelPos /= vec3(leaves_voxelVolumeSize);
|
|
return clamp01(voxelPos) == voxelPos;
|
|
}
|
|
|
|
#if defined SHADOW && defined VERTEX_SHADER
|
|
void UpdateLeavesVoxelMap(int mat) {
|
|
if (renderStage == MC_RENDER_STAGE_ENTITIES)
|
|
return;
|
|
|
|
vec3 model_pos = gl_Vertex.xyz + at_midBlock.xyz / 64.0;
|
|
vec3 view_pos = mat3(gl_ModelViewMatrix) * model_pos + gl_ModelViewMatrix[3].xyz;
|
|
vec3 scenePos = mat3(shadowModelViewInverse) * view_pos + shadowModelViewInverse[3].xyz;
|
|
vec3 voxelPos = SceneToLeavesVoxel(scenePos);
|
|
|
|
if (CheckInsideLeavesVoxelVolume(voxelPos))
|
|
imageStore(leaves_img, ivec3(voxelPos), uvec4(mat == 10009 ? 2u : 1u, 0u, 0u, 0u));
|
|
}
|
|
#endif
|