Cycles: support loading images from arbitrary OpenColorIO color space
[blender.git] / intern / cycles / render / osl.cpp
index 5ee4532..a65c8e9 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "device/device.h"
 
+#include "render/colorspace.h"
 #include "render/graph.h"
 #include "render/light.h"
 #include "render/osl.h"
@@ -1205,25 +1206,29 @@ void OSLCompiler::compile(Scene *scene, Shader *shader)
   osl_globals->bump_state.push_back(shader->osl_surface_bump_ref);
 }
 
-void OSLCompiler::parameter_texture(const char *name, ustring filename, int svm_slot)
+void OSLCompiler::parameter_texture(const char *name, ustring filename, ustring colorspace)
 {
-  if (svm_slot != -1) {
-    /* It's not so simple to pass custom attribute to the texture() function
-     * in order to make builtin images support more clear. So we use special
-     * file name which is "@i<slot_number>" and use that for lookup in
-     * in OSLRenderServices::texture(). */
-    filename = string_printf("@i%d", svm_slot).c_str();
-    osl_globals->textures.insert(filename, new OSLTextureHandle(OSLTextureHandle::SVM, svm_slot));
-  }
-  else {
-    osl_globals->textures.insert(filename, new OSLTextureHandle(OSLTextureHandle::OIIO));
-  }
+  /* Textured loaded through the OpenImageIO texture cache. For this
+   * case we need to do runtime color space conversion. */
+  OSLTextureHandle *handle = new OSLTextureHandle(OSLTextureHandle::OIIO);
+  handle->processor = ColorSpaceManager::get_processor(colorspace);
+  osl_globals->textures.insert(filename, handle);
+  parameter(name, filename);
+}
 
+void OSLCompiler::parameter_texture(const char *name, int svm_slot)
+{
+  /* Texture loaded through SVM image texture system. We generate a unique
+   * name, which ends up being used in OSLRenderServices::get_texture_handle
+   * to get handle again. */
+  ustring filename(string_printf("@i%d", svm_slot).c_str());
+  osl_globals->textures.insert(filename, new OSLTextureHandle(OSLTextureHandle::SVM, svm_slot));
   parameter(name, filename);
 }
 
 void OSLCompiler::parameter_texture_ies(const char *name, int svm_slot)
 {
+  /* IES light textures stored in SVM. */
   ustring filename(string_printf("@l%d", svm_slot).c_str());
   osl_globals->textures.insert(filename, new OSLTextureHandle(OSLTextureHandle::IES, svm_slot));
   parameter(name, filename);
@@ -1285,7 +1290,11 @@ void OSLCompiler::parameter_color_array(const char * /*name*/, const array<float
 
 void OSLCompiler::parameter_texture(const char * /* name */,
                                     ustring /* filename */,
-                                    int /* svm_slot */)
+                                    ustring /* colorspace */)
+{
+}
+
+void OSLCompiler::parameter_texture(const char * /* name */, int /* svm_slot */)
 {
 }