- add the use of DRWShaderLibrary to EEVEE's glsl codebase to reduce code complexity and duplication. - split bsdf_common_lib.glsl into multiple sub library which are now shared with other engines. - the surface shader code is now more organised and have its own files. - change default world to use a material nodetree and make lookdev shader more clear. Reviewed By: jbakker Differential Revision: https://developer.blender.org/D8306
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| 
 | |
| vec3 calc_barycentric_distances(vec3 pos0, vec3 pos1, vec3 pos2)
 | |
| {
 | |
|   vec3 edge21 = pos2 - pos1;
 | |
|   vec3 edge10 = pos1 - pos0;
 | |
|   vec3 edge02 = pos0 - pos2;
 | |
|   vec3 d21 = normalize(edge21);
 | |
|   vec3 d10 = normalize(edge10);
 | |
|   vec3 d02 = normalize(edge02);
 | |
| 
 | |
|   vec3 dists;
 | |
|   float d = dot(d21, edge02);
 | |
|   dists.x = sqrt(dot(edge02, edge02) - d * d);
 | |
|   d = dot(d02, edge10);
 | |
|   dists.y = sqrt(dot(edge10, edge10) - d * d);
 | |
|   d = dot(d10, edge21);
 | |
|   dists.z = sqrt(dot(edge21, edge21) - d * d);
 | |
|   return dists;
 | |
| }
 | |
| 
 | |
| vec2 calc_barycentric_co(int vertid)
 | |
| {
 | |
|   vec2 bary;
 | |
|   bary.x = float((vertid % 3) == 0);
 | |
|   bary.y = float((vertid % 3) == 1);
 | |
|   return bary;
 | |
| }
 | |
| 
 | |
| #ifdef HAIR_SHADER
 | |
| 
 | |
| /* Hairs uv and col attributes are passed by bufferTextures. */
 | |
| #  define DEFINE_ATTR(type, attr) uniform samplerBuffer attr
 | |
| #  define GET_ATTR(type, attr) hair_get_customdata_##type(attr)
 | |
| 
 | |
| #  define barycentric_get() hair_get_barycentric()
 | |
| #  define barycentric_resolve(bary) hair_resolve_barycentric(bary)
 | |
| 
 | |
| vec3 orco_get(vec3 local_pos, mat4 modelmatinv, vec4 orco_madd[2], const samplerBuffer orco_samp)
 | |
| {
 | |
|   /* TODO: fix ORCO with modifiers. */
 | |
|   vec3 orco = (modelmatinv * vec4(local_pos, 1.0)).xyz;
 | |
|   return orco_madd[0].xyz + orco * orco_madd[1].xyz;
 | |
| }
 | |
| 
 | |
| vec4 tangent_get(const samplerBuffer attr, mat3 normalmat)
 | |
| {
 | |
|   /* Unsupported */
 | |
|   return vec4(0.0);
 | |
| }
 | |
| 
 | |
| #else /* MESH_SHADER */
 | |
| 
 | |
| #  define DEFINE_ATTR(type, attr) in type attr
 | |
| #  define GET_ATTR(type, attr) attr
 | |
| 
 | |
| /* Calculated in geom shader later with calc_barycentric_co. */
 | |
| #  define barycentric_get() vec2(0)
 | |
| #  define barycentric_resolve(bary) bary
 | |
| 
 | |
| vec3 orco_get(vec3 local_pos, mat4 modelmatinv, vec4 orco_madd[2], vec4 orco)
 | |
| {
 | |
|   /* If the object does not have any deformation, the orco layer calculation is done on the fly
 | |
|    * using the orco_madd factors.
 | |
|    * We know when there is no orco layer when orco.w is 1.0 because it uses the generic vertex
 | |
|    * attrib (which is [0,0,0,1]). */
 | |
|   if (orco.w == 0.0) {
 | |
|     return orco.xyz * 0.5 + 0.5;
 | |
|   }
 | |
|   else {
 | |
|     return orco_madd[0].xyz + local_pos * orco_madd[1].xyz;
 | |
|   }
 | |
| }
 | |
| 
 | |
| vec4 tangent_get(vec4 attr, mat3 normalmat)
 | |
| {
 | |
|   vec4 tangent;
 | |
|   tangent.xyz = normalmat * attr.xyz;
 | |
|   tangent.w = attr.w;
 | |
|   float len_sqr = dot(tangent.xyz, tangent.xyz);
 | |
|   /* Normalize only if vector is not null. */
 | |
|   if (len_sqr > 0.0) {
 | |
|     tangent.xyz *= inversesqrt(len_sqr);
 | |
|   }
 | |
|   return tangent;
 | |
| }
 | |
| 
 | |
| #endif
 |