From ccd51bb9224899b4b7d50170267d94d9b9f2567f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 22 Jul 2016 14:50:21 +0200 Subject: [PATCH] OpenSubdiv: Properly support active UV layer in textured view --- intern/opensubdiv/opensubdiv_gpu_capi.cc | 10 ++++++++-- source/blender/blenkernel/intern/subsurf_ccg.c | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/intern/opensubdiv/opensubdiv_gpu_capi.cc b/intern/opensubdiv/opensubdiv_gpu_capi.cc index a7c42aea07f..16a86f66265 100644 --- a/intern/opensubdiv/opensubdiv_gpu_capi.cc +++ b/intern/opensubdiv/opensubdiv_gpu_capi.cc @@ -439,7 +439,10 @@ void bindProgram(OpenSubdiv_GLMesh *gl_mesh, int program) /* See notes below about why we use such values. */ /* TOO(sergey): Get proper value for FVar width. */ glUniform1i(glGetUniformLocation(program, "osd_fvar_count"), 2); - if (gl_mesh->fvar_data->channel_offsets.size() > 0 && g_active_uv_index >= 0) { + if (gl_mesh->fvar_data != NULL && + gl_mesh->fvar_data->channel_offsets.size() > 0 && + g_active_uv_index >= 0) + { glUniform1i(glGetUniformLocation(program, "osd_active_uv_offset"), gl_mesh->fvar_data->channel_offsets[g_active_uv_index]); } else { @@ -624,7 +627,10 @@ static GLuint prepare_patchDraw(OpenSubdiv_GLMesh *gl_mesh, location = glGetUniformLocation(program, "osd_active_uv_offset"); if (location != -1) { - if (gl_mesh->fvar_data->channel_offsets.size() > 0 && g_active_uv_index >= 0) { + if (gl_mesh->fvar_data != NULL && + gl_mesh->fvar_data->channel_offsets.size() > 0 && + g_active_uv_index >= 0) + { glUniform1i(location, gl_mesh->fvar_data->channel_offsets[g_active_uv_index]); } else { diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index c6e20b995ba..7239566b59d 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -3401,7 +3401,8 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm, #ifdef WITH_OPENSUBDIV if (ccgdm->useGpuBackend) { - if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, true, -1) == false)) { + const int active_uv_layer = CustomData_get_active_layer_index(&dm->loopData, CD_MLOOPUV); + if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, true, active_uv_layer) == false)) { return; } if (drawParams == NULL) {