UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

119 lines (116 loc) 5.48 kB
import { hashCode } from '../../../core/hash.js'; import { SEMANTIC_BLENDWEIGHT, SEMANTIC_BLENDINDICES, SEMANTIC_ATTR15, SHADERLANGUAGE_WGSL } from '../../../platform/graphics/constants.js'; import { ShaderUtils } from '../../../platform/graphics/shader-utils.js'; import { tonemapNames, gammaNames } from '../../constants.js'; import { ShaderPass } from '../../shader-pass.js'; import { shaderChunks } from '../chunks/chunks.js'; import { ShaderGenerator } from './shader-generator.js'; function _extends() { _extends = Object.assign || function(target) { for(var i = 1; i < arguments.length; i++){ var source = arguments[i]; for(var key in source){ if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var vShader = '\n #include "shaderPassDefines"\n #include "userCode"\n'; var fShader = '\n #include "shaderPassDefines"\n #include "decodePS"\n #include "gamma"\n #include "tonemappingPS"\n #include "fog"\n #include "userCode"\n'; class ShaderGeneratorShader extends ShaderGenerator { generateKey(options) { var desc = options.shaderDesc; var vsHash = desc.vertexCode ? hashCode(desc.vertexCode) : 0; var fsHash = desc.fragmentCode ? hashCode(desc.fragmentCode) : 0; var definesHash = ShaderGenerator.definesHash(options.defines); var key = desc.uniqueName + "_" + vsHash + "_" + fsHash + "_" + definesHash; key += "_" + options.pass; key += "_" + options.gamma; key += "_" + options.toneMapping; key += "_" + options.fog; if (options.skin) key += '_skin'; if (options.useInstancing) key += '_inst'; if (options.useMorphPosition) key += '_morphp'; if (options.useMorphNormal) key += '_morphn'; if (options.useMorphTextureBasedInt) key += '_morphi'; return key; } createAttributesDefinition(definitionOptions, options) { var srcAttributes = options.shaderDesc.attributes; var attributes = srcAttributes ? _extends({}, srcAttributes) : undefined; if (options.skin) { attributes.vertex_boneWeights = SEMANTIC_BLENDWEIGHT; attributes.vertex_boneIndices = SEMANTIC_BLENDINDICES; } if (options.useMorphPosition || options.useMorphNormal) { attributes.morph_vertex_id = SEMANTIC_ATTR15; } definitionOptions.attributes = attributes; } addSharedDefines(defines, options) { defines.set('TONEMAP', tonemapNames[options.toneMapping]); defines.set('GAMMA', gammaNames[options.gamma]); } createVertexDefinition(definitionOptions, options, shaderPassInfo) { var desc = options.shaderDesc; if (definitionOptions.shaderLanguage === SHADERLANGUAGE_WGSL) { definitionOptions.vertexCode = desc.vertexCode; } else { var includes = new Map(Object.entries(_extends({}, shaderChunks, options.chunks))); var defines = new Map(options.defines); this.addSharedDefines(defines, options); includes.set('shaderPassDefines', shaderPassInfo.shaderDefines); includes.set('userCode', desc.vertexCode); includes.set('transformInstancingVS', ''); if (options.skin) defines.set('SKIN', true); if (options.useInstancing) defines.set('INSTANCING', true); if (options.useMorphPosition || options.useMorphNormal) { defines.set('MORPHING', true); if (options.useMorphTextureBasedInt) defines.set('MORPHING_INT', true); if (options.useMorphPosition) defines.set('MORPHING_POSITION', true); if (options.useMorphNormal) defines.set('MORPHING_NORMAL', true); } definitionOptions.vertexCode = vShader; definitionOptions.vertexIncludes = includes; definitionOptions.vertexDefines = defines; } } createFragmentDefinition(definitionOptions, options, shaderPassInfo) { var desc = options.shaderDesc; if (definitionOptions.shaderLanguage === SHADERLANGUAGE_WGSL) { definitionOptions.fragmentCode = desc.fragmentCode; } else { var includes = new Map(Object.entries(_extends({}, shaderChunks, options.chunks))); includes.set('shaderPassDefines', shaderPassInfo.shaderDefines); includes.set('gamma', ShaderGenerator.gammaCode(options.gamma)); includes.set('fog', ShaderGenerator.fogCode(options.fog)); includes.set('userCode', desc.fragmentCode); var defines = new Map(options.defines); this.addSharedDefines(defines, options); definitionOptions.fragmentCode = fShader; definitionOptions.fragmentIncludes = includes; definitionOptions.fragmentDefines = defines; } } createShaderDefinition(device, options) { var shaderPassInfo = ShaderPass.get(device).getByIndex(options.pass); var desc = options.shaderDesc; var definitionOptions = { name: "ShaderMaterial-" + desc.uniqueName, shaderLanguage: desc.shaderLanguage, fragmentOutputTypes: desc.fragmentOutputTypes, meshUniformBufferFormat: desc.meshUniformBufferFormat, meshBindGroupFormat: desc.meshBindGroupFormat }; this.createAttributesDefinition(definitionOptions, options); this.createVertexDefinition(definitionOptions, options, shaderPassInfo); this.createFragmentDefinition(definitionOptions, options, shaderPassInfo); return ShaderUtils.createDefinition(device, definitionOptions); } } var shaderGeneratorShader = new ShaderGeneratorShader(); export { shaderGeneratorShader };