Spaces:
Runtime error
Runtime error
| 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""" | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> | |
| <script> | |
| function loadMinecraftSkinViewer(index) {{ | |
| gr.interface.trigger("generate", index); | |
| }} | |
| </script> | |
| """ | |
| 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 <style>img{image-rendering: pixelated;}</style>", #<-- 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() | |