2.5/Sculpt:
Removed a bunch of old code that was #ifdef'd out. Mostly relates to partial visibility and partial redraw. Both of these are important features, but need better design updated for 2.5. Also removed the old (huge/ugly!) sculpt() function that is now handled by the stroke operator code.
This commit is contained in:
@@ -738,37 +738,6 @@ static void sculpt_add_damaged_rect(SculptSession *ss)
|
||||
}
|
||||
}
|
||||
|
||||
/* Clears the depth buffer in each modified area. */
|
||||
#if 0
|
||||
static void sculpt_clear_damaged_areas(SculptSession *ss)
|
||||
{
|
||||
RectNode *rn= NULL;
|
||||
|
||||
for(rn = ss->damaged_rects.first; rn; rn = rn->next) {
|
||||
rcti clp = rn->r;
|
||||
rcti *win = NULL; /*XXX: &curarea->winrct; */
|
||||
|
||||
clp.xmin += win->xmin;
|
||||
clp.xmax += win->xmin;
|
||||
clp.ymin += win->ymin;
|
||||
clp.ymax += win->ymin;
|
||||
|
||||
if(clp.xmin < win->xmax && clp.xmax > win->xmin &&
|
||||
clp.ymin < win->ymax && clp.ymax > win->ymin) {
|
||||
if(clp.xmin < win->xmin) clp.xmin = win->xmin;
|
||||
if(clp.ymin < win->ymin) clp.ymin = win->ymin;
|
||||
if(clp.xmax > win->xmax) clp.xmax = win->xmax;
|
||||
if(clp.ymax > win->ymax) clp.ymax = win->ymax;
|
||||
|
||||
glScissor(clp.xmin + 1, clp.ymin + 1,
|
||||
clp.xmax - clp.xmin - 2,
|
||||
clp.ymax - clp.ymin - 2);
|
||||
}
|
||||
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
static void do_brush_action(Sculpt *sd, StrokeCache *cache)
|
||||
{
|
||||
SculptSession *ss = sd->session;
|
||||
@@ -987,25 +956,6 @@ static void sculpt_update_tex(Sculpt *sd)
|
||||
}
|
||||
}
|
||||
|
||||
void sculptmode_selectbrush_menu(void)
|
||||
{
|
||||
/* XXX: I guess menus belong elsewhere too?
|
||||
|
||||
Sculpt *sd= sculpt_data();
|
||||
int val;
|
||||
|
||||
pupmenu_set_active(sd->brush_type);
|
||||
|
||||
val= pupmenu("Select Brush%t|Draw|Smooth|Pinch|Inflate|Grab|Layer|Flatten");
|
||||
|
||||
if(val>0) {
|
||||
sd->brush_type= val;
|
||||
|
||||
allqueue(REDRAWVIEW3D, 1);
|
||||
allqueue(REDRAWBUTSEDIT, 1);
|
||||
}*/
|
||||
}
|
||||
|
||||
static void sculptmode_update_all_projverts(SculptSession *ss)
|
||||
{
|
||||
unsigned i;
|
||||
@@ -1084,89 +1034,6 @@ static void sculpt_update_mesh_elements(bContext *C)
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX: lots of drawing code (partial redraw), has to go elsewhere */
|
||||
#if 0
|
||||
void sculptmode_draw_wires(SculptSession *ss, int only_damaged)
|
||||
{
|
||||
Mesh *me = get_mesh(OBACT);
|
||||
int i;
|
||||
|
||||
bglPolygonOffset(1.0);
|
||||
glDepthMask(0);
|
||||
BIF_ThemeColor((OBACT==OBACT)?TH_ACTIVE:TH_SELECT);
|
||||
|
||||
for(i=0; i<me->totedge; i++) {
|
||||
MEdge *med= &me->medge[i];
|
||||
|
||||
if((!only_damaged || (ss->projverts[med->v1].inside || ss->projverts[med->v2].inside)) &&
|
||||
(med->flag & ME_EDGEDRAW)) {
|
||||
glDrawElements(GL_LINES, 2, GL_UNSIGNED_INT, &med->v1);
|
||||
}
|
||||
}
|
||||
|
||||
glDepthMask(1);
|
||||
bglPolygonOffset(0.0);
|
||||
}
|
||||
|
||||
void sculptmode_draw_mesh(int only_damaged)
|
||||
{
|
||||
int i, j, dt, drawCurrentMat = 1, matnr= -1;
|
||||
SculptSession *ss = sculpt_session();
|
||||
|
||||
sculpt_update_mesh_elements(ss, OBACT);
|
||||
|
||||
persp(PERSP_VIEW);
|
||||
mymultmatrix(OBACT->obmat);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_LIGHTING);
|
||||
/* XXX: GPU_set_object_materials(G.scene, OBACT, 0, NULL); */
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
glShadeModel(GL_SMOOTH);
|
||||
|
||||
glVertexPointer(3, GL_FLOAT, sizeof(MVert), &cache->mvert[0].co);
|
||||
glNormalPointer(GL_SHORT, sizeof(MVert), &cache->mvert[0].no);
|
||||
|
||||
dt= MIN2(G.vd->drawtype, OBACT->dt);
|
||||
if(dt==OB_WIRE)
|
||||
glColorMask(0,0,0,0);
|
||||
|
||||
for(i=0; i<ss->totface; ++i) {
|
||||
MFace *f= &ss->mface[i];
|
||||
char inside= 0;
|
||||
int new_matnr= f->mat_nr + 1;
|
||||
|
||||
if(new_matnr != matnr)
|
||||
drawCurrentMat= GPU_enable_material(matnr = new_matnr, NULL);
|
||||
|
||||
/* 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) {
|
||||
if(ss->projverts[*((&f->v1)+j)].inside) {
|
||||
inside= 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
inside= 1;
|
||||
|
||||
if(inside && drawCurrentMat)
|
||||
glDrawElements(f->v4?GL_QUADS:GL_TRIANGLES, f->v4?4:3, GL_UNSIGNED_INT, &f->v1);
|
||||
}
|
||||
|
||||
glDisable(GL_CULL_FACE);
|
||||
glDisable(GL_LIGHTING);
|
||||
glColorMask(1,1,1,1);
|
||||
|
||||
if(dt==OB_WIRE || (OBACT->dtx & OB_DRAWWIRE))
|
||||
sculptmode_draw_wires(ss, only_damaged);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int sculpt_mode_poll(bContext *C)
|
||||
{
|
||||
return G.f & G_SCULPTMODE;
|
||||
@@ -1718,454 +1585,3 @@ void ED_operatortypes_sculpt()
|
||||
WM_operatortype_append(SCULPT_OT_sculptmode_toggle);
|
||||
WM_operatortype_append(SCULPT_OT_brush_curve_preset);
|
||||
}
|
||||
|
||||
void sculpt(Sculpt *sd)
|
||||
{
|
||||
#if 0
|
||||
SculptSession *ss= sd->session;
|
||||
Object *ob= NULL; /*XXX */
|
||||
Mesh *me;
|
||||
MultiresModifierData *mmd = NULL;
|
||||
/* lastSigMouse is for the rake, to store the last place the mouse movement was significant */
|
||||
short mouse[2], mvalo[2], lastSigMouse[2],firsttime=1, mousebut;
|
||||
short modifier_calculations= 0;
|
||||
BrushAction *a = MEM_callocN(sizeof(BrushAction), "brush action");
|
||||
short spacing= 32000;
|
||||
int scissor_box[4];
|
||||
float offsetRot;
|
||||
int smooth_stroke = 0, i;
|
||||
int anchored, rake = 0 /* XXX: rake = ? */;
|
||||
|
||||
/* XXX: checking that sculpting is allowed
|
||||
if(!(G.f & G_SCULPTMODE) || G.obedit || !ob || ob->id.lib || !get_mesh(ob) || (get_mesh(ob)->totface == 0))
|
||||
return;
|
||||
if(!(ob->lay & G.vd->lay))
|
||||
error("Active object is not in this layer");
|
||||
if(ob_get_keyblock(ob)) {
|
||||
if(!(ob->shapeflag & OB_SHAPE_LOCK)) {
|
||||
error("Cannot sculpt on unlocked shape key");
|
||||
return;
|
||||
}
|
||||
}*/
|
||||
|
||||
anchored = sd->brush->flag & BRUSH_ANCHORED;
|
||||
smooth_stroke = (sd->flags & SCULPT_INPUT_SMOOTH) && (sd->brush->sculpt_tool != SCULPT_TOOL_GRAB) && !anchored;
|
||||
|
||||
if(smooth_stroke)
|
||||
sculpt_stroke_new(256);
|
||||
|
||||
ss->damaged_rects.first = ss->damaged_rects.last = NULL;
|
||||
ss->damaged_verts.first = ss->damaged_verts.last = NULL;
|
||||
ss->vertexcosnos = NULL;
|
||||
|
||||
mmd = sculpt_multires_active(ob);
|
||||
|
||||
/* Check that vertex users are up-to-date */
|
||||
if(ob != active_ob || !ss->vertex_users || ss->vertex_users_size != cache->totvert) {
|
||||
sculpt_vertexusers_free(ss);
|
||||
calc_vertex_users(ss);
|
||||
if(ss->projverts)
|
||||
MEM_freeN(ss->projverts);
|
||||
ss->projverts = NULL;
|
||||
active_ob= ob;
|
||||
}
|
||||
|
||||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
glEnableClientState(GL_NORMAL_ARRAY);
|
||||
|
||||
/*XXX:
|
||||
persp(PERSP_VIEW);
|
||||
getmouseco_areawin(mvalo);*/
|
||||
|
||||
/* Init texture
|
||||
FIXME: Shouldn't be doing this every time! */
|
||||
if(sd->tex_mode!=SCULPTREPT_3D)
|
||||
sculptmode_update_tex(sd);
|
||||
|
||||
/*XXX: getmouseco_areawin(mouse); */
|
||||
mvalo[0]= mouse[0];
|
||||
mvalo[1]= mouse[1];
|
||||
lastSigMouse[0]=mouse[0];
|
||||
lastSigMouse[1]=mouse[1];
|
||||
mousebut = 0; /* XXX: L_MOUSE; */
|
||||
|
||||
/* If modifier_calculations is true, then extra time must be spent
|
||||
updating the mesh. This takes a *lot* longer, so it's worth
|
||||
skipping if the modifier stack is empty. */
|
||||
modifier_calculations= sculpt_modifiers_active(ob);
|
||||
|
||||
if(modifier_calculations)
|
||||
ss->vertexcosnos= mesh_get_mapped_verts_nors(NULL, ob); /* XXX: scene = ? */
|
||||
sculptmode_update_all_projverts(ss);
|
||||
|
||||
/* Capture original copy */
|
||||
if(sd->flags & SCULPT_DRAW_FAST)
|
||||
glAccum(GL_LOAD, 1);
|
||||
|
||||
/* Get original scissor box */
|
||||
glGetIntegerv(GL_SCISSOR_BOX, scissor_box);
|
||||
|
||||
/* For raking, get the original angle*/
|
||||
offsetRot=sculpt_tex_angle(sd);
|
||||
|
||||
me = get_mesh(ob);
|
||||
|
||||
while (/*XXX:get_mbut() & mousebut*/0) {
|
||||
/* XXX: getmouseco_areawin(mouse); */
|
||||
/* If rake, and the mouse has moved over 10 pixels (euclidean) (prevents jitter) then get the new angle */
|
||||
if (rake && (pow(lastSigMouse[0]-mouse[0],2)+pow(lastSigMouse[1]-mouse[1],2))>100){
|
||||
/*Nasty looking, but just orig + new angle really*/
|
||||
set_tex_angle(sd, offsetRot+180.+to_deg(atan2((float)(mouse[1]-lastSigMouse[1]),(float)(mouse[0]-lastSigMouse[0]))));
|
||||
lastSigMouse[0]=mouse[0];
|
||||
lastSigMouse[1]=mouse[1];
|
||||
}
|
||||
|
||||
if(firsttime || mouse[0]!=mvalo[0] || mouse[1]!=mvalo[1] ||
|
||||
sd->brush->flag & BRUSH_AIRBRUSH) {
|
||||
a->firsttime = firsttime;
|
||||
firsttime= 0;
|
||||
|
||||
if(smooth_stroke)
|
||||
sculpt_stroke_add_point(ss->stroke, mouse[0], mouse[1]);
|
||||
|
||||
spacing+= sqrt(pow(mvalo[0]-mouse[0],2)+pow(mvalo[1]-mouse[1],2));
|
||||
|
||||
if(modifier_calculations && !ss->vertexcosnos)
|
||||
ss->vertexcosnos= mesh_get_mapped_verts_nors(NULL, ob); /*XXX scene = ? */
|
||||
|
||||
if(sd->brush->sculpt_tool != SCULPT_TOOL_GRAB) {
|
||||
if(anchored) {
|
||||
/* Restore the mesh before continuing with anchored stroke */
|
||||
/*if(a->mesh_store) {
|
||||
for(i = 0; i < cache->totvert; ++i) {
|
||||
VecCopyf(cache->mvert[i].co, &a->mesh_store[i].x);
|
||||
cache->mvert[i].no[0] = a->orig_norms[i][0];
|
||||
cache->mvert[i].no[1] = a->orig_norms[i][1];
|
||||
cache->mvert[i].no[2] = a->orig_norms[i][2];
|
||||
}
|
||||
}*/
|
||||
|
||||
//do_symmetrical_brush_actions(sd, a, mouse, NULL);
|
||||
}
|
||||
else {
|
||||
if(smooth_stroke) {
|
||||
sculpt_stroke_apply(sd, ss->stroke);
|
||||
}
|
||||
else if(sd->spacing==0 || spacing>sd->spacing) {
|
||||
//do_symmetrical_brush_actions(sd, a, mouse, NULL);
|
||||
spacing= 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
//do_symmetrical_brush_actions(sd, a, mouse, mvalo);
|
||||
//unproject(ss, sd->pivot, mouse[0], mouse[1], a->depth);
|
||||
}
|
||||
|
||||
if((!ss->multires && modifier_calculations) || ob_get_keyblock(ob)) {
|
||||
/* XXX: DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); */ }
|
||||
|
||||
if(modifier_calculations || sd->brush->sculpt_tool == SCULPT_TOOL_GRAB || !(sd->flags & SCULPT_DRAW_FAST)) {
|
||||
calc_damaged_verts(ss, a);
|
||||
/*XXX: scrarea_do_windraw(curarea);
|
||||
screen_swapbuffers(); */
|
||||
} else { /* Optimized drawing */
|
||||
calc_damaged_verts(ss, a);
|
||||
|
||||
/* Draw the stored image to the screen */
|
||||
glAccum(GL_RETURN, 1);
|
||||
|
||||
sculpt_clear_damaged_areas(ss);
|
||||
|
||||
/* Draw all the polygons that are inside the modified area(s) */
|
||||
glScissor(scissor_box[0], scissor_box[1], scissor_box[2], scissor_box[3]);
|
||||
/* XXX: sculptmode_draw_mesh(1); */
|
||||
glAccum(GL_LOAD, 1);
|
||||
|
||||
projverts_clear_inside(ss);
|
||||
|
||||
/* XXX: persp(PERSP_WIN); */
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
/* Draw cursor */
|
||||
if(sd->flags & SCULPT_TOOL_DRAW)
|
||||
fdrawXORcirc((float)mouse[0],(float)mouse[1],sd->brush->size);
|
||||
/* XXX: if(smooth_stroke)
|
||||
sculpt_stroke_draw();
|
||||
|
||||
myswapbuffers(); */
|
||||
}
|
||||
|
||||
BLI_freelistN(&ss->damaged_rects);
|
||||
ss->damaged_rects.first = ss->damaged_rects.last = NULL;
|
||||
|
||||
mvalo[0]= mouse[0];
|
||||
mvalo[1]= mouse[1];
|
||||
|
||||
if(ss->vertexcosnos) {
|
||||
MEM_freeN(ss->vertexcosnos);
|
||||
ss->vertexcosnos= NULL;
|
||||
}
|
||||
|
||||
}
|
||||
else { /*XXX:BIF_wait_for_statechange();*/ }
|
||||
}
|
||||
|
||||
/* Set the rotation of the brush back to what it was before any rake */
|
||||
set_tex_angle(sd, offsetRot);
|
||||
|
||||
if(smooth_stroke) {
|
||||
sculpt_stroke_apply_all(sd, ss->stroke);
|
||||
calc_damaged_verts(ss, a);
|
||||
BLI_freelistN(&ss->damaged_rects);
|
||||
}
|
||||
|
||||
//if(a->layer_disps) MEM_freeN(a->layer_disps);
|
||||
//if(a->mesh_store) MEM_freeN(a->mesh_store);
|
||||
//if(a->orig_norms) MEM_freeN(a->orig_norms);
|
||||
for(i=0; i<8; ++i)
|
||||
BLI_freelistN(&a->grab_active_verts[i]);
|
||||
MEM_freeN(a);
|
||||
sculpt_stroke_free(ss->stroke);
|
||||
ss->stroke = NULL;
|
||||
|
||||
if(mmd) {
|
||||
if(mmd->undo_verts && mmd->undo_verts != cache->mvert)
|
||||
MEM_freeN(mmd->undo_verts);
|
||||
|
||||
mmd->undo_verts = cache->mvert;
|
||||
mmd->undo_verts_tot = cache->totvert;
|
||||
}
|
||||
|
||||
//sculpt_undo_push(sd);
|
||||
|
||||
/* XXX: if(G.vd->depths) G.vd->depths->damaged= 1;
|
||||
allqueue(REDRAWVIEW3D, 0); */
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Partial Mesh Visibility */
|
||||
|
||||
/* XXX: Partial vis. always was a mess, have to figure something out */
|
||||
#if 0
|
||||
/* mode: 0=hide outside selection, 1=hide inside selection */
|
||||
static void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
|
||||
{
|
||||
Mesh *me= get_mesh(ob);
|
||||
float hidebox[6][3];
|
||||
vec3f plane_normals[4];
|
||||
float plane_ds[4];
|
||||
unsigned i, j;
|
||||
unsigned ndx_show, ndx_hide;
|
||||
MVert *nve;
|
||||
unsigned face_cnt_show= 0, face_ndx_show= 0;
|
||||
unsigned edge_cnt_show= 0, edge_ndx_show= 0;
|
||||
unsigned *old_map= NULL;
|
||||
const unsigned SHOW= 0, HIDE=1;
|
||||
|
||||
/* Convert hide box from 2D to 3D */
|
||||
unproject(hidebox[0], hb_2d->xmin, hb_2d->ymax, 1);
|
||||
unproject(hidebox[1], hb_2d->xmax, hb_2d->ymax, 1);
|
||||
unproject(hidebox[2], hb_2d->xmax, hb_2d->ymin, 1);
|
||||
unproject(hidebox[3], hb_2d->xmin, hb_2d->ymin, 1);
|
||||
unproject(hidebox[4], hb_2d->xmin, hb_2d->ymax, 0);
|
||||
unproject(hidebox[5], hb_2d->xmax, hb_2d->ymin, 0);
|
||||
|
||||
/* Calculate normals for each side of hide box */
|
||||
CalcNormFloat(hidebox[0], hidebox[1], hidebox[4], &plane_normals[0].x);
|
||||
CalcNormFloat(hidebox[1], hidebox[2], hidebox[5], &plane_normals[1].x);
|
||||
CalcNormFloat(hidebox[2], hidebox[3], hidebox[5], &plane_normals[2].x);
|
||||
CalcNormFloat(hidebox[3], hidebox[0], hidebox[4], &plane_normals[3].x);
|
||||
|
||||
/* Calculate D for each side of hide box */
|
||||
for(i= 0; i<4; ++i)
|
||||
plane_ds[i]= hidebox[i][0]*plane_normals[i].x + hidebox[i][1]*plane_normals[i].y +
|
||||
hidebox[i][2]*plane_normals[i].z;
|
||||
|
||||
/* Add partial visibility to mesh */
|
||||
if(!me->pv) {
|
||||
me->pv= MEM_callocN(sizeof(PartialVisibility),"PartialVisibility");
|
||||
} else {
|
||||
old_map= MEM_callocN(sizeof(unsigned)*me->pv->totvert,"PMV oldmap");
|
||||
for(i=0; i<me->pv->totvert; ++i) {
|
||||
old_map[i]= me->pv->vert_map[i]<me->totvert?0:1;
|
||||
}
|
||||
mesh_pmv_revert(ob, me);
|
||||
}
|
||||
|
||||
/* Kill sculpt data */
|
||||
active_ob= NULL;
|
||||
|
||||
/* Initalize map with which verts are to be hidden */
|
||||
me->pv->vert_map= MEM_mallocN(sizeof(unsigned)*me->totvert, "PMV vertmap");
|
||||
me->pv->totvert= me->totvert;
|
||||
me->totvert= 0;
|
||||
for(i=0; i<me->pv->totvert; ++i) {
|
||||
me->pv->vert_map[i]= mode ? HIDE:SHOW;
|
||||
for(j=0; j<4; ++j) {
|
||||
if(me->mvert[i].co[0] * plane_normals[j].x +
|
||||
me->mvert[i].co[1] * plane_normals[j].y +
|
||||
me->mvert[i].co[2] * plane_normals[j].z < plane_ds[j] ) {
|
||||
me->pv->vert_map[i]= mode ? SHOW:HIDE; /* Vert is outside the hide box */
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(old_map && old_map[i]) me->pv->vert_map[i]= 1;
|
||||
if(!me->pv->vert_map[i]) ++me->totvert;
|
||||
|
||||
}
|
||||
if(old_map) MEM_freeN(old_map);
|
||||
|
||||
/* Find out how many faces to show */
|
||||
for(i=0; i<me->totface; ++i) {
|
||||
if(!me->pv->vert_map[me->mface[i].v1] &&
|
||||
!me->pv->vert_map[me->mface[i].v2] &&
|
||||
!me->pv->vert_map[me->mface[i].v3]) {
|
||||
if(me->mface[i].v4) {
|
||||
if(!me->pv->vert_map[me->mface[i].v4])
|
||||
++face_cnt_show;
|
||||
}
|
||||
else ++face_cnt_show;
|
||||
}
|
||||
}
|
||||
/* Find out how many edges to show */
|
||||
for(i=0; i<me->totedge; ++i) {
|
||||
if(!me->pv->vert_map[me->medge[i].v1] &&
|
||||
!me->pv->vert_map[me->medge[i].v2])
|
||||
++edge_cnt_show;
|
||||
}
|
||||
|
||||
/* Create new vert array and reset each vert's map with map[old]=new index */
|
||||
nve= MEM_mallocN(sizeof(MVert)*me->pv->totvert, "PMV verts");
|
||||
ndx_show= 0; ndx_hide= me->totvert;
|
||||
for(i=0; i<me->pv->totvert; ++i) {
|
||||
if(me->pv->vert_map[i]) {
|
||||
me->pv->vert_map[i]= ndx_hide;
|
||||
nve[me->pv->vert_map[i]]= me->mvert[i];
|
||||
++ndx_hide;
|
||||
} else {
|
||||
me->pv->vert_map[i]= ndx_show;
|
||||
nve[me->pv->vert_map[i]]= me->mvert[i];
|
||||
++ndx_show;
|
||||
}
|
||||
}
|
||||
CustomData_free_layer_active(&me->vdata, CD_MVERT, me->pv->totvert);
|
||||
me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, nve, me->totvert);
|
||||
|
||||
/* Create new face array */
|
||||
me->pv->old_faces= me->mface;
|
||||
me->pv->totface= me->totface;
|
||||
me->mface= MEM_mallocN(sizeof(MFace)*face_cnt_show, "PMV faces");
|
||||
for(i=0; i<me->totface; ++i) {
|
||||
MFace *pr_f= &me->pv->old_faces[i];
|
||||
char show= 0;
|
||||
|
||||
if(me->pv->vert_map[pr_f->v1] < me->totvert &&
|
||||
me->pv->vert_map[pr_f->v2] < me->totvert &&
|
||||
me->pv->vert_map[pr_f->v3] < me->totvert) {
|
||||
if(pr_f->v4) {
|
||||
if(me->pv->vert_map[pr_f->v4] < me->totvert)
|
||||
show= 1;
|
||||
}
|
||||
else show= 1;
|
||||
}
|
||||
|
||||
if(show) {
|
||||
MFace *cr_f= &me->mface[face_ndx_show];
|
||||
*cr_f= *pr_f;
|
||||
cr_f->v1= me->pv->vert_map[pr_f->v1];
|
||||
cr_f->v2= me->pv->vert_map[pr_f->v2];
|
||||
cr_f->v3= me->pv->vert_map[pr_f->v3];
|
||||
cr_f->v4= pr_f->v4 ? me->pv->vert_map[pr_f->v4] : 0;
|
||||
test_index_face(cr_f,NULL,0,pr_f->v4?4:3);
|
||||
++face_ndx_show;
|
||||
}
|
||||
}
|
||||
me->totface= face_cnt_show;
|
||||
CustomData_set_layer(&me->fdata, CD_MFACE, me->mface);
|
||||
|
||||
/* Create new edge array */
|
||||
me->pv->old_edges= me->medge;
|
||||
me->pv->totedge= me->totedge;
|
||||
me->medge= MEM_mallocN(sizeof(MEdge)*edge_cnt_show, "PMV edges");
|
||||
me->pv->edge_map= MEM_mallocN(sizeof(int)*me->pv->totedge,"PMV edgemap");
|
||||
for(i=0; i<me->totedge; ++i) {
|
||||
if(me->pv->vert_map[me->pv->old_edges[i].v1] < me->totvert &&
|
||||
me->pv->vert_map[me->pv->old_edges[i].v2] < me->totvert) {
|
||||
MEdge *cr_e= &me->medge[edge_ndx_show];
|
||||
me->pv->edge_map[i]= edge_ndx_show;
|
||||
*cr_e= me->pv->old_edges[i];
|
||||
cr_e->v1= me->pv->vert_map[me->pv->old_edges[i].v1];
|
||||
cr_e->v2= me->pv->vert_map[me->pv->old_edges[i].v2];
|
||||
++edge_ndx_show;
|
||||
}
|
||||
else me->pv->edge_map[i]= -1;
|
||||
}
|
||||
me->totedge= edge_cnt_show;
|
||||
CustomData_set_layer(&me->edata, CD_MEDGE, me->medge);
|
||||
|
||||
/* XXX: DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA); */
|
||||
}
|
||||
|
||||
static rcti sculptmode_pmv_box()
|
||||
{
|
||||
/*XXX: short down[2], mouse[2];
|
||||
rcti ret;
|
||||
|
||||
getmouseco_areawin(down);
|
||||
|
||||
while((get_mbut()&L_MOUSE) || (get_mbut()&R_MOUSE)) {
|
||||
getmouseco_areawin(mouse);
|
||||
|
||||
scrarea_do_windraw(curarea);
|
||||
|
||||
persp(PERSP_WIN);
|
||||
glLineWidth(2);
|
||||
setlinestyle(2);
|
||||
sdrawXORline(down[0],down[1],mouse[0],down[1]);
|
||||
sdrawXORline(mouse[0],down[1],mouse[0],mouse[1]);
|
||||
sdrawXORline(mouse[0],mouse[1],down[0],mouse[1]);
|
||||
sdrawXORline(down[0],mouse[1],down[0],down[1]);
|
||||
setlinestyle(0);
|
||||
glLineWidth(1);
|
||||
persp(PERSP_VIEW);
|
||||
|
||||
screen_swapbuffers();
|
||||
backdrawview3d(0);
|
||||
}
|
||||
|
||||
ret.xmin= down[0]<mouse[0]?down[0]:mouse[0];
|
||||
ret.ymin= down[1]<mouse[1]?down[1]:mouse[1];
|
||||
ret.xmax= down[0]>mouse[0]?down[0]:mouse[0];
|
||||
ret.ymax= down[1]>mouse[1]?down[1]:mouse[1];
|
||||
return ret;*/
|
||||
}
|
||||
|
||||
void sculptmode_pmv(int mode)
|
||||
{
|
||||
Object *ob= NULL; /*XXX: OBACT; */
|
||||
rcti hb_2d;
|
||||
|
||||
if(ob_get_key(ob)) {
|
||||
error("Cannot hide mesh with shape keys enabled");
|
||||
return;
|
||||
}
|
||||
|
||||
hb_2d= sculptmode_pmv_box(); /* Get 2D hide box */
|
||||
|
||||
sculptmode_correct_state();
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
if(hb_2d.xmax-hb_2d.xmin > 3 && hb_2d.ymax-hb_2d.ymin > 3) {
|
||||
init_sculptmatrices();
|
||||
|
||||
sculptmode_do_pmv(ob,&hb_2d,mode);
|
||||
}
|
||||
else mesh_pmv_off(ob, get_mesh(ob));
|
||||
|
||||
/*XXX: scrarea_do_windraw(curarea); */
|
||||
|
||||
waitcursor(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user