首页 > 其他分享 >Blender中的DNA

Blender中的DNA

时间:2022-09-30 23:35:58浏览次数:54  
标签:... DNA SDNA TYPE types Blender

DNA是一个生物学名词,DNA是所有生物的遗传物质基础。生物体亲子之间的相似性和继承性即所谓遗传信息,都贮存在DNA分子中。

Blender把所有需要序列化的(可以保存到文件的结构数据)核心结构称之为DNA,这些自定义的数据结构(如Object,ID,bScreen,材料、纹理、几何体:网格、曲线...),这些核心结构就是Blender的遗传物质基础-DNA。因为在Blender的各个版本中这些结构可能有些改进,所以每个版本都保存一份自己特有的DNA,每个Blender保存.blend文件中也保存有一份自身的DNA数据。

在Blender源码中,这些结构都定义在以"DNA_(类型名)_(type).h"类似命名的头文件中,位于source\blender\makesdna目录中。

为了解决这些DNA结构的序列化和相关处理工作,有一个小程序叫makesdna(是一个独立的可执行程序),该程序扫描所有DNA文件,查找要序列化的DNA。生成以下三个文件:dna.c、dna_verify.c、dna_type_offsets.h它将所有DNA序列化到一个数组常量中,用于Blender主程序相关代码中。

dna_type_offsets.h中定义了一个枚举类型,定义了所有DNA结构对应的枚举常量。

#pragma once
#define SDNA_TYPE_FROM_STRUCT(id) _SDNA_TYPE_##id
enum {
	_SDNA_TYPE_DrawDataList = 0,
	...
	_SDNA_TYPE_IDProperty = 7,
	...
	_SDNA_TYPE_ID_Runtime = 12,
	_SDNA_TYPE_ID = 13,
	...
    _SDNA_TYPE_Object_Runtime = 543,
	_SDNA_TYPE_ObjectLineArt = 544,
	_SDNA_TYPE_Object = 545,
    
	_SDNA_TYPE_XrActionMap = 801,
	SDNA_TYPE_MAX = 802,
};

dna_verify.c中提供了对DNA结构长度及成员在结构中偏移位置的校验。

在DNA_sdna_types.h中定义了存储DNA相关的几个结构,SDNA是用来保存所有DNA结构信息的结构。

在dna.c文件中定义了一个const unsigned char DNAstr[]数组常量,数组中存储了DNA的信息,DNAster包含预先构建的SDNA结构,定义此版本Blender使用的类型布局。也就是说DNAstr中存储的就是SDNA序列化后的数据。

extern const unsigned char DNAstr[];
const unsigned char DNAstr[] = {83, 68, 78, 65, 78, 65, 77, 69,  ... 233, 0, };
extern const int DNAlen;
const int DNAlen = sizeof(DNAstr);

如果您希望结构不在DNA文件中:在其上方添加两行标记(#[回车键]#[回车键])

SDNA因此没有编码进入DNAstr中,DNA_sdna_types.h文件虽然也存放在DNA类型文件相同目录,但在定义时,加了标记。

#  //注意这二行标记
#
typedef struct SDNA {
  /** Full copy of 'encoded' data (when data_alloc is set, otherwise borrowed). */
  const char *data;
  /** Length of data. */
  int data_len;
  bool data_alloc;

  /** Total number of struct members. */
  int names_len, names_len_alloc;
  /** Struct member names. */
  const char **names;
  /** Result of #DNA_elem_array_size (aligned with #names). */
  short *names_array_len;

  /** Size of a pointer in bytes. */
  int pointer_size;

  /** Type names. */
  const char **types;
  /** Number of basic types + struct types. */
  int types_len;

  /** Type lengths. */
  short *types_size;

  /** Information about structs and their members. */
  SDNA_Struct **structs;
  /** Number of struct types. */
  int structs_len;

  /** #GHash for faster lookups, requires WITH_DNA_GHASH to be used for now. */
  struct GHash *structs_map;

  /** Temporary memory currently only used for version patching DNA. */
  struct MemArena *mem_arena;
  /** Runtime versions of data stored in DNA, lazy initialized,
   * only different when renaming is done. */
  struct {
    /** Aligned with #SDNA.names, same pointers when unchanged. */
    const char **names;
    /** Aligned with #SDNA.types, same pointers when unchanged. */
    const char **types;
    /** A version of #SDNA.structs_map that uses #SDNA.alias.types for its keys. */
    struct GHash *structs_map;
  } alias;
} SDNA;

结构DNA数据被添加到每个blender文件和每个可执行文件中,这是为了在.blend文件中检测结构中的新变量、更改的数组大小等。它还用于转换endian和指针大小(32-64位)。此外,Python还使用一个调用来检测运行时blender结构的内容。DNAstr数组中数据编码格式如下:

SDNA (4 字节) (幻数)
NAME (4 字节)
[nr] (4 字节) 名称总数 (int)
[名称字符串1]
[名称字符串2]
...
...
TYPE (4 字节)
[nr] 类型总数 (int)
[类型名字符串1]
[类型名字符串2]
...
...
TLEN (4 字节)下面类型长度项是与上面的类型名称项是一一对应的
[类型1长度] (short) 
[类型2长度]
...
...
STRC (4 字节)
[nr] 结构总数(int)
[typenr][nr_of_elems] [typenr][namenr] [typenr][namenr] ...

理详细的DNA序列化注意事项可参考官方文档

DNA_genfile.h中定义了相关序列化数据到SDNA的转换函数。

总结一句话:Blender中DNA就是重要的可序列化结构,这些结构信息可包含于SDNA结构变量中,并序列化为数组变量或存储于文件中。Blender软件功能就是基于这些结构展开的。

 

标签:...,DNA,SDNA,TYPE,types,Blender
From: https://www.cnblogs.com/jiaping/p/16730633.html

相关文章

  • Blender中服装网格重新拓扑实录
    最近了解到游戏行业服装的一些处理流程。简单来说:用MD等做衣服的软件,将服装做出来;导出2种模型:缝合好的服装模型(叫它3d)以及没有变形的平铺板片模型(叫它2d),建议导出单层的,......
  • 关于WPF自定义控件OnApplyTemplate不执行,手动调用Template.FindName返回空的问题
    我在wpf项目中手写了一个自定义控件,运行得相当的正常,后续调用时,反复遇到问题,前前后后折腾了好几次代码publicExtendCombox(){Loaded+=(e......
  • DNA计算机——每秒十亿次计算,能耗仅为传统计算机的十亿分之一
    一个试管中就可以装下1万亿台,运算速度每秒钟可以达到10亿次,而它所需要的能量仅仅是传统电脑的10亿分之一,DNA计算机到底是什么?为什么DNA能够进行计算?你听说过用DNA计算机来......
  • Blender材质制作记录
    blender2.9.x引力透镜镀铬合金......
  • Blender 渲染物体和影子,不要地面
    需要几步操作:1、切换渲染器为Cycles2、新建一个足够大的平面网格A用于接受阴影3、选中平面新建的平面网格A,设置物体属性。在物体属性可见性选项卡里勾选遮罩阴影捕捉。......
  • blender人物建模笔记01
    blender好久没摸了,也好复习一下这个教程是纯使用点线面操作建模的,没有用到雕刻,雕刻有机会再接触吧,感觉也很好玩。Refr添加参考图片,用边数为8的圆环先把一侧眼睛嘴巴脖子......
  • DNS(主从)+DNAT+LAMP架构部署
    网络架构图1、机器准备机器大小规格2vcpu2G100G10.10.10.100lamp-wordpress.chen.org10.10.10.110lamp-shopxo.chen.org10.10.10.120lamp-mysql.chen......
  • [Blender] 在 脚本中创建 Mesh
    有时候需要在Blender中创建一些Mesh进行下步操作,这个数据的来源是多要的,甚至可能是网络传输过来的Mesh的信息,因此需要在脚本中动态的创建Mesh,这里简单记录一些如何......
  • [Blender] Blender 获取 Instance 的信息
    最近希望用Blender生成Instance的能力,将生成的导入游戏引擎中来渲染。InstanceRendering是个好东西,特别是针对大场景,渲染成批的基本相同的物体的时候非常有用。希望......
  • [记]用blender建模个锤子
     1.基础操作非编辑模式下shift+a创建基础立体图形;a:全选x:删除g:移动立体图形,沿轴+x,y,z;r:旋转图形s:缩放图形tab:切换编辑模式编辑模式下1,2,3对应点,线,面;alt+z:......