|
1 | 1 | using System.Collections.Generic; |
2 | 2 | using Unity.Rendering.Toon; |
3 | 3 | using UnityEngine; |
| 4 | +using UnityEngine.Rendering; |
4 | 5 |
|
5 | 6 | namespace UnityEditor.Rendering.Toon { |
6 | 7 | internal class UnityToon3Das2DGUI : UnityEditor.ShaderGUI { |
7 | | - private Material m_lastMaterial; |
8 | 8 |
|
9 | 9 | public override void OnGUI(MaterialEditor mEditor, MaterialProperty[] props) { |
10 | 10 |
|
@@ -274,6 +274,87 @@ MaterialPropertyInfo MaterialNameToPropertyInfo(MaterialName m, MaterialProperty |
274 | 274 |
|
275 | 275 | //---------------------------------------------------------------------------------------------------------------------- |
276 | 276 |
|
| 277 | + //key: Toon3Das2D prop. value: Toon3D prop |
| 278 | + static readonly Dictionary<string, string> TOON_3D_AS_2D_TO_3D_MAP = new Dictionary<string, string> { |
| 279 | + |
| 280 | + // Shading thresholds |
| 281 | + { ToonConstants.SHADER_PROP_BASE_TO_1ST_SHADE_START, "_BaseColor_Step" }, |
| 282 | + { ToonConstants.SHADER_PROP_BASE_TO_1ST_SHADE_FEATHER, "_BaseShade_Feather" }, |
| 283 | + { ToonConstants.SHADER_PROP_1ST_TO_2ND_SHADE_START, "_1st_ShadeColor_Step" }, |
| 284 | + { ToonConstants.SHADER_PROP_1ST_TO_2ND_SHADE_FEATHER, "_1st_ShadeColor_Feather" }, |
| 285 | + |
| 286 | + // Highlight |
| 287 | + { ToonConstants.SHADER_PROP_HIGHLIGHT_COLOR, "_HighColor" }, |
| 288 | + { ToonConstants.SHADER_PROP_HIGHLIGHT_TEX, "_HighColor_Tex" }, |
| 289 | + |
| 290 | + // Outline |
| 291 | + { ToonConstants.SHADER_PROP_OUTLINE_MODE, "_OUTLINE" }, |
| 292 | + { ToonConstants.SHADER_PROP_OUTLINE_WIDTH, "_Outline_Width" }, |
| 293 | + { ToonConstants.SHADER_PROP_OUTLINE_WIDTH_MAP, "_Outline_Sampler" }, |
| 294 | + { ToonConstants.SHADER_PROP_OUTLINE_COLOR, "_Outline_Color" }, |
| 295 | + { ToonConstants.SHADER_PROP_OUTLINE_BASE_COLOR_BLEND, "_Is_BlendBaseColor" }, |
| 296 | + { ToonConstants.SHADER_PROP_OUTLINE_LIGHT_COLOR_BLEND, "_Is_LightColor_Outline" }, |
| 297 | + { ToonConstants.SHADER_PROP_OUTLINE_OFFSET_Z, "_Offset_Z" }, |
| 298 | + { ToonConstants.SHADER_PROP_OUTLINE_NEAR, "_Nearest_Distance" }, |
| 299 | + { ToonConstants.SHADER_PROP_OUTLINE_FAR, "_Farthest_Distance" }, |
| 300 | + |
| 301 | + // Outline normal options (closest equivalents) |
| 302 | + { ToonConstants.SHADER_PROP_OUTLINE_USE_NORMAL_MAP, "_Is_BakedNormal" }, |
| 303 | + { ToonConstants.SHADER_PROP_OUTLINE_NORMAL_MAP, "_BakedNormal" }, |
| 304 | + }; |
| 305 | + |
| 306 | + |
| 307 | + |
| 308 | +//---------------------------------------------------------------------------------------------------------------------- |
| 309 | + public override void AssignNewShaderToMaterial( |
| 310 | + Material mat, |
| 311 | + Shader oldShader, |
| 312 | + Shader newShader) |
| 313 | + { |
| 314 | + |
| 315 | + string oldShaderPath = AssetDatabase.GetAssetPath(oldShader); |
| 316 | + if (!oldShaderPath.StartsWith(ToonEditorConstants.PACKAGE_PATH)) { |
| 317 | + base.AssignNewShaderToMaterial(mat, oldShader, newShader); |
| 318 | + return; |
| 319 | + } |
| 320 | + |
| 321 | + //Upgrade from Toon 3D |
| 322 | + bool upgradeFromToon3D = oldShader.name.EndsWith("Toon") || oldShader.name.EndsWith("Toon(Tessellation)"); |
| 323 | + if (!upgradeFromToon3D) { |
| 324 | + base.AssignNewShaderToMaterial(mat, oldShader, newShader); |
| 325 | + return; |
| 326 | + } |
| 327 | + Dictionary<string, MaterialPropertyValue> captured = ToonMaterialUtility.CaptureMaterialValues(mat); |
| 328 | + |
| 329 | + base.AssignNewShaderToMaterial(mat, oldShader, newShader); |
| 330 | + |
| 331 | + //Assign captured values |
| 332 | + foreach (KeyValuePair<string, string> kv in TOON_3D_AS_2D_TO_3D_MAP) { |
| 333 | + string targetName = kv.Key; |
| 334 | + string srcName = kv.Value; |
| 335 | + |
| 336 | + // Ensure target exists in new material and we captured the source |
| 337 | + if (!mat.HasProperty(targetName) || !captured.TryGetValue(srcName, out MaterialPropertyValue srcVal)) { |
| 338 | + continue; |
| 339 | + } |
| 340 | + |
| 341 | + // Ensure types match between new target and captured source |
| 342 | + int targetIndex = newShader.FindPropertyIndex(targetName); |
| 343 | + if (targetIndex < 0) { |
| 344 | + continue; |
| 345 | + } |
| 346 | + ShaderPropertyType targetType = newShader.GetPropertyType(targetIndex); |
| 347 | + if (targetType != srcVal.type) { |
| 348 | + continue; |
| 349 | + } |
| 350 | + |
| 351 | + srcVal.ApplyToMaterial(mat, targetName); |
| 352 | + } |
| 353 | + |
| 354 | + } |
| 355 | + |
| 356 | + |
| 357 | + |
277 | 358 | private readonly Dictionary<string, MaterialPropertyUIElement> m_materialPropertyUIElements = new Dictionary<string, MaterialPropertyUIElement>(); |
278 | 359 |
|
279 | 360 | private ToonMaterialState m_materialState; |
@@ -534,6 +615,9 @@ static readonly GUIContent LIGHTING_FOLDOUT |
534 | 615 | bool m_normalMapFoldout = false; |
535 | 616 | bool m_outlineFoldout = false; |
536 | 617 | bool m_lightingFoldout = false; |
| 618 | + |
| 619 | + private Material m_lastMaterial; |
| 620 | + |
537 | 621 |
|
538 | 622 | struct ToonMaterialState { |
539 | 623 | internal bool useOutline; |
|
0 commit comments