Multires: fix for "failed to read" error message with external displacements.
This commit is contained in:
		| @@ -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"); | 			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)) { | 		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; | 			return 0; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -574,7 +574,7 @@ static int layerWrite_mdisps(CDataFile *cdf, void *data, int count) | |||||||
|  |  | ||||||
| 	for(i = 0; i < count; ++i) { | 	for(i = 0; i < count; ++i) { | ||||||
| 		if(!cdf_write_data(cdf, d[i].totdisp*3*sizeof(float), d[i].disps)) { | 		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; | 			return 0; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -264,6 +264,38 @@ int multiresModifier_reshapeFromDeformMod(MultiresModifierData *mmd, Object *ob, | |||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void multires_set_tot_mdisps(Mesh *me, int lvl) | ||||||
|  | { | ||||||
|  | 	MDisps *mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS); | ||||||
|  | 	int i; | ||||||
|  |  | ||||||
|  | 	if(mdisps) { | ||||||
|  | 		for(i = 0; i < me->totface; i++) { | ||||||
|  | 			if(mdisps[i].totdisp == 0) { | ||||||
|  | 				int nvert = (me->mface[i].v4)? 4: 3; | ||||||
|  | 				mdisps[i].totdisp = multires_grid_tot[lvl]*nvert; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  |  | ||||||
|  | 	/* reallocate displacements to be filled in */ | ||||||
|  | 	for(i = 0; i < me->totface; ++i) { | ||||||
|  | 		int nvert = (me->mface[i].v4)? 4: 3; | ||||||
|  | 		int totdisp = multires_grid_tot[lvl]*nvert; | ||||||
|  | 		float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps"); | ||||||
|  |  | ||||||
|  | 		if(mdisps[i].disps) | ||||||
|  | 			MEM_freeN(mdisps[i].disps); | ||||||
|  |  | ||||||
|  | 		mdisps[i].disps = disps; | ||||||
|  | 		mdisps[i].totdisp = totdisp; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], float v3[3]) | static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], float v3[3]) | ||||||
| { | { | ||||||
| @@ -320,6 +352,7 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire | |||||||
| 	int levels = mmd->totlvl - lvl; | 	int levels = mmd->totlvl - lvl; | ||||||
| 	MDisps *mdisps; | 	MDisps *mdisps; | ||||||
|  |  | ||||||
|  | 	multires_set_tot_mdisps(me, mmd->totlvl); | ||||||
| 	CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); | 	CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); | ||||||
| 	mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS); | 	mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS); | ||||||
|  |  | ||||||
| @@ -393,24 +426,6 @@ static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl | |||||||
| 	return subsurf_make_derived_from_derived(dm, &smd, 0, NULL, 0, 0); | 	return subsurf_make_derived_from_derived(dm, &smd, 0, NULL, 0, 0); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl) |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
|  |  | ||||||
| 	/* reallocate displacements to be filled in */ |  | ||||||
| 	for(i = 0; i < me->totface; ++i) { |  | ||||||
| 		int nvert = (me->mface[i].v4)? 4: 3; |  | ||||||
| 		int totdisp = multires_grid_tot[lvl]*nvert; |  | ||||||
| 		float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps"); |  | ||||||
|  |  | ||||||
| 		if(mdisps[i].disps) |  | ||||||
| 			MEM_freeN(mdisps[i].disps); |  | ||||||
|  |  | ||||||
| 		mdisps[i].disps = disps; |  | ||||||
| 		mdisps[i].totdisp = totdisp; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple) | void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple) | ||||||
| { | { | ||||||
| 	Mesh *me = ob->data; | 	Mesh *me = ob->data; | ||||||
| @@ -615,6 +630,7 @@ static void multiresModifier_update(DerivedMesh *dm) | |||||||
| 	ob = ccgdm->multires.ob; | 	ob = ccgdm->multires.ob; | ||||||
| 	me = ccgdm->multires.ob->data; | 	me = ccgdm->multires.ob->data; | ||||||
| 	mmd = ccgdm->multires.mmd; | 	mmd = ccgdm->multires.mmd; | ||||||
|  | 	multires_set_tot_mdisps(me, mmd->totlvl); | ||||||
| 	CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); | 	CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); | ||||||
| 	mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS); | 	mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS); | ||||||
|  |  | ||||||
| @@ -750,6 +766,7 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca | |||||||
| 		memcpy(subGridData[i], gridData[i], sizeof(DMGridData)*gridSize*gridSize); | 		memcpy(subGridData[i], gridData[i], sizeof(DMGridData)*gridSize*gridSize); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	multires_set_tot_mdisps(me, mmd->totlvl); | ||||||
| 	CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); | 	CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); | ||||||
| 	multiresModifier_disp_run(result, ob->data, 0, 0, subGridData, mmd->totlvl); | 	multiresModifier_disp_run(result, ob->data, 0, 0, subGridData, mmd->totlvl); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user