在Bler中,修改器(Modifier)是动态应用于网格的程序几何效果,可实现灵活的非破坏性工作流程。这是为添加新修改器的编程指南。
自定义修改器不能用Python编写,因此本指南将展示Bler的C代码的哪些部分必须修改。
1、Bler源码构建由于我们要修改Bler的核心,首先需要从源代码构建Bler。这个过程在Bler的Wiki:BuildingBler中有详细记录。我将假设你遵循了有关目录名称的这些说明。
在实际开始修改代码之前,建议创建一个分支以将我们的更改与上游开发隔离。例如让我们称之为pizza-modifier:
/../bler-git/bler$gitcheckout-bpizza-modifier
在这篇文章中,我们将添加一个“Pizza”修改器。我不知道它可以做什么,但至少我们肯定不会被源库中其他出现的“pizza”这个词弄糊涂。
2、Pizza修改器概述那么,我们需要改变什么?为什么我们需要更改这么多文件?显然,我们至少必须对修改器本身的行为进行编码。但我们还必须确保它在UI中列出,可以通过PythonAPI访问,并且它的参数保存在Bler文件中。最后一点是使用Bler架构核心的DNA/RNA机制实现的。
我们的大部分更改位于/../bler-git/bler/source/bler/modifiers/目录。
3、Bler核心修改器为Bler创建修改器意味着定义一个ModifierTypeInfo类型的全局变量。然后我们将它注册到全局修改器列表中。为了匹配编码风格并与现有宏很好地配合,此变量必须被命名为modifierType_Pizza,其中“Pizza”是你的实际修改器名称的首字母大写形式。
3.1修改器类型信息修改器类型信息变量通常在/../bler-git/bler/source/bler/modifiers/intern文件夹中MOD_文件中定义,因此,创建此文件并将其添加到要在父目录中的构建列表中,连同以intern/MOD_开头的所有其他行。
至少,你的MOD_文件应当包含:
include"DNA_mesh_"staticMesh*pizza_applyModifier(structModifierData*md,conststructModifierEvalContext*ctx,structMesh*mesh){returnmesh;}并将applyModifier字段设置为pizza_applyModifier,或者你为上述函数提供的任何名称。此功能将是修改器进行所有处理的地方。这完全取决于你自己,返回的网格可以是使用source/bler/blenkernel/BKE_中的函数创建的新网格,请参见附录中的示例。
3.4其他字段对于某些字段,可以使用定义在BKE_中的工具方法。例如,可以设置copyData为modifier_copyData_generic。
4、DNA和RNAModifierTypeInfo中有两个非常重要的字段我还没有提到:structName和structSize。它们指向的PizzaModifierData结构将成为我们修改器的DNA。
DNA是.bl文件保存在磁盘上的内容。它必须包含所有保存的参数。按照生物学的比喻,每个DNA都与一个RNA结构相关联。这个仅在运行时使用,用于编辑、传输、撤消、重做等与修改器相关的数据。
4.1DNABler中使用的所有DNA结构都在source/bler/makesdna/目录中定义。修改器定义在DNA_modifier_文件中。
首先要修改的是:添加eModifierType_Pizza到ModifierType文件开头的枚举中,就放在NUM_MODIFIER_TYPES前面。这个枚举不能重新排序,因为枚举值是保存在混合文件中的,所以它会破坏向后兼容性。这也是明确说明枚举值的原因。
在文件末尾,我们为修改器添加DNA结构。它的第一个字段必须是typeModifierData。它是一种继承机制,可以将指向结构的指针用作更通用的ModifierData*。
typedefstructPizzaModifierData{ModifierDatamodifier;intnum_olives;int_pad0;}PizzaModifierData;在这个例子中,我们的修改器有一个整型参数num_olives。
另一个要求是填充结构以使其整体大小为8字节的倍数。如果不是自然情况,请添加额外的_pad前缀的字段以达到8的倍数。
请注意,整个文件是在构建Bler之前通过执行特殊程序makesdna处理的,因此这里不能使用花哨的东西或预处理器宏。
4.2RNARNA机制位于source/bler/makesrna/目录中。与DNA类似,intern中的文件在Bler构建之前由一个名为makesrna的定制程序处理,这使我们免于执行一些关于DNA/RNA转换的非常重复的任务。
修改器的RNA定义在makesrna/intern/rna_文件中。除非你用DNA制作高级的东西,否则你将主要需要编写一个类似于所有其他已经存在的简单函数rna_def_modifier_pizza,把这个函数添到voidRNA_def_modifier(BlerRNA*brna)之前:
staticvoidrna_def_modifier_pizza(BlerRNA*brna){StructRNA*srna;PropertyRNA*prop;//DefinetheRNAandbindittothePizzaModifierDataDNAstructsrna=RNA_def_struct(brna,"PizzaModifier","Modifier");RNA_def_struct_ui_text(srna,"PizzaModifier","");RNA_def_struct_sdna(srna,"PizzaModifierData");RNA_def_struct_ui_icon(srna,ICON_MOD_ARRAY);//TherewillbesuchablockforeachdatafieldofPizzaModifierDataprop=RNA_def_property(srna,"num_olives",PROP_INT,PROP_NONE);RNA_def_property_range(prop,0,100);RNA_def_property_ui_range(prop,0,100,1,-1);RNA_def_property_ui_text(prop,"Olives","Thenumberofolivesonthepizza");RNA_def_property_update(prop,0,"rna_Modifier_update");}注意:您可以为您的RNA选择自定义图标,而不是ICON_MOD_ARRAY我在此处选择的图标。
在RNA_def_modifier()的最后,添加对我们刚刚定义的rna_def_modifier_pizza(brna)函数的调用。
4.3修改器类型枚举由于修改了ModifierType枚举的DNA,我们还需要编辑它的RNA。为此,请在相应rna_部分的开头为rna_enum_object_modifier_type_items添加一个条目。节标题是{0,"",0,N_("Modify"),""}类型的行。它们与添加新修改器时显示在UI中的下拉菜单直接相关。第二个参数是用于绘制UI的Python函数的名称,见下文。
我们还必须编辑要在/*Default*/之前添加的rna_Modifier_refine函数:
caseeModifierType_Pizza:returnRNA_PizzaModifier;
注意:变量RNA_PizzaModifier不需要我们自己定义,它会由makesrna生成。
因此,我们完成了与DNA/RNA相关的更改。你可能对修改器参数有一些更高级的需求。如果是这样,请随意查看其他修改器如何处理特殊情况,它们都定义在同一个文件中。
注意:有关RNA的更多详细信息,可以查看此存档。
5、用户界面修改器的用户界面在Python脚本中定义:release/scripts/startup/bl_ui/properties_data_
向DATA_PT_modifiers类添加绘图方法defPIZZA(self,layout,ob,md):,类似于其他修改器已经存在的功能。函数的名称必须与上面rna_enum_object_modifier_type_items(rna_)中定义的条目匹配。例如:
undefINIT_TYPE之前:INIT_TYPE(Pizza);6.2大纲大纲是UI空间,可以列出有关当前打开的Bler文件的所有技术细节。因此它必须知道所有的修改器,包括我们新的Pizza修饰符。在source/bler/editors/space_outliner/outliner_中编辑tree_element_get_icon函数以添加适当的caseeModifierType_Pizza。不过,我不知道为什么它不能从RNA中获取这条信息。
7、结论现在,你的修改器有了第一个骨架。从现在开始,你将能够通过阅读BKE_的注释或其他修饰符的实现来学到很多东西。
版权所有 © Copyright © 2002-2030 龙辉游戏资讯网站地图