📄 5g_parse3dm.cpp
字号:
// 5G_PARSE3DM.cpp: implementation of the C5G_PARSE3DM class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "..\edit3dm.h"
#include "5G_PARSE3DM.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
C5G_PARSE3DM::C5G_PARSE3DM()
{
m_pBuffer = NULL;
m_pBufferWord[0] = '\0';
m_pBufferLine[0] = '\0';
m_IndexBuffer = 0;
}
C5G_PARSE3DM::~C5G_PARSE3DM()
{
}
C5G_PARSE3DM::ReadFile(CString filename)
{
m_FileName = filename;
CFile file;
CFileException ex;
// Opening
if(!file.Open(filename, CFile::modeRead | CFile::typeBinary,&ex))
{
#ifdef _DEBUG
afxDump << "File could not be opened " << ex.m_cause << "\n";
#endif
return 0;
}
// Size file
m_SizeFile = file.GetLength();
// Alloc
m_pBuffer = new char[m_SizeFile];
if(m_pBuffer == NULL)
{
return 0;
}
// Reading
TRY
{
file.Read(m_pBuffer,m_SizeFile);
}
CATCH(CFileException, e)
{
#ifdef _DEBUG
afxDump << "Error during reading " << e->m_cause << "\n";
#endif
file.Close();
return 0;
}
END_CATCH
// Closing
file.Close();
return 1;
}
int C5G_PARSE3DM::ReadWord()
{
m_pBufferWord[0] = '\0';
int i=0;
// Jump to next valid character
while((m_pBuffer[m_IndexBuffer] == '\n' ||
m_pBuffer[m_IndexBuffer] == '\t' ||
m_pBuffer[m_IndexBuffer] == '\r' ||
m_pBuffer[m_IndexBuffer] == ' ' || m_pBuffer[m_IndexBuffer] == ',') &&
m_IndexBuffer < m_SizeFile)
m_IndexBuffer++;
// Check eof
if(m_IndexBuffer >= m_SizeFile)
return 0;
do
m_pBufferWord[i++] = m_pBuffer[m_IndexBuffer++];
while(m_pBuffer[m_IndexBuffer-1] != '\n' &&
m_pBuffer[m_IndexBuffer-1] != '\t' &&
m_pBuffer[m_IndexBuffer-1] != '\r' &&
m_pBuffer[m_IndexBuffer-1] != ' ' &&
m_pBuffer[m_IndexBuffer-1] != ',' &&
i < MAX_WORD_3DM &&
m_IndexBuffer < m_SizeFile);
m_pBufferWord[i-1] = '\0';
return 1;
}
int C5G_PARSE3DM::ReadLine()
{
m_pBufferLine[0] = '\0';
int i=0;
do
{
m_pBufferLine[i++] = m_pBuffer[m_IndexBuffer++];
}
while(m_pBuffer[m_IndexBuffer-1] != '\n' &&
i < MAX_LINE_3DM &&
m_IndexBuffer < m_SizeFile);
m_pBufferLine[i-1] = '\0';
//此处必为m_pBufferLine[i-1],因为当读到'\n'时,i已经加1。比如读“ab”,m_pBufferLine[0]
//存储a,此时i已经变为1,m_pBufferLine[1]存储b,遇到'\n'时i=3,所以要m_pBufferLine[i-1]
return 1;
}
int C5G_PARSE3DM::CheckVersion()
{
ReadLine();
if(strstr(m_pBufferLine,"#3dm ver1.0") != NULL) //必须用strstr函数,此函数检查第二个参数是否包含在第一个参数里
{ //若用等号,则如果文件头前多了空格就被诊断为非法文件
return 1;
}
return 0;
}
//将当前数据条到指定字符串所在的行,位置为指定字符串的前面,返回值类型为int,1代表成功,0代表失败
int C5G_PARSE3DM::OffsetToString(char *string)
{
while(m_IndexBuffer < m_SizeFile)
{
ReadLine();
char *adr = strstr(m_pBufferLine,string);
if(strstr(m_pBufferLine,string) != NULL)
{
m_IndexBuffer = m_IndexBuffer - strlen(m_pBufferLine) - 1 + (adr-m_pBufferLine);
ASSERT(m_IndexBuffer >= 0);
return 1;
}
}
return 0;
}
//将当前数据跳到以指定字符串开头的行的开头,返回值为int,1为成功,0为失败
int C5G_PARSE3DM::OffsetToStringBeginLine(char *string)
{
while(m_IndexBuffer < m_SizeFile)
{
ReadLine();
if(strncmp(m_pBufferLine,string,strlen(string)) == 0)
{
m_IndexBuffer -= strlen(m_pBufferLine)+1;
return 1;
}
}
return 0;
}
//ReadScene执行的前提是找到#scene,并从#scene开始执行,只到遇到#end scene为止
void C5G_PARSE3DM::ReadScene(C5G_3DScene *my3dscene)
{
int currentindex = m_IndexBuffer;
int scenesize;
if(OffsetToString("#end scene"))
{
scenesize = m_IndexBuffer;
}
m_IndexBuffer = currentindex;
//读取scene de name
if(OffsetToString("#name") && m_IndexBuffer <= scenesize)
{
char* scenename;
scenename = new char[100];
ReadWord();
ReadWord();
int success = sscanf(m_pBufferWord,"%s",scenename);
if(success)
{
CString a(scenename);
a.TrimLeft('\"');
a.TrimLeft('\'');
a.TrimRight('\'');
a.TrimRight('\"');
sscanf(a,"%s",scenename);
my3dscene->SetSceneName(scenename);
//AfxMessageBox(my3dscene->m_scenename);
}
}
m_IndexBuffer = currentindex;
//读取光照
if(OffsetToString("#light") && m_IndexBuffer <= scenesize)
ReadLight(my3dscene);
}
int C5G_PARSE3DM::ReadLight(C5G_3DScene *my3dscene)
{
ReadLine(); //跳过#light 0这一说明行
do
{
int tempindex = m_IndexBuffer; //记录上一行末的指针位置
ReadLine();
if(strstr(m_pBufferLine,"#end light") == NULL) //如果没有这行不是#end light,逐数据重读读取该行
{
//AfxMessageBox("zhao");
m_IndexBuffer = tempindex; //把指针定位到行首,因为我要重新读这一行的各个数据
ReadWord();
if(strstr(m_pBufferWord,"#position") != NULL)
{
float x,y,z,r;
ReadWord();
sscanf(m_pBufferWord,"%f",&x);
my3dscene->m_light.m_position.m_x = x;
ReadWord();
sscanf(m_pBufferWord,"%f",&y);
my3dscene->m_light.m_position.m_y = y;
ReadWord();
sscanf(m_pBufferWord,"%f",&z);
my3dscene->m_light.m_position.m_z = z;
ReadWord();
sscanf(m_pBufferWord,"%f",&r);
my3dscene->m_light.m_position.m_r = r;
ReadLine();
}
//else if(m_pBufferWord == "#ambient")
else if(strstr(m_pBufferWord,"#ambient") != NULL)
{
float x,y,z,r;
ReadWord();
sscanf(m_pBufferWord,"%f",&x);
my3dscene->m_light.m_ambient.m_x = x;
ReadWord();
sscanf(m_pBufferWord,"%f",&y);
my3dscene->m_light.m_ambient.m_y = y;
ReadWord();
sscanf(m_pBufferWord,"%f",&z);
my3dscene->m_light.m_ambient.m_z = z;
ReadWord();
sscanf(m_pBufferWord,"%f",&r);
my3dscene->m_light.m_ambient.m_r = r;
ReadLine();
//AfxMessageBox("hi");
}
//else if(m_pBufferWord == "#diffuse")
else if(strstr(m_pBufferWord,"#diffuse") != NULL)
{
float x,y,z,r;
ReadWord();
sscanf(m_pBufferWord,"%f",&x);
my3dscene->m_light.m_diffuse.m_x = x;
ReadWord();
sscanf(m_pBufferWord,"%f",&y);
my3dscene->m_light.m_diffuse.m_y = y;
ReadWord();
sscanf(m_pBufferWord,"%f",&z);
my3dscene->m_light.m_diffuse.m_z = z;
ReadWord();
sscanf(m_pBufferWord,"%f",&r);
my3dscene->m_light.m_diffuse.m_r = r;
ReadLine();
//AfxMessageBox("zhao");
}
else if(strstr(m_pBufferWord,"#specular") != NULL)
{
float x,y,z,r;
ReadWord();
sscanf(m_pBufferWord,"%f",&x);
my3dscene->m_light.m_specular.m_x = x;
ReadWord();
sscanf(m_pBufferWord,"%f",&y);
my3dscene->m_light.m_specular.m_y = y;
ReadWord();
sscanf(m_pBufferWord,"%f",&z);
my3dscene->m_light.m_specular.m_z = z;
ReadWord();
sscanf(m_pBufferWord,"%f",&r);
my3dscene->m_light.m_specular.m_r = r;
ReadLine();
//AfxMessageBox("zhao");
}
else if(strstr(m_pBufferWord,"#spotdirection") != NULL)
{
float x,y,z,r;
ReadWord();
sscanf(m_pBufferWord,"%f",&x);
my3dscene->m_light.m_spotdirection.m_x = x;
ReadWord();
sscanf(m_pBufferWord,"%f",&y);
my3dscene->m_light.m_spotdirection.m_y = y;
ReadWord();
sscanf(m_pBufferWord,"%f",&z);
my3dscene->m_light.m_spotdirection.m_z = z;
ReadWord();
sscanf(m_pBufferWord,"%f",&r);
my3dscene->m_light.m_spotdirection.m_r = r;
ReadLine();
//AfxMessageBox("zhao");
}
else if(strstr(m_pBufferWord,"#spotexponent") != NULL)
{
int success = ReadWord();
if(success)
{
float s;
sscanf(m_pBufferWord,"%f",&s);
my3dscene->m_light.m_spotexponent = s;
}
ReadLine();
}
else if(strstr(m_pBufferWord,"#spotcutoff") != NULL)
{
int success = ReadWord();
if(success)
{
float s;
sscanf(m_pBufferWord,"%f",&s);
my3dscene->m_light.m_spotcutoff = s;
}
ReadLine();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -