private static void SetSkinColor(ChaControl chaControl, ColorMatchPart colorMatchPart, string file) { //get main tex Texture2D mainTexture = CommonLib.LoadAsset <Texture2D>(file, colorMatchPart.MainTex, false, string.Empty); if (mainTexture == null) { return; } //get color mask Texture2D colorMask = CommonLib.LoadAsset <Texture2D>(file, colorMatchPart.ColorMask, false, string.Empty); if (colorMask == null) { return; } //find the game object FindAssist findAssist = new FindAssist(); findAssist.Initialize(chaControl.objBody.transform); GameObject gameObject = findAssist.GetObjectFromName(colorMatchPart.Object); if (gameObject == null) { return; } if (!gameObject.GetComponent <Renderer>().material.HasProperty(ChaShader._MainTex)) { return; } var customTex = new CustomTextureControl(gameObject.transform); customTex.Initialize(file, colorMatchPart.Material, string.Empty, file, colorMatchPart.MaterialCreate, string.Empty, 2048, 2048); customTex.SetMainTexture(mainTexture); customTex.SetColor(ChaShader._Color, chaControl.chaFile.custom.body.skinMainColor); customTex.SetTexture(ChaShader._ColorMask, colorMask); customTex.SetColor(ChaShader._Color2, chaControl.chaFile.custom.body.skinSubColor); //set the new texture var newTex = customTex.RebuildTextureAndSetMaterial(); if (newTex == null) { return; } Material mat = gameObject.GetComponent <Renderer>().material; var mt = mat.GetTexture(ChaShader._MainTex); mat.SetTexture(ChaShader._MainTex, newTex); //Destroy the old texture to prevent memory leak Destroy(mt); }
static void Postfix(CustomTextureControl __instance) { if (HarmonyPatch_Config.BasicSettings.enableSkinDiffuseMipMap) { var createTex = Traverse.Create(__instance).Field("createTex"); createTex.Property("filterMode").SetValue(FilterMode.Trilinear); createTex.Property("useMipMap").SetValue(true); } }
static bool Prefix(ref string propertyName, ref int baseW, ref int baseH, ref int addW, ref int addH, ref float addPx, ref float addPy, CustomTextureControl __instance) { if (!__instance.InitEnd) { return(false); } if (addPx >= 0f & addPy >= 0f & (float)addW + addPx <= 1024f & (float)addH + addPy <= 1024f) { baseW = 1024; baseH = 1024; } else { addPx = Mathf.Abs(addPx); addPy = Mathf.Abs(addPy); baseH = 4096; baseW = 4096; } float num = (float)baseW / (float)addW; float num2 = (float)baseH / (float)addH; float ox = -(addPx / (float)baseW) * num; float oy = -(((float)baseH - addPy - (float)addH) / (float)baseH) * num2; __instance.SetOffsetAndTiling(propertyName, num, num2, ox, oy); return(false); }