From aec15aceb613415a07fe49667e235abea455872b Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Wed, 29 Nov 2017 15:52:36 -0800 Subject: [PATCH] Expose optional "anisotropic" parameter to the texture funtions in OSL. This gives explicit control to the amount of anisotropy. This consol existed in the underlying OpenImageIO texture lookup options, but never was exposed to direct control by the OSL shaders. --- CMakeLists.txt | 3 ++- src/doc/languagespec.tex | 10 ++++++++++ src/liboslexec/builtindecl.h | 1 + src/liboslexec/llvm_gen.cpp | 3 ++- src/liboslexec/optexture.cpp | 8 ++++++++ testsuite/texture-aniso/ref/out.tif | Bin 0 -> 43301 bytes testsuite/texture-aniso/ref/out.txt | 3 +++ testsuite/texture-aniso/run.py | 4 ++++ testsuite/texture-aniso/test.osl | 18 ++++++++++++++++++ 9 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 testsuite/texture-aniso/ref/out.tif create mode 100644 testsuite/texture-aniso/ref/out.txt create mode 100755 testsuite/texture-aniso/run.py create mode 100644 testsuite/texture-aniso/test.osl diff --git a/CMakeLists.txt b/CMakeLists.txt index e54992a35..b1d9d0fdf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -288,7 +288,8 @@ TESTSUITE ( and-or-not-synonyms aastep arithmetic array array-derivs array-range struct-nested struct-nested-assign struct-nested-deep ternary testshade-expr - texture-alpha texture-blur texture-connected-options + texture-alpha texture-aniso + texture-blur texture-connected-options texture-derivs texture-errormsg texture-firstchannel texture-interp texture-missingcolor texture-simple diff --git a/src/doc/languagespec.tex b/src/doc/languagespec.tex index 75b3b851a..a1814abe5 100644 --- a/src/doc/languagespec.tex +++ b/src/doc/languagespec.tex @@ -4135,6 +4135,16 @@ \section{Texture} \apiend \vspace{-16pt} +\apiitem{"anisotropic", } +\vspace{12pt} +Sets the maximum anisotropic ratio allowed. This parameter may not be +supported by all renderers, and may have different default values (it is +supported with a default of 32 for renderers that use OpenImageIO's texture +system). +\NEW % 1.10 +\apiend +\vspace{-16pt} + \apiend \apiitem{\emph{type} \textbf{texture3d} (string filename, point p, \pl) \\ diff --git a/src/liboslexec/builtindecl.h b/src/liboslexec/builtindecl.h index 16c50f43f..6f5c72be8 100644 --- a/src/liboslexec/builtindecl.h +++ b/src/liboslexec/builtindecl.h @@ -381,6 +381,7 @@ DECL (osl_texture_set_fill, "xXf") DECL (osl_texture_set_time, "xXf") DECL (osl_texture_set_interp, "xXs") DECL (osl_texture_set_interp_code, "xXi") +DECL (osl_texture_set_anisotropic, "xXi") DECL (osl_texture_set_subimage, "xXi") DECL (osl_texture_set_subimagename, "xXs") DECL (osl_texture_set_missingcolor_arena, "xXX") diff --git a/src/liboslexec/llvm_gen.cpp b/src/liboslexec/llvm_gen.cpp index 678ac8d5f..079da44fd 100644 --- a/src/liboslexec/llvm_gen.cpp +++ b/src/liboslexec/llvm_gen.cpp @@ -2082,7 +2082,7 @@ llvm_gen_texture_options (BackendLLVM &rop, int opnum, bool sblur_set = false, tblur_set = false, rblur_set = false; bool swrap_set = false, twrap_set = false, rwrap_set = false; bool firstchannel_set = false, fill_set = false, interp_set = false; - bool time_set = false, subimage_set = false; + bool time_set = false, subimage_set = false, anisotropic_set = false; Opcode &op (rop.inst()->ops()[opnum]); for (int a = first_optional_arg; a < op.nargs(); ++a) { @@ -2196,6 +2196,7 @@ llvm_gen_texture_options (BackendLLVM &rop, int opnum, PARAM_FLOAT (fill) PARAM_FLOAT (time) + PARAM_INT (anisotropic) PARAM_INT (firstchannel) PARAM_INT (subimage) diff --git a/src/liboslexec/optexture.cpp b/src/liboslexec/optexture.cpp index 4c1ac4f3a..588b65336 100644 --- a/src/liboslexec/optexture.cpp +++ b/src/liboslexec/optexture.cpp @@ -180,6 +180,14 @@ osl_texture_set_time (void *opt, float x) ((TextureOpt *)opt)->time = x; } +OSL_SHADEOP void +osl_texture_set_anisotropic (void *opt, int x) +{ + ((TextureOpt *)opt)->anisotropic = x; +} + + + inline int tex_interp_to_code (ustring modename) { diff --git a/testsuite/texture-aniso/ref/out.tif b/testsuite/texture-aniso/ref/out.tif new file mode 100644 index 0000000000000000000000000000000000000000..179bf66479c59826f95ebcd2be84540022160822 GIT binary patch literal 43301 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 S8ymUy>a`d2N#y% test.oso + +Output Cout to out.tif diff --git a/testsuite/texture-aniso/run.py b/testsuite/texture-aniso/run.py new file mode 100755 index 000000000..d651636c3 --- /dev/null +++ b/testsuite/texture-aniso/run.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python + +command += testshade("-g 128 128 --center -od uint8 -o Cout out.tif test") +outputs = [ "out.txt", "out.tif" ] diff --git a/testsuite/texture-aniso/test.osl b/testsuite/texture-aniso/test.osl new file mode 100644 index 000000000..31aa1f961 --- /dev/null +++ b/testsuite/texture-aniso/test.osl @@ -0,0 +1,18 @@ +shader +test (string texturename = "../common/textures/mandrill.tif", + float swirl = 16, + output color Cout = 0) +{ + int aniso = (u >= v) ? 2 : 256; + + float s1 = -1 + 2*u; + float t1 = -1 + 2*v; + + float r = hypot (s1, t1); + + float s1Rot = s1*cos(swirl*r) - t1*sin(swirl*r); + float t1Rot = s1*sin(swirl*r) + t1*cos(swirl*r); + Cout = (color) texture(texturename, s1Rot, t1Rot, + "wrap", "periodic", + "anisotropic", aniso); +}