import gradio as gr from image_dataset import ImageDataset from image_wgan import ImageWgan import os from os.path import exists from PIL import Image, ImageEnhance import numpy as np import random from pygltflib import GLTF2 from pygltflib.utils import ImageFormat, Texture, Material, Image as GLTFImage import time import threading clicked_image_index = 0 print(gr.__version__) def init(): generated_samples_folder = "." discriminator_saved_model = "discriminator64.model" generator_saved_model = "generator64.model" latent_space = 100 image_wgan = ImageWgan( image_shape = (4,64,64), latent_space_dimension=latent_space, generator_saved_model=generator_saved_model if exists(generator_saved_model) else None, discriminator_saved_model=discriminator_saved_model if exists(discriminator_saved_model) else None ) image_wgan.generate( sample_folder=generated_samples_folder ) crop() def crop(): import generator res = 64 if res != 0: results = "generated.png" img = Image.open(results) width,height = img.size top = 2 bottom = 2 for i in range(1): left = (res+2)*i +2 right = width-(res+2)*i imgcrop = img.crop((left,top,left+res,res+2)) imgcrop.save(str(i)+".png") init() def gen(seed=None): if seed is None or seed == "Surprise Me" or seed == "": seed = random.randint(0, 1000000000) else: seed = int(seed) np.random.seed(seed) init() # Initialize and generate samples crop() # Crop the generated images imgArr = [] for i in range(1): img = Image.open(f"{i}.png").convert('RGBA') img = img.resize((64, 64), Image.NEAREST) imgArr.append(img) return imgArr, seed # Return both images and the seed used def update_model(index): filename = "models/player_model.glb" gltf = GLTF2().load(filename) # Step 1: Find the index of the existing texture you want to replace # Let's assume the texture you want to replace is at index 1 (you need to replace 1 with the actual index) existing_texture_index = 0 # Check if the existing_texture_index is valid if existing_texture_index < len(gltf.textures): # Step 2: Remove the old texture and its associated image from the GLB # Remove the texture gltf.textures.pop(existing_texture_index) # Remove the image associated with the texture existing_image_index = gltf.materials[0].pbrMetallicRoughness.baseColorTexture.index gltf.images.pop(existing_image_index) # Step 3: Add the new image and texture to the GLB # Create and add a new image to the glTF (same as before) new_image = GLTFImage() new_image.uri = os.path.join(os.path.dirname(__file__), f"{index}.png") gltf.images.append(new_image) # Create a new texture and associate it with the added image new_texture = Texture() new_texture.source = len(gltf.images) - 1 # Index of the newly added image new_texture.sampler = 0 # set to nearest neighbor gltf.textures.append(new_texture) # Step 4: Assign the new texture to the appropriate material(s) or mesh(es) # Assuming you have a mesh/primitive that was using the old texture and you want to apply the new texture to it, you need to set the material index for that mesh/primitive. # Replace 0 with the actual index of the mesh/primitive you want to update. gltf.meshes[0].primitives[0].material = len(gltf.materials) - 1 # Now you can convert the images to data URIs and save the updated GLB gltf.convert_images(ImageFormat.DATAURI) filename2 = "models/temp_model.glb" gltf.save(filename2) else: print("Invalid existing_texture_index") running = False time_since_last_run = 0 # Function to handle the input from the interface def handle_input(seed_text, surprise_me): if surprise_me: images, used_seed = gen("Surprise Me") else: images, used_seed = gen(seed_text) loadMinecraftSkinViewer(0) return images, f"Seed Used: {used_seed}", os.path.join(os.path.dirname(__file__), "models/temp_model.glb") # Function to load the Minecraft skin viewer def loadMinecraftSkinViewer(index): update_model(index) head = f""" """ iface = gr.Interface( fn=handle_input, inputs=[ gr.Text(label="Seed", placeholder="Enter a seed"), # Text input for seed gr.Checkbox(label="Surprise Me", value=False), # Checkbox for 'Surprise Me' functionality ], outputs=[ gr.Gallery(label="Generated Skins"), gr.Textbox(label="Used Seed"), # Display the seed used to generate the images gr.Model3D( clear_color=[0.0, 0.0, 0.0, 0.0], label="3D Model"), ], title = "Minecraft Skin Generator ", #<-- EWW GROSS IK IK IM SORRY, BUT THAT'S THE ONLY WAY I FOUND IT TO WORK head=head, # Add the Babylon.js library to the interface allow_flagging=False, ) iface.launch()