Merged changes in the trunk up to revision 45383.
This commit is contained in:
@@ -164,7 +164,7 @@ kmi = km.keymap_items.new('view3d.zoom_border', 'B', 'PRESS', shift=True)
|
||||
kmi = km.keymap_items.new('view3d.render_border', 'B', 'PRESS', shift=True)
|
||||
kmi = km.keymap_items.new('view3d.camera_to_view', 'NUMPAD_0', 'PRESS', ctrl=True, alt=True)
|
||||
kmi = km.keymap_items.new('view3d.object_as_camera', 'NUMPAD_0', 'PRESS', ctrl=True)
|
||||
kmi = km.keymap_items.new('wm.call_menu', 'S', 'PRESS', shift=True)
|
||||
kmi = km.keymap_items.new('wm.call_menu', 'S', 'PRESS', shift=True, ctrl=True)
|
||||
kmi.properties.name = 'VIEW3D_MT_snap'
|
||||
kmi = km.keymap_items.new('wm.context_set_enum', 'COMMA', 'PRESS')
|
||||
kmi.properties.data_path = 'space_data.pivot_point'
|
||||
|
||||
@@ -96,6 +96,10 @@ class EditExternally(Operator):
|
||||
self.report({'ERROR'}, "Context incorrect, image not found")
|
||||
return {'CANCELLED'}
|
||||
|
||||
if image.packed_file:
|
||||
self.report({'ERROR'}, "Image is packed, unpack before editing")
|
||||
return {'CANCELLED'}
|
||||
|
||||
filepath = bpy.path.abspath(image.filepath, library=image.library)
|
||||
|
||||
self.filepath = os.path.normpath(filepath)
|
||||
|
||||
@@ -55,7 +55,7 @@ class MeshMirrorUV(Operator):
|
||||
mirror_gt = {}
|
||||
mirror_lt = {}
|
||||
|
||||
vcos = [v.co.to_tuple(5) for v in mesh.vertices]
|
||||
vcos = (v.co.to_tuple(5) for v in mesh.vertices)
|
||||
|
||||
for i, co in enumerate(vcos):
|
||||
if co[0] > 0.0:
|
||||
@@ -76,51 +76,60 @@ class MeshMirrorUV(Operator):
|
||||
if j is not None:
|
||||
vmap[i] = j
|
||||
|
||||
active_uv_layer = mesh.uv_textures.active.data
|
||||
fuvs = [(uv.uv1, uv.uv2, uv.uv3, uv.uv4) for uv in active_uv_layer]
|
||||
fuvs_cpy = [(uv[0].copy(), uv[1].copy(), uv[2].copy(), uv[3].copy())
|
||||
for uv in fuvs]
|
||||
polys = mesh.polygons
|
||||
loops = mesh.loops
|
||||
verts = mesh.vertices
|
||||
uv_loops = mesh.uv_loop_layers.active.data
|
||||
nbr_polys = len(polys)
|
||||
|
||||
# as a list
|
||||
# BMESH_TODO - use polygons
|
||||
faces = mesh.faces[:]
|
||||
mirror_pm = {}
|
||||
pmap = {}
|
||||
puvs = [None] * nbr_polys
|
||||
puvs_cpy = [None] * nbr_polys
|
||||
puvsel = [None] * nbr_polys
|
||||
pcents = [None] * nbr_polys
|
||||
vidxs = [None] * nbr_polys
|
||||
for i, p in enumerate(polys):
|
||||
lstart = lend = p.loop_start
|
||||
lend += p.loop_total
|
||||
puvs[i] = tuple(uv.uv for uv in uv_loops[lstart:lend])
|
||||
puvs_cpy[i] = tuple(uv.copy() for uv in puvs[i])
|
||||
puvsel[i] = (False not in
|
||||
(uv.select for uv in uv_loops[lstart:lend]))
|
||||
# Vert idx of the poly.
|
||||
vidxs[i] = tuple(sorted(l.vertex_index
|
||||
for l in loops[lstart:lend]))
|
||||
# As we have no poly.center yet...
|
||||
pcents[i] = tuple(map(lambda x : x / p.loop_total,
|
||||
map(sum, zip(*(verts[idx].co
|
||||
for idx in vidxs[i])))))
|
||||
# Preparing next step finding matching polys.
|
||||
mirror_pm[vidxs[i]] = i
|
||||
|
||||
fuvsel = [(False not in uv.select_uv) for uv in active_uv_layer]
|
||||
fcents = [f.center for f in faces]
|
||||
|
||||
# find mirror faces
|
||||
mirror_fm = {}
|
||||
for i, f in enumerate(faces):
|
||||
verts = list(f.vertices)
|
||||
verts.sort()
|
||||
verts = tuple(verts)
|
||||
mirror_fm[verts] = i
|
||||
|
||||
fmap = {}
|
||||
for i, f in enumerate(faces):
|
||||
verts = [vmap.get(j) for j in f.vertices]
|
||||
if None not in verts:
|
||||
verts.sort()
|
||||
j = mirror_fm.get(tuple(verts))
|
||||
for i in range(nbr_polys):
|
||||
# Find matching mirror poly.
|
||||
tvidxs = [vmap.get(j) for j in vidxs[i]]
|
||||
if None not in tvidxs:
|
||||
tvidxs.sort()
|
||||
j = mirror_pm.get(tuple(tvidxs))
|
||||
if j is not None:
|
||||
fmap[i] = j
|
||||
pmap[i] = j
|
||||
|
||||
for i, j in fmap.items():
|
||||
|
||||
if not fuvsel[i] or not fuvsel[j]:
|
||||
for i, j in pmap.items():
|
||||
if not puvsel[i] or not puvsel[j]:
|
||||
continue
|
||||
elif DIR == 0 and fcents[i][0] < 0.0:
|
||||
elif DIR == 0 and pcents[i][0] < 0.0:
|
||||
continue
|
||||
elif DIR == 1 and fcents[i][0] > 0.0:
|
||||
elif DIR == 1 and pcents[i][0] > 0.0:
|
||||
continue
|
||||
|
||||
# copy UVs
|
||||
uv1 = fuvs[i]
|
||||
uv2 = fuvs_cpy[j]
|
||||
uv1 = puvs[i]
|
||||
uv2 = puvs_cpy[j]
|
||||
|
||||
# get the correct rotation
|
||||
v1 = faces[j].vertices[:]
|
||||
v2 = [vmap[k] for k in faces[i].vertices[:]]
|
||||
v1 = vidxs[j]
|
||||
v2 = tuple(vmap[k] for k in vidxs[i])
|
||||
|
||||
if len(v1) == len(v2):
|
||||
for k in range(len(v1)):
|
||||
|
||||
@@ -816,7 +816,7 @@ class ConstraintButtonsPanel():
|
||||
layout.operator("clip.constraint_to_fcurve")
|
||||
|
||||
def SCRIPT(self, context, layout, con):
|
||||
layout.label("Blender 2.5 has no py-constraints")
|
||||
layout.label("Blender 2.6 doesn't support python constraints yet.")
|
||||
|
||||
|
||||
class OBJECT_PT_constraints(ConstraintButtonsPanel, Panel):
|
||||
|
||||
@@ -1188,6 +1188,7 @@ class VIEW3D_MT_paint_weight(Menu):
|
||||
layout.operator("object.vertex_group_invert", text="Invert")
|
||||
layout.operator("object.vertex_group_clean", text="Clean")
|
||||
layout.operator("object.vertex_group_levels", text="Levels")
|
||||
layout.operator("object.vertex_group_blend", text="Blend")
|
||||
layout.operator("object.vertex_group_fix", text="Fix Deforms")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -977,6 +977,7 @@ class VIEW3D_PT_tools_weightpaint(View3DPanel, Panel):
|
||||
col.operator("object.vertex_group_invert", text="Invert")
|
||||
col.operator("object.vertex_group_clean", text="Clean")
|
||||
col.operator("object.vertex_group_levels", text="Levels")
|
||||
col.operator("object.vertex_group_blend", text="Blend")
|
||||
col.operator("object.vertex_group_fix", text="Fix Deforms")
|
||||
|
||||
|
||||
|
||||
@@ -117,6 +117,7 @@ bContext *CTX_copy(const bContext *C);
|
||||
/* Stored Context */
|
||||
|
||||
bContextStore *CTX_store_add(ListBase *contexts, const char *name, PointerRNA *ptr);
|
||||
bContextStore *CTX_store_add_all(ListBase *contexts, bContextStore *context);
|
||||
void CTX_store_set(bContext *C, bContextStore *store);
|
||||
bContextStore *CTX_store_copy(bContextStore *store);
|
||||
void CTX_store_free(bContextStore *store);
|
||||
|
||||
@@ -382,6 +382,13 @@ void DM_ensure_tessface(DerivedMesh *dm)
|
||||
__func__, numPolys, dm->type);
|
||||
}
|
||||
}
|
||||
|
||||
else if (dm->dirty && DM_DIRTY_TESS_CDLAYERS) {
|
||||
BLI_assert(CustomData_has_layer(&dm->faceData, CD_POLYINDEX));
|
||||
DM_update_tessface_data(dm);
|
||||
}
|
||||
|
||||
dm->dirty &= ~DM_DIRTY_TESS_CDLAYERS;
|
||||
}
|
||||
|
||||
/* Update tessface CD data from loop/poly ones. Needed when not retessellating after modstack evaluation. */
|
||||
@@ -1629,7 +1636,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
||||
|
||||
deformedVerts = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* create an orco derivedmesh in parallel */
|
||||
if (nextmask & CD_MASK_ORCO) {
|
||||
@@ -3061,6 +3068,8 @@ void DM_init_origspace(DerivedMesh *dm)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -583,10 +583,11 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm,
|
||||
GPU_normal_setup( dm );
|
||||
if ( !GPU_buffer_legacy(dm) ) {
|
||||
glShadeModel(GL_SMOOTH);
|
||||
for ( a = 0; a < dm->drawObject->totmaterial; a++ ) {
|
||||
if ( setMaterial(dm->drawObject->materials[a].mat_nr+1, NULL) )
|
||||
for (a = 0; a < dm->drawObject->totmaterial; a++) {
|
||||
if (setMaterial(dm->drawObject->materials[a].mat_nr + 1, NULL)) {
|
||||
glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[a].start,
|
||||
dm->drawObject->materials[a].totpoint);
|
||||
dm->drawObject->materials[a].totpoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
GPU_buffer_unbind( );
|
||||
@@ -1466,13 +1467,13 @@ static void cdDM_foreachMappedFaceCenter(
|
||||
{
|
||||
CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
|
||||
MVert *mv = cddm->mvert;
|
||||
MPoly *mf = cddm->mpoly;
|
||||
MPoly *mp = cddm->mpoly;
|
||||
MLoop *ml = cddm->mloop;
|
||||
int i, j, orig, *index;
|
||||
|
||||
index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
|
||||
mf = cddm->mpoly;
|
||||
for (i = 0; i < dm->numPolyData; i++, mf++) {
|
||||
mp = cddm->mpoly;
|
||||
for (i = 0; i < dm->numPolyData; i++, mp++) {
|
||||
float cent[3];
|
||||
float no[3];
|
||||
|
||||
@@ -1483,20 +1484,26 @@ static void cdDM_foreachMappedFaceCenter(
|
||||
else
|
||||
orig = i;
|
||||
|
||||
ml = &cddm->mloop[mf->loopstart];
|
||||
ml = &cddm->mloop[mp->loopstart];
|
||||
cent[0] = cent[1] = cent[2] = 0.0f;
|
||||
for (j=0; j<mf->totloop; j++, ml++) {
|
||||
for (j=0; j<mp->totloop; j++, ml++) {
|
||||
add_v3_v3v3(cent, cent, mv[ml->v].co);
|
||||
}
|
||||
mul_v3_fl(cent, 1.0f / (float)j);
|
||||
|
||||
ml = &cddm->mloop[mf->loopstart];
|
||||
ml = &cddm->mloop[mp->loopstart];
|
||||
if (j > 3) {
|
||||
normal_quad_v3(no, mv[ml->v].co, mv[(ml+1)->v].co,
|
||||
mv[(ml+2)->v].co, mv[(ml+3)->v].co);
|
||||
normal_quad_v3(no,
|
||||
mv[(ml + 0)->v].co,
|
||||
mv[(ml + 1)->v].co,
|
||||
mv[(ml + 2)->v].co,
|
||||
mv[(ml + 3)->v].co);
|
||||
}
|
||||
else {
|
||||
normal_tri_v3(no, mv[ml->v].co, mv[(ml+1)->v].co, mv[(ml+2)->v].co);
|
||||
normal_tri_v3(no,
|
||||
mv[(ml + 0)->v].co,
|
||||
mv[(ml + 1)->v].co,
|
||||
mv[(ml + 2)->v].co);
|
||||
}
|
||||
|
||||
func(userData, orig, cent, no);
|
||||
|
||||
@@ -141,6 +141,35 @@ bContextStore *CTX_store_add(ListBase *contexts, const char *name, PointerRNA *p
|
||||
return ctx;
|
||||
}
|
||||
|
||||
bContextStore *CTX_store_add_all(ListBase *contexts, bContextStore *context)
|
||||
{
|
||||
bContextStoreEntry *entry, *tentry;
|
||||
bContextStore *ctx, *lastctx;
|
||||
|
||||
/* ensure we have a context to put the entries in, if it was already used
|
||||
* we have to copy the context to ensure */
|
||||
ctx= contexts->last;
|
||||
|
||||
if (!ctx || ctx->used) {
|
||||
if (ctx) {
|
||||
lastctx= ctx;
|
||||
ctx= MEM_dupallocN(lastctx);
|
||||
BLI_duplicatelist(&ctx->entries, &lastctx->entries);
|
||||
}
|
||||
else
|
||||
ctx= MEM_callocN(sizeof(bContextStore), "bContextStore");
|
||||
|
||||
BLI_addtail(contexts, ctx);
|
||||
}
|
||||
|
||||
for (tentry= context->entries.first; tentry; tentry= tentry->next) {
|
||||
entry= MEM_dupallocN(tentry);
|
||||
BLI_addtail(&ctx->entries, entry);
|
||||
}
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
void CTX_store_set(bContext *C, bContextStore *store)
|
||||
{
|
||||
C->wm.store= store;
|
||||
|
||||
@@ -1401,7 +1401,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
|
||||
curve_to_filledpoly(cu, nubase, dispbase);
|
||||
}
|
||||
|
||||
if (cu->flag & CU_PATH) calc_curvepath(ob);
|
||||
if ((cu->flag & CU_PATH) && !forOrco) calc_curvepath(ob);
|
||||
|
||||
/* make copy of 'undeformed" displist for texture space calculation
|
||||
* actually, it's not totally undeformed -- pre-tessellation modifiers are
|
||||
|
||||
@@ -1633,7 +1633,7 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
|
||||
#pragma omp parallel for schedule(static)
|
||||
for (i=0; i<totpoly; i++) {
|
||||
int j=0;
|
||||
Material *material = give_current_material(ob, mp[i].mat_nr+1);
|
||||
Material *material = give_current_material(ob, mp[i].mat_nr + 1);
|
||||
|
||||
for (; j<mp[i].totloop; j++) {
|
||||
int l_index = mp[i].loopstart + j;
|
||||
|
||||
@@ -1616,13 +1616,13 @@ static void psys_origspace_to_w(OrigSpaceFace *osface, int quad, const float w[4
|
||||
int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, const float fw[4], struct LinkNode *node)
|
||||
{
|
||||
Mesh *me= (Mesh*)ob->data;
|
||||
MPoly *mface;
|
||||
MPoly *mpoly;
|
||||
OrigSpaceFace *osface;
|
||||
int *origindex;
|
||||
int quad, findex, totface;
|
||||
float uv[2], (*faceuv)[2];
|
||||
|
||||
mface = dm->getPolyArray(dm);
|
||||
mpoly = dm->getPolyArray(dm);
|
||||
origindex = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
osface = dm->getTessFaceDataArray(dm, CD_ORIGSPACE);
|
||||
|
||||
@@ -1648,7 +1648,7 @@ int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, const f
|
||||
for (;node; node=node->next) {
|
||||
findex= GET_INT_FROM_POINTER(node->link);
|
||||
faceuv= osface[findex].uv;
|
||||
quad = (mface[findex].totloop == 4);
|
||||
quad = (mpoly[findex].totloop == 4);
|
||||
|
||||
/* check that this intersects - Its possible this misses :/ -
|
||||
* could also check its not between */
|
||||
@@ -1664,7 +1664,7 @@ int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, const f
|
||||
for (findex=0; findex<totface; findex++) {
|
||||
if (origindex[findex] == index) {
|
||||
faceuv= osface[findex].uv;
|
||||
quad = (mface[findex].totloop == 4);
|
||||
quad = (mpoly[findex].totloop == 4);
|
||||
|
||||
/* check that this intersects - Its possible this misses :/ -
|
||||
* could also check its not between */
|
||||
|
||||
@@ -1270,7 +1270,7 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop)
|
||||
}
|
||||
}
|
||||
|
||||
static void ccgDM_copyFinalPolyArray(DerivedMesh *dm, MPoly *mface)
|
||||
static void ccgDM_copyFinalPolyArray(DerivedMesh *dm, MPoly *mpoly)
|
||||
{
|
||||
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
|
||||
CCGSubSurf *ss = ccgdm->ss;
|
||||
@@ -1291,12 +1291,12 @@ static void ccgDM_copyFinalPolyArray(DerivedMesh *dm, MPoly *mface)
|
||||
for (S = 0; S < numVerts; S++) {
|
||||
for (y = 0; y < gridSize - 1; y++) {
|
||||
for (x = 0; x < gridSize - 1; x++) {
|
||||
MPoly *mf = &mface[i];
|
||||
MPoly *mp = &mpoly[i];
|
||||
|
||||
mf->mat_nr = mat_nr;
|
||||
mf->flag = flag;
|
||||
mf->loopstart = k;
|
||||
mf->totloop = 4;
|
||||
mp->mat_nr = mat_nr;
|
||||
mp->flag = flag;
|
||||
mp->loopstart = k;
|
||||
mp->totloop = 4;
|
||||
|
||||
k += 4;
|
||||
i++;
|
||||
|
||||
@@ -123,6 +123,8 @@ void orthogonalize_m4(float R[4][4], int axis);
|
||||
|
||||
int is_orthogonal_m3(float mat[3][3]);
|
||||
int is_orthogonal_m4(float mat[4][4]);
|
||||
int is_orthonormal_m3(float mat[3][3]);
|
||||
int is_orthonormal_m4(float mat[4][4]);
|
||||
|
||||
void adjoint_m3_m3(float R[3][3], float A[3][3]);
|
||||
void adjoint_m4_m4(float R[4][4], float A[4][4]);
|
||||
|
||||
@@ -816,9 +816,6 @@ int is_orthogonal_m3(float m[][3])
|
||||
if (fabsf(dot_v3v3(m[i], m[j])) > 1.5f * FLT_EPSILON)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fabsf(dot_v3v3(m[i], m[i]) - 1) > 1.5f * FLT_EPSILON)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -834,13 +831,41 @@ int is_orthogonal_m4(float m[][4])
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fabsf(dot_vn_vn(m[i], m[i], 4) - 1) > 1.5f * FLT_EPSILON)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int is_orthonormal_m3(float m[][3])
|
||||
{
|
||||
if (is_orthogonal_m3(m)) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
if (fabsf(dot_v3v3(m[i], m[i]) - 1) > 1.5f * FLT_EPSILON)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_orthonormal_m4(float m[][4])
|
||||
{
|
||||
if (is_orthogonal_m4(m)) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
if (fabsf(dot_vn_vn(m[i], m[i], 4) - 1) > 1.5f * FLT_EPSILON)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void normalize_m3(float mat[][3])
|
||||
{
|
||||
normalize_v3(mat[0]);
|
||||
|
||||
@@ -708,7 +708,10 @@ void eulO_to_axis_angle(float axis[3], float *angle, const float eul[3], const s
|
||||
quat_to_axis_angle(axis, angle, q);
|
||||
}
|
||||
|
||||
/* axis angle to 3x3 matrix - safer version (normalization of axis performed) */
|
||||
/* axis angle to 3x3 matrix - safer version (normalization of axis performed)
|
||||
*
|
||||
* note: we may want a normalized and non normalized version of this function.
|
||||
*/
|
||||
void axis_angle_to_mat3(float mat[3][3], const float axis[3], const float angle)
|
||||
{
|
||||
float nor[3], nsi[3], co, si, ico;
|
||||
@@ -818,7 +821,7 @@ void single_axis_angle_to_mat3(float mat[3][3], const char axis, const float ang
|
||||
/****************************** Vector/Rotation ******************************/
|
||||
/* TODO: the following calls should probably be depreceated sometime */
|
||||
|
||||
/* axis angle to 3x3 matrix */
|
||||
/* ODO, replace use of this function with axis_angle_to_mat3() */
|
||||
void vec_rot_to_mat3(float mat[][3], const float vec[3], const float phi)
|
||||
{
|
||||
/* rotation of phi radials around vec */
|
||||
|
||||
@@ -14559,6 +14559,8 @@ static void expand_scene(FileData *fd, Main *mainvar, Scene *sce)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
expand_doit(fd, mainvar, sce->clip);
|
||||
}
|
||||
|
||||
static void expand_camera(FileData *fd, Main *mainvar, Camera *ca)
|
||||
|
||||
@@ -532,18 +532,19 @@ static void bmo_remove_tagged_context_verts(BMesh *bm, const short oflag)
|
||||
BMEdge *e;
|
||||
BMFace *f;
|
||||
|
||||
BMIter verts;
|
||||
BMIter edges;
|
||||
BMIter faces;
|
||||
BMIter iter;
|
||||
BMIter itersub;
|
||||
|
||||
for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BM_iter_step(&verts)) {
|
||||
BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||
if (BMO_elem_flag_test(bm, v, oflag)) {
|
||||
/* Visit edge */
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_VERT, v); e; e = BM_iter_step(&edges))
|
||||
BM_ITER(e, &itersub, bm, BM_EDGES_OF_VERT, v) {
|
||||
BMO_elem_flag_enable(bm, e, oflag);
|
||||
}
|
||||
/* Visit face */
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_VERT, v); f; f = BM_iter_step(&faces))
|
||||
BM_ITER(f, &itersub, bm, BM_FACES_OF_VERT, v) {
|
||||
BMO_elem_flag_enable(bm, f, oflag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -557,12 +558,12 @@ static void bmo_remove_tagged_context_edges(BMesh *bm, const short oflag)
|
||||
BMEdge *e;
|
||||
BMFace *f;
|
||||
|
||||
BMIter edges;
|
||||
BMIter faces;
|
||||
BMIter iter;
|
||||
BMIter itersub;
|
||||
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
|
||||
BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (BMO_elem_flag_test(bm, e, oflag)) {
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_EDGE, e); f; f = BM_iter_step(&faces)) {
|
||||
BM_ITER(f, &itersub, bm, BM_FACES_OF_EDGE, e) {
|
||||
BMO_elem_flag_enable(bm, f, oflag);
|
||||
}
|
||||
}
|
||||
@@ -585,9 +586,9 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
|
||||
BMEdge *e;
|
||||
BMFace *f;
|
||||
|
||||
BMIter verts;
|
||||
BMIter edges;
|
||||
BMIter faces;
|
||||
BMIter viter;
|
||||
BMIter eiter;
|
||||
BMIter fiter;
|
||||
|
||||
switch (type) {
|
||||
case DEL_VERTS:
|
||||
@@ -599,7 +600,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
|
||||
case DEL_EDGES:
|
||||
{
|
||||
/* flush down to vert */
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
|
||||
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (BMO_elem_flag_test(bm, e, oflag)) {
|
||||
BMO_elem_flag_enable(bm, e->v1, oflag);
|
||||
BMO_elem_flag_enable(bm, e->v2, oflag);
|
||||
@@ -607,7 +608,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
|
||||
}
|
||||
bmo_remove_tagged_context_edges(bm, oflag);
|
||||
/* remove loose vertice */
|
||||
for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BM_iter_step(&verts)) {
|
||||
BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||
if (BMO_elem_flag_test(bm, v, oflag) && (!(v->e)))
|
||||
BMO_elem_flag_enable(bm, v, DEL_WIREVERT);
|
||||
}
|
||||
@@ -638,27 +639,27 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
|
||||
case DEL_FACES:
|
||||
{
|
||||
/* go through and mark all edges and all verts of all faces for delet */
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
|
||||
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
if (BMO_elem_flag_test(bm, f, oflag)) {
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&edges))
|
||||
for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter))
|
||||
BMO_elem_flag_enable(bm, e, oflag);
|
||||
for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&verts))
|
||||
for (v = BM_iter_new(&viter, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&viter))
|
||||
BMO_elem_flag_enable(bm, v, oflag);
|
||||
}
|
||||
}
|
||||
/* now go through and mark all remaining faces all edges for keeping */
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
|
||||
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
if (!BMO_elem_flag_test(bm, f, oflag)) {
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&edges)) {
|
||||
for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter)) {
|
||||
BMO_elem_flag_disable(bm, e, oflag);
|
||||
}
|
||||
for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&verts)) {
|
||||
for (v = BM_iter_new(&viter, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&viter)) {
|
||||
BMO_elem_flag_disable(bm, v, oflag);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* also mark all the vertices of remaining edges for keeping */
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
|
||||
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (!BMO_elem_flag_test(bm, e, oflag)) {
|
||||
BMO_elem_flag_disable(bm, e->v1, oflag);
|
||||
BMO_elem_flag_disable(bm, e->v2, oflag);
|
||||
@@ -676,12 +677,15 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
|
||||
case DEL_ALL:
|
||||
{
|
||||
/* does this option even belong in here? */
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces))
|
||||
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
BMO_elem_flag_enable(bm, f, oflag);
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges))
|
||||
}
|
||||
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
BMO_elem_flag_enable(bm, e, oflag);
|
||||
for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BM_iter_step(&verts))
|
||||
}
|
||||
BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||
BMO_elem_flag_enable(bm, v, oflag);
|
||||
}
|
||||
|
||||
BMO_remove_tagged_faces(bm, oflag);
|
||||
BMO_remove_tagged_edges(bm, oflag);
|
||||
|
||||
@@ -30,18 +30,24 @@
|
||||
#define __BMESH_INLINE_H__
|
||||
|
||||
/* stuff for dealing with header flags */
|
||||
#define BM_elem_flag_test( ele, hflag) _bm_elem_flag_test (&(ele)->head, hflag)
|
||||
#define BM_elem_flag_enable( ele, hflag) _bm_elem_flag_enable (&(ele)->head, hflag)
|
||||
#define BM_elem_flag_disable(ele, hflag) _bm_elem_flag_disable (&(ele)->head, hflag)
|
||||
#define BM_elem_flag_set( ele, hflag, val) _bm_elem_flag_set (&(ele)->head, hflag, val)
|
||||
#define BM_elem_flag_toggle( ele, hflag) _bm_elem_flag_toggle (&(ele)->head, hflag)
|
||||
#define BM_elem_flag_merge( ele_a, ele_b) _bm_elem_flag_merge (&(ele_a)->head, &(ele_b)->head)
|
||||
#define BM_elem_flag_test( ele, hflag) _bm_elem_flag_test (&(ele)->head, hflag)
|
||||
#define BM_elem_flag_test_bool(ele, hflag) _bm_elem_flag_test_bool(&(ele)->head, hflag)
|
||||
#define BM_elem_flag_enable( ele, hflag) _bm_elem_flag_enable (&(ele)->head, hflag)
|
||||
#define BM_elem_flag_disable( ele, hflag) _bm_elem_flag_disable (&(ele)->head, hflag)
|
||||
#define BM_elem_flag_set( ele, hflag, val) _bm_elem_flag_set (&(ele)->head, hflag, val)
|
||||
#define BM_elem_flag_toggle( ele, hflag) _bm_elem_flag_toggle (&(ele)->head, hflag)
|
||||
#define BM_elem_flag_merge( ele_a, ele_b) _bm_elem_flag_merge (&(ele_a)->head, &(ele_b)->head)
|
||||
|
||||
BLI_INLINE char _bm_elem_flag_test(const BMHeader *head, const char hflag)
|
||||
{
|
||||
return head->hflag & hflag;
|
||||
}
|
||||
|
||||
BLI_INLINE short _bm_elem_flag_test_bool(const BMHeader *head, const char hflag)
|
||||
{
|
||||
return (head->hflag & hflag) != 0;
|
||||
}
|
||||
|
||||
BLI_INLINE void _bm_elem_flag_enable(BMHeader *head, const char hflag)
|
||||
{
|
||||
head->hflag |= hflag;
|
||||
|
||||
@@ -78,13 +78,13 @@ void BM_mesh_select_mode_flush(BMesh *bm)
|
||||
BMLoop *l_first;
|
||||
BMFace *f;
|
||||
|
||||
BMIter edges;
|
||||
BMIter faces;
|
||||
BMIter eiter;
|
||||
BMIter fiter;
|
||||
|
||||
int ok;
|
||||
|
||||
if (bm->selectmode & SCE_SELECT_VERTEX) {
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
|
||||
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
|
||||
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
|
||||
!BM_elem_flag_test(e, BM_ELEM_HIDDEN))
|
||||
@@ -95,7 +95,7 @@ void BM_mesh_select_mode_flush(BMesh *bm)
|
||||
BM_elem_flag_disable(e, BM_ELEM_SELECT);
|
||||
}
|
||||
}
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
|
||||
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
ok = TRUE;
|
||||
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
|
||||
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
||||
@@ -114,7 +114,7 @@ void BM_mesh_select_mode_flush(BMesh *bm)
|
||||
}
|
||||
}
|
||||
else if (bm->selectmode & SCE_SELECT_EDGE) {
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
|
||||
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
ok = TRUE;
|
||||
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
|
||||
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
||||
@@ -149,12 +149,12 @@ void BM_mesh_deselect_flush(BMesh *bm)
|
||||
BMLoop *l_first;
|
||||
BMFace *f;
|
||||
|
||||
BMIter edges;
|
||||
BMIter faces;
|
||||
BMIter eiter;
|
||||
BMIter fiter;
|
||||
|
||||
int ok;
|
||||
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
|
||||
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (!(BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
|
||||
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
|
||||
!BM_elem_flag_test(e, BM_ELEM_HIDDEN)))
|
||||
@@ -163,7 +163,7 @@ void BM_mesh_deselect_flush(BMesh *bm)
|
||||
}
|
||||
}
|
||||
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
|
||||
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
ok = TRUE;
|
||||
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
|
||||
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
||||
@@ -200,12 +200,12 @@ void BM_mesh_select_flush(BMesh *bm)
|
||||
BMLoop *l_first;
|
||||
BMFace *f;
|
||||
|
||||
BMIter edges;
|
||||
BMIter faces;
|
||||
BMIter eiter;
|
||||
BMIter fiter;
|
||||
|
||||
int ok;
|
||||
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
|
||||
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
|
||||
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
|
||||
!BM_elem_flag_test(e, BM_ELEM_HIDDEN))
|
||||
@@ -214,7 +214,7 @@ void BM_mesh_select_flush(BMesh *bm)
|
||||
}
|
||||
}
|
||||
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
|
||||
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
ok = TRUE;
|
||||
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
|
||||
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
||||
@@ -397,39 +397,48 @@ void BM_face_select_set(BMesh *bm, BMFace *f, int select)
|
||||
*/
|
||||
void BM_select_mode_set(BMesh *bm, int selectmode)
|
||||
{
|
||||
BMVert *v;
|
||||
BMEdge *e;
|
||||
BMFace *f;
|
||||
|
||||
BMIter verts;
|
||||
BMIter edges;
|
||||
BMIter faces;
|
||||
BMIter iter;
|
||||
BMElem *ele;
|
||||
|
||||
bm->selectmode = selectmode;
|
||||
|
||||
if (bm->selectmode & SCE_SELECT_VERTEX) {
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges))
|
||||
BM_elem_flag_disable(e, 0);
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces))
|
||||
BM_elem_flag_disable(f, 0);
|
||||
/* disabled because selection flushing handles these */
|
||||
#if 0
|
||||
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
|
||||
}
|
||||
BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
|
||||
}
|
||||
#endif
|
||||
BM_mesh_select_mode_flush(bm);
|
||||
}
|
||||
else if (bm->selectmode & SCE_SELECT_EDGE) {
|
||||
for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BM_iter_step(&verts))
|
||||
BM_elem_flag_disable(v, 0);
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
|
||||
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
|
||||
BM_edge_select_set(bm, e, TRUE);
|
||||
/* disabled because selection flushing handles these */
|
||||
#if 0
|
||||
BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
|
||||
}
|
||||
#endif
|
||||
|
||||
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
|
||||
BM_edge_select_set(bm, (BMEdge *)ele, TRUE);
|
||||
}
|
||||
}
|
||||
BM_mesh_select_mode_flush(bm);
|
||||
}
|
||||
else if (bm->selectmode & SCE_SELECT_FACE) {
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges))
|
||||
BM_elem_flag_disable(e, 0);
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
|
||||
if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
|
||||
BM_face_select_set(bm, f, TRUE);
|
||||
/* disabled because selection flushing handles these */
|
||||
#if 0
|
||||
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
|
||||
}
|
||||
#endif
|
||||
BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
|
||||
BM_face_select_set(bm, (BMFace *)ele, TRUE);
|
||||
}
|
||||
}
|
||||
BM_mesh_select_mode_flush(bm);
|
||||
@@ -440,29 +449,30 @@ void BM_select_mode_set(BMesh *bm, int selectmode)
|
||||
* counts number of elements with flag enabled/disabled
|
||||
*/
|
||||
static int bm_mesh_flag_count(BMesh *bm, const char htype, const char hflag,
|
||||
int respecthide, int test_for_enabled)
|
||||
const short respecthide, const short test_for_enabled)
|
||||
{
|
||||
BMElem *ele;
|
||||
BMIter iter;
|
||||
int test = (test_for_enabled ? hflag : 0);
|
||||
int tot = 0;
|
||||
|
||||
BLI_assert(ELEM(TRUE, FALSE, test_for_enabled));
|
||||
|
||||
if (htype & BM_VERT) {
|
||||
for (ele = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL); ele; ele = BM_iter_step(&iter)) {
|
||||
if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) continue;
|
||||
if (BM_elem_flag_test(ele, hflag) == test) tot++;
|
||||
if (BM_elem_flag_test_bool(ele, hflag) == test_for_enabled) tot++;
|
||||
}
|
||||
}
|
||||
if (htype & BM_EDGE) {
|
||||
for (ele = BM_iter_new(&iter, bm, BM_EDGES_OF_MESH, NULL); ele; ele = BM_iter_step(&iter)) {
|
||||
if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) continue;
|
||||
if (BM_elem_flag_test(ele, hflag) == test) tot++;
|
||||
if (BM_elem_flag_test_bool(ele, hflag) == test_for_enabled) tot++;
|
||||
}
|
||||
}
|
||||
if (htype & BM_FACE) {
|
||||
for (ele = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, NULL); ele; ele = BM_iter_step(&iter)) {
|
||||
if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) continue;
|
||||
if (BM_elem_flag_test(ele, hflag) == test) tot++;
|
||||
if (BM_elem_flag_test_bool(ele, hflag) == test_for_enabled) tot++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -762,7 +772,7 @@ void BM_select_history_validate(BMesh *bm)
|
||||
}
|
||||
}
|
||||
|
||||
void BM_mesh_elem_flag_disable_all(BMesh *bm, const char htype, const char hflag)
|
||||
void BM_mesh_elem_flag_disable_all(BMesh *bm, const char htype, const char hflag, int respecthide)
|
||||
{
|
||||
const char iter_types[3] = {BM_VERTS_OF_MESH,
|
||||
BM_EDGES_OF_MESH,
|
||||
@@ -778,7 +788,10 @@ void BM_mesh_elem_flag_disable_all(BMesh *bm, const char htype, const char hflag
|
||||
BM_select_history_clear(bm);
|
||||
}
|
||||
|
||||
if (htype == (BM_VERT | BM_EDGE | BM_FACE) && (hflag == BM_ELEM_SELECT)) {
|
||||
if ((htype == (BM_VERT | BM_EDGE | BM_FACE)) &&
|
||||
(hflag == BM_ELEM_SELECT) &&
|
||||
(respecthide == FALSE))
|
||||
{
|
||||
/* fast path for deselect all, avoid topology loops
|
||||
* since we know all will be de-selected anyway. */
|
||||
for (i = 0; i < 3; i++) {
|
||||
@@ -794,6 +807,11 @@ void BM_mesh_elem_flag_disable_all(BMesh *bm, const char htype, const char hflag
|
||||
if (htype & flag_types[i]) {
|
||||
ele = BM_iter_new(&iter, bm, iter_types[i], NULL);
|
||||
for ( ; ele; ele = BM_iter_step(&iter)) {
|
||||
|
||||
if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (hflag & BM_ELEM_SELECT) {
|
||||
BM_elem_select_set(bm, ele, FALSE);
|
||||
}
|
||||
@@ -804,7 +822,7 @@ void BM_mesh_elem_flag_disable_all(BMesh *bm, const char htype, const char hflag
|
||||
}
|
||||
}
|
||||
|
||||
void BM_mesh_elem_flag_enable_all(BMesh *bm, const char htype, const char hflag)
|
||||
void BM_mesh_elem_flag_enable_all(BMesh *bm, const char htype, const char hflag, int respecthide)
|
||||
{
|
||||
const char iter_types[3] = {BM_VERTS_OF_MESH,
|
||||
BM_EDGES_OF_MESH,
|
||||
@@ -812,6 +830,11 @@ void BM_mesh_elem_flag_enable_all(BMesh *bm, const char htype, const char hflag)
|
||||
|
||||
const char flag_types[3] = {BM_VERT, BM_EDGE, BM_FACE};
|
||||
|
||||
/* use the nosel version when setting so under no
|
||||
* condition may a hidden face become selected.
|
||||
* Applying other flags to hidden faces is OK. */
|
||||
const char hflag_nosel = hflag & ~BM_ELEM_SELECT;
|
||||
|
||||
BMIter iter;
|
||||
BMElem *ele;
|
||||
int i;
|
||||
@@ -828,10 +851,15 @@ void BM_mesh_elem_flag_enable_all(BMesh *bm, const char htype, const char hflag)
|
||||
if (htype & flag_types[i]) {
|
||||
ele = BM_iter_new(&iter, bm, iter_types[i], NULL);
|
||||
for ( ; ele; ele = BM_iter_step(&iter)) {
|
||||
|
||||
if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (hflag & BM_ELEM_SELECT) {
|
||||
BM_elem_select_set(bm, ele, TRUE);
|
||||
}
|
||||
BM_elem_flag_enable(ele, hflag);
|
||||
BM_elem_flag_enable(ele, hflag_nosel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,8 +45,8 @@ void BM_face_hide_set(BMesh *bm, BMFace *f, int hide);
|
||||
#define BM_elem_select_set(bm, ele, hide) _bm_elem_select_set(bm, &(ele)->head, hide)
|
||||
void _bm_elem_select_set(BMesh *bm, BMHeader *ele, int select);
|
||||
|
||||
void BM_mesh_elem_flag_enable_all(BMesh *bm, const char htype, const char hflag);
|
||||
void BM_mesh_elem_flag_disable_all(BMesh *bm, const char htype, const char hflag);
|
||||
void BM_mesh_elem_flag_enable_all(BMesh *bm, const char htype, const char hflag, int respecthide);
|
||||
void BM_mesh_elem_flag_disable_all(BMesh *bm, const char htype, const char hflag, int respecthide);
|
||||
|
||||
/* individual element select functions, BM_elem_select_set is a shortcut for these
|
||||
* that automatically detects which one to use*/
|
||||
|
||||
@@ -101,20 +101,18 @@ void BM_mesh_data_free(BMesh *bm)
|
||||
BMFace *f;
|
||||
|
||||
|
||||
BMIter verts;
|
||||
BMIter edges;
|
||||
BMIter faces;
|
||||
BMIter loops;
|
||||
BMIter iter;
|
||||
BMIter itersub;
|
||||
|
||||
for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BM_iter_step(&verts)) {
|
||||
BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||
CustomData_bmesh_free_block(&(bm->vdata), &(v->head.data));
|
||||
}
|
||||
for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
|
||||
BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
CustomData_bmesh_free_block(&(bm->edata), &(e->head.data));
|
||||
}
|
||||
for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
|
||||
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
CustomData_bmesh_free_block(&(bm->pdata), &(f->head.data));
|
||||
for (l = BM_iter_new(&loops, bm, BM_LOOPS_OF_FACE, f); l; l = BM_iter_step(&loops)) {
|
||||
BM_ITER(l, &itersub, bm, BM_LOOPS_OF_FACE, f) {
|
||||
CustomData_bmesh_free_block(&(bm->ldata), &(l->head.data));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,10 +256,10 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, int set_key, int act_key_nr)
|
||||
BM_elem_index_set(f, bm->totface - 1); /* set_ok */
|
||||
|
||||
/* transfer flag */
|
||||
f->head.hflag = BM_face_flag_from_mflag(mpoly->flag & ~SELECT);
|
||||
f->head.hflag = BM_face_flag_from_mflag(mpoly->flag & ~ME_FACE_SEL);
|
||||
|
||||
/* this is necessary for selection counts to work properly */
|
||||
if (mpoly->flag & SELECT) {
|
||||
if (mpoly->flag & ME_FACE_SEL) {
|
||||
BM_elem_select_set(bm, f, TRUE);
|
||||
}
|
||||
|
||||
@@ -849,10 +849,8 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
|
||||
mvert = me->mvert;
|
||||
while (eve) {
|
||||
keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
|
||||
if (!keyi) {
|
||||
break;
|
||||
}
|
||||
if (*keyi >= 0 && *keyi < currkey->totelem) { // valid old vertex
|
||||
|
||||
if (keyi && *keyi != ORIGINDEX_NONE && *keyi < currkey->totelem) { /* valid old vertex */
|
||||
if (currkey == actkey) {
|
||||
if (actkey == me->key->refkey) {
|
||||
copy_v3_v3(fp, mvert->co);
|
||||
|
||||
@@ -71,9 +71,13 @@ int BM_mesh_validate(BMesh *bm)
|
||||
BM_mesh_elem_index_ensure(bm, BM_ALL);
|
||||
|
||||
BM_ITER_INDEX(v, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
|
||||
if (BM_elem_flag_test(v, BM_ELEM_SELECT | BM_ELEM_HIDDEN) == (BM_ELEM_SELECT | BM_ELEM_HIDDEN)) {
|
||||
ERRMSG("vert %d: is hidden and selected", i);
|
||||
}
|
||||
|
||||
if (v->e) {
|
||||
if (!BM_vert_in_edge(v->e, v)) {
|
||||
ERRMSG("vert: %d - is not in its referenced edge: %d", i, BM_elem_index_get(v->e));
|
||||
ERRMSG("vert %d: is not in its referenced edge: %d", i, BM_elem_index_get(v->e));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -86,6 +90,10 @@ int BM_mesh_validate(BMesh *bm)
|
||||
|
||||
/* edge radial structure */
|
||||
BM_ITER_INDEX(e, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
|
||||
if (BM_elem_flag_test(e, BM_ELEM_SELECT | BM_ELEM_HIDDEN) == (BM_ELEM_SELECT | BM_ELEM_HIDDEN)) {
|
||||
ERRMSG("edge %d: is hidden and selected", i);
|
||||
}
|
||||
|
||||
if (e->l) {
|
||||
BMLoop *l_iter;
|
||||
BMLoop *l_first;
|
||||
@@ -113,6 +121,10 @@ int BM_mesh_validate(BMesh *bm)
|
||||
BMLoop *l_iter;
|
||||
BMLoop *l_first;
|
||||
|
||||
if (BM_elem_flag_test(f, BM_ELEM_SELECT | BM_ELEM_HIDDEN) == (BM_ELEM_SELECT | BM_ELEM_HIDDEN)) {
|
||||
ERRMSG("face %d: is hidden and selected", i);
|
||||
}
|
||||
|
||||
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
||||
|
||||
do {
|
||||
|
||||
@@ -75,17 +75,19 @@ extern "C" {
|
||||
|
||||
struct GHashIterator;
|
||||
|
||||
#define BMO_elem_flag_test( bm, ele, oflag) _bmo_elem_flag_test (bm, (ele)->oflags, oflag)
|
||||
#define BMO_elem_flag_enable( bm, ele, oflag) _bmo_elem_flag_enable (bm, (ele)->oflags, oflag)
|
||||
#define BMO_elem_flag_disable(bm, ele, oflag) _bmo_elem_flag_disable (bm, (ele)->oflags, oflag)
|
||||
#define BMO_elem_flag_set( bm, ele, oflag, val) _bmo_elem_flag_set (bm, (ele)->oflags, oflag, val)
|
||||
#define BMO_elem_flag_toggle( bm, ele, oflag) _bmo_elem_flag_toggle (bm, (ele)->oflags, oflag)
|
||||
#define BMO_elem_flag_test( bm, ele, oflag) _bmo_elem_flag_test (bm, (ele)->oflags, oflag)
|
||||
#define BMO_elem_flag_test_bool(bm, ele, oflag) _bmo_elem_flag_test_bool(bm, (ele)->oflags, oflag)
|
||||
#define BMO_elem_flag_enable( bm, ele, oflag) _bmo_elem_flag_enable (bm, (ele)->oflags, oflag)
|
||||
#define BMO_elem_flag_disable( bm, ele, oflag) _bmo_elem_flag_disable (bm, (ele)->oflags, oflag)
|
||||
#define BMO_elem_flag_set( bm, ele, oflag, val) _bmo_elem_flag_set (bm, (ele)->oflags, oflag, val)
|
||||
#define BMO_elem_flag_toggle( bm, ele, oflag) _bmo_elem_flag_toggle (bm, (ele)->oflags, oflag)
|
||||
|
||||
BLI_INLINE short _bmo_elem_flag_test(BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
BLI_INLINE void _bmo_elem_flag_enable(BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
BLI_INLINE void _bmo_elem_flag_disable(BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
BLI_INLINE void _bmo_elem_flag_set(BMesh *bm, BMFlagLayer *oflags, const short oflag, int val);
|
||||
BLI_INLINE void _bmo_elem_flag_toggle(BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
BLI_INLINE short _bmo_elem_flag_test( BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
BLI_INLINE short _bmo_elem_flag_test_bool(BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
BLI_INLINE void _bmo_elem_flag_enable( BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
BLI_INLINE void _bmo_elem_flag_disable( BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
BLI_INLINE void _bmo_elem_flag_set( BMesh *bm, BMFlagLayer *oflags, const short oflag, int val);
|
||||
BLI_INLINE void _bmo_elem_flag_toggle( BMesh *bm, BMFlagLayer *oflags, const short oflag);
|
||||
|
||||
/* slot type arrays are terminated by the last member
|
||||
* having a slot type of 0.*/
|
||||
@@ -297,17 +299,17 @@ void BMO_mesh_flag_disable_all(BMesh *bm, BMOperator *op, const char htype, cons
|
||||
|
||||
/* copies the values from another slot to the end of the output slot */
|
||||
void BMO_slot_buffer_append(BMOperator *output_op, const char *output_op_slot,
|
||||
BMOperator *other_op, const char *other_op_slot);
|
||||
BMOperator *other_op, const char *other_op_slot);
|
||||
|
||||
/* puts every element of type 'type' (which is a bitmask) with tool
|
||||
* flag 'flag', into a slot. */
|
||||
void BMO_slot_buffer_from_enabled_flag(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
const char htype, const short oflag);
|
||||
const char htype, const short oflag);
|
||||
|
||||
/* puts every element of type 'type' (which is a bitmask) without tool
|
||||
* flag 'flag', into a slot. */
|
||||
void BMO_slot_buffer_from_disabled_flag(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
const char htype, const short oflag);
|
||||
const char htype, const short oflag);
|
||||
|
||||
/* tool-flags all elements inside an element slot array with flag flag. */
|
||||
void BMO_slot_buffer_flag_enable(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
@@ -327,15 +329,15 @@ void BMO_slot_buffer_hflag_disable(BMesh *bm, BMOperator *op, const char *slotna
|
||||
* flag 'flag', into a slot. note: ignores hidden elements
|
||||
* (e.g. elements with header flag BM_ELEM_HIDDEN set).*/
|
||||
void BMO_slot_buffer_from_enabled_hflag(BMesh *bm, BMOperator *op,
|
||||
const char *slotname,
|
||||
const char htype, const char hflag);
|
||||
const char *slotname,
|
||||
const char htype, const char hflag);
|
||||
|
||||
/* puts every element of type 'type' (which is a bitmask) without
|
||||
* header flag 'flag', into a slot. note: ignores hidden elements
|
||||
* (e.g. elements with header flag BM_ELEM_HIDDEN set).*/
|
||||
void BMO_slot_buffer_from_disabled_hflag(BMesh *bm, BMOperator *op,
|
||||
const char *slotname,
|
||||
const char htype, const char hflag);
|
||||
const char *slotname,
|
||||
const char htype, const char hflag);
|
||||
|
||||
/* counts number of elements inside a slot array. */
|
||||
int BMO_slot_buffer_count(BMesh *bm, BMOperator *op, const char *slotname);
|
||||
|
||||
@@ -40,7 +40,12 @@
|
||||
/* flags 15 and 16 (1 << 14 and 1 << 15) are reserved for bmesh api use */
|
||||
BLI_INLINE short _bmo_elem_flag_test(BMesh *bm, BMFlagLayer *oflags, const short oflag)
|
||||
{
|
||||
return oflags[bm->stackdepth - 1].f & oflag;
|
||||
return oflags[bm->stackdepth - 1].f & oflag;
|
||||
}
|
||||
|
||||
BLI_INLINE short _bmo_elem_flag_test_bool(BMesh *bm, BMFlagLayer *oflags, const short oflag)
|
||||
{
|
||||
return (oflags[bm->stackdepth - 1].f & oflag) != 0;
|
||||
}
|
||||
|
||||
BLI_INLINE void _bmo_elem_flag_enable(BMesh *bm, BMFlagLayer *oflags, const short oflag)
|
||||
@@ -65,13 +70,13 @@ BLI_INLINE void _bmo_elem_flag_toggle(BMesh *bm, BMFlagLayer *oflags, const shor
|
||||
}
|
||||
|
||||
BLI_INLINE void BMO_slot_map_int_insert(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
void *element, int val)
|
||||
void *element, int val)
|
||||
{
|
||||
BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(int));
|
||||
}
|
||||
|
||||
BLI_INLINE void BMO_slot_map_float_insert(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
void *element, float val)
|
||||
void *element, float val)
|
||||
{
|
||||
BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(float));
|
||||
}
|
||||
@@ -83,7 +88,7 @@ BLI_INLINE void BMO_slot_map_float_insert(BMesh *bm, BMOperator *op, const char
|
||||
* use BMO_slot_map_data_get and BMO_slot_map_insert, which copies the data. */
|
||||
|
||||
BLI_INLINE void BMO_slot_map_ptr_insert(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
void *element, void *val)
|
||||
void *element, void *val)
|
||||
{
|
||||
BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(void *));
|
||||
}
|
||||
@@ -100,7 +105,7 @@ BLI_INLINE int BMO_slot_map_contains(BMesh *UNUSED(bm), BMOperator *op, const ch
|
||||
}
|
||||
|
||||
BLI_INLINE void *BMO_slot_map_data_get(BMesh *UNUSED(bm), BMOperator *op, const char *slotname,
|
||||
void *element)
|
||||
void *element)
|
||||
{
|
||||
BMOElemMapping *mapping;
|
||||
BMOpSlot *slot = BMO_slot_get(op, slotname);
|
||||
@@ -117,7 +122,7 @@ BLI_INLINE void *BMO_slot_map_data_get(BMesh *UNUSED(bm), BMOperator *op, const
|
||||
}
|
||||
|
||||
BLI_INLINE float BMO_slot_map_float_get(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
void *element)
|
||||
void *element)
|
||||
{
|
||||
float *val = (float *) BMO_slot_map_data_get(bm, op, slotname, element);
|
||||
if (val) return *val;
|
||||
@@ -126,7 +131,7 @@ BLI_INLINE float BMO_slot_map_float_get(BMesh *bm, BMOperator *op, const char *s
|
||||
}
|
||||
|
||||
BLI_INLINE int BMO_slot_map_int_get(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
void *element)
|
||||
void *element)
|
||||
{
|
||||
int *val = (int *) BMO_slot_map_data_get(bm, op, slotname, element);
|
||||
if (val) return *val;
|
||||
@@ -135,7 +140,7 @@ BLI_INLINE int BMO_slot_map_int_get(BMesh *bm, BMOperator *op, const char *slotn
|
||||
}
|
||||
|
||||
BLI_INLINE void *BMO_slot_map_ptr_get(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
void *element)
|
||||
void *element)
|
||||
{
|
||||
void **val = (void **) BMO_slot_map_data_get(bm, op, slotname, element);
|
||||
if (val) return *val;
|
||||
|
||||
@@ -274,8 +274,7 @@ void BMO_slot_copy(BMOperator *source_op, BMOperator *dest_op, const char *src,
|
||||
}
|
||||
|
||||
if (!dest_slot->data.ghash) {
|
||||
dest_slot->data.ghash = BLI_ghash_new(BLI_ghashutil_ptrhash,
|
||||
BLI_ghashutil_ptrcmp, "bmesh operator 2");
|
||||
dest_slot->data.ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh operator 2");
|
||||
}
|
||||
|
||||
BLI_ghashIterator_init(&it, source_slot->data.ghash);
|
||||
@@ -457,29 +456,27 @@ void BMO_slot_vec_get(BMOperator *op, const char *slotname, float r_vec[3])
|
||||
*/
|
||||
|
||||
static int bmo_mesh_flag_count(BMesh *bm, const char htype, const short oflag,
|
||||
int test_for_enabled)
|
||||
const short test_for_enabled)
|
||||
{
|
||||
BMIter elements;
|
||||
const char iter_types[3] = {BM_VERTS_OF_MESH,
|
||||
BM_EDGES_OF_MESH,
|
||||
BM_FACES_OF_MESH};
|
||||
|
||||
const char flag_types[3] = {BM_VERT, BM_EDGE, BM_FACE};
|
||||
|
||||
BMIter iter;
|
||||
int count = 0;
|
||||
BMElemF *ele_f;
|
||||
int test = (test_for_enabled ? oflag : 0);
|
||||
int i;
|
||||
|
||||
if (htype & BM_VERT) {
|
||||
for (ele_f = BM_iter_new(&elements, bm, BM_VERTS_OF_MESH, bm); ele_f; ele_f = BM_iter_step(&elements)) {
|
||||
if (BMO_elem_flag_test(bm, ele_f, oflag) == test)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if (htype & BM_EDGE) {
|
||||
for (ele_f = BM_iter_new(&elements, bm, BM_EDGES_OF_MESH, bm); ele_f; ele_f = BM_iter_step(&elements)) {
|
||||
if (BMO_elem_flag_test(bm, ele_f, oflag) == test)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if (htype & BM_FACE) {
|
||||
for (ele_f = BM_iter_new(&elements, bm, BM_FACES_OF_MESH, bm); ele_f; ele_f = BM_iter_step(&elements)) {
|
||||
if (BMO_elem_flag_test(bm, ele_f, oflag) == test)
|
||||
count++;
|
||||
BLI_assert(ELEM(TRUE, FALSE, test_for_enabled));
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (htype & flag_types[i]) {
|
||||
BM_ITER(ele_f, &iter, bm, iter_types[i], NULL) {
|
||||
if (BMO_elem_flag_test_bool(bm, ele_f, oflag) == test_for_enabled)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -559,8 +556,7 @@ void BMO_slot_map_insert(BMesh *UNUSED(bm), BMOperator *op, const char *slotname
|
||||
memcpy(mapping + 1, data, len);
|
||||
|
||||
if (!slot->data.ghash) {
|
||||
slot->data.ghash = BLI_ghash_new(BLI_ghashutil_ptrhash,
|
||||
BLI_ghashutil_ptrcmp, "bmesh slot map hash");
|
||||
slot->data.ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh slot map hash");
|
||||
}
|
||||
|
||||
BLI_ghash_insert(slot->data.ghash, element, mapping);
|
||||
@@ -651,8 +647,6 @@ static void *bmo_slot_buffer_alloc(BMOperator *op, const char *slotname, int len
|
||||
*/
|
||||
static void BMO_slot_buffer_from_all(BMesh *bm, BMOperator *op, const char *slotname, const char htype)
|
||||
{
|
||||
BMIter elements;
|
||||
BMHeader *e;
|
||||
BMOpSlot *output = BMO_slot_get(op, slotname);
|
||||
int totelement = 0, i = 0;
|
||||
|
||||
@@ -661,25 +655,30 @@ static void BMO_slot_buffer_from_all(BMesh *bm, BMOperator *op, const char *slot
|
||||
if (htype & BM_FACE) totelement += bm->totface;
|
||||
|
||||
if (totelement) {
|
||||
BMIter iter;
|
||||
BMHeader *ele;
|
||||
|
||||
bmo_slot_buffer_alloc(op, slotname, totelement);
|
||||
|
||||
/* TODO - collapse these loops into one */
|
||||
|
||||
if (htype & BM_VERT) {
|
||||
for (e = BM_iter_new(&elements, bm, BM_VERTS_OF_MESH, bm); e; e = BM_iter_step(&elements)) {
|
||||
((BMHeader **)output->data.p)[i] = e;
|
||||
BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||
((BMHeader **)output->data.p)[i] = ele;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
if (htype & BM_EDGE) {
|
||||
for (e = BM_iter_new(&elements, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&elements)) {
|
||||
((BMHeader **)output->data.p)[i] = e;
|
||||
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
((BMHeader **)output->data.p)[i] = ele;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
if (htype & BM_FACE) {
|
||||
for (e = BM_iter_new(&elements, bm, BM_FACES_OF_MESH, bm); e; e = BM_iter_step(&elements)) {
|
||||
((BMHeader **)output->data.p)[i] = e;
|
||||
BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
((BMHeader **)output->data.p)[i] = ele;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@@ -693,28 +692,32 @@ static void BMO_slot_buffer_from_all(BMesh *bm, BMOperator *op, const char *slot
|
||||
* enabled/disabled into a slot for an operator.
|
||||
*/
|
||||
static void bmo_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
const char htype, const char hflag,
|
||||
int test_for_enabled)
|
||||
const char htype, const char hflag,
|
||||
const short test_for_enabled)
|
||||
{
|
||||
BMIter elements;
|
||||
BMElem *ele;
|
||||
BMOpSlot *output = BMO_slot_get(op, slotname);
|
||||
int totelement = 0, i = 0;
|
||||
|
||||
BLI_assert(ELEM(TRUE, FALSE, test_for_enabled));
|
||||
|
||||
if (test_for_enabled)
|
||||
totelement = BM_mesh_enabled_flag_count(bm, htype, hflag, TRUE);
|
||||
else
|
||||
totelement = BM_mesh_disabled_flag_count(bm, htype, hflag, TRUE);
|
||||
|
||||
if (totelement) {
|
||||
int test = (test_for_enabled ? hflag : 0);
|
||||
BMIter iter;
|
||||
BMElem *ele;
|
||||
|
||||
bmo_slot_buffer_alloc(op, slotname, totelement);
|
||||
|
||||
/* TODO - collapse these loops into one */
|
||||
|
||||
if (htype & BM_VERT) {
|
||||
for (ele = BM_iter_new(&elements, bm, BM_VERTS_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
|
||||
BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||
if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
|
||||
BM_elem_flag_test(ele, hflag) == test) {
|
||||
BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
|
||||
{
|
||||
((BMElem **)output->data.p)[i] = ele;
|
||||
i++;
|
||||
}
|
||||
@@ -722,9 +725,10 @@ static void bmo_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *sl
|
||||
}
|
||||
|
||||
if (htype & BM_EDGE) {
|
||||
for (ele = BM_iter_new(&elements, bm, BM_EDGES_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
|
||||
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
|
||||
BM_elem_flag_test(ele, hflag) == test) {
|
||||
BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
|
||||
{
|
||||
((BMElem **)output->data.p)[i] = ele;
|
||||
i++;
|
||||
}
|
||||
@@ -732,9 +736,10 @@ static void bmo_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *sl
|
||||
}
|
||||
|
||||
if (htype & BM_FACE) {
|
||||
for (ele = BM_iter_new(&elements, bm, BM_FACES_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
|
||||
BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
|
||||
BM_elem_flag_test(ele, hflag) == test) {
|
||||
BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
|
||||
{
|
||||
((BMElem **)output->data.p)[i] = ele;
|
||||
i++;
|
||||
}
|
||||
@@ -747,13 +752,13 @@ static void bmo_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *sl
|
||||
}
|
||||
|
||||
void BMO_slot_buffer_from_enabled_hflag(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
const char htype, const char hflag)
|
||||
const char htype, const char hflag)
|
||||
{
|
||||
bmo_slot_buffer_from_hflag(bm, op, slotname, htype, hflag, TRUE);
|
||||
}
|
||||
|
||||
void BMO_slot_buffer_from_disabled_hflag(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
const char htype, const char hflag)
|
||||
const char htype, const char hflag)
|
||||
{
|
||||
bmo_slot_buffer_from_hflag(bm, op, slotname, htype, hflag, FALSE);
|
||||
}
|
||||
@@ -762,13 +767,13 @@ void BMO_slot_buffer_from_disabled_hflag(BMesh *bm, BMOperator *op, const char *
|
||||
* Copies the values from another slot to the end of the output slot.
|
||||
*/
|
||||
void BMO_slot_buffer_append(BMOperator *output_op, const char *output_slot_name,
|
||||
BMOperator *other_op, const char *other_slot_name)
|
||||
BMOperator *other_op, const char *other_slot_name)
|
||||
{
|
||||
BMOpSlot *output_slot = BMO_slot_get(output_op, output_slot_name);
|
||||
BMOpSlot *other_slot = BMO_slot_get(other_op, other_slot_name);
|
||||
|
||||
BLI_assert(output_slot->slottype == BMO_OP_SLOT_ELEMENT_BUF &&
|
||||
other_slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
|
||||
other_slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
|
||||
|
||||
if (output_slot->len == 0) {
|
||||
/* output slot is empty, copy rather than append */
|
||||
@@ -782,8 +787,7 @@ void BMO_slot_buffer_append(BMOperator *output_op, const char *output_slot_name,
|
||||
|
||||
/* copy slot data */
|
||||
memcpy(buf, output_slot->data.buf, elem_size * output_slot->len);
|
||||
memcpy(((char*)buf) + elem_size * output_slot->len,
|
||||
other_slot->data.buf, elem_size * other_slot->len);
|
||||
memcpy(((char *)buf) + elem_size * output_slot->len, other_slot->data.buf, elem_size * other_slot->len);
|
||||
|
||||
output_slot->data.buf = buf;
|
||||
output_slot->len += other_slot->len;
|
||||
@@ -797,32 +801,35 @@ void BMO_slot_buffer_append(BMOperator *output_op, const char *output_slot_name,
|
||||
* into an output slot for an operator.
|
||||
*/
|
||||
static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
const char htype, const short oflag,
|
||||
int test_for_enabled)
|
||||
const char htype, const short oflag,
|
||||
const short test_for_enabled)
|
||||
{
|
||||
BMIter elements;
|
||||
BMOpSlot *slot = BMO_slot_get(op, slotname);
|
||||
int totelement, i = 0;
|
||||
|
||||
BLI_assert(ELEM(TRUE, FALSE, test_for_enabled));
|
||||
|
||||
if (test_for_enabled)
|
||||
totelement = BMO_mesh_enabled_flag_count(bm, htype, oflag);
|
||||
else
|
||||
totelement = BMO_mesh_disabled_flag_count(bm, htype, oflag);
|
||||
totelement = BMO_mesh_disabled_flag_count(bm, htype, oflag);
|
||||
|
||||
BLI_assert(slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
|
||||
|
||||
if (totelement) {
|
||||
BMIter iter;
|
||||
BMHeader *ele;
|
||||
BMHeader **ele_array;
|
||||
int test = (test_for_enabled ? oflag : 0);
|
||||
|
||||
bmo_slot_buffer_alloc(op, slotname, totelement);
|
||||
|
||||
ele_array = (BMHeader **)slot->data.p;
|
||||
|
||||
/* TODO - collapse these loops into one */
|
||||
|
||||
if (htype & BM_VERT) {
|
||||
for (ele = BM_iter_new(&elements, bm, BM_VERTS_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
|
||||
if (BMO_elem_flag_test(bm, (BMElemF *)ele, oflag) == test) {
|
||||
BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||
if (BMO_elem_flag_test_bool(bm, (BMElemF *)ele, oflag) == test_for_enabled) {
|
||||
ele_array[i] = ele;
|
||||
i++;
|
||||
}
|
||||
@@ -830,8 +837,8 @@ static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slo
|
||||
}
|
||||
|
||||
if (htype & BM_EDGE) {
|
||||
for (ele = BM_iter_new(&elements, bm, BM_EDGES_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
|
||||
if (BMO_elem_flag_test(bm, (BMElemF *)ele, oflag) == test) {
|
||||
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (BMO_elem_flag_test_bool(bm, (BMElemF *)ele, oflag) == test_for_enabled) {
|
||||
ele_array[i] = ele;
|
||||
i++;
|
||||
}
|
||||
@@ -839,8 +846,8 @@ static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slo
|
||||
}
|
||||
|
||||
if (htype & BM_FACE) {
|
||||
for (ele = BM_iter_new(&elements, bm, BM_FACES_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
|
||||
if (BMO_elem_flag_test(bm, (BMElemF *)ele, oflag) == test) {
|
||||
BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
|
||||
if (BMO_elem_flag_test_bool(bm, (BMElemF *)ele, oflag) == test_for_enabled) {
|
||||
ele_array[i] = ele;
|
||||
i++;
|
||||
}
|
||||
@@ -853,13 +860,13 @@ static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slo
|
||||
}
|
||||
|
||||
void BMO_slot_buffer_from_enabled_flag(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
const char htype, const short oflag)
|
||||
const char htype, const short oflag)
|
||||
{
|
||||
bmo_slot_buffer_from_flag(bm, op, slotname, htype, oflag, TRUE);
|
||||
}
|
||||
|
||||
void BMO_slot_buffer_from_disabled_flag(BMesh *bm, BMOperator *op, const char *slotname,
|
||||
const char htype, const short oflag)
|
||||
const char htype, const short oflag)
|
||||
{
|
||||
bmo_slot_buffer_from_flag(bm, op, slotname, htype, oflag, FALSE);
|
||||
}
|
||||
@@ -1028,19 +1035,19 @@ static void bmo_flag_layer_alloc(BMesh *bm)
|
||||
bm->toolflagpool = newpool = BLI_mempool_create(sizeof(BMFlagLayer) * bm->totflags, 512, 512, 0);
|
||||
|
||||
/* now go through and memcpy all the flags. Loops don't get a flag layer at this time.. */
|
||||
for (ele = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
|
||||
oldflags = ele->oflags;
|
||||
ele->oflags = BLI_mempool_calloc(newpool);
|
||||
memcpy(ele->oflags, oldflags, old_totflags_size);
|
||||
BM_elem_index_set(ele, i); /* set_inline */
|
||||
}
|
||||
for (ele = BM_iter_new(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
|
||||
oldflags = ele->oflags;
|
||||
ele->oflags = BLI_mempool_calloc(newpool);
|
||||
memcpy(ele->oflags, oldflags, old_totflags_size);
|
||||
BM_elem_index_set(ele, i); /* set_inline */
|
||||
}
|
||||
for (ele = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
|
||||
oldflags = ele->oflags;
|
||||
ele->oflags = BLI_mempool_calloc(newpool);
|
||||
memcpy(ele->oflags, oldflags, old_totflags_size);
|
||||
@@ -1073,19 +1080,19 @@ static void bmo_flag_layer_free(BMesh *bm)
|
||||
bm->toolflagpool = newpool = BLI_mempool_create(new_totflags_size, 512, 512, BLI_MEMPOOL_SYSMALLOC);
|
||||
|
||||
/* now go through and memcpy all the flag */
|
||||
for (ele = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
|
||||
oldflags = ele->oflags;
|
||||
ele->oflags = BLI_mempool_calloc(newpool);
|
||||
memcpy(ele->oflags, oldflags, new_totflags_size);
|
||||
BM_elem_index_set(ele, i); /* set_inline */
|
||||
}
|
||||
for (ele = BM_iter_new(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
|
||||
oldflags = ele->oflags;
|
||||
ele->oflags = BLI_mempool_calloc(newpool);
|
||||
memcpy(ele->oflags, oldflags, new_totflags_size);
|
||||
BM_elem_index_set(ele, i); /* set_inline */
|
||||
}
|
||||
for (ele = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
|
||||
oldflags = ele->oflags;
|
||||
ele->oflags = BLI_mempool_calloc(newpool);
|
||||
memcpy(ele->oflags, oldflags, new_totflags_size);
|
||||
@@ -1108,15 +1115,15 @@ static void bmo_flag_layer_clear(BMesh *bm)
|
||||
const int totflags_offset = bm->totflags - 1;
|
||||
|
||||
/* now go through and memcpy all the flag */
|
||||
for (ele = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
|
||||
memset(ele->oflags + totflags_offset, 0, sizeof(BMFlagLayer));
|
||||
BM_elem_index_set(ele, i); /* set_inline */
|
||||
}
|
||||
for (ele = BM_iter_new(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
|
||||
memset(ele->oflags + totflags_offset, 0, sizeof(BMFlagLayer));
|
||||
BM_elem_index_set(ele, i); /* set_inline */
|
||||
}
|
||||
for (ele = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BM_iter_step(&iter), i++) {
|
||||
BM_ITER_INDEX(ele, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
|
||||
memset(ele->oflags + totflags_offset, 0, sizeof(BMFlagLayer));
|
||||
BM_elem_index_set(ele, i); /* set_inline */
|
||||
}
|
||||
|
||||
@@ -537,21 +537,21 @@ int BM_vert_is_manifold(BMVert *v)
|
||||
|
||||
/**
|
||||
* Tests whether or not this edge is manifold.
|
||||
* A manifold edge either has 1 or 2 faces attached to it.
|
||||
* A manifold edge has exactly 2 faces attached to it.
|
||||
*/
|
||||
|
||||
#if 1 /* fast path for checking manifold */
|
||||
int BM_edge_is_manifold(BMEdge *e)
|
||||
{
|
||||
const BMLoop *l = e->l;
|
||||
return (l && ((l->radial_next == l) || /* 1 face user */
|
||||
(l->radial_next->radial_next == l))); /* 2 face users */
|
||||
return (l && (l->radial_next != l) && /* not 0 or 1 face users */
|
||||
(l->radial_next->radial_next == l)); /* 2 face users */
|
||||
}
|
||||
#else
|
||||
int BM_edge_is_manifold(BMEdge *e)
|
||||
{
|
||||
int count = BM_edge_face_count(e);
|
||||
if (count == 2 || count == 1) {
|
||||
if (count == 2) {
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -667,7 +667,7 @@ static int bmw_FaceLoopWalker_edge_begins_loop(BMWalker *walker, BMEdge *e)
|
||||
|
||||
/* Don't start a loop from a boundary edge if it cannot
|
||||
* be extended to cover any faces */
|
||||
if (BM_edge_face_count(e) == 1) {
|
||||
if (BM_edge_is_boundary(e)) {
|
||||
if (!bmw_FaceLoopWalker_include_face(walker, e->l)) {
|
||||
return FALSE;
|
||||
}
|
||||
@@ -843,7 +843,7 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker)
|
||||
int i, len;
|
||||
#endif
|
||||
|
||||
#define EDGE_CHECK(e) (bmw_mask_check_edge(walker, e) && BM_edge_is_manifold(e))
|
||||
#define EDGE_CHECK(e) (bmw_mask_check_edge(walker, e) && (BM_edge_is_boundary(e) || BM_edge_is_manifold(e)))
|
||||
|
||||
BMW_state_remove(walker);
|
||||
|
||||
|
||||
@@ -29,23 +29,22 @@
|
||||
#include "bmesh.h"
|
||||
|
||||
/* local flag define */
|
||||
#define DUPE_INPUT 1 /* input from operator */
|
||||
#define DUPE_NEW 2
|
||||
#define DUPE_DONE 4
|
||||
#define DUPE_MAPPED 8
|
||||
#define DUPE_INPUT 1 /* input from operator */
|
||||
#define DUPE_NEW 2
|
||||
#define DUPE_DONE 4
|
||||
#define DUPE_MAPPED 8
|
||||
|
||||
/*
|
||||
* COPY VERTEX
|
||||
*
|
||||
* Copy an existing vertex from one bmesh to another.
|
||||
/**
|
||||
* COPY VERTEX
|
||||
*
|
||||
* Copy an existing vertex from one bmesh to another.
|
||||
*/
|
||||
static BMVert *copy_vertex(BMesh *source_mesh, BMVert *source_vertex, BMesh *target_mesh, GHash *vhash)
|
||||
{
|
||||
BMVert *target_vertex = NULL;
|
||||
|
||||
/* Create a new vertex */
|
||||
target_vertex = BM_vert_create(target_mesh, source_vertex->co, NULL);
|
||||
target_vertex = BM_vert_create(target_mesh, source_vertex->co, NULL);
|
||||
|
||||
/* Insert new vertex into the vert hash */
|
||||
BLI_ghash_insert(vhash, source_vertex, target_vertex);
|
||||
@@ -59,11 +58,10 @@ static BMVert *copy_vertex(BMesh *source_mesh, BMVert *source_vertex, BMesh *tar
|
||||
return target_vertex;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* COPY EDGE
|
||||
*
|
||||
* Copy an existing edge from one bmesh to another.
|
||||
*
|
||||
*/
|
||||
static BMEdge *copy_edge(BMOperator *op, BMesh *source_mesh,
|
||||
BMEdge *source_edge, BMesh *target_mesh,
|
||||
@@ -115,10 +113,10 @@ static BMEdge *copy_edge(BMOperator *op, BMesh *source_mesh,
|
||||
return target_edge;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* COPY FACE
|
||||
*
|
||||
* Copy an existing face from one bmesh to another.
|
||||
* Copy an existing face from one bmesh to another.
|
||||
*/
|
||||
|
||||
static BMFace *copy_face(BMOperator *op, BMesh *source_mesh,
|
||||
@@ -151,10 +149,8 @@ static BMFace *copy_face(BMOperator *op, BMesh *source_mesh,
|
||||
|
||||
/* create new face */
|
||||
target_face = BM_face_create(target_mesh, vtar, edar, source_face->len, FALSE);
|
||||
BMO_slot_map_ptr_insert(source_mesh, op,
|
||||
"facemap", source_face, target_face);
|
||||
BMO_slot_map_ptr_insert(source_mesh, op,
|
||||
"facemap", target_face, source_face);
|
||||
BMO_slot_map_ptr_insert(source_mesh, op, "facemap", source_face, target_face);
|
||||
BMO_slot_map_ptr_insert(source_mesh, op, "facemap", target_face, source_face);
|
||||
|
||||
BM_elem_attrs_copy(source_mesh, target_mesh, source_face, target_face);
|
||||
|
||||
@@ -174,11 +170,12 @@ static BMFace *copy_face(BMOperator *op, BMesh *source_mesh,
|
||||
return target_face;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* COPY MESH
|
||||
*
|
||||
* Internal Copy function.
|
||||
*/
|
||||
|
||||
static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
|
||||
{
|
||||
|
||||
@@ -195,15 +192,14 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
|
||||
GHash *vhash, *ehash;
|
||||
|
||||
/* initialize pointer hashes */
|
||||
vhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp,
|
||||
"bmesh dupeops v");
|
||||
ehash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp,
|
||||
"bmesh dupeops e");
|
||||
vhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh dupeops v");
|
||||
ehash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh dupeops e");
|
||||
|
||||
/* duplicate flagged vertices */
|
||||
BM_ITER(v, &viter, source, BM_VERTS_OF_MESH, source) {
|
||||
if (BMO_elem_flag_test(source, v, DUPE_INPUT) &&
|
||||
!BMO_elem_flag_test(source, v, DUPE_DONE)) {
|
||||
!BMO_elem_flag_test(source, v, DUPE_DONE))
|
||||
{
|
||||
BMIter iter;
|
||||
int isolated = 1;
|
||||
|
||||
@@ -236,7 +232,8 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
|
||||
/* now we dupe all the edges */
|
||||
BM_ITER(e, &eiter, source, BM_EDGES_OF_MESH, source) {
|
||||
if (BMO_elem_flag_test(source, e, DUPE_INPUT) &&
|
||||
!BMO_elem_flag_test(source, e, DUPE_DONE)) {
|
||||
!BMO_elem_flag_test(source, e, DUPE_DONE))
|
||||
{
|
||||
/* make sure that verts are copied */
|
||||
if (!BMO_elem_flag_test(source, e->v1, DUPE_DONE)) {
|
||||
copy_vertex(source, e->v1, target, vhash);
|
||||
@@ -247,7 +244,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
|
||||
BMO_elem_flag_enable(source, e->v2, DUPE_DONE);
|
||||
}
|
||||
/* now copy the actual edge */
|
||||
copy_edge(op, source, e, target, vhash, ehash);
|
||||
copy_edge(op, source, e, target, vhash, ehash);
|
||||
BMO_elem_flag_enable(source, e, DUPE_DONE);
|
||||
}
|
||||
}
|
||||
@@ -266,7 +263,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
|
||||
/* edge pass */
|
||||
BM_ITER(e, &eiter, source, BM_EDGES_OF_FACE, f) {
|
||||
if (!BMO_elem_flag_test(source, e, DUPE_DONE)) {
|
||||
copy_edge(op, source, e, target, vhash, ehash);
|
||||
copy_edge(op, source, e, target, vhash, ehash);
|
||||
BMO_elem_flag_enable(source, e, DUPE_DONE);
|
||||
}
|
||||
}
|
||||
@@ -291,7 +288,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
|
||||
BLI_array_free(edar); /* free edge pointer array */
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Duplicate Operator
|
||||
*
|
||||
* Duplicates verts, edges and faces of a mesh.
|
||||
@@ -310,7 +307,6 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
|
||||
* BMOP_DUPE_VNEW: Buffer containing pointers to the new mesh vertices
|
||||
* BMOP_DUPE_ENEW: Buffer containing pointers to the new mesh edges
|
||||
* BMOP_DUPE_FNEW: Buffer containing pointers to the new mesh faces
|
||||
*
|
||||
*/
|
||||
|
||||
void bmo_dupe_exec(BMesh *bm, BMOperator *op)
|
||||
@@ -352,7 +348,7 @@ void BMO_dupe_from_flag(BMesh *bm, int htype, const char hflag)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
/**
|
||||
* Split Operator
|
||||
*
|
||||
* Duplicates verts, edges and faces of a mesh but also deletes the originals.
|
||||
@@ -370,7 +366,8 @@ void BMO_dupe_from_flag(BMesh *bm, int htype, const char hflag)
|
||||
* BMOP_DUPE_FOUTPUT: Buffer containing pointers to the split mesh faces
|
||||
*/
|
||||
|
||||
#define SPLIT_INPUT 1
|
||||
#define SPLIT_INPUT 1
|
||||
|
||||
void bmo_split_exec(BMesh *bm, BMOperator *op)
|
||||
{
|
||||
BMOperator *splitop = op;
|
||||
@@ -432,10 +429,8 @@ void bmo_split_exec(BMesh *bm, BMOperator *op)
|
||||
|
||||
/* now we make our outputs by copying the dupe output */
|
||||
BMO_slot_copy(&dupeop, splitop, "newout", "geomout");
|
||||
BMO_slot_copy(&dupeop, splitop, "boundarymap",
|
||||
"boundarymap");
|
||||
BMO_slot_copy(&dupeop, splitop, "isovertmap",
|
||||
"isovertmap");
|
||||
BMO_slot_copy(&dupeop, splitop, "boundarymap", "boundarymap");
|
||||
BMO_slot_copy(&dupeop, splitop, "isovertmap", "isovertmap");
|
||||
|
||||
/* cleanup */
|
||||
BMO_op_finish(bm, &delop);
|
||||
@@ -457,7 +452,7 @@ void bmo_del_exec(BMesh *bm, BMOperator *op)
|
||||
#undef DEL_INPUT
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Spin Operator
|
||||
*
|
||||
* Extrude or duplicate geometry a number of times,
|
||||
@@ -469,9 +464,8 @@ void bmo_spin_exec(BMesh *bm, BMOperator *op)
|
||||
BMOperator dupop, extop;
|
||||
float cent[3], dvec[3];
|
||||
float axis[3] = {0.0f, 0.0f, 1.0f};
|
||||
float q[4];
|
||||
float rmat[3][3];
|
||||
float phi, si;
|
||||
float phi;
|
||||
int steps, do_dupli, a, usedvec;
|
||||
|
||||
BMO_slot_vec_get(op, "cent", cent);
|
||||
@@ -480,16 +474,10 @@ void bmo_spin_exec(BMesh *bm, BMOperator *op)
|
||||
BMO_slot_vec_get(op, "dvec", dvec);
|
||||
usedvec = !is_zero_v3(dvec);
|
||||
steps = BMO_slot_int_get(op, "steps");
|
||||
phi = BMO_slot_float_get(op, "ang") * (float)M_PI / (360.0f * steps);
|
||||
phi = BMO_slot_float_get(op, "ang") * DEG2RADF(1.0f) / steps;
|
||||
do_dupli = BMO_slot_bool_get(op, "do_dupli");
|
||||
|
||||
/* BMESH_TODO - can replace this with BLI_math? */
|
||||
si = (float)sin(phi);
|
||||
q[0] = (float)cos(phi);
|
||||
q[1] = axis[0] * si;
|
||||
q[2] = axis[1] * si;
|
||||
q[3] = axis[2] * si;
|
||||
quat_to_mat3(rmat, q);
|
||||
axis_angle_to_mat3(rmat, axis, phi);
|
||||
|
||||
BMO_slot_copy(op, op, "geom", "lastout");
|
||||
for (a = 0; a < steps; a++) {
|
||||
|
||||
@@ -116,46 +116,46 @@ void bmo_extrude_face_indiv_exec(BMesh *bm, BMOperator *op)
|
||||
static void bm_extrude_copy_face_loop_attributes(BMesh *bm, BMFace *f, BMEdge *e, BMEdge *newedge)
|
||||
{
|
||||
BMIter iter;
|
||||
BMLoop *l, *l2;
|
||||
|
||||
/* copy attribute */
|
||||
l = BM_iter_new(&iter, bm, BM_LOOPS_OF_FACE, f);
|
||||
for ( ; l; l = BM_iter_step(&iter)) {
|
||||
BMLoop *l, *l_other;
|
||||
|
||||
/* copy attributes */
|
||||
BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
|
||||
if (l->e != e && l->e != newedge) {
|
||||
continue;
|
||||
}
|
||||
|
||||
l2 = l->radial_next;
|
||||
l_other = l->radial_next;
|
||||
|
||||
if (l2 == l) {
|
||||
l2 = newedge->l;
|
||||
if (l_other == l) {
|
||||
l_other = newedge->l;
|
||||
|
||||
if (l2 != l) {
|
||||
BM_elem_attrs_copy(bm, bm, l2->f, l->f);
|
||||
if (l_other != l) {
|
||||
BM_elem_attrs_copy(bm, bm, l_other->f, f);
|
||||
BM_elem_flag_disable(f, BM_ELEM_HIDDEN); /* possibly we copy from a hidden face */
|
||||
|
||||
BM_elem_attrs_copy(bm, bm, l2, l);
|
||||
l2 = l2->next;
|
||||
BM_elem_attrs_copy(bm, bm, l_other, l);
|
||||
l_other = l_other->next;
|
||||
l = l->next;
|
||||
BM_elem_attrs_copy(bm, bm, l2, l);
|
||||
BM_elem_attrs_copy(bm, bm, l_other, l);
|
||||
}
|
||||
}
|
||||
else {
|
||||
BM_elem_attrs_copy(bm, bm, l2->f, l->f);
|
||||
BM_elem_attrs_copy(bm, bm, l_other->f, f);
|
||||
BM_elem_flag_disable(f, BM_ELEM_HIDDEN); /* possibly we copy from a hidden face */
|
||||
|
||||
/* copy dat */
|
||||
if (l2->v == l->v) {
|
||||
BM_elem_attrs_copy(bm, bm, l2, l);
|
||||
l2 = l2->next;
|
||||
/* copy data */
|
||||
if (l_other->v == l->v) {
|
||||
BM_elem_attrs_copy(bm, bm, l_other, l);
|
||||
l_other = l_other->next;
|
||||
l = l->next;
|
||||
BM_elem_attrs_copy(bm, bm, l2, l);
|
||||
BM_elem_attrs_copy(bm, bm, l_other, l);
|
||||
}
|
||||
else {
|
||||
l2 = l2->next;
|
||||
BM_elem_attrs_copy(bm, bm, l2, l);
|
||||
l2 = l2->prev;
|
||||
l_other = l_other->next;
|
||||
BM_elem_attrs_copy(bm, bm, l_other, l);
|
||||
l_other = l_other->prev;
|
||||
l = l->next;
|
||||
BM_elem_attrs_copy(bm, bm, l2, l);
|
||||
BM_elem_attrs_copy(bm, bm, l_other, l);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,11 +119,11 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
|
||||
int i, j, k;
|
||||
|
||||
if (use_outset == FALSE) {
|
||||
BM_mesh_elem_flag_disable_all(bm, BM_FACE, BM_ELEM_TAG);
|
||||
BM_mesh_elem_flag_disable_all(bm, BM_FACE, BM_ELEM_TAG, FALSE);
|
||||
BMO_slot_buffer_hflag_enable(bm, op, "faces", BM_FACE, BM_ELEM_TAG, FALSE);
|
||||
}
|
||||
else {
|
||||
BM_mesh_elem_flag_enable_all(bm, BM_FACE, BM_ELEM_TAG);
|
||||
BM_mesh_elem_flag_enable_all(bm, BM_FACE, BM_ELEM_TAG, FALSE);
|
||||
BMO_slot_buffer_hflag_disable(bm, op, "faces", BM_FACE, BM_ELEM_TAG, FALSE);
|
||||
}
|
||||
|
||||
@@ -187,6 +187,7 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
|
||||
edge_loop_tangent(es->e_new, es->l, es->no);
|
||||
|
||||
if (es->e_new == es->e_old) { /* happens on boundary edges */
|
||||
/* take care here, we're creating this double edge which _must_ have its verts replaced later on */
|
||||
es->e_old = BM_edge_create(bm, es->e_new->v1, es->e_new->v2, es->e_new, FALSE);
|
||||
}
|
||||
|
||||
@@ -254,7 +255,7 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
|
||||
/* find adjacent */
|
||||
BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v_split) {
|
||||
if (BM_elem_flag_test(e, BM_ELEM_TAG) &&
|
||||
BM_elem_flag_test(e->l->f, BM_ELEM_TAG))
|
||||
e->l && BM_elem_flag_test(e->l->f, BM_ELEM_TAG))
|
||||
{
|
||||
if (vert_edge_tag_tot < 2) {
|
||||
vecpair[vert_edge_tag_tot] = BM_elem_index_get(e);
|
||||
|
||||
@@ -1023,9 +1023,9 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
|
||||
|
||||
/* editmesh-emulating function */
|
||||
void BM_mesh_esubdivideflag(Object *UNUSED(obedit), BMesh *bm, int flag, float smooth,
|
||||
float fractal, int beauty, int numcuts,
|
||||
int seltype, int cornertype, int singleedge,
|
||||
int gridfill, int seed)
|
||||
float fractal, int beauty, int numcuts,
|
||||
int seltype, int cornertype, int singleedge,
|
||||
int gridfill, int seed)
|
||||
{
|
||||
BMOperator op;
|
||||
|
||||
@@ -1053,7 +1053,7 @@ void BM_mesh_esubdivideflag(Object *UNUSED(obedit), BMesh *bm, int flag, float s
|
||||
// int i;
|
||||
|
||||
/* deselect input */
|
||||
BM_mesh_elem_flag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT);
|
||||
BM_mesh_elem_flag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, FALSE);
|
||||
|
||||
ele = BMO_iter_new(&iter, bm, &op, "outinner", BM_EDGE|BM_VERT);
|
||||
for ( ; ele; ele = BMO_iter_step(&iter)) {
|
||||
@@ -1069,14 +1069,12 @@ void BM_mesh_esubdivideflag(Object *UNUSED(obedit), BMesh *bm, int flag, float s
|
||||
BM_elem_flag_test(e->v2, BM_ELEM_SELECT))
|
||||
{
|
||||
BM_elem_select_set(bm, e, TRUE);
|
||||
bm->totedgesel += 1;
|
||||
}
|
||||
else if (BM_elem_flag_test(e, BM_ELEM_SELECT) &&
|
||||
(!BM_elem_flag_test(e->v1, BM_ELEM_SELECT) ||
|
||||
!BM_elem_flag_test(e->v2, BM_ELEM_SELECT)))
|
||||
{
|
||||
BM_elem_select_set(bm, e, FALSE);
|
||||
bm->totedgesel -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -905,7 +905,7 @@ static BMesh *BME_bevel_initialize(BMesh *bm, int options, int UNUSED(defgrp_ind
|
||||
|
||||
BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
BMO_elem_flag_enable(bm, e, BME_BEVEL_ORIG);
|
||||
if (!BM_edge_is_manifold(e)) {
|
||||
if (!(BM_edge_is_boundary(e) || BM_edge_is_manifold(e))) {
|
||||
BMO_elem_flag_enable(bm, e->v1, BME_BEVEL_NONMAN);
|
||||
BMO_elem_flag_enable(bm, e->v2, BME_BEVEL_NONMAN);
|
||||
BMO_elem_flag_enable(bm, e, BME_BEVEL_NONMAN);
|
||||
|
||||
@@ -363,7 +363,10 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
|
||||
else {\
|
||||
filter_mode |= ANIMFILTER_TMP_PEEK; \
|
||||
} \
|
||||
(void) _doSubChannels;
|
||||
\
|
||||
{ \
|
||||
(void) _doSubChannels; \
|
||||
}
|
||||
/* ... standard sub-channel filtering can go on here now ... */
|
||||
#define END_ANIMFILTER_SUBCHANNELS \
|
||||
filter_mode = _filter; \
|
||||
@@ -968,7 +971,7 @@ static FCurve *animfilter_fcurve_next (bDopeSheet *ads, FCurve *first, bActionGr
|
||||
/* only work with this channel and its subchannels if it is editable */
|
||||
if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_FCU(fcu)) {
|
||||
/* only include this curve if selected in a way consistent with the filtering requirements */
|
||||
if ( ANIMCHANNEL_SELOK(SEL_FCU(fcu)) && ANIMCHANNEL_SELEDITOK(SEL_FCU(fcu)) ) {
|
||||
if (ANIMCHANNEL_SELOK(SEL_FCU(fcu)) && ANIMCHANNEL_SELEDITOK(SEL_FCU(fcu))) {
|
||||
/* only include if this curve is active */
|
||||
if (!(filter_mode & ANIMFILTER_ACTIVE) || (fcu->flag & FCURVE_ACTIVE)) {
|
||||
/* name based filtering... */
|
||||
@@ -1182,7 +1185,7 @@ static size_t animfilter_nla (bAnimContext *UNUSED(ac), ListBase *anim_data, bDo
|
||||
/* only work with this channel and its subchannels if it is editable */
|
||||
if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_NLT(nlt)) {
|
||||
/* only include this track if selected in a way consistent with the filtering requirements */
|
||||
if ( ANIMCHANNEL_SELOK(SEL_NLT(nlt)) ) {
|
||||
if (ANIMCHANNEL_SELOK(SEL_NLT(nlt))) {
|
||||
/* only include if this track is active */
|
||||
if (!(filter_mode & ANIMFILTER_ACTIVE) || (nlt->flag & NLATRACK_ACTIVE)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(nlt, ANIMTYPE_NLATRACK, owner_id);
|
||||
@@ -1362,7 +1365,7 @@ static size_t animdata_filter_ds_nodetree (bAnimContext *ac, ListBase *anim_data
|
||||
/* include data-expand widget first */
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
/* check if filtering by active status */
|
||||
if ANIMCHANNEL_ACTIVEOK(ntree) {
|
||||
if (ANIMCHANNEL_ACTIVEOK(ntree)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(ntree, ANIMTYPE_DSNTREE, owner_id);
|
||||
}
|
||||
}
|
||||
@@ -1495,7 +1498,7 @@ static size_t animdata_filter_ds_textures (bAnimContext *ac, ListBase *anim_data
|
||||
/* include texture-expand widget? */
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
/* check if filtering by active status */
|
||||
if ANIMCHANNEL_ACTIVEOK(tex) {
|
||||
if (ANIMCHANNEL_ACTIVEOK(tex)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(tex, ANIMTYPE_DSTEX, owner_id);
|
||||
}
|
||||
}
|
||||
@@ -1547,7 +1550,7 @@ static size_t animdata_filter_ds_materials (bAnimContext *ac, ListBase *anim_dat
|
||||
// hmm... do we need to store the index of this material in the array anywhere?
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
/* check if filtering by active status */
|
||||
if ANIMCHANNEL_ACTIVEOK(ma) {
|
||||
if (ANIMCHANNEL_ACTIVEOK(ma)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(ma, ANIMTYPE_DSMAT, ma);
|
||||
}
|
||||
}
|
||||
@@ -1589,7 +1592,7 @@ static size_t animdata_filter_ds_particles (bAnimContext *ac, ListBase *anim_dat
|
||||
/* include particle-expand widget first */
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
/* check if filtering by active status */
|
||||
if ANIMCHANNEL_ACTIVEOK(psys->part) {
|
||||
if (ANIMCHANNEL_ACTIVEOK(psys->part)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(psys->part, ANIMTYPE_DSPART, psys->part);
|
||||
}
|
||||
}
|
||||
@@ -1729,7 +1732,7 @@ static size_t animdata_filter_ds_obdata (bAnimContext *ac, ListBase *anim_data,
|
||||
/* include data-expand widget first */
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
/* check if filtering by active status */
|
||||
if ANIMCHANNEL_ACTIVEOK(iat) {
|
||||
if (ANIMCHANNEL_ACTIVEOK(iat)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(iat, type, iat);
|
||||
}
|
||||
}
|
||||
@@ -1763,7 +1766,7 @@ static size_t animdata_filter_ds_keyanim (bAnimContext *ac, ListBase *anim_data,
|
||||
if (tmp_items) {
|
||||
/* include key-expand widget first */
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
if ANIMCHANNEL_ACTIVEOK(key) {
|
||||
if (ANIMCHANNEL_ACTIVEOK(key)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(key, ANIMTYPE_DSSKEY, ob);
|
||||
}
|
||||
}
|
||||
@@ -1880,7 +1883,7 @@ static size_t animdata_filter_dopesheet_ob (bAnimContext *ac, ListBase *anim_dat
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
/* check if filtering by selection */
|
||||
// XXX: double-check on this - most of the time, a lot of tools need to filter out these channels!
|
||||
if ANIMCHANNEL_SELOK((base->flag & SELECT)) {
|
||||
if (ANIMCHANNEL_SELOK((base->flag & SELECT))) {
|
||||
/* check if filtering by active status */
|
||||
if (ANIMCHANNEL_ACTIVEOK(ob)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(base, ANIMTYPE_OBJECT, ob);
|
||||
@@ -1925,7 +1928,7 @@ static size_t animdata_filter_ds_world (bAnimContext *ac, ListBase *anim_data, b
|
||||
/* include data-expand widget first */
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
/* check if filtering by active status */
|
||||
if ANIMCHANNEL_ACTIVEOK(wo) {
|
||||
if (ANIMCHANNEL_ACTIVEOK(wo)) {
|
||||
ANIMCHANNEL_NEW_CHANNEL(wo, ANIMTYPE_DSWOR, sce);
|
||||
}
|
||||
}
|
||||
@@ -2035,7 +2038,7 @@ static size_t animdata_filter_dopesheet_scene (bAnimContext *ac, ListBase *anim_
|
||||
/* firstly add object expander if required */
|
||||
if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
|
||||
/* check if filtering by selection */
|
||||
if ANIMCHANNEL_SELOK((sce->flag & SCE_DS_SELECTED)) {
|
||||
if (ANIMCHANNEL_SELOK((sce->flag & SCE_DS_SELECTED))) {
|
||||
/* NOTE: active-status doesn't matter for this! */
|
||||
ANIMCHANNEL_NEW_CHANNEL(sce, ANIMTYPE_SCENE, sce);
|
||||
}
|
||||
|
||||
@@ -407,8 +407,30 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
}
|
||||
else { /* direction == BONE_SELECT_CHILD */
|
||||
|
||||
/* the child member is only assigned to connected bones, see [#30340] */
|
||||
#if 0
|
||||
if (pchan->child == NULL) continue;
|
||||
else chbone = pchan->child->bone;
|
||||
#else
|
||||
/* instead. find _any_ visible child bone, using the first one is a little arbitrary - campbell */
|
||||
chbone = pchan->child ? pchan->child->bone : NULL;
|
||||
if (chbone == NULL) {
|
||||
bPoseChannel *pchan_child;
|
||||
|
||||
for (pchan_child = ob->pose->chanbase.first; pchan_child; pchan_child = pchan_child->next) {
|
||||
/* possible we have multiple children, some invisible */
|
||||
if (PBONE_VISIBLE(arm, pchan_child->bone)) {
|
||||
if (pchan_child->parent == pchan) {
|
||||
chbone = pchan_child->bone;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (chbone == NULL) continue;
|
||||
#endif
|
||||
|
||||
if (PBONE_VISIBLE(arm, chbone)) {
|
||||
if (!add_to_sel) curbone->flag &= ~BONE_SELECTED;
|
||||
|
||||
@@ -4378,6 +4378,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
|
||||
BPoint *bp, *newbp = NULL;
|
||||
float imat[4][4], temp[3];
|
||||
int ok= 0;
|
||||
BezTriple *bezt_recalc[3] = {NULL};
|
||||
|
||||
invert_m4_m4(imat, obedit->obmat);
|
||||
|
||||
@@ -4471,9 +4472,14 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
|
||||
newbezt+= nu->pntsu;
|
||||
BEZ_SEL(newbezt);
|
||||
cu->lastsel= newbezt;
|
||||
newbezt->h2= newbezt->h1;
|
||||
newbezt->h1 = newbezt->h2;
|
||||
bezt= nu->bezt+nu->pntsu-1;
|
||||
ok= 1;
|
||||
|
||||
if (nu->pntsu > 1) {
|
||||
bezt_recalc[1] = newbezt;
|
||||
bezt_recalc[0] = newbezt - 1;
|
||||
}
|
||||
}
|
||||
else if (bezt== nu->bezt) { /* first */
|
||||
BEZ_DESEL(bezt);
|
||||
@@ -4489,6 +4495,11 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
|
||||
nu->bezt= newbezt;
|
||||
bezt= newbezt+1;
|
||||
ok= 1;
|
||||
|
||||
if (nu->pntsu > 1) {
|
||||
bezt_recalc[1] = newbezt;
|
||||
bezt_recalc[2] = newbezt + 1;
|
||||
}
|
||||
}
|
||||
else if (mode!='e') {
|
||||
BEZ_DESEL(bezt);
|
||||
@@ -4523,8 +4534,19 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
|
||||
else {
|
||||
mul_v3_m4v3(newbezt->vec[1], imat, location);
|
||||
sub_v3_v3v3(temp, newbezt->vec[1],temp);
|
||||
add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp);
|
||||
add_v3_v3v3(newbezt->vec[2], bezt->vec[2],temp);
|
||||
|
||||
if (bezt_recalc[1]) {
|
||||
const char h1 = bezt_recalc[1]->h1, h2 = bezt_recalc[1]->h2;
|
||||
bezt_recalc[1]->h1 = bezt_recalc[1]->h2 = HD_AUTO;
|
||||
calchandleNurb(bezt_recalc[1], bezt_recalc[0], bezt_recalc[2], 0);
|
||||
bezt_recalc[1]->h1 = h1;
|
||||
bezt_recalc[1]->h2 = h2;
|
||||
}
|
||||
else {
|
||||
add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp);
|
||||
add_v3_v3v3(newbezt->vec[2], bezt->vec[2],temp);
|
||||
}
|
||||
|
||||
|
||||
if (newnu) calchandlesNurb(newnu);
|
||||
else calchandlesNurb(nu);
|
||||
|
||||
@@ -48,6 +48,7 @@ struct wmWindowManager;
|
||||
struct wmOperator;
|
||||
struct AutoComplete;
|
||||
struct bContext;
|
||||
struct bContextStore;
|
||||
struct Panel;
|
||||
struct PanelType;
|
||||
struct PointerRNA;
|
||||
@@ -692,6 +693,7 @@ uiBlock *uiLayoutGetBlock(uiLayout *layout);
|
||||
|
||||
void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
|
||||
void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr);
|
||||
void uiLayoutContextCopy(uiLayout *layout, struct bContextStore *context);
|
||||
const char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
|
||||
void uiLayoutOperatorButs(const struct bContext *C, struct uiLayout *layout, struct wmOperator *op, int (*check_prop)(struct PointerRNA *, struct PropertyRNA *), const char label_align, const short flag);
|
||||
struct MenuType *uiButGetMenuType(uiBut *but);
|
||||
|
||||
@@ -2722,6 +2722,12 @@ void uiLayoutSetContextPointer(uiLayout *layout, const char *name, PointerRNA *p
|
||||
layout->context = CTX_store_add(&block->contexts, name, ptr);
|
||||
}
|
||||
|
||||
void uiLayoutContextCopy(uiLayout *layout, bContextStore *context)
|
||||
{
|
||||
uiBlock *block= layout->root->block;
|
||||
layout->context= CTX_store_add_all(&block->contexts, context);
|
||||
}
|
||||
|
||||
|
||||
/* introspect funcs */
|
||||
#include "BLI_dynstr.h"
|
||||
|
||||
@@ -2404,16 +2404,18 @@ uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut
|
||||
/* some enums reversing is strange, currently we have no good way to
|
||||
* reverse some enum's but not others, so reverse all so the first menu
|
||||
* items are always close to the mouse cursor */
|
||||
#if 0
|
||||
else {
|
||||
#if 0
|
||||
/* if this is an rna button then we can assume its an enum
|
||||
* flipping enums is generally not good since the order can be
|
||||
* important [#28786] */
|
||||
if (but->rnaprop && RNA_property_type(but->rnaprop) == PROP_ENUM) {
|
||||
pup->block->flag |= UI_BLOCK_NO_FLIP;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (but->context)
|
||||
uiLayoutContextCopy(pup->layout, but->context);
|
||||
}
|
||||
|
||||
if (str) {
|
||||
/* menu is created from a string */
|
||||
|
||||
@@ -163,26 +163,26 @@ static int facesel_face_pick(struct bContext *C, Mesh *me, Object *ob, const int
|
||||
void paintface_hide(Object *ob, const int unselected)
|
||||
{
|
||||
Mesh *me;
|
||||
MPoly *mface;
|
||||
MPoly *mpoly;
|
||||
int a;
|
||||
|
||||
me = get_mesh(ob);
|
||||
if (me == NULL || me->totpoly == 0) return;
|
||||
|
||||
mface = me->mpoly;
|
||||
mpoly = me->mpoly;
|
||||
a = me->totpoly;
|
||||
while (a--) {
|
||||
if ((mface->flag & ME_HIDE) == 0) {
|
||||
if ((mpoly->flag & ME_HIDE) == 0) {
|
||||
if (unselected) {
|
||||
if ( (mface->flag & ME_FACE_SEL) == 0) mface->flag |= ME_HIDE;
|
||||
if ( (mpoly->flag & ME_FACE_SEL) == 0) mpoly->flag |= ME_HIDE;
|
||||
}
|
||||
else {
|
||||
if ( (mface->flag & ME_FACE_SEL)) mface->flag |= ME_HIDE;
|
||||
if ( (mpoly->flag & ME_FACE_SEL)) mpoly->flag |= ME_HIDE;
|
||||
}
|
||||
}
|
||||
if (mface->flag & ME_HIDE) mface->flag &= ~ME_FACE_SEL;
|
||||
if (mpoly->flag & ME_HIDE) mpoly->flag &= ~ME_FACE_SEL;
|
||||
|
||||
mface++;
|
||||
mpoly++;
|
||||
}
|
||||
|
||||
paintface_flush_flags(ob);
|
||||
@@ -192,20 +192,20 @@ void paintface_hide(Object *ob, const int unselected)
|
||||
void paintface_reveal(Object *ob)
|
||||
{
|
||||
Mesh *me;
|
||||
MPoly *mface;
|
||||
MPoly *mpoly;
|
||||
int a;
|
||||
|
||||
me = get_mesh(ob);
|
||||
if (me == NULL || me->totpoly == 0) return;
|
||||
|
||||
mface = me->mpoly;
|
||||
mpoly = me->mpoly;
|
||||
a = me->totpoly;
|
||||
while (a--) {
|
||||
if (mface->flag & ME_HIDE) {
|
||||
mface->flag |= ME_FACE_SEL;
|
||||
mface->flag -= ME_HIDE;
|
||||
if (mpoly->flag & ME_HIDE) {
|
||||
mpoly->flag |= ME_FACE_SEL;
|
||||
mpoly->flag -= ME_HIDE;
|
||||
}
|
||||
mface++;
|
||||
mpoly++;
|
||||
}
|
||||
|
||||
paintface_flush_flags(ob);
|
||||
@@ -227,7 +227,7 @@ static void hash_add_face(EdgeHash *ehash, MPoly *mp, MLoop *mloop)
|
||||
static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
|
||||
{
|
||||
EdgeHash *ehash, *seamhash;
|
||||
MPoly *mf;
|
||||
MPoly *mp;
|
||||
MLoop *ml;
|
||||
MEdge *med;
|
||||
char *linkflag;
|
||||
@@ -243,17 +243,17 @@ static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int ind
|
||||
|
||||
if (mode == 0 || mode == 1) {
|
||||
/* only put face under cursor in array */
|
||||
mf = ((MPoly *)me->mpoly) + index;
|
||||
hash_add_face(ehash, mf, me->mloop + mf->loopstart);
|
||||
mp = ((MPoly *)me->mpoly) + index;
|
||||
hash_add_face(ehash, mp, me->mloop + mp->loopstart);
|
||||
linkflag[index] = 1;
|
||||
}
|
||||
else {
|
||||
/* fill array by selection */
|
||||
mf = me->mpoly;
|
||||
for (a = 0; a < me->totpoly; a++, mf++) {
|
||||
if (mf->flag & ME_HIDE) ;
|
||||
else if (mf->flag & ME_FACE_SEL) {
|
||||
hash_add_face(ehash, mf, me->mloop + mf->loopstart);
|
||||
mp = me->mpoly;
|
||||
for (a = 0; a < me->totpoly; a++, mp++) {
|
||||
if (mp->flag & ME_HIDE) ;
|
||||
else if (mp->flag & ME_FACE_SEL) {
|
||||
hash_add_face(ehash, mp, me->mloop + mp->loopstart);
|
||||
linkflag[a] = 1;
|
||||
}
|
||||
}
|
||||
@@ -263,18 +263,18 @@ static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int ind
|
||||
doit = 0;
|
||||
|
||||
/* expand selection */
|
||||
mf = me->mpoly;
|
||||
for (a = 0; a < me->totpoly; a++, mf++) {
|
||||
if (mf->flag & ME_HIDE)
|
||||
mp = me->mpoly;
|
||||
for (a = 0; a < me->totpoly; a++, mp++) {
|
||||
if (mp->flag & ME_HIDE)
|
||||
continue;
|
||||
|
||||
if (!linkflag[a]) {
|
||||
MLoop *mnextl;
|
||||
mark = 0;
|
||||
|
||||
ml = me->mloop + mf->loopstart;
|
||||
for (b = 0; b < mf->totloop; b++, ml++) {
|
||||
mnextl = b < mf->totloop - 1 ? ml - 1 : me->mloop + mf->loopstart;
|
||||
ml = me->mloop + mp->loopstart;
|
||||
for (b = 0; b < mp->totloop; b++, ml++) {
|
||||
mnextl = b < mp->totloop - 1 ? ml - 1 : me->mloop + mp->loopstart;
|
||||
if (!BLI_edgehash_haskey(seamhash, ml->v, mnextl->v))
|
||||
if (!BLI_edgehash_haskey(ehash, ml->v, mnextl->v))
|
||||
mark = 1;
|
||||
@@ -282,7 +282,7 @@ static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int ind
|
||||
|
||||
if (mark) {
|
||||
linkflag[a] = 1;
|
||||
hash_add_face(ehash, mf, me->mloop + mf->loopstart);
|
||||
hash_add_face(ehash, mp, me->mloop + mp->loopstart);
|
||||
doit = 1;
|
||||
}
|
||||
}
|
||||
@@ -294,26 +294,26 @@ static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int ind
|
||||
BLI_edgehash_free(seamhash, NULL);
|
||||
|
||||
if (mode == 0 || mode == 2) {
|
||||
for (a = 0, mf = me->mpoly; a < me->totpoly; a++, mf++)
|
||||
for (a = 0, mp = me->mpoly; a < me->totpoly; a++, mp++)
|
||||
if (linkflag[a])
|
||||
mf->flag |= ME_FACE_SEL;
|
||||
mp->flag |= ME_FACE_SEL;
|
||||
else
|
||||
mf->flag &= ~ME_FACE_SEL;
|
||||
mp->flag &= ~ME_FACE_SEL;
|
||||
}
|
||||
else if (mode == 1) {
|
||||
for (a = 0, mf = me->mpoly; a < me->totpoly; a++, mf++)
|
||||
if (linkflag[a] && (mf->flag & ME_FACE_SEL))
|
||||
for (a = 0, mp = me->mpoly; a < me->totpoly; a++, mp++)
|
||||
if (linkflag[a] && (mp->flag & ME_FACE_SEL))
|
||||
break;
|
||||
|
||||
if (a < me->totpoly) {
|
||||
for (a = 0, mf = me->mpoly; a < me->totpoly; a++, mf++)
|
||||
for (a = 0, mp = me->mpoly; a < me->totpoly; a++, mp++)
|
||||
if (linkflag[a])
|
||||
mf->flag &= ~ME_FACE_SEL;
|
||||
mp->flag &= ~ME_FACE_SEL;
|
||||
}
|
||||
else {
|
||||
for (a = 0, mf = me->mpoly; a < me->totpoly; a++, mf++)
|
||||
for (a = 0, mp = me->mpoly; a < me->totpoly; a++, mp++)
|
||||
if (linkflag[a])
|
||||
mf->flag |= ME_FACE_SEL;
|
||||
mp->flag |= ME_FACE_SEL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,54 +344,54 @@ void paintface_select_linked(bContext *UNUSED(C), Object *ob, int UNUSED(mval[2]
|
||||
void paintface_deselect_all_visible(Object *ob, int action, short flush_flags)
|
||||
{
|
||||
Mesh *me;
|
||||
MPoly *mface;
|
||||
MPoly *mpoly;
|
||||
int a;
|
||||
|
||||
me = get_mesh(ob);
|
||||
if (me == NULL) return;
|
||||
|
||||
if (action == SEL_INVERT) {
|
||||
mface = me->mpoly;
|
||||
mpoly = me->mpoly;
|
||||
a = me->totpoly;
|
||||
while (a--) {
|
||||
if ((mface->flag & ME_HIDE) == 0) {
|
||||
mface->flag ^= ME_FACE_SEL;
|
||||
if ((mpoly->flag & ME_HIDE) == 0) {
|
||||
mpoly->flag ^= ME_FACE_SEL;
|
||||
}
|
||||
mface++;
|
||||
mpoly++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (action == SEL_TOGGLE) {
|
||||
action = SEL_SELECT;
|
||||
|
||||
mface = me->mpoly;
|
||||
mpoly = me->mpoly;
|
||||
a = me->totpoly;
|
||||
while (a--) {
|
||||
if ((mface->flag & ME_HIDE) == 0 && mface->flag & ME_FACE_SEL) {
|
||||
if ((mpoly->flag & ME_HIDE) == 0 && mpoly->flag & ME_FACE_SEL) {
|
||||
action = SEL_DESELECT;
|
||||
break;
|
||||
}
|
||||
mface++;
|
||||
mpoly++;
|
||||
}
|
||||
}
|
||||
|
||||
mface = me->mpoly;
|
||||
mpoly = me->mpoly;
|
||||
a = me->totpoly;
|
||||
while (a--) {
|
||||
if ((mface->flag & ME_HIDE) == 0) {
|
||||
if ((mpoly->flag & ME_HIDE) == 0) {
|
||||
switch (action) {
|
||||
case SEL_SELECT:
|
||||
mface->flag |= ME_FACE_SEL;
|
||||
mpoly->flag |= ME_FACE_SEL;
|
||||
break;
|
||||
case SEL_DESELECT:
|
||||
mface->flag &= ~ME_FACE_SEL;
|
||||
mpoly->flag &= ~ME_FACE_SEL;
|
||||
break;
|
||||
case SEL_INVERT:
|
||||
mface->flag ^= ME_FACE_SEL;
|
||||
mpoly->flag ^= ME_FACE_SEL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
mface++;
|
||||
mpoly++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -403,7 +403,7 @@ void paintface_deselect_all_visible(Object *ob, int action, short flush_flags)
|
||||
int paintface_minmax(Object *ob, float *min, float *max)
|
||||
{
|
||||
Mesh *me;
|
||||
MPoly *mf;
|
||||
MPoly *mp;
|
||||
MTexPoly *tf;
|
||||
MLoop *ml;
|
||||
MVert *mvert;
|
||||
@@ -416,14 +416,14 @@ int paintface_minmax(Object *ob, float *min, float *max)
|
||||
copy_m3_m4(bmat, ob->obmat);
|
||||
|
||||
mvert = me->mvert;
|
||||
mf = me->mpoly;
|
||||
mp = me->mpoly;
|
||||
tf = me->mtpoly;
|
||||
for (a = me->totpoly; a > 0; a--, mf++, tf++) {
|
||||
if (mf->flag & ME_HIDE || !(mf->flag & ME_FACE_SEL))
|
||||
for (a = me->totpoly; a > 0; a--, mp++, tf++) {
|
||||
if (mp->flag & ME_HIDE || !(mp->flag & ME_FACE_SEL))
|
||||
continue;
|
||||
|
||||
ml = me->mloop + mf->totloop;
|
||||
for (b = 0; b < mf->totloop; b++, ml++) {
|
||||
ml = me->mloop + mp->totloop;
|
||||
for (b = 0; b < mp->totloop; b++, ml++) {
|
||||
copy_v3_v3(vec, (mvert[ml->v].co));
|
||||
mul_m3_v3(bmat, vec);
|
||||
add_v3_v3v3(vec, vec, ob->obmat[3]);
|
||||
@@ -438,14 +438,14 @@ int paintface_minmax(Object *ob, float *min, float *max)
|
||||
|
||||
/* *************************************** */
|
||||
#if 0
|
||||
static void seam_edgehash_insert_face(EdgeHash *ehash, MPoly *mf, MLoop *loopstart)
|
||||
static void seam_edgehash_insert_face(EdgeHash *ehash, MPoly *mp, MLoop *loopstart)
|
||||
{
|
||||
MLoop *ml1, *ml2;
|
||||
int a;
|
||||
|
||||
for (a = 0; a < mf->totloop; a++) {
|
||||
for (a = 0; a < mp->totloop; a++) {
|
||||
ml1 = loopstart + a;
|
||||
ml2 = loopstart + (a + 1) % mf->totloop;
|
||||
ml2 = loopstart + (a + 1) % mp->totloop;
|
||||
|
||||
BLI_edgehash_insert(ehash, ml1->v, ml2->v, NULL);
|
||||
}
|
||||
@@ -454,7 +454,7 @@ static void seam_edgehash_insert_face(EdgeHash *ehash, MPoly *mf, MLoop *loopsta
|
||||
void seam_mark_clear_tface(Scene *scene, short mode)
|
||||
{
|
||||
Mesh *me;
|
||||
MPoly *mf;
|
||||
MPoly *mp;
|
||||
MLoop *ml1, *ml2;
|
||||
MEdge *med;
|
||||
int a, b;
|
||||
@@ -471,9 +471,9 @@ void seam_mark_clear_tface(Scene *scene, short mode)
|
||||
if (mode == 2) {
|
||||
EdgeHash *ehash = BLI_edgehash_new();
|
||||
|
||||
for (a = 0, mf = me->mpoly; a < me->totpoly; a++, mf++)
|
||||
if (!(mf->flag & ME_HIDE) && (mf->flag & ME_FACE_SEL))
|
||||
seam_edgehash_insert_face(ehash, mf, me->mloop + mf->loopstart);
|
||||
for (a = 0, mp = me->mpoly; a < me->totpoly; a++, mp++)
|
||||
if (!(mp->flag & ME_HIDE) && (mp->flag & ME_FACE_SEL))
|
||||
seam_edgehash_insert_face(ehash, mp, me->mloop + mp->loopstart);
|
||||
|
||||
for (a = 0, med = me->medge; a < me->totedge; a++, med++)
|
||||
if (BLI_edgehash_haskey(ehash, med->v1, med->v2))
|
||||
@@ -486,11 +486,11 @@ void seam_mark_clear_tface(Scene *scene, short mode)
|
||||
EdgeHash *ehash1 = BLI_edgehash_new();
|
||||
EdgeHash *ehash2 = BLI_edgehash_new();
|
||||
|
||||
for (a = 0, mf = me->mpoly; a < me->totpoly; a++, mf++) {
|
||||
if ((mf->flag & ME_HIDE) || !(mf->flag & ME_FACE_SEL))
|
||||
seam_edgehash_insert_face(ehash1, mf, me->mloop + mf->loopstart);
|
||||
for (a = 0, mp = me->mpoly; a < me->totpoly; a++, mp++) {
|
||||
if ((mp->flag & ME_HIDE) || !(mp->flag & ME_FACE_SEL))
|
||||
seam_edgehash_insert_face(ehash1, mp, me->mloop + mp->loopstart);
|
||||
else
|
||||
seam_edgehash_insert_face(ehash2, mf, me->mloop + mf->loopstart);
|
||||
seam_edgehash_insert_face(ehash2, mp, me->mloop + mp->loopstart);
|
||||
}
|
||||
|
||||
for (a = 0, med = me->medge; a < me->totedge; a++, med++)
|
||||
@@ -512,7 +512,7 @@ void seam_mark_clear_tface(Scene *scene, short mode)
|
||||
int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], int extend)
|
||||
{
|
||||
Mesh *me;
|
||||
MPoly *mface, *msel;
|
||||
MPoly *mpoly, *mpoly_sel;
|
||||
unsigned int a, index;
|
||||
|
||||
/* Get the face under the cursor */
|
||||
@@ -524,28 +524,28 @@ int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], in
|
||||
if (index >= me->totpoly || index < 0)
|
||||
return 0;
|
||||
|
||||
msel = me->mpoly + index;
|
||||
if (msel->flag & ME_HIDE) return 0;
|
||||
mpoly_sel = me->mpoly + index;
|
||||
if (mpoly_sel->flag & ME_HIDE) return 0;
|
||||
|
||||
/* clear flags */
|
||||
mface = me->mpoly;
|
||||
mpoly = me->mpoly;
|
||||
a = me->totpoly;
|
||||
if (!extend) {
|
||||
while (a--) {
|
||||
mface->flag &= ~ME_FACE_SEL;
|
||||
mface++;
|
||||
mpoly->flag &= ~ME_FACE_SEL;
|
||||
mpoly++;
|
||||
}
|
||||
}
|
||||
|
||||
me->act_face = (int)index;
|
||||
|
||||
if (extend) {
|
||||
if (msel->flag & ME_FACE_SEL)
|
||||
msel->flag &= ~ME_FACE_SEL;
|
||||
if (mpoly_sel->flag & ME_FACE_SEL)
|
||||
mpoly_sel->flag &= ~ME_FACE_SEL;
|
||||
else
|
||||
msel->flag |= ME_FACE_SEL;
|
||||
mpoly_sel->flag |= ME_FACE_SEL;
|
||||
}
|
||||
else msel->flag |= ME_FACE_SEL;
|
||||
else mpoly_sel->flag |= ME_FACE_SEL;
|
||||
|
||||
/* image window redraw */
|
||||
|
||||
@@ -559,7 +559,7 @@ int do_paintface_box_select(ViewContext *vc, rcti *rect, int select, int extend)
|
||||
{
|
||||
Object *ob = vc->obact;
|
||||
Mesh *me;
|
||||
MPoly *mface;
|
||||
MPoly *mpoly;
|
||||
struct ImBuf *ibuf;
|
||||
unsigned int *rt;
|
||||
char *selar;
|
||||
@@ -577,10 +577,10 @@ int do_paintface_box_select(ViewContext *vc, rcti *rect, int select, int extend)
|
||||
if (extend == 0 && select) {
|
||||
paintface_deselect_all_visible(vc->obact, SEL_DESELECT, FALSE);
|
||||
|
||||
mface = me->mpoly;
|
||||
for (a = 1; a <= me->totpoly; a++, mface++) {
|
||||
if ((mface->flag & ME_HIDE) == 0)
|
||||
mface->flag &= ~ME_FACE_SEL;
|
||||
mpoly = me->mpoly;
|
||||
for (a = 1; a <= me->totpoly; a++, mpoly++) {
|
||||
if ((mpoly->flag & ME_HIDE) == 0)
|
||||
mpoly->flag &= ~ME_FACE_SEL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -600,13 +600,13 @@ int do_paintface_box_select(ViewContext *vc, rcti *rect, int select, int extend)
|
||||
rt++;
|
||||
}
|
||||
|
||||
mface = me->mpoly;
|
||||
for (a = 1; a <= me->totpoly; a++, mface++) {
|
||||
mpoly = me->mpoly;
|
||||
for (a = 1; a <= me->totpoly; a++, mpoly++) {
|
||||
if (selar[a]) {
|
||||
if (mface->flag & ME_HIDE) ;
|
||||
if (mpoly->flag & ME_HIDE) ;
|
||||
else {
|
||||
if (select) mface->flag |= ME_FACE_SEL;
|
||||
else mface->flag &= ~ME_FACE_SEL;
|
||||
if (select) mpoly->flag |= ME_FACE_SEL;
|
||||
else mpoly->flag &= ~ME_FACE_SEL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
|
||||
if (select) {
|
||||
BMW_init(&walker, em->bm, BMW_EDGERING,
|
||||
BMW_MASK_NOP, BMW_MASK_NOP, BMW_MASK_NOP,
|
||||
BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
|
||||
BMW_FLAG_TEST_HIDDEN,
|
||||
BMW_NIL_LAY);
|
||||
|
||||
eed = BMW_begin(&walker, startedge);
|
||||
@@ -220,7 +220,7 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
|
||||
|
||||
BMW_init(&walker, em->bm, BMW_EDGERING,
|
||||
BMW_MASK_NOP, BMW_MASK_NOP, BMW_MASK_NOP,
|
||||
BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
|
||||
BMW_FLAG_TEST_HIDDEN,
|
||||
BMW_NIL_LAY);
|
||||
|
||||
eed = startedge = BMW_begin(&walker, startedge);
|
||||
@@ -240,6 +240,8 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
|
||||
edgering_find_order(em, lasteed, eed, lastv1, v);
|
||||
lastv1 = v[0][0];
|
||||
|
||||
BLI_array_growitems(edges, previewlines);
|
||||
|
||||
for (i = 1; i <= previewlines; i++) {
|
||||
co[0][0] = (v[0][1]->co[0] - v[0][0]->co[0]) * (i / ((float)previewlines + 1)) + v[0][0]->co[0];
|
||||
co[0][1] = (v[0][1]->co[1] - v[0][0]->co[1]) * (i / ((float)previewlines + 1)) + v[0][0]->co[1];
|
||||
@@ -249,7 +251,6 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
|
||||
co[1][1] = (v[1][1]->co[1] - v[1][0]->co[1]) * (i / ((float)previewlines + 1)) + v[1][0]->co[1];
|
||||
co[1][2] = (v[1][1]->co[2] - v[1][0]->co[2]) * (i / ((float)previewlines + 1)) + v[1][0]->co[2];
|
||||
|
||||
BLI_array_growone(edges);
|
||||
copy_v3_v3(edges[tot][0], co[0]);
|
||||
copy_v3_v3(edges[tot][1], co[1]);
|
||||
tot++;
|
||||
@@ -264,6 +265,8 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
|
||||
|
||||
edgering_find_order(em, lasteed, startedge, lastv1, v);
|
||||
|
||||
BLI_array_growitems(edges, previewlines);
|
||||
|
||||
for (i = 1; i <= previewlines; i++) {
|
||||
if (!v[0][0] || !v[0][1] || !v[1][0] || !v[1][1])
|
||||
continue;
|
||||
@@ -276,7 +279,6 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
|
||||
co[1][1] = (v[1][1]->co[1] - v[1][0]->co[1]) * (i / ((float)previewlines + 1)) + v[1][0]->co[1];
|
||||
co[1][2] = (v[1][1]->co[2] - v[1][0]->co[2]) * (i / ((float)previewlines + 1)) + v[1][0]->co[2];
|
||||
|
||||
BLI_array_growone(edges);
|
||||
copy_v3_v3(edges[tot][0], co[0]);
|
||||
copy_v3_v3(edges[tot][1], co[1]);
|
||||
tot++;
|
||||
|
||||
@@ -1509,12 +1509,13 @@ int mouse_mesh(bContext *C, const int mval[2], short extend)
|
||||
|
||||
EDBM_selectmode_flush(vc.em);
|
||||
|
||||
// if (EM_texFaceCheck()) {
|
||||
|
||||
/* change active material on object */
|
||||
if (efa && efa->mat_nr != vc.obedit->actcol - 1) {
|
||||
vc.obedit->actcol = efa->mat_nr + 1;
|
||||
vc.em->mat_nr = efa->mat_nr;
|
||||
// BIF_preview_changed(ID_MA);
|
||||
|
||||
WM_event_add_notifier(C, NC_MATERIAL|ND_SHADING, NULL);
|
||||
|
||||
}
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit);
|
||||
@@ -1928,7 +1929,7 @@ static int edbm_select_linked_exec(bContext *C, wmOperator *op)
|
||||
|
||||
BMW_init(&walker, em->bm, BMW_SHELL,
|
||||
BMW_MASK_NOP, BMW_MASK_NOP, BMW_MASK_NOP,
|
||||
BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
|
||||
BMW_FLAG_TEST_HIDDEN,
|
||||
BMW_NIL_LAY);
|
||||
|
||||
BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
|
||||
|
||||
@@ -658,9 +658,10 @@ static int edbm_select_all_exec(bContext *C, wmOperator *op)
|
||||
break;
|
||||
case SEL_INVERT:
|
||||
EDBM_select_swap(em);
|
||||
EDBM_selectmode_flush(em);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
@@ -2132,6 +2133,8 @@ static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *c
|
||||
return dist_to_line_segment_v2(mvalf, vec1, vec2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* based on mouse cursor position, it defines how is being ripped */
|
||||
static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
@@ -2174,6 +2177,7 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
* then rip two adjacent edges in the vert fan. */
|
||||
if (bm->totvertsel == 1 && bm->totedgesel == 0 && bm->totfacesel == 0) {
|
||||
BMEditSelection ese;
|
||||
int totboundary_edge = 0;
|
||||
singlesel = TRUE;
|
||||
|
||||
/* find selected vert - same some time and check history first */
|
||||
@@ -2196,17 +2200,93 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
if (v->e) {
|
||||
/* find closest edge to mouse cursor */
|
||||
BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
|
||||
if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN) && BM_edge_face_count(e) == 2) {
|
||||
d = mesh_rip_edgedist(ar, projectMat, e->v1->co, e->v2->co, fmval);
|
||||
if (d < dist) {
|
||||
dist = d;
|
||||
e2 = e;
|
||||
int is_boundary = BM_edge_is_boundary(e);
|
||||
/* consider wire as boundary for this purpose,
|
||||
* otherwise we can't a face away from a wire edge */
|
||||
totboundary_edge += (is_boundary != 0 || BM_edge_is_wire(e));
|
||||
if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN)) {
|
||||
if (is_boundary == FALSE && BM_edge_face_count(e) == 2) {
|
||||
d = mesh_rip_edgedist(ar, projectMat, e->v1->co, e->v2->co, fmval);
|
||||
if (d < dist) {
|
||||
dist = d;
|
||||
e2 = e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* should we go ahead with edge rip or do we need to do special case, split off vertex?:
|
||||
* split off vertex if...
|
||||
* - we cant find an edge - this means we are ripping a faces vert that is connected to other
|
||||
* geometry only at the vertex.
|
||||
* - the boundary edge total is greater then 2,
|
||||
* in this case edge split _can_ work but we get far nicer results if we use this special case. */
|
||||
if (totboundary_edge > 2) {
|
||||
BMVert **vout;
|
||||
int vout_len;
|
||||
|
||||
BM_elem_select_set(bm, v, FALSE);
|
||||
bmesh_vert_separate(bm, v, &vout, &vout_len);
|
||||
|
||||
if (vout_len < 2) {
|
||||
/* should never happen */
|
||||
BKE_report(op->reports, RPT_ERROR, "Error ripping vertex from faces");
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
else {
|
||||
int vi_best = 0;
|
||||
|
||||
dist = FLT_MAX;
|
||||
|
||||
for (i = 0; i < vout_len; i++) {
|
||||
BM_ITER(l, &iter, bm, BM_LOOPS_OF_VERT, vout[i]) {
|
||||
if (!BM_elem_flag_test(l->f, BM_ELEM_HIDDEN)) {
|
||||
float l_mid_co[3];
|
||||
BM_loop_face_tangent(l, l_mid_co);
|
||||
|
||||
/* scale to average of surrounding edge size, only needs to be approx */
|
||||
mul_v3_fl(l_mid_co, (BM_edge_length_calc(l->e) + BM_edge_length_calc(l->prev->e)) / 2.0f);
|
||||
add_v3_v3(l_mid_co, v->co);
|
||||
|
||||
d = mesh_rip_edgedist(ar, projectMat, v->co, l_mid_co, fmval);
|
||||
|
||||
if (d < dist) {
|
||||
dist = d;
|
||||
vi_best = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* select the vert from the best region */
|
||||
v = vout[vi_best];
|
||||
BM_elem_select_set(bm, v, TRUE);
|
||||
|
||||
/* splice all others back together */
|
||||
if (vout_len > 2) {
|
||||
|
||||
/* vout[0] == best
|
||||
* vout[1] == glue
|
||||
* vout[2+] == splice with glue
|
||||
*/
|
||||
if (vi_best != 0) {
|
||||
SWAP(BMVert *, vout[0], vout[vi_best]);
|
||||
vi_best = 0;
|
||||
}
|
||||
|
||||
for (i = 2; i < vout_len; i++) {
|
||||
BM_vert_splice(bm, vout[i], vout[1]);
|
||||
}
|
||||
}
|
||||
|
||||
MEM_freeN(vout);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
}
|
||||
|
||||
if (!e2) {
|
||||
BKE_report(op->reports, RPT_ERROR, "Selected vertex has no edge/face pairs attached");
|
||||
return OPERATOR_CANCELLED;
|
||||
@@ -3463,7 +3543,7 @@ static int edbm_split_exec(bContext *C, wmOperator *op)
|
||||
|
||||
EDBM_op_init(em, &bmop, op, "split geom=%hvef use_only_faces=%b", BM_ELEM_SELECT, FALSE);
|
||||
BMO_op_exec(em->bm, &bmop);
|
||||
BM_mesh_elem_flag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT);
|
||||
BM_mesh_elem_flag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, FALSE);
|
||||
BMO_slot_buffer_hflag_enable(em->bm, &bmop, "geomout", BM_ALL, BM_ELEM_SELECT, TRUE);
|
||||
if (!EDBM_op_finish(em, &bmop, op, TRUE)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
@@ -4426,7 +4506,7 @@ static int edbm_inset_exec(bContext *C, wmOperator *op)
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
BMEditMesh *em = BMEdit_FromObject(obedit);
|
||||
BMOperator bmop;
|
||||
const int use_boundary = FALSE; //RNA_boolean_get(op->ptr, "use_boundary");
|
||||
const int use_boundary = RNA_boolean_get(op->ptr, "use_boundary");
|
||||
const int use_even_offset = RNA_boolean_get(op->ptr, "use_even_offset");
|
||||
const int use_relative_offset = RNA_boolean_get(op->ptr, "use_relative_offset");
|
||||
const float thickness = RNA_float_get(op->ptr, "thickness");
|
||||
@@ -4469,7 +4549,7 @@ void MESH_OT_inset(wmOperatorType *ot)
|
||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
|
||||
/* properties */
|
||||
// RNA_def_boolean(ot->srna, "use_boundary", TRUE, "Boundary", "Inset face boundries");
|
||||
RNA_def_boolean(ot->srna, "use_boundary", TRUE, "Boundary", "Inset face boundries");
|
||||
RNA_def_boolean(ot->srna, "use_even_offset", TRUE, "Offset Even", "Scale the offset to give more even thickness");
|
||||
RNA_def_boolean(ot->srna, "use_relative_offset", FALSE, "Offset Relative", "Scale the offset by surrounding geometry");
|
||||
|
||||
|
||||
@@ -225,7 +225,7 @@ int EDBM_op_call_and_selectf(BMEditMesh *em, wmOperator *op, const char *selects
|
||||
|
||||
BMO_op_exec(bm, &bmop);
|
||||
|
||||
BM_mesh_elem_flag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT);
|
||||
BM_mesh_elem_flag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, FALSE);
|
||||
|
||||
BMO_slot_buffer_hflag_enable(em->bm, &bmop, selectslot, BM_ALL, BM_ELEM_SELECT, TRUE);
|
||||
|
||||
@@ -426,7 +426,7 @@ void EDBM_select_flush(BMEditMesh *em)
|
||||
void EDBM_select_more(BMEditMesh *em)
|
||||
{
|
||||
BMOperator bmop;
|
||||
int use_faces = em->selectmode > SCE_SELECT_EDGE;
|
||||
int use_faces = em->selectmode == SCE_SELECT_FACE;
|
||||
|
||||
BMO_op_initf(em->bm, &bmop,
|
||||
"regionextend geom=%hvef constrict=%b use_faces=%b",
|
||||
@@ -442,7 +442,7 @@ void EDBM_select_more(BMEditMesh *em)
|
||||
void EDBM_select_less(BMEditMesh *em)
|
||||
{
|
||||
BMOperator bmop;
|
||||
int use_faces = em->selectmode > SCE_SELECT_EDGE;
|
||||
int use_faces = em->selectmode == SCE_SELECT_FACE;
|
||||
|
||||
BMO_op_initf(em->bm, &bmop,
|
||||
"regionextend geom=%hvef constrict=%b use_faces=%b",
|
||||
@@ -490,12 +490,12 @@ int EDBM_editselection_active_get(BMEditMesh *em, BMEditSelection *ese)
|
||||
|
||||
void EDBM_flag_disable_all(BMEditMesh *em, const char hflag)
|
||||
{
|
||||
BM_mesh_elem_flag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, hflag);
|
||||
BM_mesh_elem_flag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, hflag, FALSE);
|
||||
}
|
||||
|
||||
void EDBM_flag_enable_all(BMEditMesh *em, const char hflag)
|
||||
{
|
||||
BM_mesh_elem_flag_enable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, hflag);
|
||||
BM_mesh_elem_flag_enable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, hflag, TRUE);
|
||||
}
|
||||
|
||||
/**************-------------- Undo ------------*****************/
|
||||
|
||||
@@ -1249,91 +1249,132 @@ static void vgroup_invert(Object *ob, const short auto_assign, const short auto_
|
||||
}
|
||||
}
|
||||
|
||||
static void vgroup_blend(Object *ob)
|
||||
static void vgroup_blend(Object *ob, const float fac)
|
||||
{
|
||||
MDeformVert *dv;
|
||||
MDeformWeight *dw;
|
||||
MDeformVert *dvert_array=NULL, *dvert;
|
||||
int i, dvert_tot=0;
|
||||
const int def_nr= ob->actdef-1;
|
||||
const int def_nr= ob->actdef - 1;
|
||||
|
||||
BMEditMesh *em;
|
||||
BLI_assert(fac >= 0.0 && fac <= 1.0f);
|
||||
|
||||
if (ob->type != OB_MESH || ((em = BMEdit_FromObject(ob)) == NULL)) {
|
||||
if (ob->type != OB_MESH) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (BLI_findlink(&ob->defbase, def_nr)) {
|
||||
const float ifac = 1.0f - fac;
|
||||
int i1, i2;
|
||||
|
||||
BMEditMesh *em = BMEdit_FromObject(ob);
|
||||
BMesh *bm = em ? em->bm : NULL;
|
||||
Mesh *me = em ? NULL : ob->data;
|
||||
|
||||
/* bmesh only*/
|
||||
BMEdge *eed;
|
||||
BMVert *eve;
|
||||
BMIter iter;
|
||||
|
||||
int i1, i2;
|
||||
/* mesh only */
|
||||
MDeformVert *dvert_array = NULL;
|
||||
|
||||
|
||||
float *vg_weights;
|
||||
float *vg_users;
|
||||
int sel1, sel2;
|
||||
|
||||
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
|
||||
if (bm) {
|
||||
BM_mesh_elem_index_ensure(bm, BM_VERT);
|
||||
dvert_tot = bm->totvert;
|
||||
}
|
||||
else {
|
||||
dvert_tot = me->totvert;
|
||||
dvert_array = me->dvert;
|
||||
}
|
||||
|
||||
dvert_tot= em->bm->totvert;
|
||||
vg_weights = MEM_callocN(sizeof(float) * dvert_tot, "vgroup_blend_f");
|
||||
vg_users = MEM_callocN(sizeof(int) * dvert_tot, "vgroup_blend_i");
|
||||
|
||||
vg_weights= MEM_callocN(sizeof(float)*dvert_tot, "vgroup_blend_f");
|
||||
vg_users= MEM_callocN(sizeof(int)*dvert_tot, "vgroup_blend_i");
|
||||
if (bm) {
|
||||
BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
|
||||
sel1 = BM_elem_flag_test(eed->v1, BM_ELEM_SELECT);
|
||||
sel2 = BM_elem_flag_test(eed->v2, BM_ELEM_SELECT);
|
||||
|
||||
BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
|
||||
sel1= BM_elem_flag_test(eed->v1, BM_ELEM_SELECT);
|
||||
sel2= BM_elem_flag_test(eed->v2, BM_ELEM_SELECT);
|
||||
if (sel1 != sel2) {
|
||||
/* i1 is always the selected one */
|
||||
if (sel1) {
|
||||
i1= BM_elem_index_get(eed->v1);
|
||||
i2= BM_elem_index_get(eed->v2);
|
||||
eve= eed->v2;
|
||||
}
|
||||
else {
|
||||
i2= BM_elem_index_get(eed->v1);
|
||||
i1= BM_elem_index_get(eed->v2);
|
||||
eve= eed->v1;
|
||||
}
|
||||
|
||||
if (sel1 != sel2) {
|
||||
/* i1 is always the selected one */
|
||||
if (sel1==TRUE && sel2==FALSE) {
|
||||
i1= BM_elem_index_get(eed->v1);
|
||||
i2= BM_elem_index_get(eed->v2);
|
||||
eve= eed->v2;
|
||||
dv = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_MDEFORMVERT);
|
||||
dw = defvert_find_index(dv, def_nr);
|
||||
if (dw) {
|
||||
vg_weights[i1] += dw->weight;
|
||||
}
|
||||
vg_users[i1]++;
|
||||
}
|
||||
else {
|
||||
i2= BM_elem_index_get(eed->v1);
|
||||
i1= BM_elem_index_get(eed->v2);
|
||||
eve= eed->v1;
|
||||
}
|
||||
|
||||
BM_ITER_INDEX(eve, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
|
||||
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && vg_users[i] > 0) {
|
||||
dv = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_MDEFORMVERT);
|
||||
|
||||
dw = defvert_verify_index(dv, def_nr);
|
||||
dw->weight = (fac * (vg_weights[i] / (float)vg_users[i])) + (ifac * dw->weight);
|
||||
/* in case of division errors */
|
||||
CLAMP(dw->weight, 0.0f, 1.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
MEdge *ed = me->medge;
|
||||
MVert *mv;
|
||||
|
||||
vg_users[i1]++;
|
||||
for (i = 0; i < me->totedge; i++, ed++) {
|
||||
sel1 = me->mvert[ed->v1].flag & SELECT;
|
||||
sel2 = me->mvert[ed->v2].flag & SELECT;
|
||||
|
||||
/* TODO, we may want object mode blending */
|
||||
#if 0
|
||||
if (em) {
|
||||
dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
dvert= dvert_array+i2;
|
||||
if (sel1 != sel2) {
|
||||
/* i1 is always the selected one */
|
||||
if (sel1) {
|
||||
i1 = ed->v1;
|
||||
i2 = ed->v2;
|
||||
}
|
||||
else {
|
||||
i2 = ed->v1;
|
||||
i1 = ed->v2;
|
||||
}
|
||||
|
||||
dv = &dvert_array[i2];
|
||||
dw = defvert_find_index(dv, def_nr);
|
||||
if (dw) {
|
||||
vg_weights[i1] += dw->weight;
|
||||
}
|
||||
vg_users[i1]++;
|
||||
}
|
||||
}
|
||||
|
||||
dw = defvert_find_index(dvert, def_nr);
|
||||
mv = me->mvert;
|
||||
dv = dvert_array;
|
||||
|
||||
if (dw) {
|
||||
vg_weights[i1] += dw->weight;
|
||||
for (i = 0; i < dvert_tot; i++, mv++, dv++) {
|
||||
if ((mv->flag & SELECT) && (vg_users[i] > 0)) {
|
||||
dw = defvert_verify_index(dv, def_nr);
|
||||
dw->weight = (fac * (vg_weights[i] / (float)vg_users[i])) + (ifac * dw->weight);
|
||||
|
||||
/* in case of division errors */
|
||||
CLAMP(dw->weight, 0.0f, 1.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i= 0;
|
||||
BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
|
||||
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && vg_users[i] > 0) {
|
||||
/* TODO, we may want object mode blending */
|
||||
if (em) dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
|
||||
else dvert= dvert_array+i;
|
||||
|
||||
dw= defvert_verify_index(dvert, def_nr);
|
||||
dw->weight= vg_weights[i] / (float)vg_users[i];
|
||||
|
||||
/* in case of division errors */
|
||||
CLAMP(dw->weight, 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
MEM_freeN(vg_weights);
|
||||
MEM_freeN(vg_users);
|
||||
}
|
||||
@@ -2482,11 +2523,12 @@ void OBJECT_OT_vertex_group_invert(wmOperatorType *ot)
|
||||
}
|
||||
|
||||
|
||||
static int vertex_group_blend_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
static int vertex_group_blend_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Object *ob= ED_object_context(C);
|
||||
Object *ob = ED_object_context(C);
|
||||
float fac = RNA_float_get(op->ptr, "factor");
|
||||
|
||||
vgroup_blend(ob);
|
||||
vgroup_blend(ob, fac);
|
||||
|
||||
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
|
||||
@@ -2495,19 +2537,53 @@ static int vertex_group_blend_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
/* check we have a vertex selection, either in weight paint or editmode */
|
||||
static int vertex_group_blend_poll(bContext *C)
|
||||
{
|
||||
Object *ob = ED_object_context(C);
|
||||
ID *data = (ob) ? ob->data: NULL;
|
||||
|
||||
if (!(ob && !ob->id.lib && data && !data->lib))
|
||||
return FALSE;
|
||||
|
||||
if (vgroup_object_in_edit_mode(ob)) {
|
||||
return TRUE;
|
||||
}
|
||||
else if ((ob->type == OB_MESH) && (ob->mode & OB_MODE_WEIGHT_PAINT)) {
|
||||
if (ME_EDIT_PAINT_SEL_MODE(((Mesh *)data)) == SCE_SELECT_VERTEX) {
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
CTX_wm_operator_poll_msg_set(C, "Vertex select needs to be enabled in weight paint mode");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void OBJECT_OT_vertex_group_blend(wmOperatorType *ot)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
||||
/* identifiers */
|
||||
ot->name = "Blend Vertex Group";
|
||||
ot->idname = "OBJECT_OT_vertex_group_blend";
|
||||
ot->description = "";
|
||||
ot->description = "Blend selected vertex weights with unselected for the active group";
|
||||
|
||||
/* api callbacks */
|
||||
ot->poll = vertex_group_poll_edit; /* TODO - add object mode support */
|
||||
ot->poll = vertex_group_blend_poll;
|
||||
ot->exec = vertex_group_blend_exec;
|
||||
|
||||
/* flags */
|
||||
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
prop = RNA_def_property(ot->srna, "factor", PROP_FLOAT, PROP_FACTOR);
|
||||
RNA_def_property_ui_text(prop, "Factor", "");
|
||||
RNA_def_property_range(prop, 0.0f, 1.0f);
|
||||
RNA_def_property_float_default(prop, 1.0f);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -687,7 +687,7 @@ void RENDER_OT_opengl(wmOperatorType *ot)
|
||||
|
||||
prop = RNA_def_boolean(ot->srna, "animation", 0, "Animation", "Render files from the animation range of this scene");
|
||||
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
||||
prop = RNA_def_boolean(ot->srna, "sequencer", 0, "Sequencer", "Render using the sequencers OpenGL display");
|
||||
prop = RNA_def_boolean(ot->srna, "sequencer", 0, "Sequencer", "Render using the sequencer's OpenGL display");
|
||||
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
||||
prop = RNA_def_boolean(ot->srna, "write_still", 0, "Write Image", "Save rendered the image to the output path (used only when animation is disabled)");
|
||||
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
||||
|
||||
@@ -531,7 +531,7 @@ static Image *imapaint_face_image(const ImagePaintState *s, int face_index)
|
||||
|
||||
if (scene_use_new_shading_nodes(s->scene)) {
|
||||
MFace *mf = &s->dm_mface[face_index];
|
||||
ED_object_get_active_image(s->ob, mf->mat_nr, &ima, NULL, NULL);
|
||||
ED_object_get_active_image(s->ob, mf->mat_nr + 1, &ima, NULL, NULL);
|
||||
}
|
||||
else {
|
||||
MTFace *tf = &s->dm_mtface[face_index];
|
||||
@@ -547,7 +547,7 @@ static Image *project_paint_face_image(const ProjPaintState *ps, MTFace *dm_mtfa
|
||||
|
||||
if (ps->do_new_shading_nodes) { /* cached scene_use_new_shading_nodes result */
|
||||
MFace *mf = ps->dm_mface + face_index;
|
||||
ED_object_get_active_image(ps->ob, mf->mat_nr, &ima, NULL, NULL);
|
||||
ED_object_get_active_image(ps->ob, mf->mat_nr + 1, &ima, NULL, NULL);
|
||||
}
|
||||
else {
|
||||
ima = dm_mtface[face_index].tpage;
|
||||
|
||||
@@ -473,7 +473,7 @@ void vpaint_fill(Object *ob, unsigned int paintcol)
|
||||
void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
|
||||
{
|
||||
Mesh *me = ob->data;
|
||||
MPoly *mf;
|
||||
MPoly *mp;
|
||||
MDeformWeight *dw, *dw_prev;
|
||||
int vgroup_active, vgroup_mirror = -1;
|
||||
unsigned int index;
|
||||
@@ -492,15 +492,15 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
|
||||
|
||||
copy_wpaint_prev(wp, me->dvert, me->totvert);
|
||||
|
||||
for (index = 0, mf = me->mpoly; index < me->totpoly; index++, mf++) {
|
||||
unsigned int fidx = mf->totloop - 1;
|
||||
for (index = 0, mp = me->mpoly; index < me->totpoly; index++, mp++) {
|
||||
unsigned int fidx = mp->totloop - 1;
|
||||
|
||||
if ((paint_selmode == SCE_SELECT_FACE) && !(mf->flag & ME_FACE_SEL)) {
|
||||
if ((paint_selmode == SCE_SELECT_FACE) && !(mp->flag & ME_FACE_SEL)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
do {
|
||||
unsigned int vidx = me->mloop[mf->loopstart + fidx].v;
|
||||
unsigned int vidx = me->mloop[mp->loopstart + fidx].v;
|
||||
|
||||
if (!me->dvert[vidx].flag) {
|
||||
if ((paint_selmode == SCE_SELECT_VERTEX) && !(me->mvert[vidx].flag & SELECT)) {
|
||||
@@ -1032,7 +1032,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
BKE_report(op->reports, RPT_WARNING, "The modifier used does not support deformed locations");
|
||||
}
|
||||
else {
|
||||
MPoly *mf = ((MPoly *)me->mpoly) + index - 1;
|
||||
MPoly *mp = ((MPoly *)me->mpoly) + (index - 1);
|
||||
const int vgroup_active = vc.obact->actdef - 1;
|
||||
ToolSettings *ts = vc.scene->toolsettings;
|
||||
float mval_f[2];
|
||||
@@ -1043,10 +1043,10 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
mval_f[0] = (float)event->mval[0];
|
||||
mval_f[1] = (float)event->mval[1];
|
||||
|
||||
fidx = mf->totloop - 1;
|
||||
fidx = mp->totloop - 1;
|
||||
do {
|
||||
float co[3], sco[3], len;
|
||||
const int v_idx = me->mloop[mf->loopstart + fidx].v;
|
||||
const int v_idx = me->mloop[mp->loopstart + fidx].v;
|
||||
dm->getVertCo(dm, v_idx, co);
|
||||
project_float_noclip(vc.ar, co, sco);
|
||||
len = len_squared_v2v2(mval_f, sco);
|
||||
@@ -1112,13 +1112,13 @@ static EnumPropertyItem *weight_paint_sample_enum_itemf(bContext *C, PointerRNA
|
||||
if (index && index <= me->totpoly) {
|
||||
const int defbase_tot = BLI_countlist(&vc.obact->defbase);
|
||||
if (defbase_tot) {
|
||||
MPoly *mf = ((MPoly *)me->mpoly) + index - 1;
|
||||
unsigned int fidx = mf->totloop - 1;
|
||||
MPoly *mp = ((MPoly *)me->mpoly) + (index - 1);
|
||||
unsigned int fidx = mp->totloop - 1;
|
||||
int *groups = MEM_callocN(defbase_tot * sizeof(int), "groups");
|
||||
int found = FALSE;
|
||||
|
||||
do {
|
||||
MDeformVert *dvert = me->dvert + me->mloop[mf->loopstart + fidx].v;
|
||||
MDeformVert *dvert = me->dvert + me->mloop[mp->loopstart + fidx].v;
|
||||
int i = dvert->totweight;
|
||||
MDeformWeight *dw;
|
||||
for (dw = dvert->dw; i > 0; dw++, i--) {
|
||||
|
||||
@@ -274,7 +274,8 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
|
||||
|
||||
if (ss->modifiers_active) {
|
||||
Mesh *mesh = ob->data;
|
||||
mesh_calc_normals_mapping(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL);
|
||||
mesh_calc_normals_tessface(mesh->mvert, mesh->totvert,
|
||||
mesh->mface, mesh->totface, NULL);
|
||||
|
||||
free_sculptsession_deformMats(ss);
|
||||
tag_update |= 1;
|
||||
@@ -471,14 +472,6 @@ SculptUndoNode *sculpt_undo_push_node(Object *ob, PBVHNode *node,
|
||||
BLI_unlock_thread(LOCK_CUSTOM1);
|
||||
|
||||
/* copy threaded, hopefully this is the performance critical part */
|
||||
switch (type) {
|
||||
case SCULPT_UNDO_COORDS:
|
||||
sculpt_undo_store_coords(ob, unode);
|
||||
break;
|
||||
case SCULPT_UNDO_HIDDEN:
|
||||
sculpt_undo_store_hidden(ob, unode);
|
||||
break;
|
||||
}
|
||||
|
||||
if (unode->grids) {
|
||||
int totgrid, *grids;
|
||||
@@ -493,6 +486,15 @@ SculptUndoNode *sculpt_undo_push_node(Object *ob, PBVHNode *node,
|
||||
memcpy(unode->index, vert_indices, sizeof(int) * unode->totvert);
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case SCULPT_UNDO_COORDS:
|
||||
sculpt_undo_store_coords(ob, unode);
|
||||
break;
|
||||
case SCULPT_UNDO_HIDDEN:
|
||||
sculpt_undo_store_hidden(ob, unode);
|
||||
break;
|
||||
}
|
||||
|
||||
/* store active shape key */
|
||||
if (ss->kb) BLI_strncpy(unode->shapeName, ss->kb->name, sizeof(ss->kb->name));
|
||||
else unode->shapeName[0] = '\0';
|
||||
|
||||
@@ -64,6 +64,6 @@ void CONSOLE_OT_paste(struct wmOperatorType *ot);
|
||||
void CONSOLE_OT_select_set(struct wmOperatorType *ot);
|
||||
|
||||
enum { LINE_BEGIN, LINE_END, PREV_CHAR, NEXT_CHAR, PREV_WORD, NEXT_WORD };
|
||||
enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
|
||||
enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_NEXT_WORD, DEL_PREV_WORD, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
|
||||
|
||||
#endif /* __CONSOLE_INTERN_H__ */
|
||||
|
||||
@@ -434,8 +434,8 @@ void CONSOLE_OT_insert(wmOperatorType *ot)
|
||||
static EnumPropertyItem console_delete_type_items[] = {
|
||||
{DEL_NEXT_CHAR, "NEXT_CHARACTER", 0, "Next Character", ""},
|
||||
{DEL_PREV_CHAR, "PREVIOUS_CHARACTER", 0, "Previous Character", ""},
|
||||
// {DEL_NEXT_WORD, "NEXT_WORD", 0, "Next Word", ""},
|
||||
// {DEL_PREV_WORD, "PREVIOUS_WORD", 0, "Previous Word", ""},
|
||||
{DEL_NEXT_WORD, "NEXT_WORD", 0, "Next Word", ""},
|
||||
{DEL_PREV_WORD, "PREVIOUS_WORD", 0, "Previous Word", ""},
|
||||
{0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
@@ -444,6 +444,8 @@ static int console_delete_exec(bContext *C, wmOperator *op)
|
||||
SpaceConsole *sc = CTX_wm_space_console(C);
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
ConsoleLine *ci = console_history_verify(C);
|
||||
int pos;
|
||||
int stride;
|
||||
|
||||
const short type = RNA_enum_get(op->ptr, "type");
|
||||
int done = 0;
|
||||
@@ -454,22 +456,38 @@ static int console_delete_exec(bContext *C, wmOperator *op)
|
||||
|
||||
switch (type) {
|
||||
case DEL_NEXT_CHAR:
|
||||
case DEL_NEXT_WORD:
|
||||
if (ci->cursor < ci->len) {
|
||||
memmove(ci->line + ci->cursor, ci->line + ci->cursor + 1, (ci->len - ci->cursor) + 1);
|
||||
ci->len--;
|
||||
done = 1;
|
||||
pos = ci->cursor;
|
||||
BLI_str_cursor_step_utf8(ci->line, ci->len,
|
||||
&pos, STRCUR_DIR_NEXT,
|
||||
(type == DEL_NEXT_CHAR) ? STRCUR_JUMP_NONE : STRCUR_JUMP_DELIM);
|
||||
stride = pos - ci->cursor;
|
||||
if (stride) {
|
||||
memmove(ci->line + ci->cursor, ci->line + ci->cursor + stride, (ci->len - ci->cursor) + 1);
|
||||
ci->len -= stride;
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DEL_PREV_CHAR:
|
||||
case DEL_PREV_WORD:
|
||||
if (ci->cursor > 0) {
|
||||
ci->cursor--; /* same as above */
|
||||
memmove(ci->line + ci->cursor, ci->line + ci->cursor + 1, (ci->len - ci->cursor) + 1);
|
||||
ci->len--;
|
||||
done = 1;
|
||||
pos = ci->cursor;
|
||||
BLI_str_cursor_step_utf8(ci->line, ci->len,
|
||||
&pos, STRCUR_DIR_PREV,
|
||||
(type == DEL_PREV_CHAR) ? STRCUR_JUMP_NONE : STRCUR_JUMP_DELIM);
|
||||
stride = ci->cursor - pos;
|
||||
if (stride) {
|
||||
ci->cursor -= stride; /* same as above */
|
||||
memmove(ci->line + ci->cursor, ci->line + ci->cursor + stride, (ci->len - ci->cursor) + 1);
|
||||
ci->len -= stride;
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (!done) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
@@ -303,19 +303,15 @@ static void console_keymap(struct wmKeyConfig *keyconf)
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_LINE);
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_PAGE);
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_PAGE);
|
||||
|
||||
|
||||
//RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_CHAR);
|
||||
//RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
|
||||
#endif
|
||||
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_CHAR); /* same as above [#26623] */
|
||||
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
|
||||
|
||||
#ifdef WITH_PYTHON
|
||||
WM_keymap_add_item(keymap, "CONSOLE_OT_execute", RETKEY, KM_PRESS, 0, 0); /* python operator - space_text.py */
|
||||
WM_keymap_add_item(keymap, "CONSOLE_OT_execute", PADENTER, KM_PRESS, 0, 0);
|
||||
|
||||
@@ -118,7 +118,7 @@ static void draw_fcurve_modifier_controls_envelope (FModifier *fcm, View2D *v2d)
|
||||
/* only draw if visible
|
||||
* - min/max here are fixed, not relative
|
||||
*/
|
||||
if IN_RANGE(fed->time, (v2d->cur.xmin - fac), (v2d->cur.xmax + fac)) {
|
||||
if (IN_RANGE(fed->time, (v2d->cur.xmin - fac), (v2d->cur.xmax + fac))) {
|
||||
glVertex2f(fed->time, fed->min);
|
||||
glVertex2f(fed->time, fed->max);
|
||||
}
|
||||
@@ -149,7 +149,7 @@ static void draw_fcurve_vertices_keyframes (FCurve *fcu, SpaceIpo *UNUSED(sipo),
|
||||
/* as an optimization step, only draw those in view
|
||||
* - we apply a correction factor to ensure that points don't pop in/out due to slight twitches of view size
|
||||
*/
|
||||
if IN_RANGE(bezt->vec[1][0], (v2d->cur.xmin - fac), (v2d->cur.xmax + fac)) {
|
||||
if (IN_RANGE(bezt->vec[1][0], (v2d->cur.xmin - fac), (v2d->cur.xmax + fac))) {
|
||||
if (edit) {
|
||||
/* 'Keyframe' vertex only, as handle lines and handles have already been drawn
|
||||
* - only draw those with correct selection state for the current drawing color
|
||||
|
||||
@@ -342,7 +342,7 @@ void IMAGE_OT_view_pan(wmOperatorType *ot)
|
||||
ot->poll = space_image_main_area_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag = OPTYPE_BLOCKING;
|
||||
ot->flag = OPTYPE_BLOCKING | OPTYPE_GRAB_POINTER;
|
||||
|
||||
/* properties */
|
||||
RNA_def_float_vector(ot->srna, "offset", 2, NULL, -FLT_MAX, FLT_MAX,
|
||||
|
||||
@@ -603,7 +603,7 @@ static void image_refresh(const bContext *C, ScrArea *UNUSED(sa))
|
||||
|
||||
if (efa) {
|
||||
Image *node_ima;
|
||||
ED_object_get_active_image(obedit, efa->mat_nr, &node_ima, NULL, NULL);
|
||||
ED_object_get_active_image(obedit, efa->mat_nr + 1, &node_ima, NULL, NULL);
|
||||
|
||||
if (node_ima)
|
||||
sima->image = node_ima;
|
||||
|
||||
@@ -172,8 +172,8 @@ static DMDrawOption draw_mesh_face_select__drawFaceOptsInv(void *userData, int i
|
||||
{
|
||||
Mesh *me = (Mesh *)userData;
|
||||
|
||||
MPoly *mface = &me->mpoly[index];
|
||||
if (!(mface->flag & ME_HIDE) && !(mface->flag & ME_FACE_SEL))
|
||||
MPoly *mpoly = &me->mpoly[index];
|
||||
if (!(mpoly->flag & ME_HIDE) && !(mpoly->flag & ME_FACE_SEL))
|
||||
return DM_DRAW_OPTION_NO_MCOL; /* Don't set color */
|
||||
else
|
||||
return DM_DRAW_OPTION_SKIP;
|
||||
|
||||
@@ -109,12 +109,6 @@
|
||||
|
||||
#include "view3d_intern.h" // own include
|
||||
|
||||
|
||||
/* this condition has been made more complex since editmode can draw textures */
|
||||
#define CHECK_OB_DRAWTEXTURE(vd, dt) \
|
||||
((ELEM(vd->drawtype, OB_TEXTURE, OB_MATERIAL) && dt > OB_SOLID) || \
|
||||
(vd->drawtype == OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
|
||||
|
||||
typedef enum eWireDrawMode {
|
||||
OBDRAW_WIRE_OFF = 0,
|
||||
OBDRAW_WIRE_ON = 1,
|
||||
@@ -183,6 +177,20 @@ static void drawcircle_size(float size);
|
||||
static void draw_empty_sphere(float size);
|
||||
static void draw_empty_cone(float size);
|
||||
|
||||
/* this condition has been made more complex since editmode can draw textures */
|
||||
static int check_object_draw_texture(Scene *scene, View3D *v3d, int drawtype)
|
||||
{
|
||||
/* texture and material draw modes */
|
||||
if(ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) && drawtype > OB_SOLID)
|
||||
return TRUE;
|
||||
|
||||
/* textured solid */
|
||||
if(v3d->drawtype == OB_SOLID && (v3d->flag2 & V3D_SOLID_TEX) && !scene_use_new_shading_nodes(scene))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int check_ob_drawface_dot(Scene *sce, View3D *vd, char dt)
|
||||
{
|
||||
if ((sce->toolsettings->selectmode & SCE_SELECT_FACE) == 0)
|
||||
@@ -315,7 +323,7 @@ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt)
|
||||
return 0;
|
||||
if (G.f & G_PICKSEL)
|
||||
return 0;
|
||||
if (!CHECK_OB_DRAWTEXTURE(v3d, dt))
|
||||
if (!check_object_draw_texture(scene, v3d, dt))
|
||||
return 0;
|
||||
if (ob == OBACT && (ob && ob->mode & OB_MODE_WEIGHT_PAINT))
|
||||
return 0;
|
||||
@@ -3048,7 +3056,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d,
|
||||
EDBM_index_arrays_init(em, 1, 1, 1);
|
||||
|
||||
if (dt > OB_WIRE) {
|
||||
if (CHECK_OB_DRAWTEXTURE(v3d, dt)) {
|
||||
if (check_object_draw_texture(scene, v3d, dt)) {
|
||||
if (draw_glsl_material(scene, ob, v3d, dt)) {
|
||||
glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
|
||||
|
||||
@@ -3102,7 +3110,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d,
|
||||
glDepthMask(0); // disable write in zbuffer, needed for nice transp
|
||||
|
||||
/* don't draw unselected faces, only selected, this is MUCH nicer when texturing */
|
||||
if (CHECK_OB_DRAWTEXTURE(v3d, dt))
|
||||
if (check_object_draw_texture(scene, v3d, dt))
|
||||
col1[3] = 0;
|
||||
|
||||
if (!(me->drawflag & ME_DRAW_FREESTYLE_FACE))
|
||||
@@ -3132,7 +3140,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d,
|
||||
}
|
||||
|
||||
/* here starts all fancy draw-extra over */
|
||||
if ((me->drawflag & ME_DRAWEDGES) == 0 && CHECK_OB_DRAWTEXTURE(v3d, dt)) {
|
||||
if ((me->drawflag & ME_DRAWEDGES) == 0 && check_object_draw_texture(scene, v3d, dt)) {
|
||||
/* we are drawing textures and 'ME_DRAWEDGES' is disabled, don't draw any edges */
|
||||
|
||||
/* only draw selected edges otherwise there is no way of telling if a face is selected */
|
||||
@@ -3288,7 +3296,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
|
||||
draw_wire = OBDRAW_WIRE_ON; /* draw wire only, no depth buffer stuff */
|
||||
}
|
||||
else if ( (draw_flags & DRAW_FACE_SELECT || (is_obact && ob->mode & OB_MODE_TEXTURE_PAINT)) ||
|
||||
CHECK_OB_DRAWTEXTURE(v3d, dt))
|
||||
check_object_draw_texture(scene, v3d, dt))
|
||||
{
|
||||
if ( (v3d->flag & V3D_SELECT_OUTLINE) &&
|
||||
((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) &&
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
#include "PIL_time.h" /* smoothview */
|
||||
|
||||
#include "view3d_intern.h" // own include
|
||||
#include "view3d_intern.h" /* own include */
|
||||
/* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
|
||||
enum {
|
||||
FLY_MODAL_CANCEL = 1,
|
||||
@@ -272,7 +272,7 @@ static void drawFlyPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSE
|
||||
static int initFlyInfo(bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
float upvec[3]; // tmp
|
||||
float upvec[3]; /* tmp */
|
||||
float mat[3][3];
|
||||
|
||||
fly->rv3d = CTX_wm_region_view3d(C);
|
||||
@@ -376,7 +376,7 @@ static int initFlyInfo(bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event
|
||||
else {
|
||||
/* perspective or ortho */
|
||||
if (fly->rv3d->persp == RV3D_ORTHO)
|
||||
fly->rv3d->persp = RV3D_PERSP; /*if ortho projection, make perspective */
|
||||
fly->rv3d->persp = RV3D_PERSP; /* if ortho projection, make perspective */
|
||||
|
||||
copy_qt_qt(fly->rot_backup, fly->rv3d->viewquat);
|
||||
copy_v3_v3(fly->ofs_backup, fly->rv3d->ofs);
|
||||
@@ -390,10 +390,10 @@ static int initFlyInfo(bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event
|
||||
|
||||
fly->rv3d->dist = 0.0f;
|
||||
|
||||
upvec[2] = fly->dist_backup; /*x and y are 0*/
|
||||
upvec[2] = fly->dist_backup; /* x and y are 0 */
|
||||
mul_m3_v3(mat, upvec);
|
||||
sub_v3_v3(fly->rv3d->ofs, upvec);
|
||||
/*Done with correcting for the dist*/
|
||||
/* Done with correcting for the dist */
|
||||
}
|
||||
|
||||
/* center the mouse, probably the UI mafia are against this but without its quite annoying */
|
||||
@@ -449,11 +449,11 @@ static int flyEnd(bContext *C, FlyInfo *fly)
|
||||
/* restore the dist */
|
||||
float mat[3][3];
|
||||
upvec[0] = upvec[1] = 0;
|
||||
upvec[2] = fly->dist_backup; /*x and y are 0*/
|
||||
upvec[2] = fly->dist_backup; /* x and y are 0 */
|
||||
copy_m3_m4(mat, rv3d->viewinv);
|
||||
mul_m3_v3(mat, upvec);
|
||||
add_v3_v3(rv3d->ofs, upvec);
|
||||
/*Done with correcting for the dist */
|
||||
/* Done with correcting for the dist */
|
||||
}
|
||||
|
||||
if (fly->is_ortho_cam) {
|
||||
@@ -486,20 +486,20 @@ static void flyEvent(FlyInfo *fly, wmEvent *event)
|
||||
copy_v2_v2_int(fly->mval, event->mval);
|
||||
}
|
||||
else if (event->type == NDOF_MOTION) {
|
||||
// do these automagically get delivered? yes.
|
||||
/* do these automagically get delivered? yes. */
|
||||
// puts("ndof motion detected in fly mode!");
|
||||
// static const char* tag_name = "3D mouse position";
|
||||
|
||||
wmNDOFMotionData *incoming_ndof = (wmNDOFMotionData *)event->customdata;
|
||||
switch (incoming_ndof->progress) {
|
||||
case P_STARTING:
|
||||
// start keeping track of 3D mouse position
|
||||
/* start keeping track of 3D mouse position */
|
||||
#ifdef NDOF_FLY_DEBUG
|
||||
puts("start keeping track of 3D mouse position");
|
||||
#endif
|
||||
// fall through...
|
||||
/* fall through... */
|
||||
case P_IN_PROGRESS:
|
||||
// update 3D mouse position
|
||||
/* update 3D mouse position */
|
||||
#ifdef NDOF_FLY_DEBUG
|
||||
putchar('.'); fflush(stdout);
|
||||
#endif
|
||||
@@ -547,8 +547,7 @@ static void flyEvent(FlyInfo *fly, wmEvent *event)
|
||||
time_currwheel = PIL_check_seconds_timer();
|
||||
time_wheel = (float)(time_currwheel - fly->time_lastwheel);
|
||||
fly->time_lastwheel = time_currwheel;
|
||||
/*printf("Wheel %f\n", time_wheel);*/
|
||||
/*Mouse wheel delays range from 0.5==slow to 0.01==fast*/
|
||||
/* Mouse wheel delays range from 0.5==slow to 0.01==fast */
|
||||
time_wheel = 1.0f + (10.0f - (20.0f * MIN2(time_wheel, 0.5f))); /* 0-0.5 -> 0-5.0 */
|
||||
|
||||
if (fly->speed < 0.0f) {
|
||||
@@ -845,7 +844,6 @@ static int flyApply(bContext *C, FlyInfo *fly)
|
||||
time_redraw = (float)(time_current - fly->time_lastdraw);
|
||||
time_redraw_clamped = MIN2(0.05f, time_redraw); /* clamp redraw time to avoid jitter in roll correction */
|
||||
fly->time_lastdraw = time_current;
|
||||
/*fprintf(stderr, "%f\n", time_redraw);*//* 0.002 is a small redraw 0.02 is larger */
|
||||
|
||||
/* Scale the time to use shift to scale the speed down- just like
|
||||
* shift slows many other areas of blender down */
|
||||
@@ -883,7 +881,7 @@ static int flyApply(bContext *C, FlyInfo *fly)
|
||||
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
|
||||
|
||||
if (fly->xlock)
|
||||
fly->xlock = 2; /*check for rotation*/
|
||||
fly->xlock = 2; /* check for rotation */
|
||||
if (fly->zlock)
|
||||
fly->zlock = 2;
|
||||
fly->xlock_momentum = 0.0f;
|
||||
@@ -919,7 +917,7 @@ static int flyApply(bContext *C, FlyInfo *fly)
|
||||
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
|
||||
|
||||
if (fly->xlock)
|
||||
fly->xlock = 2; /*check for rotation*/
|
||||
fly->xlock = 2; /* check for rotation */
|
||||
if (fly->zlock)
|
||||
fly->zlock = 2;
|
||||
}
|
||||
@@ -930,10 +928,10 @@ static int flyApply(bContext *C, FlyInfo *fly)
|
||||
upvec[2] = 0.0f;
|
||||
mul_m3_v3(mat, upvec);
|
||||
|
||||
/*make sure we have some z rolling*/
|
||||
/* make sure we have some z rolling */
|
||||
if (fabsf(upvec[2]) > 0.00001f) {
|
||||
roll = upvec[2] * 5.0f;
|
||||
upvec[0] = 0.0f; /*rotate the view about this axis*/
|
||||
upvec[0] = 0.0f; /* rotate the view about this axis */
|
||||
upvec[1] = 0.0f;
|
||||
upvec[2] = 1.0f;
|
||||
|
||||
@@ -951,16 +949,16 @@ static int flyApply(bContext *C, FlyInfo *fly)
|
||||
}
|
||||
}
|
||||
|
||||
if (fly->xlock == 2 && moffset[1] == 0) { /*only apply xcorrect when mouse isn't applying x rot*/
|
||||
if (fly->xlock == 2 && moffset[1] == 0) { /* only apply xcorrect when mouse isn't applying x rot */
|
||||
upvec[0] = 0;
|
||||
upvec[1] = 0;
|
||||
upvec[2] = 1;
|
||||
mul_m3_v3(mat, upvec);
|
||||
/*make sure we have some z rolling*/
|
||||
/* make sure we have some z rolling */
|
||||
if (fabsf(upvec[2]) > 0.00001f) {
|
||||
roll = upvec[2] * -5.0f;
|
||||
|
||||
upvec[0] = 1.0f; /*rotate the view about this axis*/
|
||||
upvec[0] = 1.0f; /* rotate the view about this axis */
|
||||
upvec[1] = 0.0f;
|
||||
upvec[2] = 0.0f;
|
||||
|
||||
@@ -982,10 +980,10 @@ static int flyApply(bContext *C, FlyInfo *fly)
|
||||
/* pause */
|
||||
zero_v3(dvec_tmp);
|
||||
}
|
||||
if (!fly->use_freelook) {
|
||||
else if (!fly->use_freelook) {
|
||||
/* Normal operation */
|
||||
/* define dvec, view direction vector */
|
||||
dvec_tmp[0] = dvec_tmp[1] = dvec_tmp[2] = 0.0f;
|
||||
zero_v3(dvec_tmp);
|
||||
/* move along the current axis */
|
||||
dvec_tmp[fly->axis] = 1.0f;
|
||||
|
||||
@@ -1041,22 +1039,23 @@ static int flyApply_ndof(bContext *C, FlyInfo *fly)
|
||||
shouldTranslate = (flag & (NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM));
|
||||
#endif
|
||||
|
||||
int shouldRotate = (fly->pan_view == FALSE), shouldTranslate = TRUE;
|
||||
int shouldRotate = (fly->pan_view == FALSE);
|
||||
int shouldTranslate = TRUE;
|
||||
|
||||
float view_inv[4];
|
||||
invert_qt_qt(view_inv, rv3d->viewquat);
|
||||
|
||||
rv3d->rot_angle = 0.f; // disable onscreen rotation doo-dad
|
||||
rv3d->rot_angle = 0.0f; /* disable onscreen rotation doo-dad */
|
||||
|
||||
if (shouldTranslate) {
|
||||
const float forward_sensitivity = 1.f;
|
||||
const float forward_sensitivity = 1.0f;
|
||||
const float vertical_sensitivity = 0.4f;
|
||||
const float lateral_sensitivity = 0.6f;
|
||||
const float lateral_sensitivity = 0.6f;
|
||||
|
||||
float speed = 10.f; /* blender units per second */
|
||||
float speed = 10.0f; /* blender units per second */
|
||||
/* ^^ this is ok for default cube scene, but should scale with.. something */
|
||||
|
||||
float trans[3] = {lateral_sensitivity *ndof->tvec[0],
|
||||
float trans[3] = {lateral_sensitivity * ndof->tvec[0],
|
||||
vertical_sensitivity * ndof->tvec[1],
|
||||
forward_sensitivity * ndof->tvec[2]};
|
||||
|
||||
@@ -1065,7 +1064,7 @@ static int flyApply_ndof(bContext *C, FlyInfo *fly)
|
||||
|
||||
mul_v3_fl(trans, speed * dt);
|
||||
|
||||
// transform motion from view to world coordinates
|
||||
/* transform motion from view to world coordinates */
|
||||
mul_qt_v3(view_inv, trans);
|
||||
|
||||
if (flag & NDOF_FLY_HELICOPTER) {
|
||||
@@ -1074,7 +1073,7 @@ static int flyApply_ndof(bContext *C, FlyInfo *fly)
|
||||
}
|
||||
|
||||
if (rv3d->persp == RV3D_CAMOB) {
|
||||
// respect camera position locks
|
||||
/* respect camera position locks */
|
||||
Object *lock_ob = fly->root_parent ? fly->root_parent : fly->v3d->camera;
|
||||
if (lock_ob->protectflag & OB_LOCK_LOCX) trans[0] = 0.0f;
|
||||
if (lock_ob->protectflag & OB_LOCK_LOCY) trans[1] = 0.0f;
|
||||
@@ -1082,7 +1081,7 @@ static int flyApply_ndof(bContext *C, FlyInfo *fly)
|
||||
}
|
||||
|
||||
if (!is_zero_v3(trans)) {
|
||||
// move center of view opposite of hand motion (this is camera mode, not object mode)
|
||||
/* move center of view opposite of hand motion (this is camera mode, not object mode) */
|
||||
sub_v3_v3(rv3d->ofs, trans);
|
||||
shouldTranslate = TRUE;
|
||||
}
|
||||
@@ -1092,7 +1091,7 @@ static int flyApply_ndof(bContext *C, FlyInfo *fly)
|
||||
}
|
||||
|
||||
if (shouldRotate) {
|
||||
const float turn_sensitivity = 1.f;
|
||||
const float turn_sensitivity = 1.0f;
|
||||
|
||||
float rotation[4];
|
||||
float axis[3];
|
||||
@@ -1107,15 +1106,15 @@ static int flyApply_ndof(bContext *C, FlyInfo *fly)
|
||||
/* transform rotation axis from view to world coordinates */
|
||||
mul_qt_v3(view_inv, axis);
|
||||
|
||||
// apply rotation to view
|
||||
/* apply rotation to view */
|
||||
axis_angle_to_quat(rotation, axis, angle);
|
||||
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rotation);
|
||||
|
||||
if (flag & NDOF_LOCK_HORIZON) {
|
||||
/* force an upright viewpoint
|
||||
* TODO: make this less... sudden */
|
||||
float view_horizon[3] = {1.f, 0.f, 0.f}; /* view +x */
|
||||
float view_direction[3] = {0.f, 0.f, -1.f}; /* view -z (into screen) */
|
||||
float view_horizon[3] = {1.0f, 0.0f, 0.0f}; /* view +x */
|
||||
float view_direction[3] = {0.0f, 0.0f, -1.0f}; /* view -z (into screen) */
|
||||
|
||||
/* find new inverse since viewquat has changed */
|
||||
invert_qt_qt(view_inv, rv3d->viewquat);
|
||||
|
||||
@@ -4402,7 +4402,7 @@ static int createSlideVerts(TransInfo *t)
|
||||
int numsel, i, j;
|
||||
|
||||
if (!v3d) {
|
||||
/*ok, let's try to survive this*/
|
||||
/* ok, let's try to survive this */
|
||||
unit_m4(projectMat);
|
||||
}
|
||||
else {
|
||||
@@ -4428,15 +4428,20 @@ static int createSlideVerts(TransInfo *t)
|
||||
}
|
||||
|
||||
if (numsel == 0 || numsel > 2) {
|
||||
return 0; //invalid edge selection
|
||||
MEM_freeN(sld);
|
||||
BMBVH_FreeBVH(btree);
|
||||
return 0; /* invalid edge selection */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
|
||||
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
|
||||
if (BM_edge_face_count(e) != 2)
|
||||
return 0; //can only handle exactly 2 faces around each edge
|
||||
if (BM_edge_face_count(e) != 2) {
|
||||
MEM_freeN(sld);
|
||||
BMBVH_FreeBVH(btree);
|
||||
return 0; /* can only handle exactly 2 faces around each edge */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4452,8 +4457,11 @@ static int createSlideVerts(TransInfo *t)
|
||||
}
|
||||
}
|
||||
|
||||
if (!j)
|
||||
if (!j) {
|
||||
MEM_freeN(sld);
|
||||
BMBVH_FreeBVH(btree);
|
||||
return 0;
|
||||
}
|
||||
|
||||
tempsv = MEM_callocN(sizeof(TransDataSlideVert)*j, "tempsv");
|
||||
|
||||
@@ -4760,12 +4768,14 @@ void projectSVData(TransInfo *t, int final)
|
||||
}
|
||||
}
|
||||
|
||||
/*make sure face-attributes are correct (e.g. MTexPoly)*/
|
||||
/* make sure face-attributes are correct (e.g. MTexPoly) */
|
||||
BM_elem_attrs_copy(em->bm, em->bm, copyf2, f);
|
||||
|
||||
/*restore selection and hidden flags*/
|
||||
/* restore selection and hidden flags */
|
||||
BM_elem_select_set(em->bm, f, sel);
|
||||
BM_elem_hide_set(em->bm, f, hide);
|
||||
if (!hide) { /* this check is a workaround for bug, see note - [#30735], without this edge can be hidden and selected */
|
||||
BM_elem_hide_set(em->bm, f, hide);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4491,7 +4491,7 @@ static void set_trans_object_base_flags(TransInfo *t)
|
||||
if (parsel->flag & SELECT) {
|
||||
Base *parbase = object_in_scene(parsel, scene);
|
||||
if (parbase) { /* in rare cases this can fail */
|
||||
if TESTBASELIB_BGMODE(v3d, scene, parbase) {
|
||||
if (TESTBASELIB_BGMODE(v3d, scene, parbase)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -531,7 +531,7 @@ int calc_manipulator_stats(const bContext *C)
|
||||
if (ob && !(ob->flag & SELECT)) ob= NULL;
|
||||
|
||||
for (base= scene->base.first; base; base= base->next) {
|
||||
if TESTBASELIB(v3d, base) {
|
||||
if (TESTBASELIB(v3d, base)) {
|
||||
if (ob==NULL)
|
||||
ob= base->object;
|
||||
calc_tw_center(scene, base->object->obmat[3]);
|
||||
|
||||
@@ -858,7 +858,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
|
||||
if (ob && !(ob->flag & SELECT)) ob = NULL;
|
||||
|
||||
for (base= scene->base.first; base; base= base->next) {
|
||||
if TESTBASELIB(v3d, base) {
|
||||
if (TESTBASELIB(v3d, base)) {
|
||||
if (ob == NULL) {
|
||||
ob= base->object;
|
||||
break;
|
||||
|
||||
@@ -62,16 +62,21 @@
|
||||
|
||||
/* UV Utilities */
|
||||
|
||||
static int uvedit_center(Scene *scene, BMEditMesh *em, Image *UNUSED(ima), float center[2])
|
||||
static int uvedit_center(Scene *scene, BMEditMesh *em, Image *ima, float center[2])
|
||||
{
|
||||
BMFace *f;
|
||||
BMLoop *l;
|
||||
BMIter iter, liter;
|
||||
MTexPoly *tf;
|
||||
MLoopUV *luv;
|
||||
int tot = 0.0;
|
||||
|
||||
zero_v2(center);
|
||||
BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
|
||||
tf = CustomData_bmesh_get(&em->bm->pdata, f->head.data, CD_MTEXPOLY);
|
||||
if (!uvedit_face_visible(scene, ima, f, tf))
|
||||
continue;
|
||||
|
||||
BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
if (uvedit_uv_selected(em, scene, l)) {
|
||||
|
||||
@@ -383,18 +383,18 @@ static void draw_uvs_other(Scene *scene, Object *obedit, Image *curimage)
|
||||
if ((ob->type==OB_MESH) && (ob!=obedit)) {
|
||||
Mesh *me= ob->data;
|
||||
|
||||
if (me->mtface) {
|
||||
MPoly *mface= me->mpoly;
|
||||
MTexPoly *tface= me->mtpoly;
|
||||
if (me->mtpoly) {
|
||||
MPoly *mpoly = me->mpoly;
|
||||
MTexPoly *mtpoly = me->mtpoly;
|
||||
MLoopUV *mloopuv;
|
||||
int a, b;
|
||||
|
||||
for (a=me->totpoly; a>0; a--, tface++, mface++) {
|
||||
if (tface->tpage == curimage) {
|
||||
for (a = me->totpoly; a > 0; a--, mtpoly++, mpoly++) {
|
||||
if (mtpoly->tpage == curimage) {
|
||||
glBegin(GL_LINE_LOOP);
|
||||
|
||||
mloopuv = me->mloopuv + mface->loopstart;
|
||||
for (b=0; b<mface->totloop; b++, mloopuv++) {
|
||||
mloopuv = me->mloopuv + mpoly->loopstart;
|
||||
for (b = 0; b < mpoly->totloop; b++, mloopuv++) {
|
||||
glVertex2fv(mloopuv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@@ -416,17 +416,17 @@ static void draw_uvs_texpaint(SpaceImage *sima, Scene *scene, Object *ob)
|
||||
glColor3ub(112, 112, 112);
|
||||
|
||||
if (me->mtface) {
|
||||
MPoly *mface= me->mpoly;
|
||||
MPoly *mpoly= me->mpoly;
|
||||
MTexPoly *tface= me->mtpoly;
|
||||
MLoopUV *mloopuv;
|
||||
int a, b;
|
||||
|
||||
for (a=me->totpoly; a>0; a--, tface++, mface++) {
|
||||
for (a=me->totpoly; a>0; a--, tface++, mpoly++) {
|
||||
if (tface->tpage == curimage) {
|
||||
glBegin(GL_LINE_LOOP);
|
||||
|
||||
mloopuv = me->mloopuv + mface->loopstart;
|
||||
for (b=0; b<mface->totloop; b++, mloopuv++) {
|
||||
mloopuv = me->mloopuv + mpoly->loopstart;
|
||||
for (b=0; b<mpoly->totloop; b++, mloopuv++) {
|
||||
glVertex2fv(mloopuv->uv);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
@@ -191,7 +191,7 @@ void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *im
|
||||
BMFace *efa= BM_active_face_get(em->bm, sloppy);
|
||||
|
||||
if (efa)
|
||||
ED_object_assign_active_image(bmain, obedit, efa->mat_nr, ima);
|
||||
ED_object_assign_active_image(bmain, obedit, efa->mat_nr + 1, ima);
|
||||
}
|
||||
else {
|
||||
/* old shading system, assign image to selected faces */
|
||||
@@ -1620,6 +1620,7 @@ static void select_all_perform(bContext *C, int action)
|
||||
break;
|
||||
case SEL_INVERT:
|
||||
EDBM_select_swap(em);
|
||||
EDBM_selectmode_flush(em);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1774,7 +1774,7 @@ void GPU_draw_buffers(GPU_Buffers *buffers, DMSetMaterial setMaterial)
|
||||
|
||||
if (buffers->totface) {
|
||||
const MFace *f = &buffers->mface[buffers->face_indices[0]];
|
||||
if (!setMaterial(f->mat_nr+1, NULL))
|
||||
if (!setMaterial(f->mat_nr + 1, NULL))
|
||||
return;
|
||||
|
||||
smooth = f->flag & ME_SMOOTH;
|
||||
@@ -1782,7 +1782,7 @@ void GPU_draw_buffers(GPU_Buffers *buffers, DMSetMaterial setMaterial)
|
||||
}
|
||||
else if (buffers->totgrid) {
|
||||
const DMFlagMat *f = &buffers->grid_flag_mats[buffers->grid_indices[0]];
|
||||
if (!setMaterial(f->mat_nr+1, NULL))
|
||||
if (!setMaterial(f->mat_nr + 1, NULL))
|
||||
return;
|
||||
|
||||
smooth = f->flag & ME_SMOOTH;
|
||||
|
||||
@@ -45,8 +45,12 @@
|
||||
#undef AVIIF_KEYFRAME // redefined in AVI_avi.h
|
||||
#undef AVIIF_LIST // redefined in AVI_avi.h
|
||||
|
||||
#define FIXCC(fcc) if (fcc == 0) fcc = mmioFOURCC('N', 'o', 'n', 'e'); \
|
||||
if (fcc == BI_RLE8) fcc = mmioFOURCC('R', 'l', 'e', '8');
|
||||
#define FIXCC(fcc) \
|
||||
{ \
|
||||
if (fcc == 0) { fcc = mmioFOURCC('N', 'o', 'n', 'e'); } \
|
||||
if (fcc == BI_RLE8) { fcc = mmioFOURCC('R', 'l', 'e', '8'); } \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
@@ -77,7 +77,7 @@ ImFileType IMB_FILE_TYPES[]= {
|
||||
{NULL, NULL, imb_is_a_hdr, imb_ftype_default, imb_loadhdr, imb_savehdr, NULL, IM_FTYPE_FLOAT, RADHDR},
|
||||
#endif
|
||||
#ifdef WITH_OPENEXR
|
||||
{NULL, NULL, imb_is_a_openexr, imb_ftype_default, imb_load_openexr, imb_save_openexr, NULL, IM_FTYPE_FLOAT, OPENEXR},
|
||||
{imb_initopenexr, NULL, imb_is_a_openexr, imb_ftype_default, imb_load_openexr, imb_save_openexr, NULL, IM_FTYPE_FLOAT, OPENEXR},
|
||||
#endif
|
||||
#ifdef WITH_OPENJPEG
|
||||
{NULL, NULL, imb_is_a_jp2, imb_ftype_default, imb_jp2_decode, imb_savejp2, NULL, IM_FTYPE_FLOAT, JP2},
|
||||
|
||||
@@ -15,4 +15,7 @@ incs += Split(env['BF_OPENEXR_INC'])
|
||||
|
||||
defs = ['WITH_OPENEXR']
|
||||
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
|
||||
incs.append(env['BF_PTHREADS_INC'])
|
||||
|
||||
env.BlenderLib ('bf_imbuf_openexr', source_files, incs, defs, libtype=['core','player'], priority = [225,180])
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#include <string>
|
||||
#include <set>
|
||||
|
||||
|
||||
#include <openexr_api.h>
|
||||
@@ -51,6 +52,7 @@ _CRTIMP void __cdecl _invalid_parameter_noinfo(void)
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_math_color.h"
|
||||
#include "BLI_threads.h"
|
||||
|
||||
#include "IMB_imbuf_types.h"
|
||||
#include "IMB_imbuf.h"
|
||||
@@ -93,7 +95,7 @@ _CRTIMP void __cdecl _invalid_parameter_noinfo(void)
|
||||
using namespace Imf;
|
||||
using namespace Imath;
|
||||
|
||||
class Mem_IStream: public IStream
|
||||
class Mem_IStream: public Imf::IStream
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -211,7 +213,7 @@ static int imb_save_openexr_half(struct ImBuf *ibuf, const char *name, int flags
|
||||
if (ibuf->planes==32 && channels >= 4)
|
||||
header.channels().insert ("A", Channel (HALF));
|
||||
if (write_zbuf) // z we do as float always
|
||||
header.channels().insert ("Z", Channel (FLOAT));
|
||||
header.channels().insert ("Z", Channel (Imf::FLOAT));
|
||||
|
||||
FrameBuffer frameBuffer;
|
||||
OutputFile *file = new OutputFile(name, header);
|
||||
@@ -229,7 +231,7 @@ static int imb_save_openexr_half(struct ImBuf *ibuf, const char *name, int flags
|
||||
if (ibuf->planes==32 && channels >= 4)
|
||||
frameBuffer.insert ("A", Slice (HALF, (char *) &pixels[0].a, xstride, ystride));
|
||||
if (write_zbuf)
|
||||
frameBuffer.insert ("Z", Slice (FLOAT, (char *)(ibuf->zbuf_float + (height-1)*width),
|
||||
frameBuffer.insert ("Z", Slice (Imf::FLOAT, (char *)(ibuf->zbuf_float + (height-1)*width),
|
||||
sizeof(float), sizeof(float) * -width));
|
||||
if (ibuf->rect_float) {
|
||||
float *from;
|
||||
@@ -315,13 +317,13 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, const char *name, int flag
|
||||
openexr_header_compression(&header, ibuf->ftype & OPENEXR_COMPRESS);
|
||||
openexr_header_metadata(&header, ibuf);
|
||||
|
||||
header.channels().insert ("R", Channel (FLOAT));
|
||||
header.channels().insert ("G", Channel (FLOAT));
|
||||
header.channels().insert ("B", Channel (FLOAT));
|
||||
header.channels().insert ("R", Channel (Imf::FLOAT));
|
||||
header.channels().insert ("G", Channel (Imf::FLOAT));
|
||||
header.channels().insert ("B", Channel (Imf::FLOAT));
|
||||
if (ibuf->planes==32 && channels >= 4)
|
||||
header.channels().insert ("A", Channel (FLOAT));
|
||||
header.channels().insert ("A", Channel (Imf::FLOAT));
|
||||
if (write_zbuf)
|
||||
header.channels().insert ("Z", Channel (FLOAT));
|
||||
header.channels().insert ("Z", Channel (Imf::FLOAT));
|
||||
|
||||
FrameBuffer frameBuffer;
|
||||
OutputFile *file = new OutputFile(name, header);
|
||||
@@ -335,13 +337,13 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, const char *name, int flag
|
||||
rect[2]= rect[0]+2;
|
||||
rect[3]= (channels >= 4)? rect[0]+3:rect[0]; /* red as alpha, is this needed since alpha isn't written? */
|
||||
|
||||
frameBuffer.insert ("R", Slice (FLOAT, (char *)rect[0], xstride, ystride));
|
||||
frameBuffer.insert ("G", Slice (FLOAT, (char *)rect[1], xstride, ystride));
|
||||
frameBuffer.insert ("B", Slice (FLOAT, (char *)rect[2], xstride, ystride));
|
||||
frameBuffer.insert ("R", Slice (Imf::FLOAT, (char *)rect[0], xstride, ystride));
|
||||
frameBuffer.insert ("G", Slice (Imf::FLOAT, (char *)rect[1], xstride, ystride));
|
||||
frameBuffer.insert ("B", Slice (Imf::FLOAT, (char *)rect[2], xstride, ystride));
|
||||
if (ibuf->planes==32 && channels >= 4)
|
||||
frameBuffer.insert ("A", Slice (FLOAT, (char *)rect[3], xstride, ystride));
|
||||
frameBuffer.insert ("A", Slice (Imf::FLOAT, (char *)rect[3], xstride, ystride));
|
||||
if (write_zbuf)
|
||||
frameBuffer.insert ("Z", Slice (FLOAT, (char *) (ibuf->zbuf_float + (height-1)*width),
|
||||
frameBuffer.insert ("Z", Slice (Imf::FLOAT, (char *) (ibuf->zbuf_float + (height-1)*width),
|
||||
sizeof(float), sizeof(float) * -width));
|
||||
file->setFrameBuffer (frameBuffer);
|
||||
file->writePixels (height);
|
||||
@@ -480,7 +482,7 @@ int IMB_exr_begin_write(void *handle, const char *filename, int width, int heigh
|
||||
data->height= height;
|
||||
|
||||
for (echan= (ExrChannel *)data->channels.first; echan; echan= echan->next)
|
||||
header.channels().insert (echan->name, Channel (FLOAT));
|
||||
header.channels().insert (echan->name, Channel (Imf::FLOAT));
|
||||
|
||||
openexr_header_compression(&header, compress);
|
||||
// openexr_header_metadata(&header, ibuf); // no imbuf. cant write
|
||||
@@ -513,7 +515,7 @@ void IMB_exrtile_begin_write(void *handle, const char *filename, int mipmap, int
|
||||
data->mipmap= mipmap;
|
||||
|
||||
for (echan= (ExrChannel *)data->channels.first; echan; echan= echan->next)
|
||||
header.channels().insert (echan->name, Channel (FLOAT));
|
||||
header.channels().insert (echan->name, Channel (Imf::FLOAT));
|
||||
|
||||
header.setTileDescription (TileDescription (tilex, tiley, (mipmap)? MIPMAP_LEVELS: ONE_LEVEL));
|
||||
header.lineOrder() = RANDOM_Y;
|
||||
@@ -590,7 +592,7 @@ void IMB_exrtile_write_channels(void *handle, int partx, int party, int level)
|
||||
for (echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) {
|
||||
float *rect= echan->rect - echan->xstride*partx - echan->ystride*party;
|
||||
|
||||
frameBuffer.insert (echan->name, Slice (FLOAT, (char *)rect,
|
||||
frameBuffer.insert (echan->name, Slice (Imf::FLOAT, (char *)rect,
|
||||
echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
|
||||
}
|
||||
|
||||
@@ -616,7 +618,7 @@ void IMB_exr_write_channels(void *handle)
|
||||
/* last scanline, stride negative */
|
||||
float *rect = echan->rect + echan->xstride*(data->height-1)*data->width;
|
||||
|
||||
frameBuffer.insert (echan->name, Slice (FLOAT, (char *)rect,
|
||||
frameBuffer.insert (echan->name, Slice (Imf::FLOAT, (char *)rect,
|
||||
echan->xstride*sizeof(float), -echan->ystride*sizeof(float)));
|
||||
}
|
||||
|
||||
@@ -647,10 +649,10 @@ void IMB_exr_read_channels(void *handle)
|
||||
|
||||
if (echan->rect) {
|
||||
if (flip)
|
||||
frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect,
|
||||
frameBuffer.insert (echan->name, Slice (Imf::FLOAT, (char *)echan->rect,
|
||||
echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
|
||||
else
|
||||
frameBuffer.insert (echan->name, Slice (FLOAT, (char *)(echan->rect + echan->xstride*(data->height-1)*data->width),
|
||||
frameBuffer.insert (echan->name, Slice (Imf::FLOAT, (char *)(echan->rect + echan->xstride*(data->height-1)*data->width),
|
||||
echan->xstride*sizeof(float), -echan->ystride*sizeof(float)));
|
||||
}
|
||||
else
|
||||
@@ -944,12 +946,17 @@ static int exr_has_zbuffer(InputFile *file)
|
||||
return !(file->header().channels().findChannel("Z") == NULL);
|
||||
}
|
||||
|
||||
static int exr_is_renderresult(InputFile *file)
|
||||
static int exr_is_multilayer(InputFile *file)
|
||||
{
|
||||
const StringAttribute *comments= file->header().findTypedAttribute<StringAttribute>("BlenderMultiChannel");
|
||||
if (comments)
|
||||
// if (comments->value() == "Blender MultiChannel")
|
||||
const ChannelList &channels = file->header().channels();
|
||||
std::set <std::string> layerNames;
|
||||
|
||||
channels.layers(layerNames);
|
||||
|
||||
if (comments || layerNames.size()>1)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -976,7 +983,7 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags)
|
||||
if (0) // debug
|
||||
exr_print_filecontents(file);
|
||||
|
||||
is_multi= exr_is_renderresult(file);
|
||||
is_multi= exr_is_multilayer(file);
|
||||
|
||||
/* do not make an ibuf when */
|
||||
if (is_multi && !(flags & IB_test) && !(flags & IB_multilayer))
|
||||
@@ -1017,14 +1024,14 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags)
|
||||
first+= 4*(height-1)*width;
|
||||
|
||||
frameBuffer.insert ( exr_rgba_channelname(file, "R"),
|
||||
Slice (FLOAT, (char *) first, xstride, ystride));
|
||||
Slice (Imf::FLOAT, (char *) first, xstride, ystride));
|
||||
frameBuffer.insert ( exr_rgba_channelname(file, "G"),
|
||||
Slice (FLOAT, (char *) (first+1), xstride, ystride));
|
||||
Slice (Imf::FLOAT, (char *) (first+1), xstride, ystride));
|
||||
frameBuffer.insert ( exr_rgba_channelname(file, "B"),
|
||||
Slice (FLOAT, (char *) (first+2), xstride, ystride));
|
||||
Slice (Imf::FLOAT, (char *) (first+2), xstride, ystride));
|
||||
|
||||
frameBuffer.insert ( exr_rgba_channelname(file, "A"),
|
||||
Slice (FLOAT, (char *) (first+3), xstride, ystride, 1, 1, 1.0f)); /* 1.0 is fill value */
|
||||
Slice (Imf::FLOAT, (char *) (first+3), xstride, ystride, 1, 1, 1.0f)); /* 1.0 is fill value */
|
||||
|
||||
if (exr_has_zbuffer(file))
|
||||
{
|
||||
@@ -1033,7 +1040,7 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags)
|
||||
addzbuffloatImBuf(ibuf);
|
||||
firstz= ibuf->zbuf_float - (dw.min.x - dw.min.y*width);
|
||||
firstz+= (height-1)*width;
|
||||
frameBuffer.insert ("Z", Slice (FLOAT, (char *)firstz , sizeof(float), -width*sizeof(float)));
|
||||
frameBuffer.insert ("Z", Slice (Imf::FLOAT, (char *)firstz , sizeof(float), -width*sizeof(float)));
|
||||
}
|
||||
|
||||
file->setFrameBuffer (frameBuffer);
|
||||
@@ -1066,5 +1073,11 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags)
|
||||
|
||||
}
|
||||
|
||||
void imb_initopenexr(void)
|
||||
{
|
||||
int num_threads = BLI_system_thread_count();
|
||||
|
||||
setGlobalThreadCount(num_threads);
|
||||
}
|
||||
|
||||
} // export "C"
|
||||
|
||||
@@ -43,7 +43,9 @@ extern "C" {
|
||||
* Test presence of OpenEXR file.
|
||||
* \param mem pointer to loaded OpenEXR bitstream
|
||||
*/
|
||||
|
||||
|
||||
void imb_initopenexr (void);
|
||||
|
||||
int imb_is_a_openexr (unsigned char *mem);
|
||||
|
||||
int imb_save_openexr (struct ImBuf *ibuf, const char *name, int flags);
|
||||
|
||||
@@ -93,7 +93,7 @@ static int replace_if_different(char *tmpfile, const char *dep_files[])
|
||||
return -1; \
|
||||
} \
|
||||
remove(tmpfile); \
|
||||
return 1; \
|
||||
return 1 \
|
||||
|
||||
/* end REN_IF_DIFF */
|
||||
|
||||
|
||||
@@ -744,13 +744,13 @@ static void rna_MeshFloatPropertyLayer_data_begin(CollectionPropertyIterator *it
|
||||
{
|
||||
Mesh *me = rna_mesh(ptr);
|
||||
CustomDataLayer *layer = (CustomDataLayer*)ptr->data;
|
||||
rna_iterator_array_begin(iter, layer->data, sizeof(MFloatProperty), me->totface, 0, NULL);
|
||||
rna_iterator_array_begin(iter, layer->data, sizeof(MFloatProperty), me->totpoly, 0, NULL);
|
||||
}
|
||||
|
||||
static int rna_MeshFloatPropertyLayer_data_length(PointerRNA *ptr)
|
||||
{
|
||||
Mesh *me = rna_mesh(ptr);
|
||||
return me->totface;
|
||||
return me->totpoly;
|
||||
}
|
||||
|
||||
static int rna_float_layer_check(CollectionPropertyIterator *iter, void *data)
|
||||
@@ -759,14 +759,14 @@ static int rna_float_layer_check(CollectionPropertyIterator *iter, void *data)
|
||||
return (layer->type != CD_PROP_FLT);
|
||||
}
|
||||
|
||||
static void rna_Mesh_float_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||
static void rna_Mesh_polygon_float_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||
{
|
||||
CustomData *pdata = rna_mesh_pdata(ptr);
|
||||
rna_iterator_array_begin(iter, (void*)pdata->layers, sizeof(CustomDataLayer), pdata->totlayer, 0,
|
||||
rna_float_layer_check);
|
||||
}
|
||||
|
||||
static int rna_Mesh_float_layers_length(PointerRNA *ptr)
|
||||
static int rna_Mesh_polygon_float_layers_length(PointerRNA *ptr)
|
||||
{
|
||||
return CustomData_number_of_layers(rna_mesh_pdata(ptr), CD_PROP_FLT);
|
||||
}
|
||||
@@ -781,23 +781,23 @@ static void rna_MeshIntPropertyLayer_data_begin(CollectionPropertyIterator *iter
|
||||
{
|
||||
Mesh *me = rna_mesh(ptr);
|
||||
CustomDataLayer *layer = (CustomDataLayer*)ptr->data;
|
||||
rna_iterator_array_begin(iter, layer->data, sizeof(MIntProperty), me->totface, 0, NULL);
|
||||
rna_iterator_array_begin(iter, layer->data, sizeof(MIntProperty), me->totpoly, 0, NULL);
|
||||
}
|
||||
|
||||
static int rna_MeshIntPropertyLayer_data_length(PointerRNA *ptr)
|
||||
{
|
||||
Mesh *me = rna_mesh(ptr);
|
||||
return me->totface;
|
||||
return me->totpoly;
|
||||
}
|
||||
|
||||
static void rna_Mesh_int_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||
static void rna_Mesh_polygon_int_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||
{
|
||||
CustomData *pdata = rna_mesh_pdata(ptr);
|
||||
rna_iterator_array_begin(iter, (void*)pdata->layers, sizeof(CustomDataLayer), pdata->totlayer, 0,
|
||||
rna_int_layer_check);
|
||||
}
|
||||
|
||||
static int rna_Mesh_int_layers_length(PointerRNA *ptr)
|
||||
static int rna_Mesh_polygon_int_layers_length(PointerRNA *ptr)
|
||||
{
|
||||
return CustomData_number_of_layers(rna_mesh_pdata(ptr), CD_PROP_INT);
|
||||
}
|
||||
@@ -812,23 +812,23 @@ static void rna_MeshStringPropertyLayer_data_begin(CollectionPropertyIterator *i
|
||||
{
|
||||
Mesh *me = rna_mesh(ptr);
|
||||
CustomDataLayer *layer = (CustomDataLayer*)ptr->data;
|
||||
rna_iterator_array_begin(iter, layer->data, sizeof(MStringProperty), me->totface, 0, NULL);
|
||||
rna_iterator_array_begin(iter, layer->data, sizeof(MStringProperty), me->totpoly, 0, NULL);
|
||||
}
|
||||
|
||||
static int rna_MeshStringPropertyLayer_data_length(PointerRNA *ptr)
|
||||
{
|
||||
Mesh *me = rna_mesh(ptr);
|
||||
return me->totface;
|
||||
return me->totpoly;
|
||||
}
|
||||
|
||||
static void rna_Mesh_string_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||
static void rna_Mesh_polygon_string_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||
{
|
||||
CustomData *pdata = rna_mesh_pdata(ptr);
|
||||
rna_iterator_array_begin(iter, (void*)pdata->layers, sizeof(CustomDataLayer), pdata->totlayer, 0,
|
||||
rna_string_layer_check);
|
||||
}
|
||||
|
||||
static int rna_Mesh_string_layers_length(PointerRNA *ptr)
|
||||
static int rna_Mesh_polygon_string_layers_length(PointerRNA *ptr)
|
||||
{
|
||||
return CustomData_number_of_layers(rna_mesh_pdata(ptr), CD_PROP_STR);
|
||||
}
|
||||
@@ -1213,46 +1213,46 @@ static PointerRNA rna_Mesh_tessface_vertex_color_new(struct Mesh *me, struct bCo
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static PointerRNA rna_Mesh_int_property_new(struct Mesh *me, struct bContext *C, const char *name)
|
||||
static PointerRNA rna_Mesh_polygon_int_property_new(struct Mesh *me, struct bContext *C, const char *name)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
CustomDataLayer *cdl = NULL;
|
||||
int index;
|
||||
|
||||
CustomData_add_layer_named(&me->fdata, CD_PROP_INT, CD_DEFAULT, NULL, me->totface, name);
|
||||
index = CustomData_get_named_layer_index(&me->fdata, CD_PROP_INT, name);
|
||||
CustomData_add_layer_named(&me->pdata, CD_PROP_INT, CD_DEFAULT, NULL, me->totpoly, name);
|
||||
index = CustomData_get_named_layer_index(&me->pdata, CD_PROP_INT, name);
|
||||
|
||||
cdl = (index == -1) ? NULL : &(me->fdata.layers[index]);
|
||||
cdl = (index == -1) ? NULL : &(me->pdata.layers[index]);
|
||||
|
||||
RNA_pointer_create(&me->id, &RNA_MeshIntPropertyLayer, cdl, &ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static PointerRNA rna_Mesh_float_property_new(struct Mesh *me, struct bContext *C, const char *name)
|
||||
static PointerRNA rna_Mesh_polygon_float_property_new(struct Mesh *me, struct bContext *C, const char *name)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
CustomDataLayer *cdl = NULL;
|
||||
int index;
|
||||
|
||||
CustomData_add_layer_named(&me->fdata, CD_PROP_FLT, CD_DEFAULT, NULL, me->totface, name);
|
||||
index = CustomData_get_named_layer_index(&me->fdata, CD_PROP_FLT, name);
|
||||
CustomData_add_layer_named(&me->pdata, CD_PROP_FLT, CD_DEFAULT, NULL, me->totpoly, name);
|
||||
index = CustomData_get_named_layer_index(&me->pdata, CD_PROP_FLT, name);
|
||||
|
||||
cdl = (index == -1) ? NULL : &(me->fdata.layers[index]);
|
||||
cdl = (index == -1) ? NULL : &(me->pdata.layers[index]);
|
||||
|
||||
RNA_pointer_create(&me->id, &RNA_MeshFloatPropertyLayer, cdl, &ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static PointerRNA rna_Mesh_string_property_new(struct Mesh *me, struct bContext *C, const char *name)
|
||||
static PointerRNA rna_Mesh_polygon_string_property_new(struct Mesh *me, struct bContext *C, const char *name)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
CustomDataLayer *cdl = NULL;
|
||||
int index;
|
||||
|
||||
CustomData_add_layer_named(&me->fdata, CD_PROP_STR, CD_DEFAULT, NULL, me->totface, name);
|
||||
index = CustomData_get_named_layer_index(&me->fdata, CD_PROP_STR, name);
|
||||
CustomData_add_layer_named(&me->pdata, CD_PROP_STR, CD_DEFAULT, NULL, me->totpoly, name);
|
||||
index = CustomData_get_named_layer_index(&me->pdata, CD_PROP_STR, name);
|
||||
|
||||
cdl = (index == -1) ? NULL : &(me->fdata.layers[index]);
|
||||
cdl = (index == -1) ? NULL : &(me->pdata.layers[index]);
|
||||
|
||||
RNA_pointer_create(&me->id, &RNA_MeshStringPropertyLayer, cdl, &ptr);
|
||||
return ptr;
|
||||
@@ -2334,7 +2334,7 @@ static void rna_def_uv_loop_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
}
|
||||
|
||||
/* mesh int layers */
|
||||
static void rna_def_int_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
static void rna_def_polygon_int_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
{
|
||||
StructRNA *srna;
|
||||
|
||||
@@ -2346,7 +2346,7 @@ static void rna_def_int_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
RNA_def_struct_sdna(srna, "Mesh");
|
||||
RNA_def_struct_ui_text(srna, "Int Properties", "Collection of int properties");
|
||||
|
||||
func = RNA_def_function(srna, "new", "rna_Mesh_int_property_new");
|
||||
func = RNA_def_function(srna, "new", "rna_Mesh_polygon_int_property_new");
|
||||
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
|
||||
RNA_def_function_ui_description(func, "Add a integer property layer to Mesh");
|
||||
RNA_def_string(func, "name", "Int Prop", 0, "", "Int property name");
|
||||
@@ -2356,7 +2356,7 @@ static void rna_def_int_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
}
|
||||
|
||||
/* mesh float layers */
|
||||
static void rna_def_float_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
static void rna_def_polygon_float_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
{
|
||||
StructRNA *srna;
|
||||
|
||||
@@ -2368,7 +2368,7 @@ static void rna_def_float_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
RNA_def_struct_sdna(srna, "Mesh");
|
||||
RNA_def_struct_ui_text(srna, "Float Properties", "Collection of float properties");
|
||||
|
||||
func = RNA_def_function(srna, "new", "rna_Mesh_float_property_new");
|
||||
func = RNA_def_function(srna, "new", "rna_Mesh_polygon_float_property_new");
|
||||
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
|
||||
RNA_def_function_ui_description(func, "Add a float property layer to Mesh");
|
||||
RNA_def_string(func, "name", "Float Prop", 0, "", "Float property name");
|
||||
@@ -2378,7 +2378,7 @@ static void rna_def_float_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
}
|
||||
|
||||
/* mesh string layers */
|
||||
static void rna_def_string_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
static void rna_def_polygon_string_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
{
|
||||
StructRNA *srna;
|
||||
|
||||
@@ -2390,7 +2390,7 @@ static void rna_def_string_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
RNA_def_struct_sdna(srna, "Mesh");
|
||||
RNA_def_struct_ui_text(srna, "String Properties", "Collection of string properties");
|
||||
|
||||
func = RNA_def_function(srna, "new", "rna_Mesh_string_property_new");
|
||||
func = RNA_def_function(srna, "new", "rna_Mesh_polygon_string_property_new");
|
||||
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
|
||||
RNA_def_function_ui_description(func, "Add a string property layer to Mesh");
|
||||
RNA_def_string(func, "name", "String Prop", 0, "", "String property name");
|
||||
@@ -2629,29 +2629,29 @@ static void rna_def_mesh(BlenderRNA *brna)
|
||||
RNA_def_property_ui_text(prop, "Vertex Colors", "All vertex colors");
|
||||
rna_def_loop_colors(brna, prop);
|
||||
|
||||
prop = RNA_def_property(srna, "layers_float", PROP_COLLECTION, PROP_NONE);
|
||||
prop = RNA_def_property(srna, "polygon_layers_float", PROP_COLLECTION, PROP_NONE);
|
||||
RNA_def_property_collection_sdna(prop, NULL, "pdata.layers", "pdata.totlayer");
|
||||
RNA_def_property_collection_funcs(prop, "rna_Mesh_float_layers_begin", NULL, NULL, NULL,
|
||||
"rna_Mesh_float_layers_length", NULL, NULL, NULL);
|
||||
RNA_def_property_collection_funcs(prop, "rna_Mesh_polygon_float_layers_begin", NULL, NULL, NULL,
|
||||
"rna_Mesh_polygon_float_layers_length", NULL, NULL, NULL);
|
||||
RNA_def_property_struct_type(prop, "MeshFloatPropertyLayer");
|
||||
RNA_def_property_ui_text(prop, "Float Property Layers", "");
|
||||
rna_def_float_layers(brna, prop);
|
||||
rna_def_polygon_float_layers(brna, prop);
|
||||
|
||||
prop = RNA_def_property(srna, "layers_int", PROP_COLLECTION, PROP_NONE);
|
||||
prop = RNA_def_property(srna, "polygon_layers_int", PROP_COLLECTION, PROP_NONE);
|
||||
RNA_def_property_collection_sdna(prop, NULL, "pdata.layers", "pdata.totlayer");
|
||||
RNA_def_property_collection_funcs(prop, "rna_Mesh_int_layers_begin", NULL, NULL, NULL,
|
||||
"rna_Mesh_int_layers_length", NULL, NULL, NULL);
|
||||
RNA_def_property_collection_funcs(prop, "rna_Mesh_polygon_int_layers_begin", NULL, NULL, NULL,
|
||||
"rna_Mesh_polygon_int_layers_length", NULL, NULL, NULL);
|
||||
RNA_def_property_struct_type(prop, "MeshIntPropertyLayer");
|
||||
RNA_def_property_ui_text(prop, "Int Property Layers", "");
|
||||
rna_def_int_layers(brna, prop);
|
||||
rna_def_polygon_int_layers(brna, prop);
|
||||
|
||||
prop = RNA_def_property(srna, "layers_string", PROP_COLLECTION, PROP_NONE);
|
||||
prop = RNA_def_property(srna, "polygon_layers_string", PROP_COLLECTION, PROP_NONE);
|
||||
RNA_def_property_collection_sdna(prop, NULL, "pdata.layers", "pdata.totlayer");
|
||||
RNA_def_property_collection_funcs(prop, "rna_Mesh_string_layers_begin", NULL, NULL, NULL,
|
||||
"rna_Mesh_string_layers_length", NULL, NULL, NULL);
|
||||
RNA_def_property_collection_funcs(prop, "rna_Mesh_polygon_string_layers_begin", NULL, NULL, NULL,
|
||||
"rna_Mesh_polygon_string_layers_length", NULL, NULL, NULL);
|
||||
RNA_def_property_struct_type(prop, "MeshStringPropertyLayer");
|
||||
RNA_def_property_ui_text(prop, "String Property Layers", "");
|
||||
rna_def_string_layers(brna, prop);
|
||||
rna_def_polygon_string_layers(brna, prop);
|
||||
|
||||
prop = RNA_def_property(srna, "use_auto_smooth", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_AUTOSMOOTH);
|
||||
|
||||
@@ -47,66 +47,69 @@
|
||||
|
||||
#ifdef UNIT_TEST
|
||||
|
||||
#define DEF_VARS(type, prefix) \
|
||||
static type prefix ## arr[ARRAY_SIZE]; \
|
||||
static type prefix ## darr[DYNAMIC_ARRAY_SIZE]; \
|
||||
static int prefix ## darr_len = ARRAY_SIZE; \
|
||||
static type prefix ## marr MARRAY_DIM; \
|
||||
static type prefix ## dmarr DYNAMIC_MARRAY_DIM; \
|
||||
static int prefix ## dmarr_len = sizeof(prefix ## dmarr);
|
||||
#define DEF_VARS(type, prefix) \
|
||||
static type prefix ## arr[ARRAY_SIZE]; \
|
||||
static type prefix ## darr[DYNAMIC_ARRAY_SIZE]; \
|
||||
static int prefix ## darr_len = ARRAY_SIZE; \
|
||||
static type prefix ## marr MARRAY_DIM; \
|
||||
static type prefix ## dmarr DYNAMIC_MARRAY_DIM; \
|
||||
static int prefix ## dmarr_len = sizeof(prefix ## dmarr); \
|
||||
(void)0
|
||||
|
||||
#define DEF_GET_SET(type, arr) \
|
||||
void rna_Test_ ## arr ## _get(PointerRNA *ptr, type *values) \
|
||||
{ \
|
||||
memcpy(values, arr, sizeof(arr)); \
|
||||
} \
|
||||
\
|
||||
void rna_Test_ ## arr ## _set(PointerRNA *ptr, const type *values) \
|
||||
{ \
|
||||
memcpy(arr, values, sizeof(arr)); \
|
||||
}
|
||||
#define DEF_GET_SET(type, arr) \
|
||||
void rna_Test_ ## arr ## _get(PointerRNA * ptr, type * values) \
|
||||
{ \
|
||||
memcpy(values, arr, sizeof(arr)); \
|
||||
} \
|
||||
\
|
||||
void rna_Test_ ## arr ## _set(PointerRNA * ptr, const type * values) \
|
||||
{ \
|
||||
memcpy(arr, values, sizeof(arr)); \
|
||||
} \
|
||||
(void)0
|
||||
|
||||
#define DEF_GET_SET_LEN(arr, max) \
|
||||
static int rna_Test_ ## arr ## _get_length(PointerRNA *ptr) \
|
||||
{ \
|
||||
return arr ## _len; \
|
||||
} \
|
||||
\
|
||||
static int rna_Test_ ## arr ## _set_length(PointerRNA *ptr, int length) \
|
||||
{ \
|
||||
if (length > max) \
|
||||
return 0; \
|
||||
\
|
||||
arr ## _len = length; \
|
||||
\
|
||||
return 1; \
|
||||
} \
|
||||
#define DEF_GET_SET_LEN(arr, max) \
|
||||
static int rna_Test_ ## arr ## _get_length(PointerRNA * ptr) \
|
||||
{ \
|
||||
return arr ## _len; \
|
||||
} \
|
||||
\
|
||||
static int rna_Test_ ## arr ## _set_length(PointerRNA * ptr, int length) \
|
||||
{ \
|
||||
if (length > max) \
|
||||
return 0; \
|
||||
\
|
||||
arr ## _len = length; \
|
||||
\
|
||||
return 1; \
|
||||
} \
|
||||
(void)0
|
||||
|
||||
DEF_VARS(float, f)
|
||||
DEF_VARS(int, i)
|
||||
DEF_VARS(int, b)
|
||||
DEF_VARS(float, f);
|
||||
DEF_VARS(int, i);
|
||||
DEF_VARS(int, b);
|
||||
|
||||
DEF_GET_SET(float, farr)
|
||||
DEF_GET_SET(int, iarr)
|
||||
DEF_GET_SET(int, barr)
|
||||
DEF_GET_SET(float, farr);
|
||||
DEF_GET_SET(int, iarr);
|
||||
DEF_GET_SET(int, barr);
|
||||
|
||||
DEF_GET_SET(float, fmarr)
|
||||
DEF_GET_SET(int, imarr)
|
||||
DEF_GET_SET(int, bmarr)
|
||||
DEF_GET_SET(float, fmarr);
|
||||
DEF_GET_SET(int, imarr);
|
||||
DEF_GET_SET(int, bmarr);
|
||||
|
||||
DEF_GET_SET(float, fdarr)
|
||||
DEF_GET_SET_LEN(fdarr, DYNAMIC_ARRAY_SIZE)
|
||||
DEF_GET_SET(int, idarr)
|
||||
DEF_GET_SET_LEN(idarr, DYNAMIC_ARRAY_SIZE)
|
||||
DEF_GET_SET(int, bdarr)
|
||||
DEF_GET_SET_LEN(bdarr, DYNAMIC_ARRAY_SIZE)
|
||||
DEF_GET_SET(float, fdarr);
|
||||
DEF_GET_SET_LEN(fdarr, DYNAMIC_ARRAY_SIZE);
|
||||
DEF_GET_SET(int, idarr);
|
||||
DEF_GET_SET_LEN(idarr, DYNAMIC_ARRAY_SIZE);
|
||||
DEF_GET_SET(int, bdarr);
|
||||
DEF_GET_SET_LEN(bdarr, DYNAMIC_ARRAY_SIZE);
|
||||
|
||||
DEF_GET_SET(float, fdmarr)
|
||||
DEF_GET_SET_LEN(fdmarr, DYNAMIC_MARRAY_SIZE(float))
|
||||
DEF_GET_SET(int, idmarr)
|
||||
DEF_GET_SET_LEN(idmarr, DYNAMIC_MARRAY_SIZE(int))
|
||||
DEF_GET_SET(int, bdmarr)
|
||||
DEF_GET_SET_LEN(bdmarr, DYNAMIC_MARRAY_SIZE(int))
|
||||
DEF_GET_SET(float, fdmarr);
|
||||
DEF_GET_SET_LEN(fdmarr, DYNAMIC_MARRAY_SIZE(float));
|
||||
DEF_GET_SET(int, idmarr);
|
||||
DEF_GET_SET_LEN(idmarr, DYNAMIC_MARRAY_SIZE(int));
|
||||
DEF_GET_SET(int, bdmarr);
|
||||
DEF_GET_SET_LEN(bdmarr, DYNAMIC_MARRAY_SIZE(int));
|
||||
|
||||
#endif
|
||||
|
||||
@@ -186,4 +189,4 @@ void RNA_def_test(BlenderRNA *brna)
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* RNA_RUNTIME */
|
||||
#endif /* RNA_RUNTIME */
|
||||
|
||||
@@ -37,6 +37,14 @@
|
||||
|
||||
#ifdef RNA_RUNTIME
|
||||
|
||||
#include "WM_api.h"
|
||||
|
||||
static void rna_TimelineMarker_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
|
||||
{
|
||||
WM_main_add_notifier(NC_SCENE|ND_MARKERS, NULL);
|
||||
WM_main_add_notifier(NC_ANIMATION|ND_MARKERS, NULL);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void rna_def_timeline_marker(BlenderRNA *brna)
|
||||
@@ -52,16 +60,16 @@ static void rna_def_timeline_marker(BlenderRNA *brna)
|
||||
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
|
||||
RNA_def_property_ui_text(prop, "Name", "");
|
||||
RNA_def_struct_name_property(srna, prop);
|
||||
RNA_def_property_update(prop, NC_ANIMATION, NULL);
|
||||
RNA_def_property_update(prop, 0, "rna_TimelineMarker_update");
|
||||
|
||||
prop = RNA_def_property(srna, "frame", PROP_INT, PROP_TIME);
|
||||
RNA_def_property_ui_text(prop, "Frame", "The frame on which the timeline marker appears");
|
||||
RNA_def_property_update(prop, NC_ANIMATION, NULL);
|
||||
RNA_def_property_update(prop, 0, "rna_TimelineMarker_update");
|
||||
|
||||
prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", 1 /*SELECT*/);
|
||||
RNA_def_property_ui_text(prop, "Select", "Marker selection state");
|
||||
RNA_def_property_update(prop, NC_ANIMATION, NULL);
|
||||
RNA_def_property_update(prop, 0, "rna_TimelineMarker_update");
|
||||
|
||||
#ifdef DURIAN_CAMERA_SWITCH
|
||||
prop = RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
|
||||
|
||||
@@ -474,20 +474,20 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
|
||||
}
|
||||
|
||||
if ((amd->flags & MOD_ARR_MERGE) &&
|
||||
(amd->flags & MOD_ARR_MERGEFINAL) &&
|
||||
(count > 1)) {
|
||||
(amd->flags & MOD_ARR_MERGEFINAL) &&
|
||||
(count > 1))
|
||||
{
|
||||
/* Merge first and last copies. Note that we can't use the
|
||||
indexMap for this because (unless the array is forming a
|
||||
loop) the offset between first and last is different from
|
||||
dupe X to dupe X+1. */
|
||||
* indexMap for this because (unless the array is forming a
|
||||
* loop) the offset between first and last is different from
|
||||
* dupe X to dupe X+1. */
|
||||
|
||||
merge_first_last(em->bm, amd, &first_dupe_op, &dupe_op, &weld_op);
|
||||
}
|
||||
|
||||
/* start capping */
|
||||
if (start_cap || end_cap)
|
||||
{
|
||||
BM_mesh_elem_flag_enable_all(em->bm, BM_VERT, BM_ELEM_TAG);
|
||||
if (start_cap || end_cap) {
|
||||
BM_mesh_elem_flag_enable_all(em->bm, BM_VERT, BM_ELEM_TAG, FALSE);
|
||||
|
||||
if (start_cap) {
|
||||
float startoffset[4][4];
|
||||
|
||||
@@ -418,7 +418,7 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
|
||||
mface->v4 = (csgface.vertex_number == 4)? csgface.vertex_index[3]: 0;
|
||||
|
||||
// set material, based on lookup in hash table
|
||||
orig_mat= give_current_material(orig_ob, mface->mat_nr+1);
|
||||
orig_mat = give_current_material(orig_ob, mface->mat_nr + 1);
|
||||
|
||||
if (mat && orig_mat) {
|
||||
if (!BLI_ghash_haskey(material_hash, orig_mat)) {
|
||||
|
||||
@@ -205,10 +205,11 @@ static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFa
|
||||
}
|
||||
|
||||
#define SET_VERTS(a, b, c, d) \
|
||||
v[0]=mf->v##a; uv[0]=a-1; \
|
||||
v[1]=mf->v##b; uv[1]=b-1; \
|
||||
v[2]=mf->v##c; uv[2]=c-1; \
|
||||
v[3]=mf->v##d; uv[3]=d-1;
|
||||
v[0] = mf->v##a; uv[0]=a-1; \
|
||||
v[1] = mf->v##b; uv[1]=b-1; \
|
||||
v[2] = mf->v##c; uv[2]=c-1; \
|
||||
v[3] = mf->v##d; uv[3]=d-1; \
|
||||
(void)0
|
||||
|
||||
#define GET_ES(v1, v2) edgecut_get(eh, v1, v2)
|
||||
#define INT_UV(uvf, c0, c1) interp_v2_v2v2(uvf, mf->uv[c0], mf->uv[c1], 0.5f)
|
||||
@@ -683,30 +684,30 @@ static DerivedMesh * cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
|
||||
case 10:
|
||||
case 11:
|
||||
case 15:
|
||||
SET_VERTS(1, 2, 3, 4)
|
||||
SET_VERTS(1, 2, 3, 4);
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
SET_VERTS(2, 3, 4, 1)
|
||||
SET_VERTS(2, 3, 4, 1);
|
||||
break;
|
||||
case 9:
|
||||
case 13:
|
||||
SET_VERTS(4, 1, 2, 3)
|
||||
SET_VERTS(4, 1, 2, 3);
|
||||
break;
|
||||
case 12:
|
||||
case 14:
|
||||
SET_VERTS(3, 4, 1, 2)
|
||||
SET_VERTS(3, 4, 1, 2);
|
||||
break;
|
||||
case 21:
|
||||
case 23:
|
||||
SET_VERTS(1, 2, 3, 4)
|
||||
SET_VERTS(1, 2, 3, 4);
|
||||
break;
|
||||
case 19:
|
||||
SET_VERTS(2, 3, 1, 4)
|
||||
SET_VERTS(2, 3, 1, 4);
|
||||
break;
|
||||
case 22:
|
||||
SET_VERTS(3, 1, 2, 4)
|
||||
SET_VERTS(3, 1, 2, 4);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,8 @@ static bNodeSocketTemplate cmp_node_bilateralblur_out[]= {
|
||||
mean1[0] = src[0]; \
|
||||
mean1[1] = src[1]; \
|
||||
mean1[2] = src[2]; \
|
||||
mean1[3] = src[3];
|
||||
mean1[3] = src[3]; \
|
||||
(void)0
|
||||
|
||||
/* finds color distances */
|
||||
#define COLOR_DISTANCE_C3(c1, c2) \
|
||||
@@ -66,25 +67,28 @@ static bNodeSocketTemplate cmp_node_bilateralblur_out[]= {
|
||||
(double)COLOR_DISTANCE_C3(ref, ref_color ) * i2sigma_color; \
|
||||
w = 1.0/(w*w + 1); \
|
||||
mean0 += w; \
|
||||
mean1[0] += (double)temp_color[0]*w; \
|
||||
mean1[1] += (double)temp_color[1]*w; \
|
||||
mean1[2] += (double)temp_color[2]*w; \
|
||||
mean1[3] += (double)temp_color[3]*w;
|
||||
mean1[0] += (double)temp_color[0] * w; \
|
||||
mean1[1] += (double)temp_color[1] * w; \
|
||||
mean1[2] += (double)temp_color[2] * w; \
|
||||
mean1[3] += (double)temp_color[3] * w; \
|
||||
(void)0
|
||||
|
||||
/* write blurred values to image */
|
||||
#define UPDATE_OUTPUT_C3 \
|
||||
mean0 = 1.0/mean0; \
|
||||
dest[x*pix + 0] = mean1[0]*mean0; \
|
||||
dest[x*pix + 1] = mean1[1]*mean0; \
|
||||
dest[x*pix + 2] = mean1[2]*mean0; \
|
||||
dest[x*pix + 3] = mean1[3]*mean0;
|
||||
dest[x * pix + 0] = mean1[0] * mean0; \
|
||||
dest[x * pix + 1] = mean1[1] * mean0; \
|
||||
dest[x * pix + 2] = mean1[2] * mean0; \
|
||||
dest[x * pix + 3] = mean1[3] * mean0; \
|
||||
(void)0
|
||||
|
||||
/* initializes deltas for fast access to neighbor pixels */
|
||||
#define INIT_3X3_DELTAS( deltas, step, nch ) \
|
||||
((deltas)[0] = (nch), (deltas)[1] = -(step) + (nch), \
|
||||
(deltas)[2] = -(step), (deltas)[3] = -(step) - (nch), \
|
||||
(deltas)[4] = -(nch), (deltas)[5] = (step) - (nch), \
|
||||
(deltas)[6] = (step), (deltas)[7] = (step) + (nch));
|
||||
(deltas)[6] = (step), (deltas)[7] = (step) + (nch)); \
|
||||
(void)0
|
||||
|
||||
|
||||
/* code of this node was heavily inspired by the smooth function of opencv library.
|
||||
|
||||
@@ -3869,6 +3869,13 @@ static PyObject *pyrna_prop_collection_idprop_remove(BPy_PropertyRNA *self, PyOb
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *pyrna_prop_collection_idprop_clear(BPy_PropertyRNA *self)
|
||||
{
|
||||
RNA_property_collection_clear(&self->ptr, self->prop);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *pyrna_prop_collection_idprop_move(BPy_PropertyRNA *self, PyObject *args)
|
||||
{
|
||||
int key = 0, pos = 0;
|
||||
@@ -4580,6 +4587,7 @@ static struct PyMethodDef pyrna_prop_collection_methods[] = {
|
||||
static struct PyMethodDef pyrna_prop_collection_idprop_methods[] = {
|
||||
{"add", (PyCFunction)pyrna_prop_collection_idprop_add, METH_NOARGS, NULL},
|
||||
{"remove", (PyCFunction)pyrna_prop_collection_idprop_remove, METH_O, NULL},
|
||||
{"clear", (PyCFunction)pyrna_prop_collection_idprop_clear, METH_NOARGS, NULL},
|
||||
{"move", (PyCFunction)pyrna_prop_collection_idprop_move, METH_VARARGS, NULL},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
@@ -2213,6 +2213,27 @@ PyDoc_STRVAR(Matrix_is_orthogonal_doc,
|
||||
"True if this matrix is orthogonal, 3x3 and 4x4 only, (read-only).\n\n:type: bool"
|
||||
);
|
||||
static PyObject *Matrix_is_orthogonal_get(MatrixObject *self, void *UNUSED(closure))
|
||||
{
|
||||
if (BaseMath_ReadCallback(self) == -1)
|
||||
return NULL;
|
||||
|
||||
/*must be 3-4 cols, 3-4 rows, square matrix*/
|
||||
if (self->num_row == 4 && self->num_col == 4)
|
||||
return PyBool_FromLong(is_orthonormal_m4((float (*)[4])self->matrix));
|
||||
else if (self->num_row == 3 && self->num_col == 3)
|
||||
return PyBool_FromLong(is_orthonormal_m3((float (*)[3])self->matrix));
|
||||
else {
|
||||
PyErr_SetString(PyExc_AttributeError,
|
||||
"Matrix.is_orthogonal: "
|
||||
"inappropriate matrix size - expects 3x3 or 4x4 matrix");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(Matrix_is_orthogonal_axis_vectors_doc,
|
||||
"True if this matrix has got orthogonal axis vectors, 3x3 and 4x4 only, (read-only).\n\n:type: bool"
|
||||
);
|
||||
static PyObject *Matrix_is_orthogonal_axis_vectors_get(MatrixObject *self, void *UNUSED(closure))
|
||||
{
|
||||
if (BaseMath_ReadCallback(self) == -1)
|
||||
return NULL;
|
||||
@@ -2224,7 +2245,7 @@ static PyObject *Matrix_is_orthogonal_get(MatrixObject *self, void *UNUSED(closu
|
||||
return PyBool_FromLong(is_orthogonal_m3((float (*)[3])self->matrix));
|
||||
else {
|
||||
PyErr_SetString(PyExc_AttributeError,
|
||||
"Matrix.is_orthogonal: "
|
||||
"Matrix.is_orthogonal_axis_vectors: "
|
||||
"inappropriate matrix size - expects 3x3 or 4x4 matrix");
|
||||
return NULL;
|
||||
}
|
||||
@@ -2240,6 +2261,7 @@ static PyGetSetDef Matrix_getseters[] = {
|
||||
{(char *)"col", (getter)Matrix_col_get, (setter)NULL, Matrix_col_doc, NULL},
|
||||
{(char *)"is_negative", (getter)Matrix_is_negative_get, (setter)NULL, Matrix_is_negative_doc, NULL},
|
||||
{(char *)"is_orthogonal", (getter)Matrix_is_orthogonal_get, (setter)NULL, Matrix_is_orthogonal_doc, NULL},
|
||||
{(char *)"is_orthogonal_axis_vectors", (getter)Matrix_is_orthogonal_axis_vectors_get, (setter)NULL, Matrix_is_orthogonal_axis_vectors_doc, NULL},
|
||||
{(char *)"is_wrapped", (getter)BaseMathObject_is_wrapped_get, (setter)NULL, BaseMathObject_is_wrapped_doc, NULL},
|
||||
{(char *)"owner", (getter)BaseMathObject_owner_get, (setter)NULL, BaseMathObject_owner_doc, NULL},
|
||||
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
|
||||
|
||||
@@ -5922,7 +5922,7 @@ void RE_make_sticky(Scene *scene, View3D *v3d)
|
||||
RE_SetView(re, mat);
|
||||
|
||||
for (base= FIRSTBASE; base; base= base->next) {
|
||||
if TESTBASELIB(v3d, base) {
|
||||
if (TESTBASELIB(v3d, base)) {
|
||||
if (base->object->type==OB_MESH) {
|
||||
ob= base->object;
|
||||
|
||||
|
||||
@@ -397,7 +397,7 @@ static float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, const float w[3
|
||||
case MA_VOL_PH_RAYLEIGH:
|
||||
return normalize * 3.f/4.f * (1 + costheta * costheta);
|
||||
case MA_VOL_PH_HG:
|
||||
return normalize * (1.f - g*g) / powf(1.f + g*g - 2.f * g * costheta, 1.5f));
|
||||
return normalize * (1.f - g * g) / powf(1.f + g * g - 2.f * g * costheta, 1.5f);
|
||||
case MA_VOL_PH_SCHLICK:
|
||||
{
|
||||
const float k = 1.55f * g - .55f * g * g * g;
|
||||
|
||||
Reference in New Issue
Block a user