news 2026/9/20 7:22:57

TiXL SetBoolVar 算子详解:通过上下文变量在节点图间传递布尔状态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TiXL SetBoolVar 算子详解:通过上下文变量在节点图间传递布尔状态

TiXL SetBoolVar 算子详解:通过上下文变量在节点图间传递布尔状态

【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3

导读

SetBoolVar 是 TiXL 中Lib.flow.context(流程 / 上下文变量)算子族的一员,它把布尔值写入 EvaluationContext 的布尔变量字典,供图中"更靠左(更早求值)"的算子通过 GetBoolVar 读取,从而在不使用连线的情况下实现跨分支、跨子图的数据传递。本文以 .help/docs/operators/lib/flow/context/SetBoolVar.md 为基础,结合算子源码、上下文实现与编辑器 UI 代码,完整讲解它的输入输出、临时作用域语义、与 GetBoolVar 的配对用法,以及它在 TiXL 实际项目中的典型应用方式。

一、算子定位:Lib.flow.context 上下文变量族

在 TiXL 的算子库中,Lib.flow.context 目录集中了一组"读写求值上下文变量"的算子,与 SetBoolVar 同族的还包括:

  • 写入类:SetBoolVar、SetFloatVar、SetIntVar、SetStringVar、SetVec3Var、SetMatrixVar、SetObjectVar 等;
  • 读取类:GetBoolVar、GetFloatVar、GetIntVar、GetStringVar、GetVec3Var、GetMatrixVar、GetObjectVar、GetPosition、GetForegroundColor 等;
  • 以及 ExecuteRawBufferUpdate、SetRequestedResolutionCmd 等与上下文相关的命令算子。

这些算子的共同特点是:通过共享的 EvaluationContext 传递数据,而不是通过算子输出到输入的连线。它们常用于一个算子需要把状态"告诉"图中另一个位置(尤其是结构上相距较远、连线困难的分支)的场景。

二、输入输出参数

依据关联文档中的参数表,结合 SetBoolVar.t3 中保存的默认值,SetBoolVar 的参数定义如下:

输入参数

名称类型说明默认值(来自 .t3 文件)
BoolValueBoolean要写入上下文的布尔值false
VariableNameString布尔变量在上下文中的键名,供 GetBoolVar 等按名读取""(空字符串)
SubGraphCommand可选子图命令;若连接,则变量的新值仅在子图求值期间临时生效(详见下文"临时作用域")null(未连接)

输出参数

名称类型
ResultT3.Core.DataTypes.Command

三、核心实现:变量如何写入上下文

SetBoolVar 的求值逻辑位于 SetBoolVar.cs,其核心过程如下:

  1. 读取VariableNameBoolValue两个输入的当前值;
  2. 若变量名为空或为 null,则调用Log.Warning输出警告Can't set variable with invalid name并直接返回,不会写入任何数据;
  3. SubGraph没有连线,则直接把context.BoolVariables[name] = newValue写入上下文字典;
  4. SubGraph连线,则执行"临时写入 → 求值子图 → 恢复旧值"的三步操作(见下一节)。

底层存储是EvaluationContext上的布尔变量字典,定义于 EvaluationContext.cs:

public Dictionary<string, bool> BoolVariables { get; } = new();

该字典在每个求值帧开始时会被清空(见 EvaluationContext.cs 中的BoolVariables.Clear()),因此上下文变量本质上是每帧重建、瞬时有效的状态,适合作为单帧内的数据传递通道,而不是跨帧持久化的存储。

四、临时作用域:SubGraph 输入的两种语义

这是 SetBoolVar 最具特色的行为。从源码可以清楚看到两种模式:

模式一:无 SubGraph —— 永久(本帧内)写入

// SubGraph 无连线时 context.BoolVariables[name] = newValue;

变量直接写入上下文,图中后续(更靠左、更早求值)的 GetBoolVar 在同一帧内可以读取到该值。

模式二:有 SubGraph —— 临时写入并自动还原

// SubGraph 有连线时 var hadPreviousValue = context.BoolVariables.TryGetValue(name, out var previous); context.BoolVariables[name] = newValue; // 1. 临时写入新值 SubGraph.GetValue(context); // 2. 求值子图 if (hadPreviousValue) { context.BoolVariables[name] = previous; // 3. 恢复旧值 }

具体行为是:

  • 把新值写入变量;
  • 求值 SubGraph 连接的命令算子;
  • 若该变量原本存在旧值,则在子图求值结束后恢复旧值;若原本不存在,则保持不变(不会清理为不存在,但该值也会随帧末清空而不影响下一帧)。

这种"临时遮蔽(scoped shadowing)"语义非常适合局部覆盖场景:在子图范围内让 GetBoolVar 读到临时值,子图执行完毕后又回到原值,从而不会污染外部逻辑。

五、与 GetBoolVar 配对使用

写入之后,读取工作由 GetBoolVar.cs 完成:

var variableName = VariableName.GetValue(context); if (variableName != null && context.BoolVariables.TryGetValue(variableName, out var value)) { Result.Value = value; } else { Result.Value = FallbackDefault.GetValue(context); // 变量不存在时使用回退默认值 }

要点:

  1. 按名读取:GetBoolVar 通过VariableNamecontext.BoolVariables字典中查找;因此 SetBoolVar 与 GetBoolVar 的变量名字符串必须完全一致(注意大小写)。
  2. 回退默认值:若变量不存在,GetBoolVar 输出其FallbackDefault输入的值,避免出现未定义状态。
  3. 方向约定:上下文变量只能在"同一帧内、求值顺序更靠后写入、更靠前读取"的方向上流动(README 中对 SetIntVar 的描述明确写着"可被图中更靠左(left in)的 GetIntVar 检索",布尔变量同理)。这是与直接连线最大的区别,使用时需要注意求值方向。

此外,GetBoolVar 实现了ICustomDropdownHolder接口,在编辑器中会从context.BoolVariables.Keys动态收集变量名作为下拉选项,方便你直接选择已写入的变量名,减少拼写错误。

六、编辑器中的自定义 UI

SetBoolVar 在节点图中有一个专门的自定义绘制实现 SetBoolVarUi.cs:

  • 节点标题显示为算子名称,未命名时显示Set bool: <变量名>(见 SetBoolVarUi.cs),让读者在图上即可看出它操作的是哪个变量;
  • 节点主体会显示当前 BoolValue 的具体布尔值(True/False,见 SetBoolVarUi.cs);
  • 当鼠标悬停在节点上时,会调用OpUi.DrawVariableReferences绘制与该变量名关联的引用连线提示,帮助你在图上快速定位配对的 GetBoolVar(见 SetBoolVarUi.cs)。

七、典型使用场景与注意事项

典型场景

  • 跨分支状态同步:在并行分支中设置一个布尔开关,供图中其他位置的逻辑(如条件触发、模式切换)读取,避免拉长连线;
  • 局部行为覆盖:利用 SubGraph 临时作用域,在某个子图范围内临时改变变量值,执行完毕后自动恢复,实现"上下文无关"的局部配置;
  • 条件与标志位传递:与 GetBoolVar 的 FallbackDefault 配合,构造"未设置时取默认值"的安全读取逻辑。

注意事项

  1. 变量名不能为空,否则算子只会记录警告而不会写入;
  2. 变量名大小写敏感,写入端与读取端必须完全一致;
  3. 上下文变量每帧清空,不能当作跨帧持久化存储使用;
  4. 读取方向受求值顺序约束(更靠左的算子才能读到),跨帧或跨求值顺序的读取请改用其他机制;
  5. 同名变量重复写入会直接覆盖(字典赋值语义),后写入者生效。

八、小结

SetBoolVar 是一个实现简单但语义巧妙的上下文算子:通过EvaluationContext.BoolVariables字典完成布尔状态的跨节点传递,借助 SubGraph 输入获得"临时写入、自动还原"的局部作用域能力,并与 GetBoolVar(含动态变量名下拉与 FallbackDefault 回退)形成完整的读写闭环。理解它的临时作用域语义与求值方向约束,是正确使用 TiXL 上下文变量族的关键。

【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 7:22:54

零基础Python入门:从环境配置到第一个实用脚本

简介&#xff1a;Python入门基础教程全套&#xff0c;为零基础学习者量身打造&#xff0c;覆盖Python核心基础知识。演示文稿共含1个PPT文件&#xff0c;大小约25.49MB&#xff0c;内含454页系统讲解&#xff0c;从Python发展历程与语言特点讲到开发环境配置、IPython交互式解释…

作者头像 李华
网站建设 2026/9/20 7:22:38

RVC 声音克隆:10分钟音频就能训练专属音色模型

RVC 声音克隆&#xff1a;10分钟音频就能训练专属音色模型 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-Web…

作者头像 李华
网站建设 2026/9/20 7:20:36

Z-Image-Turbo安全工作流:构建AI绘画内容合规生产链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 7:18:35

Hadoop+Spark构建心血管疾病大数据分析系统

1. 项目概述&#xff1a;心血管疾病数据分析系统的核心价值心血管疾病作为全球头号健康杀手&#xff0c;每年导致超过1800万人死亡。传统医疗数据分析往往局限于小样本研究&#xff0c;难以捕捉疾病发展的复杂规律。这个基于大数据技术的心血管疾病分析系统&#xff0c;正是为了…

作者头像 李华
网站建设 2026/9/20 7:17:59

Chrome DevTools MCP 实战:自动还原前端加密与签名逻辑

调试前端加密和签名&#xff0c;在过去是件挺烦人的差事。你在控制台里看到一堆不明所以的参数&#xff0c;sign、nonce、encryptedData&#xff0c;想搞清楚它们怎么来的&#xff0c;得手动打断点、看调用栈、翻压缩混淆后的代码、把几段加密函数复制到本地慢慢跑&#xff0c;…

作者头像 李华