Spaces:
Runtime error
Runtime error
| import math | |
| import os | |
| import sys | |
| import smplx | |
| # import bpy | |
| import numpy as np | |
| from .camera import Camera | |
| from .floor import get_trajectory, plot_floor, show_traj | |
| from .sampler import get_frameidx | |
| from .scene import setup_scene # noqa | |
| from .tools import delete_objs, load_numpy_vertices_into_blender, style_detect | |
| from .vertices import prepare_vertices | |
| from mGPT.utils.joints import smplh_to_mmm_scaling_factor | |
| def prune_begin_end(data, perc): | |
| to_remove = int(len(data) * perc) | |
| if to_remove == 0: | |
| return data | |
| return data[to_remove:-to_remove] | |
| def render_current_frame(path): | |
| bpy.context.scene.render.filepath = path | |
| bpy.ops.render.render(use_viewport=True, write_still=True) | |
| def render(npydata, | |
| frames_folder, | |
| *, | |
| mode, | |
| model_path, | |
| faces_path, | |
| gt=False, | |
| exact_frame=None, | |
| num=8, | |
| downsample=True, | |
| canonicalize=True, | |
| always_on_floor=False, | |
| denoising=True, | |
| oldrender=True, | |
| res="high", | |
| init=True, | |
| accelerator='gpu', | |
| device=[0]): | |
| if init: | |
| # Setup the scene (lights / render engine / resolution etc) | |
| setup_scene(res=res, | |
| denoising=denoising, | |
| oldrender=oldrender, | |
| accelerator=accelerator, | |
| device=device) | |
| is_mesh, is_smplx, jointstype = style_detect(npydata) | |
| if not is_mesh: | |
| npydata = npydata * smplh_to_mmm_scaling_factor | |
| if is_smplx: | |
| smplx_model_male = smplx.create(model_path, | |
| model_type='smplx', | |
| gender='male', | |
| ext='npz', | |
| num_betas=10, | |
| flat_hand_mean=True, | |
| use_pca=False) | |
| faces_path = smplx_model_male.faces | |
| # Put everything in this folder | |
| if mode == "video": | |
| if always_on_floor: | |
| frames_folder += "_of" | |
| os.makedirs(frames_folder, exist_ok=True) | |
| # if it is a mesh, it is already downsampled | |
| if downsample and not is_mesh: | |
| npydata = npydata[::8] | |
| elif mode == "sequence": | |
| img_name, ext = os.path.splitext(frames_folder) | |
| if always_on_floor: | |
| img_name += "_of" | |
| img_path = f"{img_name}{ext}" | |
| elif mode == "frame": | |
| img_name, ext = os.path.splitext(frames_folder) | |
| if always_on_floor: | |
| img_name += "_of" | |
| img_path = f"{img_name}_{exact_frame}{ext}" | |
| # remove X% of begining and end | |
| # as it is almost always static | |
| # in this part | |
| if mode == "sequence": | |
| perc = 0.2 | |
| npydata = prune_begin_end(npydata, perc) | |
| if is_mesh: | |
| from .meshes import Meshes | |
| data = Meshes(npydata, | |
| gt=gt, | |
| mode=mode, | |
| faces_path=faces_path, | |
| canonicalize=canonicalize, | |
| always_on_floor=always_on_floor, | |
| is_smplx=is_smplx) | |
| else: | |
| from .joints import Joints | |
| data = Joints(npydata, | |
| gt=gt, | |
| mode=mode, | |
| canonicalize=canonicalize, | |
| always_on_floor=always_on_floor, | |
| jointstype=jointstype) | |
| # Number of frames possible to render | |
| nframes = len(data) | |
| # Show the trajectory | |
| show_traj(data.trajectory) | |
| # Create a floor | |
| plot_floor(data.data, big_plane=False) | |
| # initialize the camera | |
| camera = Camera(first_root=data.get_root(0), mode=mode, is_mesh=is_mesh) | |
| frameidx = get_frameidx(mode=mode, | |
| nframes=nframes, | |
| exact_frame=exact_frame, | |
| frames_to_keep=num) | |
| nframes_to_render = len(frameidx) | |
| # center the camera to the middle | |
| if mode == "sequence": | |
| camera.update(data.get_mean_root()) | |
| imported_obj_names = [] | |
| for index, frameidx in enumerate(frameidx): | |
| if mode == "sequence": | |
| frac = index / (nframes_to_render - 1) | |
| mat = data.get_sequence_mat(frac) | |
| else: | |
| mat = data.mat | |
| camera.update(data.get_root(frameidx)) | |
| islast = index == (nframes_to_render - 1) | |
| objname = data.load_in_blender(frameidx, mat) | |
| name = f"{str(index).zfill(4)}" | |
| if mode == "video": | |
| path = os.path.join(frames_folder, f"frame_{name}.png") | |
| else: | |
| path = img_path | |
| if mode == "sequence": | |
| imported_obj_names.extend(objname) | |
| elif mode == "frame": | |
| camera.update(data.get_root(frameidx)) | |
| if mode != "sequence" or islast: | |
| render_current_frame(path) | |
| delete_objs(objname) | |
| bpy.ops.wm.save_as_mainfile(filepath=frames_folder.replace('.png','.blend').replace('_frames','.blend')) | |
| # remove every object created | |
| delete_objs(imported_obj_names) | |
| delete_objs(["Plane", "myCurve", "Cylinder"]) | |
| if mode == "video": | |
| return frames_folder | |
| else: | |
| return img_path | |