diff options
Diffstat (limited to 'source/blender/blenkernel/intern/customdata.c')
-rw-r--r-- | source/blender/blenkernel/intern/customdata.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 0afb9a450dd..1f4b0f303f7 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -85,7 +85,7 @@ typedef struct LayerTypeInfo { int count, void *dest); /* a function to swap the data in corners of the element */ - void (*swap)(void *data, int *corner_indices); + void (*swap)(void *data, const int *corner_indices); /* a function to set a layer's data to default values. if NULL, the default is assumed to be all zeros */ @@ -273,7 +273,7 @@ static void layerInterp_tface(void **sources, float *weights, } } -static void layerSwap_tface(void *data, int *corner_indices) +static void layerSwap_tface(void *data, const int *corner_indices) { MTFace *tf = data; float uv[4][2]; @@ -368,7 +368,7 @@ static void layerInterp_origspace_face(void **sources, float *weights, } } -static void layerSwap_origspace_face(void *data, int *corner_indices) +static void layerSwap_origspace_face(void *data, const int *corner_indices) { OrigSpaceFace *osf = data; float uv[4][2]; @@ -445,7 +445,7 @@ static int mdisp_corners(MDisps *s) return (s->totdisp % (3*3) == 0)? 3: 4; } -static void layerSwap_mdisps(void *data, int *ci) +static void layerSwap_mdisps(void *data, const int *ci) { MDisps *s = data; float (*d)[3] = NULL; @@ -559,7 +559,7 @@ static int layerRead_mdisps(CDataFile *cdf, void *data, int count) d[i].disps = MEM_callocN(sizeof(float)*3*d[i].totdisp, "mdisps read"); if(!cdf_read_data(cdf, d[i].totdisp*3*sizeof(float), d[i].disps)) { - printf("failed to read %d/%d %d\n", i, count, d[i].totdisp); + printf("failed to read multires displacement %d/%d %d\n", i, count, d[i].totdisp); return 0; } } @@ -574,7 +574,7 @@ static int layerWrite_mdisps(CDataFile *cdf, void *data, int count) for(i = 0; i < count; ++i) { if(!cdf_write_data(cdf, d[i].totdisp*3*sizeof(float), d[i].disps)) { - printf("failed to write %d/%d %d\n", i, count, d[i].totdisp); + printf("failed to write multires displacement %d/%d %d\n", i, count, d[i].totdisp); return 0; } } @@ -735,7 +735,7 @@ static void layerInterp_mcol(void **sources, float *weights, } } -static void layerSwap_mcol(void *data, int *corner_indices) +static void layerSwap_mcol(void *data, const int *corner_indices) { MCol *mcol = data; MCol col[4]; @@ -798,10 +798,12 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { }; const char *LAYERTYPENAMES[CD_NUMTYPES] = { - "CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", "CDMTFace", - "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty", - "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", "CDMTexPoly", "CDMLoopUV", - "CDMloopCol", "CDTangent", "CDMDisps", "CDWeightMCol", "CDClothOrco"}; + /* 0-4 */ "CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", + /* 5-9 */ "CDMTFace", "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags", + /* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", + /* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps", + /* 20-23 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco" +}; const CustomDataMask CD_MASK_BAREMESH = CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE; @@ -1211,7 +1213,7 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data, data->layers[index].flag = flag; data->layers[index].data = newlayerdata; - if(name) { + if(name || (name=typeInfo->defaultname)) { strcpy(data->layers[index].name, name); CustomData_set_layer_unique_name(data, index); } @@ -1252,7 +1254,7 @@ void *CustomData_add_layer(CustomData *data, int type, int alloctype, /*same as above but accepts a name*/ void *CustomData_add_layer_named(CustomData *data, int type, int alloctype, - void *layerdata, int totelem, char *name) + void *layerdata, int totelem, const char *name) { CustomDataLayer *layer; @@ -1533,7 +1535,7 @@ void CustomData_interp(const CustomData *source, CustomData *dest, if(count > SOURCE_BUF_SIZE) MEM_freeN(sources); } -void CustomData_swap(struct CustomData *data, int index, int *corner_indices) +void CustomData_swap(struct CustomData *data, int index, const int *corner_indices) { const LayerTypeInfo *typeInfo; int i; @@ -2314,12 +2316,31 @@ int CustomData_verify_versions(struct CustomData *data, int index) static void customdata_external_filename(char filename[FILE_MAX], ID *id, CustomDataExternal *external) { - char *path = (id->lib)? id->lib->filename: G.sce; + char *path = (id->lib)? id->lib->filepath: G.sce; BLI_strncpy(filename, external->filename, FILE_MAX); BLI_path_abs(filename, path); } +void CustomData_external_reload(CustomData *data, ID *id, CustomDataMask mask, int totelem) +{ + CustomDataLayer *layer; + const LayerTypeInfo *typeInfo; + int i; + + for(i=0; i<data->totlayer; i++) { + layer = &data->layers[i]; + typeInfo = layerType_getInfo(layer->type); + + if(!(mask & (1<<layer->type))); + else if((layer->flag & CD_FLAG_EXTERNAL) && (layer->flag & CD_FLAG_IN_MEMORY)) { + if(typeInfo->free) + typeInfo->free(layer->data, totelem, typeInfo->size); + layer->flag &= ~CD_FLAG_IN_MEMORY; + } + } +} + void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int totelem) { CustomDataExternal *external= data->external; @@ -2487,9 +2508,9 @@ void CustomData_external_add(CustomData *data, ID *id, int type, int totelem, co if(!external) { external= MEM_callocN(sizeof(CustomDataExternal), "CustomDataExternal"); - BLI_strncpy(external->filename, filename, sizeof(external->filename)); data->external= external; } + BLI_strncpy(external->filename, filename, sizeof(external->filename)); layer->flag |= CD_FLAG_EXTERNAL|CD_FLAG_IN_MEMORY; } |