Вы находитесь на странице: 1из 5


Written by

Anoop Thykkandiyil

Based on, the Blender Source Code

Address: Thykkandiyil House, Thattolikkara, P.O.Chombala, Vatakara Phone Number: 9446446105


These structs are the foundation for all linked lists in the library system

Doubly linked lists start from a ListBase and contain elements beginning with link

LINK Generic. All structs put into linked lists begin with this. i.e. link is going to be the first element of another struct that is going to actually implement the linked list.

LINKDATA Simple subclass of link which as also the ability to actually use a data carrier. Used when it is not necessary to create a separate structure for this.

LISTBASE I suspect this to be the starting point of a linked list made using the above link structure.


Lowest level functions for decoding the parts of a .blend File, including interpretation of its SDNA block and conversion of contents of other parts according to the difference between the SDNA and the SDNA of the current (running) version of Blender.

Structure of DNA data is added to each blender file and to each executable, this is to detect in .blend Files new variables in structs, changed array sizes, etc. Its also used for converting endian and pointer size(32-64bits)

As an extra, Python uses a call to detect run-time the contents of a blender struct.

Create a structDNA: only needed when on of the inputs include(.h) files change.

File syntax is given.

While writing a file, the names of a struct is indicated with a type number, to be found with: “type = DNA_struct_find_nr(SDNA*, const char*)”. The value of “type” corresponds with the index within the structs array.


For the moment the complete DNA file is included in a .blend File. For the future we can think of smarter methods, like only include the used structs. Only needed to keep the file short though

DNA_elem_array_size(CONST CHAR* STR) Parses the “[n]” on the end of an array name and returns the number of array elements n

The function scans through the string str and searches for an opening “[” and when it finds one it points to the string at address next to “[” to the const char* cp. Next it searches for the string “]” and when it finds one it converts the entire string pointed to be cp into an integer and then multiplies it to variable int mul which had been initialized to a value “1”. Effectively I feel mul contains the integer value represented by the string between brackets.

DNA_sdna_free (SDNA *sdna) I am a function to free the memory allocated to a SDNA structure the one pointed to by SDNA* sdna. It uses secure memory freeing functions called MEM_freeN which does bounds checking and NULL pointer checking etc to prevent program from Crashing due to a memory mis management

First I check whether sdna->data_alloc is True or False. If it is true then it means that the structure holds the pointer to an individual copy of encoded data in memory and is not pointing to someone else’s copy. If data_alloc is true then use MEM_freeN to free memory pointed to by sdna->data.

Free memory pointed to by sdna->names.

Free memory pointed to by sdna->types.

Free memory pointed to by sdna->structs.

If compiled with WITH_DNA_GHASH free sdna->structs_map.

Only after these allocated memory locations pointed to by pointers within the sdna struct are cleared are we going to ventrue to clearing the memory allocated to sdna structure itself.

Free memory pointed allocated for sdna.


Static bool ispointer (const char *name) Return true if the name indicates a pointer of some kind.

Function checks if the first character is a “*” or if the first character is a “(” and the second character is a “*” in either case it returns a True Value else false.

STATIC INT ELEMENTSIZE (CONST SDNA *SDNA, SHORT TYPE, SHORT NAME) Returns the size of struct fields of the specified type and name


Const SDNA *sdna: pointer to the SDNA datastructure

SHORT TYPE: Index into sdna->types/typelens

SHORT NAME: Index into sdna->names

These are needed to extract possible pointer/array information

DNA_sdna_types - BF_DNA - HEADER FILE


Primarily contains the SDNA datastructure defined as a struct

It contains the

const char* data (which contains the encoded data)

Int datalen; (lenght of data)

Bool data_alloc; (if true it says data contains full copy of encoded data and if false it says its borrowed don’t know what data borrowing means)

Int nr_names; (total number of struct members)

Const char **names; (struct of member names)

Int pointerlen; (size of pointer in bytes)

Int nr_types; (number of basic types + struct types)

Const char **types; (type names)

Short *typelens; (type lengths)


Int nr_structs; (number of struct types)

Short **structs; (sp = structs[a] is the address of a struct defenition sp[0] is struct type number, sp[1] amount of members, (sp[2], sp[3]), (sp[4], sp[5]), are the member type and name numbers respectively

Struct GHash *structs_map; (ghash for faster lookups, requires WITH_DNA_GHASH to be used for now)


Is a struct which contains a code variable and len variable both of type int.

The main thing is the old* which is of type void in this but in BHead4 and BHead8 are of type INT and int64_t types.


Same as above but the old pointer is of type INT


Same as above but the old pinter is of tyep int64_t