Thread
LaGUI 开发日志
-
LaGUI Development Log
Slowly developing...
2023/09
-
2023/08
-
-
需要 Word wrap 而不是简单的超界换行
● -
-
-
-
-
-
原来glShaderSource可以指定多个连在一起。。。
-
-
单实例在撤销丢弃时似乎是没有删掉的,好像没有针对这个的机制。需要检查。
● 2023/07
-
-
从这里来看VAO和FBO似乎是不共享的,看来需要每个窗口绑定一次。
这可以解释今天在NV卡上的闪烁行为。
-
此外使用
glDebugMessageCallback
即可调试错误和性能信息。 -
整理了界面一些问题,修了 GL Context ,然后还要检查面板放置和尺寸确认时是否有重复工作,还有windows下GL调试不遵守过滤的问题。
● -
Tab 最好要有竖置标签
● 2023/05
-
现已在 Linux 和 Windows 上支持wacom笔杆旋转!
-
把小房子引擎的音频合成移动到了lagui这样可以统一管理
-
2023/04
-
合并物体的撤销有问题(修了,用maxf作为参考长度,可能行了)
✓ -
-
-
-
-
-
-
-
动画数据的储存怎么操作还不清楚。目前的状况似乎要求每个Action挂在某个ID块下面,同时不允许储存别的ID块下面的属性。界面上怎么实现不清楚,因为它应该不能简单地就放在3d物体下。
-
-
-
目前有些问题:
- 没有统一的物体复制功能
- 节点没有复制(用Prop/UDF复制似乎很麻烦)(好了现在用节点自己复制了)
- 删除驱动页功能(可以了)
- 再加上启动时的模块注册参数,然后再做成引擎
- 然后再是实例状态匹配树
(当然工具都是要有撤销的)
● - 没有统一的物体复制功能
2023/03
-
修复了合并网格物体的面引用问题。
-
2023/02
-
Win下支持了WinTab
2023/01
-
-
Win 的大多数功能基本上能跑了
2022/12
-
映射图挂件的撤销有问题
● 2022/11
-
去掉了Scene,直接用RootObject,基本上又恢复正常工作了。
需要将键位处理成能够ThisCall的。
-
撤销又改改改改改然后最后还是要撤销系统保留所有指针不释放因为半途释放会有重复地址造成的模糊问题(并且此时仅使用指针生命期则无法判别)。
另外支持了RAW撤销和重做。
-
面板由于自动用户无法干净删除,使其在关闭后可能导致停机。(
好了修好了,现在删的特别干净23333其实还是没有。。。应当用面板保留节点然后最后退出时统一删面板节点不然目前的PropPack更新行为意味着无法删除所有用户(行了就是这么修的就这样吧)) -
-
目前退出时候的问题应该主要是删除撤销时的状态与目前的状态不符。鉴于内存都使用mem建立,可以不要这一步。
-
-
-
-
-
2022/10
-
- 所有引用形式的指针需要反引用。在使用时统一用指针使用接口,在set时也在内部调用,这使得删除数据块时自动解除引用(在添加用户时提供回调,同时也在数据块删除处提供另一个),也可以满足撤销和重做的场景。记录时要记录删除回调之前之后的(因为用户可能不将指针置为0)。
- 不允许Hyper2下挂Hyper2。
- Hyper2下加可读标识,UID不变。
- 资源在读任意UDF时候追加资源目录下的,不删除。关联需要用户自己储存的时候注意。
-
- 仅为撤销记录 块+PC似乎可行,而不需要结构化。实例列表差分在 P 下面,而且只记录引用差别。
- 应当删除对
UseLinkItem
的支持以更好地兼容指针反引用的特点。
-
- 删除Append回调,并使用PostRead/PostReadIM/SelfFree来支持读取和撤销/重做。
-
subprop行为:
- 全0/给offset:指针
- 给LOCAL:偏移(给别的都丢掉LOCAL)
- 给SINGLE:指针创建
- 只给list则视为表
- 给Get则丢掉list (只有Get的视为SINGLE,有next的默认忽略撤销/储存)
这样储存时也只需要表或者单一Get一个。自定义的Get表只适用于用户界面。
-
好了李论上撤销已经正常工作了,接下来只需要做那个中途开始做的清理即可。
-
底层基本上能够正确跑了,接下来的功能:
- 自动部分读资源文件
- 读写的与新的列表结构兼容性检查。(读写还没有动态类型)
界面的:
- 可折叠的面板头部
- 可撕下来的根面板
- 按列的ui列表
- 扩展尺寸的控件
- 可全屏的面板
-
-
-
-
-
-
现在单片面的片段XY从视角到视线应该是正确的了。显示的是FOV圈。
应计算为(0,0,-1)的变换,之后在ShaderToy找到个RayMarch的着色器,能够正确显示,经检查,尺寸正确匹配,因此可以继续用这个基础做合成渲染。
-
-
-
多窗口也正常了。
可以开始写文档了。
-
-
-
需要
LA_UDF_RAW
形式的数据供保存和撤销。 -
-
2022/09
-
需要:
- 移除 2dContainer,改为通用ui列表。
- 提供
GetStringLength
函数。
-
-
似乎屏幕缓冲区不可以绑定为贴图……
-
问题:
没有想好挂件布局自定义的自由度级别。由于存在条件判断挂件,完全可视化调节就不方便。带有标签页的面板停靠布局用作显示动态切换似乎足够表示相当多的需要换页的情况。
目前初步认为,应不提供直接修改面板和单个挂件的接口,但允许修改面板和属性包的模版,同时在终端应用程序中只允许按照模版添加面板,同时也可以创建新的面板模版并以脚本方式编辑。这种情况下,原始的挂件对象创建接口似乎多余,但可以保留以更直接地制作更简单的应用程序,
内部转换为模版不一定可行,最好的方法是从模版开始创建,而启动时的指令用于生成原始布局,之后布局也可以从文件等读取。直接创建的函数可以用,应该设计为要求运行在直接模式下。若未要求则运行在模版模式,此时直接创建函数将放在面板模版里,初始化时只填充布局。(也可以方便起见在即时生成后自动以面板名字创建为模版以供之后添加)
这种情况下界面储存和再加载是否通过UDF实现还不清楚。
-
如果之后要有声音支持则可以考虑rayaudio或者Miniaudio↗。 另参见rfx和sfxr↗的简易音效发生器实现。
-
目前还有的问题就是多面板实例选择查看。可能到最后仍然需要一个实例选择挂件放在最前面,但似乎没有发现这种设计有明显的用途。若仍然以飞行模拟器仪表的多切换为使用场景(即可以选择查看哪一个数据源),需要在不同面板同时显示同类不同数据源信息的情况仍然很少。
之前的分析认为,控件动态布局似乎应由应用程序实现为rack并以集合的形式显示,但显然目前的集合控件不允许类型混排,这使得节点挂架本身的实现也变得复杂这时此前没有注意到的。提供一个实例类型回调似乎可以简化这种状况(此时列表中不同类型的实例可以调用不同类的模版或者挂件),这时不同面板可以在一开始选择目标实例动态显示控件组。
这个“选择数据源”操作在界面上,但好像也一直需要。目前已有的实现还需要检查集合属性的刷新事件,其在何种情况下标记只重绘或者重计算尚没分清楚。
如果要实现多类型集合属性,则又有如何指定挂件类型的新问题。
理论的最小修改:父挂件提供一个上下文编号,集合属性提供一个获得实例模版的回调,带有上下文编号参数。这样允许在不同地方提供不同的挂件模版。
-
此外,“数据源选择框”可能可以隐藏,即只显示集合实例对象,数据源可能可以通过初始挂件选择,之后通过上下文菜单(和/或一个很小的浮动按钮)可以切换。
这样一来通过属性树的自定义界面基本就可以不通过任何控件编辑器实现了。
-
还有个多列怎么做的问题,除了行方向排列,还有个问题就是如何方便地上下左右移动。拖动似乎很不好处理。 另外似乎这种分布式列表不是很好布置一个全局的横线分隔。
(至于每列内部可以添加专门的高度分隔挂件,操纵起来稍微麻烦但是写起来简单,视觉上可以理解为填充未使用主板插槽的空白铝片。)
-
需要:
laSafeString
做成不限长度动态分配的。memAcquire
做成按尺寸和分配数量自动增加池总数的。- 字串属性做
getlength
。 - 做模版上下文和
gettemplate
。
● -
为保证多类型节点显示简洁可行,需要有
gettype
Andgetui
两种回调共同工作。(这使得文件读写在这块需要进一步修改)依靠节点实现的各种,属于程序内部自身的行为,就不使用数据接口来完成了。
-
感觉仅限于单个
layout
的浮动面板没什么用,应当删掉。删了✓ -
-
之前看过的一个带有有趣的可旋转控件的那个玩意是 AntTweakBar↗ :D
-
界面功能上主要就还差多行文字和行式布局(用begin/end方式,不嵌套新行)。行做了。
这两个完成后再来做多列以及面板可选实例。
-
gamma 好像还是没搞对但是先将就咯
-
-
-
新的精简的贴图系统基本上可以了,
偶尔有绑定贴图状态未刷新的情况,需要检查。是绑定目标不匹配的问题。需要:
- 动态增长的绘图命令与图元列表。
- 字体贴图也做成自动增长的为好。
- 几个读写的哈希也启动时分配为好。
-
-
应当将Users放到memhead里面,这样节点本身就不需要那么复杂。
带hyper,不带,和假吧意思的分配要分开。
基本上好了但是类似全局变量这些的用户引用不适用于现在这个方法,这种只有特殊放到container里面去(正常工作了)
接下来需要做单列表多类,然后是新状况下的读写以及指针匹配。
-
单列表多类正确了(由于GetPropPath的限制,只允许通过模版访问多类)。
需要:
- 模版优先级。
- 检查
GetActiveInstanceStrict
的适用性,可能需要用另外的方式指定 sub prop
-
想了半天还是去掉数据块作者信息记录,只保留UID和时间。作者可以记录成一个非引用的短字符串,这样就兼容UDF读写的特性。检查了UID列表和数据记录的seek关系似乎没有问题,因此这样一来似乎不需要专门重写一个memfile,在现有的基础上优化即可。
HyperData->Linked
可能应改为指向链接进来的UDF这样理论上可以协同修改和选择性保存。UDF的根实例列表应该可以用来做这个事情。 -
这里还有个问题是资源性引用的行为尚不明确。目前的UID方法不能直接适应部分共享块,例如另一个用户创建的飞行器模型引用了双方共有的翼型。
将uid改为可自定的id可能是可行的,即使这样还是需要想好仅读取部分文件时的行为(因为要是全部读取那总是能够匹配的)
-
暂时要求的udf行为:
- 可设置uid用于在共有资源中统一引用(改名之后就不行了)。
- 主资源在执行根目录往下的各个都行,结构可以随意改,通过资源文件夹/执行根目录中初始化的
.manifest.udf
可以了解可访问到的所有资源。 - 需要
manifest selector
挂件以从列表中选择文件来加载并设为激活。 - manifest表放置在每个PropContainer下面即可。
- 打开的工程文件的下属目录中也搜索udf并生成表,同名的覆盖掉初始的。
- 读文件前先读文件夹下的manifest(这些可以限制只读一层或者提供邻近最大搜寻文件数限制,或者是文件夹名字),找完所有需要的udf之后一起将
所有文件整体引用到的块读进来。这是否要求一个引用了许多文件的工程需要一次性把所有的全读了?- 由于每个文件存在uid地址因此似乎可以选择性读取。
- 应该_不能_只读局部或者只读单文件而不读关联。在“将局部储存为可复用的模块”时应在写入时自动删除其引用的外部uid。
-
udf储存行为?
- 基本行为:指定一个属性路径,写属性到文件。
- 指定属性和部分实例?
是否需要指定文件具备强制的从属关系?开启从文件时读/不读主文件?- 一个关键的特点:若不允许分离保存,则所有的从属块只能保存在一个文件,而所有的可被分离共享引用的都存在于分离的文件,这使得情况简化:不需要制作带有父子关系的分离保存支持,分离保存的都没有重叠或包含的部分(但是指针引用可以是任意的)。
- 这应该也允许仅引用共享资源块中某个子块的场景,若存在这种情况,仍然需要完全读入该子块的文件。
- 这种情况下应该也允许局部追加(因此应当需要能载入部分实例,但是在自动读关联时是否这么做还待研究)
-
全自动撤销也有些具体的问题:
- udf在内存中的布局可以直接作为撤销的一个差分。因为需要自动化则初始文件需要常在(此时每个差分可以做到比较小)。
- 理论上所有已注册为PropContainer支持的实例都应该放在对应的PC下(实在数据和垃圾桶)。
- PointerRecord可以不删?并且建实例的时候自动加进去?
- 理论上在丢到垃圾桶/撤销栈时就要调用
DataBlockNoLongerExists
以清除引用,此时应手动推进去相关的状态,之后的新加入的状态不存在对这个玩意的引用,因此这个状态删掉的话,也不需要考虑再次清除潜在引用的事情。这些都基于地址而不是uid因为是运行时。 - 实现起来比较麻烦的就是实例列表的diff,原理上也行的,因为实际用途中无非也就是几个列表,它们没有界面状态需要联合。
- 然后再说了。
-
UDF读写单个实例的功能
指针匹配有问题。开头的问题是memHead::nuid
的旧写法导致了一些问题,但是还没有完全解决。还是,已经解决了。DBInst
的运行方式对于目前计划的方案可能过于复杂且需要修改。- 现在可以追加数据块但不能按UID替换/修改已有(该行为目前仅适用于
UDFNoCreate
对象),需要探讨行为(追加时改名/修改已有/追加已有子集?)。 - 尚未做单列表多类节点支持。
读取主题以及UID型引用、资源型引用匹配正确。
-
基本上明确了DBInst和撤销的行为:
- mem获得节点时直接将使用节点挂载到DBInst表上。
- 读取UDF时获得的节点用先分配,之后通过读到的UID挂到DBInst表上。
- 撤销栈用与文件类似(?)/相同的结构(由于线性写)。完整版总是保留最近的,而差分则向前指。
- 不保留实际数据块指针,重做时用读文件的相同的方法进行指针重匹配(但是这个匹配关系需要维护为常在因为引用可以存在于多个撤销步)。
- PtrSync需要有起止范围,指定为撤销步数而不是引用以避免删除步数时检查。
-
需要为PropContainer指定删除回调,但是加载时应优先覆盖带有同样id的。非id式的应删掉。
-
资源式的UDF索引表基本上可以了,也可以排除重复的。
-
又全部改回了多字节字符串,改用自己的unicode/utf8转换。
从属性验证的结果看,要求Hyper2下不能链接Hyper2也不太实际。可能要求存取时仅支持从首级Hyper2实例开始,但这仍然不能解决部分结构改变后重新读取时产生可能冲突的问题。这么来看,Hyper2似乎总是只能是资源并且在任何情况下都不能嵌套。
2022/08
-
鼠标事件和操作等等正常了。
还有些没对的:
- 文件那套还没迁移
- 最后应该要做成先写内存然后一步写主文件,读也一样。
- 边框位移
- 刷新定时不对
- 关键帧等各个系统精简
- 面板尺寸调节
- 面板最好可以手提浮动和固定
总得来说要把整个布局系统精简并且要求有横排和撑尺寸的能力。现在这个太丑了。
之前有个老的截图
- 文件那套还没迁移
-
-
还需要:
- 规范化
ExtraInstructions
。之后通过这个来指定挂件外观自定义参数。 - 文件读写初步恢复。
- 找图标字体并生成为定义。
- 精简数值阵列的挂件。
- 键盘事件和文本框/数字框的输入检查。
- 应当检查关键帧图表绘图并检查动画系统的适用情况。
- 行布局。
- 规范化
-
图标和emoji基本上能解决了,需要分类生成个字符头文件表才好找,可能不需要子类型,但是至少需要block。
另需要3个noto符号字体才能涵盖所需区域。
-
-
需要的布局和可指定在通用挂件上的特征:
- 边框留白宽度(主题和覆盖)
- 面板和区域不带滚动条
- 文字对齐方向
- 无边框视觉
可能可以在面板、列表和挂件上添加一个一般标志量来解决这个问题。
-
主题的精简原则上只保留少数几个主要颜色。若需要样式丰富的挂件则面板应有抗锯齿否则几何符号和圆角画起来困难(一些几何符号可以用unicode符号字代替)。应重新考虑主要挂件的样式。
颜色选择框半边要有透明度。
应精简数值挂件类型,去掉单数值挂件,使用长度为一的阵列作为单数值,数据后台是否能做类似修改尚不清楚,因为二者文件写法似乎不一样。原则上可以直接删掉单数值的接口,同时把现有单数值的接口都改了(可能现有的还很多)。
-
-
暂定挂件模版的处理方式:
- 应使用专用简易界面脚本进行运行时修改和编辑并同样使用目前的界面模版保存。手动点击整理并运行模版而不在键入时自动操作。
- 模版显示在面板上通过
SubProp
,因此模版也可以嵌套小模版。ui->PP
只需一个提供给复合挂件,因为希望复合挂件自包含,若挂件需要其他可变配置则通过UiE
记录呈现(针对独立界面元素的显示等)。 - 模版可以一键导出为适用于放置入 C 程序的初始化代码。
节点和全局时间线可能需要删除,以实现一个统一的驱动系统。节点通过面板选择栏目并以
SubProp
的方式即可显示,连线呈现为 VCV RACK 的类似覆盖样式。被驱动属性的挂件不显示连线,连线的节点是驱动系统节点需要显示的。这样基本能保证修改最少而且保存了灵活度。
-
考虑了节点细节,暂定这样实现:
- 面板显示为多列,每列为一个 Rack/Bank 并且允许分开刷新。画图时仍然画在面板自己的 FBO 上,清空时只清自己的区域。
- 连线通过Overlay重新画在主缓冲区上就不会干扰子区域内容,需要个新的延后叠加函数。
- 上下移动可能需要靠一个上下移动挂件在顶部和列表中间,其作用是将下面的挂件向下靠。
主要的指导思想是:界面在使用时不需要将逻辑连接方式完全呈现在界面上,例如仪表台总是在背面接线。
-
ui和从数据接口获得基本数值的应总是假定为阵列(对于int/float/
bool/enum)。udf区分了阵列和单值,后面再来改。
-
-
之后的骨骼和什么的动画参考这个↗做。
-
界面脚本看上去不能用lua,但是解析起来必须非常简单:
// 预定义 [c] <c> [base] <b|e|p|pe|.extra> //具体写 require <b,e> //创建时要求提供base/uie - c 0.5 cl cr<(20)>; i [c] [base|apple<.extra>]>path.what <(text: whatever string; flags: maybe|something; ...)> as [apple]; cond either(eq([stuff]>path.what, 123), not(something)); else; endcond;
-
-
简化挂件类型带来的问题是没有办法指定默认 Flag。
可能需要包装成 type{_type, flag} 形式。
-
- 参数改成为Widget了。
- 支持了按键和中文输入。
2023/09/19 16:06:13