diff --git a/extensions/hlsl/language-configuration.json b/extensions/hlsl/language-configuration.json new file mode 100644 index 00000000000..8d91e91a89e --- /dev/null +++ b/extensions/hlsl/language-configuration.json @@ -0,0 +1,23 @@ +{ + "comments": { + "lineComment": "//", + "blockComment": [ "/*", "*/" ] + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""] + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""] + ] +} \ No newline at end of file diff --git a/extensions/hlsl/package.json b/extensions/hlsl/package.json new file mode 100644 index 00000000000..d5147184066 --- /dev/null +++ b/extensions/hlsl/package.json @@ -0,0 +1,19 @@ +{ + "name": "hlsl", + "version": "0.1.0", + "publisher": "vscode", + "engines": { "vscode": "*" }, + "contributes": { + "languages": [{ + "id": "hlsl", + "extensions": [".hlsl",".hlsli",".fx",".fxh",".vsh",".psh",".cginc",".compute"], + "aliases": ["HLSL", "hlsl"], + "configuration": "./language-configuration.json" + }], + "grammars": [{ + "language": "hlsl", + "path": "./syntaxes/hlsl.json", + "scopeName":"source.hlsl" + }] + } +} \ No newline at end of file diff --git a/extensions/hlsl/syntaxes/hlsl.json b/extensions/hlsl/syntaxes/hlsl.json new file mode 100644 index 00000000000..88b71914593 --- /dev/null +++ b/extensions/hlsl/syntaxes/hlsl.json @@ -0,0 +1,217 @@ +{ + "scopeName": "source.hlsl", + "name": "HLSL", + "fileTypes": [ + "hlsl", + "hlsli", + "fx", + "fxh", + "vsh", + "psh", + "cginc", + "compute" + ], + "patterns": [ + { + "name": "comment.line.block.hlsl", + "begin": "/\\*", + "end": "\\*/" + }, + { + "name": "comment.line.double-slash.hlsl", + "begin": "//", + "end": "$" + }, + { + "name": "constant.numeric.hlsl", + "match": "\\b([0-9]+\\.?[0-9]*)\\b" + }, + { + "name": "constant.numeric.hlsl", + "match": "\\b(\\.[0-9]+)\\b" + }, + { + "name": "constant.numeric.hex.hlsl", + "match": "\\b(0x[0-9A-F]+)\\b" + }, + { + "name": "constant.language.hlsl", + "match": "\\b(false|true)\\b" + }, + { + "name": "keyword.preprocessor.hlsl", + "match": "^\\s*#\\s*(define|elif|else|endif|ifdef|ifndef|if|undef|include|line|error|pragma)" + }, + { + "name": "keyword.control.hlsl", + "match": "\\b(break|case|continue|default|discard|do|else|for|if|return|switch|while)\\b" + }, + { + "name": "keyword.control.fx.hlsl", + "match": "\\b(compile)\\b" + }, + { + "name": "keyword.typealias.hlsl", + "match": "\\b(typedef)\\b" + }, + { + "name": "storage.type.basic.hlsl", + "match": "\\b(bool([1-4](x[1-4])?)?|double([1-4](x[1-4])?)?|dword|float([1-4](x[1-4])?)?|half([1-4](x[1-4])?)?|int([1-4](x[1-4])?)?|matrix|min10float([1-4](x[1-4])?)?|min12int([1-4](x[1-4])?)?|min16float([1-4](x[1-4])?)?|min16int([1-4](x[1-4])?)?|min16uint([1-4](x[1-4])?)?|unsigned|uint([1-4](x[1-4])?)?|vector|void)\\b" + }, + { + "name": "support.function.hlsl", + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)(?=[\\s]*\\()" + }, + { + "name": "support.variable.semantic.hlsl", + "match": "(?<=\\:\\s|\\:)(?i:BINORMAL[0-9]*|BLENDINDICES[0-9]*|BLENDWEIGHT[0-9]*|COLOR[0-9]*|NORMAL[0-9]*|POSITIONT|POSITION|PSIZE[0-9]*|TANGENT[0-9]*|TEXCOORD[0-9]*|FOG|TESSFACTOR[0-9]*|VFACE|VPOS|DEPTH[0-9]*)\\b" + }, + { + "name": "support.variable.semantic.sm4.hlsl", + "match": "(?<=\\:\\s|\\:)(?i:SV_ClipDistance[0-9]*|SV_CullDistance[0-9]*|SV_Coverage|SV_Depth|SV_DepthGreaterEqual[0-9]*|SV_DepthLessEqual[0-9]*|SV_InstanceID|SV_IsFrontFace|SV_Position|SV_RenderTargetArrayIndex|SV_SampleIndex|SV_StencilRef|SV_Target[0-7]?|SV_VertexID|SV_ViewportArrayIndex)\\b" + }, + { + "name": "support.variable.semantic.sm5.hlsl", + "match": "(?<=\\:\\s|\\:)(?i:SV_DispatchThreadID|SV_DomainLocation|SV_GroupID|SV_GroupIndex|SV_GroupThreadID|SV_GSInstanceID|SV_InsideTessFactor|SV_OutputControlPointID|SV_TessFactor)\\b" + }, + { + "name": "support.variable.semantic.sm5_1.hlsl", + "match": "(?<=\\:\\s|\\:)(?i:SV_InnerCoverage|SV_StencilRef)\\b" + }, + { + "name": "storage.modifier.hlsl", + "match": "\\b(column_major|const|export|extern|globallycoherent|groupshared|inline|inout|in|out|precise|row_major|shared|static|uniform|volatile)\\b" + }, + { + "name": "storage.modifier.float.hlsl", + "match": "\\b(snorm|unorm)\\b" + }, + { + "name": "storage.modifier.postfix.hlsl", + "match": "\\b(packoffset|register)\\b" + }, + { + "name": "storage.modifier.interpolation.hlsl", + "match": "\\b(centroid|linear|nointerpolation|noperspective|sample)\\b" + }, + { + "name": "storage.modifier.geometryshader.hlsl", + "match": "\\b(lineadj|line|point|triangle|triangleadj)\\b" + }, + { + "name": "support.type.other.hlsl", + "match": "\\b(string)\\b" + }, + { + "name": "support.type.object.hlsl", + "match": "\\b(AppendStructuredBuffer|Buffer|ByteAddressBuffer|ConstantBuffer|ConsumeStructuredBuffer|InputPatch|OutputPatch)\\b" + }, + { + "name": "support.type.object.rasterizerordered.hlsl", + "match": "\\b(RasterizerOrderedBuffer|RasterizerOrderedByteAddressBuffer|RasterizerOrderedStructuredBuffer|RasterizerOrderedTexture1D|RasterizerOrderedTexture1DArray|RasterizerOrderedTexture2D|RasterizerOrderedTexture2DArray|RasterizerOrderedTexture3D)\\b" + }, + { + "name": "support.type.object.rw.hlsl", + "match": "\\b(RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture1D|RWTexture1DArray|RWTexture2D|RWTexture2DArray|RWTexture3D)\\b" + }, + { + "name": "support.type.object.geometryshader.hlsl", + "match": "\\b(LineStream|PointStream|TriangleStream)\\b" + }, + { + "name": "support.type.sampler.legacy.hlsl", + "match": "\\b(sampler|sampler1D|sampler2D|sampler3D|samplerCUBE|sampler_state)\\b" + }, + { + "name": "support.type.sampler.hlsl", + "match": "\\b(SamplerState|SamplerComparisonState)\\b" + }, + { + "name": "support.type.texture.legacy.hlsl", + "match": "\\b(texture2D|textureCUBE)\\b" + }, + { + "name": "support.type.texture.hlsl", + "match": "\\b(Texture1D|Texture1DArray|Texture2D|Texture2DArray|Texture2DMS|Texture2DMSArray|Texture3D|TextureCube|TextureCubeArray)\\b" + }, + { + "name": "storage.type.structured.hlsl", + "match": "\\b(cbuffer|class|interface|namespace|struct|tbuffer)\\b" + }, + { + "name": "support.constant.property-value.fx.hlsl", + "match": "\\b(FALSE|TRUE|NULL)\\b" + }, + { + "name": "support.type.fx.hlsl", + "match": "\\b(BlendState|DepthStencilState|RasterizerState)\\b" + }, + { + "name": "storage.type.fx.technique.hlsl", + "match": "\\b(technique|Technique|technique10|technique11|pass)\\b" + }, + { + "name": "meta.object-literal.key.fx.blendstate.hlsl", + "match": "\\b(AlphaToCoverageEnable|BlendEnable|SrcBlend|DestBlend|BlendOp|SrcBlendAlpha|DestBlendAlpha|BlendOpAlpha|RenderTargetWriteMask)\\b" + }, + { + "name": "meta.object-literal.key.fx.depthstencilstate.hlsl", + "match": "\\b(DepthEnable|DepthWriteMask|DepthFunc|StencilEnable|StencilReadMask|StencilWriteMask|FrontFaceStencilFail|FrontFaceStencilZFail|FrontFaceStencilPass|FrontFaceStencilFunc|BackFaceStencilFail|BackFaceStencilZFail|BackFaceStencilPass|BackFaceStencilFunc)\\b" + }, + { + "name": "meta.object-literal.key.fx.rasterizerstate.hlsl", + "match": "\\b(FillMode|CullMode|FrontCounterClockwise|DepthBias|DepthBiasClamp|SlopeScaleDepthBias|ZClipEnable|ScissorEnable|MultiSampleEnable|AntiAliasedLineEnable)\\b" + }, + { + "name": "meta.object-literal.key.fx.samplerstate.hlsl", + "match": "\\b(Filter|AddressU|AddressV|AddressW|MipLODBias|MaxAnisotropy|ComparisonFunc|BorderColor|MinLOD|MaxLOD)\\b" + }, + { + "name": "support.constant.property-value.fx.blend.hlsl", + "match": "\\b(?i:ZERO|ONE|SRC_COLOR|INV_SRC_COLOR|SRC_ALPHA|INV_SRC_ALPHA|DEST_ALPHA|INV_DEST_ALPHA|DEST_COLOR|INV_DEST_COLOR|SRC_ALPHA_SAT|BLEND_FACTOR|INV_BLEND_FACTOR|SRC1_COLOR|INV_SRC1_COLOR|SRC1_ALPHA|INV_SRC1_ALPHA)\\b" + }, + { + "name": "support.constant.property-value.fx.blendop.hlsl", + "match": "\\b(?i:ADD|SUBTRACT|REV_SUBTRACT|MIN|MAX)\\b" + }, + { + "name": "support.constant.property-value.fx.depthwritemask.hlsl", + "match": "\\b(?i:ALL)\\b" + }, + { + "name": "support.constant.property-value.fx.comparisonfunc.hlsl", + "match": "\\b(?i:NEVER|LESS|EQUAL|LESS_EQUAL|GREATER|NOT_EQUAL|GREATER_EQUAL|ALWAYS)\\b" + }, + { + "name": "support.constant.property-value.fx.stencilop.hlsl", + "match": "\\b(?i:KEEP|REPLACE|INCR_SAT|DECR_SAT|INVERT|INCR|DECR)\\b" + }, + { + "name": "support.constant.property-value.fx.fillmode.hlsl", + "match": "\\b(?i:WIREFRAME|SOLID)\\b" + }, + { + "name": "support.constant.property-value.fx.cullmode.hlsl", + "match": "\\b(?i:NONE|FRONT|BACK)\\b" + }, + { + "name": "support.constant.property-value.fx.filter.hlsl", + "match": "\\b(?i:MIN_MAG_MIP_POINT|MIN_MAG_POINT_MIP_LINEAR|MIN_POINT_MAG_LINEAR_MIP_POINT|MIN_POINT_MAG_MIP_LINEAR|MIN_LINEAR_MAG_MIP_POINT|MIN_LINEAR_MAG_POINT_MIP_LINEAR|MIN_MAG_LINEAR_MIP_POINT|MIN_MAG_MIP_LINEAR|ANISOTROPIC|COMPARISON_MIN_MAG_MIP_POINT|COMPARISON_MIN_MAG_POINT_MIP_LINEAR|COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT|COMPARISON_MIN_POINT_MAG_MIP_LINEAR|COMPARISON_MIN_LINEAR_MAG_MIP_POINT|COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR|COMPARISON_MIN_MAG_LINEAR_MIP_POINT|COMPARISON_MIN_MAG_MIP_LINEAR|COMPARISON_ANISOTROPIC|TEXT_1BIT)\\b" + }, + { + "name": "support.constant.property-value.fx.textureaddressmode.hlsl", + "match": "\\b(?i:WRAP|MIRROR|CLAMP|BORDER|MIRROR_ONCE)\\b" + }, + { + "name": "string.quoted.double.hlsl", + "begin": "\"", + "end": "\"", + "patterns": [ + { + "name": "constant.character.escape.hlsl", + "match": "\\\\." + } + ] + } + ] +} \ No newline at end of file diff --git a/extensions/hlsl/test/colorize-fixtures/test.hlsl b/extensions/hlsl/test/colorize-fixtures/test.hlsl new file mode 100644 index 00000000000..721f61d82f3 --- /dev/null +++ b/extensions/hlsl/test/colorize-fixtures/test.hlsl @@ -0,0 +1,13 @@ +struct VS_OUTPUT +{ + float4 Position : SV_Position; +}; + +VS_OUTPUT main(in float4 vPosition : POSITION) +{ + VS_OUTPUT Output; + + Output.Position = vPosition; + + return Output; +} \ No newline at end of file diff --git a/extensions/hlsl/test/colorize-results/test_hlsl.json b/extensions/hlsl/test/colorize-results/test_hlsl.json new file mode 100644 index 00000000000..0f245f64b56 --- /dev/null +++ b/extensions/hlsl/test/colorize-results/test_hlsl.json @@ -0,0 +1,277 @@ +[ + { + "c": "struct", + "t": "source.hlsl storage.type.structured.hlsl", + "r": { + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": " VS_OUTPUT", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "float4", + "t": "source.hlsl storage.type.basic.hlsl", + "r": { + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": " Position : ", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "SV_Position", + "t": "source.hlsl support.variable.semantic.sm4.hlsl", + "r": { + "dark_plus": "support.variable: #9CDCFE", + "light_plus": "support.variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ";", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "};", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "VS_OUTPUT ", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "main", + "t": "source.hlsl support.function.hlsl", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "(", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "in", + "t": "source.hlsl storage.modifier.hlsl", + "r": { + "dark_plus": "storage.modifier: #569CD6", + "light_plus": "storage.modifier: #0000FF", + "dark_vs": "storage.modifier: #569CD6", + "light_vs": "storage.modifier: #0000FF", + "hc_black": "storage.modifier: #569CD6" + } + }, + { + "c": " ", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "float4", + "t": "source.hlsl storage.type.basic.hlsl", + "r": { + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": " vPosition : ", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "POSITION", + "t": "source.hlsl support.variable.semantic.hlsl", + "r": { + "dark_plus": "support.variable: #9CDCFE", + "light_plus": "support.variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " VS_OUTPUT Output;", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " Output.Position = vPosition;", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "return", + "t": "source.hlsl keyword.control.hlsl", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #569CD6" + } + }, + { + "c": " Output;", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "}", + "t": "source.hlsl", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + } +] \ No newline at end of file diff --git a/extensions/shaderlab/package.json b/extensions/shaderlab/package.json index 52cb3b7da98..71dcb0a6445 100644 --- a/extensions/shaderlab/package.json +++ b/extensions/shaderlab/package.json @@ -6,7 +6,7 @@ "contributes": { "languages": [{ "id": "shaderlab", - "extensions": [".shader", ".cginc"], + "extensions": [".shader"], "aliases": ["ShaderLab", "shaderlab"], "configuration": "./language-configuration.json" }], diff --git a/extensions/shaderlab/syntaxes/shaderlab.json b/extensions/shaderlab/syntaxes/shaderlab.json index c86f7c50d23..4eea24fad6c 100644 --- a/extensions/shaderlab/syntaxes/shaderlab.json +++ b/extensions/shaderlab/syntaxes/shaderlab.json @@ -1,133 +1,174 @@ { - "scopeName": "source.shaderlab", - "name": "ShaderLab", - "fileTypes": [ - "shader" - ], - "patterns": [ - { - "match": "\\b([0-9]+\\.?[0-9]*)\\b", - "name": "constant.numeric.shaderlab" - }, - { - "match": "\\b(Shader|Properties|Category|SubShader|Tags|Pass)\\b", - "name": "support.class.shaderlab" - }, - { - "match": "\\b(CGPROGRAM|ENDCG)\\b", - "name": "support.class.shaderlab" - }, - { - "match": "\\b(Dependency|Fallback)\\b", - "name": "support.variable.shaderlab" - }, - { - "match": "^\\s*\\[(HideInInspector)\\]", - "name": "keyword.shaderlab" - }, - { - "match": "\\b(_\\w+)\\b", - "name": "support.variable.input.shaderlab" - }, - { - "match": "\\b(uv(2)*_\\w+|viewDir|COLOR|screenPos|worldPos|worldRefl|worldNormal|worldRefl|worldNormal)\\b", - "name": "support.variable.input.shaderlab" - }, - { - "match": "\\b(Albedo|Normal|Emission|Specular|Gloss|Alpha)\\b", - "name": "support.variable.output.shaderlab" - }, - { - "match": "\\b(appdata_(base|tan|full|img)|SurfaceOutput)\\b", - "name": "support.variable.structure.shaderlab" - }, - { - "match": "\\b(UNITY_MATRIX_(MVP|MV|V|P|VP|T_MV|IT_MV|TEXTURE0|TEXTURE1|TEXTURE2|TEXTURE3)|_Object2World|_World2Object|_WorldSpaceCameraPos|unity_Scale)\\b", - "name": "support.variable.transformation.shaderlab" - }, - { - "match": "\\b(_ModelLightColor[0-9]|_SpecularLightColor[0-9]|_ObjectSpaceLightPos|_Light2World|_World2Light|_Object2Light)\\b", - "name": "support.variable.lighting.shaderlab" - }, - { - "match": "\\b(_Time|_SinTime|_CosTime|unity_DeltaTime|_ProjectionParams|_ScreenParams)\\b", - "name": "support.variable.other.shaderlab" - }, - { - "include": "#comments" - }, - { - "include": "#strings" - }, - { - "include": "#functions" - }, - { - "include": "#cg" - } - ], - "repository": { - "comments": { - "patterns": [ + "scopeName": "source.shaderlab", + "name": "ShaderLab", + "fileTypes": [ + "shader" + ], + "patterns": [ + { + "name": "comment.line.double-slash.shaderlab", + "begin": "//", + "end": "$" + }, + { + "name": "support.type.basic.shaderlab", + "match": "\\b(?i:Range|Float|Int|Color|Vector|2D|3D|Cube|Any)\\b" + }, + { + "include": "#numbers" + }, + { + "name": "storage.type.structure.shaderlab", + "match": "\\b(?i:Shader|Properties|SubShader|Pass|Category)\\b" + }, + { + "name": "support.type.propertyname.shaderlab", + "match": "\\b(?i:Name|Tags|Fallback|CustomEditor|Cull|ZWrite|ZTest|Offset|Blend|BlendOp|ColorMask|AlphaToMask|LOD|Lighting|Stencil|Ref|ReadMask|WriteMask|Comp|CompBack|CompFront|Fail|ZFail|UsePass|GrabPass|Dependency|Material|Diffuse|Ambient|Shininess|Specular|Emission|Fog|Mode|Density|SeparateSpecular|SetTexture|Combine|ConstantColor|Matrix|AlphaTest|ColorMaterial|BindChannels|Bind)\\b" + }, + { + "name": "support.constant.property-value.shaderlab", + "match": "\\b(?i:Back|Front|On|Off|[RGBA]{1,3}|AmbientAndDiffuse|Emission)\\b" + }, + { + "name": "support.constant.property-value.comparisonfunction.shaderlab", + "match": "\\b(?i:Less|Greater|LEqual|GEqual|Equal|NotEqual|Always|Never)\\b" + }, + { + "name": "support.constant.property-value.stenciloperation.shaderlab", + "match": "\\b(?i:Keep|Zero|Replace|IncrSat|DecrSat|Invert|IncrWrap|DecrWrap)\\b" + }, + { + "name": "support.constant.property-value.texturecombiners.shaderlab", + "match": "\\b(?i:Previous|Primary|Texture|Constant|Lerp|Double|Quad|Alpha)\\b" + }, + { + "name": "support.constant.property-value.fog.shaderlab", + "match": "\\b(?i:Global|Linear|Exp2|Exp)\\b" + }, + { + "name": "support.constant.property-value.bindchannels.shaderlab", + "match": "\\b(?i:Vertex|Normal|Tangent|TexCoord0|TexCoord1)\\b" + }, + { + "name": "support.constant.property-value.blendoperations.shaderlab", + "match": "\\b(?i:Add|Sub|RevSub|Min|Max|LogicalClear|LogicalSet|LogicalCopyInverted|LogicalCopy|LogicalNoop|LogicalInvert|LogicalAnd|LogicalNand|LogicalOr|LogicalNor|LogicalXor|LogicalEquiv|LogicalAndReverse|LogicalAndInverted|LogicalOrReverse|LogicalOrInverted)\\b" + }, + { + "name": "support.constant.property-value.blendfactors.shaderlab", + "match": "\\b(?i:One|Zero|SrcColor|SrcAlpha|DstColor|DstAlpha|OneMinusSrcColor|OneMinusSrcAlpha|OneMinusDstColor|OneMinusDstAlpha)\\b" + }, + { + "name": "support.variable.reference.shaderlab", + "match": "\\[([a-zA-Z_][a-zA-Z0-9_]*)\\](?!\\s*[a-zA-Z_][a-zA-Z0-9_]*\\s*\\(\")" + }, + { + "name": "meta.attribute.shaderlab", + "begin": "(\\[)", + "end": "(\\])", + "patterns": [ + { + "name": "support.type.attributename.shaderlab", + "match": "\\G([a-zA-Z]+)\\b" + }, + { + "include": "#numbers" + } + ] + }, + { + "name": "support.variable.declaration.shaderlab", + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(" + }, + { + "name": "meta.cgblock", + "begin": "\\b(CGPROGRAM|CGINCLUDE)\\b", + "beginCaptures": { + "1": { + "name": "keyword.other" + } + }, + "end": "\\b(ENDCG)\\b", + "endCaptures": { + "1": { + "name": "keyword.other" + } + }, + "patterns": [ + { + "include": "source.hlsl" + }, { - "begin": "//", - "end": "$", - "name": "comment.line.double-slash.shaderlab" - }, - { - "begin": "/\\*", - "end": "\\*/", - "name": "comment.line.block.shaderlab" - } - ] - }, - "strings": { - "patterns": [ - { - "begin": "\"", - "end": "\"", - "name": "string.quoted.double.shaderlab" - } - ] - }, - "functions": { - "patterns": [ - { - "match": "(?x) (?: (?= \\s ) (?:(?<=else|new|return) | (?