332 lines
6.6 KiB
C++
332 lines
6.6 KiB
C++
|
// ASEFile.cpp
|
||
|
|
||
|
#include "Module.h"
|
||
|
#include "Tokenizer.h"
|
||
|
#include "AlertErrHandler.h"
|
||
|
#include "ASEFile.h"
|
||
|
|
||
|
keywordArray_t CASEFile::s_symbols[] =
|
||
|
{
|
||
|
"*", TK_ASE_ASTERISK,
|
||
|
"{", TK_ASE_OBRACE,
|
||
|
"}", TK_ASE_CBRACE,
|
||
|
":", TK_ASE_COLON,
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_keywords[] =
|
||
|
{
|
||
|
"GEOMOBJECT", TK_GEOMOBJECT,
|
||
|
"SCENE", TK_SCENE,
|
||
|
"MATERIAL_LIST", TK_MATERIAL_LIST,
|
||
|
"COMMENT", TK_ASE_COMMENT,
|
||
|
"3DSMAX_ASCIIEXPORT", TK_3DSMAX_ASCIIEXPORT,
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_sceneKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_materialKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_mapKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_objectKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_nodeKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_meshKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_vertexKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_faceKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_faceOptionKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_tvertKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_tfaceKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_animationKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_contorlPosBezierKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_controlRotTCBKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_controlScaleBezierKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
keywordArray_t CASEFile::s_labelKeywords[] =
|
||
|
{
|
||
|
NULL, TK_EOF,
|
||
|
};
|
||
|
|
||
|
CASEFile::CASEFile()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CASEFile::~CASEFile()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CASEFile* CASEFile::Create(LPCTSTR filename)
|
||
|
{
|
||
|
CASEFile* retval = new CASEFile();
|
||
|
retval->Init(filename);
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
void CASEFile::Delete()
|
||
|
{
|
||
|
if (m_file != NULL)
|
||
|
{
|
||
|
free(m_file);
|
||
|
m_file = NULL;
|
||
|
}
|
||
|
if (m_comment != NULL)
|
||
|
{
|
||
|
free(m_comment);
|
||
|
m_comment = NULL;
|
||
|
}
|
||
|
delete this;
|
||
|
}
|
||
|
|
||
|
void CASEFile::Init(LPCTSTR filename)
|
||
|
{
|
||
|
if ((filename != NULL) && (strlen(filename) > 0))
|
||
|
{
|
||
|
m_file = (char*)malloc(strlen(filename) + 1);
|
||
|
strcpy(m_file, filename);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_file = NULL;
|
||
|
}
|
||
|
m_export = 0;
|
||
|
m_comment = NULL;
|
||
|
}
|
||
|
|
||
|
void CASEFile::Parse()
|
||
|
{
|
||
|
if (m_file == NULL)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
CAlertErrHandler errhandler;
|
||
|
CTokenizer* tokenizer = CTokenizer::Create(TKF_USES_EOL | TKF_NUMERICIDENTIFIERSTART);
|
||
|
tokenizer->SetErrHandler(&errhandler);
|
||
|
tokenizer->SetKeywords(s_keywords);
|
||
|
tokenizer->SetSymbols(s_symbols);
|
||
|
tokenizer->AddParseFile(m_file, 16 * 1024);
|
||
|
int tokType = TK_UNDEFINED;
|
||
|
while(tokType != TK_EOF)
|
||
|
{
|
||
|
CToken* curToken = tokenizer->GetToken();
|
||
|
if (curToken->GetType() == TK_EOF)
|
||
|
{
|
||
|
curToken->Delete();
|
||
|
tokType = TK_EOF;
|
||
|
break;
|
||
|
}
|
||
|
if (curToken->GetType() == TK_EOL)
|
||
|
{
|
||
|
curToken->Delete();
|
||
|
continue;
|
||
|
}
|
||
|
if (curToken->GetType() != TK_ASE_ASTERISK)
|
||
|
{
|
||
|
tokenizer->Error(TKERR_UNEXPECTED_TOKEN);
|
||
|
curToken->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
continue;
|
||
|
}
|
||
|
curToken->Delete();
|
||
|
curToken = tokenizer->GetToken();
|
||
|
tokType = curToken->GetType();
|
||
|
curToken->Delete();
|
||
|
switch(tokType)
|
||
|
{
|
||
|
case TK_EOF:
|
||
|
break;
|
||
|
case TK_GEOMOBJECT:
|
||
|
ParseGeomObject(tokenizer);
|
||
|
break;
|
||
|
case TK_SCENE:
|
||
|
ParseScene(tokenizer);
|
||
|
break;
|
||
|
case TK_MATERIAL_LIST:
|
||
|
ParseMaterialList(tokenizer);
|
||
|
break;
|
||
|
case TK_ASE_COMMENT:
|
||
|
ParseComment(tokenizer);
|
||
|
break;
|
||
|
case TK_3DSMAX_ASCIIEXPORT:
|
||
|
ParseAsciiExport(tokenizer);
|
||
|
break;
|
||
|
default:
|
||
|
tokenizer->Error(TKERR_UNEXPECTED_TOKEN);
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CASEFile::ParseAsciiExport(CTokenizer* tokenizer)
|
||
|
{
|
||
|
CToken* token = tokenizer->GetToken();
|
||
|
if (token->GetType() != TK_INT)
|
||
|
{
|
||
|
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
return;
|
||
|
}
|
||
|
m_export = token->GetIntValue();
|
||
|
token->Delete();
|
||
|
}
|
||
|
|
||
|
void CASEFile::ParseComment(CTokenizer* tokenizer)
|
||
|
{
|
||
|
CToken* token = tokenizer->GetToken();
|
||
|
if (token->GetType() != TK_STRING)
|
||
|
{
|
||
|
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
return;
|
||
|
}
|
||
|
m_comment = (char*)malloc(strlen(token->GetStringValue()) + 1);
|
||
|
strcpy(m_comment, token->GetStringValue());
|
||
|
token->Delete();
|
||
|
}
|
||
|
|
||
|
void CASEFile::ParseMaterialList(CTokenizer* tokenizer)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CASEFile::ParseScene(CTokenizer* tokenizer)
|
||
|
{
|
||
|
CToken* token = tokenizer->GetToken(s_sceneKeywords, 0, TKF_USES_EOL);
|
||
|
if (token->GetType() != TK_ASE_OBRACE)
|
||
|
{
|
||
|
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
return;
|
||
|
}
|
||
|
token->Delete();
|
||
|
|
||
|
bool inScene = true;
|
||
|
while(inScene)
|
||
|
{
|
||
|
token = tokenizer->GetToken(s_sceneKeywords, 0, 0);
|
||
|
switch(token->GetType())
|
||
|
{
|
||
|
case TK_EOF:
|
||
|
inScene = false;
|
||
|
tokenizer->Error("End of File", TKERR_UNEXPECTED_TOKEN);
|
||
|
token->Delete();
|
||
|
break;
|
||
|
case TK_ASE_CBRACE:
|
||
|
token->Delete();
|
||
|
inScene = false;
|
||
|
break;
|
||
|
case TK_EOL:
|
||
|
token->Delete();
|
||
|
break;
|
||
|
case TK_ASE_ASTERISK:
|
||
|
token->Delete();
|
||
|
token = tokenizer->GetToken(s_sceneKeywords, 0, 0);
|
||
|
switch (token->GetType())
|
||
|
{
|
||
|
case TK_SCENE_FILENAME:
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
case TK_SCENE_FIRSTFRAME:
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
case TK_SCENE_LASTFRAME:
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
case TK_SCENE_FRAMESPEED:
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
case TK_SCENE_TICKSPERFRAME:
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
case TK_SCENE_BACKGROUND_STATIC:
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
case TK_SCENE_AMBIENT_STATIC:
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
default:
|
||
|
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
|
||
|
token->Delete();
|
||
|
tokenizer->GetToEndOfLine()->Delete();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CASEFile::ParseGeomObject(CTokenizer* tokenizer)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|