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