o f@sBddlZddlmZddlmmZddZGdddeZ dS)N) FlexiCubescCstj|d|d|dftj|d}d||dd|dd|ddf<t|d}d||dd|dd|ddf<d|dddf<d|dddf<d|dddddf<d|dddddf<d|ddddddf<d|ddddddf<t|d}||fS) N)dtypedeviceTF.)torchzerosboolnonzeroreshape)grid_resrvcenter_indicesboundary_indicesr8/home/gustavo/Documentos/CRM/util/flexicubes_geometry.pyget_center_boundary_indexs$&&rcsHeZdZ  dfdd Zdd Zdd d ZdddZdddZZS)FlexiCubesGeometry@@cpuN neural_rendercs$tt|||_||_||_t|dd|_|j|\|_ |_ t |t rc|j dddf|d|j dddf<|j dddf|d|j dddf<|j dddf|d|j dddf<n|j ||_ |j dd|jj fdd}tj|dd|_t|j|\|_|_||_||_dS)Ng?) weight_scalerrrrdim)superr__init__rrargsrfcconstruct_voxel_gridvertsindices isinstancelist cube_edgesr r unique all_edgesrrrrenderer render_type)selfrscalerr)r*rr( __class__rrr!s  ((*  zFlexiCubesGeometry.__init__cCs$tj|jddjtj|jddjfS)Nrr)r minr"valuesmax)r+rrrgetAABB9s$zFlexiCubesGeometry.getAABBFc Csf|dur|j}|j||||j|ddddf|ddddf|dddf|d\}}} ||| fS)N ) beta_fx12 alpha_fx8gamma_ftraining)r#r r) r+v_deformed_nx3sdf_nweight_nwith_uvr# is_trainingr"faces v_reg_lossrrrget_mesh<s$ zFlexiCubesGeometry.get_meshc Cst}|jdkrE|jj|jdd|||jdd||j|d\}}} } } } } ||d<||d<| |d<| |d<| |d <| |d <| |d <|St) Nrrr) resolutionrhierarchical_masktex_posmask hard_maskrast v_pos_clip mask_pyramiddepth)dictr*r) render_mesh unsqueezeintrNotImplementedError)r+ mesh_v_nx3 mesh_f_fx3camera_mv_bx4x4rBrC return_valuerDrErFrGrHrIrJrrrrLGs(    zFlexiCubesGeometry.render_meshcsg}g}|jd}g}t|D]'} ||| || \} } || || || | || |} || q|d} t}| D]fdd|D}||<qB|S)Nrcsg|]}|qSrr).0rkrr qsz-FlexiCubesGeometry.render..)shaperanger@appendrLkeysrK)r+v_deformed_bxnx3sdf_bxncamera_mv_bxnviewx4x4rBv_listf_listn_batchall_render_outputi_batch verts_nx3 faces_fx3 render_output return_keysrSvaluerrUrrender`s        zFlexiCubesGeometry.render)rrrNrN)NFNF)rAF)NNNrA) __name__ __module__ __qualname__rr2r@rLri __classcell__rrr-rr s  r) r util.flexicubesrtorch.nn.functionalnn functionalFrobjectrrrrrs