Commit: 8c9547cc0a5d1e985a82a2ef49ff967c1828b62a Author: Brecht Van Lommel Date: Wed Feb 19 19:45:14 2020 +0100 Branches: new-object-types https://developer.blender.org/rB8c9547cc0a5d1e985a82a2ef49ff967c1828b62a
Volumes: work towards per-grid transform in Eevee But not actually working yet. =================================================================== M source/blender/gpu/GPU_material.h M source/blender/gpu/intern/gpu_codegen.c M source/blender/gpu/intern/gpu_node_graph.c M source/blender/gpu/intern/gpu_node_graph.h M source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl =================================================================== diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index 8baa2a08f07..581ff77a23d 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -235,7 +235,8 @@ typedef struct GPUMaterialTexture { typedef struct GPUMaterialVolumeGrid { struct GPUMaterialVolumeGrid *next, *prev; char *name; - char sampler_name[32]; /* Name of sampler in GLSL. */ + char sampler_name[32]; /* Name of sampler in GLSL. */ + char transform_name[32]; /* Name of 4x4 matrix in GLSL. */ int users; } GPUMaterialVolumeGrid; diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index bcaa95c2f59..066b8d633d2 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -335,6 +335,7 @@ static int codegen_process_uniforms_functions(GPUMaterial *material, /* Volume Grids */ for (GPUMaterialVolumeGrid *grid = graph->volume_grids.first; grid; grid = grid->next) { BLI_dynstr_appendf(ds, "uniform sampler3D %s;\n", grid->sampler_name); + BLI_dynstr_appendf(ds, "uniform mat4 %s = mat4(0.0);\n", grid->transform_name); } /* Print other uniforms */ @@ -432,6 +433,9 @@ static void codegen_call_functions(DynStr *ds, GPUNodeGraph *graph, GPUOutput *f else if (input->source == GPU_SOURCE_VOLUME_GRID) { BLI_dynstr_append(ds, input->volume_grid->sampler_name); } + else if (input->source == GPU_SOURCE_VOLUME_GRID_TRANSFORM) { + BLI_dynstr_append(ds, input->volume_grid->transform_name); + } else if (input->source == GPU_SOURCE_OUTPUT) { codegen_convert_datatype( ds, input->link->output->type, input->type, "tmp", input->link->output->id); diff --git a/source/blender/gpu/intern/gpu_node_graph.c b/source/blender/gpu/intern/gpu_node_graph.c index 0d5cc46c0b9..0eb62bf5b2f 100644 --- a/source/blender/gpu/intern/gpu_node_graph.c +++ b/source/blender/gpu/intern/gpu_node_graph.c @@ -123,6 +123,10 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, const eGPUType input->source = GPU_SOURCE_VOLUME_GRID; input->volume_grid = link->volume_grid; break; + case GPU_NODE_LINK_VOLUME_GRID_TRANSFORM: + input->source = GPU_SOURCE_VOLUME_GRID_TRANSFORM; + input->volume_grid = link->volume_grid; + break; case GPU_NODE_LINK_ATTR: input->source = GPU_SOURCE_ATTR; input->attr = link->attr; @@ -342,6 +346,7 @@ static GPUMaterialVolumeGrid *gpu_node_graph_add_volume_grid(GPUNodeGraph *graph grid = MEM_callocN(sizeof(*grid), __func__); grid->name = BLI_strdup(name); BLI_snprintf(grid->sampler_name, sizeof(grid->sampler_name), "vsamp%d", num_grids); + BLI_snprintf(grid->transform_name, sizeof(grid->transform_name), "vtfm%d", num_grids); BLI_addtail(&graph->volume_grids, grid); } @@ -432,16 +437,20 @@ GPUNodeLink *GPU_volume_grid(GPUMaterial *mat, const char *name) link->link_type = GPU_NODE_LINK_VOLUME_GRID; link->volume_grid = gpu_node_graph_add_volume_grid(graph, name); + GPUNodeLink *transform_link = gpu_node_link_create(); + transform_link->link_type = GPU_NODE_LINK_VOLUME_GRID_TRANSFORM; + transform_link->volume_grid = link->volume_grid; + /* Two special cases, where we adjust the output values of smoke grids to * bring the into standard range without having to modify the grid values. */ if (strcmp(name, "color") == 0) { - GPU_link(mat, "node_attribute_volume_color", link, &link); + GPU_link(mat, "node_attribute_volume_color", link, transform_link, &link); } else if (strcmp(name, "temperature") == 0) { - GPU_link(mat, "node_attribute_volume_temperature", link, &link); + GPU_link(mat, "node_attribute_volume_temperature", link, transform_link, &link); } else { - GPU_link(mat, "node_attribute_volume", link, &link); + GPU_link(mat, "node_attribute_volume", link, transform_link, &link); } return link; @@ -590,7 +599,7 @@ static void gpu_inputs_free(ListBase *inputs) else if (ELEM(input->source, GPU_SOURCE_TEX, GPU_SOURCE_TEX_TILED_MAPPING)) { input->texture->users--; } - else if (ELEM(input->source, GPU_SOURCE_VOLUME_GRID)) { + else if (ELEM(input->source, GPU_SOURCE_VOLUME_GRID, GPU_SOURCE_VOLUME_GRID_TRANSFORM)) { input->volume_grid->users--; } diff --git a/source/blender/gpu/intern/gpu_node_graph.h b/source/blender/gpu/intern/gpu_node_graph.h index ceaeea2bfa8..8506c6a87e2 100644 --- a/source/blender/gpu/intern/gpu_node_graph.h +++ b/source/blender/gpu/intern/gpu_node_graph.h @@ -62,6 +62,7 @@ typedef enum { GPU_NODE_LINK_IMAGE_TILED, GPU_NODE_LINK_IMAGE_TILED_MAPPING, GPU_NODE_LINK_VOLUME_GRID, + GPU_NODE_LINK_VOLUME_GRID_TRANSFORM, GPU_NODE_LINK_OUTPUT, GPU_NODE_LINK_UNIFORM, } GPUNodeLinkType; @@ -131,7 +132,7 @@ typedef struct GPUInput { struct GPUMaterialTexture *texture; /* GPU_SOURCE_ATTR */ struct GPUMaterialAttribute *attr; - /* GPU_SOURCE_VOLUME_GRID */ + /* GPU_SOURCE_VOLUME_GRID | GPU_SOURCE_VOLUME_GRID_TRANSFORM */ struct GPUMaterialVolumeGrid *volume_grid; }; } GPUInput; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl index a80cd3cb329..e6d7b9d3721 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl @@ -4,18 +4,24 @@ uniform vec3 volumeColor = vec3(1.0); uniform vec2 volumeTemperature = vec2(0.0); /* Generic volume attribute. */ -void node_attribute_volume(sampler3D tex, out vec3 outvec) +void node_attribute_volume(sampler3D tex, mat4 transform, out vec3 outvec) { #if defined(MESH_SHADER) && defined(VOLUMETRICS) vec3 cos = volumeObjectLocalCoord; #else vec3 cos = vec3(0.0); #endif + + /* Optional per-grid transform. */ + if (transform[3][3] != 0.0) { + cos = (transform * vec4(cos, 1.0)).xyz; + } + outvec = texture(tex, cos).rgb; } /* Special color attribute for smoke. */ -void node_attribute_volume_color(sampler3D tex, out vec3 outvec) +void node_attribute_volume_color(sampler3D tex, mat4 transform, out vec3 outvec) { #if defined(MESH_SHADER) && defined(VOLUMETRICS) vec3 cos = volumeObjectLocalCoord; @@ -23,6 +29,11 @@ void node_attribute_volume_color(sampler3D tex, out vec3 outvec) vec3 cos = vec3(0.0); #endif + /* Optional per-grid transform. */ + if (transform[3][3] != 0.0) { + cos = (transform * vec4(cos, 1.0)).xyz; + } + /* Density is premultiplied for interpolation, divide it out here. */ vec4 value = texture(tex, cos).rgba; if (value.a > 1e-8) { @@ -33,7 +44,7 @@ void node_attribute_volume_color(sampler3D tex, out vec3 outvec) } /* Special temperature attribute for smoke. */ -void node_attribute_volume_temperature(sampler3D tex, out float outf) +void node_attribute_volume_temperature(sampler3D tex, mat4 transform, out float outf) { #if defined(MESH_SHADER) && defined(VOLUMETRICS) vec3 cos = volumeObjectLocalCoord; @@ -41,6 +52,11 @@ void node_attribute_volume_temperature(sampler3D tex, out float outf) vec3 cos = vec3(0.0); #endif + /* Optional per-grid transform. */ + if (transform[3][3] != 0.0) { + cos = (transform * vec4(cos, 1.0)).xyz; + } + float value = texture(tex, cos).r; if (volumeTemperature.x < volumeTemperature.y) { outf = (value > 0.01) ? _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs