📄 5g_parse3dm.cpp
字号:
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 + -