14 #include <sys/types.h>
20 #if !defined (_WIN32) && !(defined (__APPLE__) || defined (MACOSX ) ) && !defined (BSD) && !defined(__HAIKU__)
35 static inline float max(
float x,
float y )
45 static inline float min(
float x,
float y )
132 sizeof (MeshXML::attribute_names)/
sizeof (MeshXML::attribute_names[0]) );
134 void Mesh::beginElement(
void *userData,
const XML_Char *name,
const XML_Char **atts )
140 void Mesh::endElement(
void *userData,
const XML_Char *name )
143 xml->
mesh->endElement( xml, std::string( name ) );
148 if (strcmp( tmp,
"ZERO" ) == 0)
150 if (strcmp( tmp,
"ONE" ) == 0)
152 if (strcmp( tmp,
"SRCCOLOR" ) == 0)
154 if (strcmp( tmp,
"INVSRCCOLOR" ) == 0)
156 if (strcmp( tmp,
"SRCALPHA" ) == 0)
158 if (strcmp( tmp,
"INVSRCALPHA" ) == 0)
160 if (strcmp( tmp,
"DESTALPHA" ) == 0)
162 if (strcmp( tmp,
"INVDESTALPHA" ) == 0)
164 if (strcmp( tmp,
"DESTCOLOR" ) == 0)
166 if (strcmp( tmp,
"INVDESTCOLOR" ) == 0)
168 if (strcmp( tmp,
"SRCALPHASAT" ) == 0)
170 if (strcmp( tmp,
"CONSTALPHA" ) == 0)
172 if (strcmp( tmp,
"INVCONSTALPHA" ) == 0)
174 if (strcmp( tmp,
"CONSTCOLOR" ) == 0)
176 if (strcmp( tmp,
"INVCONSTCOLOR" ) == 0)
196 return "INVSRCCOLOR";
202 return "INVSRCALPHA";
208 return "INVDESTALPHA";
214 return "INVDESTCOLOR";
217 return "SRCALPHASAT";
223 return "INVCONSTALPHA";
229 return "INVCONSTCOLOR";
251 for (i = 0; i < (
int) r.length(); ++i)
252 if (r[i] !=
'0' && r[i] !=
'.' && r[i] !=
'+' && r[i] !=
'e')
261 AttributeList::const_iterator iter;
269 bool texture_found =
false;
273 if (use_detail_texture) {
275 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
298 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
328 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
349 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
370 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
391 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
417 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
439 char *csrc = strdup( (*iter).value.c_str() );
440 char *cdst = strdup( (*iter).value.c_str() );
441 sscanf( ( (*iter).value ).c_str(),
"%s %s", csrc, cdst );
452 else if (tmp > 0 && tmp <= 1)
461 if (use_detail_texture)
472 if (
strtoupper( iter->name ).find(
"ANIMATION" ) == 0) {
474 strsize = strlen(
"ANIMATION" );
476 if (
strtoupper( iter->name ).find(
"TEXTURE" ) == 0) {
478 strsize = strlen(
"TEXTURE" );
480 if (
strtoupper( iter->name ).find(
"ALPHAMAP" ) == 0) {
482 strsize = strlen(
"ALPHAMAP" );
485 unsigned int texindex = 0;
486 string ind( iter->name.substr( strsize ) );
489 static bool per_pixel_lighting =
491 if ( (texindex == 0) || per_pixel_lighting )
492 while (xml->
decals.size() <= texindex)
497 xml->
decals[texindex].animated_name = iter->value;
500 xml->
decals[texindex].alpha_name = iter->value;
503 xml->
decals[texindex].decal_name = iter->value;
506 texture_found =
true;
512 assert( texture_found );
527 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
570 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
618 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
625 if ( (*iter).value ==
"Flat" ) {
627 }
else if ( (*iter).value ==
"Smooth" ) {
643 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
650 if ( (*iter).value ==
"Flat" )
652 else if ( (*iter).value ==
"Smooth" )
664 xml->
linestrips.push_back( vector< GFXVertex > () );
668 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
675 if ( (*iter).value ==
"Flat" ) {
677 }
else if ( (*iter).value ==
"Smooth" ) {
691 xml->
tristrips.push_back( vector< GFXVertex > () );
695 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
702 if ( (*iter).value ==
"Flat" ) {
704 }
else if ( (*iter).value ==
"Smooth" ) {
718 xml->
trifans.push_back( vector< GFXVertex > () );
722 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
729 if ( (*iter).value ==
"Flat" ) {
731 }
else if ( (*iter).value ==
"Smooth" ) {
745 xml->
quadstrips.push_back( vector< GFXVertex > () );
749 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
756 if ( (*iter).value ==
"Flat" ) {
758 }
else if ( (*iter).value ==
"Smooth" ) {
775 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
782 if ( (*iter).value ==
"Flat" )
784 else if ( (*iter).value ==
"Smooth" )
793 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
810 xml->
lodsize.push_back( flotsize );
820 unsigned int index=0;
823 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
854 assert( index < xml->vertices.size() );
871 for (i = xml->
active_ind->size()-1; i > 0; i--)
888 float rot, siz, offset;
890 rot = siz = offset = 0.0f;
891 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
935 xml->
logos[xml->
logos.size()-1].offset = offset;
943 unsigned int ind = 0;
945 bool foundindex =
false;
948 for (iter = attributes.begin(); iter != attributes.end(); iter++) {
955 assert( ttttttt < 2 );
962 assert( (ttttttt&1) == 0 );
971 assert( ttttttt == 3 );
974 xml->
logos[xml->
logos.size()-1].refpnt.push_back( ind );
975 xml->
logos[xml->
logos.size()-1].refweight.push_back( indweight );
984 void Mesh::endElement(
MeshXML *xml,
const string &name )
1033 for (i = xml->
lstrcnt+1; i < xml->linestripind.size(); i++) {
1040 for (i = xml->
tstrcnt+2; i < xml->tristripind.size(); i++) {
1056 for (i = xml->
tfancnt+2; i < xml->trifanind.size(); i++) {
1064 for (i = xml->
qstrcnt+3; i < xml->quadstripind.size(); i += 2) {
1072 assert( xml->
tris.size()%3 == 0 );
1073 assert( xml->
quads.size()%4 == 0 );
1118 mn.i =
min( ver.
x, mn.i );
1119 mx.i =
max( ver.
x, mx.i );
1120 mn.j =
min( ver.
y, mn.j );
1121 mx.j =
max( ver.
y, mx.j );
1122 mn.k =
min( ver.
z, mn.k );
1123 mx.k =
max( ver.
z, mx.k );
1126 using namespace VSFileSystem;
1130 string intmp = string(
"\"" )+input+string(
"\"" );
1131 string outtmp = string(
"\"" )+output+string(
"\"" );
1136 string firstarg = string(
"\"" )+soundserver_path+string(
"\"" );
1137 pid = execlp( soundserver_path.c_str(), soundserver_path.c_str(), input, output, args, NULL );
1139 firstarg = string(
"\"" )+soundserver_path+string(
"\"" );
1140 pid = execlp( soundserver_path.c_str(), soundserver_path.c_str(), input, output, args, NULL );
1149 waitpid( pid, &mystat, 0 );
1153 string firstarg = string(
"\"" )+ss_path+string(
"\"" );
1154 int pid = spawnl( P_WAIT, ss_path.c_str(), firstarg.c_str(), intmp.c_str(), outtmp.c_str(), args, NULL );
1157 firstarg = string(
"\"" )+ss_path+string(
"\"" );
1158 int pid = spawnl( P_WAIT, ss_path.c_str(), firstarg.c_str(), intmp.c_str(), outtmp.c_str(), args, NULL );
1168 f.
Read( &bfxm[0], 1 );
1169 f.
Read( &bfxm[1], 1 );
1170 f.
Read( &bfxm[2], 1 );
1171 f.
Read( &bfxm[3], 1 );
1173 return bfxm[0] ==
'B' && bfxm[1] ==
'F' && bfxm[2] ==
'X' && bfxm[3] ==
'M';
1180 size_t *srcptr = &srcstruct;
1181 while ( ( hm = src.
Read( srcptr,
sizeof (srcstruct) ) ) )
1182 dst.
Write( srcptr, hm );
1243 const std::vector< std::string > &overridetextures )
1245 vector< Mesh* >m = LoadMeshes( filename, scale, faction, fg, overridetextures );
1249 fprintf( stderr,
"Mesh %s has %u subcomponents. Only first used!\n", filename, (
unsigned int) m.size() );
1250 for (
unsigned int i = 1; i < m.size(); ++i)
1261 const std::vector< std::string > &overrideTextures )
1278 for (
unsigned int i = 0; i < oldmesh->size(); ++i) {
1279 ret.push_back(
new Mesh() );
1280 Mesh *m = (*oldmesh)[i];
1289 return vector< Mesh* > ();
1292 f.
Read( &bfxm[0],
sizeof(bfxm[0])*4 );
1293 bool isbfxm = (bfxm[0] ==
'B' && bfxm[1] ==
'F' && bfxm[2] ==
'X' && bfxm[3] ==
'M');
1294 if ( isbfxm || strstr( filename,
".obj" ) ) {
1312 vector< Mesh* > retval( LoadMeshes( f, scale, faction, fg, hash_name, overrideTextures ) );
1313 vector< Mesh* > *newvec =
new vector< Mesh* > ( retval );
1314 for (
unsigned int i = 0; i < retval.size(); ++i) {
1315 retval[i]->hash_name = hash_name;
1316 if (retval[i]->orig)
1317 retval[i]->orig->hash_name = hash_name;
1318 (*newvec)[i] = retval[i]->orig ? retval[i]->orig : retval[i];
1324 bool original =
false;
1325 Mesh *m =
new Mesh( filename, scale, faction, fg, original );
1332 void Mesh::LoadXML(
const char *filename,
1337 const vector< string > &textureOverride )
1347 LoadXML( f, scale, faction, fg, origthis, textureOverride );
1356 const vector< string > &textureOverride )
1358 std::vector< unsigned int >ind;
1373 XML_Parser parser = XML_ParserCreate( NULL );
1374 XML_SetUserData( parser, xml );
1375 XML_SetElementHandler( parser, &Mesh::beginElement, &Mesh::endElement );
1376 XML_Parse( parser, ( f.
ReadFull() ).c_str(), f.
Size(), 1 );
1377 XML_ParserFree( parser );
1383 PostProcessLoading( xml, textureOverride );
1384 numlods = xml->
lod.size()+1;
1388 orig =
new Mesh[numlods];
1390 for (i = 0; i < xml->
lod.size(); i++) {
1391 orig[i+1] = *xml->
lod[i];
1392 orig[i+1].lodsize = xml->
lodsize[i];
1398 static void SumNormal( vector< GFXVertex > &vertices,
int i1,
int i2,
int i3, vector< float > &weights )
1400 Vector v1( vertices[i2].
x-vertices[i1].
x,
1401 vertices[i2].
y-vertices[i1].
y,
1402 vertices[i2].
z-vertices[i1].
z );
1403 Vector v2( vertices[i3].x-vertices[i1].x,
1404 vertices[i3].y-vertices[i1].y,
1405 vertices[i3].z-vertices[i1].z );
1408 Vector N = v1.Cross( v2 );
1409 float w = 1.f-0.9*fabsf( v1.Dot( v2 ) );
1412 vertices[i1].i += N.i;
1413 vertices[i1].j += N.j;
1414 vertices[i1].k += N.k;
1417 vertices[i2].i += N.i;
1418 vertices[i2].j += N.j;
1419 vertices[i2].k += N.k;
1422 vertices[i3].i += N.i;
1423 vertices[i3].j += N.j;
1424 vertices[i3].k += N.k;
1428 static void SumLineNormal( vector< GFXVertex > &vertices,
int i1,
int i2, vector< float > &weights )
1430 Vector v1( vertices[i2].
x-vertices[i1].
x,
1431 vertices[i2].
y-vertices[i1].
y,
1432 vertices[i2].
z-vertices[i1].
z );
1433 static Vector v2( 0.3408, 0.9401, 0.0005 );
1435 Vector N = v1.Cross( v2 );
1437 vertices[i1].i += N.i;
1438 vertices[i1].j += N.j;
1439 vertices[i1].k += N.k;
1442 vertices[i2].i += N.i;
1443 vertices[i2].j += N.j;
1444 vertices[i2].k += N.k;
1449 vector< int > &indices,
1453 vector< float > &weights )
1463 for (; begin < end; begin += 3)
1464 SumNormal( vertices, indices[begin], indices[begin+1], indices[begin+2], weights );
1470 for (; begin < end; begin += 4) {
1471 SumNormal( vertices, indices[begin], indices[begin+1], indices[begin+2], weights );
1472 SumNormal( vertices, indices[begin], indices[begin+2], indices[begin+3], weights );
1480 for (; begin < end; ++begin, flip ^= 1)
1481 SumNormal( vertices, indices[begin], indices[begin+1+flip], indices[begin+2-flip], weights );
1487 for (i = begin; begin < end; ++begin)
1488 SumNormal( vertices, indices[i], indices[begin+1], indices[begin+2], weights );
1494 for (i = begin; begin < end; ++begin)
1495 SumLineNormal( vertices, indices[begin], indices[begin+1], weights );
1501 for (i = begin; begin < end; begin += 2)
1502 SumLineNormal( vertices, indices[begin], indices[begin+1], weights );
1512 for (vector< GFXVertex >::iterator it = vertices.begin(); it != vertices.end(); ++it)
1513 it->SetTangent(
Vector( 0, 0, 0 ), 0 );
1518 if (T.Cross( B ).Dot( N ) >= 0.f)
1524 static float faceTSWeight( vector< GFXVertex > &vertices,
int i1,
int i2,
int i3 )
1538 return 1.f-fabsf( v1.Dot( v2 ) );
1572 static void SumTangent( vector< GFXVertex > &vertices,
int i1,
int i2,
int i3, vector< float > &weights )
1605 vector< int > &indices,
1609 vector< float > &weights )
1619 for (; begin < end; begin += 3)
1620 SumTangent( vertices, indices[begin], indices[begin+1], indices[begin+2], weights );
1626 for (; begin < end; begin += 4) {
1627 SumTangent( vertices, indices[begin], indices[begin+1], indices[begin+2], weights );
1628 SumTangent( vertices, indices[begin], indices[begin+2], indices[begin+3], weights );
1636 for (; begin < end; ++begin, flip ^= 1)
1637 SumTangent( vertices, indices[begin], indices[begin+1+flip], indices[begin+2-flip], weights );
1643 for (i = begin; begin < end; ++begin)
1644 SumTangent( vertices, indices[i], indices[begin+1], indices[begin+2], weights );
1656 for (
size_t i = 0, n = vertices.size(); i < n; ++i) {
1658 float w = weights[i];
1662 float iw = (w < 0.001) ? 1.f : (1.f / w);
1671 if (
Vector(v.
tx, v.
ty, v.
tz).MagnitudeSquared() < 0.00001)
1678 for (
size_t i = 0, n = vertices.size(); i < n; ++i) {
1680 float w = weights[i];
1684 float mag = v.
GetNormal().MagnitudeSquared();
1688 mag = 1.f/
sqrt(mag);
1705 vector< float >weights;
1706 weights.resize( xml->
vertices.size(), 0.f );
1717 for ( i = j = 0, n = xml->
trifans.size(); i < n; j += xml->
trifans[i++].size() )
1724 for (i = 0; i < xml->
vertices.size(); ++i) {
1732 std::vector< unsigned int > ind;
1733 for (a = 0; a < xml->
tris.size(); a += 3)
1734 for (j = 0; j < 3; j++) {
1735 int ix = xml->
triind[a+j];
1736 ind.push_back( ix );
1737 xml->
tris[a+j].SetNormal( xml->
vertices[ix].GetNormal() );
1738 xml->
tris[a+j].SetTangent( xml->
vertices[ix].GetTangent(),
1739 xml->
vertices[ix].GetTangentParity() );
1742 for (a = 0; a < xml->
quads.size(); a += 4)
1743 for (j = 0; j < 4; j++) {
1745 ind.push_back( ix );
1748 xml->
vertices[ix].GetTangentParity() );
1751 for (a = 0; a < xml->
lines.size(); a += 2)
1752 for (j = 0; j < 2; j++) {
1754 ind.push_back( ix );
1760 for (l = a = 0; a < xml->
tristrips.size(); a++)
1761 for (k = 0; k < xml->
tristrips[
a].size(); k++, l++) {
1763 ind.push_back( ix );
1766 xml->
vertices[ix].GetTangentParity() );
1768 for (l = a = 0; a < xml->
trifans.size(); a++)
1769 for (k = 0; k < xml->
trifans[
a].size(); k++, l++) {
1771 ind.push_back( ix );
1774 xml->
vertices[ix].GetTangentParity() );
1776 for (l = a = 0; a < xml->
quadstrips.size(); a++)
1777 for (k = 0; k < xml->
quadstrips[
a].size(); k++, l++) {
1779 ind.push_back( ix );
1782 xml->
vertices[ix].GetTangentParity() );
1784 for (l = a = 0; a < xml->
linestrips.size(); a++)
1785 for (k = 0; k < xml->
linestrips[
a].size(); k++, l++) {
1787 ind.push_back( ix );
1793 unsigned int trimax = xml->
tris.size()/3;
1798 for (i = 0; i < trimax; i++, a += 3)
1800 for (j = 0; j < 3; j++) {
1802 Cur = (xml->
vertices[xml->
triind[a+( (j+1)%3 )]].GetPosition()-Cur)
1803 .Cross( xml->
vertices[xml->
triind[a+( (j+2)%3 )]].GetPosition()-Cur );
1805 xml->
tris[a+j].SetNormal( Cur );
1809 trimax = xml->
quads.size()/4;
1810 for (i = 0; i < trimax; i++, a += 4)
1812 for (j = 0; j < 4; j++) {
1815 .Cross( xml->
vertices[xml->
quadind[a+( (j+2)%4 )]].GetPosition()-Cur );
1817 xml->
quads[a+j].SetNormal( Cur );
1822 for (
unsigned int LC = 0; LC < textureOverride.size(); ++LC)
1823 if (textureOverride[LC] !=
"") {
1824 while (xml->
decals.size() <= LC) {
1826 xml->
decals.push_back( z );
1828 if (textureOverride[LC].find(
".ani" ) != string::npos) {
1829 xml->
decals[LC].decal_name =
"";
1830 xml->
decals[LC].animated_name = textureOverride[LC];
1831 xml->
decals[LC].alpha_name =
"";
1833 xml->
decals[LC].animated_name =
"";
1834 xml->
decals[LC].alpha_name =
"";
1835 xml->
decals[LC].decal_name = textureOverride[LC];
1838 while ( Decal.size() < xml->
decals.size() )
1839 Decal.push_back( NULL );
1841 for (
unsigned int i = 0; i < xml->
decals.size(); i++)
1842 Decal[i] = ( TempGetTexture( xml, i, factionname ) );
1844 while (Decal.back() == NULL && Decal.size() > 1)
1848 unsigned int index = 0;
1850 unsigned int totalvertexsize = xml->
tris.size()+xml->
quads.size()+xml->
lines.size();
1851 for (index = 0; index < xml->
tristrips.size(); index++)
1852 totalvertexsize += xml->
tristrips[index].size();
1853 for (index = 0; index < xml->
trifans.size(); index++)
1854 totalvertexsize += xml->
trifans[index].size();
1855 for (index = 0; index < xml->
quadstrips.size(); index++)
1856 totalvertexsize += xml->
quadstrips[index].size();
1857 for (index = 0; index < xml->
linestrips.size(); index++)
1858 totalvertexsize += xml->
linestrips[index].size();
1860 vector< GFXVertex > vertexlist( totalvertexsize );
1862 mn =
Vector( FLT_MAX, FLT_MAX, FLT_MAX );
1863 mx =
Vector( -FLT_MAX, -FLT_MAX, -FLT_MAX );
1865 vector< enum POLYTYPE >polytypes;
1866 polytypes.insert( polytypes.begin(), totalvertexsize,
GFXTRI );
1868 vector< int >poly_offsets;
1869 poly_offsets.insert( poly_offsets.begin(), totalvertexsize, 0 );
1871 if ( xml->
tris.size() ) {
1872 polytypes[o_index] =
GFXTRI;
1873 poly_offsets[o_index] = xml->
tris.size();
1876 if ( xml->
quads.size() ) {
1878 poly_offsets[o_index] = xml->
quads.size();
1881 if ( xml->
lines.size() ) {
1883 poly_offsets[o_index] = xml->
lines.size();
1886 for (a = 0; a < xml->
tris.size(); a++, index++)
1887 vertexlist[index] = xml->
tris[a];
1888 for (a = 0; a < xml->
quads.size(); a++, index++)
1889 vertexlist[index] = xml->
quads[a];
1890 for (a = 0; a < xml->
lines.size(); a++, index++)
1891 vertexlist[index] = xml->
lines[a];
1892 for (a = 0; a < xml->
tristrips.size(); a++) {
1893 for (
unsigned int m = 0; m < xml->
tristrips[
a].size(); m++, index++)
1894 vertexlist[index] = xml->
tristrips[a][m];
1896 poly_offsets[o_index] = xml->
tristrips[a].size();
1899 for (a = 0; a < xml->
trifans.size(); a++) {
1900 for (
unsigned int m = 0; m < xml->
trifans[
a].size(); m++, index++)
1901 vertexlist[index] = xml->
trifans[a][m];
1903 poly_offsets[o_index] = xml->
trifans[a].size();
1906 for (a = 0; a < xml->
quadstrips.size(); a++) {
1907 for (
unsigned int m = 0; m < xml->
quadstrips[
a].size(); m++, index++)
1910 poly_offsets[o_index] = xml->
quadstrips[a].size();
1913 for (a = 0; a < xml->
linestrips.size(); a++) {
1914 for (
unsigned int m = 0; m < xml->
linestrips[
a].size(); m++, index++)
1917 poly_offsets[o_index] = xml->
linestrips[a].size();
1920 for (i = 0; i <
index; ++i)
1926 vector< float >weights;
1927 vector< int > indices( vertexlist.size() );
1928 weights.resize( vertexlist.size(), 0.f );
1931 for (i = 0, n = vertexlist.size(); i < n; ++i)
1933 for (i = j = 0, n = polytypes.size(); i < n; j += poly_offsets[i++])
1934 SumTangents( vertexlist, indices, j, j+poly_offsets[i], polytypes[i], weights );
1937 if (mn.i == FLT_MAX && mn.j == FLT_MAX && mn.k == FLT_MAX)
1938 mx.i = mx.j = mx.k = mn.i = mn.j = mn.k = 0;
1939 mn.i *= xml->
scale.i;
1940 mn.j *= xml->
scale.j;
1941 mn.k *= xml->
scale.k;
1942 mx.i *= xml->
scale.i;
1943 mx.j *= xml->
scale.j;
1944 mx.k *= xml->
scale.k;
1945 float x_center = (mn.i+mx.i)/2.0,
1946 y_center = (mn.j+mx.j)/2.0,
1947 z_center = (mn.k+mx.k)/2.0;
1948 local_pos =
Vector( x_center, y_center, z_center );
1949 for (a = 0; a < totalvertexsize; a++) {
1950 vertexlist[
a].x *= xml->
scale.i;
1951 vertexlist[
a].y *= xml->
scale.j;
1952 vertexlist[
a].z *= xml->
scale.k;
1954 for (a = 0; a < xml->
vertices.size(); a++) {
1962 if (o_index || index)
1966 (polytypes.size() ? &polytypes[0] : 0),
1969 (poly_offsets.size() ? &poly_offsets[0] : 0),
false,
1970 (ind.size() ? &ind[0] : 0) );
1973 static float optvertexlimit =
1975 bool cachunk =
false;
1976 if ( usopttmp && (vertexlist.size() > 0) ) {
1977 int numopt = totalvertexsize;
1980 GFXOptimizeList( &vertexlist[0], totalvertexsize, &newv, &numopt, &ind );
1981 if (numopt < totalvertexsize*optvertexlimit) {
1983 (polytypes.size() ? &polytypes[0] : 0),
1984 numopt, newv, o_index,
1985 (poly_offsets.size() ? &poly_offsets[0] : 0),
false,
1993 if (vertexlist.size() == 0)
1994 vertexlist.resize( 1 );
1996 (polytypes.size() ? &polytypes[0] : 0),
1997 totalvertexsize, &vertexlist[0], o_index,
1998 (poly_offsets.size() ? &poly_offsets[0] : 0) );
2001 CreateLogos( xml, xml->
faction, xml->
fg );
2003 if (mn.i == FLT_MAX) {