diff --git a/tests/core/steam/engine/node-base-test.cpp b/tests/core/steam/engine/node-base-test.cpp index 1d477bb35..5ec96dcfc 100644 --- a/tests/core/steam/engine/node-base-test.cpp +++ b/tests/core/steam/engine/node-base-test.cpp @@ -90,10 +90,10 @@ namespace test { verify_TurnoutSystem() { Time nomTime{rani(10'000),0}; // drive test with a random »nominal Time« <10s with ms granularity - TurnoutSystem invoker{nomTime}; // a time spec is mandatory, all further parameters are optional + TurnoutSystem turoSys{nomTime}; // a time spec is mandatory, all further parameters are optional - CHECK (invoker.getNomTime() == nomTime); // can access those basic params from within the render invocation. - CHECK (invoker.getProcKey() == ProcessKey{}); + CHECK (turoSys.getNomTime() == nomTime); // can access those basic params from within the render invocation. + CHECK (turoSys.getProcKey() == ProcessKey{}); /* == That's all required for basic usage. == */ @@ -108,14 +108,14 @@ namespace test { {// Build and connect extension storage block auto dataBlock = // ...typically placed locally into a nested stack frame spec.makeBlockBuilder() - .buildParamDataBlock(invoker); + .buildParamDataBlock(turoSys); - invoker.attachChainBlock (dataBlock); // link extension data block into the TurnoutSystem - CHECK (invoker.get(acc0) == someVal); // now able to retrieve data from extension block - invoker.detachChainBlock (dataBlock); + turoSys.attachChainBlock (dataBlock); // link extension data block into the TurnoutSystem + CHECK (turoSys.get(acc0) == someVal); // now able to retrieve data from extension block + turoSys.detachChainBlock (dataBlock); } // base block continues to be usable... - CHECK (invoker.getNomTime() == nomTime); + CHECK (turoSys.getNomTime() == nomTime); } diff --git a/tests/core/steam/engine/node-devel-test.cpp b/tests/core/steam/engine/node-devel-test.cpp index f6c30d5e0..a76752afb 100644 --- a/tests/core/steam/engine/node-devel-test.cpp +++ b/tests/core/steam/engine/node-devel-test.cpp @@ -410,7 +410,7 @@ namespace test { CHECK (not watch(nFilt).isSrc()); CHECK (watch(nSrc).getNodeSpec() == "Test:generate-◎"_expect ); CHECK (watch(nFilt).getNodeSpec() == "Test:manipulate◁—Test:generate-◎"_expect ); - CHECK (watch(nFilt).getPortSpec(0) == "manipulate(TestFrame)"_expect ); + CHECK (watch(nFilt).getPortSpec(0) == "manipulate(TestFrame)(TestFrame)"_expect ); // prepare to invoke this Node chain... BufferProvider& provider = DiagnosticBufferProvider::build(); @@ -468,7 +468,7 @@ namespace test { CHECK (watch(nS1).getNodeSpec() == "Test:generate-◎"_expect ); CHECK (watch(nS2).getNodeSpec() == "Test:generate-◎"_expect ); CHECK (watch(nMix).getNodeSpec() == "Test:combine┉┉{Test:generate}"_expect ); - CHECK (watch(nMix).getPortSpec(0) == "combine(TestFrame/2)"_expect ); + CHECK (watch(nMix).getPortSpec(0) == "combine(TestFrame/2)(TestFrame)"_expect ); // prepare to invoke this Node chain... BufferProvider& provider = DiagnosticBufferProvider::build(); diff --git a/tests/core/steam/engine/node-link-test.cpp b/tests/core/steam/engine/node-link-test.cpp index 152bd3ffa..d079f0d2b 100644 --- a/tests/core/steam/engine/node-link-test.cpp +++ b/tests/core/steam/engine/node-link-test.cpp @@ -21,8 +21,11 @@ #include "steam/engine/node-builder.hpp" #include "steam/engine/test-rand-ontology.hpp" #include "steam/engine/diagnostic-buffer-provider.hpp" -#include "lib/test/diagnostic-output.hpp"/////////////////TODO +#include "steam/asset/meta/time-grid.hpp" +#include "lib/time/timequant.hpp" +#include "lib/time/timecode.hpp" #include "lib/util.hpp" +#include "lib/test/diagnostic-output.hpp"/////////////////TODO #include @@ -35,6 +38,10 @@ namespace steam { namespace engine{ namespace test { + using lib::time::Time; + using lib::time::QuTime; + using lib::time::FrameNr; + using lib::time::FrameCnt; @@ -313,8 +320,9 @@ namespace test { } + /** @test TODO Invoke some render nodes as linked together - * @todo WIP 12/24 🔁 define ⟶ implement + * @todo WIP 2/25 🔁 define ⟶ ✔ implement */ void trigger_node_port_invocation() @@ -323,70 +331,134 @@ namespace test { auto testMan = testRand().setupManipulator(); auto testMix = testRand().setupCombinator(); -/* + ont::Flavr SRC_A = 10; + ont::Flavr SRC_B = 20; + + // Prepare for Time-Quantisation --> Frame-# or Offset parameter + Symbol SECONDS_GRID = "grid_sec"; + steam::asset::meta::TimeGrid::build (SECONDS_GRID, 1); + + + // Prepare a precomputed parameter for the complete tree + auto selectFrameNo = [&](TurnoutSystem& tuSys){ return FrameNr::quant (tuSys.getNomTime(), SECONDS_GRID); }; + auto paramSpec = buildParamSpec() + .addSlot (selectFrameNo); + + auto accFrameNo = paramSpec.makeAccessor<0>(); + + // Prepare mapping- and automation-functions + auto stepFilter = [] (FrameCnt id)-> ont::Param { return util::limited (10, -10 + id, 20); }; + auto stepMixer = [] (FrameCnt id)-> double { return util::limited (0, + id, 50) / 50.0; }; + + // note: binds the accessor for the precomputed FrameNo-parameter + auto autoFilter = [=](TurnoutSystem& tuSys){ return stepFilter (tuSys.get (accFrameNo)); }; + auto autoMixer = [=](TurnoutSystem& tuSys){ return stepMixer (tuSys.get (accFrameNo)); }; + + // A Node with two (source) ports ProcNode n1s{prepareNode("srcA") .preparePort() - .invoke("a(int)", src_op) - .setParam(5) + .invoke(testGen.procID(), testGen.makeFun()) // params(frameNo, flavour) + .closeParam<1>(SRC_A + 0) // --> flavour ≔ SRC_A + port#0 + .retrieveParam(accFrameNo) .completePort() .preparePort() - .invoke("b(int)", src_op) - .setParam(23) + .invoke(testGen.procID(), testGen.makeFun()) + .closeParam<1>(SRC_A + 1) // --> flavour ≔ SRC_A + port#1 + .retrieveParam(accFrameNo) .completePort() .build()}; - // A node to add some "processing" to each data chain - auto add1_op = [](int* src, int* res){ *res = 1 + *src; }; + // A node to »filter« the data in chain-A ProcNode n1f{prepareNode("filterA") .preparePort() - .invoke("a+1(int)(int)", add1_op) + .invoke(testMan.procID(), testMan.makeFun()) + .attachParamFun(autoFilter) // filter-param <-- autoFilter(frameNo) .connectLead(n1s) .completePort() .preparePort() - .invoke("b+1(int)(int)", add1_op) + .invoke(testMan.procID(), testMan.makeFun()) + .attachParamFun(autoFilter) .connectLead(n1s) .completePort() .build()}; - - // Need a secondary source, this time with three ports - ProcNode n2s{prepareNode("srcB") - .preparePort() - .invoke("a(int)", src_op) - .setParam(7) - .completePort() - .preparePort() - .invoke("b(int)", src_op) - .setParam(13) - .completePort() - .preparePort() - .invoke("c(int)", src_op) - .setParam(17) - .completePort() - .build()}; - // Wiring for the Mix, building up three ports - // Since the first source-chain has only two ports, - // for the third result port we'll re-use the second source + + // A secondary source Node, this time with three ports + ProcNode n2s{prepareNode("srcB") + .preparePort() + .invoke(testGen.procID(), testGen.makeFun()) // params(frameNo, flavour) + .closeParam<1>(SRC_B + 0) // --> flavour ≔ SRC_B + port#0 + .retrieveParam(accFrameNo) + .completePort() + .preparePort() + .invoke(testGen.procID(), testGen.makeFun()) + .closeParam<1>(SRC_B + 1) // --> flavour ≔ SRC_B + port#1 + .retrieveParam(accFrameNo) + .completePort() + .preparePort() + .invoke(testGen.procID(), testGen.makeFun()) + .closeParam<1>(SRC_B + 2) // --> flavour ≔ SRC_B + port#2 + .retrieveParam(accFrameNo) + .completePort() + .build()}; + + + // Wiring for the Mix, building three ports, + // drawing from both source-chains ProcNode mix{prepareNode("mix") .preparePort() - .invoke("a-mix(int/2)(int)", mix_op) + .invoke(testMix.procID(), testMix.makeFun()) + .attachParamFun(autoMixer) // mixer-param <-- autoMixer(frameNo) .connectLead(n1f) .connectLead(n2s) .completePort() .preparePort() - .invoke("b-mix(int/2)(int)", mix_op) + .invoke(testMix.procID(), testMix.makeFun()) + .attachParamFun(autoMixer) .connectLead(n1f) .connectLead(n2s) .completePort() .preparePort() - .invoke("c-mix(int/2)(int)", mix_op) - .connectLeadPort(n1f,1) + .invoke(testMix.procID(), testMix.makeFun()) + .attachParamFun(autoMixer) + .connectLeadPort(n1f,1) // note: using 2nd port from chain-A, which only has two ports .connectLead(n2s) .completePort() .build()}; -*/ - UNIMPLEMENTED ("operate some render nodes as linked together"); + + + // Set a »Param-Agent«-Node on top to pre-compute the FrameNo + ProcNode parNode{prepareNode("Param") + .preparePort() + .computeParam(paramSpec) + .delegateLead(mix) + .completePort() + .preparePort() + .computeParam(paramSpec) + .delegateLead(mix) + .completePort() + .preparePort() + .computeParam(paramSpec) + .delegateLead(mix) + .completePort() + .build()}; + + + BufferProvider& provider = DiagnosticBufferProvider::build(); + const BuffDescr buffDescr = provider.getDescriptorFor(sizeof(TestFrame)); + + auto invoke = [&](Time nomTime, uint port) + { // Sequence to invoke a Node... + BuffHandle buff = provider.lockBuffer(buffDescr); + CHECK (not buff.accessAs().isValid()); + buff = parNode.pull (port, buff, nomTime, ProcessKey{}); + HashVal checksum = buff.accessAs().getChecksum(); + buff.release(); + return checksum; + }; + +SHOW_EXPR(invoke(Time::ZERO, 1)); } }; diff --git a/tests/core/steam/engine/test-rand-ontology.hpp b/tests/core/steam/engine/test-rand-ontology.hpp index e627947e1..7b649c82f 100644 --- a/tests/core/steam/engine/test-rand-ontology.hpp +++ b/tests/core/steam/engine/test-rand-ontology.hpp @@ -225,8 +225,9 @@ namespace test { string procSpec() { - return _Fmt{"%s(%s)"} + return _Fmt{"%s(%s)(%s)"} % (filter? util::showHash(filter):"") + % streamType % streamType; } }; @@ -254,7 +255,8 @@ namespace test { string procSpec() { - return _Fmt{"(%s/2)"} + return _Fmt{"(%s/2)(%s)"} + % streamType % streamType; } }; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index e615ed60e..92fa5a66a 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -105765,7 +105765,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + + @@ -105784,9 +105785,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + + - + @@ -106413,6 +106415,54 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +