98 lines
3.9 KiB
Python
98 lines
3.9 KiB
Python
import cv2
|
|
import numpy as np
|
|
import os
|
|
import shutil
|
|
|
|
def process_and_replace_assets():
|
|
# Paths to the newly generated artifacts
|
|
# NOTE: In a real scenario, I would validly know these paths.
|
|
# Since I am an AI, I generated them into specific locations in the previous turn.
|
|
# I will assume they are available in a temporary location or I will use the paths returned by the generation tool.
|
|
|
|
# Based on previous output:
|
|
# Campfire: .../campfire_simple_1769580346960.png
|
|
# Tent: .../tent_new_color_1769580361961.png
|
|
# Sleeping Bag: .../sleeping_bag_asset_1769580261243.png
|
|
|
|
# I need to find them or use the strings directly.
|
|
# Let's search for them in the artifacts directory or assume I can access them.
|
|
# For this script to work on the USER's machine, the files must be there.
|
|
# But wait, 'generate_image' saves to the agent's brain artifact folder, which might be accessible via absolute path.
|
|
|
|
# Let's map the artifact paths (I'll use the filenames from the previous turn logs).
|
|
# Since I cannot magically know the absolute path structure without 'find', I will try to find them in the .gemini artifacts folder.
|
|
|
|
artifacts_dir = '/Users/davidkotnik/.gemini/antigravity/brain/07019d04-a214-43ab-9565-86f4e8f17e5b'
|
|
|
|
mapping = {
|
|
'campfire_simple': 'campfire.png',
|
|
'tent_new_color': 'tent.png',
|
|
'sleeping_bag_asset': 'sleeping_bag.png'
|
|
}
|
|
|
|
# Targets
|
|
target_repo = '/Users/davidkotnik/repos/novafarma/main/assets'
|
|
target_project = '/Users/davidkotnik/nova farma/main/assets'
|
|
|
|
for key_pattern, dest_name in mapping.items():
|
|
# Find the file in artifacts
|
|
found_path = None
|
|
for f in os.listdir(artifacts_dir):
|
|
if key_pattern in f and f.endswith('.png'):
|
|
found_path = os.path.join(artifacts_dir, f)
|
|
break # Take the first match (most recent usually if unique names)
|
|
|
|
if not found_path:
|
|
print(f"Error: Could not find generated image for {key_pattern}")
|
|
continue
|
|
|
|
print(f"Processing {found_path} -> {dest_name}")
|
|
|
|
img = cv2.imread(found_path, cv2.IMREAD_UNCHANGED)
|
|
|
|
# 1. Remove Background (Simple Gray/Solid removal)
|
|
# The generated images usually have a solid background (gray or greenish).
|
|
# Best approach: Grab corner color and remove everything similar?
|
|
if img.shape[2] == 3:
|
|
img = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
|
|
|
|
# Sampling corners
|
|
corners = [img[0,0], img[0, -1], img[-1, 0], img[-1, -1]]
|
|
# Take the most common color (usually bg)
|
|
bg_color = corners[0] # Naive approach
|
|
|
|
# Tolerance
|
|
tol = 30
|
|
lower = np.clip(bg_color[:3] - tol, 0, 255)
|
|
upper = np.clip(bg_color[:3] + tol, 0, 255)
|
|
|
|
mask = cv2.inRange(img[:,:,:3], lower, upper)
|
|
# Invert mask: we want to KEEP the foreground
|
|
# Set alpha=0 where mask is true (background)
|
|
img[mask > 0, 3] = 0
|
|
|
|
# 2. Resize
|
|
# Campfire: 128x128
|
|
# Sleeping Bag: 128x128
|
|
# Tent: 256x256
|
|
target_size = (128, 128)
|
|
if 'tent' in dest_name:
|
|
target_size = (256, 256)
|
|
|
|
# Resize maintaining aspect ratio? Or just fit?
|
|
# Isometric assets often square-ish. Let's just resize to fit box.
|
|
img = cv2.resize(img, target_size, interpolation=cv2.INTER_AREA)
|
|
|
|
# Save
|
|
local_dest = os.path.join(target_repo, dest_name)
|
|
cv2.imwrite(local_dest, img)
|
|
print(f"Saved cleaned {dest_name} to {local_dest}")
|
|
|
|
# Copy to project
|
|
proj_dest = os.path.join(target_project, dest_name)
|
|
shutil.copy2(local_dest, proj_dest)
|
|
print(f"Synced to {proj_dest}")
|
|
|
|
if __name__ == "__main__":
|
|
process_and_replace_assets()
|