I made multitude of fixes based on the comments provided online:

Removed the drawSelectedVerts and added drawSelectedVertices, which uses dm->foreachMappedVert.

In calc_weightpaint_vert_color():
Made the weight paint color black and return instead of input=-1

Made the pose bone selection normal when multi-paint is inactive.

Name fix for functions using mv instead of mvert.

Used vector functions provided by the math lib.

Changed some MEM_callocN references to be stacks.

Changed dm_deform_clear to use ob->derivedDeform primarily

Made the variable "float **changes" into "float (*changes)[2]"

Used CTX_data_active_object() in place of CTX_data_pointer_get_type()

Added the invert selection hotkey "Ctrl+I" to weight paint's vertex mask.
This commit is contained in:
Jason Hays
2011-09-18 01:09:18 +00:00
parent 101937e2dd
commit 1b5d16f1bf
10 changed files with 133 additions and 127 deletions

View File

@@ -222,9 +222,6 @@ struct DerivedMesh {
/* Draw all vertices as bgl points (no options) */
void (*drawVerts)(DerivedMesh *dm);
/* Jason Draw all selected vertices as bgl points (no options) */
void (*drawSelectedVerts)(DerivedMesh *dm);
/* Draw edges in the UV mesh (if exists) */
void (*drawUVEdges)(DerivedMesh *dm);

View File

@@ -1726,13 +1726,15 @@ static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, u
}
if (make_black) {
input = -1;
col[3] = 0;
col[2] = 0;
col[1] = 0;
col[0] = 255;
return;
}
else {
CLAMP(input, 0.0f, 1.0f);
}
CLAMP(input, 0.0f, 1.0f);
if(coba)
do_colorband(coba, input, colf);
else

View File

@@ -265,44 +265,6 @@ static void cdDM_update_normals_from_pbvh(DerivedMesh *dm)
BLI_pbvh_update(cddm->pbvh, PBVH_UpdateNormals, face_nors);
}
// Jason
static void cdDM_drawSelectedVerts(DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
MVert *mv = cddm->mvert;
int i;
if( GPU_buffer_legacy(dm) ) {
char prev_sel= 0; /* always invalid */;
glBegin(GL_POINTS);
for(i = 0; i < dm->numVertData; i++, mv++) {
if(!(mv->flag & ME_HIDE)) {
const char sel= mv->flag & 1;
if(prev_sel != sel) {
prev_sel= sel;
// TODO define selected color
if(sel) {
glColor3f(1.0f, 1.0f, 0.0f);
}else {
glColor3f(0.0f, 0.0f, 0.0f);
}
}
glVertex3fv(mv->co);
}
}
glEnd();
}
else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
GPU_vertex_setup(dm);
if( !GPU_buffer_legacy(dm) ) {
if(dm->drawObject->tot_triangle_point) glDrawArrays(GL_POINTS,0, dm->drawObject->tot_triangle_point);
else glDrawArrays(GL_POINTS,0, dm->drawObject->tot_loose_point);
}
GPU_buffer_unbind();
}
}
static void cdDM_drawVerts(DerivedMesh *dm)
{
@@ -1589,8 +1551,6 @@ static CDDerivedMesh *cdDM_create(const char *desc)
dm->getFaceMap = cdDM_getFaceMap;
dm->drawVerts = cdDM_drawVerts;
// Jason
dm->drawSelectedVerts = cdDM_drawSelectedVerts;
dm->drawUVEdges = cdDM_drawUVEdges;
dm->drawEdges = cdDM_drawEdges;

View File

@@ -4297,8 +4297,6 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
{
Object *ob= base->object;
Bone *nearBone;
// Jason
Bone *new_act_bone;
if (!ob || !ob->pose) return 0;
@@ -4310,7 +4308,8 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
/* since we do unified select, we don't shift+select a bone if the armature object was not active yet */
/* Jason was here, I'm doing a select for multibone painting */
if ((base != scene->basact)) {//if (!(extend) || (base != scene->basact)) {
if (scene->toolsettings->multipaint && (base != scene->basact)) {//if (!(extend) || (base != scene->basact)) {
Bone *new_act_bone;
/* Jason was here */
/* only deselect all if they aren't using 'shift' */
if(!extend) {
@@ -4341,6 +4340,10 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
// XXX old cruft! use notifiers instead
//select_actionchannel_by_name(ob->action, nearBone->name, 1);
} else if (!(extend) || (base != scene->basact)) {
ED_pose_deselectall(ob, 0);
nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
arm->act_bone= nearBone;
}
else {
if (nearBone->flag & BONE_SELECTED) {

View File

@@ -1992,7 +1992,7 @@ void paintvert_flush_flags(Object *ob)
}
}
}
/* Jason note: caller needs to run paintvert_flush_flags(ob) after this */
/* Jason note: if the caller passes FALSE to flush_flags, then they will need to run paintvert_flush_flags(ob) themselves */
void paintvert_deselect_all_visible(Object *ob, int action, short flush_flags)
{
Mesh *me;

View File

@@ -705,7 +705,7 @@ static void vgroup_normalize(Object *ob)
int i, def_nr, dvert_tot=0;
// Jason
Mesh *me = ob->data;
MVert *mv = me->mvert;
MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
@@ -719,7 +719,7 @@ static void vgroup_normalize(Object *ob)
for(i = 0; i < dvert_tot; i++) {
// Jason
if(use_vert_sel && !((mv+i)->flag & SELECT)) {
if(use_vert_sel && !((mvert+i)->flag & SELECT)) {
continue;
}
@@ -733,7 +733,7 @@ static void vgroup_normalize(Object *ob)
if(weight_max > 0.0f) {
for(i = 0; i < dvert_tot; i++) {
// Jason
if(use_vert_sel && !((mv+i)->flag & SELECT)) {
if(use_vert_sel && !((mvert+i)->flag & SELECT)) {
continue;
}
@@ -848,19 +848,13 @@ static int* getSurroundingVerts(Mesh *me, int vert, int *count) {
/* get a single point in space by averaging a point cloud (vectors of size 3)
coord is the place the average is stored, points is the point cloud, count is the number of points in the cloud
*/
static void getSingleCoordinate(MVert **points, int count, float *coord) {
int i, k;
for(k = 0; k < 3; k++) {
coord[k] = 0;
}
static void getSingleCoordinate(MVert *points, int count, float coord[3]) {
int i;
zero_v3(coord);
for(i = 0; i < count; i++) {
for(k = 0; k < 3; k++) {
coord[k] += points[i]->co[k];
}
}
for(k = 0; k < 3; k++) {
coord[k] /= count;
add_v3_v3(coord, points[i].co);
}
mul_v3_fl(coord, 1.0f/count);
}
/* Jason */
/* find the closest point on a plane to another point and store it in dst */
@@ -894,12 +888,11 @@ static float distance(float* a, float *b, int length) {
compute the amount of vertical distance relative to the plane and store it in dists,
then get the horizontal and vertical change and store them in changes
*/
static void getVerticalAndHorizontalChange(float *norm, float d, float *coord, float *start, float distToStart, float *end, float **changes, float *dists, int index) {
static void getVerticalAndHorizontalChange(float *norm, float d, float *coord, float *start, float distToStart, float *end, float (*changes)[2], float *dists, int index) {
// A=Q-((Q-P).N)N
// D = (a*x0 + b*y0 +c*z0 +d)
float *projA, *projB;
projA = MEM_callocN(sizeof(float)*3, "projectedA");
projB = MEM_callocN(sizeof(float)*3, "projectedB");
float projA[3] = {0}, projB[3] = {0};
getNearestPointOnPlane(norm, coord, start, projA);
getNearestPointOnPlane(norm, coord, end, projB);
// (vertical and horizontal refer to the plane's y and xz respectively)
@@ -910,16 +903,19 @@ static void getVerticalAndHorizontalChange(float *norm, float d, float *coord, f
//printf("vc %f %f\n", distance(end, projB, 3)-distance(start, projA, 3), changes[index][0]);
// horizontal change
changes[index][1] = distance(projA, projB, 3);
MEM_freeN(projA);
MEM_freeN(projB);
}
// Jason
// I need the derived mesh to be forgotten so the positions are recalculated with weight changes (see dm_deform_recalc)
static void dm_deform_clear(DerivedMesh *dm, Object *ob) {
dm->needsFree = 1;
dm->release(dm);
ob->derivedDeform=NULL;
if(ob->derivedDeform && (ob->derivedDeform)==dm) {
ob->derivedDeform->needsFree = 1;
ob->derivedDeform->release(ob->derivedDeform);
ob->derivedDeform = NULL;
}
else if(dm) {
dm->needsFree = 1;
dm->release(dm);
}
}
// Jason
// recalculate the deformation
@@ -935,17 +931,17 @@ index is the index of the vertex being moved
norm and d are the plane's properties for the equation: ax + by + cz + d = 0
coord is a point on the plane
*/
static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, int index, float *norm, float *coord, float d, float distToBe, float strength, float cp) {
static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, int index, float norm[3], float coord[3], float d, float distToBe, float strength, float cp) {
DerivedMesh *dm;
MDeformWeight *dw;
MVert m;
MDeformVert *dvert = me->dvert+index;
int totweight = dvert->totweight;
float oldw = 0;
float *oldPos = MEM_callocN(sizeof(float)*3, "oldPosition");
float oldPos[3] = {0};
float vc, hc, dist;
int i, k;
float **changes = MEM_mallocN(sizeof(float *)*totweight, "vertHorzChange");
float (*changes)[2] = MEM_mallocN(sizeof(float *)*totweight*2, "vertHorzChange");
float *dists = MEM_mallocN(sizeof(float)*totweight, "distance");
int *upDown = MEM_callocN(sizeof(int)*totweight, "upDownTracker");// track if up or down moved it closer for each bone
int *dwIndices = MEM_callocN(sizeof(int)*totweight, "dwIndexTracker");
@@ -955,9 +951,6 @@ static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, in
char wasUp;
int lastIndex = -1;
float originalDistToBe = distToBe;
for(i = 0; i < totweight; i++) {
changes[i] = MEM_callocN(sizeof(float)*2, "vertHorzChange_"+i);
}
do {
wasChange = FALSE;
dm = dm_deform_recalc(scene, ob);
@@ -1097,13 +1090,9 @@ static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, in
}
}while(wasChange && (distToStart-distToBe)/fabs(distToStart-distToBe) == (dists[bestIndex]-distToBe)/fabs(dists[bestIndex]-distToBe));
MEM_freeN(upDown);
for(i = 0; i < totweight; i++) {
MEM_freeN(changes[i]);
}
MEM_freeN(changes);
MEM_freeN(dists);
MEM_freeN(dwIndices);
MEM_freeN(oldPos);
}
// Jason
/* this is used to try to smooth a surface by only adjusting the nonzero weights of a vertex
@@ -1113,43 +1102,42 @@ static void vgroup_fix(Scene *scene, Object *ob, float distToBe, float strength,
int i;
Mesh *me = ob->data;
MVert *mv = me->mvert;
MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
int *verts = NULL;
for(i = 0; i < me->totvert && mv; i++, mv++) {
for(i = 0; i < me->totvert && mvert; i++, mvert++) {
// Jason
if(use_vert_sel && (mv->flag & SELECT)) {
if(use_vert_sel && (mvert->flag & SELECT)) {
int count=0;
if((verts = getSurroundingVerts(me, i, &count))) {
MVert m;
MVert **p = MEM_callocN(sizeof(MVert*)*(count), "deformedPoints");
MVert *p = MEM_callocN(sizeof(MVert)*(count), "deformedPoints");
int k;
DerivedMesh *dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
for(k = 0; k < count; k++) {
dm->getVert(dm, verts[k], &m);
p[k] = &m;
p[k] = m;
}
if(count >= 3) {
float d /*, dist */ /* UNUSED */, mag;
float *coord = MEM_callocN(sizeof(float)*3, "deformedCoord");
float *norm = MEM_callocN(sizeof(float)*3, "planeNorm");
float coord[3] = {0};
float norm[3] = {0};
getSingleCoordinate(p, count, coord);
dm->getVert(dm, i, &m);
norm[0] = m.co[0]-coord[0];
norm[1] = m.co[1]-coord[1];
norm[2] = m.co[2]-coord[2];
mag = sqrt(norm[0]*norm[0] + norm[1]*norm[1] + norm[2]*norm[2]);
for(k = 0; k < 3; k++) {
norm[k]/=mag;
if(mag) {// zeros fix
mul_v3_fl(norm, 1.0f/mag);
d = -norm[0]*coord[0] -norm[1]*coord[1] -norm[2]*coord[2];
/* dist = (norm[0]*m.co[0] + norm[1]*m.co[1] + norm[2]*m.co[2] + d); */ /* UNUSED */
moveCloserToDistanceFromPlane(scene, ob, me, i, norm, coord, d, distToBe, strength, cp);
}
d = -norm[0]*coord[0] -norm[1]*coord[1] -norm[2]*coord[2];
/* dist = (norm[0]*m.co[0] + norm[1]*m.co[1] + norm[2]*m.co[2] + d); */ /* UNUSED */
moveCloserToDistanceFromPlane(scene, ob, me, i, norm, coord, d, distToBe, strength, cp);
MEM_freeN(coord);
MEM_freeN(norm);
}
MEM_freeN(verts);
@@ -1167,7 +1155,7 @@ static void vgroup_levels(Object *ob, float offset, float gain)
int i, def_nr, dvert_tot=0;
// Jason
Mesh *me = ob->data;
MVert *mv = me->mvert;
MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
@@ -1179,7 +1167,7 @@ static void vgroup_levels(Object *ob, float offset, float gain)
for(i = 0; i < dvert_tot; i++) {
// Jason
if(use_vert_sel && !((mv+i)->flag & SELECT)) {
if(use_vert_sel && !((mvert+i)->flag & SELECT)) {
continue;
}
@@ -1206,7 +1194,7 @@ static void vgroup_normalize_all(Object *ob, int lock_active)
// Jason
Mesh *me = ob->data;
MVert *mv = me->mvert;
MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
@@ -1219,7 +1207,7 @@ static void vgroup_normalize_all(Object *ob, int lock_active)
float lock_iweight= 1.0f;
int j;
// Jason
if(use_vert_sel && !((mv+i)->flag & SELECT)) {
if(use_vert_sel && !((mvert+i)->flag & SELECT)) {
continue;
}
@@ -1263,7 +1251,7 @@ static void vgroup_normalize_all(Object *ob, int lock_active)
for(i = 0; i < dvert_tot; i++) {
int j;
// Jason
if(use_vert_sel && !((mv+i)->flag & SELECT)) {
if(use_vert_sel && !((mvert+i)->flag & SELECT)) {
continue;
}
@@ -1331,7 +1319,7 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove)
int i, def_nr, dvert_tot=0;
// Jason
Mesh *me = ob->data;
MVert *mv = me->mvert;
MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
@@ -1344,7 +1332,7 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove)
for(i = 0; i < dvert_tot; i++) {
// Jason
if(use_vert_sel && !((mv+i)->flag & SELECT)) {
if(use_vert_sel && !((mvert+i)->flag & SELECT)) {
continue;
}
dvert = dvert_array[i];
@@ -1461,7 +1449,7 @@ static void vgroup_clean(Object *ob, float eul, int keep_single)
int i, def_nr, dvert_tot=0;
// Jason
Mesh *me = ob->data;
MVert *mv = me->mvert;
MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
@@ -1473,7 +1461,7 @@ static void vgroup_clean(Object *ob, float eul, int keep_single)
for(i = 0; i < dvert_tot; i++) {
// Jason
if(use_vert_sel && !((mv+i)->flag & SELECT)) {
if(use_vert_sel && !((mvert+i)->flag & SELECT)) {
continue;
}
dvert = dvert_array[i];
@@ -1499,7 +1487,7 @@ static void vgroup_clean_all(Object *ob, float eul, int keep_single)
int i, dvert_tot=0;
// Jason
Mesh *me = ob->data;
MVert *mv = me->mvert;
MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
@@ -1508,7 +1496,7 @@ static void vgroup_clean_all(Object *ob, float eul, int keep_single)
for(i = 0; i < dvert_tot; i++) {
int j;
// Jason
if(use_vert_sel && !((mv+i)->flag & SELECT)) {
if(use_vert_sel && !((mvert+i)->flag & SELECT)) {
continue;
}
@@ -2334,7 +2322,7 @@ void OBJECT_OT_vertex_group_normalize_all(wmOperatorType *ot)
/* Jason */
static int vertex_group_fix_exec(bContext *C, wmOperator *op)
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
float distToBe= RNA_float_get(op->ptr,"dist");
@@ -2382,7 +2370,7 @@ void OBJECT_OT_vertex_group_fix(wmOperatorType *ot)
/* Jason was here */
static int vertex_group_lock_exec(bContext *C, wmOperator *op)
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Object *ob= CTX_data_active_object(C);
int action = RNA_enum_get(op->ptr, "action");

View File

@@ -123,6 +123,7 @@ void PAINT_OT_face_select_hide(struct wmOperatorType *ot);
void PAINT_OT_face_select_reveal(struct wmOperatorType *ot);
/* Jason */
void PAINT_OT_vert_select_all(struct wmOperatorType *ot);
void PAINT_OT_vert_select_inverse(struct wmOperatorType *ot);
int vert_paint_poll(struct bContext *C);
int mask_paint_poll(struct bContext *C);

View File

@@ -375,6 +375,7 @@ void ED_operatortypes_paint(void)
/* Jason, vertex selection */
WM_operatortype_append(PAINT_OT_vert_select_all);
WM_operatortype_append(PAINT_OT_vert_select_inverse);
/* vertex */
WM_operatortype_append(PAINT_OT_vertex_paint_toggle);
@@ -615,6 +616,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
keymap= WM_keymap_find(keyconf, "Weight Paint Vertex Selection", 0, 0);
keymap->poll= vert_paint_poll;
WM_keymap_add_item(keymap, "PAINT_OT_vert_select_all", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "PAINT_OT_vert_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_select_border", BKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT|KM_CTRL, 0)->ptr, "deselect", 1);

View File

@@ -381,7 +381,26 @@ void PAINT_OT_vert_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
/* Jason */
static int vert_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_active_object(C);
paintvert_deselect_all_visible(ob, SEL_INVERT, TRUE);
ED_region_tag_redraw(CTX_wm_region(C));
return OPERATOR_FINISHED;
}
/* Jason */
void PAINT_OT_vert_select_inverse(wmOperatorType *ot)
{
ot->name= "Vertex Select Invert";
ot->description= "Invert selection of vertices";
ot->idname= "PAINT_OT_vert_select_inverse";
ot->exec= vert_select_inverse_exec;
ot->poll= vert_paint_poll;
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
static int face_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_active_object(C);

View File

@@ -77,6 +77,7 @@
#include "BKE_pointcache.h"
#include "BKE_unit.h"
#include "smoke_API.h"
#include "IMB_imbuf.h"
@@ -85,6 +86,7 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "GPU_buffers.h"// Jason
#include "GPU_draw.h"
#include "GPU_extensions.h"
@@ -1752,6 +1754,32 @@ void mesh_obmode_foreachScreenVert(ViewContext *vc, void (*func)(void *userData,
dm->release(dm);
}
/* Jason draw callback */
static void drawSelectedVertices__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
{
MVert *mv = userData;
mv+=index;
//printf("%d\n", index);
if(!(mv->flag & ME_HIDE)) {
const char sel= mv->flag & 1;
// TODO define selected color
if(sel) {
glColor3f(1.0f, 1.0f, 0.0f);
}else {
glColor3f(0.0f, 0.0f, 0.0f);
}
glVertex3fv(co);
}
}
/* Jason */
static void drawSelectedVertices(DerivedMesh *dm, Mesh *me) {
glBegin(GL_POINTS);
dm->foreachMappedVert(dm, drawSelectedVertices__mapFunc, me->mvert);
glEnd();
}
static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0co, float *v1co)
{
struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; ViewContext vc; int clipVerts; } *data = userData;
@@ -2937,10 +2965,13 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
}
// Jason
if(paint_vertsel_test(ob) && dm->drawSelectedVerts) {
if(paint_vertsel_test(ob)) {
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
dm->drawSelectedVerts(dm);
drawSelectedVertices(dm, ob->data);
glPointSize(1.0f);
}
dm->release(dm);
@@ -6528,23 +6559,26 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* Jason */
static void bbs_obmode_mesh_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
// TODO: support hidden vertices
int offset = (intptr_t) userData;
//EditVert *eve = EM_get_vert_for_index(index);
struct {void* offset; MVert *mvert;} *data = userData;
MVert *mv = data->mvert+index;
int offset = (intptr_t) data->offset;
//if (eve->h==0) {
WM_set_framebuffer_index_color(offset+index);
bglVertex3fv(co);
//}
if (!(mv->flag & ME_HIDE)) {
WM_set_framebuffer_index_color(offset+index);
bglVertex3fv(co);
}
}
/* Jason */
static void bbs_obmode_mesh_verts(Object *UNUSED(ob), DerivedMesh *dm, int offset)
static void bbs_obmode_mesh_verts(Object *ob, DerivedMesh *dm, int offset)
{
/* Mesh *me = (Mesh*)ob->data; */ /* UNUSED */
struct {void* offset; struct MVert *mvert;} data;
Mesh *me = ob->data;
MVert *mvert = me->mvert;
data.mvert = mvert;
data.offset = (void*)(intptr_t) offset;
glPointSize( UI_GetThemeValuef(TH_VERTEX_SIZE) );
bglBegin(GL_POINTS);
dm->foreachMappedVert(dm, bbs_obmode_mesh_verts__mapFunc, (void*)(intptr_t) offset);
dm->foreachMappedVert(dm, bbs_obmode_mesh_verts__mapFunc, &data);
bglEnd();
glPointSize(1.0);
}