| import math |
| import os |
| import sys |
| import smplx |
| |
| 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 |
| 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_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 |
|
|
| |
|
|
| |
| if mode == "video": |
| if always_on_floor: |
| frames_folder += "_of" |
| os.makedirs(frames_folder, exist_ok=True) |
| |
| 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}" |
|
|
| |
| |
| |
| 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) |
|
|
| |
| nframes = len(data) |
|
|
| |
| show_traj(data.trajectory) |
|
|
| |
| plot_floor(data.data, big_plane=False) |
|
|
| |
| 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) |
|
|
| |
| 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')) |
|
|
| |
| delete_objs(imported_obj_names) |
| delete_objs(["Plane", "myCurve", "Cylinder"]) |
|
|
| if mode == "video": |
| return frames_folder |
| else: |
| return img_path |
|
|