feat(engine): clip move, clip effect_input, mandatory static FFmpeg

- oakengine_sequence_move_clip implemented for real (oaktimeline
  TrackMoveBlockCommand; fixes the graph-ownership/gap-anchor/ripple
  trim bugs the stub was hiding); same-track via the frozen C ABI,
  cross-track supported by the module command
- oaknode clip blocks now declare a tex_in texture input and set
  effect_input to it, so timeline clips can host effect chains; facade
  test covers effect insert/remove on a real clip
- oakffmpeg-link: FFMPEG_DIR is now mandatory with a clear panic (a
  Homebrew upgrade left the system ffmpeg .pc pointing at a deleted
  dav1d Cellar path, breaking links); reads a git-ignored workspace
  .env for IDEs that cannot inject env vars (RustRover); links the C++
  stdlib for C++ codec libs (svt-av1)
- oakengine re-exports oaknode so tests share one crate instance;
  it_node uses the direct instance's value type where it calls the
  module FFI (the --workspace dev-dependency feature split builds
  oaknode twice)
This commit is contained in:
2026-08-11 23:04:48 +08:00
parent a209f63d52
commit 18ff60f147
351 changed files with 32880 additions and 15939 deletions
+20 -15
View File
@@ -186,8 +186,11 @@ impl NodeBehavior for MathNode {
/// single-string return carries only the fragment shader
/// (`// CPP-PARITY: math.cpp` `get_shader_code`).
fn shader_code(&self, request: &str) -> Option<String> {
let (frag, _vert) =
super::mathbase::MathNodeBase::shader_code_internal(request, PARAM_A_INPUT, PARAM_B_INPUT);
let (frag, _vert) = super::mathbase::MathNodeBase::shader_code_internal(
request,
PARAM_A_INPUT,
PARAM_B_INPUT,
);
if frag.is_empty() {
None
} else {
@@ -216,12 +219,10 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
crate::value::NodeValue::Combo(0),
);
method.flags |= crate::input::flags::NOT_CONNECTABLE | crate::input::flags::NOT_KEYFRAMABLE;
method.properties = vec![
(
"combobox_strings".to_string(),
crate::value::NodeValue::Binary(OPERATION_NAMES.concat().into_bytes()),
),
];
method.properties = vec![(
"combobox_strings".to_string(),
crate::value::NodeValue::Binary(OPERATION_NAMES.concat().into_bytes()),
)];
core.add_input(method);
let mut a = crate::input::Input::new(
@@ -230,11 +231,11 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
crate::value::NodeValue::Float(0.0),
);
a.properties = vec![
("decimalplaces".to_string(), crate::value::NodeValue::Int(8)),
(
"decimalplaces".to_string(),
crate::value::NodeValue::Int(8),
"autotrim".to_string(),
crate::value::NodeValue::Boolean(true),
),
("autotrim".to_string(), crate::value::NodeValue::Boolean(true)),
];
core.add_input(a);
@@ -244,11 +245,11 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
crate::value::NodeValue::Float(0.0),
);
b.properties = vec![
("decimalplaces".to_string(), crate::value::NodeValue::Int(8)),
(
"decimalplaces".to_string(),
crate::value::NodeValue::Int(8),
"autotrim".to_string(),
crate::value::NodeValue::Boolean(true),
),
("autotrim".to_string(), crate::value::NodeValue::Boolean(true)),
];
core.add_input(b);
@@ -341,7 +342,11 @@ mod tests {
core.set_standard_value(METHOD_INPUT, -1, NodeValue::Combo(4));
assert_eq!(n.operation(&core), super::super::mathbase::Operation::Power);
core.set_standard_value(METHOD_INPUT, -1, NodeValue::Combo(99));
assert_eq!(n.operation(&core), super::super::mathbase::Operation::Power, "clamped");
assert_eq!(
n.operation(&core),
super::super::mathbase::Operation::Power,
"clamped"
);
}
#[test]