From 7c19239bf96f2d264661e86999b7b0db678b8adc Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 6 Apr 2015 23:29:29 +0500 Subject: [PATCH] Cycles: Support bultin 3d textures with OSL backend --- intern/cycles/kernel/osl/osl_services.cpp | 32 ++++++++++++++++------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index 22f48ee57f0..064edb6ead3 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -939,19 +939,33 @@ bool OSLRenderServices::texture3d(ustring filename, TextureOpt &options, OSL::TextureSystem *ts = osl_ts; ShaderData *sd = (ShaderData *)(sg->renderstate); KernelGlobals *kg = sd->osl_globals; - OSLThreadData *tdata = kg->osl_tdata; - OIIO::TextureSystem::Perthread *thread_info = tdata->oiio_thread_info; - - OIIO::TextureSystem::TextureHandle *th = ts->get_texture_handle(filename, thread_info); + bool status; + if(filename[0] == '@' && filename.find('.') == -1) { + int slot = atoi(filename.c_str() + 1); + float4 rgba = kernel_tex_image_interp_3d(slot, P.x, P.y, P.z); + result[0] = rgba[0]; + if(nchannels > 1) + result[1] = rgba[1]; + if(nchannels > 2) + result[2] = rgba[2]; + if(nchannels > 3) + result[3] = rgba[3]; + status = true; + } + else { + OSLThreadData *tdata = kg->osl_tdata; + OIIO::TextureSystem::Perthread *thread_info = tdata->oiio_thread_info; + OIIO::TextureSystem::TextureHandle *th = ts->get_texture_handle(filename, thread_info); #if OIIO_VERSION < 10500 - bool status = ts->texture3d(th, thread_info, - options, P, dPdx, dPdy, dPdz, result); + status = ts->texture3d(th, thread_info, + options, P, dPdx, dPdy, dPdz, result); #else - bool status = ts->texture3d(th, thread_info, - options, P, dPdx, dPdy, dPdz, - nchannels, result); + status = ts->texture3d(th, thread_info, + options, P, dPdx, dPdy, dPdz, + nchannels, result); #endif + } if(!status) { if(nchannels == 3 || nchannels == 4) {