From 1e7ba64b2c05ba6184dc9fc8e8b907d9ba8ed2df Mon Sep 17 00:00:00 2001 From: Friedrich Branschke <77884037+fbranschke@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:48:00 +0200 Subject: [PATCH 1/2] fix \#32 --- src/ffsplat/coding/scene_encoder.py | 13 ++++++++----- src/ffsplat/models/operations.py | 4 +++- src/ffsplat/models/transformations.py | 6 ++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/ffsplat/coding/scene_encoder.py b/src/ffsplat/coding/scene_encoder.py index 4e8e9d0..8ddec1a 100644 --- a/src/ffsplat/coding/scene_encoder.py +++ b/src/ffsplat/coding/scene_encoder.py @@ -182,11 +182,11 @@ def to_yaml_file(self, yaml_path: Path) -> None: @lru_cache -def process_operation(op: Operation, verbose: bool, decoding_ops: str) -> tuple[dict[str, Field], list[dict[str, Any]]]: +def process_operation(op: Operation, verbose: bool) -> tuple[dict[str, Field], list[dict[str, Any]]]: """Process the operation and return the new fields and decoding updates.""" if verbose: print(f"Encoding {op}...") - return op.apply(verbose=verbose, decoding_params_hashable=decoding_ops) + return op.apply(verbose=verbose) @dataclass @@ -205,9 +205,12 @@ def _encode_fields(self, verbose: bool) -> None: input_fields_params = op_params["input_fields"] for transform_param in op_params["transforms"]: op = Operation.from_json(input_fields_params, transform_param, self.fields, self.output_path) - new_fields, decoding_updates = process_operation( - op, verbose=verbose, decoding_ops=self.decoding_params.to_yaml() - ) + if op.transform_type != "write_file": + new_fields, decoding_updates = process_operation(op, verbose=verbose) + else: + new_fields, decoding_updates = op.apply( + verbose=verbose, decoding_params_hashable=self.decoding_params.to_yaml() + ) # if the coding_updates are not a copy the cache will be wrong for decoding_update in copy.deepcopy(decoding_updates): # if the last decoding update has the same input fields we can combine the transforms into one list diff --git a/src/ffsplat/models/operations.py b/src/ffsplat/models/operations.py index 73c801b..216fb5d 100644 --- a/src/ffsplat/models/operations.py +++ b/src/ffsplat/models/operations.py @@ -69,5 +69,7 @@ def to_json(self) -> dict[str, Any]: "params": self.params, } - def apply(self, verbose: bool, decoding_params_hashable: str) -> tuple[dict[str, "Field"], list[dict[str, Any]]]: + def apply( + self, verbose: bool, decoding_params_hashable: str | None = None + ) -> tuple[dict[str, "Field"], list[dict[str, Any]]]: return apply_transform(self, verbose=verbose, decoding_params_hashable=decoding_params_hashable) diff --git a/src/ffsplat/models/transformations.py b/src/ffsplat/models/transformations.py index de46609..8e9a02f 100644 --- a/src/ffsplat/models/transformations.py +++ b/src/ffsplat/models/transformations.py @@ -1473,13 +1473,15 @@ def get_dynamic_params(params: dict[str, Any]) -> list[dict[str, Any]]: def apply_transform( - parentOp: "Operation", verbose: bool, decoding_params_hashable: str + parentOp: "Operation", verbose: bool, decoding_params_hashable: str | None ) -> tuple[dict[str, "Field"], list[dict[str, Any]]]: transformation = transformation_map.get(parentOp.transform_type) if transformation is None: raise ValueError(f"Unknown transformation: {parentOp.transform_type}") elif transformation is WriteFile: - decoding_ops: list[dict[str, Any]] = yaml.load(decoding_params_hashable, Loader=yaml.SafeLoader)["ops"] + decoding_ops: list[dict[str, Any]] = [] + if decoding_params_hashable is not None: + decoding_ops = yaml.load(decoding_params_hashable, Loader=yaml.SafeLoader)["ops"] return transformation.apply( parentOp.params[parentOp.transform_type], parentOp, verbose=verbose, decoding_ops=decoding_ops ) From 87d1bed0924920ea7c1817c6e1f23b0714a00e85 Mon Sep 17 00:00:00 2001 From: fleischmann Date: Wed, 16 Jul 2025 15:18:39 +0200 Subject: [PATCH 2/2] typo, float version number --- src/ffsplat/conf/format/SOG-PlayCanvas.yaml | 4 ++-- src/ffsplat/models/transformations.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ffsplat/conf/format/SOG-PlayCanvas.yaml b/src/ffsplat/conf/format/SOG-PlayCanvas.yaml index 77ef7e7..81bdaeb 100644 --- a/src/ffsplat/conf/format/SOG-PlayCanvas.yaml +++ b/src/ffsplat/conf/format/SOG-PlayCanvas.yaml @@ -37,7 +37,7 @@ ops: - input_fields: [quaternions] transforms: - - reparametize: + - reparametrize: method: unit_sphere dim: -1 @@ -122,7 +122,7 @@ ops: - input_fields: [quats] transforms: - - reparametize: + - reparametrize: method: pack_quaternions to_fields_with_prefix: quats_packed_ dim: -1 diff --git a/src/ffsplat/models/transformations.py b/src/ffsplat/models/transformations.py index 8e9a02f..ef17e6e 100644 --- a/src/ffsplat/models/transformations.py +++ b/src/ffsplat/models/transformations.py @@ -432,7 +432,7 @@ def apply( "input_fields": [f"{to_fields_with_prefix}indices", f"{to_fields_with_prefix}values"], "transforms": [ { - "reparametize": { + "reparametrize": { "method": "unpack_quaternions", "from_fields_with_prefix": to_fields_with_prefix, "dim": -1, @@ -1114,7 +1114,7 @@ def apply( field_names = list(parentOp.input_fields.keys()) meta: dict[str, Any] = { "packer": "ffsplat", - "version": 1, + "version": 1.0, } # Readfile no input_fields for field_name in field_names: @@ -1457,7 +1457,7 @@ def get_dynamic_params(params: dict[str, Any]) -> list[dict[str, Any]]: "flatten": Flatten, "reshape": Reshape, "remapping": Remapping, - "reparametize": Reparametrize, + "reparametrize": Reparametrize, "to_field": ToField, "permute": Permute, "to_dtype": ToDType,