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(); } }
/* ** 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(); }
/* ================= 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; }
/* ** 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(); } }
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(); } }
/* ** 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(); }