/// <summary> /// This function returns a material instance using the material properties of a previous material but using the font atlas texture of the new font asset. /// </summary> /// <param name="sourceMaterial">The material containing the source material properties to be copied to the new material.</param> /// <param name="sourceAtlasTexture">The font atlas texture that should be assigned to the new material.</param> /// <returns></returns> public static Material GetFallbackMaterial(Material sourceMaterial, Texture sourceAtlasTexture) { int sourceID = sourceMaterial.GetInstanceID(); int texID = sourceAtlasTexture.GetInstanceID(); long key = (long)sourceID << 32 + texID; FallbackMaterial fallback; if (m_fallbackMaterials.TryGetValue(key, out fallback)) { //Debug.Log("Material [" + fallback.fallbackMaterial.name + "] already exists."); return fallback.fallbackMaterial; } // Create new material from the source material Material fallbackMaterial = new Material(sourceMaterial); fallbackMaterial.hideFlags = HideFlags.HideAndDontSave; #if UNITY_EDITOR fallbackMaterial.name += " + " + sourceAtlasTexture.name; #endif fallbackMaterial.SetTexture(ShaderUtilities.ID_MainTex, sourceAtlasTexture); fallback = new FallbackMaterial(); fallback.baseID = sourceID; fallback.baseMaterial = sourceMaterial; fallback.fallbackMaterial = fallbackMaterial; fallback.count = 0; m_fallbackMaterials.Add(key, fallback); m_fallbackMaterialLookup.Add(fallbackMaterial.GetInstanceID(), key); #if DEBUG_ON ListFallbackMaterials(); #endif return fallbackMaterial; }
static public System.WeakReference GetMaterial(SpriteRenderMode rm, Texture tex) { int idx = rm == SpriteRenderMode.None ? 0 : (int)rm; SpriteRenderModeGroup group = renderModeGroup[idx]; System.WeakReference ret = null; int id = tex == null ? 0 : tex.GetInstanceID(); if (group != null) { if (group.setting.IsAlive) { ret = group.materials[id] as System.WeakReference; if ( ret == null) { SpriteRenderModeSetting setting = group.setting.Target as SpriteRenderModeSetting; Material mat = new Material(setting.shader); mat.mainTexture = tex; ret = new System.WeakReference(mat); group.materials[id] = ret; setting.materials.Add(ret); } else { if (!ret.IsAlive) { SpriteRenderModeSetting setting = group.setting.Target as SpriteRenderModeSetting; Material mat = new Material(setting.shader); mat.mainTexture = tex; ret = new System.WeakReference(mat); group.materials[id] = ret; setting.materials.Add(ret); } } } else { renderModeGroup[idx] = null; } } else { Debug.LogError("unknown RenderMode " + rm); } return ret; }
public static ByteBuffer Save(UnityEngine.Material material) { FlatBufferBuilder builder = new FlatBufferBuilder(InitBufferSize); int count = ShaderUtil.GetPropertyCount(material.shader); List <Offset <ShaderProperty> > listOffShaderProperties = new List <Offset <ShaderProperty> >(); for (int i = 0; i < count; i++) { string name = ShaderUtil.GetPropertyName(material.shader, i); ShaderUtil.ShaderPropertyType type = ShaderUtil.GetPropertyType(material.shader, i); Schema.ShaderPropertyValue valueType = ShaderPropertyValue.NONE; int valueOffset = -1; switch (type) { case ShaderUtil.ShaderPropertyType.Color: { UnityEngine.Color c = material.GetColor(name); ShaderPropertyColor.StartShaderPropertyColor(builder); ShaderPropertyColor.AddColor(builder, Schema.Color.CreateColor(builder, c.a, c.b, c.g, c.r)); Offset <ShaderPropertyColor> offset = ShaderPropertyColor.EndShaderPropertyColor(builder); valueType = ShaderPropertyValue.ShaderPropertyColor; valueOffset = offset.Value; } break; case ShaderUtil.ShaderPropertyType.Vector: { Vector4 v = material.GetVector(name); ShaderPropertyVector.StartShaderPropertyVector(builder); ShaderPropertyVector.AddVector(builder, Schema.Vec4.CreateVec4(builder, v.x, v.y, v.z, v.w)); Offset <ShaderPropertyVector> offset = ShaderPropertyVector.EndShaderPropertyVector(builder); valueType = ShaderPropertyValue.ShaderPropertyVector; valueOffset = offset.Value; } break; case ShaderUtil.ShaderPropertyType.Range: case ShaderUtil.ShaderPropertyType.Float: { float f = material.GetFloat(name); ShaderPropertyFloat.StartShaderPropertyFloat(builder); ShaderPropertyFloat.AddValue(builder, f); Offset <ShaderPropertyFloat> offset = ShaderPropertyFloat.EndShaderPropertyFloat(builder); valueType = ShaderPropertyValue.ShaderPropertyFloat; valueOffset = offset.Value; } break; case ShaderUtil.ShaderPropertyType.TexEnv: { UnityEngine.Texture t = material.GetTexture(name); string textureName = "$NULL_TEXTURE"; if (t != null) { textureName = AssetDatabase.GetAssetPath(t.GetInstanceID()); if (string.IsNullOrEmpty(textureName)) { textureName = t.name; } else { textureName = textureName.Substring(ArtWork.path.Length); textureName = System.IO.Path.GetDirectoryName(textureName) + "/" + System.IO.Path.GetFileNameWithoutExtension(textureName); } } Vector2 toffset = material.GetTextureOffset(name); Vector2 tscale = material.GetTextureScale(name); StringOffset pathOffset = builder.CreateString(textureName); ShaderPropertyTexture.StartShaderPropertyTexture(builder); ShaderPropertyTexture.AddName(builder, pathOffset); ShaderPropertyTexture.AddOffset(builder, Vec2.CreateVec2(builder, toffset.x, toffset.y)); ShaderPropertyTexture.AddScale(builder, Vec2.CreateVec2(builder, tscale.x, tscale.y)); Offset <ShaderPropertyTexture> offset = ShaderPropertyTexture.EndShaderPropertyTexture(builder); valueType = ShaderPropertyValue.ShaderPropertyTexture; valueOffset = offset.Value; } break; } if (valueOffset >= 0) { listOffShaderProperties.Add( ShaderProperty.CreateShaderProperty( builder, builder.CreateString(name), (Schema.ShaderPropertyType)type, valueType, valueOffset )); } } StringOffset offMaterialName = builder.CreateString(material.name); StringOffset offShader = builder.CreateString(material.shader.name); Offset <Schema.Material> offMaterial = Schema.Material.CreateMaterial( builder, offMaterialName, offShader, Schema.Material.CreatePropertiesVector(builder, listOffShaderProperties.ToArray())); builder.Finish(offMaterial.Value); return(builder.DataBuffer); }
/// <summary> /// <para>Creates a render target identifier.</para> /// </summary> /// <param name="type">Built-in temporary render texture type.</param> /// <param name="name">Temporary render texture name.</param> /// <param name="nameID">Temporary render texture name (as integer, see Shader.PropertyToID).</param> /// <param name="tex">RenderTexture or Texture object to use.</param> public RenderTargetIdentifier(Texture tex) { this.m_Type = ((tex != null) && !(tex is RenderTexture)) ? BuiltinRenderTextureType.BindableTexture : BuiltinRenderTextureType.None; this.m_NameID = -1; this.m_InstanceID = (tex == null) ? 0 : tex.GetInstanceID(); }
static public void UpdateSpriteSlices (Texture texture, Atlas atlas) { string texturePath = AssetDatabase.GetAssetPath(texture.GetInstanceID()); var t = (TextureImporter)TextureImporter.GetAtPath(texturePath); t.spriteImportMode = SpriteImportMode.Multiple; var spriteSheet = t.spritesheet; var sprites = new List<SpriteMetaData>(spriteSheet); FieldInfo field = typeof(Atlas).GetField("regions", BindingFlags.Instance | BindingFlags.NonPublic); var regions = (List<AtlasRegion>)field.GetValue(atlas); int textureHeight = texture.height; char[] FilenameDelimiter = {'.'}; int updatedCount = 0; int addedCount = 0; foreach (var r in regions) { int width, height; if (r.rotate) { width = r.height; height = r.width; } else { width = r.width; height = r.height; } int x = r.x; int y = textureHeight - height - r.y; string pageName = r.page.name.Split(FilenameDelimiter, StringSplitOptions.RemoveEmptyEntries)[0]; string textureName = texture.name; bool pageMatch = string.Equals(pageName, textureName,StringComparison.Ordinal); int spriteIndex = pageMatch ? sprites.FindIndex( (s) => string.Equals(s.name, r.name, StringComparison.Ordinal) ) : -1; bool matchFound = spriteIndex >= 0; if (matchFound) { var s = sprites[spriteIndex]; s.rect = new Rect(x, y, width, height); sprites[spriteIndex] = s; updatedCount++; } else { if (pageMatch) { sprites.Add(new SpriteMetaData { name = r.name, pivot = new Vector2(0.5f, 0.5f), rect = new Rect(x, y, width, height) }); addedCount++; } } } t.spritesheet = sprites.ToArray(); EditorUtility.SetDirty(t); AssetDatabase.ImportAsset(texturePath, ImportAssetOptions.ForceUpdate); EditorGUIUtility.PingObject(texture); Debug.Log(string.Format("Applied sprite slices to {2}. {0} added. {1} updated.", addedCount, updatedCount, texture.name)); }
static public void UpdateSpriteSlices (Texture texture, Atlas atlas) { string texturePath = AssetDatabase.GetAssetPath(texture.GetInstanceID()); var t = (TextureImporter)TextureImporter.GetAtPath(texturePath); t.spriteImportMode = SpriteImportMode.Multiple; var spriteSheet = t.spritesheet; var sprites = new List<SpriteMetaData>(spriteSheet); var regions = AtlasAssetInspector.GetRegions(atlas); char[] FilenameDelimiter = {'.'}; int updatedCount = 0; int addedCount = 0; foreach (var r in regions) { string pageName = r.page.name.Split(FilenameDelimiter, StringSplitOptions.RemoveEmptyEntries)[0]; string textureName = texture.name; bool pageMatch = string.Equals(pageName, textureName, StringComparison.Ordinal); // if (pageMatch) { // int pw = r.page.width; // int ph = r.page.height; // bool mismatchSize = pw != texture.width || pw > t.maxTextureSize || ph != texture.height || ph > t.maxTextureSize; // if (mismatchSize) // Debug.LogWarningFormat("Size mismatch found.\nExpected atlas size is {0}x{1}. Texture Import Max Size of texture '{2}'({4}x{5}) is currently set to {3}.", pw, ph, texture.name, t.maxTextureSize, texture.width, texture.height); // } int spriteIndex = pageMatch ? sprites.FindIndex( (s) => string.Equals(s.name, r.name, StringComparison.Ordinal) ) : -1; bool spriteNameMatchExists = spriteIndex >= 0; if (pageMatch) { Rect spriteRect = new Rect(); if (r.rotate) { spriteRect.width = r.height; spriteRect.height = r.width; } else { spriteRect.width = r.width; spriteRect.height = r.height; } spriteRect.x = r.x; spriteRect.y = r.page.height - spriteRect.height - r.y; if (spriteNameMatchExists) { var s = sprites[spriteIndex]; s.rect = spriteRect; sprites[spriteIndex] = s; updatedCount++; } else { sprites.Add(new SpriteMetaData { name = r.name, pivot = new Vector2(0.5f, 0.5f), rect = spriteRect }); addedCount++; } } } t.spritesheet = sprites.ToArray(); EditorUtility.SetDirty(t); AssetDatabase.ImportAsset(texturePath, ImportAssetOptions.ForceUpdate); EditorGUIUtility.PingObject(texture); Debug.Log(string.Format("Applied sprite slices to {2}. {0} added. {1} updated.", addedCount, updatedCount, texture.name)); }