leking Posted June 18 Posted June 18 hello i would like to remove the paw tats on nipples from the "dog full tats". Is there an easy way to do it like erasing something in an ini file or another small procedure ?
Alpia Posted June 18 Author Posted June 18 (edited) 1 hour ago, leking said: hello i would like to remove the paw tats on nipples from the "dog full tats". Is there an easy way to do it like erasing something in an ini file or another small procedure ? You mean in the addon? I've taken a look but dont see paw prints in the "Full - Dog (Body).dds". Generally you can edit them all easily either directly with a program that can handle the .dds files or by converting it back to a png editing it and converting it back again. Only thing you'd need a bit more specialized tool for is if you do your own on the 3d model, but small stuff you can do well enough with for example paint.net. It can handle pretty much any file and is decent free tool. Only thing to pay attention to is what compression you use to safe. LE cant handle BC7 so if you have LE safe it in BC3 There is the .dds file without the paw prints just copy replace the corresponding file in the mod or as mentioned just edit/convert the file you want to change. Full - Dog Addon (body).7 Edited June 18 by Alpia 1
mhuy1905 Posted June 19 Posted June 19 The "Breasts - d R twist + L circle.dds" in toilet prison seems to be mix up with full body version
Alpia Posted June 19 Author Posted June 19 5 hours ago, mhuy1905 said: The "Breasts - d R twist + L circle.dds" in toilet prison seems to be mix up with full body version Thanks I'll include a fix when I update again. You can replace the corresponding files with this until then. Breasts - d R twist + L circle.7z 1
Mazhilalon Posted June 23 Posted June 23 On 6/17/2026 at 4:23 AM, Alpia said: I tried converting some tattoos manually (initially from a different mod but was planning on doing this as well) but it would take insanely long. After looking into this a bit I believe I now have somewhat working automated solution for this (specifically 3BA to BHUNP conversion). I made a small script with python but currently the best I can do is to have the converted .dds files in BC3/DXT5 as the library I'm using (pillow) doesn't support saving in BC7. There are also some other small issues that I'm planning on figuring out at some point before I can call it a job well done.
Alpia Posted June 23 Author Posted June 23 (edited) 5 hours ago, Mazhilalon said: I tried converting some tattoos manually (initially from a different mod but was planning on doing this as well) but it would take insanely long. After looking into this a bit I believe I now have somewhat working automated solution for this (specifically 3BA to BHUNP conversion). I made a small script with python but currently the best I can do is to have the converted .dds files in BC3/DXT5 as the library I'm using (pillow) doesn't support saving in BC7. There are also some other small issues that I'm planning on figuring out at some point before I can call it a job well done. Yes doing every tattoo manually may even take longer then originally making them for a lot of them. I'd recommend saving in .png then you have a source to convert into whatever you want using texconv either in the same script or a secondary one. That said you can use BC3 with SSE/AE just fine. In theory there is a quality difference but if you really see it on my kind of texture, debatable. BC7 is from the dx11 era, BC3 from dx9, both take up the same space. How does your script work I assume it uses blender as was used for the UBE conversion? If you check the results the biggest differences between the bodies UV maps are the breasts and the seams where even small inconsistencies may/will show. If you get to fix whatever the remaining issues are and have a working script that would be great. Spoiler Edited June 23 by Alpia
Mazhilalon Posted June 23 Posted June 23 (edited) 1 hour ago, Alpia said: Yes doing every tattoo manually may even take longer then originally making them for a lot of them. I'd recommend saving in .png then you have a source to convert into whatever you want using texconv either in the same script or a secondary one. That said you can use BC3 with SSE/AE just fine. In theory there is a quality difference but if you really see it on my kind of texture, debatable. BC7 is from the dx11 era, BC3 from dx9, both take up the same space. How does your script work I assume it uses blender as was used for the UBE conversion? If you check the results the biggest differences between the bodies UV maps are the breasts and the seams where even small inconsistencies may/will show. If you get to fix whatever the remaining issues are and have a working script that would be great. Reveal hidden contents What I do is basically this https://www.nexusmods.com/skyrimspecialedition/mods/133588, but with the script utilizing mainly Python Imaging Library (Pillow) and specific libraries for xNormal and possibly texconv if I need to. It's really simple and unoptimized script so far and needs more testing. That's the first thing that came to mind as a fast and easy solution for the problem (unless I missed something important). My solution is maybe a bit more crude than the UBE conversion (as I'm not familiar with blender), but the basic idea is pretty much the same. Also, regarding your suggestion on leaving it as png and using texconv to convert to dds instead of the pillow. That could be better than what I currently have. I can post results once I have properly tested several different tattoos. (preferably full body as the ones I started with were small and simple) Also, I wonder if parts of the UBE conversion script can be used in this. Or if the script would work with the files from the nexus page above. Edited June 23 by Mazhilalon 1
Mazhilalon Posted June 23 Posted June 23 Tested my script on the full body tattoo from the bandit set. Looking at the places where you said to look for seams, I'd say it works quite well. I've been playing on UNP based bodies forever (already did in oldrim) and there always seems to be lack of conversions on both armour and tattoos etc. At least this conversion is something I can handle without it taking a lot of time to learn the outfit studio or some other software. Still going to look into optimizing the script before running the whole batch. And if @beachpeachpeasis willing, I'm interested in the way they did it. If their method is better/faster/more efficient, I could try to see if I can do it that way.
Alpia Posted June 23 Author Posted June 23 (edited) 2 hours ago, Mazhilalon said: What I do is basically this https://www.nexusmods.com/skyrimspecialedition/mods/133588, but with the script utilizing mainly Python Imaging Library (Pillow) and specific libraries for xNormal and possibly texconv if I need to. It's really simple and unoptimized script so far and needs more testing. That's the first thing that came to mind as a fast and easy solution for the problem (unless I missed something important). My solution is maybe a bit more crude than the UBE conversion (as I'm not familiar with blender), but the basic idea is pretty much the same. Also, regarding your suggestion on leaving it as png and using texconv to convert to dds instead of the pillow. That could be better than what I currently have. I can post results once I have properly tested several different tattoos. (preferably full body as the ones I started with were small and simple) Also, I wonder if parts of the UBE conversion script can be used in this. Or if the script would work with the files from the nexus page above. Thanks I did take a look at that before but came to the same conclusion that the manual usage of that program is too tedious to maintain/convert the amount of overlays I have in this mod. Especially for something I dont even use myself. If you can use python to batch convert using that xnormal program that seems like a good approach. https://discord.com/channels/890718575973785620/1103373082158174389/1262224417400815627 in the UBE discord (tutorials-archive by "midnightbig4") is the post with the blend file for the UBE conversion. Dont think there really is anything you can adapt if using a different program. Quote Tested my script on the full body tattoo from the bandit set. Looking at the places where you said to look for seams, I'd say it works quite well. Yeah that screenshot look pretty fine cant zoom in enough to see up close but on a glance so long there isnt a visible offset through the letters on the seams thats good. Edited June 23 by Alpia
beachpeachpeas Posted June 24 Posted June 24 20 hours ago, Mazhilalon said: Still going to look into optimizing the script before running the whole batch. And if @beachpeachpeasis willing, I'm interested in the way they did it. If their method is better/faster/more efficient, I could try to see if I can do it that way. 19 hours ago, Alpia said: https://discord.com/channels/890718575973785620/1103373082158174389/1262224417400815627 in the UBE discord (tutorials-archive by "midnightbig4") is the post with the blend file for the UBE conversion. Dont think there really is anything you can adapt if using a different program. This is exactly the flow that I used. I don't think you can use midnightbig4's script for BHUNP. Texconv you can automate with this batch script. It will convert all .tga files from the output directory. I believe Texconv can convert from .png to .dds as well. texconv -o dds -gpu 0 -f BC7_UNORM ./output/*.tga I have updated the UBE conversion to the latest Alpia Slavetats SE (06.2026) version. 1
Mazhilalon Posted June 24 Posted June 24 (edited) 1 hour ago, beachpeachpeas said: This is exactly the flow that I used. I don't think you can use midnightbig4's script for BHUNP. Texconv you can automate with this batch script. It will convert all .tga files from the output directory. I believe Texconv can convert from .png to .dds as well. texconv -o dds -gpu 0 -f BC7_UNORM ./output/*.tga I have updated the UBE conversion to the latest Alpia Slavetats SE (06.2026) version. I'm using texconv from the script using texconv-py. Sadly I couldn't find a way to run xNormal subprocesses in parallel so need to bake them sequentially. Currently running a smaller batch (the bandit folder inside Alpia's pack) to see if it works without problems and to see how long it takes to convert that amount. From what I understood, I only need to convert the body tattoos and leave the face ones as they are. Am I correct in that? Edited June 24 by Mazhilalon
Mazhilalon Posted June 24 Posted June 24 Took a new screenshot after running the script on the bandit folder. Here's one with the full bandit and the addon for it. Couldn't really see any seams. Also, that folder alone still took about an hour (thanks to the xNormal taking so long baking the textures). @Alpia If you think this is good enough (hoping you can see/zoom enough), I'll be continuing with the script as it is now and share the results once I'm done. Spoiler
Alpia Posted June 24 Author Posted June 24 (edited) 2 hours ago, Mazhilalon said: From what I understood, I only need to convert the body tattoos and leave the face ones as they are. Am I correct in that? Thats correct face/head is independent from the body. The face like the body will depend on the mod installed e.g. high poly head or whatever else UBE I think uses its own thing. Dont remember on hand and feet tbh. so long there isnt big changes between the meshes dont need those either. I generally avoid hand and feet tattoo's anyway dont see them them well and its just a bother. If you want to adapt your script to skip over my head related tattoo's you could filter head tattoo's out by splitting the file name into prefix and suffix, reading the file name till "-" as prefix to skip conversion of overlays starting with "FH": ("Forehead", "face"), "FA": ("Face", "face"), "3D": ("Throat", "face"), "MOUTH": ("Mouth", "face"), For example "FH - Use me.dds" or I guess for a occasional conversion easy enough to just cut out those textures manually. 1 hour ago, Mazhilalon said: If you think this is good enough (hoping you can see/zoom enough), I'll be continuing with the script as it is now and share the results once I'm done. Yeah that looks good. I dont see any text offset on the letters that cross seams, they align nicely and the stuff on breasts and hips is not distorted as it would be the case trying to use cbbe on bhunp. I leave it up to you if you want to host the conversion on its own mod page. You are free to do so, if not I just link to your post where you upload it like with the UBE conversion. There is some minimal stuff on the breast area I've seen on a closer look, but that doesnt really matter. It makes sense as xnormal just makes a educated guess where each point of one bodymesh may be on the other bodymesh based on similarities from what I understood. BHUNP and CBBE vary especially in the breast area and hip area thats where you see the most distortion. Considering that the result looks good. May even just be related to the body-slide preset. Spoiler Edited June 24 by Alpia
Mazhilalon Posted June 24 Posted June 24 (edited) 46 minutes ago, Alpia said: If you want to adapt your script to skip over my head related tattoo's you could filter head tattoo's out by splitting the file name into prefix and suffix, reading the file name till "-" as prefix to skip conversion of overlays starting with "FH": ("Forehead", "face"), "FA": ("Face", "face"), "3D": ("Throat", "face"), "MOUTH": ("Mouth", "face"), For example "FH - Use me.dds" or I guess for a occasional conversion easy enough to just cut out those textures manually. My solution for this was to read from the .json. As seen below, one of those has value "Face" and the other one has "Body" as value for the "area" key. Should make it compatible with other tattoo mods as well, I think. {"name": "Forehead - Use me", "area": "Face", "section": "Alpia Face", "texture": "Alpia Scribbles V2\\BBC\\FH - Use me.dds"} {"name": "Middle - Fuckdoll", "area": "Body", "section": "Alpia Belly", "texture": "Alpia Scribbles V2\\BBC\\FM - Fuckdoll.dds"} 46 minutes ago, Alpia said: Dont remember on hand and feet tbh. so long there isnt big changes between the meshes dont need those either. At least the conversion resources I use have one file for body + feet and another one for hands 46 minutes ago, Alpia said: There is some minimal stuff on the breast area I've seen on a closer look, but that doesnt really matter. It makes sense as xnormal just makes a educated guess where each point of one bodymesh may be on the other bodymesh based on similarities from what I understood. BHUNP and CBBE vary especially in the breast area and hip area thats where you see the most distortion. Considering that the result looks good. May even just be related to the body-slide preset. I may try to see if I can produce better results at a later time. Now I just want to get these done so I can play. I will also be gone for about 2 weeks starting this upcoming weekend so I'd like to get the conversions out before that. Edited June 24 by Mazhilalon 1
Mazhilalon Posted June 25 Posted June 25 (edited) @Alpia While converting these I noticed that in the Cow pack there's 2 files that are not in the "Alpia Cow.json" or the "Alpia V2.json" 2C - Keep impregnated.dds (which seems identical to 2D - Keep impregnated.dds) RBr Suck LBr Lick.dds (which seems to be "RBr - Suck.dds" and "LBr - Lick.dds" combined) Edit: Looks like in the Crime folder there's "Crime.dds", that does not exist in the .json, which is same as "LBr lower - slap.dds" Edit 2: Found some more inconsistencies General folder: LL Side - Cumslut 2.dds -> likely just a mistake in the .json. In the .json there's only one cumslut with texture pointing to "texture": "Alpia Scribbles v2\\General\\LL Side - Cumslut" (I'm guessing that should end in "LL Side - Cumslut 2.dds" as there's no other with cumslut in the filename) between Breasts - Oppai (kanji).dds -> missing from .json, no other with oppai mentioned in filemane seemed to match the tattoo RBc - Slave.dds -> missing from .json, the other file with slave in the name didn't match this one Horse Breeding/misc folder: 2D - D Horse Dick.dds -> .json had "2C - D Horse Dick.dds", maybe naming error in .json? LL - takes all sizes to horse.dds -> missing from .json, didn't find match with quick check MB - Takes all sizes to horse.dds -> missing from .json, didn't find match with quick check Pubic FM - D Horse Dick.dds -> missing from .json, didn't find match with quick check Slut Pop: 2c outer - i wanna cum.dds -> seems to be identical to "2d outer - i wanna cum.dds". assuming that's an old file waiting for deletion Breasts - R bite mark L heart.dds -> missing from .json, didn't find match with quick check, there was one with star and heart though Do you want me to add them to the .json in conversion or just drop them? I'll let you know if I find more inconsistencies. Edited June 26 by Mazhilalon Added more inconsistencies found
Alpia Posted June 25 Author Posted June 25 7 hours ago, Mazhilalon said: While converting these I noticed that in the Cow pack there's 2 files that are not in the "Alpia Cow.json" or the "Alpia V2.json" 2C - Keep impregnated.dds (which seems identical to 2D - Keep impregnated.dds) RBr Suck LBr Lick.dds (which seems to be "RBr - Suck.dds" and "LBr - Lick.dds" combined) Do you want me to add them to the .json in conversion or just drop them? I'll let you know if I find more inconsistencies. Thanks, No, you shouldnt add them to the json seems like I forgot to delete after correcting them. Alpia Scribbles V2\\Cow\\2D - Keep impregnated.dds is correct, so "2C - Keep impregnated.dds" can be removed. I checked in the racemenu plugin to ensure its not added anywhere. Its safe to remove. I will remove it as well with the next tattoo update, dont like pinging people with a version update for minor stuff. As for RBr Suck LBr Lick.dds since the individual overlays are in the json and that file isnt used by the race menu script or a json it can also be removed. Probably a leftover from splitting it into left and right. Alpia Scribbles V2\\Cow\\LBr - Lick.dds"}, Alpia Scribbles V2\\Cow\\RBr - Suck.dds"}, If I remember right the Christmas overlay is not in a json either I figured that should be some seasonal thing I just switch on, but I mean if someone wants they can just add it. There also is "Alt versions not in json" in the "General" folder which is just 2 overlays I made for someone that wanted a slightly different version of something. In theory you could remove those, but doesnt hurt to have. If in doubt where anything belongs you can use the heatmap of the main page and just lay it over Spoiler
Mazhilalon Posted June 25 Posted June 25 32 minutes ago, Alpia said: No, you shouldnt add them to the json seems like I forgot to delete after correcting them. Okay, I'll let you know if I find more. 33 minutes ago, Alpia said: I will remove it as well with the next tattoo update, dont like pinging people with a version update for minor stuff. So technically the conversion will be ahead of the main pack for a little while if I manage to release this in time.
Alpia Posted June 25 Author Posted June 25 49 minutes ago, Mazhilalon said: So technically the conversion will be ahead of the main pack for a little while if I manage to release this in time. Yes, since its just some unused files its not like it makes a difference if they are there or not other then a few mb in size.
Mazhilalon Posted June 26 Posted June 26 (edited) I'm almost done with converting the 06.2026 pack. Editing the the earlier message about the inconsitencies once I'm done with this. I'm thinking of at least temporarily just uploading the conversions here. Have to see if it becomes the permanent solution or if I release the script at some point. I'm still a bit undecided whether to post the pack I've converted now and convert the rest once I come back in couple of weeks or wait until then and release all at once. Considering the amount of tattoos not found in the .json files, I'll wait for your reply and post all conversions at once after I've returned. Edited June 26 by Mazhilalon
Alpia Posted June 27 Author Posted June 27 (edited) On 6/26/2026 at 7:18 PM, Mazhilalon said: I'll wait for your reply and post all conversions at once after I've returned. Probably the easiest if I just upload the whole pack here for you with the changes so you dont need to go over them individually. Changes: Spoiler Quote Looks like in the Crime folder there's "Crime.dds", that does not exist in the .json, which is same as "LBr lower - slap.dds" "Crime.dds" can be removed. General folder: Quote LL Side - Cumslut 2.dds -> likely just a mistake in the .json. In the .json there's only one cumslut with texture pointing to "texture": "Alpia Scribbles v2\\General\\LL Side - Cumslut" (I'm guessing that should end in "LL Side - Cumslut 2.dds" as there's no other with cumslut in the filename) That seems to be a mistake in the Alpia General.json, corrected to: {"name": "L Upper Side - Cumslut 2","area": "Body","section": "Alpia Legs","texture": "Alpia Scribbles v2\\General\\LL Side - Cumslut 2.dds"}, Already correct in the All in one Alpia V2.json and RM plugin Quote between Breasts - Oppai (kanji).dds -> missing from .json, no other with oppai mentioned in filemane seemed to match the tattoo Think I remember that one made for some more bimbo like balloon breasts, so I didnt keep it in unless someone adds it manually. We remove this to keep it consistent. Quote RBc - Slave.dds -> missing from .json, the other file with slave in the name didn't match this one Added to the Alpia General.json and the all in one Alpia V2.json, also added to the RM plugin, so that will be included with the next update. No issue if its already in yours in advance. {"name": "RBc - Slave", "area": "Body", "section": "Alpia Butt", "texture": "Alpia Scribbles V2\\General\\RBc - Slave.dds"}, Horse Breeding/misc folder: Quote 2D - D Horse Dick.dds -> .json had "2C - D Horse Dick.dds", maybe naming error in .json? Yes, appears to be a naming error in the json. Edited in Alpia Horse Breeding.json, already correct in the all in one Alpia V2.json. {"name": "Lower - D Horse Dick (misc)","area": "Body","section": "Alpia Right","texture": "Alpia Scribbles V2\\Horse Breeding\\misc\\2C - D Horse Dick.dds"}, to {"name": "L Upper Inner - D Horse Dick","area": "Body","section": "Alpia Legs","texture": "Alpia Scribbles V2\\Horse Breeding\\misc\\2d - D Horse Dick.dds"}, Quote LL - takes all sizes to horse.dds -> missing from .json, didn't find match with quick check MB - Takes all sizes to horse.dds -> missing from .json, didn't find match with quick check Pubic FM - D Horse Dick.dds -> missing from .json, didn't find match with quick check Mmh... I remember those I wasnt sure if I want them or not, so for the time being for consistency we can remove those. Slut Pop: Quote 2c outer - i wanna cum.dds -> seems to be identical to "2d outer - i wanna cum.dds". assuming that's an old file waiting for deletion Yes, 2c outer - i wanna cum.dds should be removed Quote Breasts - R bite mark L heart.dds -> missing from .json, didn't find match with quick check, there was one with star and heart though Yep that is missing, added to Alpia Slut Pop.json and Alpia V2.json also RM. {"name": "Nipples - R bite mark L heart","area": "Body","section": "Alpia Chest","texture": "Alpia Scribbles V2\\Slut Pop\\Breasts - R bite mark L heart.dds"}, Thanks for pointing those out, please update your post if there is anything else or if those are gone. Also realized unlike 2 years ago I can actually make my life easier and write a simple script to read json and report matches/misses instead of doing it by hand. ---------------------------------------------------------------------- Missing textures: DDS not referenced: alpia scribbles v2/christmas/full - christmas base color.dds alpia scribbles v2/christmas/full - christmas.dds alpia scribbles v2/general/alt versions not in json/1c - keep exposed.dds alpia scribbles v2/general/alt versions not in json/lb - keep exposed.dds alpia scribbles v2/public whore addon/unused/full - public whore addon (body) without kanji.dds Summary ---------------------------------------------------------------------- Entries in JSON : 1124 Matched : 1124 Missing : 0 Unused DDS : 5 Script: Either you drag one JSON file onto the script. The script then treats that JSON as the “truth” and checks only against the folder next to it or If run with a double click the script it loads all JSON files in the folder and treats them as one big dataset. Difference is that DDS files only need to exist in at least one JSON for the split set version so it doesnt complain that nord.json doesnt have the \general .dds files etc. Spoiler import json import sys from pathlib import Path # input lookup def get_json_files(): if len(sys.argv) > 1: p = Path(sys.argv[1]) if p.is_file() and p.suffix.lower() == ".json": return [p], True return sorted(Path(".").glob("*.json")), False # path normalization def norm(p: Path) -> str: return p.as_posix().lower() def tex_to_path(base: Path, tex: str) -> Path: return base / Path(tex.replace("\\", "/")) # drop on mode -> if .json dropped on script to run def check_single(json_file: Path): print("=" * 70) print(f"Checking: {json_file.name}") print("=" * 70) with open(json_file, "r", encoding="utf-8") as f: entries = json.load(f) base = json_file.parent referenced = set() matched = 0 missing = [] for e in entries: tex = e.get("texture", "") full = tex_to_path(base, tex) rel = norm(full.relative_to(base)) referenced.add(rel) if full.exists(): matched += 1 else: missing.append(rel) existing = set() for dds in base.rglob("*.dds"): existing.add(norm(dds.relative_to(base))) unused = sorted(existing - referenced) print("\nMissing textures:") for m in missing: print(" " + m) print("\nDDS not referenced:") for u in unused: print(" " + u) print("\nSummary") print("-" * 70) print(f"Entries in JSON : {len(entries)}") print(f"Matched : {matched}") print(f"Missing : {len(missing)}") print(f"Unused DDS : {len(unused)}") # check all mode -> checks all .jsons combined against all .dds def check_combined(json_files): print("=" * 70) print("Combined Validation") print("=" * 70) referenced = set() missing = [] duplicates = [] total_entries = 0 roots = {jf.parent for jf in json_files} for jf in json_files: with open(jf, "r", encoding="utf-8") as f: entries = json.load(f) base = jf.parent for e in entries: tex = e.get("texture", "") full = tex_to_path(base, tex) rel = norm(full.relative_to(base)) total_entries += 1 if rel in referenced: duplicates.append(rel) else: referenced.add(rel) if not full.exists(): missing.append(rel) existing = set() for r in roots: for dds in r.rglob("*.dds"): existing.add(norm(dds.relative_to(r))) unused = sorted(existing - referenced) print("\nMissing textures:") for m in missing: print(" " + m) print("\nDDS not referenced anywhere:") for u in unused: print(" " + u) print("\nSummary") print("-" * 70) print(f"JSON files : {len(json_files)}") print(f"Entries : {total_entries}") print(f"Missing : {len(missing)}") print(f"Unused DDS : {len(unused)}") print(f"Duplicates : {len(duplicates)}") # entry point that decides which of the two modes to run def main(): json_files, single = get_json_files() if not json_files: print("No JSON files found.") input("Press ENTER...") return if single: check_single(json_files[0]) else: check_combined(json_files) input("\nPress ENTER...") if __name__ == "__main__": main() so should be all good now, those listed just stay in if anybody is bothered by some extra textures they can remove them. Alpia Slavetats SE (06.2026-rev1).7z Edited June 27 by Alpia
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now