diff options
Diffstat (limited to 'source/blender/gpu/GPU_material.h')
-rw-r--r-- | source/blender/gpu/GPU_material.h | 193 |
1 files changed, 58 insertions, 135 deletions
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index c94d6429f59..a65c09152ee 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -43,31 +43,34 @@ extern "C" { struct Image; struct ImageUser; +struct ListBase; struct Main; struct Material; struct Object; -struct Image; struct Scene; -struct SceneRenderLayer; struct GPUVertexAttribs; struct GPUNode; struct GPUNodeLink; struct GPUNodeStack; struct GPUMaterial; struct GPUTexture; +struct GPUUniformBuffer; struct GPULamp; struct PreviewImage; struct World; +struct bNode; +struct bNodeTree; typedef struct GPUNode GPUNode; typedef struct GPUNodeLink GPUNodeLink; typedef struct GPUMaterial GPUMaterial; -typedef struct GPULamp GPULamp; + typedef struct GPUParticleInfo GPUParticleInfo; /* Functions to create GPU Materials nodes */ typedef enum GPUType { + /* Keep in sync with GPU_DATATYPE_STR */ /* The value indicates the number of elements in each type */ GPU_NONE = 0, GPU_FLOAT = 1, @@ -77,9 +80,16 @@ typedef enum GPUType { GPU_MAT3 = 9, GPU_MAT4 = 16, + /* Values not in GPU_DATATYPE_STR */ GPU_TEX2D = 1002, - GPU_SHADOW2D = 1003, - GPU_TEXCUBE = 1004, + GPU_TEX3D = 1003, + GPU_SHADOW2D = 1004, + GPU_TEXCUBE = 1005, + + /* GLSL Struct types */ + GPU_CLOSURE = 1006, + + /* Opengl Attributes */ GPU_ATTRIB = 3001 } GPUType; @@ -99,7 +109,10 @@ typedef enum GPUBuiltin { GPU_PARTICLE_ANG_VELOCITY = (1 << 12), GPU_LOC_TO_VIEW_MATRIX = (1 << 13), GPU_INVERSE_LOC_TO_VIEW_MATRIX = (1 << 14), - GPU_OBJECT_INFO = (1 << 15) + GPU_OBJECT_INFO = (1 << 15), + GPU_VOLUME_DENSITY = (1 << 16), + GPU_VOLUME_FLAME = (1 << 17), + GPU_VOLUME_TEMPERATURE = (1 << 18) } GPUBuiltin; typedef enum GPUOpenGLBuiltin { @@ -124,14 +137,19 @@ typedef enum GPUBlendMode { typedef struct GPUNodeStack { GPUType type; - const char *name; float vec[4]; struct GPUNodeLink *link; bool hasinput; bool hasoutput; short sockettype; + bool end; } GPUNodeStack; +typedef enum GPUMaterialStatus { + GPU_MAT_FAILED = 0, + GPU_MAT_QUEUED, + GPU_MAT_SUCCESS, +} GPUMaterialStatus; #define GPU_DYNAMIC_GROUP_FROM_TYPE(f) ((f) & 0xFFFF0000) @@ -142,6 +160,7 @@ typedef struct GPUNodeStack { #define GPU_DYNAMIC_GROUP_MIST 0x00050000 #define GPU_DYNAMIC_GROUP_WORLD 0x00060000 #define GPU_DYNAMIC_GROUP_MAT 0x00070000 +#define GPU_DYNAMIC_UBO 0x00080000 typedef enum GPUDynamicType { @@ -201,6 +220,7 @@ typedef enum GPUDynamicType { GPUNodeLink *GPU_attribute(CustomDataType type, const char *name); GPUNodeLink *GPU_uniform(float *num); GPUNodeLink *GPU_dynamic_uniform(float *num, GPUDynamicType dynamictype, void *data); +GPUNodeLink *GPU_uniform_buffer(float *num, GPUType gputype); GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser, bool is_data); GPUNodeLink *GPU_cube_map(struct Image *ima, struct ImageUser *iuser, bool is_data); GPUNodeLink *GPU_image_preview(struct PreviewImage *prv); @@ -211,150 +231,53 @@ GPUNodeLink *GPU_opengl_builtin(GPUOpenGLBuiltin builtin); void GPU_node_link_set_type(GPUNodeLink *link, GPUType type); bool GPU_link(GPUMaterial *mat, const char *name, ...); -bool GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...); +bool GPU_stack_link(GPUMaterial *mat, struct bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...); +GPUNodeLink *GPU_uniformbuffer_link_out( + struct GPUMaterial *mat, struct bNode *node, + struct GPUNodeStack *stack, const int index); void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link); -void GPU_material_enable_alpha(GPUMaterial *material); GPUBuiltin GPU_get_material_builtins(GPUMaterial *material); -GPUBlendMode GPU_material_alpha_blend(GPUMaterial *material, float obcol[4]); -/* High level functions to create and use GPU materials */ -GPUMaterial *GPU_material_world(struct Scene *scene, struct World *wo); +void GPU_material_sss_profile_create(GPUMaterial *material, float radii[3], short *falloff_type, float *sharpness); +struct GPUUniformBuffer *GPU_material_sss_profile_get( + GPUMaterial *material, int sample_ct, struct GPUTexture **tex_profile); -GPUMaterial *GPU_material_from_blender(struct Scene *scene, struct Material *ma, bool use_opensubdiv); -GPUMaterial *GPU_material_matcap(struct Scene *scene, struct Material *ma, bool use_opensubdiv); +/* High level functions to create and use GPU materials */ +GPUMaterial *GPU_material_from_nodetree_find( + struct ListBase *gpumaterials, const void *engine_type, int options); +GPUMaterial *GPU_material_from_nodetree( + struct Scene *scene, struct bNodeTree *ntree, struct ListBase *gpumaterials, const void *engine_type, int options, + const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines); +void GPU_material_compile(GPUMaterial *mat); void GPU_material_free(struct ListBase *gpumaterial); void GPU_materials_free(struct Main *bmain); -bool GPU_lamp_visible(GPULamp *lamp, struct SceneRenderLayer *srl, struct Material *ma); -void GPU_material_bind( - GPUMaterial *material, int oblay, int viewlay, double time, int mipmap, - float viewmat[4][4], float viewinv[4][4], float cameraborder[4], bool scenelock); -void GPU_material_bind_uniforms( - GPUMaterial *material, float obmat[4][4], float viewmat[4][4], float obcol[4], - float autobumpscale, GPUParticleInfo *pi, float object_info[3]); -void GPU_material_unbind(GPUMaterial *material); -bool GPU_material_bound(GPUMaterial *material); +void GPU_material_orphans_init(void); +void GPU_material_orphans_exit(void); +/* This has to be called from a thread with an ogl context bound. */ +void GPU_material_orphans_delete(void); + struct Scene *GPU_material_scene(GPUMaterial *material); GPUMatType GPU_Material_get_type(GPUMaterial *material); +struct GPUPass *GPU_material_get_pass(GPUMaterial *material); +struct ListBase *GPU_material_get_inputs(GPUMaterial *material); +GPUMaterialStatus GPU_material_status(GPUMaterial *mat); + +struct GPUUniformBuffer *GPU_material_uniform_buffer_get(GPUMaterial *material); +void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs); void GPU_material_vertex_attributes(GPUMaterial *material, struct GPUVertexAttribs *attrib); bool GPU_material_do_color_management(GPUMaterial *mat); -bool GPU_material_use_new_shading_nodes(GPUMaterial *mat); -bool GPU_material_use_world_space_shading(GPUMaterial *mat); - -/* Exported shading */ - -typedef struct GPUShadeInput { - GPUMaterial *gpumat; - struct Material *mat; - - GPUNodeLink *rgb, *specrgb, *vn, *view, *vcol, *ref; - GPUNodeLink *alpha, *refl, *spec, *emit, *har, *amb; - GPUNodeLink *spectra, *mir, *refcol; -} GPUShadeInput; - -typedef struct GPUShadeResult { - GPUNodeLink *diff, *spec, *combined, *alpha; -} GPUShadeResult; - -void GPU_shadeinput_set(GPUMaterial *mat, struct Material *ma, GPUShadeInput *shi); -void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr); - -/* Export GLSL shader */ - -typedef enum GPUDataType { - GPU_DATA_NONE = 0, - GPU_DATA_1I = 1, /* 1 integer */ - GPU_DATA_1F = 2, - GPU_DATA_2F = 3, - GPU_DATA_3F = 4, - GPU_DATA_4F = 5, - GPU_DATA_9F = 6, - GPU_DATA_16F = 7, - GPU_DATA_4UB = 8, -} GPUDataType; - -/* this structure gives information of each uniform found in the shader */ -typedef struct GPUInputUniform { - struct GPUInputUniform *next, *prev; - char varname[32]; /* name of uniform in shader */ - GPUDynamicType type; /* type of uniform, data format and calculation derive from it */ - GPUDataType datatype; /* type of uniform data */ - struct Object *lamp; /* when type=GPU_DYNAMIC_LAMP_... or GPU_DYNAMIC_SAMPLER_2DSHADOW */ - struct Image *image; /* when type=GPU_DYNAMIC_SAMPLER_2DIMAGE */ - struct Material *material;/* when type=GPU_DYNAMIC_MAT_... */ - int texnumber; /* when type=GPU_DYNAMIC_SAMPLER, texture number: 0.. */ - unsigned char *texpixels; /* for internally generated texture, pixel data in RGBA format */ - int texsize; /* size in pixel of the texture in texpixels buffer: - * for 2D textures, this is S and T size (square texture) */ -} GPUInputUniform; - -typedef struct GPUInputAttribute { - struct GPUInputAttribute *next, *prev; - char varname[32]; /* name of attribute in shader */ - int type; /* from CustomData.type, data type derives from it */ - GPUDataType datatype; /* type of attribute data */ - const char *name; /* layer name */ - int number; /* generic attribute number */ -} GPUInputAttribute; - -typedef struct GPUShaderExport { - ListBase uniforms; - ListBase attributes; - char *vertex; - char *fragment; -} GPUShaderExport; - -GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma); -void GPU_free_shader_export(GPUShaderExport *shader); - -/* Lamps */ - -GPULamp *GPU_lamp_from_blender(struct Scene *scene, struct Object *ob, struct Object *par); -void GPU_lamp_free(struct Object *ob); - -bool GPU_lamp_has_shadow_buffer(GPULamp *lamp); -void GPU_lamp_update_buffer_mats(GPULamp *lamp); -void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[4][4], int *winsize, float winmat[4][4]); -void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp); -int GPU_lamp_shadow_buffer_type(GPULamp *lamp); -int GPU_lamp_shadow_bind_code(GPULamp *lamp); -float *GPU_lamp_dynpersmat(GPULamp *lamp); - -void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[4][4]); -void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy); -void GPU_lamp_update_distance(GPULamp *lamp, float distance, float att1, float att2, - float coeff_const, float coeff_lin, float coeff_quad); -void GPU_lamp_update_spot(GPULamp *lamp, float spotsize, float spotblend); -int GPU_lamp_shadow_layer(GPULamp *lamp); -GPUNodeLink *GPU_lamp_get_data( - GPUMaterial *mat, GPULamp *lamp, - GPUNodeLink **r_col, GPUNodeLink **r_lv, GPUNodeLink **r_dist, GPUNodeLink **r_shadow, GPUNodeLink **r_energy); - -/* World */ -void GPU_mist_update_enable(short enable); -void GPU_mist_update_values(int type, float start, float dist, float inten, float color[3]); -void GPU_horizon_update_color(float color[3]); -void GPU_ambient_update_color(float color[3]); -void GPU_zenith_update_color(float color[3]); - -struct GPUParticleInfo -{ - float scalprops[4]; - float location[4]; - float velocity[3]; - float angular_velocity[3]; -}; - -#ifdef WITH_OPENSUBDIV -struct DerivedMesh; -void GPU_material_update_fvar_offset(GPUMaterial *gpu_material, - struct DerivedMesh *dm); -#endif +bool GPU_material_use_domain_surface(GPUMaterial *mat); +bool GPU_material_use_domain_volume(GPUMaterial *mat); + +void GPU_pass_cache_init(void); +void GPU_pass_cache_garbage_collect(void); +void GPU_pass_cache_free(void); #ifdef __cplusplus } |