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

View File

@ -105,7 +105,7 @@ namespace vcg {
const int DGTVQ = vcg::tri::io::Precision<typename VertexType::QualityType>::digits();
const int DGTVR = vcg::tri::io::Precision<typename VertexType::RadiusType>::digits();
const int DGTFQ = vcg::tri::io::Precision<typename FaceType::QualityType>::digits();
bool multit = false;
bool saveTexIndexFlag = false;
if(binary) h=hbin;
else h=hasc;
@ -129,7 +129,7 @@ namespace vcg {
for(size_t i=0; i < m.textures.size(); ++i)
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))
@ -225,18 +225,22 @@ namespace vcg {
"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,
"property list uchar float texcoord\n"
);
}
// The per-face texture index information has to be saved (if necessary) both for PerVert and PerWedg
if( ( HasPerWedgeTexCoord(m) || HasPerVertexTexCoord(m) ) &&
( (pi.mask & Mask::IOM_WEDGTEXCOORD) || (pi.mask & Mask::IOM_VERTTEXCOORD ) ) )
// The texture index information has to be saved for each face (if necessary) both for PerVert and PerWedg
if( saveTexIndexFlag &&
( ( 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,
"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.
assert(j==m.vn);
char c = 3;
unsigned char b9 = 9;
unsigned char b6 = 6;
unsigned char b3char = 3;
unsigned char b9char = 9;
unsigned char b6char = 6;
FacePointer fp;
int vv[3];
FaceIterator fi;
@ -556,15 +560,15 @@ namespace vcg {
vv[0]=indices[fp->cV(0)];
vv[1]=indices[fp->cV(1)];
vv[2]=indices[fp->cV(2)];
fwrite(&c,1,1,fpout);
fwrite(&b3char,sizeof(char),1,fpout);
fwrite(vv,sizeof(int),3,fpout);
if(HasPerFaceFlags(m)&&( pi.mask & Mask::IOM_FACEFLAGS) )
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];
for(int k=0;k<3;++k)
{
@ -575,7 +579,7 @@ namespace vcg {
}
else if( HasPerWedgeTexCoord(m) && (pi.mask & Mask::IOM_WEDGTEXCOORD) )
{
fwrite(&b6,sizeof(char),1,fpout);
fwrite(&b6char,sizeof(char),1,fpout);
float t[6];
for(int k=0;k<3;++k)
{
@ -585,7 +589,7 @@ namespace vcg {
fwrite(t,sizeof(float),6,fpout);
}
if(multit)
if(saveTexIndexFlag)
{
int t = fp->WT(0).n();
fwrite(&t,sizeof(int),1,fpout);
@ -597,7 +601,7 @@ namespace vcg {
if( HasPerWedgeColor(m) && (pi.mask & Mask::IOM_WEDGCOLOR) )
{
fwrite(&b9,sizeof(char),1,fpout);
fwrite(&b9char,sizeof(char),1,fpout);
float t[3];
for(int z=0;z<3;++z)
{
@ -671,7 +675,7 @@ namespace vcg {
);
}
if(multit)
if(saveTexIndexFlag)
{
fprintf(fpout,"%d ",fp->WT(0).n());
}