Changed sculptmode drawing to pay better attention to materials.

This fixes bug #5274, changing from uvmode to sculpt changes lighting model
This commit is contained in:
Nicholas Bishop 2006-12-01 01:40:53 +00:00
parent 4941107f92
commit b36b940807
3 changed files with 25 additions and 21 deletions

@ -75,7 +75,7 @@ void sculptmode_rem_tex(void*,void*);
void sculptmode_propset_init(unsigned short key); void sculptmode_propset_init(unsigned short key);
void sculptmode_propset(const unsigned short event); void sculptmode_propset(const unsigned short event);
void sculptmode_selectbrush_menu(); void sculptmode_selectbrush_menu();
void sculptmode_draw_mesh(); void sculptmode_draw_mesh(int);
struct BrushData *sculptmode_brush(); struct BrushData *sculptmode_brush();

@ -2160,7 +2160,7 @@ static int draw_mesh_object(Base *base, int dt, int flag)
finalDM->release(finalDM); finalDM->release(finalDM);
} }
else if(!G.obedit && G.scene->sculptdata.active_ob == ob && !modifiers_getVirtualModifierList(ob)) { else if(!G.obedit && G.scene->sculptdata.active_ob == ob && !modifiers_getVirtualModifierList(ob)) {
sculptmode_draw_mesh(NULL); sculptmode_draw_mesh(0);
} }
else { else {
/* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */ /* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */

@ -1266,7 +1266,7 @@ void sculptmode_propset_calctex()
if(!pd->tex) if(!pd->tex)
glGenTextures(1, (GLint *)&pd->tex); glGenTextures(1, (GLuint *)&pd->tex);
glBindTexture(GL_TEXTURE_2D, pd->tex); glBindTexture(GL_TEXTURE_2D, pd->tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, tsz, tsz, 0, GL_ALPHA, GL_FLOAT, d); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, tsz, tsz, 0, GL_ALPHA, GL_FLOAT, d);
@ -1408,7 +1408,7 @@ void sculptmode_update_all_projverts()
} }
} }
void sculptmode_draw_wires(char only_damaged, Mesh *me) void sculptmode_draw_wires(int only_damaged, Mesh *me)
{ {
int i; int i;
@ -1429,10 +1429,10 @@ void sculptmode_draw_wires(char only_damaged, Mesh *me)
bglPolygonOffset(0.0); bglPolygonOffset(0.0);
} }
void sculptmode_draw_mesh(ListBase *damaged_rects) { void sculptmode_draw_mesh(int only_damaged) {
Mesh *me= get_mesh(G.scene->sculptdata.active_ob); Mesh *me= get_mesh(G.scene->sculptdata.active_ob);
SculptData *sd= &G.scene->sculptdata; SculptData *sd= &G.scene->sculptdata;
int i, j, dt; int i, j, dt, drawCurrentMat = 1, matnr= -1;
persp(PERSP_VIEW); persp(PERSP_VIEW);
mymultmatrix(sd->active_ob->obmat); mymultmatrix(sd->active_ob->obmat);
@ -1449,33 +1449,37 @@ void sculptmode_draw_mesh(ListBase *damaged_rects) {
if(dt==OB_WIRE) if(dt==OB_WIRE)
glColorMask(0,0,0,0); glColorMask(0,0,0,0);
/* Only draw faces within the modified areas of the screen */
if(damaged_rects) {
for(i=0; i<me->totface; ++i) { for(i=0; i<me->totface; ++i) {
MFace *f= &me->mface[i]; MFace *f= &me->mface[i];
char inside= 0; char inside= 0;
int new_matnr= f->mat_nr + 1;
if(new_matnr != matnr)
drawCurrentMat= set_gl_material(matnr = new_matnr);
/* If only_damaged!=0, only draw faces that are partially
inside the area(s) modified by the brush */
if(only_damaged) {
for(j=0; j<(f->v4?4:3); ++j) { for(j=0; j<(f->v4?4:3); ++j) {
if(projverts[*((&f->v1)+j)].inside) { if(projverts[*((&f->v1)+j)].inside) {
inside= 1; inside= 1;
break; break;
} }
} }
if(inside) }
else
inside= 1;
if(inside && drawCurrentMat)
glDrawElements(f->v4?GL_QUADS:GL_TRIANGLES, f->v4?4:3, GL_UNSIGNED_INT, &f->v1); glDrawElements(f->v4?GL_QUADS:GL_TRIANGLES, f->v4?4:3, GL_UNSIGNED_INT, &f->v1);
} }
}
else { /* Draw entire model */
for(i=0; i<me->totface; ++i) {
const char q= me->mface[i].v4?1:0;
glDrawElements(q?GL_QUADS:GL_TRIANGLES,q?4:3,GL_UNSIGNED_INT,&me->mface[i].v1);
}
}
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glColorMask(1,1,1,1); glColorMask(1,1,1,1);
if(dt==OB_WIRE || (sd->active_ob->dtx & OB_DRAWWIRE)) if(dt==OB_WIRE || (sd->active_ob->dtx & OB_DRAWWIRE))
sculptmode_draw_wires(damaged_rects ? 1 : 0, me); sculptmode_draw_wires(only_damaged, me);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
} }
@ -1637,7 +1641,7 @@ void sculpt()
} }
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);
sculptmode_draw_mesh(&damaged_rects); sculptmode_draw_mesh(1);
glAccum(GL_LOAD, 1); glAccum(GL_LOAD, 1);