public void StencilBlock(ref Rect r) { bool prevUseStencilBuffer = useStencilBuffer; useStencilBuffer = GUI.Toggle(r, useStencilBuffer, useStencilBuffer ? "模板缓冲区" : "模板缓冲区..."); if (useStencilBuffer != prevUseStencilBuffer) { UpdateAutoSettings(); } r.y += 20; if (!useStencilBuffer) { return; } r.xMin += 20; allowStencilWriteThroughProperties = UndoableToggle(r, allowStencilWriteThroughProperties, "公开模板作为属性", "toggle expose stencil as properties"); r.y += 20; EditorGUI.BeginDisabledGroup(allowStencilWriteThroughProperties); Rect rTmp = r; rTmp.width = 88; GUI.Label(rTmp, "参考值", EditorStyles.miniLabel); rTmp = rTmp.MovedRight(); rTmp.width -= 48; stencilValue = (byte)UndoableIntField(rTmp.PadRight(4).PadTop(1).PadBottom(2), stencilValue, "reference value"); rTmp = rTmp.MovedRight(); rTmp.width = r.width - 128; stencilComparison = (DepthTestStencil)UndoableLabeledEnumPopupNamed(rTmp.PadRight(4).ClampWidth(32, 140), "对比", stencilComparison, strDepthTestStencil, "stencil comparison"); r.y += 20; StencilBitfield(r, "读取遮罩", ref stencilMaskRead); r.y += 20; StencilBitfield(r, "写入遮罩", ref stencilMaskWrite); r.y += 23; stencilPass = (StencilOp)UndoableLabeledEnumPopupNamed(r.PadRight(4), "通过", stencilPass, strStencilOp, "stencil pass"); r.y += 20; stencilFail = (StencilOp)UndoableLabeledEnumPopupNamed(r.PadRight(4), "失败", stencilFail, strStencilOp, "stencil fail"); r.y += 20; stencilFailZ = (StencilOp)UndoableLabeledEnumPopupNamed(r.PadRight(4), "失败 Z", stencilFailZ, strStencilOp, "stencil fail Z"); r.y += 20; r.xMin -= 20; r.y += 20; EditorGUI.EndDisabledGroup(); }
public override void Deserialize(string key, string value) { switch (key) { case "blpr": // This is no longer saved, but in old shaders, we have to read it with old enum indices // 0 "Opaque", // 1 "Alpha Blended", // - "Alpha Blended (Premultiplied)", // 2 "Additive", // 3 "Screen", // 4 "Multiplicative", int iVal = int.Parse(value); if (iVal > 1) // Offset due to adding premul { iVal++; } blendModePreset = (BlendModePreset)iVal; ConformBlendsToPreset(); lockSrcDstRead = true; break; case "bsrc": if (lockSrcDstRead) { break; } blendSrc = (BlendMode)int.Parse(value); break; case "bdst": if (lockSrcDstRead) { lockSrcDstRead = false; break; } blendDst = (BlendMode)int.Parse(value); ConformPresetToBlend(); break; case "dpts": depthTest = (DepthTest)int.Parse(value); break; case "wrdp": writeDepth = bool.Parse(value); break; case "dith": dithering = (Dithering)int.Parse(value); break; case "atcv": alphaToCoverage = bool.Parse(value); break; case "rfrpo": perObjectRefraction = bool.Parse(value); break; case "rfrpn": refractionPassName = value; break; case "coma": colorMask = int.Parse(value); break; case "ufog": useFog = bool.Parse(value); break; case "aust": autoSort = bool.Parse(value); break; case "igpj": ignoreProjector = bool.Parse(value); break; case "qofs": queueOffset = int.Parse(value); break; case "qpre": queuePreset = (Queue)int.Parse(value); break; case "rntp": renderType = (RenderType)int.Parse(value); break; // Fog booleans case "fgom": fogOverrideMode = bool.Parse(value); break; case "fgoc": fogOverrideColor = bool.Parse(value); break; case "fgod": fogOverrideDensity = bool.Parse(value); break; case "fgor": fogOverrideRange = bool.Parse(value); break; // Fog values case "fgmd": fogMode = (ShaderFogMode)int.Parse(value); break; case "fgcr": fogColor.r = float.Parse(value); break; case "fgcg": fogColor.g = float.Parse(value); break; case "fgcb": fogColor.b = float.Parse(value); break; case "fgca": fogColor.a = float.Parse(value); break; case "fgde": fogDensity = float.Parse(value); break; case "fgrn": fogRange.x = float.Parse(value); break; case "fgrf": fogRange.y = float.Parse(value); break; // Stencil buffer: case "stcl": useStencilBuffer = bool.Parse(value); break; case "atwp": allowStencilWriteThroughProperties = bool.Parse(value); break; case "stva": stencilValue = byte.Parse(value); break; case "stmr": stencilMaskRead = byte.Parse(value); break; case "stmw": stencilMaskWrite = byte.Parse(value); break; case "stcp": stencilComparison = (DepthTestStencil)int.Parse(value); break; case "stps": stencilPass = (StencilOp)int.Parse(value); break; case "stfa": stencilFail = (StencilOp)int.Parse(value); break; case "stfz": stencilFailZ = (StencilOp)int.Parse(value); break; // Offset case "ofsf": offsetFactor = int.Parse(value); break; case "ofsu": offsetUnits = int.Parse(value); break; } }