static void ASE_KeyMESH_ANIMATION( const char *token ) { aseMesh_t *pMesh = ASE_GetCurrentMesh(); // loads a single animation frame if ( !strcmp( token, "*MESH" ) ) { VERBOSE( ( "...found MESH\n" ) ); assert( pMesh->faces == 0 ); assert( pMesh->vertexes == 0 ); assert( pMesh->tvertexes == 0 ); memset( pMesh, 0, sizeof( *pMesh ) ); ASE_ParseBracedBlock( ASE_KeyMESH ); if ( ++ase.objects[ase.currentObject].anim.currentFrame == MAX_ASE_ANIMATION_FRAMES ) { Error( "Too many animation frames" ); } } else { Error( "Unknown token '%s' while parsing MESH_ANIMATION", token ); } }
static void ASE_KeyMESH_ANIMATION( const char *token ) { aseMesh_t *mesh; // loads a single animation frame if ( !strcmp( token, "*MESH" ) ) { VERBOSE( ( "...found MESH\n" ) ); mesh = (aseMesh_t *)Mem_Alloc( sizeof( aseMesh_t ) ); memset( mesh, 0, sizeof( aseMesh_t ) ); ase.currentMesh = mesh; ase.currentObject->frames.Append( mesh ); ASE_ParseBracedBlock( ASE_KeyMESH ); } else { common->Error( "Unknown token '%s' while parsing MESH_ANIMATION", token ); } }
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 ); } }
void ASE_Loader::ASE_KeyMATERIAL( const char *token ) { // ASE_Material_t currMtl = mMtlList[mCurrMtl]; if ( !strcmp( token, "*MAP_DIFFUSE" ) ) { ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMAP_DIFFUSE ); } 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); mCurrMtl->materialData.ambient[0] = r; mCurrMtl->materialData.ambient[1] = g; mCurrMtl->materialData.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); mCurrMtl->materialData.diffuse[0] = r; mCurrMtl->materialData.diffuse[1] = g; mCurrMtl->materialData.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); mCurrMtl->materialData.specular[0] = r; mCurrMtl->materialData.specular[1] = g; mCurrMtl->materialData.specular[2] = b; } else if(!strcmp( token, "*NUMSUBMTLS")) { ASE_GetToken(false); LOGI("...sub mtl num : %s\n", s_token); int numsubmtl = atoi(s_token); //ASE_Material_t currMtl = mMtlList[mCurrMtl]; mCurrMtl->numsubmaterials = numsubmtl; mCurrMtl->submaterials = new ASE_MaterialData[numsubmtl]; } else if(!strcmp(token , "*SUBMATERIAL")) { ASE_GetToken(false); int nCurrSubMtl = atoi(s_token); mCurrSubMtl = &mCurrMtl->submaterials[nCurrSubMtl]; ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMAP_SUBMATERIAL ); } }
void ASE_Loader::ASE_KeyGEOMOBJECT( const char *token ) { if ( !strcmp( token, "*NODE_NAME" ) ) { ASE_GetToken( true ); LOGI( " %s\n", s_token ); strcpy( mCurrGeomObject->name, s_token + 1 ); if ( strchr( mCurrGeomObject->name, '"' ) ) *strchr( mCurrGeomObject->name, '"' ) = 0; if(!strcmp(mCurrGeomObject->name , "Camera01")) { LOGI("... has camera setting\n"); } } else if ( !strcmp( token, "*NODE_PARENT" ) ) { ASE_SkipRestOfLine(); } // ignore unused data blocks else if ( !strcmp( token, "*TM_ANIMATION" ) ) { ASE_ParseBracedBlock( 0 ); } // ignore regular meshes that aren't part of animation else if ( !strcmp( token, "*MESH" )) { mCurrGeomObject->mesh = new ASE_Mesh; mCurrMesh = mCurrGeomObject->mesh; ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyMESH ); } // according to spec these are obsolete else if ( !strcmp( token, "*MATERIAL_REF" ) ) { ASE_GetToken( false ); mCurrGeomObject->materialref = atoi( s_token ); } // loads a sequence of animation frames else if ( !strcmp( token, "*NODE_TM" ) ) { ASE_ParseBracedBlock( &ASE_Loader::ASE_KeyNODETM ); } else if(!strcmp(token, "*WIREFRAME_COLOR")) { ASE_GetToken(false); float r = atof(s_token); ASE_GetToken(false); float g = atof(s_token); ASE_GetToken(false); float b = atof(s_token); mCurrGeomObject->wireframeColor[0]= r; mCurrGeomObject->wireframeColor[1]= g; mCurrGeomObject->wireframeColor[2]= b; } // skip unused info else if ( !strcmp( token, "*PROP_MOTIONBLUR" ) || !strcmp( token, "*PROP_CASTSHADOW" ) || !strcmp( token, "*PROP_RECVSHADOW" ) ) { ASE_SkipRestOfLine(); } }
static void ASE_KeyGEOMOBJECT( const char *token ) { if ( !strcmp( token, "*NODE_NAME" ) ) { char *name = ase.objects[ase.currentObject].name; ASE_GetToken( qtrue ); VERBOSE( ( " %s\n", s_token ) ); strcpy( ase.objects[ase.currentObject].name, s_token + 1 ); if ( strchr( ase.objects[ase.currentObject].name, '"' ) ) *strchr( ase.objects[ase.currentObject].name, '"' ) = 0; if ( strstr( name, "tag" ) == name ) { while ( strchr( name, '_' ) != strrchr( name, '_' ) ) { *strrchr( name, '_' ) = 0; } while ( strrchr( name, ' ' ) ) { *strrchr( name, ' ' ) = 0; } } } else if ( !strcmp( token, "*NODE_PARENT" ) ) { ASE_SkipRestOfLine(); } // ignore unused data blocks else if ( !strcmp( token, "*NODE_TM" ) || !strcmp( token, "*TM_ANIMATION" ) ) { ASE_ParseBracedBlock( 0 ); } // ignore regular meshes that aren't part of animation else if ( !strcmp( token, "*MESH" ) && !ase.grabAnims ) { /* if ( strstr( ase.objects[ase.currentObject].name, "tag_" ) == ase.objects[ase.currentObject].name ) { s_forceStaticMesh = true; ASE_ParseBracedBlock( ASE_KeyMESH ); s_forceStaticMesh = false; } */ ASE_ParseBracedBlock( ASE_KeyMESH ); if ( ++ase.objects[ase.currentObject].anim.currentFrame == MAX_ASE_ANIMATION_FRAMES ) { Error( "Too many animation frames" ); } ase.objects[ase.currentObject].anim.numFrames = ase.objects[ase.currentObject].anim.currentFrame; ase.objects[ase.currentObject].numAnimations++; /* // ignore meshes that aren't part of animations if this object isn't a // a tag else { ASE_ParseBracedBlock( 0 ); } */ } // according to spec these are obsolete else if ( !strcmp( token, "*MATERIAL_REF" ) ) { ASE_GetToken( qfalse ); ase.objects[ase.currentObject].materialRef = atoi( s_token ); } // loads a sequence of animation frames else if ( !strcmp( token, "*MESH_ANIMATION" ) ) { if ( ase.grabAnims ) { VERBOSE( ( "..found MESH_ANIMATION\n" ) ); if ( ase.objects[ase.currentObject].numAnimations ) { Error( "Multiple MESH_ANIMATIONS within a single GEOM_OBJECT" ); } ASE_ParseBracedBlock( ASE_KeyMESH_ANIMATION ); ase.objects[ase.currentObject].anim.numFrames = ase.objects[ase.currentObject].anim.currentFrame; ase.objects[ase.currentObject].numAnimations++; } else { ASE_SkipEnclosingBraces(); } } // 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( qfalse ); pMesh->timeValue = atoi( s_token ); VERBOSE( ( ".....timevalue: %d\n", pMesh->timeValue ) ); } else if ( !strcmp( token, "*MESH_NUMVERTEX" ) ) { ASE_GetToken( qfalse ); pMesh->numVertexes = atoi( s_token ); VERBOSE( ( ".....TIMEVALUE: %d\n", pMesh->timeValue ) ); VERBOSE( ( ".....num vertexes: %d\n", pMesh->numVertexes ) ); } else if ( !strcmp( token, "*MESH_NUMFACES" ) ) { ASE_GetToken( qfalse ); pMesh->numFaces = atoi( s_token ); VERBOSE( ( ".....num faces: %d\n", pMesh->numFaces ) ); } else if ( !strcmp( token, "*MESH_NUMTVFACES" ) ) { ASE_GetToken( qfalse ); if ( atoi( s_token ) != pMesh->numFaces ) { Error( "MESH_NUMTVFACES != MESH_NUMFACES" ); } } else if ( !strcmp( token, "*MESH_NUMTVERTEX" ) ) { ASE_GetToken( qfalse ); pMesh->numTVertexes = atoi( s_token ); VERBOSE( ( ".....num tvertexes: %d\n", pMesh->numTVertexes ) ); } else if ( !strcmp( token, "*MESH_VERTEX_LIST" ) ) { pMesh->vertexes = calloc( sizeof( aseVertex_t ) * pMesh->numVertexes, 1 ); pMesh->currentVertex = 0; VERBOSE( ( ".....parsing MESH_VERTEX_LIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_VERTEX_LIST ); } else if ( !strcmp( token, "*MESH_TVERTLIST" ) ) { pMesh->currentVertex = 0; pMesh->tvertexes = calloc( sizeof( aseTVertex_t ) * pMesh->numTVertexes, 1 ); VERBOSE( ( ".....parsing MESH_TVERTLIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_TVERTLIST ); } else if ( !strcmp( token, "*MESH_FACE_LIST" ) ) { pMesh->faces = calloc( sizeof( aseFace_t ) * pMesh->numFaces, 1 ); pMesh->currentFace = 0; VERBOSE( ( ".....parsing MESH_FACE_LIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyMESH_FACE_LIST ); } else if ( !strcmp( token, "*MESH_TFACELIST" ) ) { pMesh->tfaces = calloc( sizeof( aseFace_t ) * pMesh->numFaces, 1 ); pMesh->currentFace = 0; VERBOSE( ( ".....parsing MESH_TFACE_LIST\n" ) ); ASE_ParseBracedBlock( ASE_KeyTFACE_LIST ); } else if ( !strcmp( token, "*MESH_NORMALS" ) ) { ASE_ParseBracedBlock( 0 ); } }
/* ** ASE_Process */ static void ASE_Process( int type ) { 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, "*HELPEROBJECT" ) ) { 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 (!ase.objects[ase.currentObject].anim.frames[0].numFaces) //we didn't get any faces of animation! { Error( "WARNING: ASE_Process no triangles grabbed for GEOMOBJECT \"%s\"!\n", ase.objects[ase.currentObject].name); } _strlwr(ase.objects[ase.currentObject].name); if ( strstr( ase.objects[ase.currentObject].name, "Bip" ) || strstr( ase.objects[ase.currentObject].name, "ignore_" ) ) { VERBOSE( ( "(discarding BIP/ignore object)\n" ) ); ASE_FreeGeomObject( ase.currentObject ); } else if ( (type /*== TYPE_PLAYER*/) && ( 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(); }