Skip to content

Commit

Permalink
feat: Implement asset path mapping for Cinema 4D scene files (#126)
Browse files Browse the repository at this point in the history
* Add logic to pathmap all assets in scene
* Set the output paths with a mapped path when we first set the data instead of changing it later in `start_render`
* Fallback to start_render data for the frame

---------

Signed-off-by: Alex Hughes <[email protected]>
  • Loading branch information
Ahuge authored Dec 13, 2024
1 parent b9b698f commit 33ac2e8
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions src/deadline/cinema4d_adaptor/Cinema4DClient/cinema4d_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,22 @@ def __init__(self, map_path: Callable[[str], str]) -> None:
self.take = "Main"
self.map_path = map_path

def _remap_assets(self) -> None:
asset_list: list[Dict[str, Any]] = []
c4d.documents.GetAllAssetsNew(
self.doc, allowDialogs=False, lastPath="", assetList=asset_list
)
for asset in asset_list:
asset_owner = asset.get("owner")
asset_param_id = asset.get("paramId")
if asset_owner and asset_param_id:
asset_owner[asset_param_id] = self.map_path(asset.get("filename", ""))

def start_render(self, data: dict) -> None:
self.doc = c4d.documents.GetActiveDocument()
self.render_data = self.doc.GetActiveRenderData()
self.render_data[c4d.RDATA_FRAMESEQUENCE] = c4d.RDATA_FRAMESEQUENCE_MANUAL
frame = int(self.render_kwargs["frame"])
frame = int(self.render_kwargs.get("frame", data.get("frame")))
fps = self.doc.GetFps()
self.render_data[c4d.RDATA_FRAMEFROM] = c4d.BaseTime(frame, fps)
self.render_data[c4d.RDATA_FRAMETO] = c4d.BaseTime(frame, fps)
Expand All @@ -70,6 +81,8 @@ def start_render(self, data: dict) -> None:
self.render_data[c4d.RDATA_MULTIPASS_FILENAME]
)

self._remap_assets()

bm = bitmaps.MultipassBitmap(
int(self.render_data[c4d.RDATA_XRES]),
int(self.render_data[c4d.RDATA_YRES]),
Expand All @@ -96,14 +109,14 @@ def output_path(self, data: dict) -> None:
if output_path:
doc = c4d.documents.GetActiveDocument()
render_data = doc.GetActiveRenderData()
render_data[c4d.RDATA_PATH] = output_path
render_data[c4d.RDATA_PATH] = self.map_path(output_path)

def multi_pass_path(self, data: dict) -> None:
multi_pass_path = data.get("multi_pass_path", "")
if multi_pass_path:
doc = c4d.documents.GetActiveDocument()
render_data = doc.GetActiveRenderData()
render_data[c4d.RDATA_MULTIPASS_FILENAME] = multi_pass_path
render_data[c4d.RDATA_MULTIPASS_FILENAME] = self.map_path(multi_pass_path)

def set_take(self, data: dict) -> None:
"""
Expand Down

0 comments on commit 33ac2e8

Please sign in to comment.