import streamlit as st import os, base64, shutil, random from pathlib import Path @st.cache_data def load_aframe_and_extras(): return """ """ @st.cache_data def encode_file(path): with open(path,'rb') as f: return base64.b64encode(f.read()).decode() def create_aframe_entity(stem, ext, pos): ry = random.uniform(0,360) if ext == 'obj': return (f'') if ext in ('glb','gltf'): return (f'') return '' @st.cache_data def generate_tilemap(files, dirpath, gw=8, gh=8): img_exts = ['webp','png','jpeg','jpg'] model_exts = ['obj','glb','gltf'] vid_exts = ['mp4'] imgs = [f for f in files if f.split('.')[-1] in img_exts] models = [f for f in files if f.split('.')[-1] in model_exts] vids = [f for f in files if f.split('.')[-1] in vid_exts] assets = "" for f in files: stem = Path(f).stem; ext=f.split('.')[-1] data=encode_file(os.path.join(dirpath,f)) if ext in model_exts: assets += (f'') elif ext in img_exts: assets += f'' elif ext in vid_exts: assets += (f'') assets += "" entities = "" if vids: v = vids[0]; s = Path(v).stem entities += (f'') else: sx = -gw/2; sz = -gh/2 for i in range(gw): for j in range(gh): x,y,z = sx+i,0,sz+j if imgs: img = random.choice(imgs); s = Path(img).stem entities += (f'') sx = -gw/2; sz = -gh/2 for i in range(gw): for j in range(gh): x,y,z = sx+i,0,sz+j if models: m = random.choice(models); ext = m.split('.')[-1]; s = Path(m).stem entities += create_aframe_entity(s, ext, f"{x} 0 {z}") return assets, entities def main(): st.set_page_config(layout="wide") with st.sidebar: st.markdown("### 🧭 Camera Views") st.markdown("**Select Quadrant** 📷") cols = st.columns(3) cols[0].button("↖️ Top-Left", on_click=lambda: st.session_state.update({'camera_view': 'angle1'})) cols[1].button("⬆️ Top", on_click=lambda: st.session_state.update({'camera_view': 'front'})) cols[2].button("↗️ Top-Right", on_click=lambda: st.session_state.update({'camera_view': 'angle2'})) cols = st.columns(3) cols[0].button("⬅️ Left", on_click=lambda: st.session_state.update({'camera_view': 'left'})) cols[1].button("🔳 Center", on_click=lambda: st.session_state.update({'camera_view': 'center'})) cols[2].button("➡️ Right", on_click=lambda: st.session_state.update({'camera_view': 'right'})) cols = st.columns(3) cols[0].button("↙️ Bottom-Left", on_click=lambda: st.session_state.update({'camera_view': 'angle3'})) cols[1].button("⬇️ Bottom", on_click=lambda: st.session_state.update({'camera_view': 'back'})) cols[2].button("↘️ Bottom-Right", on_click=lambda: st.session_state.update({'camera_view': 'angle4'})) st.markdown("### ➕ Add Media Files") ups = st.file_uploader("Add files (png, jpeg, obj, glb, mp4, etc.):", accept_multiple_files=True) st.markdown("### 📋 Uploaded Model Files") directory = st.text_input("Path:", ".", key="dir") if os.path.isdir(directory): files = [f for f in os.listdir(directory) if f.split('.')[-1] in ['obj', 'glb', 'gltf']] if files: for i, f in enumerate(files, 1): st.markdown(f"{i}. {f}") else: st.markdown("No model files found.") if not os.path.isdir(directory): st.sidebar.error("Invalid directory") return types = ['obj','glb','gltf','webp','png','jpeg','jpg','mp4'] if ups: for up in ups: ext=Path(up.name).suffix.lower()[1:] if ext in types: with open(os.path.join(directory,up.name),'wb') as f: shutil.copyfileobj(up,f) st.sidebar.success(f"Uploaded {up.name}") else: st.sidebar.warning(f"Skipped {up.name}") files = [f for f in os.listdir(directory) if f.split('.')[-1] in types] spot_h = max(8,8)*1.5 scene = f""" """ assets, ents = generate_tilemap(files, directory, 8, 8) scene += assets + ents + "" view_cmd = st.session_state.get('camera_view', 'center') if view_cmd: scene += f"" st.session_state.pop('camera_view', None) fly_cmd = st.session_state.get('fly_action') if fly_cmd: scene += f"" st.session_state.pop('fly_action', None) loader = '' st.components.v1.html( load_aframe_and_extras() + loader + scene, height=1000 ) if __name__ == "__main__": main()