Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/modes/shaders/volume_velocity_vert.glsl
| uniform sampler3D velocityX; | uniform sampler3D velocityX; | ||||
| uniform sampler3D velocityY; | uniform sampler3D velocityY; | ||||
| uniform sampler3D velocityZ; | uniform sampler3D velocityZ; | ||||
| uniform float displaySize = 1.0; | uniform float displaySize = 1.0; | ||||
| uniform float slicePosition; | uniform float slicePosition; | ||||
| uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */ | uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */ | ||||
| /* SmokeDomainSettings.cell_size */ | |||||
| uniform vec3 cellSize; | |||||
| /* SmokeDomainSettings.p0 */ | |||||
| uniform vec3 domainOriginOffset; | |||||
| /* SmokeDomainSettings.res_min */ | |||||
| uniform ivec3 adaptiveCellOffset; | |||||
| flat out vec4 finalColor; | flat out vec4 finalColor; | ||||
| const vec3 corners[4] = vec3[4](vec3(0.0, 0.2, -0.5), | const vec3 corners[4] = vec3[4](vec3(0.0, 0.2, -0.5), | ||||
| vec3(-0.2 * 0.866, -0.2 * 0.5, -0.5), | vec3(-0.2 * 0.866, -0.2 * 0.5, -0.5), | ||||
| vec3(0.2 * 0.866, -0.2 * 0.5, -0.5), | vec3(0.2 * 0.866, -0.2 * 0.5, -0.5), | ||||
| vec3(0.0, 0.0, 0.5)); | vec3(0.0, 0.0, 0.5)); | ||||
| const int indices[12] = int[12](0, 1, 1, 2, 2, 0, 0, 3, 1, 3, 2, 3); | const int indices[12] = int[12](0, 1, 1, 2, 2, 0, 0, 3, 1, 3, 2, 3); | ||||
| ▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| #ifdef USE_NEEDLE | #ifdef USE_NEEDLE | ||||
| int cell = gl_VertexID / 12; | int cell = gl_VertexID / 12; | ||||
| #else | #else | ||||
| int cell = gl_VertexID / 2; | int cell = gl_VertexID / 2; | ||||
| #endif | #endif | ||||
| ivec3 volume_size = textureSize(velocityX, 0); | ivec3 volume_size = textureSize(velocityX, 0); | ||||
| float voxel_size = 1.0 / float(max(max(volume_size.x, volume_size.y), volume_size.z)); | |||||
| ivec3 cell_ofs = ivec3(0); | ivec3 cell_ofs = ivec3(0); | ||||
| ivec3 cell_div = volume_size; | ivec3 cell_div = volume_size; | ||||
| if (sliceAxis == 0) { | if (sliceAxis == 0) { | ||||
| cell_ofs.x = int(slicePosition * float(volume_size.x)); | cell_ofs.x = int(slicePosition * float(volume_size.x)); | ||||
| cell_div.x = 1; | cell_div.x = 1; | ||||
| } | } | ||||
| else if (sliceAxis == 1) { | else if (sliceAxis == 1) { | ||||
| cell_ofs.y = int(slicePosition * float(volume_size.y)); | cell_ofs.y = int(slicePosition * float(volume_size.y)); | ||||
| cell_div.y = 1; | cell_div.y = 1; | ||||
| } | } | ||||
| else if (sliceAxis == 2) { | else if (sliceAxis == 2) { | ||||
| cell_ofs.z = int(slicePosition * float(volume_size.z)); | cell_ofs.z = int(slicePosition * float(volume_size.z)); | ||||
| cell_div.z = 1; | cell_div.z = 1; | ||||
| } | } | ||||
| ivec3 cell_co; | ivec3 cell_co; | ||||
| cell_co.x = cell % cell_div.x; | cell_co.x = cell % cell_div.x; | ||||
| cell_co.y = (cell / cell_div.x) % cell_div.y; | cell_co.y = (cell / cell_div.x) % cell_div.y; | ||||
| cell_co.z = cell / (cell_div.x * cell_div.y); | cell_co.z = cell / (cell_div.x * cell_div.y); | ||||
| cell_co += cell_ofs; | cell_co += cell_ofs; | ||||
| vec3 pos = (vec3(cell_co) + 0.5) / vec3(volume_size); | vec3 pos = domainOriginOffset + cellSize * (vec3(cell_co + adaptiveCellOffset) + 0.5); | ||||
| pos = pos * 2.0 - 1.0; | |||||
| vec3 velocity; | vec3 velocity; | ||||
| velocity.x = texelFetch(velocityX, cell_co, 0).r; | velocity.x = texelFetch(velocityX, cell_co, 0).r; | ||||
| velocity.y = texelFetch(velocityY, cell_co, 0).r; | velocity.y = texelFetch(velocityY, cell_co, 0).r; | ||||
| velocity.z = texelFetch(velocityZ, cell_co, 0).r; | velocity.z = texelFetch(velocityZ, cell_co, 0).r; | ||||
| finalColor = vec4(weight_to_color(length(velocity)), 1.0); | finalColor = vec4(weight_to_color(length(velocity)), 1.0); | ||||
| #ifdef USE_NEEDLE | #ifdef USE_NEEDLE | ||||
| mat3 rot_mat = rotation_from_vector(velocity); | mat3 rot_mat = rotation_from_vector(velocity); | ||||
| vec3 rotated_pos = rot_mat * corners[indices[gl_VertexID % 12]]; | vec3 rotated_pos = rot_mat * corners[indices[gl_VertexID % 12]]; | ||||
| pos += rotated_pos * length(velocity) * displaySize * voxel_size; | pos += rotated_pos * length(velocity) * displaySize * cellSize; | ||||
| #else | #else | ||||
| pos += (((gl_VertexID % 2) == 1) ? velocity : vec3(0.0)) * displaySize * voxel_size; | pos += ((gl_VertexID % 2) == 1) ? velocity * displaySize * cellSize : vec3(0.0); | ||||
| #endif | #endif | ||||
| vec3 world_pos = point_object_to_world(pos); | vec3 world_pos = point_object_to_world(pos); | ||||
| gl_Position = point_world_to_ndc(world_pos); | gl_Position = point_world_to_ndc(world_pos); | ||||
| } | } | ||||