标签:
杂谈 |
新Blender,2.5后的Blender,其运作的基础都在operator上,operator是用C写成,但通过python变成API让所有人方便调用,没有开发过Blender的人,可以快速通过bpy的脚本中的API来找到相对应哪些Blender源码再进一步学习Blender的机制。
以 bpy.ops.mesh.primitive_cube_add
为例,在整个代码库中搜索 primitive_cube_add
,可以找到 MESH_OT_primitive_cube_add
。
void MESH_OT_primitive_cube_add(wmOperatorType *ot)
{
ot->name = "Add Cube";
ot->description = "Construct a cube mesh";
ot->idname = "MESH_OT_primitive_cube_add";
ot->exec = add_primitive_cube_exec;
ot->poll = ED_operator_scene_editable;
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
ED_object_add_unit_props(ot);
ED_object_add_generic_props(ot, true);
}这个是operator的注册函数。有很多原始信息写在这里。当一个operator要被调用的时候(被 wm_operator_invoke),工厂(wm_operator_create)会实例化一个operator的例子(wmOperator)真正的operator代码会在 add_primitive_cube_exec
source/blender/makesrna/intern/rna_scene_gen.c.
代码如下:
PointerPropertyRNA rna_SceneObjects_active = {
{NULL, (PropertyRNA *)&rna_SceneObjects_rna_type,
-1, "active", 41943041, "Active Object",
"Active object for this scene",
0, "*",
PROP_POINTER, PROP_NONE | PROP_UNIT_NONE, NULL, 0, {0, 0, 0}, 0,
NULL, 67567616, NULL, NULL,
0, -1, NULL},
SceneObjects_active_get, SceneObjects_active_set, NULL, NULL,&RNA_Object
};
如果想获得“设置一个激活物体”的代码跟踪,就可以给 SceneObjects_active_set
这个函数加个断点。
最后一些小经验提示,如果一些操作不需要开Blender的GUI界面,可以通过 #
blender -b -P
script.py
让blender作为后台程序(也叫着blender的headerless模式)执行一些python脚本自动执行一些命令。
原文:http://thebusytypist.github.io/learnblenderdev-site/2015/03/20/tips-on-tracing-blender-system.html
更多Blender代码分析文章:
http://bbs.blendercn.org/forum.php?mod=forumdisplay&fid=57
感谢小A的 DNA RNA struct 分析,randon的 operator分析文章。
前一篇:详细解读Blender的使用模式

加载中…