playcanvas
Version:
PlayCanvas WebGL game engine
119 lines (116 loc) • 5.48 kB
JavaScript
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 };