- simplify extverts handling

This commit is contained in:
2005-03-29 07:58:56 +00:00
parent 4a5a9f4e49
commit ea92a56193

View File

@@ -66,28 +66,26 @@ typedef struct {
float *extverts, *nors;
} MeshDerivedMesh;
static float *meshDM__getVertCo(MeshDerivedMesh *mdm, int index)
{
if (mdm->extverts) {
return mdm->extverts+3*index;
} else {
return ((Mesh*) mdm->ob->data)->mvert[index].co;
}
}
static void meshDM_drawVerts(DerivedMesh *dm)
{
MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
Mesh *me = mdm->ob->data;
int a, start=0, end=me->totvert;
MVert *mvert = me->mvert;
float *extverts = mdm->extverts;
set_buildvars(mdm->ob, &start, &end);
glBegin(GL_POINTS);
if(extverts) {
extverts+= 3*start;
for(a= start; a<end; a++, extverts+=3) {
glVertex3fv(extverts);
}
}
else {
mvert+= start;
for(a= start; a<end; a++, mvert++) {
glVertex3fv(mvert->co);
}
for(a= start; a<end; a++) {
glVertex3fv(meshDM__getVertCo(mdm, a));
}
glEnd();
}
@@ -96,10 +94,7 @@ static void meshDM_drawEdges(DerivedMesh *dm)
MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
Mesh *me= mdm->ob->data;
int a, start= 0, end= me->totface;
MVert *mvert = me->mvert;
MFace *mface = me->mface;
float *extverts= mdm->extverts;
float *f1, *f2, *f3, *f4;
set_buildvars(mdm->ob, &start, &end);
mface+= start;
@@ -112,15 +107,8 @@ static void meshDM_drawEdges(DerivedMesh *dm)
glBegin(GL_LINES);
for(a=me->totedge; a>0; a--, medge++) {
if(medge->flag & ME_EDGEDRAW) {
if(extverts) {
f1= extverts+3*medge->v1;
f2= extverts+3*medge->v2;
}
else {
f1= (mvert+medge->v1)->co;
f2= (mvert+medge->v2)->co;
}
glVertex3fv(f1); glVertex3fv(f2);
glVertex3fv(meshDM__getVertCo(mdm, medge->v1));
glVertex3fv(meshDM__getVertCo(mdm, medge->v2));
}
}
glEnd();
@@ -131,40 +119,30 @@ static void meshDM_drawEdges(DerivedMesh *dm)
int test= mface->edcode;
if(test) {
if(extverts) {
f1= extverts+3*mface->v1;
f2= extverts+3*mface->v2;
}
else {
f1= (mvert+mface->v1)->co;
f2= (mvert+mface->v2)->co;
}
if(test&ME_V1V2){
glVertex3fv(f1); glVertex3fv(f2);
glVertex3fv(meshDM__getVertCo(mdm, mface->v1));
glVertex3fv(meshDM__getVertCo(mdm, mface->v2));
}
if(mface->v3) {
if(extverts) f3= extverts+3*mface->v3;
else f3= (mvert+mface->v3)->co;
if(test&ME_V2V3){
glVertex3fv(f2); glVertex3fv(f3);
glVertex3fv(meshDM__getVertCo(mdm, mface->v2));
glVertex3fv(meshDM__getVertCo(mdm, mface->v3));
}
if (mface->v4) {
if(extverts) f4= extverts+3*mface->v4;
else f4= (mvert+mface->v4)->co;
if(test&ME_V3V4){
glVertex3fv(f3); glVertex3fv(f4);
glVertex3fv(meshDM__getVertCo(mdm, mface->v3));
glVertex3fv(meshDM__getVertCo(mdm, mface->v4));
}
if(test&ME_V4V1){
glVertex3fv(f4); glVertex3fv(f1);
glVertex3fv(meshDM__getVertCo(mdm, mface->v4));
glVertex3fv(meshDM__getVertCo(mdm, mface->v1));
}
} else {
if(test&ME_V3V1){
glVertex3fv(f3); glVertex3fv(f1);
glVertex3fv(meshDM__getVertCo(mdm, mface->v3));
glVertex3fv(meshDM__getVertCo(mdm, mface->v1));
}
}
}
@@ -177,9 +155,7 @@ static void meshDM_drawLooseEdges(DerivedMesh *dm)
{
MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
Mesh *me = mdm->ob->data;
MVert *mvert= me->mvert;
MFace *mface= me->mface;
float *extverts = mdm->extverts;
int a, start=0, end=me->totface;
set_buildvars(mdm->ob, &start, &end);
@@ -188,19 +164,8 @@ static void meshDM_drawLooseEdges(DerivedMesh *dm)
glBegin(GL_LINES);
for(a=start; a<end; a++, mface++) {
if(!mface->v3) {
float *v1, *v2;
if(extverts) {
v1= extverts+3*mface->v1;
v2= extverts+3*mface->v2;
}
else {
v1= (mvert+mface->v1)->co;
v2= (mvert+mface->v2)->co;
}
glVertex3fv(v1);
glVertex3fv(v2);
glVertex3fv(meshDM__getVertCo(mdm, mface->v3));
glVertex3fv(meshDM__getVertCo(mdm, mface->v4));
}
}
glEnd();
@@ -211,7 +176,6 @@ static void meshDM_drawFacesSolid(DerivedMesh *dm, void (*setMaterial)(int))
Mesh *me = mdm->ob->data;
MVert *mvert= me->mvert;
MFace *mface= me->mface;
float *extverts = mdm->extverts;
float *nors = mdm->nors;
int a, start=0, end=me->totface;
int glmode=-1, shademodel=-1, matnr=-1;
@@ -219,7 +183,7 @@ static void meshDM_drawFacesSolid(DerivedMesh *dm, void (*setMaterial)(int))
set_buildvars(mdm->ob, &start, &end);
mface+= start;
#define PASSVERT(co, index, punoBit) { \
#define PASSVERT(index, punoBit) { \
if (shademodel==GL_SMOOTH) { \
short *no = (mvert+index)->no; \
if (mface->puno&punoBit) { \
@@ -228,29 +192,15 @@ static void meshDM_drawFacesSolid(DerivedMesh *dm, void (*setMaterial)(int))
glNormal3sv(no); \
} \
} \
glVertex3fv(co); \
glVertex3fv(meshDM__getVertCo(mdm,index)); \
}
glBegin(glmode=GL_QUADS);
for(a=start; a<end; a++, mface++, nors+=3) {
if(mface->v3) {
int new_glmode, new_matnr, new_shademodel;
float *v1, *v2, *v3, *v4;
if(extverts) {
v1= extverts+3*mface->v1;
v2= extverts+3*mface->v2;
v3= mface->v3?extverts+3*mface->v3:NULL;
v4= mface->v4?extverts+3*mface->v4:NULL;
}
else {
v1= (mvert+mface->v1)->co;
v2= (mvert+mface->v2)->co;
v3= mface->v3?(mvert+mface->v3)->co:NULL;
v4= mface->v4?(mvert+mface->v4)->co:NULL;
}
new_glmode = v4?GL_QUADS:GL_TRIANGLES;
new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
new_matnr = mface->mat_nr+1;
new_shademodel = (!(me->flag&ME_AUTOSMOOTH) && (mface->flag & ME_SMOOTH))?GL_SMOOTH:GL_FLAT;
@@ -266,11 +216,11 @@ static void meshDM_drawFacesSolid(DerivedMesh *dm, void (*setMaterial)(int))
if(shademodel==GL_FLAT)
glNormal3fv(nors);
PASSVERT(v1, mface->v1, ME_FLIPV1);
PASSVERT(v2, mface->v2, ME_FLIPV2);
PASSVERT(v3, mface->v3, ME_FLIPV3);
if (v4) {
PASSVERT(v4, mface->v4, ME_FLIPV4);
PASSVERT(mface->v1, ME_FLIPV1);
PASSVERT(mface->v2, ME_FLIPV2);
PASSVERT(mface->v3, ME_FLIPV3);
if (mface->v4) {
PASSVERT(mface->v4, ME_FLIPV4);
}
}
}
@@ -285,9 +235,7 @@ static void meshDM_drawFacesColored(DerivedMesh *dm, int useTwoSide, unsigned ch
MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
Object *ob= mdm->ob;
Mesh *me= ob->data;
MVert *mvert= me->mvert;
MFace *mface= me->mface;
float *extverts= mdm->extverts;
int a, glmode, start=0, end=me->totface;
unsigned char *cp1, *cp2;
@@ -310,20 +258,6 @@ static void meshDM_drawFacesColored(DerivedMesh *dm, int useTwoSide, unsigned ch
for(a=start; a<end; a++, mface++, cp1+= 16) {
if(mface->v3) {
int new_glmode= mface->v4?GL_QUADS:GL_TRIANGLES;
float *v1, *v2, *v3, *v4;
if(extverts) {
v1= extverts+3*mface->v1;
v2= extverts+3*mface->v2;
v3= extverts+3*mface->v3;
v4= mface->v4?extverts+3*mface->v4:NULL;
}
else {
v1= (mvert+mface->v1)->co;
v2= (mvert+mface->v2)->co;
v3= (mvert+mface->v3)->co;
v4= mface->v4?(mvert+mface->v4)->co:NULL;
}
if (new_glmode!=glmode) {
glEnd();
@@ -331,26 +265,26 @@ static void meshDM_drawFacesColored(DerivedMesh *dm, int useTwoSide, unsigned ch
}
glColor3ub(cp1[3], cp1[2], cp1[1]);
glVertex3fv( v1 );
glVertex3fv( meshDM__getVertCo(mdm,mface->v1) );
glColor3ub(cp1[7], cp1[6], cp1[5]);
glVertex3fv( v2 );
glVertex3fv( meshDM__getVertCo(mdm,mface->v2) );
glColor3ub(cp1[11], cp1[10], cp1[9]);
glVertex3fv( v3 );
if(v4) {
glVertex3fv( meshDM__getVertCo(mdm,mface->v3) );
if(mface->v4) {
glColor3ub(cp1[15], cp1[14], cp1[13]);
glVertex3fv( v4 );
glVertex3fv( meshDM__getVertCo(mdm,mface->v4) );
}
if(useTwoSide) {
glColor3ub(cp2[11], cp2[10], cp2[9]);
glVertex3fv( v3 );
glVertex3fv( meshDM__getVertCo(mdm,mface->v3) );
glColor3ub(cp2[7], cp2[6], cp2[5]);
glVertex3fv( v2 );
glVertex3fv( meshDM__getVertCo(mdm,mface->v2) );
glColor3ub(cp2[3], cp2[2], cp2[1]);
glVertex3fv( v1 );
glVertex3fv( meshDM__getVertCo(mdm,mface->v1) );
if(mface->v4) {
glColor3ub(cp2[15], cp2[14], cp2[13]);
glVertex3fv( v4 );
glVertex3fv( meshDM__getVertCo(mdm,mface->v4) );
}
}
}
@@ -369,32 +303,18 @@ static void meshDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf,
MVert *mvert= me->mvert;
MFace *mface= me->mface;
TFace *tface = me->tface;
float *extverts = mdm->extverts;
float *nors = mdm->nors;
int a, start=0, end=me->totface;
set_buildvars(mdm->ob, &start, &end);
for (a=start; a<end; a++) {
float *v1, *v2, *v3, *v4;
MFace *mf= &mface[a];
unsigned char *cp= NULL;
if(mf->v3==0) continue;
if(tface && (tface->flag & (TF_HIDE|TF_INVISIBLE))) continue;
if (extverts) {
v1= extverts+3*mf->v1;
v2= extverts+3*mf->v2;
v3= extverts+3*mf->v3;
v4= mf->v4?(extverts+3*mf->v4):NULL;
} else {
v1= (mvert+mf->v1)->co;
v2= (mvert+mf->v2)->co;
v3= (mvert+mf->v3)->co;
v4= mf->v4?(mvert+mf->v4)->co:NULL;
}
if (setDrawParams(tface, mf->mat_nr)) {
if (tface) {
cp= (unsigned char *) tface->col;
@@ -407,27 +327,27 @@ static void meshDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf,
glNormal3fv(&nors[a*3]);
}
glBegin(v4?GL_QUADS:GL_TRIANGLES);
glBegin(mface->v4?GL_QUADS:GL_TRIANGLES);
if (tface) glTexCoord2fv(tface->uv[0]);
if (cp) glColor3ub(cp[3], cp[2], cp[1]);
if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v1].no);
glVertex3fv(v1);
glVertex3fv(meshDM__getVertCo(mdm, mface->v1));
if (tface) glTexCoord2fv(tface->uv[1]);
if (cp) glColor3ub(cp[7], cp[6], cp[5]);
if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v2].no);
glVertex3fv(v2);
glVertex3fv(meshDM__getVertCo(mdm, mface->v2));
if (tface) glTexCoord2fv(tface->uv[2]);
if (cp) glColor3ub(cp[11], cp[10], cp[9]);
if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v3].no);
glVertex3fv(v3);
glVertex3fv(meshDM__getVertCo(mdm, mface->v3));
if(v4) {
if(mface->v4) {
if (tface) glTexCoord2fv(tface->uv[3]);
if (cp) glColor3ub(cp[15], cp[14], cp[13]);
if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v4].no);
glVertex3fv(v4);
glVertex3fv(meshDM__getVertCo(mdm, mface->v4));
}
glEnd();