diff --git a/Templates/大鱼人像美化/Drop Zone.tiff b/Templates/大鱼人像美化/Drop Zone.tiff new file mode 100644 index 0000000..6d15c98 Binary files /dev/null and b/Templates/大鱼人像美化/Drop Zone.tiff differ diff --git a/Templates/大鱼人像美化/PARAMETERS.json b/Templates/大鱼人像美化/PARAMETERS.json index 314d730..e83652a 100644 --- a/Templates/大鱼人像美化/PARAMETERS.json +++ b/Templates/大鱼人像美化/PARAMETERS.json @@ -488,5 +488,15 @@ "value": "", "published": false } - ] + ], + "effectSource": { + "object": "510000004", + "sourceMediaChannel": "./1/324/300", + "clip": "510000006", + "footage": "510000007", + "type": 3, + "dropZone": 1, + "path": "Drop Zone.tiff", + "resourceBundled": true + } } diff --git a/Templates/大鱼人像美化/README.md b/Templates/大鱼人像美化/README.md index 2b1dddb..e49bff8 100644 --- a/Templates/大鱼人像美化/README.md +++ b/Templates/大鱼人像美化/README.md @@ -11,7 +11,7 @@ - 保留磨皮、肤色、细节、脸型、人脸选择与跟踪、蒙版与输出六个原生 FxPlug 参数组,发布46项可见功能参数,包括前向/后向分析及清除按钮。 - 目标1–3的隐藏分析数据以参数60/61/62保留在滤镜节点中,不发布成用户控件;分析完成后由插件写入宿主参数并随工程保存。 - 选脸位置发布为原生二维参数,并启用滤镜的“发布 OSC”宿主通道。跟踪按钮、OSC与工程关闭重开后的数据恢复须由实际 FCP 验证。 -- 画面只含一个标准 Effect Source(Type=3),供 FCP 使用当前时间线片段;没有外部素材、旧 Drop Zone.tiff 引用、媒体路径、旧滤镜或动画。Motion中效果源没有示例照片属于无媒体模板的预期状态,FCP应使用被应用的片段。 +- 画面只含一个标准 Effect Source(Type=3、Drop Zone=1),其 Source Media 指向 clip `510000006`,clip 位于 footage `510000007`。`pathURL=Drop Zone.tiff` 为模板同目录内的相对引用,标准1200×1200占位图已随模板附带,没有外部安装目录依赖、示例人像、旧滤镜或新动画。FCP时间线片段的实际替换仍须原生验收。 - 作者与网站为两个原生空绑定展示菜单,不改变渲染。 建议模板安装位置:`~/Movies/Motion Templates.localized/Effects.localized/Dayu/大鱼人像美化/`。APP正式安装与模板安装、Motion/FCP原生验收由主任务处理。 @@ -20,6 +20,14 @@ Apple项目、群组、Effect Source和滤镜节点骨架来源于用户自有“大鱼去黑.moef”;仅保留这些原生结构,已替换滤镜UUID、名称、版本和全部功能参数。FxPlug组/字符串/点参数的原生结构交叉参照自有Number与Zoom and Pan样本;作者/网站空绑定来自ae-to-motion技能的原生版权样本。 -`PARAMETERS.json`逐项记录参数ID、组、发布通道及初始值;`VALIDATION.json`记录本次静态核验。48个发布路径(46功能+2信息)均能反查实际对象和通道,实体ID无冲突,三个隐藏数据通道未发布,无外部素材,保存选择状态为0个内容对象且焦点为项目。技能`motion_selection.py check`与`audit_motion.py --require-no-selection`通过。 +`PARAMETERS.json`逐项记录参数ID、组、发布通道及初始值;`VALIDATION.json`记录本次静态核验。48个发布路径(46功能+2信息)均能反查实际对象和通道,实体ID无冲突,三个隐藏数据通道未发布;必要占位媒体以相对路径随包附带,保存选择状态为0个内容对象且焦点为项目。技能`motion_selection.py check`与`audit_motion.py --require-no-selection`通过。 上述结果只证明结构、发布引用和保存状态;Motion实际加载、FCP面板控制、按钮/OSC路由及保存重开由主任务继续验证,不能用XML解析通过代替原生验收。 + +## 前版输入链错误与本次修复 + +前版生成稿(SHA256 `3b7984e11a92487834ab67121fd3814bf13c22b77a70851298efa84206f91478`)将效果源的 Source Media 设为0,并删除了原生clip/footage。用户在FCP应用后实测整幅黑屏。这是模板装配错误;保留Type=3本身并不能证明FCP输入替换链完整。此前XML解析、发布路径和无缺媒体检查通过,也没有覆盖真实FCP画面输入,不能当作该模板已经可用的证据。 + +本次仅恢复标准效果源clip/footage和Source Media关联,并随包加入标准`Drop Zone.tiff`;滤镜算法、49个插件参数、48个发布入口、Type=3/Drop Zone=1及版本1.0.1均保留。该占位图从Apple Motion的Ozone.framework标准资源复制,实际运行只引用本模板内的相对副本。图像SHA256为 `a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e`,420128字节。 + +本次已经静态核验Source Media→clip→相对文件链存在、文件字节一致、48项发布仍解析、隐藏数据未发布和保存选择状态;修复后的FCP新增实例、输入替换、Mix=0直通及实际人像渲染需由主任务重新实测。不得将“恢复链条”描述为已经通过FCP黑屏复测。 diff --git a/Templates/大鱼人像美化/VALIDATION.json b/Templates/大鱼人像美化/VALIDATION.json index 717f3d5..e21b241 100644 --- a/Templates/大鱼人像美化/VALIDATION.json +++ b/Templates/大鱼人像美化/VALIDATION.json @@ -1,13 +1,27 @@ { "version": "1.0.1", - "sha256": "3b7984e11a92487834ab67121fd3814bf13c22b77a70851298efa84206f91478", + "sha256": "2f7d1e0bf91a6dab82f5dde0a20d971a75abd2056a48104d861e9c112870aae4", "filterUUID": "FB14B0E6-59B2-4836-916F-CD0C559E9241", "publishedFunctionalControls": 46, "informationalControls": 2, "hiddenTrackingSlots": 3, "publishedPathsResolved": 48, - "externalMediaPaths": 0, "sourceType": 3, - "sourceMedia": 0, - "hostValidation": "Motion/FCP native load and interactivity pending parent agent verification" + "sourceMedia": "510000006", + "clip": "510000006", + "footage": "510000007", + "sourceResource": { + "relativePath": "Drop Zone.tiff", + "bytes": 420128, + "sha256": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e", + "origin": "Apple Motion Ozone.framework standard placeholder; copied into this template for relative reference" + }, + "inputChainRepair": { + "previousTemplateSHA256": "3b7984e11a92487834ab67121fd3814bf13c22b77a70851298efa84206f91478", + "previousSourceMedia": 0, + "previousFootageCount": 0, + "problem": "Previous generated template removed the standard source clip and could not establish the native effect-source input chain. XML/reference checks did not validate FCP timeline replacement.", + "change": "Restored the user-owned reference template clip/footage skeleton with new unique IDs; restored the Source Media link; bundled standard Drop Zone.tiff; filter, publications and Type=3/Drop Zone=1 preserved." + }, + "hostValidation": "Pending parent agent Motion/FCP validation after input-chain restoration; earlier XML checks did not prove input replacement." } diff --git a/Templates/大鱼人像美化/大鱼人像美化.moef b/Templates/大鱼人像美化/大鱼人像美化.moef index 36cc3f2..93e12d9 100644 --- a/Templates/大鱼人像美化/大鱼人像美化.moef +++ b/Templates/大鱼人像美化/大鱼人像美化.moef @@ -249,7 +249,7 @@ 4 - + @@ -407,5 +407,40 @@ + + + Drop Zone.tiff + 1200 + 1200 + 0.033333333333333333 + 1 + + 0 + + 0 + 524304 + + + + + + + + + 15 + + + + + + + + 0 + + 0 + 524304 + + + diff --git a/beatygril/beatygril/Plugin/Info.plist b/beatygril/beatygril/Plugin/Info.plist index 4de2cc0..c178bf6 100644 --- a/beatygril/beatygril/Plugin/Info.plist +++ b/beatygril/beatygril/Plugin/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.0.1 CFBundleVersion - 2 + 3 NSHumanReadableCopyright PlugInKit diff --git a/beatygril/beatygril/Plugin/beatygrilPlugIn.m b/beatygril/beatygril/Plugin/beatygrilPlugIn.m index 2d70c35..f6e9dd5 100644 --- a/beatygril/beatygril/Plugin/beatygrilPlugIn.m +++ b/beatygril/beatygril/Plugin/beatygrilPlugIn.m @@ -6,6 +6,13 @@ #import #import #import +#import + +static os_log_t PGRenderLog(void) { + static os_log_t log; static dispatch_once_t once; + dispatch_once(&once, ^{ log=os_log_create("com.dayu.beatygril", "render"); }); + return log; +} typedef struct { UInt32 identifier; const char *name; size_t offset; float min, max, step; BOOL percent; } PGSlider; #define PGS(ID, NAME, FIELD, MIN, MAX, STEP, PERCENT) {ID, NAME, offsetof(PGBeautySettings, FIELD), MIN, MAX, STEP, PERCENT} @@ -40,6 +47,7 @@ static const PGSlider PGSliders[] = { #undef PGS static BOOL PGFail(NSError **error, NSString *message) { + os_log_error(PGRenderLog(), "%{public}@", message); if (error) *error = [NSError errorWithDomain:FxPlugErrorDomain code:kFxError_InvalidParameter userInfo:@{NSLocalizedDescriptionKey:message}]; return NO; @@ -68,6 +76,7 @@ static CIImage *PGImageFromTile(FxImageTile *tile) { @property BOOL analyzing; @property BOOL analysisForward; @property (strong) NSArray *loadedTracks; +@property BOOL reportedRender; @end @implementation beatygrilPlugIn @@ -214,6 +223,17 @@ static CIImage *PGImageFromTile(FxImageTile *tile) { PGBeautySettings s;[plist[@"settings"] getBytes:&s length:sizeof(s)]; if(s.version!=1) return PGFail(error,@"此版本不支持保存的渲染状态。"); CIImage *input=PGImageFromTile(sources.firstObject); if(!input) return PGFail(error,@"无法读取 IOSurface。"); + @synchronized(self) { + if(!_reportedRender) { + _reportedRender=YES; + IOSurfaceRef src=(__bridge IOSurfaceRef)sources.firstObject.ioSurface; + IOSurfaceRef dst=(__bridge IOSurfaceRef)destination.ioSurface; + FxRect a=sources.firstObject.tilePixelBounds,b=destination.tilePixelBounds; + os_log(PGRenderLog(), "source format=%u %zux%zu bytes=%zu planes=%zu origin=%lu bounds=%d,%d,%d,%d extent=%{public}@; destination format=%u %zux%zu bytes=%zu planes=%zu origin=%lu bounds=%d,%d,%d,%d; midtone=%f mix=%f mask=%u", + IOSurfaceGetPixelFormat(src),IOSurfaceGetWidth(src),IOSurfaceGetHeight(src),IOSurfaceGetBytesPerElement(src),IOSurfaceGetPlaneCount(src),(unsigned long)sources.firstObject.imageOrigin,a.left,a.bottom,a.right,a.top,NSStringFromRect(input.extent), + IOSurfaceGetPixelFormat(dst),IOSurfaceGetWidth(dst),IOSurfaceGetHeight(dst),IOSurfaceGetBytesPerElement(dst),IOSurfaceGetPlaneCount(dst),(unsigned long)destination.imageOrigin,b.left,b.bottom,b.right,b.top,s.midtoneDetail,s.mix,s.showMask); + } + } CIContext *context=[self contextForTile:destination]; if(!context) return PGFail(error,@"没有可用的 Metal 图形设备。"); CIImage *output=nil; CIImage *overlay=nil; @synchronized(_faceProcessor) { @@ -226,10 +246,12 @@ static CIImage *PGImageFromTile(FxImageTile *tile) { } _loadedTracks=[tracks copy]; } - PGFaceFrame *frame=[_faceProcessor processImage:input settings:s time:time error:error]; - if(!frame) return NO; + NSError *stageError=nil; + PGFaceFrame *frame=[_faceProcessor processImage:input settings:s time:time error:&stageError]; + if(!frame) { os_log_error(PGRenderLog(), "face processing failed: %{public}@",stageError); if(error)*error=stageError; return NO; } PGBeautySettings beauty=s; beauty.mix=1; - output=[_beautyRenderer processImage:frame.image settings:beauty skinMask:frame.skinMask teethMask:frame.teethMask eyeMask:frame.eyeMask error:error]; + output=[_beautyRenderer processImage:frame.image settings:beauty skinMask:frame.skinMask teethMask:frame.teethMask eyeMask:frame.eyeMask error:&stageError]; + if(!output) { os_log_error(PGRenderLog(), "beauty processing failed: %{public}@",stageError); if(error)*error=stageError; return NO; } overlay=frame.overlayImage; } if(!output) return NO; diff --git a/beatygril/beatygril/Wrapper Application/Info.plist b/beatygril/beatygril/Wrapper Application/Info.plist index 16fb060..c55ff47 100644 --- a/beatygril/beatygril/Wrapper Application/Info.plist +++ b/beatygril/beatygril/Wrapper Application/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.0.1 CFBundleVersion - 2 + 3 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright