mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
3 lines (2 loc) • 7.96 kB
TypeScript
declare const shader = "\nvarying vec3 v_normal;\nvarying vec4 v_uv[2];\nvarying vec3 v_lightDir;\n// varying vec3 v_eyeVec;\nvarying vec3 v_halfVec;\nvarying vec3 v_teamColor;\nvarying vec4 v_vertexColor;\n\nstruct LayerSettings {\n bool enabled;\n float op;\n float channels;\n float teamColorMode;\n // vec3 multAddAlpha;\n // bool useAlphaFactor;\n bool invert;\n // bool multColor;\n // bool addColor;\n bool clampResult;\n // bool useConstantColor;\n // vec4 constantColor;\n // float uvSource;\n float uvCoordinate;\n // float fresnelMode;\n // float fresnelTransformMode;\n // mat4 fresnelTransform;\n // bool fresnelClamp;\n // vec3 fresnelExponentBiasScale;\n};\n\nuniform float u_specularity;\nuniform float u_specMult;\nuniform float u_emisMult;\nuniform vec4 u_lightAmbient;\n\nuniform LayerSettings u_diffuseLayerSettings;\nuniform sampler2D u_diffuseMap;\nuniform LayerSettings u_decalLayerSettings;\nuniform sampler2D u_decalMap;\nuniform LayerSettings u_specularLayerSettings;\nuniform sampler2D u_specularMap;\nuniform LayerSettings u_glossLayerSettings;\nuniform sampler2D u_glossMap;\nuniform LayerSettings u_emissiveLayerSettings;\nuniform sampler2D u_emissiveMap;\nuniform LayerSettings u_emissive2LayerSettings;\nuniform sampler2D u_emissive2Map;\nuniform LayerSettings u_evioLayerSettings;\nuniform sampler2D u_evioMap;\nuniform LayerSettings u_evioMaskLayerSettings;\nuniform sampler2D u_evioMaskMap;\nuniform LayerSettings u_alphaLayerSettings;\nuniform sampler2D u_alphaMap;\nuniform LayerSettings u_alphaMaskLayerSettings;\nuniform sampler2D u_alphaMaskMap;\nuniform LayerSettings u_normalLayerSettings;\nuniform sampler2D u_normalMap;\nuniform LayerSettings u_heightLayerSettings;\nuniform sampler2D u_heightMap;\nuniform LayerSettings u_lightMapLayerSettings;\nuniform sampler2D u_lightMapMap;\nuniform LayerSettings u_aoLayerSettings;\nuniform sampler2D u_aoMap;\n\n#define SPECULAR_RGB 0.0\n#define SPECULAR_A_ONLY 1.0\n\n#define FRESNELMODE_NONE 0.0\n#define FRESNELMODE_STANDARD 1.0\n#define FRESNELMODE_INVERTED 2.0\n\n#define FRESNELTRANSFORM_NONE 0.0\n#define FRESNELTRANSFORM_SIMPLE 1.0\n#define FRESNELTRANSFORM_NORMALIZED 2.0\n\n#define UVMAP_EXPLICITUV0 0.0\n#define UVMAP_EXPLICITUV1 1.0\n#define UVMAP_REFLECT_CUBICENVIO 2.0\n#define UVMAP_REFLECT_SPHERICALENVIO 3.0\n#define UVMAP_PLANARLOCALZ 4.0\n#define UVMAP_PLANARWORLDZ 5.0\n#define UVMAP_PARTICLE_FLIPBOOK 6.0\n#define UVMAP_CUBICENVIO 7.0\n#define UVMAP_SPHERICALENVIO 8.0\n#define UVMAP_EXPLICITUV2 9.0\n#define UVMAP_EXPLICITUV3 10.0\n#define UVMAP_PLANARLOCALX 11.0\n#define UVMAP_PLANARLOCALY 12.0\n#define UVMAP_PLANARWORLDX 13.0\n#define UVMAP_PLANARWORLDY 14.0\n#define UVMAP_SCREENSPACE 15.0\n#define UVMAP_TRIPLANAR_LOCAL 16.0\n#define UVMAP_TRIPLANAR_WORLD 17.0\n#define UVMAP_TRIPLANAR_WORLD_LOCAL_Z 18.0\n\n#define CHANNELSELECT_RGB 0.0\n#define CHANNELSELECT_RGBA 1.0\n#define CHANNELSELECT_A 2.0\n#define CHANNELSELECT_R 3.0\n#define CHANNELSELECT_G 4.0\n#define CHANNELSELECT_B 5.0\n\n#define TEAMCOLOR_NONE 0.0\n#define TEAMCOLOR_DIFFUSE 1.0\n#define TEAMCOLOR_EMISSIVE 2.0\n\n#define LAYEROP_MOD 0.0\n#define LAYEROP_MOD2X 1.0\n#define LAYEROP_ADD 2.0\n#define LAYEROP_LERP 3.0\n#define LAYEROP_TEAMCOLOR_EMISSIVE_ADD 4.0\n#define LAYEROP_TEAMCOLOR_DIFFUSE_ADD 5.0\n#define LAYEROP_ADD_NO_ALPHA 6.0\n\n// float calculateFresnelTerm(vec3 normal, vec3 eyeToVertex, float exponent, mat4 fresnelTransform, float fresnelTransformMode, bool fresnelClamp) {\n// vec3 fresnelDir = eyeToVertex;\n// float result;\n\n// if (fresnelTransformMode != FRESNELTRANSFORM_NONE) {\n// fresnelDir = (fresnelTransform * vec4(fresnelDir, 1.0)).xyz;\n\n// if (fresnelTransformMode == FRESNELTRANSFORM_NORMALIZED) {\n// fresnelDir = normalize(fresnelDir);\n// }\n// }\n\n// if (fresnelClamp) {\n// result = 1.0 - clamp(-dot(normal, fresnelDir), 0.0, 1.0);\n// } else {\n// result = 1.0 - abs(dot(normal, fresnelDir));\n// }\n\n// result = max(result, 0.0000001);\n\n// return pow(result, exponent);\n// }\n\nvec3 combineLayerColor(vec4 color, vec3 result, LayerSettings layerSettings) {\n if (layerSettings.op == LAYEROP_MOD) {\n result *= color.rgb;\n } else if (layerSettings.op == LAYEROP_MOD2X) {\n result *= color.rgb * 2.0;\n } else if (layerSettings.op == LAYEROP_ADD) {\n result += color.rgb * color.a;\n } else if (layerSettings.op == LAYEROP_ADD_NO_ALPHA) {\n result += color.rgb;\n } else if (layerSettings.op == LAYEROP_LERP) {\n result = mix(result, color.rgb, color.a);\n } else if (layerSettings.op == LAYEROP_TEAMCOLOR_EMISSIVE_ADD) {\n result += color.a * v_teamColor;\n } else if (layerSettings.op == LAYEROP_TEAMCOLOR_DIFFUSE_ADD) {\n result += color.a * v_teamColor;\n }\n\n return result;\n}\n\nvec4 chooseChannel(float channel, vec4 texel) {\n if (channel == CHANNELSELECT_R) {\n texel = texel.rrrr;\n } else if (channel == CHANNELSELECT_G) {\n texel = texel.gggg;\n } else if (channel == CHANNELSELECT_B) {\n texel = texel.bbbb;\n } else if (channel == CHANNELSELECT_A) {\n texel = texel.aaaa;\n } else if (channel == CHANNELSELECT_RGB) {\n texel.a = 1.0;\n }\n\n return texel;\n}\n\nvec2 getUV(LayerSettings layerSettings) {\n if (layerSettings.uvCoordinate == 1.0) {\n return v_uv[0].zw;\n } else if (layerSettings.uvCoordinate == 2.0) {\n return v_uv[1].xy;\n } else if (layerSettings.uvCoordinate == 3.0) {\n return v_uv[1].zw;\n }\n\n return v_uv[0].xy;\n}\n\nvec4 sampleLayer(sampler2D layer, LayerSettings layerSettings) {\n // if (layerSettings.useConstantColor) {\n // return layerSettings.constantColor;\n // }\n\n return texture2D(layer, getUV(layerSettings));\n}\n\nvec4 computeLayerColor(sampler2D layer, LayerSettings layerSettings) {\n vec4 color = sampleLayer(layer, layerSettings);\n\n // if (layerSettings.useMask) {\n // result *= mask;\n // }\n\n vec4 result = chooseChannel(layerSettings.channels, color);\n\n // if (layerSettings.useAlphaFactor) {\n // result.a *= layerSettings.multiplyAddAlpha.z;\n // }\n\n if (layerSettings.teamColorMode == TEAMCOLOR_DIFFUSE) {\n result = vec4(mix(v_teamColor, result.rgb, color.a), 1.0);\n } else if (layerSettings.teamColorMode == TEAMCOLOR_EMISSIVE) {\n result = vec4(mix(v_teamColor, result.rgb, color.a), 1.0);\n }\n\n if (layerSettings.invert) {\n result = vec4(1.0) - result;\n }\n\n // if (layerSettings.multiplyEnable) {\n // result *= layerSettings.multiplyAddAlpha.x;\n // }\n\n // if (layerSettings.addEnable) {\n // result += layerSettings.multiplyAddAlpha.y;\n // }\n\n if (layerSettings.clampResult) {\n result = clamp(result, 0.0, 1.0);\n }\n\n // if (layerSettings.fresnelMode != FRESNELMODE_NONE) {\n // float fresnelTerm = calculateFresnelTerm(v_normal, v_eyeVec, layerSettings.fresnelExponentBiasScale.x, layerSettings.fresnelTransform, layerSettings.fresnelTransformMode, layerSettings.fresnelClamp);\n \n // if (layerSettings.fresnelMode == FRESNELMODE_INVERTED) {\n // fresnelTerm = 1.0 - fresnelTerm;\n // }\n \n // fresnelTerm = clamp(fresnelTerm * layerSettings.fresnelExponentBiasScale.z + layerSettings.fresnelExponentBiasScale.y, 0.0, 1.0);\n \n // result *= fresnelTerm;\n // }\n\n return result;\n}\n\nvec3 decodeNormal(sampler2D map) {\n vec4 texel = texture2D(map, v_uv[0].xy);\n vec3 normal;\n\n normal.xy = 2.0 * texel.wy - 1.0;\n normal.z = sqrt(max(0.0, 1.0 - dot(normal.xy, normal.xy)));\n\n return normal;\n}\n\nvec4 computeSpecular(sampler2D specularMap, LayerSettings layerSettings, float specularity, float specMult, vec3 normal) {\n vec4 color;\n\n if (layerSettings.enabled) {\n color = computeLayerColor(specularMap, layerSettings);\n } else {\n color = vec4(0);\n }\n\n float factor = pow(max(-dot(v_halfVec, normal), 0.0), specularity) * specMult;\n\n return color * factor;\n}\n";
export default shader;