From 9cfdf3d947cb88b68bb4e58705647f34731961d8 Mon Sep 17 00:00:00 2001 From: KINDNICK Date: Sun, 16 Aug 2026 01:33:54 +0900 Subject: [PATCH] release(camera-ai): publish 0.4.13 radial bounds fix --- CameraAI~/CHANGELOG.md | 9 +++ .../Documentation~/EXTERNAL_INSTALLATION.md | 4 +- CameraAI~/README.md | 2 +- .../Tools~/CWCameraWorker/CWCameraWorker.exe | 4 +- .../CWCameraWorker/_internal/base_library.zip | Bin 1333490 -> 1333490 bytes .../cw_camera_worker_build_identity.json | 14 ++-- .../CameraDirector/cw_camera_runtime.py | 2 +- .../CameraDirector/generate_hybrid.py | 60 ++++++++++------ .../CameraDirector/trajectory_quality.py | 67 ++++++++++++++++-- .../_internal/wheel-0.45.1.dist-info/RECORD | 2 +- ...w_camera_worker_distribution_manifest.json | 10 +-- CameraAI~/package.json | 2 +- README.md | 2 +- 13 files changed, 130 insertions(+), 48 deletions(-) diff --git a/CameraAI~/CHANGELOG.md b/CameraAI~/CHANGELOG.md index 8d259e9..c75e635 100644 --- a/CameraAI~/CHANGELOG.md +++ b/CameraAI~/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.4.13 - 2026-08-16 + +- Enforced radial distance bounds on the actual float32 camera coordinates, + preventing oblique wide-shot plateaus from drifting a few micrometres past + their authored safety annulus during publication. +- Made a final distance postcondition failure reject only that camera + candidate while preserving fail-closed handling for real generator + invariants. Rebuilt the self-contained Windows worker as 0.1.9. + ## 0.4.12 - 2026-08-16 - Made packaged catalog freshness checks portable across Windows Git diff --git a/CameraAI~/Documentation~/EXTERNAL_INSTALLATION.md b/CameraAI~/Documentation~/EXTERNAL_INSTALLATION.md index 4777f98..c9e11b2 100644 --- a/CameraAI~/Documentation~/EXTERNAL_INSTALLATION.md +++ b/CameraAI~/Documentation~/EXTERNAL_INSTALLATION.md @@ -17,7 +17,7 @@ must remain together. In Unity Package Manager, choose **Add package from git URL** and enter: ```text -https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.18 +https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.19 ``` The initial package download is large because the frozen Windows worker is @@ -26,7 +26,7 @@ it, remove the package lock entry, and add the package again. ## Reference data -Version 0.1.18 includes a compact, read-only `RuntimeData~` bundle with the +Version 0.1.19 includes a compact, read-only `RuntimeData~` bundle with the 263 prepared reference songs, cut policy, and ranker model. An artist workstation does not need a separate `CW-AI` checkout or Python installation. If a newer access-controlled library is available, it remains an optional diff --git a/CameraAI~/README.md b/CameraAI~/README.md index b4741b2..52bca8d 100644 --- a/CameraAI~/README.md +++ b/CameraAI~/README.md @@ -16,7 +16,7 @@ Cinemachine Track이나 기존 카메라 애니메이션은 필요하지 않으 Unity Package Manager의 `Add package from git URL`에는 다음 주소를 사용할 수 있습니다. -`https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.18` +`https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.19` 배포 패키지에는 Windows x64용 `CWCameraWorker` 폴더 전체가 포함됩니다. Python은 따로 설치하지 않아도 되지만, Git 패키지의 대용량 바이너리를 받으려면 diff --git a/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe b/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe index 2b9b29f..8c3d527 100644 --- a/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe +++ b/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:559fb67e5dee12cedb0daf1a1f900460fbcf3ff51ece0e826da6ff353506d2ac -size 16785090 +oid sha256:7cdbaaba556b54215c77f2c64b4005df55e94e8a7feaeff06def5cd6e9449f21 +size 16785940 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/base_library.zip b/CameraAI~/Tools~/CWCameraWorker/_internal/base_library.zip index 93de45bd13e8c02d8c3d5a57e82e581fa6bbaf2c..613fe6d393a7af6723266ca35008d9ab21cc3eb0 100644 GIT binary patch delta 2162 zcmYjS4Nz3q72bXKz5RRavb)~$vltQ6bgV5u3y3T(KP&740#!kTjETD7hES4)g2re_ zr^F+W>enLGP^ z=Y8*6&YlZIv`zSbs1PcZ55>z+rk!Ti;~e!nM6%Yi4V! zuf%rk?LNKJs-50xn>ACL-tXvl1ZxNcO~r4cB*T(6|y>l}Jz zBb|u_o|SR3K}o`hhoby^lZ-Ds+{ZpYB;%)f^6fk@GTc=J9+c z{ar@Jd|tvfU6HYFKKHYPNg02fPm%7rD?|3u;SO3*?&W?dGalQBv)??ZV20U{fG@q| z?%(MOlJe=rHm`!~DTXBcGM~)%$`l;PC-s3&1(W#{#qf&?vI{7RncEdSCBW|83Wf#v z=zxN61z0t#z*|Ta@Q*6+r5UGTTOm(pZ=a2_^dWC#e>%j<#D<)DEj*v%+DVBX33>Ylo)6h`LIFHp-vFPV^8L<`0o{Ho?TZ%- zc+b!0vxW%+J{dD6;DG=ouIEbw76vFe&EFdEa)5iKG70AbyhzHhAhwkIq$DS*ONlcV zcF;e&o?^turBvb1er&|5SW^<-%B27*;!Sq^vy5BVCASexWmL64d5q{6V4u&3s{(8- zH)2jXfh)B}v*tOG$8v<0FH6m>xFOV8_2rs0sU{AIQhsnT>K5oLK07u?5 zA+v(O_+L!u5MYchjqkdd<8%cbDmmAT+roUl*^Hb@0*^gq#>8?9M{gxPpFCj3urL>Y zYQ{GNq!Uhfs>s*(0Slg~q9^^G7W`g-hD{dS6=38w3krTl;IHErEFMsK!{q&Hz~5oNTO!?c((Dy68XSWJrNQ&s%e8AB~n z-2YH=%+#H~@u)a2R4oA&jwJ*>tyWPZK*mZHuL*Eshl-B{NO)UCVl{z3{7%L4YKkZR zgo-z+$=kYd6_={1;(ITuNEwYufVYNng3BtJYv@B+e@(@{8mjNlzg96>L&<5@!M&9G zVs!49|F<&?)KdGUF*G&AfzlY9q&6-FlgsqnRv};eWTd^*aB``-ajUMewQYTSs0puR z(=13DWw8m7t}gnz@-M5dqdl~;vGvKe=IFSn7A=1J7gn@pl1Cb5E<>SY(}mX{Ig2NN zM%vU6>K?b@=2D)BLo|@sl};Pp&!SmSD5gn$pAC;J<4K^QH}#zh6|rcnr5t@#8H*dR zCgNS1cF3TJ*>^2=RMnB=HQ+ZeX%)~s&}MWU>T{s4X<0-K0)Vrv$kiSNbf0)8hFv&aceS(j?+b?TZz g;ZS>XW8{c5a9zeTeNK@Ybh=4LbJvcC>-p>d1E3U~?*IS* delta 2135 zcmYjS3s98T72e&u|Nrl@|31CERw)l-Oss%NkT=U~d59tiET$=uhbuTzprEP9pb)Lt z7>P_%KTXF{nwU_HQaUETF%1KbmD(iM)K({^(?*kMTAQwQCe_Sn?YXcsWoPc}_npT* z=bm%_d+v@`-W{(TxIXI8u8%rxZQ96});A-yO%Dx^8wU;ys@j1;>y8Yq+Uq*&9k<2S zX@M}8KLMw!xkEGb+BQ6)&AVwGG-&6ZH5~ofK%j@wGSZT0$+Q$&CR%1%AzGlva`AoK zt|8}=UUi4*I757B=Nw#GP`!K%;AdJl~|`G*6Fv$Ya5T+`d`=5j_F@K zg^+dR`sGpAE`zq(V2jwOnOhxu4VvwORf^KyD^@QT;r%2sdFKWF&S>o=J*(e7uzA#_ zZ62L>YA@n^+|6`49Xvjs&h)S8(BtD-?4#2j1I{mO$@hI4< zg;SdzORM>}(7T-2n*(~hvYanKQx&m4?$e{MibsNq4*ruGe++M2r(w{AsV z8h4{Rnfy9-8<9B7B5*R9FJaDMBQCweI0AwVyS%kI9IG06P?ARtl&L;41w~P`2 zl7?j5IWC1_IGbE2j>z~Ro9D1skIKmVSel2J9G=J?jR%=uu;(XcSOms$$mQnmgSvpw zwO^GH>!Blj@L5pY?IH0KcYJ{V_@OilF=e^U_cbpJ{^LM|yh+>F1Z2 zkX1tB`#mP~3UGYfgb4wrzA*iy&&07PneOw#Qc)MT8M&pTa+RCWFMxBG8JCWb(Unr# zY_VnrTgh__kKIPWO1e6|Q6cyt30VA^5S$m_+%q9i$_T6(3PFhgBfkwn{ikM*BV~Mv zA>uwRl#%CmmRew0MQXXxf>i=cwpp-WfXE&TE((x5W`TV*fn)DlP$9tA(-sV^CinI~ zS#Vi^+n-txTFyO&^DjAl!A8&26 ziuG$~vkTuQD*_cy``iv&4WEBdy!cmN za3E?qUnB;jTWRt*bzL;KcKT={tfXlY@}E4Xu5C+4!=F&AZVk(nTe4C%+L!67zl MMx&Naw2mMC9|=l`a{vGU diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_runtime/cw_camera_worker_build_identity.json b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_runtime/cw_camera_worker_build_identity.json index aca3a58..9650ed7 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_runtime/cw_camera_worker_build_identity.json +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_runtime/cw_camera_worker_build_identity.json @@ -1,7 +1,7 @@ { "schemaVersion": "cw-camera-worker-build-identity-v1", - "workerVersion": "0.1.8", - "createdUtc": "2026-08-15T15:56:01.810396+00:00", + "workerVersion": "0.1.9", + "createdUtc": "2026-08-15T16:31:20.228140+00:00", "python": "3.12.13", "sourceRootRelative": "cwai_sources/repository", "sourceSha256": { @@ -10,9 +10,9 @@ "MachineLearning/CameraDirector/camera_kinematics.py": "e94eefcb56c4ebdccbc57ae8d3650109b2c912e3642892ac13add9409db21a7f", "MachineLearning/CameraDirector/camera_runtime_data.py": "8ef2e84a9d79b24c3f3232b1f18da49741988765044dffc6075f6e6dd5ff001d", "MachineLearning/CameraDirector/cw_camera_cli.py": "b523fdf6820b3b203dcdef80877a6ad9576fba41d7285c790c300e1813789012", - "MachineLearning/CameraDirector/cw_camera_runtime.py": "5cc252ff45b2a80dffbeea14ad37013ba4a428c4f6fe31a617957eec6c823429", + "MachineLearning/CameraDirector/cw_camera_runtime.py": "83968ed0b952a6ecf4673d31070deea677fff712c0dcae21878d527d0e67b7d4", "MachineLearning/CameraDirector/data_driven_cut_planner.py": "36cf86a80577278d2e966cb0ebf7c3110b5b1dda5abd1d8a6b0a76e31d10e32b", - "MachineLearning/CameraDirector/generate_hybrid.py": "bd37744b7b6573bf14be4f0ec5202f1465e11bff71ccabec210533e135b546c3", + "MachineLearning/CameraDirector/generate_hybrid.py": "af94ea04f1a05f9248086790293d88e7cb2b9d0123d6e126ab275c87b9022760", "MachineLearning/CameraDirector/hybrid_candidate_cache.py": "a0a5b6a8f612f18cb2875394f17ed89950e1e62e38c1226457d9e35848f6e380", "MachineLearning/CameraDirector/hybrid_cut_reference.py": "306e650dc193fd0d9c42fd52d3f14eef112d1a0da2a27c13b88256d42d8542aa", "MachineLearning/CameraDirector/hybrid_preparation_cache.py": "e4d062a48cf39e01ea97951d103a37817c860e94f440f49f080c622b4969fb5a", @@ -20,11 +20,11 @@ "MachineLearning/CameraDirector/planner.py": "8575788c0ff1e984f8238354dcd6de2dab9f62afeb71fa4b77ebfc7c66400372", "MachineLearning/CameraDirector/shot_features.py": "fd912b00320ea53ca682c010de6ed1102edcd021ceb4822a5785033a500786fe", "MachineLearning/CameraDirector/train.py": "070d1c4159c56a2107ae0d383ab0b716b12c13186d45383e94b83d3ba6305d03", - "MachineLearning/CameraDirector/trajectory_quality.py": "20cd2ddc1b2349f8c33f6d1460580f37964a521eaa86ceee5b8ae457512ba49d" + "MachineLearning/CameraDirector/trajectory_quality.py": "3d2c0a1b6eff8d629dff4211aec38b46c8fd450220f72a31e91f015cd3cc8565" }, "preparationLogicIdentifier": "1cb808e207d54854267a1020a658812c79e9bad5a5296f78140228b3a15eeb3b", - "candidateLogicIdentifier": "e768283e8496360ff703b5135f85c51520a888787612b15456def131d5ee1d89", - "generationCodeIdentifier": "80e9eeca5aed9e17a9cfb61b235f954ed4eb24308a1a1ca962e424dbb54bea88", + "candidateLogicIdentifier": "b3479b263b24f1419ee1221527878df73b6cf82addb5683753f6e26da632f640", + "generationCodeIdentifier": "9d4c7b2d8192f5185ef6ee96378774ffd1365cdc9df0e4b7c7a934b199d4c66b", "generationCodeFiles": [ "adjacent_transition.py", "camera_kinematics.py", diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/cw_camera_runtime.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/cw_camera_runtime.py index 5f44c70..ffa2329 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/cw_camera_runtime.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/cw_camera_runtime.py @@ -19,7 +19,7 @@ from typing import Any, Iterable BUILD_IDENTITY_SCHEMA_VERSION = "cw-camera-worker-build-identity-v1" BUILD_IDENTITY_FILE = "cw_camera_worker_build_identity.json" -WORKER_VERSION = "0.1.8" +WORKER_VERSION = "0.1.9" def is_frozen_runtime() -> bool: diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py index 4e76beb..04b7789 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py @@ -167,7 +167,8 @@ CANDIDATE_CACHE_STAGE_VERSIONS = { "adjacent-transition-v3-no-forced-side-alternation" ), "trajectoryRetargeting": ( - "retarget-v28-speed-adaptive-final-radial-post-kinematic-audit-" + "retarget-v29-float32-bound-speed-adaptive-final-radial-post-kinematic-" + "audit-" "residual-dynamics-semantic-exact-tracking-causal-entry-minimum-jerk" ), "compositionSafety": ( @@ -181,7 +182,8 @@ CANDIDATE_CACHE_STAGE_VERSIONS = { "sequenceContinuation": SEED_VARIATION_SEQUENCE_CONTEXT_POLICY, } TRAJECTORY_RETARGETING_VERSION = ( - "c2-position-speed-adaptive-final-radial-post-kinematic-audit-v15" + "c2-position-float32-bound-speed-adaptive-final-radial-post-kinematic-" + "audit-v16" ) TEMPLATE_MOTION_SMOOTHING_VERSION = ( "savgol61-nearest-edge-step-guard-v1" @@ -416,6 +418,10 @@ class ShotControl: body_follow_strength: float = DEFAULT_BODY_FOLLOW_STRENGTH +class CandidateRetargetSafetyRejection(RuntimeError): + """A candidate-local publishability failure that permits trying another rank.""" + + @dataclass(frozen=True) class RealizedShotState: template: ShotTemplate @@ -6868,7 +6874,9 @@ def retarget_template_to_shot( <= smooth_maximum_distance + 1e-6 ) if not final_distance_bounds_passed: - raise RuntimeError("Final camera distance audit violated its bounds.") + raise CandidateRetargetSafetyRejection( + "Final camera distance audit violated its bounds." + ) radial_distance_clamp_metrics = { **final_radial_distance_clamp_metrics, "initialPass": initial_radial_distance_clamp_metrics, @@ -8444,25 +8452,28 @@ def evaluate_safe_candidate_pool( safety_distance_scale: float = 1.0, *, cache_eligible: bool, - ) -> dict: - candidate_result = retarget_template_to_shot( - candidate_template, - previous, - target, - joints, - root, - start, - end, - target_aspect_ratio, - effective_composition, - body_follow_strength=control.body_follow_strength, - body_follow_smoothing_seconds=body_follow_smoothing_seconds, - body_follow_dead_zone_meters=body_follow_dead_zone_meters, - distance_meters=control.distance_meters, - motion_intensity=effective_motion_intensity, - safety_distance_scale=safety_distance_scale, - front_facing_reference=front_facing_reference, - ) + ) -> dict | None: + try: + candidate_result = retarget_template_to_shot( + candidate_template, + previous, + target, + joints, + root, + start, + end, + target_aspect_ratio, + effective_composition, + body_follow_strength=control.body_follow_strength, + body_follow_smoothing_seconds=body_follow_smoothing_seconds, + body_follow_dead_zone_meters=body_follow_dead_zone_meters, + distance_meters=control.distance_meters, + motion_intensity=effective_motion_intensity, + safety_distance_scale=safety_distance_scale, + front_facing_reference=front_facing_reference, + ) + except CandidateRetargetSafetyRejection: + return None candidate_result["candidateRank"] = candidate_rank candidate_result["selectionScore"] = candidate_selection_score( candidate_result, @@ -8569,6 +8580,11 @@ def evaluate_safe_candidate_pool( ) if not seed_variation_needs_more_candidates(safe_results): break + + if not candidate_results: + raise CandidateRetargetSafetyRejection( + "All bounded retarget candidates failed their final safety audit." + ) else: safe_results = selectable_safe_candidate_results( candidate_results, diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/trajectory_quality.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/trajectory_quality.py index 3a9f5cd..e177c17 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/trajectory_quality.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/trajectory_quality.py @@ -16,7 +16,7 @@ import numpy as np TRAJECTORY_QUALITY_VERSION = "trajectory-quality-v2" C2_RESAMPLING_POLICY_VERSION = "clamped-cubic-c2-endpoint-speed-guard-v1" -RADIAL_CLAMP_POLICY_VERSION = "quintic-bound-identity-c2-speed-adaptive-v2" +RADIAL_CLAMP_POLICY_VERSION = "quintic-bound-identity-c2-speed-adaptive-v3" DYNAMICS_POLICY_VERSION = ( "camera-motion-stabilized-screen-residual-cost-hard-gate-v3" ) @@ -698,6 +698,59 @@ def smooth_radial_distance_clamp( ): raise RuntimeError("smooth radial clamp failed to enforce its bounds") + # The generated camera is published as float32. An oblique vector that is + # exactly on a radial plateau in float64 can acquire a norm a few ULPs past + # that plateau after its components are rounded independently. Audit and + # repair the actual published representation, not only the temporary + # float64 curve. The inward margin is microscopic (tens of micrometres at + # the largest supported radii) while remaining comfortably larger than the + # worst three-component float32 norm error. + published_result = result.astype(np.float32) + published_radii = np.linalg.norm( + published_result.astype(np.float64), + axis=1, + ) + bound_span = upper_bound - lower_bound + publication_margin = min( + bound_span * 0.25, + max( + 1e-6, + 16.0 + * float(np.finfo(np.float32).eps) + * max(1.0, abs(lower_bound), abs(upper_bound)), + ), + ) + lower_publication_violation = ( + (published_radii < lower_bound) if lower_bound > 0.0 else np.zeros( + len(published_radii), + dtype=bool, + ) + ) + upper_publication_violation = published_radii > upper_bound + if np.any(lower_publication_violation): + published_result[lower_publication_violation] = ( + directions[lower_publication_violation] + * (lower_bound + publication_margin) + ).astype(np.float32) + if np.any(upper_publication_violation): + published_result[upper_publication_violation] = ( + directions[upper_publication_violation] + * (upper_bound - publication_margin) + ).astype(np.float32) + publication_projection = ( + lower_publication_violation | upper_publication_violation + ) + published_radii = np.linalg.norm( + published_result.astype(np.float64), + axis=1, + ) + if np.any(published_radii < lower_bound - tolerance) or np.any( + published_radii > upper_bound + tolerance + ): + raise RuntimeError( + "smooth radial clamp failed to enforce float32 publication bounds" + ) + metadata: dict[str, object] = { "version": TRAJECTORY_QUALITY_VERSION, "policyVersion": RADIAL_CLAMP_POLICY_VERSION, @@ -724,13 +777,17 @@ def smooth_radial_distance_clamp( "directionFallbackFrameCount": direction_fallback_count, "minimumInputDistanceMeters": float(np.min(radii)), "maximumInputDistanceMeters": float(np.max(radii)), - "minimumOutputDistanceMeters": float(np.min(output_radii)), - "maximumOutputDistanceMeters": float(np.max(output_radii)), + "minimumOutputDistanceMeters": float(np.min(published_radii)), + "maximumOutputDistanceMeters": float(np.max(published_radii)), + "float32BoundaryProjectionFrameCount": int( + np.count_nonzero(publication_projection) + ), + "float32BoundaryProjectionMarginMeters": publication_margin, "maximumRadialAdjustmentMeters": float( - np.max(np.abs(mapped_radii - radii)) + np.max(np.abs(published_radii - radii)) ), } - return result.astype(np.float32), metadata + return published_result, metadata def _persistent_direction_reversals( diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/RECORD b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/RECORD index af7285f..8fbac67 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/RECORD +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/RECORD @@ -1,4 +1,4 @@ -../../Scripts/wheel.exe,sha256=9jTRWXNV9efL3HxLn6B_Q7zW31wwIW3r808tmvMnVhQ,108448 +../../Scripts/wheel.exe,sha256=33fhzLGTaJQ0McB6oI5dG_iQAgUgrifXlD5WqsCV_T4,108448 wheel-0.45.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 wheel-0.45.1.dist-info/LICENSE.txt,sha256=MMI2GGeRCPPo6h0qZYx8pBe9_IkcmO8aifpP8MmChlQ,1107 wheel-0.45.1.dist-info/METADATA,sha256=mKz84H7m7jsxJyzeIcTVORiTb0NPMV39KvOIYhGgmjA,2313 diff --git a/CameraAI~/Tools~/CWCameraWorker/cw_camera_worker_distribution_manifest.json b/CameraAI~/Tools~/CWCameraWorker/cw_camera_worker_distribution_manifest.json index 962419a..5f4ac9b 100644 --- a/CameraAI~/Tools~/CWCameraWorker/cw_camera_worker_distribution_manifest.json +++ b/CameraAI~/Tools~/CWCameraWorker/cw_camera_worker_distribution_manifest.json @@ -1,7 +1,7 @@ { "schemaVersion": "cw-camera-worker-distribution-build-v1", - "createdUtc": "2026-08-15T15:57:09.6006631Z", - "workerVersion": "0.1.8", + "createdUtc": "2026-08-15T16:32:26.2657601Z", + "workerVersion": "0.1.9", "protocolVersion": "1", "buildIdentitySchemaVersion": "cw-camera-worker-build-identity-v1", "buildEnvironment": { @@ -65,9 +65,9 @@ ], "payload": { "fileCount": 646, - "bytes": 267778040, - "executableSha256": "559fb67e5dee12cedb0daf1a1f900460fbcf3ff51ece0e826da6ff353506d2ac", - "buildIdentitySha256": "fe1e6e3fd8b22a4874bcf8dc5a93528f6e6aa359b42a6438bc0aba932f18a3bc", + "bytes": 267781759, + "executableSha256": "7cdbaaba556b54215c77f2c64b4005df55e94e8a7feaeff06def5cd6e9449f21", + "buildIdentitySha256": "de655829a299d6ec264217ae6c4a2ab2ec89821e4cffed8499c23b79caece1da", "sanityRange": { "minimumFileCount": 500, "maximumFileCount": 1000, diff --git a/CameraAI~/package.json b/CameraAI~/package.json index c390f1a..12f7c31 100644 --- a/CameraAI~/package.json +++ b/CameraAI~/package.json @@ -1,6 +1,6 @@ { "name": "com.mingle.cw-ai", - "version": "0.4.12", + "version": "0.4.13", "displayName": "Mingle Camera Work AI", "description": "Self-contained high-quality Unity Timeline camera generation with an embedded prepared reference library, per-shot editable clips, and A/B review tools.", "unity": "6000.0", diff --git a/README.md b/README.md index b4604fe..f0c7928 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Install **Git and Git LFS before opening Unity**, then use **Add package from git URL** with: ```text -https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.18 +https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.19 ``` The Camera AI package includes the complete Windows x64