34
37
class ImageManager;
35
38
class OSLRenderServices;
40
44
class ShaderOutput;
49
* to auto detect closures in the shader for MIS and transparent shadows */
51
struct OSLShaderInfo {
53
: has_surface_emission(false), has_surface_transparent(false)
56
bool has_surface_emission;
57
bool has_surface_transparent;
44
60
/* Shader Manage */
46
62
class OSLShaderManager : public ShaderManager {
48
64
OSLShaderManager();
49
65
~OSLShaderManager();
67
void reset(Scene *scene);
69
bool use_osl() { return true; }
51
71
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
52
72
void device_free(Device *device, DeviceScene *dscene);
74
/* osl compile and query */
75
static bool osl_compile(const string& inputfile, const string& outputfile);
76
static bool osl_query(OSL::OSLQuery& query, const string& filepath);
78
/* shader file loading, all functions return pointer to hash string if found */
79
const char *shader_test_loaded(const string& hash);
80
const char *shader_load_bytecode(const string& hash, const string& bytecode);
81
const char *shader_load_filepath(string filepath);
82
OSLShaderInfo *shader_loaded_info(const string& hash);
85
void texture_system_init();
86
void shading_system_init();
55
88
OSL::ShadingSystem *ss;
56
89
OSL::TextureSystem *ts;
57
90
OSLRenderServices *services;
58
91
OSL::ErrorHandler errhandler;
92
map<string, OSLShaderInfo> loaded_shaders;
65
99
class OSLCompiler {
67
OSLCompiler(void *shadingsys);
101
OSLCompiler(void *manager, void *shadingsys, ImageManager *image_manager);
68
102
void compile(OSLGlobals *og, Shader *shader);
70
void add(ShaderNode *node, const char *name);
104
void add(ShaderNode *node, const char *name, bool isfilepath = false);
72
106
void parameter(const char *name, float f);
73
107
void parameter_color(const char *name, float3 f);
79
113
void parameter(const char *name, ustring str);
80
114
void parameter(const char *name, const Transform& tfm);
116
void parameter_array(const char *name, const float f[], int arraylen);
117
void parameter_color_array(const char *name, const float f[][3], int arraylen);
118
void parameter_vector_array(const char *name, const float f[][3], int arraylen);
119
void parameter_normal_array(const char *name, const float f[][3], int arraylen);
120
void parameter_point_array(const char *name, const float f[][3], int arraylen);
121
void parameter_array(const char *name, const int f[], int arraylen);
122
void parameter_array(const char *name, const char * const s[], int arraylen);
123
void parameter_array(const char *name, const Transform tfm[], int arraylen);
82
125
ShaderType output_type() { return current_type; }
128
ImageManager *image_manager;
87
131
string id(ShaderNode *node);
88
132
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
89
133
bool node_skip_input(ShaderNode *node, ShaderInput *input);
90
string compatible_name(const char *name);
134
string compatible_name(ShaderNode *node, ShaderInput *input);
135
string compatible_name(ShaderNode *node, ShaderOutput *output);
92
137
void find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input);
93
138
void generate_nodes(const set<ShaderNode*>& nodes);
96
142
ShaderType current_type;
97
143
Shader *current_shader;