protected MaterialDesc[] ProcessSharedMaterials(Material[] mats) { MaterialDesc[] matsDesc = new MaterialDesc [mats.Length]; for (int i = 0; i < mats.Length; i++) { matsDesc[i].material = mats[i]; bool legacyCoverage = (mats[i].GetTag("RenderType", false) == "TransparentCutout"); #if UNITY_4 bool isCoverage = legacyCoverage; matsDesc[i].coverage = mats[i].HasProperty("_MainTex") && isCoverage; #else bool isCoverage = legacyCoverage || mats[i].IsKeywordEnabled("_ALPHATEST_ON"); matsDesc[i].propertyBlock = new MaterialPropertyBlock(); matsDesc[i].coverage = mats[i].HasProperty("_MainTex") && isCoverage; #endif matsDesc[i].cutoff = mats[i].HasProperty("_Cutoff"); if (isCoverage && !matsDesc[i].coverage && !m_materialWarnings.Contains(matsDesc[i].material)) { Debug.LogWarning("[AmplifyMotion] TransparentCutout material \"" + matsDesc[i].material.name + "\" {" + matsDesc[i].material.shader.name + "} not using _MainTex standard property."); m_materialWarnings.Add(matsDesc[i].material); } } return(matsDesc); }
internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality) { if (m_initialized && !m_error && m_renderer.isVisible) { Profiler.BeginSample("Cloth.Render"); const float rcp255 = 1 / 255.0f; bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0; int objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255; Vector3[] clothVertices = m_cloth.vertices; for (int i = 0; i < m_targetVertexCount; i++) { m_currVertices[i] = clothVertices[m_targetRemap[i]]; } if (m_starting || !m_wasVisible) { Array.Copy(m_currVertices, m_prevVertices, m_targetVertexCount); } m_clonedMesh.vertices = m_currVertices; m_clonedMesh.normals = m_prevVertices; float cameraMotionScale = mask ? m_owner.Instance.CameraMotionMult * scale : 0; float objectMotionScale = mask ? m_owner.Instance.ObjectMotionMult * scale : 0; renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_M", ( Matrix4x4 )m_prevLocalToWorld); renderCB.SetGlobalMatrix("_AM_MATRIX_CURR_M", ( Matrix4x4 )m_currLocalToWorld); renderCB.SetGlobalVector("_AM_MOTION_PARAMS", new Vector4(cameraMotionScale, objectMotionScale, objectId * rcp255, 0)); int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2; for (int i = 0; i < m_sharedMaterials.Length; i++) { MaterialDesc matDesc = m_sharedMaterials[i]; int pass = qualityPass + (matDesc.coverage ? 1 : 0); if (matDesc.coverage) { Texture mainTex = matDesc.material.mainTexture; if (mainTex != null) { matDesc.propertyBlock.SetTexture("_MainTex", mainTex); } if (matDesc.cutoff) { matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff")); } } renderCB.DrawMesh(m_clonedMesh, m_currLocalToWorld, m_owner.Instance.ClothVectorsMaterial, i, pass, matDesc.propertyBlock); } Profiler.EndSample(); } }
internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality) { if (m_initialized && !m_error && m_meshRenderer.isVisible) { Profiler.BeginSample("Solid.Render"); bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0; if (!mask || (mask && m_moved)) { const float rcp255 = 1 / 255.0f; int objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255; Matrix4x4 prevModelViewProj; if (m_obj.FixedStep) { prevModelViewProj = m_owner.PrevViewProjMatrixRT * ( Matrix4x4 )m_currLocalToWorld; } else { prevModelViewProj = m_owner.PrevViewProjMatrixRT * ( Matrix4x4 )m_prevLocalToWorld; } renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_MVP", prevModelViewProj); renderCB.SetGlobalFloat("_AM_OBJECT_ID", objectId * rcp255); renderCB.SetGlobalFloat("_AM_MOTION_SCALE", mask ? scale : 0); // TODO: cache property blocks int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2; for (int i = 0; i < m_sharedMaterials.Length; i++) { MaterialDesc matDesc = m_sharedMaterials[i]; int pass = qualityPass + (matDesc.coverage ? 1 : 0); if (matDesc.coverage) { Texture mainTex = matDesc.material.mainTexture; if (mainTex != null) { matDesc.propertyBlock.SetTexture("_MainTex", mainTex); } if (matDesc.cutoff) { matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff")); } } renderCB.DrawMesh(m_mesh, m_transform.localToWorldMatrix, m_owner.Instance.SolidVectorsMaterial, i, pass, matDesc.propertyBlock); } } Profiler.EndSample(); } }
internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality) { UnityEngine.Profiling.Profiler.BeginSample("Particle.Render"); // TODO: batch if (m_initialized && !m_error && m_renderer.isVisible) { bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0; if (!mask || (mask && m_moved)) { const float rcp255 = 1 / 255.0f; int objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255; renderCB.SetGlobalFloat("_AM_OBJECT_ID", objectId * rcp255); renderCB.SetGlobalFloat("_AM_MOTION_SCALE", mask ? scale : 0); int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2; for (int i = 0; i < m_sharedMaterials.Length; i++) { MaterialDesc matDesc = m_sharedMaterials[i]; int pass = qualityPass + (matDesc.coverage ? 1 : 0); if (matDesc.coverage) { Texture mainTex = matDesc.material.mainTexture; if (mainTex != null) { matDesc.propertyBlock.SetTexture("_MainTex", mainTex); } if (matDesc.cutoff) { matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff")); } } var enumerator = m_particleDict.GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair <uint, Particle> pair = enumerator.Current; Matrix4x4 prevModelViewProj = m_owner.PrevViewProjMatrixRT * ( Matrix4x4 )pair.Value.prevLocalToWorld; renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_MVP", prevModelViewProj); renderCB.DrawMesh(m_mesh, pair.Value.currLocalToWorld, m_owner.Instance.SolidVectorsMaterial, i, pass, matDesc.propertyBlock); } } } } UnityEngine.Profiling.Profiler.EndSample(); }
internal override void RenderVectors(Camera camera, float scale, AmplifyMotion.Quality quality) { Profiler.BeginSample("Solid.Render"); if (m_initialized && !m_error && m_meshRenderer.isVisible) { bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0; if (!mask || (mask && m_moved)) { const float rcp255 = 1 / 255.0f; int objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255; Matrix4x4 prevModelViewProj; if (m_obj.FixedStep) { prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_currLocalToWorld; } else { prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_prevLocalToWorld; } Shader.SetGlobalMatrix("_EFLOW_MATRIX_PREV_MVP", prevModelViewProj); Shader.SetGlobalFloat("_EFLOW_OBJECT_ID", objectId * rcp255); Shader.SetGlobalFloat("_EFLOW_MOTION_SCALE", mask ? scale : 0); int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2; for (int i = 0; i < m_sharedMaterials.Length; i++) { MaterialDesc matDesc = m_sharedMaterials[i]; int pass = qualityPass + (matDesc.coverage ? 1 : 0); if (matDesc.coverage) { m_owner.Instance.SolidVectorsMaterial.mainTexture = matDesc.material.mainTexture; if (matDesc.cutoff) { m_owner.Instance.SolidVectorsMaterial.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff")); } } if (m_owner.Instance.SolidVectorsMaterial.SetPass(pass)) { Graphics.DrawMeshNow(m_mesh, m_obj.transform.localToWorldMatrix, i); } } } } Profiler.EndSample(); }
protected MaterialDesc[] ProcessSharedMaterials( Material[] mats ) { MaterialDesc[] matsDesc = new MaterialDesc [ mats.Length ]; for ( int i = 0; i < mats.Length; i++ ) { matsDesc[ i ].material = mats[ i ]; bool legacyCoverage = ( mats[ i ].GetTag( "RenderType", false ) == "TransparentCutout" ); #if UNITY_3 || UNITY_4 matsDesc[ i ].coverage = legacyCoverage; #else matsDesc[ i ].coverage = legacyCoverage || mats[ i ].IsKeywordEnabled( "_ALPHATEST_ON" ); #endif matsDesc[ i ].cutoff = mats[ i ].HasProperty( "_Cutoff" ); } return matsDesc; }
protected MaterialDesc[] ProcessSharedMaterials(Material[] mats) { MaterialDesc[] matsDesc = new MaterialDesc [mats.Length]; for (int i = 0; i < mats.Length; i++) { matsDesc[i].material = mats[i]; bool legacyCoverage = (mats[i].GetTag("RenderType", false) == "TransparentCutout"); #if UNITY_3 || UNITY_4 matsDesc[i].coverage = legacyCoverage; #else matsDesc[i].coverage = legacyCoverage || mats[i].IsKeywordEnabled("_ALPHATEST_ON"); #endif matsDesc[i].cutoff = mats[i].HasProperty("_Cutoff"); } return(matsDesc); }
internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality) { if (m_initialized && !m_error && m_meshRenderer.isVisible) { Profiler.BeginSample("Solid.Render"); bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0; if (!mask || (mask && m_moved)) { const float rcp255 = 1 / 255.0f; int objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255; float cameraMotionScale = mask ? m_owner.Instance.CameraMotionMult * scale : 0; float objectMotionScale = mask ? m_owner.Instance.ObjectMotionMult * scale : 0; renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_M", ( Matrix4x4 )m_prevLocalToWorld); renderCB.SetGlobalMatrix("_AM_MATRIX_CURR_M", ( Matrix4x4 )m_currLocalToWorld); renderCB.SetGlobalVector("_AM_MOTION_PARAMS", new Vector4(cameraMotionScale, objectMotionScale, objectId * rcp255, 0)); int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2; for (int i = 0; i < m_sharedMaterials.Length; i++) { MaterialDesc matDesc = m_sharedMaterials[i]; int pass = qualityPass + (matDesc.coverage ? 1 : 0); if (matDesc.coverage) { Texture mainTex = matDesc.material.mainTexture; if (mainTex != null) { matDesc.propertyBlock.SetTexture("_MainTex", mainTex); } if (matDesc.cutoff) { matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff")); } } renderCB.DrawMesh(m_mesh, m_transform.localToWorldMatrix, m_owner.Instance.SolidVectorsMaterial, i, pass, matDesc.propertyBlock); } } Profiler.EndSample(); } }
internal override void RenderVectors(Camera camera, float scale, AmplifyMotion.Quality quality) { Profiler.BeginSample("Skinned.Render"); if (m_initialized && !m_error && m_renderer.isVisible) { WaitForAsyncUpdate(); m_clonedMesh.vertices = m_currVertices; m_clonedMesh.normals = m_prevVertices; const float rcp255 = 1 / 255.0f; int objectId = m_mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255; Shader.SetGlobalFloat("_EFLOW_OBJECT_ID", objectId * rcp255); Shader.SetGlobalFloat("_EFLOW_MOTION_SCALE", m_mask ? scale : 0); int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2; for (int i = 0; i < m_sharedMaterials.Length; i++) { MaterialDesc matDesc = m_sharedMaterials[i]; int pass = qualityPass + (matDesc.coverage ? 1 : 0); if (matDesc.coverage) { m_owner.Instance.SkinnedVectorsMaterial.mainTexture = matDesc.material.mainTexture; if (matDesc.cutoff) { m_owner.Instance.SkinnedVectorsMaterial.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff")); } } if (m_owner.Instance.SkinnedVectorsMaterial.SetPass(pass)) { Graphics.DrawMeshNow(m_clonedMesh, m_obj.transform.localToWorldMatrix, i); } } } Profiler.EndSample(); }
public void FromCustomObject(SqlConnection con, IntPtr pUdt) { SqlUdt.SetValue(con, pUdt, "ID", ID.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "CheckID", CheckID.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "WarehouseNo", WarehouseNo.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "HouseNo", HouseNo.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "AreaNo", AreaNo.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "MaterialNo", MaterialNo.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "MaterialDesc", MaterialDesc.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "AccountQty", AccountQty.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "ScanQty", ScanQty.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "Status", Status.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "StockTime", StockTime.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "Operator", Operator.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "OperationTime", OperationTime.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "ProfitLoss", ProfitLoss.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "DifferenceQty", DifferenceQty.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "IsDel", IsDel.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "Creater", Creater.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "CreateTime", CreateTime.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "Modifyer", Modifyer.ToSqlValue()); SqlUdt.SetValue(con, pUdt, "ModifyTime", ModifyTime.ToSqlValue()); }
internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality) { if (m_initialized && !m_error && m_renderer.isVisible) { Profiler.BeginSample("Skinned.Update"); if (!m_useFallback) { if (!m_useGPU) { WaitForAsyncUpdate(); } } Profiler.EndSample(); Profiler.BeginSample("Skinned.Render"); if (!m_useGPU) { if (!m_useFallback) { m_clonedMesh.vertices = m_currVertices; } m_clonedMesh.normals = m_prevVertices; } const float rcp255 = 1 / 255.0f; bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0; int objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255; Matrix4x4 prevModelViewProj; if (m_obj.FixedStep) { prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_currLocalToWorld; } else { prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_prevLocalToWorld; } renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_MVP", prevModelViewProj); renderCB.SetGlobalFloat("_AM_OBJECT_ID", objectId * rcp255); renderCB.SetGlobalFloat("_AM_MOTION_SCALE", mask ? scale : 0); if (m_useGPU) { #if !UNITY_4 Vector4 vertexTexelSize = new Vector4(1.0f / m_gpuVertexTexWidth, 1.0f / m_gpuVertexTexHeight, m_gpuVertexTexWidth, m_gpuVertexTexHeight); renderCB.SetGlobalVector("_AM_VERTEX_TEXEL_SIZE", vertexTexelSize); renderCB.SetGlobalVector("_AM_VERTEX_TEXEL_HALFSIZE", vertexTexelSize * 0.5f); renderCB.SetGlobalTexture("_AM_PREV_VERTEX_TEX", m_gpuPrevVertices); renderCB.SetGlobalTexture("_AM_CURR_VERTEX_TEX", m_gpuCurrVertices); #endif } int hardwarePass = m_useGPU ? 4 : 0; int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2; int basePass = hardwarePass + qualityPass; for (int i = 0; i < m_sharedMaterials.Length; i++) { MaterialDesc matDesc = m_sharedMaterials[i]; int pass = basePass + (matDesc.coverage ? 1 : 0); if (matDesc.coverage) { Texture mainTex = matDesc.material.mainTexture; if (mainTex != null) { matDesc.propertyBlock.SetTexture("_MainTex", mainTex); } if (matDesc.cutoff) { matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff")); } } renderCB.DrawMesh(m_clonedMesh, m_currLocalToWorld, m_owner.Instance.SkinnedVectorsMaterial, i, pass, matDesc.propertyBlock); } Profiler.EndSample(); } }
public void Import(MaterialDesc desc) { Passes = new MaterialPass[desc.Passes.Count]; for (int i = 0; i < Passes.Length; ++i) { Passes[i] = new MaterialPass(); Passes[i].Import(desc.Passes[i]); } }
public void Export(MaterialDesc desc) { desc.Passes = new List<MaterialPassDesc>(); for (int i = 0; i < Passes.Length; ++i) { var pass = new MaterialPassDesc(); Passes[i].Export(pass); desc.Passes.Add(pass); } }
public static void Serialize(MaterialDesc desc, string filePath) { var materialSerializing = new Material(); materialSerializing.Import(desc); var str = JsonConvert.SerializeObject(materialSerializing, Formatting.Indented); System.IO.File.WriteAllText(filePath, str); }
public static void Deserialize(MaterialDesc desc, string filePath) { var str = System.IO.File.ReadAllText(filePath); var materialSerializing = JsonConvert.DeserializeObject<Material>(str); materialSerializing.Export(desc); }
internal override void RenderVectors(Camera camera, float scale, AmplifyMotion.Quality quality) { if (m_initialized && !m_error && m_renderer.isVisible) { Profiler.BeginSample("Cloth.Render"); const float rcp255 = 1 / 255.0f; bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0; int objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255; Vector3[] clothVertices = m_cloth.vertices; for (int i = 0; i < m_targetVertexCount; i++) { m_currVertices[i] = clothVertices[m_targetRemap[i]]; } if (m_starting || !m_wasVisible) { Array.Copy(m_currVertices, m_prevVertices, m_targetVertexCount); } m_clonedMesh.vertices = m_currVertices; m_clonedMesh.normals = m_prevVertices; Matrix4x4 prevModelViewProj; if (m_obj.FixedStep) { prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_currLocalToWorld; } else { prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_prevLocalToWorld; } Shader.SetGlobalMatrix("_AM_MATRIX_PREV_MVP", prevModelViewProj); Shader.SetGlobalFloat("_AM_OBJECT_ID", objectId * rcp255); Shader.SetGlobalFloat("_AM_MOTION_SCALE", mask ? scale : 0); int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2; for (int i = 0; i < m_sharedMaterials.Length; i++) { MaterialDesc matDesc = m_sharedMaterials[i]; int pass = qualityPass + (matDesc.coverage ? 1 : 0); if (matDesc.coverage) { m_owner.Instance.ClothVectorsMaterial.mainTexture = matDesc.material.mainTexture; if (matDesc.cutoff) { m_owner.Instance.ClothVectorsMaterial.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff")); } } if (m_owner.Instance.ClothVectorsMaterial.SetPass(pass)) { #if UNITY_4 Graphics.DrawMeshNow(m_clonedMesh, Matrix4x4.identity, i); #else Graphics.DrawMeshNow(m_clonedMesh, m_currLocalToWorld, i); #endif } } Profiler.EndSample(); } }
public void SetMaterial(int index, MaterialDesc materialDesc) { if(SubmeshMaterials.Length <= index) { var array = new Material[index + 1]; Array.Copy(SubmeshMaterials, array, SubmeshMaterials.Length); SubmeshMaterials = array; } SubmeshMaterials[index] = new Material(Game.Instance, materialDesc, materialDesc.ResourceName); Game.Instance.AutoDispose(SubmeshMaterials[index]); }
protected MaterialDesc[] ProcessSharedMaterials( Material[] mats ) { MaterialDesc[] matsDesc = new MaterialDesc [ mats.Length ]; for ( int i = 0; i < mats.Length; i++ ) { matsDesc[ i ].material = mats[ i ]; bool legacyCoverage = ( mats[ i ].GetTag( "RenderType", false ) == "TransparentCutout" ); #if UNITY_4 bool isCoverage = legacyCoverage; matsDesc[ i ].coverage = mats[ i ].HasProperty( "_MainTex" ) && isCoverage; #else bool isCoverage = legacyCoverage || mats[ i ].IsKeywordEnabled( "_ALPHATEST_ON" ); matsDesc[ i ].propertyBlock = new MaterialPropertyBlock(); matsDesc[ i ].coverage = mats[ i ].HasProperty( "_MainTex" ) && isCoverage; #endif matsDesc[ i ].cutoff = mats[ i ].HasProperty( "_Cutoff" ); if ( isCoverage && !matsDesc[ i ].coverage && !m_materialWarnings.Contains( matsDesc[ i ].material ) ) { Debug.LogWarning( "[AmplifyMotion] TransparentCutout material \"" + matsDesc[ i ].material.name + "\" {" + matsDesc[ i ].material.shader.name + "} not using _MainTex standard property." ); m_materialWarnings.Add( matsDesc[ i ].material ); } } return matsDesc; }
public Material GetMaterial(UIFont font) { if(!mMaterials.ContainsKey(font)) { var desc = new MaterialDesc(); desc.Passes[0].InputElements = new InputElement[]{ new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0), new InputElement("TEXCOORD", 0, Format.R32G32_Float, 12, 0), }; desc.Passes[0].BlendStates = CreateAlphaBlendState(); desc.Passes[0].ShaderFile = "UIFont.hlsl"; desc.Passes[0].Textures = new MaterialTextureDesc[1]; desc.Passes[0].Textures[0] = new MaterialTextureDesc(); var m = new Material(Game.Instance, desc, font.Texture.DebugName); m.Passes[0].TextureList[0] = font.Texture; mMaterials[font] = m; Game.Instance.AddObject(m); } return mMaterials[font]; }