Corrected bug in texture saving (vt vs wt clash)

It does not worked when trying to save per vert tex in a mesh with also per-wedge.
This commit is contained in:
Paolo Cignoni 2018-04-05 11:36:19 +02:00
parent ce1f23a37b
commit 524f8e8a61
1 changed files with 22 additions and 18 deletions
wrap/io_trimesh

View File

@ -105,7 +105,7 @@ namespace vcg {
const int DGTVQ = vcg::tri::io::Precision<typename VertexType::QualityType>::digits(); const int DGTVQ = vcg::tri::io::Precision<typename VertexType::QualityType>::digits();
const int DGTVR = vcg::tri::io::Precision<typename VertexType::RadiusType>::digits(); const int DGTVR = vcg::tri::io::Precision<typename VertexType::RadiusType>::digits();
const int DGTFQ = vcg::tri::io::Precision<typename FaceType::QualityType>::digits(); const int DGTFQ = vcg::tri::io::Precision<typename FaceType::QualityType>::digits();
bool multit = false; bool saveTexIndexFlag = false;
if(binary) h=hbin; if(binary) h=hbin;
else h=hasc; else h=hasc;
@ -129,7 +129,7 @@ namespace vcg {
for(size_t i=0; i < m.textures.size(); ++i) for(size_t i=0; i < m.textures.size(); ++i)
fprintf(fpout,"comment %s %s\n", TFILE, (const char *)(m.textures[i].c_str()) ); fprintf(fpout,"comment %s %s\n", TFILE, (const char *)(m.textures[i].c_str()) );
if(m.textures.size()>1 && (HasPerWedgeTexCoord(m) || HasPerVertexTexCoord(m))) multit = true; if(m.textures.size()>1 && (HasPerWedgeTexCoord(m) || HasPerVertexTexCoord(m))) saveTexIndexFlag = true;
} }
if((pi.mask & Mask::IOM_CAMERA)) if((pi.mask & Mask::IOM_CAMERA))
@ -225,18 +225,22 @@ namespace vcg {
"property int flags\n" "property int flags\n"
); );
} }
// Note that you can save VT as WT if you really want it...
if( (HasPerWedgeTexCoord(m) || HasPerVertexTexCoord(m) ) && pi.mask & Mask::IOM_WEDGTEXCOORD ) if( (HasPerWedgeTexCoord(m) && pi.mask & Mask::IOM_WEDGTEXCOORD ) ||
(HasPerVertexTexCoord(m) && (!HasPerWedgeTexCoord(m)) && pi.mask & Mask::IOM_WEDGTEXCOORD ) ) // Note that you can save VT as WT if you really really want it...
{ {
fprintf(fpout, fprintf(fpout,
"property list uchar float texcoord\n" "property list uchar float texcoord\n"
); );
} }
// The per-face texture index information has to be saved (if necessary) both for PerVert and PerWedg // The texture index information has to be saved for each face (if necessary) both for PerVert and PerWedg
if( ( HasPerWedgeTexCoord(m) || HasPerVertexTexCoord(m) ) && if( saveTexIndexFlag &&
( (pi.mask & Mask::IOM_WEDGTEXCOORD) || (pi.mask & Mask::IOM_VERTTEXCOORD ) ) ) ( ( HasPerWedgeTexCoord(m) && (pi.mask & Mask::IOM_WEDGTEXCOORD) ) ||
( HasPerVertexTexCoord(m) && (pi.mask & Mask::IOM_VERTTEXCOORD) ) ||
( HasPerVertexTexCoord(m) && (!HasPerWedgeTexCoord(m)) && (pi.mask & Mask::IOM_WEDGTEXCOORD) )
)
)
{ {
if(multit)
fprintf(fpout, fprintf(fpout,
"property int texnumber\n" "property int texnumber\n"
); );
@ -535,9 +539,9 @@ namespace vcg {
// this assert triggers when the vn != number of vertexes in vert that are not deleted. // this assert triggers when the vn != number of vertexes in vert that are not deleted.
assert(j==m.vn); assert(j==m.vn);
char c = 3; unsigned char b3char = 3;
unsigned char b9 = 9; unsigned char b9char = 9;
unsigned char b6 = 6; unsigned char b6char = 6;
FacePointer fp; FacePointer fp;
int vv[3]; int vv[3];
FaceIterator fi; FaceIterator fi;
@ -556,15 +560,15 @@ namespace vcg {
vv[0]=indices[fp->cV(0)]; vv[0]=indices[fp->cV(0)];
vv[1]=indices[fp->cV(1)]; vv[1]=indices[fp->cV(1)];
vv[2]=indices[fp->cV(2)]; vv[2]=indices[fp->cV(2)];
fwrite(&c,1,1,fpout); fwrite(&b3char,sizeof(char),1,fpout);
fwrite(vv,sizeof(int),3,fpout); fwrite(vv,sizeof(int),3,fpout);
if(HasPerFaceFlags(m)&&( pi.mask & Mask::IOM_FACEFLAGS) ) if(HasPerFaceFlags(m)&&( pi.mask & Mask::IOM_FACEFLAGS) )
fwrite(&(fp->Flags()),sizeof(int),1,fpout); fwrite(&(fp->Flags()),sizeof(int),1,fpout);
if( HasPerVertexTexCoord(m) && (pi.mask & Mask::IOM_VERTTEXCOORD) ) if( HasPerVertexTexCoord(m) && (!HasPerWedgeTexCoord(m)) && (pi.mask & Mask::IOM_WEDGTEXCOORD) ) // Note that you can save VT as WT if you really want it...
{ {
fwrite(&b6,sizeof(char),1,fpout); fwrite(&b6char,sizeof(char),1,fpout);
float t[6]; float t[6];
for(int k=0;k<3;++k) for(int k=0;k<3;++k)
{ {
@ -575,7 +579,7 @@ namespace vcg {
} }
else if( HasPerWedgeTexCoord(m) && (pi.mask & Mask::IOM_WEDGTEXCOORD) ) else if( HasPerWedgeTexCoord(m) && (pi.mask & Mask::IOM_WEDGTEXCOORD) )
{ {
fwrite(&b6,sizeof(char),1,fpout); fwrite(&b6char,sizeof(char),1,fpout);
float t[6]; float t[6];
for(int k=0;k<3;++k) for(int k=0;k<3;++k)
{ {
@ -585,7 +589,7 @@ namespace vcg {
fwrite(t,sizeof(float),6,fpout); fwrite(t,sizeof(float),6,fpout);
} }
if(multit) if(saveTexIndexFlag)
{ {
int t = fp->WT(0).n(); int t = fp->WT(0).n();
fwrite(&t,sizeof(int),1,fpout); fwrite(&t,sizeof(int),1,fpout);
@ -597,7 +601,7 @@ namespace vcg {
if( HasPerWedgeColor(m) && (pi.mask & Mask::IOM_WEDGCOLOR) ) if( HasPerWedgeColor(m) && (pi.mask & Mask::IOM_WEDGCOLOR) )
{ {
fwrite(&b9,sizeof(char),1,fpout); fwrite(&b9char,sizeof(char),1,fpout);
float t[3]; float t[3];
for(int z=0;z<3;++z) for(int z=0;z<3;++z)
{ {
@ -671,7 +675,7 @@ namespace vcg {
); );
} }
if(multit) if(saveTexIndexFlag)
{ {
fprintf(fpout,"%d ",fp->WT(0).n()); fprintf(fpout,"%d ",fp->WT(0).n());
} }