writefile: replace most struct lookups /w constants
Removes many hash lookups per file-save and undo-step.
This commit is contained in:
parent
f181839c57
commit
55546b4e13
|
@ -35,6 +35,10 @@ set(INC
|
|||
../nodes
|
||||
../render/extern/include
|
||||
../../../intern/guardedalloc
|
||||
|
||||
# for writefile.c: dna_type_offsets.h
|
||||
${CMAKE_BINARY_DIR}/source/blender/makesdna/intern
|
||||
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
|
@ -74,3 +78,6 @@ if(WITH_CODEC_FFMPEG)
|
|||
endif()
|
||||
|
||||
blender_add_lib(bf_blenloader "${SRC}" "${INC}" "${INC_SYS}")
|
||||
|
||||
# needed so writefile.c can use dna_type_offsets.h
|
||||
add_dependencies(bf_blenloader bf_dna)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -56,8 +56,14 @@ add_executable(makesdna ${SRC} ${SRC_DNA_INC})
|
|||
|
||||
# Output dna.c
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dna.c
|
||||
COMMAND "$<TARGET_FILE:makesdna>" ${CMAKE_CURRENT_BINARY_DIR}/dna.c ${CMAKE_SOURCE_DIR}/source/blender/makesdna/
|
||||
OUTPUT
|
||||
${CMAKE_CURRENT_BINARY_DIR}/dna.c
|
||||
${CMAKE_CURRENT_BINARY_DIR}/dna_type_offsets.h
|
||||
COMMAND
|
||||
"$<TARGET_FILE:makesdna>"
|
||||
${CMAKE_CURRENT_BINARY_DIR}/dna.c
|
||||
${CMAKE_CURRENT_BINARY_DIR}/dna_type_offsets.h
|
||||
${CMAKE_SOURCE_DIR}/source/blender/makesdna/
|
||||
DEPENDS makesdna
|
||||
)
|
||||
|
||||
|
@ -78,7 +84,11 @@ set(SRC
|
|||
${SRC_DNA_INC}
|
||||
)
|
||||
|
||||
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/dna.c PROPERTIES GENERATED TRUE)
|
||||
set_source_files_properties(
|
||||
${CMAKE_CURRENT_BINARY_DIR}/dna.c
|
||||
${CMAKE_CURRENT_BINARY_DIR}/dna_type_offsets.h
|
||||
PROPERTIES GENERATED TRUE
|
||||
)
|
||||
|
||||
blender_add_lib(bf_dna "${SRC}" "${INC}" "${INC_SYS}")
|
||||
|
||||
|
|
|
@ -968,7 +968,7 @@ void printStructLengths(void)
|
|||
}
|
||||
|
||||
|
||||
static int make_structDNA(const char *baseDirectory, FILE *file)
|
||||
static int make_structDNA(const char *baseDirectory, FILE *file, FILE *file_offsets)
|
||||
{
|
||||
int len, i;
|
||||
const short *sp;
|
||||
|
@ -1159,6 +1159,19 @@ static int make_structDNA(const char *baseDirectory, FILE *file)
|
|||
/* end end padding test */
|
||||
}
|
||||
|
||||
/* write a simple enum with all structs offsets,
|
||||
* should only be accessed via SDNA_TYPE_FROM_STRUCT macro */
|
||||
{
|
||||
fprintf(file_offsets, "#define SDNA_TYPE_FROM_STRUCT(id) _SDNA_TYPE_##id\n");
|
||||
fprintf(file_offsets, "enum {\n");
|
||||
for (i = 0; i < nr_structs; i++) {
|
||||
const short *structpoin = structs[i];
|
||||
const int structtype = structpoin[0];
|
||||
fprintf(file_offsets, "\t_SDNA_TYPE_%s = %d,\n", types[structtype], i);
|
||||
}
|
||||
fprintf(file_offsets, "\tSDNA_TYPE_MAX = %d,\n", nr_structs);
|
||||
fprintf(file_offsets, "};\n");
|
||||
}
|
||||
|
||||
MEM_freeN(namedata);
|
||||
MEM_freeN(typedata);
|
||||
|
@ -1190,43 +1203,53 @@ static void make_bad_file(const char *file, int line)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *file;
|
||||
int return_status = 0;
|
||||
|
||||
if (argc != 2 && argc != 3) {
|
||||
printf("Usage: %s outfile.c [base directory]\n", argv[0]);
|
||||
if (argc != 3 && argc != 4) {
|
||||
printf("Usage: %s dna.c dna_struct_offsets.h [base directory]\n", argv[0]);
|
||||
return_status = 1;
|
||||
}
|
||||
else {
|
||||
file = fopen(argv[1], "w");
|
||||
if (!file) {
|
||||
FILE *file_dna = fopen(argv[1], "w");
|
||||
FILE *file_dna_offsets = fopen(argv[2], "w");
|
||||
if (!file_dna) {
|
||||
printf("Unable to open file: %s\n", argv[1]);
|
||||
return_status = 1;
|
||||
}
|
||||
else if (!file_dna_offsets) {
|
||||
printf("Unable to open file: %s\n", argv[2]);
|
||||
return_status = 1;
|
||||
}
|
||||
else {
|
||||
const char *baseDirectory;
|
||||
|
||||
if (argc == 3) {
|
||||
baseDirectory = argv[2];
|
||||
if (argc == 4) {
|
||||
baseDirectory = argv[3];
|
||||
}
|
||||
else {
|
||||
baseDirectory = BASE_HEADER;
|
||||
}
|
||||
|
||||
fprintf(file, "const unsigned char DNAstr[] = {\n");
|
||||
if (make_structDNA(baseDirectory, file)) {
|
||||
fprintf(file_dna, "const unsigned char DNAstr[] = {\n");
|
||||
if (make_structDNA(baseDirectory, file_dna, file_dna_offsets)) {
|
||||
/* error */
|
||||
fclose(file);
|
||||
fclose(file_dna);
|
||||
file_dna = NULL;
|
||||
make_bad_file(argv[1], __LINE__);
|
||||
return_status = 1;
|
||||
}
|
||||
else {
|
||||
fprintf(file, "};\n");
|
||||
fprintf(file, "const int DNAlen = sizeof(DNAstr);\n");
|
||||
|
||||
fclose(file);
|
||||
fprintf(file_dna, "};\n");
|
||||
fprintf(file_dna, "const int DNAlen = sizeof(DNAstr);\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (file_dna) {
|
||||
fclose(file_dna);
|
||||
}
|
||||
if (file_dna_offsets) {
|
||||
fclose(file_dna_offsets);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue