📄 flystripfan.cpp
字号:
#include "..\..\lib\Fly3D.h"
void stripfan_mesh::reset()
{
if (stripfandata) delete stripfandata;
if (vertdata) delete vertdata;
nstripfan=0;
stripfandata=0;
vertdata=0;
nvert=0;
}
void stripfan_mesh::draw(int mode)
{
int i,j,k,n,mapcount=0;
if (nstripfan)
if (flyengine->multitexture && ntextureunits>1 && flyengine->nlm)
{
k=0;
for( i=0;i<nstripfan;i+=3 )
{
tc->use(stripfandata[i+1]);
if (stripfandata[i+2]!=-1)
tc->use(flyengine->lm[stripfandata[i+2]]->pic+flyengine->lmbase,1);
else
tc->use(-1,1);
n=abs(stripfandata[i]);
if (stripfandata[i]>0)
glBegin(GL_TRIANGLE_STRIP);
else
glBegin(GL_TRIANGLE_FAN);
for( j=0;j<n;j++,k++ )
{
glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,&vertdata[k].u);
glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,&vertdata[k].ul);
glVertex3fv(&vertdata[k].pos.x);
}
glEnd();
}
tc->use(-1,1);
tc->use(-1,0);
mapcount+=2;
}
else
{
if (mode&MAPPING_TEXTURE &&
flyengine->mapmode&MAPPING_TEXTURE)
{
k=0;
for( i=0;i<nstripfan;i+=3 )
{
tc->use(stripfandata[i+1]);
n=abs(stripfandata[i]);
if (stripfandata[i]>0)
glBegin(GL_TRIANGLE_STRIP);
else
glBegin(GL_TRIANGLE_FAN);
for( j=0;j<n;j++,k++ )
{
glTexCoord2fv(&vertdata[k].u);
glVertex3fv(&vertdata[k].pos.x);
}
glEnd();
}
mapcount++;
}
if (mode&MAPPING_DETAIL &&
flyengine->mapmode&MAPPING_DETAIL &&
flyengine->detailpic!=-1)
{
if (mapcount)
{
glBlendFunc(GL_ZERO,GL_SRC_COLOR);
glDepthMask(GL_FALSE);
glDepthFunc(GL_EQUAL);
}
k=0;
tc->use(flyengine->detailpic);
for( i=0;i<nstripfan;i+=3 )
{
n=abs(stripfandata[i]);
if (stripfandata[i]>0)
glBegin(GL_TRIANGLE_STRIP);
else
glBegin(GL_TRIANGLE_FAN);
for( j=0;j<n;j++,k++ )
{
glTexCoord2f(
vertdata[k].u*flyengine->detailtile,
vertdata[k].v*flyengine->detailtile);
glVertex3fv(&vertdata[k].pos.x);
}
glEnd();
}
mapcount++;
}
if (mode&MAPPING_LIGHTMAP &&
flyengine->mapmode&MAPPING_LIGHTMAP &&
flyengine->nlm!=0)
{
if (mapcount)
{
glBlendFunc(GL_ZERO,GL_SRC_COLOR);
glDepthMask(GL_FALSE);
glDepthFunc(GL_EQUAL);
}
k=0;
for( i=0;i<nstripfan;i+=3 )
{
if (stripfandata[i+2]==-1)
{
k+=n;
continue;
}
else tc->use(flyengine->lm[stripfandata[i+2]]->pic+flyengine->lmbase);
n=abs(stripfandata[i]);
if (stripfandata[i]>0)
glBegin(GL_TRIANGLE_STRIP);
else
glBegin(GL_TRIANGLE_FAN);
for( j=0;j<n;j++,k++ )
{
glTexCoord2fv(&vertdata[k].ul);
glVertex3fv(&vertdata[k].pos.x);
}
glEnd();
}
mapcount++;
}
}
if (mode&MAPPING_FOGMAP &&
flyengine->mapmode&MAPPING_FOGMAP &&
flyengine->nlm!=0)
{
if (mapcount)
{
glDepthMask(GL_FALSE);
glDepthFunc(GL_EQUAL);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
}
k=0;
for( i=0;i<nstripfan;i+=3 )
{
if (stripfandata[i+2]==-1)
{
k+=n;
continue;
}
else tc->use(stripfandata[i+2]+flyengine->fmbase);
n=abs(stripfandata[i]);
if (stripfandata[i]>0)
glBegin(GL_TRIANGLE_STRIP);
else
glBegin(GL_TRIANGLE_FAN);
for( j=0;j<n;j++,k++ )
{
glTexCoord2fv(&vertdata[k].ul);
glVertex3fv(&vertdata[k].pos.x);
}
glEnd();
}
mapcount++;
}
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
mesh *stripfan_mesh::build_mesh()
{
int i,j,k=0,v=0,f=0,n;
mesh *objmesh=new mesh;
for( i=0;i<nstripfan;i+=3 )
{
objmesh->nf+=abs(stripfandata[i])-2;
objmesh->nv+=abs(stripfandata[i]);
}
objmesh->faces=new face *[objmesh->nf];
objmesh->localfaces=new face [objmesh->nf];
objmesh->vert=new vector[objmesh->nv];
objmesh->color.vec(1.0f,1.0f,1.0f);
for( i=0;i<objmesh->nf;i++ )
objmesh->faces[i]=&objmesh->localfaces[i];
for( i=0;i<nstripfan;i+=3 )
{
n=abs(stripfandata[i]);
if (stripfandata[i]>0)
{
for( j=2;j<n;j++ )
{
objmesh->localfaces[f].color.vec(1.0f,1.0f,1.0f,1.0f);
objmesh->localfaces[f].texpic=stripfandata[i+1];
objmesh->localfaces[f].lm=stripfandata[i+2];
if (j&1)
{
objmesh->localfaces[f].vert[0]=&objmesh->vert[v+j-1];
objmesh->localfaces[f].vert[1]=&objmesh->vert[v+j-2];
objmesh->localfaces[f].lmuv[0][0]=vertdata[k+j-1].ul;
objmesh->localfaces[f].lmuv[0][1]=vertdata[k+j-1].vl;
objmesh->localfaces[f].lmuv[1][0]=vertdata[k+j-2].ul;
objmesh->localfaces[f].lmuv[1][1]=vertdata[k+j-2].vl;
}
else
{
objmesh->localfaces[f].vert[0]=&objmesh->vert[v+j-2];
objmesh->localfaces[f].vert[1]=&objmesh->vert[v+j-1];
objmesh->localfaces[f].lmuv[0][0]=vertdata[k+j-2].ul;
objmesh->localfaces[f].lmuv[0][1]=vertdata[k+j-2].vl;
objmesh->localfaces[f].lmuv[1][0]=vertdata[k+j-1].ul;
objmesh->localfaces[f].lmuv[1][1]=vertdata[k+j-1].vl;
}
objmesh->localfaces[f].vert[2]=&objmesh->vert[v+j];
objmesh->localfaces[f].lmuv[2][0]=vertdata[k+j].ul;
objmesh->localfaces[f].lmuv[2][1]=vertdata[k+j].vl;
f++;
}
}
else
{
for( j=2;j<n;j++ )
{
objmesh->localfaces[f].color.vec(1.0f,1.0f,1.0f,1.0f);
objmesh->localfaces[f].texpic=stripfandata[i+1];
objmesh->localfaces[f].lm=stripfandata[i+2];
objmesh->localfaces[f].vert[0]=&objmesh->vert[v];
objmesh->localfaces[f].vert[1]=&objmesh->vert[v+j-1];
objmesh->localfaces[f].vert[2]=&objmesh->vert[v+j];
objmesh->localfaces[f].lmuv[0][0]=vertdata[k].ul;
objmesh->localfaces[f].lmuv[0][1]=vertdata[k].vl;
objmesh->localfaces[f].lmuv[1][0]=vertdata[k+j-1].ul;
objmesh->localfaces[f].lmuv[1][1]=vertdata[k+j-1].vl;
objmesh->localfaces[f].lmuv[2][0]=vertdata[k+j].ul;
objmesh->localfaces[f].lmuv[2][1]=vertdata[k+j].vl;
f++;
}
}
for( j=0;j<n;j++ )
{
objmesh->vert[v].x=vertdata[k].pos.x;
objmesh->vert[v].y=vertdata[k].pos.y;
objmesh->vert[v].z=vertdata[k].pos.z;
v++; k++;
}
}
objmesh->compute_normals(MESH_FACENORM|MESH_VERTNORM|MESH_BBOX);
return objmesh;
}
vertex *stripfan_mesh::add_stripfan(int nv,int texpic,int lmpic)
{
int *tmp1=new int[nstripfan+3];
if (stripfandata)
{
memcpy(tmp1,stripfandata,sizeof(int)*nstripfan);
delete stripfandata;
}
stripfandata=tmp1;
stripfandata[nstripfan++]=nv;
stripfandata[nstripfan++]=texpic;
stripfandata[nstripfan++]=lmpic;
nv=abs(nv);
vertex *tmp2=new vertex[nvert+nv];
if (vertdata)
{
memcpy(tmp2,vertdata,sizeof(vertex)*nvert);
delete vertdata;
}
vertdata=tmp2;
memset(&vertdata[nvert],0,sizeof(vertex)*nv);
nvert+=nv;
return &vertdata[nvert-nv];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -