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

📄 5g_parse3dm.cpp

📁 visual c++ 实例编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			else if(strstr(m_pBufferWord,"#consantattenuation") != NULL)
			{
				int success = ReadWord();
				if(success)
				{
					float s;
					sscanf(m_pBufferWord,"%f",&s);
					my3dscene->m_light.m_constantattenuation = s;
				}
				ReadLine();
			}
			else if(strstr(m_pBufferWord,"#linearattenuation s") != NULL)
			{
				int success = ReadWord();
				if(success)
				{
					float s;
					sscanf(m_pBufferWord,"%f",&s);
					my3dscene->m_light.m_linearattenuation = s;
				}
				ReadLine();
			}
			else if(strstr(m_pBufferWord,"#quadraticattenuation") != NULL)
			{
				int success = ReadWord();
				if(success)
				{
					float s;
					sscanf(m_pBufferWord,"%f",&s);
					my3dscene->m_light.m_quadraticattenuation = s;
				}
				ReadLine();
			}
		}
	}
	while(strstr(m_pBufferLine,"#end light") == NULL && m_IndexBuffer <= m_SizeFile);
	return 1;
}
void C5G_PARSE3DM::ReadObject(C5G_3DScene *my3dscene)
{
	int successobject,successelement;
	int objectnum = 0,elementnum = 0;

	C5G_3DObject *my3dobject;
	my3dobject= new C5G_3DObject;
	ReadLine();                 //跳过#object这一行

	do
	{
		successobject = OffsetToString("#id");			//搜索object的id号
		int temp = m_IndexBuffer;
		if(successobject)
		{
			ReadWord();
			ReadWord();
			int id;
			int successid = sscanf(m_pBufferWord,"%d",&id);
			if(successid)
				my3dobject->m_objectid = id;
			//以上代码读入object的id
			int endindex;							
			//搜索当前object的结束语句#end object,记录结束时的指针,保证读取element时只在当前object中进行
			if(OffsetToString("#end object"))
			{
				endindex = m_IndexBuffer;
			}
			m_IndexBuffer = temp;
			//在当前节点内读取所有的element
			do
			{
				successelement = OffsetToString("#element");

				if(successelement && m_IndexBuffer < endindex)
				{
					ReadElement(my3dobject);
				}
				//如果读的#element超过了当前的end element,把指针定位到end element处
				//这样就不会读下一个object的elment了。
				else if(m_IndexBuffer >= endindex)
				{
					m_IndexBuffer = endindex;
				}
				

				elementnum=elementnum+successelement;
	
			}
			while(successelement == 1 && m_IndexBuffer <= endindex);
			objectnum = objectnum + successobject;
			my3dscene->m_objectlist.push_back(*my3dobject);   //每读一个object,就把他装到my3dscene的m_objectlist中
		}

	}
	while(successobject == 1 && m_IndexBuffer <=m_SizeFile);
	

}

//相当与这个类的主函数
void C5G_PARSE3DM::Run(CString filename,C5G_3DScene *my3dscene)
{
	ReadFile(filename);
	if(!CheckVersion())
		return;
	int tmpindex=m_IndexBuffer;              //存储当前指针位置
	while(OffsetToStringBeginLine("#scene"))
		ReadScene(my3dscene);
	m_IndexBuffer = tmpindex;
	while(OffsetToStringBeginLine("#object"))
	{
		ReadObject(my3dscene);
	}
	//CString aaa;
	//aaa.Format("asdfas:%f,,,%s", my3dscene->m_objectlist[0].m_elementlist[0].m_material.m_color.m_x, my3dscene->m_scenename);
	//::AfxMessageBox(aaa);
}

//读取节点
int C5G_PARSE3DM::ReadElement(C5G_3DObject *my3dobject)
{
	C5G_3DElement my3delement;
	C5G_Material mymaterial;
	ReadWord();								//返回值为#element
	ReadWord();								//返回element的id
	int id;
	int success = sscanf(m_pBufferWord,"%d",&id);
	my3delement.m_id = id;				//把element的id送进去
	int beginindex = m_IndexBuffer;
	int elementsize;
	if(OffsetToString("#end element"))
		elementsize = m_IndexBuffer;	//记录当前节点的#end element处的指针,保证读#triangles时不要读到别的节点中
	m_IndexBuffer = beginindex;
	if(OffsetToString("#material") && m_IndexBuffer <= elementsize)	
	{
		ReadMaterial(&my3delement);
		if(my3delement.m_material.m_texturefile != NULL)
		{
			m_IndexBuffer = beginindex;
			if(OffsetToString("#texture") && m_IndexBuffer <= elementsize)	
				ReadTextureCoord(&my3delement);
		}
	}
	m_IndexBuffer = beginindex;
	if(OffsetToString("#triangles") && m_IndexBuffer <= elementsize)
	{
	
		ReadLine();
		float x,y,z;
		int success;
		do
		{
			ReadWord();
			success = sscanf(m_pBufferWord,"%f",&x);
			ReadWord();
			success &= sscanf(m_pBufferWord,"%f",&y);
			ReadWord();
			success &= sscanf(m_pBufferWord,"%f",&z);
			if(success)
			{
				C5G_3DVertex new3dvertex(x,y,z);
				my3delement.m_mesh.push_back(new3dvertex);
			}
		}
		while(success);
	}
	//如果不是3的倍数,删除多余的行
	if(my3delement.m_mesh.size()%3 == 1)
	{
		my3delement.m_mesh.pop_back();
	}
	else if(my3delement.m_mesh.size()%3 == 2)
	{
		my3delement.m_mesh.pop_back();
		my3delement.m_mesh.pop_back();
	}
	my3dobject->m_elementlist.push_back(my3delement);
	return 1;
}
int C5G_PARSE3DM::ReadMaterial(C5G_3DElement *my3delement)
{
	int materialsize;
	ReadLine();                          //跳过#material这一行
	int currentindex = m_IndexBuffer;
	if(!OffsetToString("#end material"))
		return 0;
	else
		materialsize = m_IndexBuffer; //定义material终了的位置指针
	m_IndexBuffer = currentindex;
	if(OffsetToString("#color") && m_IndexBuffer <=materialsize)
	{
		ReadWord();                       //跳过#color这一个单词
		float x,y,z,r;
		int successmaterial;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&x))
			my3delement->m_material.m_color.m_x = x;

		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&y))
			my3delement->m_material.m_color.m_y = y;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&z))
			my3delement->m_material.m_color.m_z = z;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&r))
			my3delement->m_material.m_color.m_r = r;

	}
	m_IndexBuffer = currentindex;
	if(OffsetToString("ambient") && m_IndexBuffer <=materialsize)
	{
		ReadWord();                       //跳过#color这一个单词
		float x,y,z,r;
		int successmaterial;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&x))
			my3delement->m_material.m_ambient.m_x = x;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&y))
			my3delement->m_material.m_ambient.m_y = y;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&z))
			my3delement->m_material.m_ambient.m_z = z;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&r))
			my3delement->m_material.m_ambient.m_r = r;
	}
	m_IndexBuffer = currentindex;
	if(OffsetToString("#specular") && m_IndexBuffer <=materialsize)
	{
		ReadWord();                       //跳过#color这一个单词
		float x,y,z,r;
		int successmaterial;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&x))
			my3delement->m_material.m_specular.m_x = x;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&y))
			my3delement->m_material.m_specular.m_y = y;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&z))
			my3delement->m_material.m_specular.m_z = z;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&r))
			my3delement->m_material.m_specular.m_r = r;
	}
	m_IndexBuffer = currentindex;
	if(OffsetToString("#diffuse") && m_IndexBuffer <=materialsize)
	{
		ReadWord();                       //跳过#color这一个单词
		float x,y,z,r;
		int successmaterial;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&x))
			my3delement->m_material.m_diffuse.m_x = x;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&y))
			my3delement->m_material.m_diffuse.m_y = y;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&z))
			my3delement->m_material.m_diffuse.m_z = z;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&r))
			my3delement->m_material.m_diffuse.m_r = r;
	}
	m_IndexBuffer = currentindex;
	if(OffsetToString("#emission") && m_IndexBuffer <=materialsize)
	{
		ReadWord();                       //跳过#color这一个单词
		float x,y,z,r;
		int successmaterial;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&x))
			my3delement->m_material.m_emission.m_x = x;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&y))
			my3delement->m_material.m_emission.m_y = y;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&z))
			my3delement->m_material.m_emission.m_z = z;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&r))
			my3delement->m_material.m_emission.m_r = r;
	}
	m_IndexBuffer = currentindex;
	if(OffsetToString("#shininess") && m_IndexBuffer <=materialsize)
	{
		ReadWord();
		float s;
		int successmaterial;
		ReadWord();
		if(successmaterial = sscanf(m_pBufferWord,"%f",&s))
			my3delement->m_material.m_shininess = s;
	}
	m_IndexBuffer = currentindex;
	if(OffsetToString("#filename") && m_IndexBuffer <=materialsize)
	{
		ReadWord();
		ReadWord();
		char filename[1000];
		int success = sscanf(m_pBufferWord,"%s",filename);
		if(success)
		{
			CString a(filename);
			a.TrimLeft('\"');
			a.TrimLeft('\'');
			a.TrimRight('\'');
			a.TrimRight('\"');
			sscanf(a,"%s",filename);
			my3delement->m_material.SetTextureFile(filename);
		}
		
	}
	return 1;
}
int C5G_PARSE3DM::ReadTextureCoord(C5G_3DElement *my3delement)
{
	float x,y;
	int successtexture;
	ReadLine();                     //跳过#texture这一行
	do
	{
		ReadWord();
		successtexture = sscanf(m_pBufferWord,"%f",&x);
		ReadWord();
		successtexture = sscanf(m_pBufferWord,"%f",&y);
		if(successtexture)
		{
			C5G_2DVertex new2dvertex(x,y);
			my3delement->m_texcoor.push_back(new2dvertex);
		}
	}
	while(successtexture);
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -