加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

如何在Blender里面追踪代码

(2015-04-21 00:12:28)
标签:

杂谈

新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  函数中执行,注册在 ot->exec = add_primitive_cube_exec;   
    如果想要查询一些常规的脚本表达式是怎么在C代码中实现的,比如 scene.active  ,想要在源代码中查到“active” ,就会在整个代码库中查到很多的匹配。在这堆匹配中,只关心scene的话,需要在查找结果中再加入scene的关键词,这样的查找会缩小匹配范围到: 
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分析文章。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有