void ASE_Loader::ASE_KeyMESH_VERTEX_LIST( const char *token ) { ASE_Mesh *pMesh = mCurrMesh; if ( !strcmp( token, "*MESH_VERTEX" ) ) { float x, y, z; ASE_GetToken( false ); // skip number int index = atoi(s_token); ASE_GetToken( false ); x = atof(s_token); ASE_GetToken( false ); y = atof(s_token); ASE_GetToken( false ); z = atof(s_token); pMesh->vertexes[index].x = x ; pMesh->vertexes[index].y = y ; pMesh->vertexes[index].z = z ; } else { LOGE( "Unknown token '%s' while parsing MESH_VERTEX_LIST", token ); } }
void ASE_Loader::ASE_KeyMESH( const char *token ) { ASE_Mesh* pMesh = mCurrMesh; if ( !strcmp( token, "*MESH_NUMVERTEX" ) ) { ASE_GetToken( false ); pMesh->numVertexes = atoi( s_token ); LOGI( ".....num vertexes: %d\n", pMesh->numVertexes ); } else if ( !strcmp( token, "*MESH_NUMFACES" ) ) { ASE_GetToken( false ); pMesh->numFaces = atoi( s_token ); LOGI( ".....num faces: %d\n", pMesh->numFaces ); } else if ( !strcmp( token, "*MESH_NUMTVFACES" ) ) { ASE_GetToken( false ); if ( atoi( s_token ) != pMesh->numFaces ) { LOGE( "MESH_NUMTVFACES != MESH_NUMFACES" ); } } else if ( !strcmp( token, "*MESH_NUMTVERTEX" ) ) { ASE_GetToken( false ); pMesh->numTVertexes = atoi( s_token ); LOGI( ".....num tvertexes: %d\n", pMesh->numTVertexes ); } else if ( !strcmp( token, "*MESH_VERTEX_LIST" ) ) { pMesh->vertexes = new ASE_Vertex[pMesh->numVertexes];//calloc( sizeof( aseVertex_t ) * pMesh->numVertexes, 1 ); LOGI( ".....parsing MESH_VERTEX_LIST\n" ); ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMESH_VERTEX_LIST ); } else if ( !strcmp( token, "*MESH_TVERTLIST" ) ) { pMesh->tvertexes = new ASE_TVertex[pMesh->numTVertexes];//calloc( sizeof( aseTVertex_t ) * pMesh->numTVertexes, 1 ); LOGI( ".....parsing MESH_TVERTLIST\n" ); ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMESH_TVERTLIST ); } else if ( !strcmp( token, "*MESH_FACE_LIST" ) ) { pMesh->faces = new ASE_Face[pMesh->numFaces]; //calloc( sizeof( aseFace_t ) * pMesh->numFaces, 1 ); LOGI( ".....parsing MESH_FACE_LIST\n" ); ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMESH_FACE_LIST ); } else if ( !strcmp( token, "*MESH_TFACELIST" ) ) { pMesh->tfaces = new ASE_Face[pMesh->numFaces];//calloc( sizeof( aseFace_t ) * pMesh->numFaces, 1 ); LOGI( ".....parsing MESH_TFACE_LIST\n" ); ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyTFACE_LIST ); } else if ( !strcmp( token, "*MESH_NORMALS" ) ) { ASE_ParseBracedBlock( 0 ); } }
void ASE_Loader::ASE_KeyMESH_TVERTLIST( const char *token ) { ASE_Mesh *pMesh = mCurrMesh; if ( !strcmp( token, "*MESH_TVERT" ) ) { char u[80], v[80], w[80]; ASE_GetToken( false ); int index = atoi(s_token); ASE_GetToken( false ); strcpy( u, s_token ); ASE_GetToken( false ); strcpy( v, s_token ); ASE_GetToken( false ); strcpy( w, s_token ); pMesh->tvertexes[index].s = atof( u ); pMesh->tvertexes[index].t = atof( v ); } else { LOGE( "Unknown token '%s' while parsing MESH_TVERTLIST" ); } }
static void ASE_KeyMESH_TVERTLIST( const char *token ) { aseMesh_t *pMesh = ASE_GetCurrentMesh(); if ( !strcmp( token, "*MESH_TVERT" ) ) { char u[80], v[80], w[80]; ASE_GetToken( qfalse ); ASE_GetToken( qfalse ); strcpy( u, s_token ); ASE_GetToken( qfalse ); strcpy( v, s_token ); ASE_GetToken( qfalse ); strcpy( w, s_token ); pMesh->tvertexes[pMesh->currentVertex].s = atof( u ); pMesh->tvertexes[pMesh->currentVertex].t = 1.0f - atof( v ); pMesh->currentVertex++; if ( pMesh->currentVertex > pMesh->numTVertexes ) { Error( "pMesh->currentVertex > pMesh->numTVertexes" ); } } else { Error( "Unknown token '%s' while parsing MESH_TVERTLIST" ); } }
static void ASE_KeyTFACE_LIST( const char *token ) { aseMesh_t *pMesh = ASE_GetCurrentMesh(); if ( !strcmp( token, "*MESH_TFACE" ) ) { int a, b, c; ASE_GetToken( qfalse ); ASE_GetToken( qfalse ); a = atoi( s_token ); ASE_GetToken( qfalse ); c = atoi( s_token ); ASE_GetToken( qfalse ); b = atoi( s_token ); pMesh->tfaces[pMesh->currentFace][0] = a; pMesh->tfaces[pMesh->currentFace][1] = b; pMesh->tfaces[pMesh->currentFace][2] = c; pMesh->currentFace++; } else { Error( "Unknown token '%s' in MESH_TFACE", token ); } }
static void ASE_KeyMESH_VERTEX_LIST( const char *token ) { aseMesh_t *pMesh = ASE_GetCurrentMesh(); if ( !strcmp( token, "*MESH_VERTEX" ) ) { ASE_GetToken( qfalse ); // skip number ASE_GetToken( qfalse ); pMesh->vertexes[pMesh->currentVertex].y = atof( s_token ); ASE_GetToken( qfalse ); pMesh->vertexes[pMesh->currentVertex].x = -atof( s_token ); ASE_GetToken( qfalse ); pMesh->vertexes[pMesh->currentVertex].z = atof( s_token ); pMesh->currentVertex++; if ( pMesh->currentVertex > pMesh->numVertexes ) { Error( "pMesh->currentVertex >= pMesh->numVertexes" ); } } else { Error( "Unknown token '%s' while parsing MESH_VERTEX_LIST", token ); } }
void ASE_Loader::ASE_KeyTFACE_LIST( const char *token ) { ASE_Mesh *pMesh = mCurrMesh; if ( !strcmp( token, "*MESH_TFACE" ) ) { int a, b, c; ASE_GetToken( false ); int index = atoi(s_token); ASE_GetToken( false ); a = atoi( s_token ); ASE_GetToken( false ); b = atoi( s_token ); ASE_GetToken( false ); c = atoi( s_token ); LOGI( ".....tface: %d\n", index ); pMesh->tfaces[index].vi[0] = a; pMesh->tfaces[index].vi[1] = b; pMesh->tfaces[index].vi[2] = c; } else { LOGE( "Unknown token '%s' in MESH_TFACE", token ); } }
/* ================= ASE_Parse ================= */ aseModel_t *ASE_Parse( const char *buffer, bool verbose ) { memset( &ase, 0, sizeof( ase ) ); ase.verbose = verbose; ase.buffer = buffer; ase.len = strlen( buffer ); ase.curpos = ase.buffer; ase.currentObject = NULL; // NOTE: using new operator because aseModel_t contains idList class objects ase.model = new aseModel_t; memset( ase.model, 0, sizeof( aseModel_t ) ); ase.model->objects.Resize( 32, 32 ); ase.model->materials.Resize( 32, 32 ); while( ASE_GetToken( false ) ) { if( !strcmp( ase.token, "*3DSMAX_ASCIIEXPORT" ) || !strcmp( ase.token, "*COMMENT" ) ) { ASE_SkipRestOfLine(); } else if( !strcmp( ase.token, "*SCENE" ) ) { ASE_SkipEnclosingBraces(); } else if( !strcmp( ase.token, "*GROUP" ) ) { ASE_GetToken( false ); // group name ASE_ParseBracedBlock( ASE_KeyGROUP ); } else if( !strcmp( ase.token, "*SHAPEOBJECT" ) ) { ASE_SkipEnclosingBraces(); } else if( !strcmp( ase.token, "*CAMERAOBJECT" ) ) { ASE_SkipEnclosingBraces(); } else if( !strcmp( ase.token, "*MATERIAL_LIST" ) ) { VERBOSE( ( "MATERIAL_LIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyMATERIAL_LIST ); } else if( !strcmp( ase.token, "*GEOMOBJECT" ) ) { ASE_ParseGeomObject(); } else if( ase.token[0] ) { common->DPrintf( "Unknown token '%s'\n", ase.token ); } } return ase.model; }
static void ASE_KeyGEOMOBJECT( const char *token ) { aseObject_t *object; object = ase.currentObject; if ( !strcmp( token, "*NODE_NAME" ) ) { ASE_GetToken( true ); VERBOSE( ( " %s\n", ase.token ) ); idStr::Copynz( object->name, ase.token, sizeof( object->name ) ); } else if ( !strcmp( token, "*NODE_PARENT" ) ) { ASE_SkipRestOfLine(); } // ignore unused data blocks else if ( !strcmp( token, "*NODE_TM" ) || !strcmp( token, "*TM_ANIMATION" ) ) { ASE_ParseBracedBlock( ASE_KeyNODE_TM ); } // ignore regular meshes that aren't part of animation else if ( !strcmp( token, "*MESH" ) ) { ase.currentMesh = &ase.currentObject->mesh; memset( ase.currentMesh, 0, sizeof( ase.currentMesh ) ); ASE_ParseBracedBlock( ASE_KeyMESH ); } // according to spec these are obsolete else if ( !strcmp( token, "*MATERIAL_REF" ) ) { ASE_GetToken( false ); object->materialRef = atoi( ase.token ); } // loads a sequence of animation frames else if ( !strcmp( token, "*MESH_ANIMATION" ) ) { VERBOSE( ( "..found MESH_ANIMATION\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_ANIMATION ); } // skip unused info else if ( !strcmp( token, "*PROP_MOTIONBLUR" ) || !strcmp( token, "*PROP_CASTSHADOW" ) || !strcmp( token, "*PROP_RECVSHADOW" ) ) { ASE_SkipRestOfLine(); } }
static void ASE_KeyMESH_FACE_LIST( const char *token ) { aseMesh_t *pMesh = ASE_GetCurrentMesh(); if( !strcmp( token, "*MESH_FACE" ) ) { ASE_GetToken( false ); // skip face number // we are flipping the order here to change the front/back facing // from 3DS to our standard (clockwise facing out) ASE_GetToken( false ); // skip label ASE_GetToken( false ); // first vertex pMesh->faces[ase.currentFace].vertexNum[0] = atoi( ase.token ); ASE_GetToken( false ); // skip label ASE_GetToken( false ); // second vertex pMesh->faces[ase.currentFace].vertexNum[2] = atoi( ase.token ); ASE_GetToken( false ); // skip label ASE_GetToken( false ); // third vertex pMesh->faces[ase.currentFace].vertexNum[1] = atoi( ase.token ); ASE_GetToken( true ); ase.currentFace++; } else { common->Error( "Unknown token '%s' while parsing MESH_FACE_LIST", token ); } }
void ASE_Loader::ASE_ParseBracedBlock( ParserFun parser ) { int indent = 0; while ( ASE_GetToken( false ) ) { if ( !strcmp( s_token, "{" ) ) { indent++; } else if ( !strcmp( s_token, "}" ) ) { --indent; if ( indent == 0 ) break; else if ( indent < 0 ) LOGE( "Unexpected '}'" ); } else { if ( parser ) (this->*parser)( s_token ); } } }
static void ASE_ParseBracedBlock( void (*parser)( const char *token ) ) { int indent = 0; while ( ASE_GetToken( qfalse ) ) { if ( !strcmp( s_token, "{" ) ) { indent++; } else if ( !strcmp( s_token, "}" ) ) { --indent; if ( indent == 0 ) break; else if ( indent < 0 ) Error( "Unexpected '}'" ); } else { if ( parser ) parser( s_token ); } } }
static void ASE_SkipEnclosingBraces( void ) { int indent = 0; while( ASE_GetToken( false ) ) { if( !strcmp( ase.token, "{" ) ) { indent++; } else if( !strcmp( ase.token, "}" ) ) { indent--; if( indent == 0 ) { break; } else if( indent < 0 ) { common->Error( "Unexpected '}'" ); } } } }
static void ASE_KeyMAP_DIFFUSE( const char *token ) { char buffer[1024], buff1[1024], buff2[1024]; char *buf1, *buf2; int i = 0, count; if ( !strcmp( token, "*BITMAP" ) ) { ASE_GetToken( qfalse ); strcpy( buffer, s_token + 1 ); if ( strchr( buffer, '"' ) ) *strchr( buffer, '"' ) = 0; while ( buffer[i] ) { if ( buffer[i] == '\\' ) buffer[i] = '/'; i++; } buf1 = buffer; buf2 = gamedir; // need to compare win32 volumes to potential unix junk // if ( (gamedir[1] == ':' && (buffer[0] == '/' && buffer[1] == '/')) || (buffer[1] == ':' && (gamedir[0] == '/' && gamedir[1] == '/')) ) { if (buffer[1] == ':') { buf1 = buffer + 2; buf2 = gamedir + 2; } else { buf1 = gamedir + 2; buf2 = buffer +2; } count = 0; while (*buf2 && count < 2) { if (*buf2 == '/') { count++; } buf2++; } } strcpy(buff1, buf1); strlwr(buff1); strcpy(buff2, buf2); strlwr(buff2); if ( strstr( buff2, buff1 + 2 ) ) { strcpy( ase.materials[ase.numMaterials].name, strstr( buff2, buff1 + 2 ) + strlen( buff1 ) - 2 ); } else { sprintf( ase.materials[ase.numMaterials].name, "(not converted: '%s')", buffer ); printf( "WARNING: illegal material name '%s'\n", buffer ); } } else { } }
static void ASE_ParseBracedBlock( void ( *parser )( const char *token ) ) { int indent = 0; while( ASE_GetToken( false ) ) { if( !strcmp( ase.token, "{" ) ) { indent++; } else if( !strcmp( ase.token, "}" ) ) { --indent; if( indent == 0 ) { break; } else if( indent < 0 ) { common->Error( "Unexpected '}'" ); } } else { if( parser ) { parser( ase.token ); } } } }
void ASE_Loader::ASE_KeyMATERIAL_LIST( const char *token ) { if ( !strcmp( token, "*MATERIAL_COUNT" ) ) { ASE_GetToken( false ); LOGI( "..num materials: %s\n", s_token ); mSceneObject->mMats.resize(atoi(s_token)); } else if ( !strcmp( token, "*MATERIAL" ) ) { ASE_GetToken(false); LOGI( "..material %s \n", s_token ); int nCurrMtl = atoi(s_token); mCurrMtl = &mSceneObject->mMats[nCurrMtl]; ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMATERIAL ); } }
/* ** ASE_Process */ static void ASE_Process( void ) { while ( ASE_GetToken( qfalse ) ) { if ( !strcmp( s_token, "*3DSMAX_ASCIIEXPORT" ) || !strcmp( s_token, "*COMMENT" ) ) { ASE_SkipRestOfLine(); } else if ( !strcmp( s_token, "*SCENE" ) ) ASE_SkipEnclosingBraces(); else if ( !strcmp( s_token, "*MATERIAL_LIST" ) ) { VERBOSE( ("MATERIAL_LIST\n") ); ASE_ParseBracedBlock( ASE_KeyMATERIAL_LIST ); } else if ( !strcmp( s_token, "*GEOMOBJECT" ) ) { VERBOSE( ("GEOMOBJECT" ) ); ASE_ParseBracedBlock( ASE_KeyGEOMOBJECT ); if ( strstr( ase.objects[ase.currentObject].name, "Bip" ) || strstr( ase.objects[ase.currentObject].name, "ignore_" ) ) { ASE_FreeGeomObject( ase.currentObject ); VERBOSE( ( "(discarding BIP/ignore object)\n" ) ); } else if ( ( strstr( ase.objects[ase.currentObject].name, "h_" ) != ase.objects[ase.currentObject].name ) && ( strstr( ase.objects[ase.currentObject].name, "l_" ) != ase.objects[ase.currentObject].name ) && ( strstr( ase.objects[ase.currentObject].name, "u_" ) != ase.objects[ase.currentObject].name ) && ( strstr( ase.objects[ase.currentObject].name, "tag" ) != ase.objects[ase.currentObject].name ) && ase.grabAnims ) { VERBOSE( ( "(ignoring improperly labeled object '%s')\n", ase.objects[ase.currentObject].name ) ); ASE_FreeGeomObject( ase.currentObject ); } else { if ( ++ase.currentObject == MAX_ASE_OBJECTS ) { Error( "Too many GEOMOBJECTs" ); } } } else if ( s_token[0] ) { printf( "Unknown token '%s'\n", s_token ); } } if ( !ase.currentObject ) Error( "No animation data!" ); CollapseObjects(); }
void ASE_Loader::ASE_KeyMAP_SUBMATERIAL(const char* token) { if ( !strcmp( token, "*MAP_DIFFUSE" ) ) { mInSubDiffuse = true; ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMAP_DIFFUSE ); mInSubDiffuse = false; } else if(!strcmp( token, "*MATERIAL_AMBIENT")) { ASE_GetToken(false); float r = atof(s_token); ASE_GetToken(false); float g = atof(s_token); ASE_GetToken(false); float b = atof(s_token); mCurrSubMtl->ambient[0] = r; mCurrSubMtl->ambient[1] = g; mCurrSubMtl->ambient[2] = b; } else if(!strcmp( token, "*MATERIAL_DIFFUSE")) { ASE_GetToken(false); float r = atof(s_token); ASE_GetToken(false); float g = atof(s_token); ASE_GetToken(false); float b = atof(s_token); mCurrSubMtl->diffuse[0] = r; mCurrSubMtl->diffuse[1] = g; mCurrSubMtl->diffuse[2] = b; } else if(!strcmp( token, "*MATERIAL_SPECULAR")) { ASE_GetToken(false); float r = atof(s_token); ASE_GetToken(false); float g = atof(s_token); ASE_GetToken(false); float b = atof(s_token); mCurrSubMtl->specular[0] = r; mCurrSubMtl->specular[1] = g; mCurrSubMtl->specular[2] = b; } //ASE_KeyMATERIAL(token); }
static void ASE_KeyMAP_DIFFUSE( const char *token ) { aseMaterial_t *material; if ( !strcmp( token, "*BITMAP" ) ) { idStr qpath; idStr matname; ASE_GetToken( false ); // remove the quotes char *s = strstr( ase.token + 1, "\"" ); if ( s ) { *s = 0; } matname = ase.token + 1; // convert the 3DSMax material pathname to a qpath matname.BackSlashesToSlashes(); qpath = fileSystem->OSPathToRelativePath( matname ); idStr::Copynz( ase.currentMaterial->name, qpath, sizeof( ase.currentMaterial->name ) ); } else if ( !strcmp( token, "*UVW_U_OFFSET" ) ) { material = ase.model->materials[ase.model->materials.Num() - 1]; ASE_GetToken( false ); material->uOffset = atof( ase.token ); } else if ( !strcmp( token, "*UVW_V_OFFSET" ) ) { material = ase.model->materials[ase.model->materials.Num() - 1]; ASE_GetToken( false ); material->vOffset = atof( ase.token ); } else if ( !strcmp( token, "*UVW_U_TILING" ) ) { material = ase.model->materials[ase.model->materials.Num() - 1]; ASE_GetToken( false ); material->uTiling = atof( ase.token ); } else if ( !strcmp( token, "*UVW_V_TILING" ) ) { material = ase.model->materials[ase.model->materials.Num() - 1]; ASE_GetToken( false ); material->vTiling = atof( ase.token ); } else if ( !strcmp( token, "*UVW_ANGLE" ) ) { material = ase.model->materials[ase.model->materials.Num() - 1]; ASE_GetToken( false ); material->angle = atof( ase.token ); } else { } }
static void ASE_KeyNODE_TM( const char *token ) { int i; if( !strcmp( token, "*TM_ROW0" ) ) { for( i = 0; i < 3; i++ ) { ASE_GetToken( false ); ase.currentObject->mesh.transform[0][i] = atof( ase.token ); } } else if( !strcmp( token, "*TM_ROW1" ) ) { for( i = 0; i < 3; i++ ) { ASE_GetToken( false ); ase.currentObject->mesh.transform[1][i] = atof( ase.token ); } } else if( !strcmp( token, "*TM_ROW2" ) ) { for( i = 0; i < 3; i++ ) { ASE_GetToken( false ); ase.currentObject->mesh.transform[2][i] = atof( ase.token ); } } else if( !strcmp( token, "*TM_ROW3" ) ) { for( i = 0; i < 3; i++ ) { ASE_GetToken( false ); ase.currentObject->mesh.transform[3][i] = atof( ase.token ); } } }
static void ASE_KeyMATERIAL_LIST( const char *token ) { if ( !strcmp( token, "*MATERIAL_COUNT" ) ) { ASE_GetToken( qfalse ); VERBOSE( ( "..num materials: %s\n", s_token ) ); if ( atoi( s_token ) > MAX_ASE_MATERIALS ) { Error( "Too many materials!" ); } ase.numMaterials = 0; } else if ( !strcmp( token, "*MATERIAL" ) ) { VERBOSE( ( "..material %d ", ase.numMaterials ) ); ASE_ParseBracedBlock( ASE_KeyMATERIAL ); ase.numMaterials++; } }
static void ASE_KeyMESH_FACE_LIST( const char *token ) { aseMesh_t *pMesh = ASE_GetCurrentMesh(); if ( !strcmp( token, "*MESH_FACE" ) ) { ASE_GetToken( false ); // skip face number // we are flipping the order here to change the front/back facing // from 3DS to our standard (clockwise facing out) ASE_GetToken( false ); // skip label ASE_GetToken( false ); // first vertex pMesh->faces[ase.currentFace].vertexNum[0] = atoi( ase.token ); ASE_GetToken( false ); // skip label ASE_GetToken( false ); // second vertex pMesh->faces[ase.currentFace].vertexNum[2] = atoi( ase.token ); ASE_GetToken( false ); // skip label ASE_GetToken( false ); // third vertex pMesh->faces[ase.currentFace].vertexNum[1] = atoi( ase.token ); ASE_GetToken( true ); // we could parse material id and smoothing groups here /* if ( ( p = strstr( ase.token, "*MESH_MTLID" ) ) != 0 ) { p += strlen( "*MESH_MTLID" ) + 1; mtlID = atoi( p ); } else { common->Error( "No *MESH_MTLID found for face!" ); } */ ase.currentFace++; } else { common->Error( "Unknown token '%s' while parsing MESH_FACE_LIST", token ); } }
static void ASE_KeyMESH_FACE_LIST( const char *token ) { aseMesh_t *pMesh = ASE_GetCurrentMesh(); if ( !strcmp( token, "*MESH_FACE" ) ) { ASE_GetToken( qfalse ); // skip face number ASE_GetToken( qfalse ); // skip label ASE_GetToken( qfalse ); // first vertex pMesh->faces[pMesh->currentFace][0] = atoi( s_token ); ASE_GetToken( qfalse ); // skip label ASE_GetToken( qfalse ); // second vertex pMesh->faces[pMesh->currentFace][2] = atoi( s_token ); ASE_GetToken( qfalse ); // skip label ASE_GetToken( qfalse ); // third vertex pMesh->faces[pMesh->currentFace][1] = atoi( s_token ); ASE_GetToken( qtrue ); /* if ( ( p = strstr( s_token, "*MESH_MTLID" ) ) != 0 ) { p += strlen( "*MESH_MTLID" ) + 1; mtlID = atoi( p ); } else { Error( "No *MESH_MTLID found for face!" ); } */ pMesh->currentFace++; } else { Error( "Unknown token '%s' while parsing MESH_FACE_LIST", token ); } }
static void ASE_KeyMATERIAL_LIST( const char *token ) { if( !strcmp( token, "*MATERIAL_COUNT" ) ) { ASE_GetToken( false ); VERBOSE( ( "..num materials: %s\n", ase.token ) ); } else if( !strcmp( token, "*MATERIAL" ) ) { VERBOSE( ( "..material %d\n", ase.model->materials.Num() ) ); ase.currentMaterial = ( aseMaterial_t * ) Mem_Alloc( sizeof( aseMaterial_t ) ); memset( ase.currentMaterial, 0, sizeof( aseMaterial_t ) ); ase.currentMaterial->uTiling = 1; ase.currentMaterial->vTiling = 1; ase.model->materials.Append( ase.currentMaterial ); ASE_ParseBracedBlock( ASE_KeyMATERIAL ); } }
void ASE_Loader::ASE_SkipEnclosingBraces( ) { int indent = 0; while ( ASE_GetToken( false ) ) { if ( !strcmp( s_token, "{" ) ) { indent++; } else if ( !strcmp( s_token, "}" ) ) { indent--; if ( indent == 0 ) break; else if ( indent < 0 ) LOGE( "Unexpected '}'" ); } } }
void ASE_Loader::ASE_KeyMESH_FACE_LIST( const char *token ) { ASE_Mesh *pMesh = mCurrMesh; if ( !strcmp( token, "*MESH_FACE" ) ) { ASE_GetToken( false ); // skip face number int index = atoi(s_token); ASE_GetToken( false ); // skip label ASE_GetToken( false ); // first vertex pMesh->faces[index].vi[0] = atoi( s_token ); ASE_GetToken( false ); // skip label ASE_GetToken( false ); // second vertex pMesh->faces[index].vi[1] = atoi( s_token ); ASE_GetToken( false ); // skip label ASE_GetToken( false ); // third vertex pMesh->faces[index].vi[2] = atoi( s_token ); ASE_GetToken( true ); char* p; if ( ( p = strstr( s_token, "*MESH_MTLID" ) ) != 0 ) { p += strlen( "*MESH_MTLID" ) + 1; pMesh->faces[index].materialID = atoi( p ); } else { LOGE( "No *MESH_MTLID found for face!" ); } } else { LOGE( "Unknown token '%s' while parsing MESH_FACE_LIST", token ); } }
void ASE_Loader::ASE_KeyMAP_DIFFUSE( const char *token ) { char buffer[1024], buff1[1024], buff2[1024]; char *buf1, *buf2; int i = 0, count; if ( !strcmp( token, "*BITMAP" ) ) { ASE_GetToken( false ); strcpy( buffer, s_token + 1 ); if ( strchr( buffer, '"' ) ) *strchr( buffer, '"' ) = 0; int len = strlen(buffer); buf1 = buffer + len - 1; for(i = len - 1 ; i >=0 ; i--) { if(buf1 && (*buf1) != '\\') { buf1--; } else { break; } } strncpy(buff1, buf1 + 1, 1024); if(mInSubDiffuse) { strncpy(mCurrSubMtl->texName, buff1, 256); LOGI("sub material texname : %s\n", mCurrSubMtl->texName); } else { strncpy(mCurrMtl->materialData.texName, buff1, 256); LOGI("material texname : %s\n", mCurrMtl->materialData.texName); } } }
/* ** ASE_Process */ void ASE_Loader::ASE_Process( ) { #ifdef DEBUG int geomCount = 0; #endif while ( ASE_GetToken( false ) ) { if ( !strcmp( s_token, "*3DSMAX_ASCIIEXPORT" ) || !strcmp( s_token, "*COMMENT" ) ) { ASE_SkipRestOfLine(); } else if ( !strcmp( s_token, "*SCENE" ) ) { ASE_SkipEnclosingBraces(); } else if ( !strcmp( s_token, "*MATERIAL_LIST" ) ) { LOGI( "MATERIAL_LIST\n"); ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMATERIAL_LIST ); } else if ( !strcmp( s_token, "*GEOMOBJECT" ) ) { LOGI( "GEOMOBJECT\n" ); ASE_GeometryObject *obj = new ASE_GeometryObject; mSceneObject->mGeomObjects.push_back(obj); mCurrGeomObject = obj; ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyGEOMOBJECT ); #ifdef DEBUG geomCount++; #endif } } #ifdef DEBUG LOGI(".. geomCount = %d \n", geomCount); #endif ASE_AdjustSubMtl(); }
static void ASE_KeyGEOMOBJECT( const char *token ) { aseObject_t *object; object = ase.currentObject; if( !strcmp( token, "*NODE_NAME" ) ) { ASE_GetToken( true ); VERBOSE( ( " %s\n", ase.token ) ); idStr::Copynz( object->name, ase.token, sizeof( object->name ) ); } else if( !strcmp( token, "*NODE_PARENT" ) ) { ASE_SkipRestOfLine(); } // ignore unused data blocks else if( !strcmp( token, "*NODE_TM" ) || !strcmp( token, "*TM_ANIMATION" ) ) { ASE_ParseBracedBlock( ASE_KeyNODE_TM ); } // ignore regular meshes that aren't part of animation else if( !strcmp( token, "*MESH" ) ) { ase.currentMesh = &ase.currentObject->mesh; // the transform is applied to normals so it must be saved out before we clear the mesh idVec3 transform[4]; transform[0] = ase.currentMesh->transform[0]; transform[1] = ase.currentMesh->transform[1]; transform[2] = ase.currentMesh->transform[2]; transform[3] = ase.currentMesh->transform[3]; // and now it's safe to clear memset( ase.currentMesh, 0, sizeof( *ase.currentMesh ) ); // and now we restore the saved out transform ase.currentMesh->transform[0] = transform[0]; ase.currentMesh->transform[1] = transform[1]; ase.currentMesh->transform[2] = transform[2]; ase.currentMesh->transform[3] = transform[3]; ASE_ParseBracedBlock( ASE_KeyMESH ); } // according to spec these are obsolete else if( !strcmp( token, "*MATERIAL_REF" ) ) { ASE_GetToken( false ); object->materialRef = atoi( ase.token ); } // loads a sequence of animation frames else if( !strcmp( token, "*MESH_ANIMATION" ) ) { VERBOSE( ( "..found MESH_ANIMATION\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_ANIMATION ); } // skip unused info else if( !strcmp( token, "*PROP_MOTIONBLUR" ) || !strcmp( token, "*PROP_CASTSHADOW" ) || !strcmp( token, "*PROP_RECVSHADOW" ) ) { ASE_SkipRestOfLine(); } }
static void ASE_KeyMESH( const char *token ) { aseMesh_t *pMesh = ASE_GetCurrentMesh(); if( !strcmp( token, "*TIMEVALUE" ) ) { ASE_GetToken( false ); pMesh->timeValue = atoi( ase.token ); VERBOSE( ( ".....timevalue: %d\n", pMesh->timeValue ) ); } else if( !strcmp( token, "*MESH_NUMVERTEX" ) ) { ASE_GetToken( false ); pMesh->numVertexes = atoi( ase.token ); VERBOSE( ( ".....num vertexes: %d\n", pMesh->numVertexes ) ); } else if( !strcmp( token, "*MESH_NUMTVERTEX" ) ) { ASE_GetToken( false ); pMesh->numTVertexes = atoi( ase.token ); VERBOSE( ( ".....num tvertexes: %d\n", pMesh->numTVertexes ) ); } else if( !strcmp( token, "*MESH_NUMCVERTEX" ) ) { ASE_GetToken( false ); pMesh->numCVertexes = atoi( ase.token ); VERBOSE( ( ".....num cvertexes: %d\n", pMesh->numCVertexes ) ); } else if( !strcmp( token, "*MESH_NUMFACES" ) ) { ASE_GetToken( false ); pMesh->numFaces = atoi( ase.token ); VERBOSE( ( ".....num faces: %d\n", pMesh->numFaces ) ); } else if( !strcmp( token, "*MESH_NUMTVFACES" ) ) { ASE_GetToken( false ); pMesh->numTVFaces = atoi( ase.token ); VERBOSE( ( ".....num tvfaces: %d\n", pMesh->numTVFaces ) ); if( pMesh->numTVFaces != pMesh->numFaces ) { common->Error( "MESH_NUMTVFACES != MESH_NUMFACES" ); } } else if( !strcmp( token, "*MESH_NUMCVFACES" ) ) { ASE_GetToken( false ); pMesh->numCVFaces = atoi( ase.token ); VERBOSE( ( ".....num cvfaces: %d\n", pMesh->numCVFaces ) ); if( pMesh->numTVFaces != pMesh->numFaces ) { common->Error( "MESH_NUMCVFACES != MESH_NUMFACES" ); } } else if( !strcmp( token, "*MESH_VERTEX_LIST" ) ) { pMesh->vertexes = ( idVec3 * ) Mem_Alloc( sizeof( idVec3 ) * pMesh->numVertexes ); ase.currentVertex = 0; VERBOSE( ( ".....parsing MESH_VERTEX_LIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_VERTEX_LIST ); } else if( !strcmp( token, "*MESH_TVERTLIST" ) ) { ase.currentVertex = 0; pMesh->tvertexes = ( idVec2 * ) Mem_Alloc( sizeof( idVec2 ) * pMesh->numTVertexes ); VERBOSE( ( ".....parsing MESH_TVERTLIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_TVERTLIST ); } else if( !strcmp( token, "*MESH_CVERTLIST" ) ) { ase.currentVertex = 0; pMesh->cvertexes = ( idVec3 * ) Mem_Alloc( sizeof( idVec3 ) * pMesh->numCVertexes ); VERBOSE( ( ".....parsing MESH_CVERTLIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_CVERTLIST ); } else if( !strcmp( token, "*MESH_FACE_LIST" ) ) { pMesh->faces = ( aseFace_t * ) Mem_Alloc( sizeof( aseFace_t ) * pMesh->numFaces ); ase.currentFace = 0; VERBOSE( ( ".....parsing MESH_FACE_LIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_FACE_LIST ); } else if( !strcmp( token, "*MESH_TFACELIST" ) ) { if( !pMesh->faces ) { common->Error( "*MESH_TFACELIST before *MESH_FACE_LIST" ); } ase.currentFace = 0; VERBOSE( ( ".....parsing MESH_TFACE_LIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyTFACE_LIST ); } else if( !strcmp( token, "*MESH_CFACELIST" ) ) { if( !pMesh->faces ) { common->Error( "*MESH_CFACELIST before *MESH_FACE_LIST" ); } ase.currentFace = 0; VERBOSE( ( ".....parsing MESH_CFACE_LIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyCFACE_LIST ); } else if( !strcmp( token, "*MESH_NORMALS" ) ) { if( !pMesh->faces ) { common->DWarning( "*MESH_NORMALS before *MESH_FACE_LIST" ); } ase.currentFace = 0; VERBOSE( ( ".....parsing MESH_NORMALS\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_NORMALS ); } }