diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-01-30 03:07:28 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-01-30 03:37:46 +0300 |
commit | 15350c70be8befa661505f10c8151110bcbf2cb6 (patch) | |
tree | 439f3792dc3beb7c01d2334baba85aae294cca23 /source/blender/draw/intern/draw_cache_impl_curve.c | |
parent | c7c8ee61686f22a11995f6fe6b10acf59db12b00 (diff) |
DRW: Add support for tangent on objects using display lists.
Only Metaballs are left unsupported.
However, the implementation does not match 100% with cycles which converts
all objects to meshes.
Fixes T63424 EEVEE: Normal map node doesn't works with curve objects
Diffstat (limited to 'source/blender/draw/intern/draw_cache_impl_curve.c')
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_curve.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c index 05ec9bda642..85340fae35d 100644 --- a/source/blender/draw/intern/draw_cache_impl_curve.c +++ b/source/blender/draw/intern/draw_cache_impl_curve.c @@ -333,8 +333,7 @@ static void curve_cd_calc_used_gpu_layers(int *cd_layers, *cd_layers |= CD_MLOOPUV; break; case CD_TANGENT: - /* Currently unsupported */ - // *cd_layers |= CD_TANGENT; + *cd_layers |= CD_TANGENT; break; case CD_MCOL: /* Curve object don't have Color data. */ @@ -358,6 +357,7 @@ typedef struct CurveBatchCache { GPUVertBuf *loop_pos_nor; GPUVertBuf *loop_uv; + GPUVertBuf *loop_tan; } ordered; struct { @@ -992,6 +992,9 @@ void DRW_curve_batch_cache_create_requested(Object *ob) if (cache->cd_used & CD_MLOOPUV) { DRW_vbo_request(cache->surf_per_mat[i], &cache->ordered.loop_uv); } + if (cache->cd_used & CD_TANGENT) { + DRW_vbo_request(cache->surf_per_mat[i], &cache->ordered.loop_tan); + } DRW_vbo_request(cache->surf_per_mat[i], &cache->ordered.loop_pos_nor); } } @@ -1007,6 +1010,7 @@ void DRW_curve_batch_cache_create_requested(Object *ob) DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->ordered.curves_pos, CU_DATATYPE_WIRE); DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->ordered.loop_pos_nor, CU_DATATYPE_SURFACE); DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->ordered.loop_uv, CU_DATATYPE_SURFACE); + DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->ordered.loop_tan, CU_DATATYPE_SURFACE); DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.surfaces_tris, CU_DATATYPE_SURFACE); DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.surfaces_lines, CU_DATATYPE_SURFACE); DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.curves_lines, CU_DATATYPE_WIRE); @@ -1045,8 +1049,8 @@ void DRW_curve_batch_cache_create_requested(Object *ob) if (DRW_vbo_requested(cache->ordered.loop_pos_nor) || DRW_vbo_requested(cache->ordered.loop_uv)) { - DRW_displist_vertbuf_create_loop_pos_and_nor_and_uv( - lb, cache->ordered.loop_pos_nor, cache->ordered.loop_uv); + DRW_displist_vertbuf_create_loop_pos_and_nor_and_uv_and_tan( + lb, cache->ordered.loop_pos_nor, cache->ordered.loop_uv, cache->ordered.loop_tan); } if (DRW_ibo_requested(cache->surf_per_mat_tris[0])) { |