⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5g_parse3dm.cpp

📁 visual c++ 实例编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -