diff --git a/assets/images/zivali/chicken_white.png b/assets/images/zivali/chicken_white.png deleted file mode 100644 index 0f613e1a1..000000000 Binary files a/assets/images/zivali/chicken_white.png and /dev/null differ diff --git a/assets/images/zivali/cow_brown.png b/assets/images/zivali/cow_brown.png deleted file mode 100644 index 6cf7c7bed..000000000 Binary files a/assets/images/zivali/cow_brown.png and /dev/null differ diff --git a/assets/images/zivali/cow_highland.png b/assets/images/zivali/cow_highland.png deleted file mode 100644 index 09da28ba0..000000000 Binary files a/assets/images/zivali/cow_highland.png and /dev/null differ diff --git a/assets/images/zivali/pig_normal.png b/assets/images/zivali/pig_normal.png new file mode 100644 index 000000000..c7cddb306 Binary files /dev/null and b/assets/images/zivali/pig_normal.png differ diff --git a/assets/images/zivali/test_cow_stardew.png b/assets/images/zivali/test_cow_stardew.png new file mode 100644 index 000000000..0afc1671e Binary files /dev/null and b/assets/images/zivali/test_cow_stardew.png differ diff --git a/scripts/test_stardew_style.py b/scripts/test_stardew_style.py new file mode 100644 index 000000000..cdaa9ac33 --- /dev/null +++ b/scripts/test_stardew_style.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 +""" +🧪 STARDEW VALLEY STYLE TEST +1 slika iz vsake kategorije +""" + +import os +import sys +import time +import uuid +import requests +import subprocess +from pathlib import Path +from datetime import datetime + +try: + from rembg import remove + from PIL import Image +except ImportError: + os.system("pip3 install --user rembg pillow onnxruntime") + from rembg import remove + from PIL import Image + +COMFYUI_URL = "http://127.0.0.1:8000" +OUTPUT_DIR = Path("/Users/davidkotnik/repos/novafarma/assets/images") +REPO_DIR = Path("/Users/davidkotnik/repos/novafarma") + +# STARDEW VALLEY STYLE +STYLE = """Stardew Valley game art style, 2D pixel-perfect sprite, +clean pixel art, vibrant colors, cute game asset, +top-down or side view, isolated on white background""" + +NEGATIVE = """3d render, realistic, photorealistic, blurry, +low quality, watermark, text, green background""" + +# TEST SAMPLES - 1 iz vsake kategorije +TEST_SAMPLES = [ + # Živali + ("zivali", "test_cow_stardew", "dairy cow, Stardew Valley farm animal"), + + # Items - Tool + ("items", "test_axe_stardew", "iron axe tool, Stardew Valley item"), + + # Items - Food + ("items", "test_bread_stardew", "bread loaf, Stardew Valley food"), + + # Buildings + ("buildings", "test_barn_stardew", "small barn building, Stardew Valley farm structure"), + + # Environment + ("environment", "test_tree_stardew", "oak tree, Stardew Valley nature"), + + # Crops + ("crops", "test_wheat_stardew", "wheat crop plant, Stardew Valley farming"), + + # Workstations + ("workstations", "test_anvil_stardew", "blacksmith anvil, Stardew Valley crafting"), + + # UI + ("ui", "test_heart_stardew", "red heart icon, Stardew Valley UI element"), + + # Mutants + ("mutanti", "test_slime_stardew", "green slime monster, Stardew Valley enemy"), + + # Bosses + ("bosses", "test_dragon_stardew", "small dragon boss, Stardew Valley style"), +] + +def log(msg): + ts = datetime.now().strftime("%H:%M:%S") + print(f"[{ts}] {msg}") + sys.stdout.flush() + +def create_workflow(prompt_text, output_name, size=512): + seed = int(time.time() * 1000) % 2147483647 + full_prompt = f"{STYLE}, {prompt_text}" + return { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "dreamshaper_8.safetensors"}}, + "2": {"class_type": "EmptyLatentImage", "inputs": {"width": size, "height": size, "batch_size": 1}}, + "3": {"class_type": "CLIPTextEncode", "inputs": {"text": full_prompt, "clip": ["1", 1]}}, + "4": {"class_type": "CLIPTextEncode", "inputs": {"text": NEGATIVE, "clip": ["1", 1]}}, + "5": { + "class_type": "KSampler", + "inputs": { + "seed": seed, "steps": 30, "cfg": 7.5, + "sampler_name": "euler_ancestral", "scheduler": "karras", + "denoise": 1.0, "model": ["1", 0], + "positive": ["3", 0], "negative": ["4", 0], "latent_image": ["2", 0] + } + }, + "6": {"class_type": "VAEDecode", "inputs": {"samples": ["5", 0], "vae": ["1", 2]}}, + "7": {"class_type": "SaveImage", "inputs": {"filename_prefix": output_name, "images": ["6", 0]}} + } + +def queue_prompt(workflow): + try: + r = requests.post(f"{COMFYUI_URL}/prompt", json={"prompt": workflow, "client_id": f"test_{uuid.uuid4().hex[:8]}"}, timeout=10) + return r.json().get("prompt_id") + except Exception as e: + log(f"❌ {e}") + return None + +def wait_completion(prompt_id, timeout=120): + start = time.time() + while time.time() < start + timeout: + try: + r = requests.get(f"{COMFYUI_URL}/history/{prompt_id}", timeout=5) + if prompt_id in r.json() and r.json()[prompt_id].get("outputs"): + return True + except: + pass + time.sleep(2) + return False + +def download_and_process(prompt_id, output_path): + try: + h = requests.get(f"{COMFYUI_URL}/history/{prompt_id}").json() + for out in h.get(prompt_id, {}).get("outputs", {}).values(): + for img in out.get("images", []): + r = requests.get(f"{COMFYUI_URL}/view", params={"filename": img["filename"], "subfolder": img.get("subfolder", ""), "type": "output"}) + if r.status_code == 200: + output_path.parent.mkdir(parents=True, exist_ok=True) + from io import BytesIO + transparent_img = remove(Image.open(BytesIO(r.content))) + transparent_img.save(str(output_path), "PNG") + return True + return False + except Exception as e: + log(f"❌ {e}") + return False + +def main(): + log("="*70) + log("🧪 STARDEW VALLEY STYLE TEST") + log(" 1 slika iz vsake kategorije") + log("="*70) + + try: + r = requests.get(f"{COMFYUI_URL}/system_stats", timeout=5) + log(f"✅ ComfyUI v{r.json()['system']['comfyui_version']}") + except: + log("❌ ComfyUI not running!") + return + + log(f"\n🎨 Generating {len(TEST_SAMPLES)} test samples (Stardew Valley style)...\n") + + for i, (cat, name, prompt) in enumerate(TEST_SAMPLES, 1): + path = OUTPUT_DIR / cat / f"{name}.png" + + log(f"[{i}/{len(TEST_SAMPLES)}] 🎮 {cat}/{name}") + + size = 768 if cat == "bosses" else 512 + wf = create_workflow(prompt, name, size) + pid = queue_prompt(wf) + + if pid and wait_completion(pid) and download_and_process(pid, path): + log(f" ✅ Done!") + os.system(f"open {path}") + else: + log(f" ❌ Failed") + + time.sleep(1) + + log("\n" + "="*70) + log("🧪 TEST COMPLETE!") + log(" Vse slike odprte za pregled") + log("="*70) + +if __name__ == "__main__": + main()