public MyMeshMaterialId GetOrCreateMaterialId(MyMeshMaterialInfo info) { Vector2I defaultTextureSize = GetDefaultTextureSize(info.ColorMetal_Texture, info.NormalGloss_Texture, info.Extensions_Texture, info.Alphamask_Texture); IDynamicFileArrayTexture cmArrayTex = GetArrayTextureFromFilepath(info.ColorMetal_Texture, MyChannel.ColorMetal, defaultTextureSize); int cmIndex = cmArrayTex.GetOrAddSlice(info.ColorMetal_Texture); IDynamicFileArrayTexture ngArrayTex = GetArrayTextureFromFilepath(info.NormalGloss_Texture, MyChannel.NormalGloss, defaultTextureSize); int ngIndex = ngArrayTex.GetOrAddSlice(info.NormalGloss_Texture); IDynamicFileArrayTexture extArrayTex = GetArrayTextureFromFilepath(info.Extensions_Texture, MyChannel.Extension, defaultTextureSize); int extIndex = extArrayTex.GetOrAddSlice(info.Extensions_Texture); info.ColorMetal_Texture = cmArrayTex.Name; info.NormalGloss_Texture = ngArrayTex.Name; info.Extensions_Texture = extArrayTex.Name; MyMaterialKey materialKey = new MyMaterialKey(info.ColorMetal_Texture, info.NormalGloss_Texture, info.Extensions_Texture, info.Alphamask_Texture); m_setDebugMaterials.Add(materialKey); MyGeometryTextureSystemReference geoTextureRef; geoTextureRef.ColorMetalTexture = cmArrayTex; geoTextureRef.ColorMetalIndex = cmIndex; geoTextureRef.NormalGlossTexture = ngArrayTex; geoTextureRef.NormalGlossIndex = ngIndex; geoTextureRef.ExtensionTexture = extArrayTex; geoTextureRef.ExtensionIndex = extIndex; geoTextureRef.AlphamaskTexture = null; geoTextureRef.AlphamaskIndex = DEFAULT_ARRAY_TEXTURE_INDEX; if (!string.IsNullOrEmpty(info.Alphamask_Texture)) { IDynamicFileArrayTexture alphamaskArrayTex = GetArrayTextureFromFilepath(info.Alphamask_Texture, MyChannel.Alphamask, defaultTextureSize); int alphamaskIndex = alphamaskArrayTex.GetOrAddSlice(info.Alphamask_Texture); info.Alphamask_Texture = alphamaskArrayTex.Name; geoTextureRef.AlphamaskTexture = alphamaskArrayTex; geoTextureRef.AlphamaskIndex = alphamaskIndex; } geoTextureRef.IsUsed = true; info.GeometryTextureRef = geoTextureRef; return(MyMeshMaterials1.GetMaterialId(ref info)); }
public Vector4I[] CreateTextureIndices(List <MyRuntimeSectionInfo> sectionInfos, List <int> indices, int verticesNum) { Vector4I defaultArrayTexIndex = new Vector4I(DEFAULT_ARRAY_TEXTURE_INDEX, DEFAULT_ARRAY_TEXTURE_INDEX, DEFAULT_ARRAY_TEXTURE_INDEX, DEFAULT_ARRAY_TEXTURE_INDEX); Vector4I[] texIndices = new Vector4I[verticesNum]; for (int i = 0; i < verticesNum; i++) { texIndices[i] = defaultArrayTexIndex; } if (!MyRender11.Settings.UseGeometryArrayTextures) // system is disabled { return(texIndices); } foreach (MyRuntimeSectionInfo sectionInfo in sectionInfos) { MyMeshMaterialId material = MyMeshMaterials1.GetMaterialId(sectionInfo.MaterialName); MyRenderProxy.Assert(material != MyMeshMaterialId.NULL); if (!material.Info.GeometryTextureRef.IsUsed) { continue; } Vector4I materialTexIndex = material.Info.GeometryTextureRef.TextureSliceIndices; for (int i = 0; i < sectionInfo.TriCount * 3; i++) { int index = indices[i + sectionInfo.IndexStart]; Vector4I prevTexIndex = texIndices[index]; MyRenderProxy.Assert(defaultArrayTexIndex.CompareTo(prevTexIndex) == 0 || materialTexIndex.CompareTo(prevTexIndex) == 0, "Vertex is used with different material!"); texIndices[index] = materialTexIndex; } } return(texIndices); }