From: <dan...@us...> - 2007-10-11 02:06:37
|
Revision: 11678 http://vegastrike.svn.sourceforge.net/vegastrike/?rev=11678&view=rev Author: danielrh Date: 2007-10-10 19:06:39 -0700 (Wed, 10 Oct 2007) Log Message: ----------- import obj files with actual shared texture coordinates Modified Paths: -------------- trunk/vegastrike/objconv/mesher/converter.cpp trunk/vegastrike/objconv/mesher/from_BFXM.cpp trunk/vegastrike/objconv/mesher/from_obj.cpp trunk/vegastrike/objconv/mesher/mesher.sln trunk/vegastrike/objconv/mesher/mesher.vcproj trunk/vegastrike/objconv/mesher/to_BFXM.cpp trunk/vegastrike/objconv/mesher/to_BFXM.h Modified: trunk/vegastrike/objconv/mesher/converter.cpp =================================================================== --- trunk/vegastrike/objconv/mesher/converter.cpp 2007-10-10 19:08:01 UTC (rev 11677) +++ trunk/vegastrike/objconv/mesher/converter.cpp 2007-10-11 02:06:39 UTC (rev 11678) @@ -136,11 +136,11 @@ Outputfile=fopen(argv[2],"rb+"); //append to end, but not append, which doesn't do what you want it to. fseek(Outputfile, 0, SEEK_END); XML memfile=(LoadXML(argv[1],1)); - xmeshToBFXM(memfile,Outputfile,'a',forcenormals); + xmeshToBFXM(memfile,Outputfile,'a',forcenormals,false); }else if(createBFXMfromxmesh){ Outputfile=fopen(argv[2],"wb+"); //create file for BFXM output XML memfile=(LoadXML(argv[1],1)); - xmeshToBFXM(memfile,Outputfile,'c',forcenormals); + xmeshToBFXM(memfile,Outputfile,'c',forcenormals,false); } else if(createxmeshesfromBFXM){ FILE* Inputfile=fopen(argv[1],"rb"); Outputfile=fopen(argv[2],"w+"); //create file for text output Modified: trunk/vegastrike/objconv/mesher/from_BFXM.cpp =================================================================== --- trunk/vegastrike/objconv/mesher/from_BFXM.cpp 2007-10-10 19:08:01 UTC (rev 11677) +++ trunk/vegastrike/objconv/mesher/from_BFXM.cpp 2007-10-11 02:06:39 UTC (rev 11678) @@ -415,15 +415,25 @@ int32bit numlines=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//number of vertices word32index+=1; for(int32bit rvert=0;rvert<numlines;rvert++){ - int32bit flatshade=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//flatshade - word32index+=NUMFIELDSPERPOLYGONSTRUCTURE; - int32bit ind1=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 - float32bit s1=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t1=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; + int32bit flatshade=0; + float32bit s1=0,t1=0,s2=0,t2=0; + if (NUMFIELDSPERPOLYGONSTRUCTURE>0) { + flatshade=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//flatshade + } + word32index+=NUMFIELDSPERPOLYGONSTRUCTURE; + int32bit ind1=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s1=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t1=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + }else { + s1=t1=0; + } + word32index+=NUMFIELDSPERREFERENCEDVERTEX; int32bit ind2=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 2 - float32bit s2=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t2=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s2=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t2=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + } word32index+=NUMFIELDSPERREFERENCEDVERTEX; if(isxmesh){ fprintf(Outputfile,"\t<Line flatshade=\"%d\">\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t</Line>\n",flatshade,ind1,s1,t1,ind2,s2,t2); @@ -451,94 +461,116 @@ int32bit numtris=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//number of vertices word32index+=1; for(int32bit rtvert=0;rtvert<numtris;rtvert++){ - int32bit flatshade=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//flatshade - word32index+=NUMFIELDSPERPOLYGONSTRUCTURE; - int32bit ind1=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 - float32bit s1=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t1=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; - int32bit ind2=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 2 - float32bit s2=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t2=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; - int32bit ind3=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 3 - float32bit s3=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t3=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; - if(isxmesh){ - fprintf(Outputfile,"\t<Tri flatshade=\"%d\">\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t</Tri>\n",flatshade,ind1,s1,t1,ind2,s2,t2,ind3,s3,t3); - } - int texind1 = ind1+texoffset; - int texind2 = ind2+texoffset; - int texind3 = ind3+texoffset; - if (!sharevert) { - if(!isxmesh){ - fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s1:s1),(flipt?t1:1.0f-t1)); - fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s2:s2),(flipt?t2:1.0f-t2)); - fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s3:s3),(flipt?t3:1.0f-t3)); - } + int32bit flatshade=0; + float32bit s1=0,t1=0,s2=0,t2=0,s3=0,t3=0; + if (NUMFIELDSPERPOLYGONSTRUCTURE>0) { + flatshade=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//flatshade + } + word32index+=NUMFIELDSPERPOLYGONSTRUCTURE; + int32bit ind1=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s1=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t1=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + } + word32index+=NUMFIELDSPERREFERENCEDVERTEX; + int32bit ind2=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 2 + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s2=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t2=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + } + word32index+=NUMFIELDSPERREFERENCEDVERTEX; + int32bit ind3=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 3 + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s3=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t3=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + } + word32index+=NUMFIELDSPERREFERENCEDVERTEX; + if(isxmesh){ + fprintf(Outputfile,"\t<Tri flatshade=\"%d\">\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t</Tri>\n",flatshade,ind1,s1,t1,ind2,s2,t2,ind3,s3,t3); + } + int texind1 = ind1+texoffset; + int texind2 = ind2+texoffset; + int texind3 = ind3+texoffset; + if (!sharevert) { + if(!isxmesh){ + fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s1:s1),(flipt?t1:1.0f-t1)); + fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s2:s2),(flipt?t2:1.0f-t2)); + fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s3:s3),(flipt?t3:1.0f-t3)); + } texcount+=3; texind1=texcount-3; texind2=texcount-2; texind3=texcount-1; - } - if(!isxmesh){ - fprintf (OutputObj,"f %d/%d/%d %d/%d/%d %d/%d/%d\n", - ind1+indoffset,texind1,ind1+normoffset, - ind2+indoffset,texind2,ind2+normoffset, - ind3+indoffset,texind3,ind3+normoffset); - } + } + if(!isxmesh){ + fprintf (OutputObj,"f %d/%d/%d %d/%d/%d %d/%d/%d\n", + ind1+indoffset,texind1,ind1+normoffset, + ind2+indoffset,texind2,ind2+normoffset, + ind3+indoffset,texind3,ind3+normoffset); + } } //End Triangles //Quads int32bit numquads=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//number of vertices word32index+=1; for(int32bit rqvert=0;rqvert<numquads;rqvert++){ - int32bit flatshade=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//flatshade - word32index+=NUMFIELDSPERPOLYGONSTRUCTURE; - int32bit ind1=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 - float32bit s1=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t1=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; + int32bit flatshade=0; + float32bit s1=0,t1=0,s2=0,t2=0,s3=0,t3=0,s4=0,t4=0; + if (NUMFIELDSPERPOLYGONSTRUCTURE>0) { + flatshade=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//flatshade + } + word32index+=NUMFIELDSPERPOLYGONSTRUCTURE; + int32bit ind1=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s1=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t1=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + } + word32index+=NUMFIELDSPERREFERENCEDVERTEX; int32bit ind2=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 2 - float32bit s2=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t2=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; - int32bit ind3=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 3 - float32bit s3=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t3=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; - int32bit ind4=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 3 - float32bit s4=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t4=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; - if(isxmesh){ - fprintf(Outputfile,"\t<Quad flatshade=\"%d\">\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t</Quad>\n",flatshade,ind1,s1,t1,ind2,s2,t2,ind3,s3,t3,ind4,s4,t4); - } - int texind1 = ind1+texoffset; - int texind2 = ind2+texoffset; - int texind3 = ind3+texoffset; - int texind4 = ind4+texoffset; - if (!sharevert) { - if(!isxmesh){ - fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s1:s1),(flipt?t1:1.0f-t1)); - fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s2:s2),(flipt?t2:1.0f-t2)); - fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s3:s3),(flipt?t3:1.0f-t3)); - fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s4:s4),(flipt?t4:1.0f-t4)); - } + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s2=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t2=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + } + word32index+=NUMFIELDSPERREFERENCEDVERTEX; + int32bit ind3=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 3 + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s3=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t3=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + } + word32index+=NUMFIELDSPERREFERENCEDVERTEX; + int32bit ind4=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 3 + if (NUMFIELDSPERREFERENCEDVERTEX>=3) { + s4=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s + t4=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + } + word32index+=NUMFIELDSPERREFERENCEDVERTEX; + if(isxmesh){ + fprintf(Outputfile,"\t<Quad flatshade=\"%d\">\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n\t</Quad>\n",flatshade,ind1,s1,t1,ind2,s2,t2,ind3,s3,t3,ind4,s4,t4); + } + int texind1 = ind1+texoffset; + int texind2 = ind2+texoffset; + int texind3 = ind3+texoffset; + int texind4 = ind4+texoffset; + if (!sharevert) { + if(!isxmesh){ + fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s1:s1),(flipt?t1:1.0f-t1)); + fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s2:s2),(flipt?t2:1.0f-t2)); + fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s3:s3),(flipt?t3:1.0f-t3)); + fprintf (OutputObj,"vt %f %f\n",(flips?1.0f-s4:s4),(flipt?t4:1.0f-t4)); + } texcount+=4; texind1=texcount-4; texind2=texcount-3; texind3=texcount-2; texind4=texcount-1; - } - if(!isxmesh){ - fprintf (OutputObj,"f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d\n", - ind1+indoffset,texind1,ind1+normoffset, - ind2+indoffset,texind2,ind2+normoffset, - ind3+indoffset,texind3,ind3+normoffset, - ind4+indoffset,texind4,ind4+normoffset); - } + } + if(!isxmesh){ + fprintf (OutputObj,"f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d\n", + ind1+indoffset,texind1,ind1+normoffset, + ind2+indoffset,texind2,ind2+normoffset, + ind3+indoffset,texind3,ind3+normoffset, + ind4+indoffset,texind4,ind4+normoffset); + } } //End Quads //Linestrips @@ -546,16 +578,19 @@ word32index+=1; for(int32bit lstrip=0;lstrip<numlinestrips;lstrip++){ int32bit numstripelements=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//number of vertices - int32bit flatshade=VSSwapHostIntToLittle(inmemfile[word32index+1].i32val);//flatshade + int32bit flatshade=0; + if (NUMFIELDSPERPOLYGONSTRUCTURE>0) { + flatshade=VSSwapHostIntToLittle(inmemfile[word32index+1].i32val);//flatshade + } if(isxmesh){ fprintf(Outputfile,"\t<Linestrip flatshade=\"%d\">\n",flatshade); } word32index+=1+NUMFIELDSPERPOLYGONSTRUCTURE; for(int32bit elem=0;elem<numstripelements;elem++){ int32bit ind=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 - float32bit s=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t - word32index+=NUMFIELDSPERREFERENCEDVERTEX; + float32bit s=NUMFIELDSPERREFERENCEDVERTEX>=3?VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val):0;;//s + float32bit t=NUMFIELDSPERREFERENCEDVERTEX>=3?VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val):0;//t + word32index+=NUMFIELDSPERREFERENCEDVERTEX; if(isxmesh){ fprintf(Outputfile,"\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n",ind,s,t); } @@ -570,7 +605,7 @@ word32index+=1; for(int32bit tstrip=0;tstrip<numtristrips;tstrip++){ int32bit numstripelements=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//number of vertices - int32bit flatshade=VSSwapHostIntToLittle(inmemfile[word32index+1].i32val);//flatshade + int32bit flatshade=NUMFIELDSPERPOLYGONSTRUCTURE?VSSwapHostIntToLittle(inmemfile[word32index+1].i32val):0;//flatshade if(isxmesh){ fprintf(Outputfile,"\t<Tristrip flatshade=\"%d\">\n",flatshade); } @@ -579,8 +614,8 @@ int indo1=0,indo2=0; for(int32bit elem=0;elem<numstripelements;elem++){ int32bit ind=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 - float32bit s=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + float32bit s=NUMFIELDSPERREFERENCEDVERTEX>=3?VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val):0;//s + float32bit t=NUMFIELDSPERREFERENCEDVERTEX>=3?VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val):0;//t word32index+=NUMFIELDSPERREFERENCEDVERTEX; if(isxmesh){ fprintf(Outputfile,"\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n",ind,s,t); @@ -623,7 +658,7 @@ word32index+=1; for(int32bit tfan=0;tfan<numtrifans;tfan++){ int32bit numstripelements=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//number of vertices - int32bit flatshade=VSSwapHostIntToLittle(inmemfile[word32index+1].i32val);//flatshade + int32bit flatshade=NUMFIELDSPERPOLYGONSTRUCTURE?VSSwapHostIntToLittle(inmemfile[word32index+1].i32val):0;//flatshade if(isxmesh){ fprintf(Outputfile,"\t<Trifan flatshade=\"%d\">\n",flatshade); } @@ -631,8 +666,8 @@ int indo1=0,indo2=0,to1=0,to2=0; for(int32bit elem=0;elem<numstripelements;elem++){ int32bit ind=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 - float32bit s=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + float32bit s=NUMFIELDSPERREFERENCEDVERTEX>=3?VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val):0;//s + float32bit t=NUMFIELDSPERREFERENCEDVERTEX>=3?VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val):0;//t word32index+=NUMFIELDSPERREFERENCEDVERTEX; if(isxmesh){ fprintf(Outputfile,"\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n",ind,s,t); @@ -670,7 +705,7 @@ word32index+=1; for(int32bit qstrip=0;qstrip<numquadstrips;qstrip++){ int32bit numstripelements=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//number of vertices - int32bit flatshade=VSSwapHostIntToLittle(inmemfile[word32index+1].i32val);//flatshade + int32bit flatshade=NUMFIELDSPERPOLYGONSTRUCTURE?VSSwapHostIntToLittle(inmemfile[word32index+1].i32val):0;//flatshade if(isxmesh){ fprintf(Outputfile,"\t<Quadstrip flatshade=\"%d\">\n",flatshade); } @@ -678,8 +713,8 @@ int indo1=0,indo2=0,to1=0,to2=0; for(int32bit elem=0;elem<numstripelements;elem++){ int32bit ind=VSSwapHostIntToLittle(inmemfile[word32index].i32val);//index 1 - float32bit s=VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val);//s - float32bit t=VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val);//t + float32bit s=NUMFIELDSPERREFERENCEDVERTEX>=3?VSSwapHostFloatToLittle(inmemfile[word32index+1].f32val):0;//s + float32bit t=NUMFIELDSPERREFERENCEDVERTEX>=3?VSSwapHostFloatToLittle(inmemfile[word32index+2].f32val):0;//t word32index+=NUMFIELDSPERREFERENCEDVERTEX; if(isxmesh){ fprintf(Outputfile,"\t\t<Vertex point=\"%d\" s=\"%f\" t=\"%f\"/>\n",ind,s,t); Modified: trunk/vegastrike/objconv/mesher/from_obj.cpp =================================================================== --- trunk/vegastrike/objconv/mesher/from_obj.cpp 2007-10-10 19:08:01 UTC (rev 11677) +++ trunk/vegastrike/objconv/mesher/from_obj.cpp 2007-10-11 02:06:39 UTC (rev 11678) @@ -562,9 +562,9 @@ int totface=0; for (map<string,vector<FACE> >::iterator it=facelistlist.begin(); it!=facelistlist.end(); it++) { XML xml; - + string mat=(*it).first; - + xml.sharevert=true; xml.vertices.clear(); xml.tris.clear(); xml.quads.clear(); @@ -609,6 +609,6 @@ int textnum=0; for (vector<XML>::iterator it=xmllist.begin(); it!=xmllist.end(); ++it,++textnum) { - xmeshToBFXM(*it,outputFile,textnum==0?'c':'a',forcenormals); + xmeshToBFXM(*it,outputFile,textnum==0?'c':'a',forcenormals,true); } } Modified: trunk/vegastrike/objconv/mesher/mesher.sln =================================================================== (Binary files differ) Modified: trunk/vegastrike/objconv/mesher/mesher.vcproj =================================================================== (Binary files differ) Modified: trunk/vegastrike/objconv/mesher/to_BFXM.cpp =================================================================== --- trunk/vegastrike/objconv/mesher/to_BFXM.cpp 2007-10-10 19:08:01 UTC (rev 11677) +++ trunk/vegastrike/objconv/mesher/to_BFXM.cpp 2007-10-11 02:06:39 UTC (rev 11678) @@ -897,17 +897,17 @@ return xml; } -void xmeshToBFXM(XML memfile,FILE* Outputfile,char mode,bool forcenormals){//converts input file to BFXM creates new, or appends record based on mode +void xmeshToBFXM(XML memfile,FILE* Outputfile,char mode,bool forcenormals, bool force_shared_vertex){//converts input file to BFXM creates new, or appends record based on mode unsigned int32bit intbuf; bool append=(mode=='a'); int32bit runningbytenum=0; if(!append){ - runningbytenum+=writesuperheader(memfile,Outputfile); // Write superheader + runningbytenum+=writesuperheader(memfile,Outputfile,force_shared_vertex); // Write superheader } fseek(Outputfile,0,SEEK_END); - runningbytenum+=appendrecordfromxml(memfile,Outputfile,forcenormals); //Append one record + runningbytenum+=appendrecordfromxml(memfile,Outputfile,forcenormals,force_shared_vertex); //Append one record rewind(Outputfile); fseek(Outputfile,4+7*sizeof(int32bit),SEEK_SET); @@ -927,7 +927,7 @@ fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Correct number of bytes for total file } extern float transx,transy,transz; -int32bit writesuperheader(XML memfile, FILE* Outputfile){ +int32bit writesuperheader(XML memfile, FILE* Outputfile, bool force_shared){ unsigned int32bit intbuf; int32bit versionnumber=VSSwapHostIntToLittle(20); char8bit bytebuf; @@ -950,9 +950,9 @@ runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);// Number of bytes in Superheader intbuf=VSSwapHostIntToLittle(8);//Number of fields per vertex runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);// - intbuf=VSSwapHostIntToLittle(1);//Number of fields per polygon structure + intbuf=VSSwapHostIntToLittle(force_shared?0:1);//Number of fields per polygon structure runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);// - intbuf=VSSwapHostIntToLittle(3);//Number of fields per referenced vertex + intbuf=VSSwapHostIntToLittle(force_shared?1:3);//Number of fields per referenced vertex runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);// intbuf=VSSwapHostIntToLittle(1);//Number of fields per referenced animation runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);// @@ -963,7 +963,7 @@ return runningbytenum; } -int32bit appendrecordfromxml(XML memfile, FILE* Outputfile,bool forcenormals){ +int32bit appendrecordfromxml(XML memfile, FILE* Outputfile,bool forcenormals, bool force_shared_vertex){ unsigned int32bit intbuf; int32bit runningbytenum=0; //Record Header @@ -974,7 +974,7 @@ intbuf=VSSwapHostIntToLittle(1+memfile.LODs.size()+memfile.animframes.size());//Number of meshes = 1 + numLODs + numAnims. runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);// Number of meshes - runningbytenum+=appendmeshfromxml(memfile,Outputfile,forcenormals); // write top level mesh + runningbytenum+=appendmeshfromxml(memfile,Outputfile,forcenormals,force_shared_vertex); // write top level mesh int32bit mesh; for(mesh=0;mesh<memfile.LODs.size();mesh++){ //write all LOD meshes string LODname=""; @@ -982,7 +982,7 @@ LODname+=memfile.LODs[mesh].name[i]; } XML submesh=LoadXML(LODname.c_str(),1); - runningbytenum+=appendmeshfromxml(submesh,Outputfile,forcenormals); + runningbytenum+=appendmeshfromxml(submesh,Outputfile,forcenormals,force_shared_vertex); } for(mesh=0;mesh<memfile.animframes.size();mesh++){ //write all Animation Frames string animname=""; @@ -990,7 +990,7 @@ animname+=memfile.animframes[mesh].name[i]; } XML submesh=LoadXML(animname.c_str(),1); - runningbytenum+=appendmeshfromxml(submesh,Outputfile,forcenormals); + runningbytenum+=appendmeshfromxml(submesh,Outputfile,forcenormals,force_shared_vertex); } fseek(Outputfile,(-1*(runningbytenum))+4,SEEK_CUR); @@ -1018,7 +1018,7 @@ NormalizeProperty(m.sr,m.sg,m.sb,m.sa); NormalizeProperty(m.er,m.eg,m.eb,m.ea); } -int32bit appendmeshfromxml(XML memfile, FILE* Outputfile,bool forcenormals){ +int32bit appendmeshfromxml(XML memfile, FILE* Outputfile,bool forcenormals, bool force_shared_vertex){ unsigned int32bit intbuf; float32bit floatbuf; char8bit bytebuf; @@ -1035,7 +1035,7 @@ runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//reverse flag intbuf= VSSwapHostIntToLittle(memfile.force_texture); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Force texture flag - intbuf= VSSwapHostIntToLittle(memfile.sharevert); + intbuf= VSSwapHostIntToLittle(memfile.sharevert||force_shared_vertex); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Share vertex flag floatbuf= VSSwapHostFloatToLittle(memfile.polygon_offset); runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//Polygon offset @@ -1260,59 +1260,75 @@ intbuf= VSSwapHostIntToLittle(memfile.lines.size()); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Number of lines for(int32bit lines=0;lines<memfile.lines.size();lines++){ + if (!force_shared_vertex) { intbuf= VSSwapHostIntToLittle(memfile.lines[lines].flatshade); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag - for(int32bit tmpcounter=0;tmpcounter<2;tmpcounter++){ - intbuf= VSSwapHostIntToLittle(memfile.lines[lines].indexref[tmpcounter]); - runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index - floatbuf= VSSwapHostFloatToLittle(memfile.lines[lines].s[tmpcounter]); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord - floatbuf= VSSwapHostFloatToLittle(memfile.lines[lines].t[tmpcounter]); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord - } + } + for(int32bit tmpcounter=0;tmpcounter<2;tmpcounter++){ + intbuf= VSSwapHostIntToLittle(memfile.lines[lines].indexref[tmpcounter]); + runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index + if (!force_shared_vertex) { + floatbuf= VSSwapHostFloatToLittle(memfile.lines[lines].s[tmpcounter]); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord + floatbuf= VSSwapHostFloatToLittle(memfile.lines[lines].t[tmpcounter]); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + } + } } intbuf= VSSwapHostIntToLittle(memfile.tris.size()); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Number of triangles for(int32bit tris=0;tris<memfile.tris.size();tris++){ + if (!force_shared_vertex) { intbuf= VSSwapHostIntToLittle(memfile.tris[tris].flatshade); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag - for(int32bit tmpcounter=0;tmpcounter<3;tmpcounter++){ - intbuf= VSSwapHostIntToLittle(memfile.tris[tris].indexref[tmpcounter]); - runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index - floatbuf= VSSwapHostFloatToLittle(memfile.tris[tris].s[tmpcounter]); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord - floatbuf= VSSwapHostFloatToLittle(memfile.tris[tris].t[tmpcounter]); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord - } + } + for(int32bit tmpcounter=0;tmpcounter<3;tmpcounter++){ + intbuf= VSSwapHostIntToLittle(memfile.tris[tris].indexref[tmpcounter]); + runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index + if (!force_shared_vertex) { + floatbuf= VSSwapHostFloatToLittle(memfile.tris[tris].s[tmpcounter]); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord + floatbuf= VSSwapHostFloatToLittle(memfile.tris[tris].t[tmpcounter]); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + } + } } intbuf= VSSwapHostIntToLittle(memfile.quads.size()); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Number of Quads for(int32bit quads=0;quads<memfile.quads.size();quads++){ - intbuf= VSSwapHostIntToLittle(memfile.quads[quads].flatshade); - runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag - for(int32bit tmpcounter=0;tmpcounter<4;tmpcounter++){ - intbuf= VSSwapHostIntToLittle(memfile.quads[quads].indexref[tmpcounter]); - runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index + if (!force_shared_vertex) { + intbuf= VSSwapHostIntToLittle(memfile.quads[quads].flatshade); + runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + } + for(int32bit tmpcounter=0;tmpcounter<4;tmpcounter++){ + intbuf= VSSwapHostIntToLittle(memfile.quads[quads].indexref[tmpcounter]); + runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index + if (!force_shared_vertex) { floatbuf= VSSwapHostFloatToLittle(memfile.quads[quads].s[tmpcounter]); runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord floatbuf= VSSwapHostFloatToLittle(memfile.quads[quads].t[tmpcounter]); runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord - } + } + } } intbuf= VSSwapHostIntToLittle(memfile.linestrips.size()); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Number of linestrips for(int32bit ls=0;ls<memfile.linestrips.size();ls++){ intbuf= VSSwapHostIntToLittle(memfile.linestrips[ls].points.size()); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Number of elements in current linestrip - intbuf= VSSwapHostIntToLittle(memfile.linestrips[ls].flatshade); - runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + if (!force_shared_vertex) { + intbuf= VSSwapHostIntToLittle(memfile.linestrips[ls].flatshade); + runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + } for(int32bit tmpcounter=0;tmpcounter<memfile.linestrips[ls].points.size();tmpcounter++){ intbuf= VSSwapHostIntToLittle(memfile.linestrips[ls].points[tmpcounter].indexref); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index - floatbuf= VSSwapHostFloatToLittle(memfile.linestrips[ls].points[tmpcounter].s); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord - floatbuf= VSSwapHostFloatToLittle(memfile.linestrips[ls].points[tmpcounter].t); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + if (!force_shared_vertex) { + floatbuf= VSSwapHostFloatToLittle(memfile.linestrips[ls].points[tmpcounter].s); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord + floatbuf= VSSwapHostFloatToLittle(memfile.linestrips[ls].points[tmpcounter].t); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + } } } intbuf= VSSwapHostIntToLittle(memfile.tristrips.size()); @@ -1320,15 +1336,19 @@ for(int32bit ts=0;ts<memfile.tristrips.size();ts++){ intbuf= VSSwapHostIntToLittle(memfile.tristrips[ts].points.size()); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Number of elements in current tristrip - intbuf= VSSwapHostIntToLittle(memfile.tristrips[ts].flatshade); - runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + if (!force_shared_vertex) { + intbuf= VSSwapHostIntToLittle(memfile.tristrips[ts].flatshade); + runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + } for(int32bit tmpcounter=0;tmpcounter<memfile.tristrips[ts].points.size();tmpcounter++){ intbuf= VSSwapHostIntToLittle(memfile.tristrips[ts].points[tmpcounter].indexref); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index - floatbuf= VSSwapHostFloatToLittle(memfile.tristrips[ts].points[tmpcounter].s); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord - floatbuf= VSSwapHostFloatToLittle(memfile.tristrips[ts].points[tmpcounter].t); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + if (!force_shared_vertex) { + floatbuf= VSSwapHostFloatToLittle(memfile.tristrips[ts].points[tmpcounter].s); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord + floatbuf= VSSwapHostFloatToLittle(memfile.tristrips[ts].points[tmpcounter].t); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + } } } intbuf= VSSwapHostIntToLittle(memfile.trifans.size()); @@ -1336,15 +1356,19 @@ for(int32bit tf=0;tf<memfile.trifans.size();tf++){ intbuf= VSSwapHostIntToLittle(memfile.trifans[tf].points.size()); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Number of elements in current trifan - intbuf= VSSwapHostIntToLittle(memfile.trifans[tf].flatshade); - runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + if (!force_shared_vertex) { + intbuf= VSSwapHostIntToLittle(memfile.trifans[tf].flatshade); + runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + } for(int32bit tmpcounter=0;tmpcounter<memfile.trifans[tf].points.size();tmpcounter++){ intbuf= VSSwapHostIntToLittle(memfile.trifans[tf].points[tmpcounter].indexref); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index - floatbuf= VSSwapHostFloatToLittle(memfile.trifans[tf].points[tmpcounter].s); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord - floatbuf= VSSwapHostFloatToLittle(memfile.trifans[tf].points[tmpcounter].t); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + if (!force_shared_vertex) { + floatbuf= VSSwapHostFloatToLittle(memfile.trifans[tf].points[tmpcounter].s); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord + floatbuf= VSSwapHostFloatToLittle(memfile.trifans[tf].points[tmpcounter].t); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + } } } intbuf= VSSwapHostIntToLittle(memfile.quadstrips.size()); @@ -1352,15 +1376,19 @@ for(int32bit qs=0;qs<memfile.quadstrips.size();qs++){ intbuf= VSSwapHostIntToLittle(memfile.quadstrips[qs].points.size()); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Number of elements in current quadstrip - intbuf= VSSwapHostIntToLittle(memfile.quadstrips[qs].flatshade); - runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + if (!force_shared_vertex) { + intbuf= VSSwapHostIntToLittle(memfile.quadstrips[qs].flatshade); + runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//Flatshade flag + } for(int32bit tmpcounter=0;tmpcounter<memfile.quadstrips[qs].points.size();tmpcounter++){ intbuf= VSSwapHostIntToLittle(memfile.quadstrips[qs].points[tmpcounter].indexref); runningbytenum+=sizeof(int32bit)*fwrite(&intbuf,sizeof(int32bit),1,Outputfile);//point index - floatbuf= VSSwapHostFloatToLittle(memfile.quadstrips[qs].points[tmpcounter].s); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord - floatbuf= VSSwapHostFloatToLittle(memfile.quadstrips[qs].points[tmpcounter].t); - runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + if (!force_shared_vertex) { + floatbuf= VSSwapHostFloatToLittle(memfile.quadstrips[qs].points[tmpcounter].s); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//s coord + floatbuf= VSSwapHostFloatToLittle(memfile.quadstrips[qs].points[tmpcounter].t); + runningbytenum+=sizeof(float32bit)*fwrite(&floatbuf,sizeof(float32bit),1,Outputfile);//t coord + } } } //END GEOMETRY Modified: trunk/vegastrike/objconv/mesher/to_BFXM.h =================================================================== --- trunk/vegastrike/objconv/mesher/to_BFXM.h 2007-10-10 19:08:01 UTC (rev 11677) +++ trunk/vegastrike/objconv/mesher/to_BFXM.h 2007-10-11 02:06:39 UTC (rev 11678) @@ -346,10 +346,10 @@ }; XML LoadXML(const char *filename, float unitscale); -void xmeshToBFXM(XML memfile,FILE* Outputfile,char mode,bool forcenormals); //converts input file to BFXM creates new, or appends record based on mode -int writesuperheader(XML memfile, FILE* Outputfile); //Writes superheader to file Outputfile -int appendrecordfromxml(XML memfile, FILE* Outputfile,bool forcenormals); // Append a record specified in memfile to the output file and return number of bytes written. Assumes Outputfile is appropriately positioned at the end of the file. -int appendmeshfromxml(XML memfile, FILE* Outputfile,bool forcenormals); // Append a mesh specified in memfile to the output file and return number of bytes written. Assumes Outputfile is appropriately positioned at the end of the file. +void xmeshToBFXM(XML memfile,FILE* Outputfile,char mode,bool forcenormals, bool force_shared_vertex); //converts input file to BFXM creates new, or appends record based on mode +int writesuperheader(XML memfile, FILE* Outputfile, bool force_shared_vertex); //Writes superheader to file Outputfile +int appendrecordfromxml(XML memfile, FILE* Outputfile,bool forcenormals, bool force_shared_vertex); // Append a record specified in memfile to the output file and return number of bytes written. Assumes Outputfile is appropriately positioned at the end of the file. +int appendmeshfromxml(XML memfile, FILE* Outputfile,bool forcenormals, bool force_shared_vertex); // Append a mesh specified in memfile to the output file and return number of bytes written. Assumes Outputfile is appropriately positioned at the end of the file. void AddNormal (GFXVertex &outp, const GFXVertex &inp); void SetNormal (GFXVertex &outp, |