From 69585591d6a1d1fdac1e6b6ce508ccd3d936e2ac Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 03:25:47 +0000 Subject: Correct fix for r54164, the testcase I was using worked but different edge slide examples didn't. Edge slide needed to check for concave ngons too. add BM_loop_is_convex() and expose to python too. --- source/blender/bmesh/intern/bmesh_queries.c | 18 +++++++++++++++++- source/blender/bmesh/intern/bmesh_queries.h | 2 ++ source/blender/editors/transform/transform.c | 2 +- source/blender/python/bmesh/bmesh_py_types.c | 12 +++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 7ed23aaf1f8..bf30db78a61 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -1006,6 +1006,22 @@ void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2) BM_edge_ordered_verts_ex(edge, r_v1, r_v2, edge->l); } +/** + * Check if the loop is convex or concave + * (depends on face normal) + */ +bool BM_loop_is_convex(BMLoop *l) +{ + float e_dir_prev[3]; + float e_dir_next[3]; + float l_no[3]; + + sub_v3_v3v3(e_dir_prev, l->prev->v->co, l->v->co); + sub_v3_v3v3(e_dir_next, l->next->v->co, l->v->co); + cross_v3_v3v3(l_no, e_dir_next, e_dir_prev); + return dot_v3v3(l_no, l->f->no) > 0.0f; +} + /** * Calculates the angle between the previous and next loops * (angle at this loops face corner). @@ -1034,7 +1050,7 @@ void BM_loop_calc_face_normal(BMLoop *l, float r_normal[3]) l->v->co, l->next->v->co) != 0.0f) { - return; + /* pass */ } else { copy_v3_v3(r_normal, l->f->no); diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index 9892700162e..4172b3905cd 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -62,6 +62,8 @@ bool BM_vert_is_manifold(BMVert *v); bool BM_edge_is_manifold(BMEdge *e); bool BM_edge_is_boundary(BMEdge *e); +bool BM_loop_is_convex(BMLoop *l); + float BM_loop_calc_face_angle(BMLoop *l); void BM_loop_calc_face_normal(BMLoop *l, float r_normal[3]); void BM_loop_calc_face_tangent(BMLoop *l, float r_tangent[3]); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index c4960de1e19..fb2d9af7c35 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4932,7 +4932,7 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, /* check if we need to flip * (compare the normal defines by the edges with the face normal) */ cross_v3_v3v3(tvec, e_dir_prev, e_dir_next); - if (dot_v3v3(tvec, l->f->no) > 0.0f) { + if ((dot_v3v3(tvec, l->f->no) < 0.0f) == BM_loop_is_convex(l)) { negate_v3(vec_accum); } } diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index ed7b48fb14f..202d1964bd6 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -559,6 +559,15 @@ static PyObject *bpy_bmloop_link_loop_radial_prev_get(BPy_BMLoop *self) return BPy_BMLoop_CreatePyObject(self->bm, self->l->radial_prev); } +PyDoc_STRVAR(bpy_bm_is_convex_doc, +"True when this loop is at the convex corner of a face, depends on a valid face normal (read-only).\n\n:type: :class:`BMLoop`" +); +static PyObject *bpy_bm_is_convex_get(BPy_BMLoop *self) +{ + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_loop_is_convex(self->l)); +} + /* ElemSeq * ^^^^^^^ */ @@ -721,7 +730,8 @@ static PyGetSetDef bpy_bmloop_getseters[] = { {(char *)"link_loop_radial_prev", (getter)bpy_bmloop_link_loop_radial_prev_get, (setter)NULL, (char *)bpy_bmloop_link_loop_radial_prev_doc, NULL}, /* readonly checks */ - {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, + {(char *)"is_convex", (getter)bpy_bm_is_convex_get, (setter)NULL, (char *)bpy_bm_is_convex_doc, NULL}, + {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; -- cgit v1.2.3 From e9a4dd202e9032435b102b800c5d12f4f689f4d0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 05:18:30 +0000 Subject: fix for fix, ugh!, vertex slide with concave/convex ngons & normal flipping should now work properly in all cases. ... somehow I managed to make test-cases that worked in previous commits but failed in other cases. --- source/blender/blenlib/intern/math_vector_inline.c | 1 + source/blender/editors/transform/transform.c | 29 ++++++++++------------ 2 files changed, 14 insertions(+), 16 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c index 8c62fdf81a7..c4def539c10 100644 --- a/source/blender/blenlib/intern/math_vector_inline.c +++ b/source/blender/blenlib/intern/math_vector_inline.c @@ -528,6 +528,7 @@ MINLINE float cross_v2v2(const float a[2], const float b[2]) MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3]) { + BLI_assert(r != a && r != b); r[0] = a[1] * b[2] - a[2] * b[1]; r[1] = a[2] * b[0] - a[0] * b[2]; r[2] = a[0] * b[1] - a[1] * b[0]; diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index fb2d9af7c35..6d11eebe7dc 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4917,23 +4917,20 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, len_v3_ensure(vec_accum, vec_accum_len / (float)i); } else { - /* When there is no edge to slide along, - * we must slide along the vector defined by the face we're attach to */ - float e_dir_prev[3], e_dir_next[3], tvec[3]; + BMLoop *l_tmp = BM_face_vert_share_loop(l_first->f, v); - sub_v3_v3v3(e_dir_prev, BM_edge_other_vert(e_prev, v)->co, v->co); - sub_v3_v3v3(e_dir_next, BM_edge_other_vert(e_next, v)->co, v->co); - - cross_v3_v3v3(tvec, l->f->no, e_dir_prev); - cross_v3_v3v3(vec_accum, e_dir_next, l->f->no); - - mid_v3_v3v3(vec_accum, vec_accum, tvec); - - /* check if we need to flip - * (compare the normal defines by the edges with the face normal) */ - cross_v3_v3v3(tvec, e_dir_prev, e_dir_next); - if ((dot_v3v3(tvec, l->f->no) < 0.0f) == BM_loop_is_convex(l)) { - negate_v3(vec_accum); + if (ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next)) { + float tvec[3]; + BM_loop_calc_face_tangent(l_tmp, vec_accum); + if (!BM_loop_is_convex(l_tmp)) { + negate_v3(vec_accum); + } + cross_v3_v3v3(tvec, vec_accum, l_tmp->f->no); + cross_v3_v3v3(vec_accum, l_tmp->f->no, tvec); + len_v3_ensure(vec_accum, (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f); + } + else { + BLI_assert(0); } } -- cgit v1.2.3 From 0d0dc37aeefdada8a97d5434c064850ef79ff765 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 05:30:39 +0000 Subject: tweak to edge slide - use a quads opposite vertex when both edges share a quad, gives nicer results. --- source/blender/editors/transform/transform.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 6d11eebe7dc..e660a43767a 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4917,10 +4917,19 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, len_v3_ensure(vec_accum, vec_accum_len / (float)i); } else { + /* When there is no edge to slide along, + * we must slide along the vector defined by the face we're attach to */ BMLoop *l_tmp = BM_face_vert_share_loop(l_first->f, v); + float tvec[3]; - if (ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next)) { - float tvec[3]; + BLI_assert(ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next)); + + if (l_tmp->f->len == 4) { + /* we could use code below, but in this case + * sliding diagonally across the quad works well */ + sub_v3_v3v3(vec_accum, l_tmp->next->next->v->co, v->co); + } + else { BM_loop_calc_face_tangent(l_tmp, vec_accum); if (!BM_loop_is_convex(l_tmp)) { negate_v3(vec_accum); @@ -4929,9 +4938,6 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, cross_v3_v3v3(vec_accum, l_tmp->f->no, tvec); len_v3_ensure(vec_accum, (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f); } - else { - BLI_assert(0); - } } copy_v3_v3(r_slide_vec, vec_accum); -- cgit v1.2.3 From 7834f72282c308dd4927dad97320bccf33115327 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 29 Jan 2013 08:01:50 +0000 Subject: More UI messages tweaks and fixes. Please do not use points inside tooltips, unless they are absolutely mandatory (they are ugly, as we do not have final points!). --- source/blender/editors/screen/screendump.c | 6 ++++-- source/blender/makesrna/intern/rna_scene.c | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index efd0db3b442..1f7fee313b3 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -272,7 +272,8 @@ void SCREEN_OT_screenshot(wmOperatorType *ot) WM_operator_properties_filesel(ot, FOLDERFILE | IMAGEFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH, FILE_DEFAULTDISPLAY); - RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "Capture the whole window. Otherwise only capture the active area"); + RNA_def_boolean(ot->srna, "full", 1, "Full Screen", + "Capture the whole window (otherwise only capture the active area)"); } /* *************** screenshot movie job ************************* */ @@ -500,5 +501,6 @@ void SCREEN_OT_screencast(wmOperatorType *ot) ot->flag = 0; RNA_def_property(ot->srna, "filepath", PROP_STRING, PROP_FILEPATH); - RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "Capture the whole window. Otherwise only capture the active area"); + RNA_def_boolean(ot->srna, "full", 1, "Full Screen", + "Capture the whole window (otherwise only capture the active area)"); } diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index cac423b8d43..300be20b25e 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2691,8 +2691,8 @@ static void rna_def_scene_game_data(BlenderRNA *brna) prop = RNA_def_property(srna, "use_occlusion_culling", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_DBVT_CULLING); RNA_def_property_ui_text(prop, "DBVT Culling", - "Use optimized Bullet DBVT tree for view frustum and occlusion culling " - "(more efficient, but it can waste unecessary CPU if the scene doesn't have Occluder objects"); + "Use optimized Bullet DBVT tree for view frustum and occlusion culling (more efficient, " + "but it can waste unnecessary CPU if the scene doesn't have occluder objects)"); /* not used *//* deprecated !!!!!!!!!!!!! */ prop = RNA_def_property(srna, "use_activity_culling", PROP_BOOLEAN, PROP_NONE); -- cgit v1.2.3 From 340845289b6b77c8d1390f237c25ebe46d3b7f30 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 08:19:23 +0000 Subject: fix [#34024] delete - Edge loop crash --- source/blender/editors/transform/transform.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index e660a43767a..114a8c7a06c 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -5028,6 +5028,7 @@ static int createEdgeSlideVerts(TransInfo *t) BMEdge *e, *e1; BMVert *v, *v2; TransDataEdgeSlideVert *sv_array; + int sv_tot; BMBVHTree *btree; SmallHash table; EdgeSlideData *sld = MEM_callocN(sizeof(*sld), "sld"); @@ -5127,10 +5128,10 @@ static int createEdgeSlideVerts(TransInfo *t) return 0; } - sv_array = MEM_callocN(sizeof(TransDataEdgeSlideVert) * j, "sv_array"); + sv_tot = j; + sv_array = MEM_callocN(sizeof(TransDataEdgeSlideVert) * sv_tot, "sv_array"); loop_nr = 0; - j = 0; while (1) { BMLoop *l, *l1, *l2; BMVert *v_first; @@ -5190,10 +5191,10 @@ static int createEdgeSlideVerts(TransInfo *t) /*iterate over the loop*/ v_first = v; do { - TransDataEdgeSlideVert *sv = sv_array + j; - - BLI_assert(j < MEM_allocN_len(sv_array) / sizeof(*sv)); + TransDataEdgeSlideVert *sv; + /* XXX, 'sv' will initialize multiple times, this is suspicious. see [#34024] */ + sv = sv_array + GET_INT_FROM_POINTER(BLI_smallhash_lookup(&table, (uintptr_t)v)); sv->v = v; sv->origvert = *v; sv->loop_nr = loop_nr; @@ -5215,11 +5216,7 @@ static int createEdgeSlideVerts(TransInfo *t) e1 = e; e = get_other_edge(v, e); if (!e) { - //v2=v, v = BM_edge_other_vert(l1->e, v); - - BLI_assert(j + 1 < MEM_allocN_len(sv_array) / sizeof(*sv)); - - sv = sv_array + j + 1; + sv = sv_array + GET_INT_FROM_POINTER(BLI_smallhash_lookup(&table, (uintptr_t)v)); sv->v = v; sv->origvert = *v; sv->loop_nr = loop_nr; @@ -5236,16 +5233,13 @@ static int createEdgeSlideVerts(TransInfo *t) BM_elem_flag_disable(v, BM_ELEM_TAG); BM_elem_flag_disable(v2, BM_ELEM_TAG); - - j += 2; + break; } l1 = get_next_loop(v, l1, e1, e, vec); l2 = l2 ? get_next_loop(v, l2, e1, e, vec2) : NULL; - j += 1; - BM_elem_flag_disable(v, BM_ELEM_TAG); BM_elem_flag_disable(v2, BM_ELEM_TAG); } while (e != v_first->e && l1); @@ -5256,7 +5250,7 @@ static int createEdgeSlideVerts(TransInfo *t) /* EDBM_flag_disable_all(em, BM_ELEM_SELECT); */ sld->sv = sv_array; - sld->totsv = j; + sld->totsv = sv_tot; /* find mouse vectors, the global one, and one per loop in case we have * multiple loops selected, in case they are oriented different */ -- cgit v1.2.3 From 6d4a6b957c5fd23e3b1356c86e7f16ccd0708b12 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 29 Jan 2013 08:21:21 +0000 Subject: Fix #34009: multi user curves + deform modifier behavior Issue was caused by storing BB calculated from final displist in Curve datablock and not having Object's BB at all. This is not clear at how could have been worked for so long. Changed it so Curve's BB is calculated from non-deformed displist, which matches BKE_object_min_max and BKE_curve_texspace_calc and made it so Object's BB would be calculated from final displist. --- source/blender/blenkernel/intern/displist.c | 67 ++++++++++++++++------------- 1 file changed, 38 insertions(+), 29 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 23b0d3e6e22..ada33691c15 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -63,6 +63,7 @@ #include "BLO_sys_types.h" // for intptr_t support static void boundbox_displist(Object *ob); +static void boundbox_dispbase(BoundBox *bb, ListBase *dispbase); void BKE_displist_elem_free(DispList *dl) { @@ -1598,15 +1599,15 @@ void BKE_displist_make_curveTypes(Scene *scene, Object *ob, int forOrco) if (ob->derivedFinal) { DM_set_object_boundbox(ob, ob->derivedFinal); + + /* always keep curve's BB in sync with non-deformed displist */ + if (cu->bb == NULL) + cu->bb = MEM_callocN(sizeof(BoundBox), "boundbox"); + + boundbox_dispbase(cu->bb, &cu->disp); } else { boundbox_displist(ob); - - /* if there is no derivedMesh, object's boundbox is unneeded */ - if (ob->bb) { - MEM_freeN(ob->bb); - ob->bb = NULL; - } } } @@ -1642,42 +1643,50 @@ float *BKE_displist_make_orco(Scene *scene, Object *ob, DerivedMesh *derivedFina return orco; } -/* this is confusing, there's also min_max_object, appplying the obmat... */ -static void boundbox_displist(Object *ob) +static void boundbox_dispbase(BoundBox *bb, ListBase *dispbase) { - BoundBox *bb = NULL; float min[3], max[3]; DispList *dl; float *vert; int a, tot = 0; + int doit = 0; INIT_MINMAX(min, max); + for (dl = dispbase->first; dl; dl = dl->next) { + tot = (dl->type == DL_INDEX3) ? dl->nr : dl->nr * dl->parts; + vert = dl->verts; + for (a = 0; a < tot; a++, vert += 3) { + minmax_v3v3_v3(min, max, vert); + } + doit |= (tot != 0); + } + + if (!doit) { + /* there's no geometry in displist, use zero-sized boundbox */ + zero_v3(min); + zero_v3(max); + } + + BKE_boundbox_init_from_minmax(bb, min, max); +} + +/* this is confusing, there's also min_max_object, appplying the obmat... */ +static void boundbox_displist(Object *ob) +{ if (ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) { Curve *cu = ob->data; - int doit = 0; - if (cu->bb == NULL) cu->bb = MEM_callocN(sizeof(BoundBox), "boundbox"); - bb = cu->bb; + /* calculate curve's BB based on non-deformed displist */ + if (cu->bb == NULL) + cu->bb = MEM_callocN(sizeof(BoundBox), "boundbox"); - for (dl = ob->disp.first; dl; dl = dl->next) { - tot = (dl->type == DL_INDEX3) ? dl->nr : dl->nr * dl->parts; - vert = dl->verts; - for (a = 0; a < tot; a++, vert += 3) { - minmax_v3v3_v3(min, max, vert); - } - doit = (tot != 0); - } + boundbox_dispbase(cu->bb, &cu->disp); - if (!doit) { - /* there's no geometry in displist, use zero-sized boundbox */ - zero_v3(min); - zero_v3(max); - } - - } + /* object's BB is calculated from final displist */ + if (ob->bb == NULL) + ob->bb = MEM_callocN(sizeof(BoundBox), "boundbox"); - if (bb) { - BKE_boundbox_init_from_minmax(bb, min, max); + boundbox_dispbase(ob->bb, &ob->disp); } } -- cgit v1.2.3 From 37489d71c7f0007ffc3aa252a4cc63d1aa903399 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 10:31:05 +0000 Subject: Triangulate modifier no longer uses bmesh operator api call, instead add a BM_mesh_triangulate() function. Gives ~2x speedup in my tests on an optimized build. --- source/blender/bmesh/CMakeLists.txt | 2 + source/blender/bmesh/bmesh.h | 3 +- source/blender/bmesh/intern/bmesh_polygon.c | 12 +++-- source/blender/bmesh/intern/bmesh_polygon.h | 5 +- source/blender/bmesh/operators/bmo_triangulate.c | 34 ++---------- source/blender/bmesh/tools/bmesh_triangulate.c | 66 +++++++++++++++++++++++ source/blender/bmesh/tools/bmesh_triangulate.h | 35 ++++++++++++ source/blender/modifiers/intern/MOD_triangulate.c | 10 +--- 8 files changed, 121 insertions(+), 46 deletions(-) create mode 100644 source/blender/bmesh/tools/bmesh_triangulate.c create mode 100644 source/blender/bmesh/tools/bmesh_triangulate.h (limited to 'source') diff --git a/source/blender/bmesh/CMakeLists.txt b/source/blender/bmesh/CMakeLists.txt index 42a1a5e0f3e..aa1fb2dda46 100644 --- a/source/blender/bmesh/CMakeLists.txt +++ b/source/blender/bmesh/CMakeLists.txt @@ -114,6 +114,8 @@ set(SRC tools/bmesh_decimate.h tools/bmesh_edgesplit.c tools/bmesh_edgesplit.h + tools/bmesh_triangulate.c + tools/bmesh_triangulate.h bmesh.h bmesh_class.h diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index f593f78bab7..3b33513b575 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -268,8 +268,9 @@ extern "C" { #include "intern/bmesh_inline.h" -#include "tools/bmesh_decimate.h" #include "tools/bmesh_bevel.h" +#include "tools/bmesh_decimate.h" +#include "tools/bmesh_triangulate.h" #ifdef __cplusplus } diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index 5c3d164c768..b8b7abdbc76 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -845,8 +845,9 @@ static BMLoop *find_ear(BMFace *f, float (*verts)[3], const bool use_beauty, flo * * \note newedgeflag sets a flag layer flag, obviously not the header flag. */ -void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], const short newedge_oflag, - const short newface_oflag, BMFace **newfaces, const bool use_beauty) +void BM_face_triangulate(BMesh *bm, BMFace *f, + float (*projectverts)[3], BMFace **newfaces, + const bool use_beauty, const bool use_tag) { int i, nvert, nf_i = 0; bool done; @@ -900,8 +901,11 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], const s } copy_v3_v3(f->no, l_iter->f->no); - BMO_elem_flag_enable(bm, newl->e, newedge_oflag); - BMO_elem_flag_enable(bm, f, newface_oflag); + + if (use_tag) { + BM_elem_flag_enable(newl->e, BM_ELEM_TAG); + BM_elem_flag_enable(f, BM_ELEM_TAG); + } if (newfaces) newfaces[nf_i++] = f; diff --git a/source/blender/bmesh/intern/bmesh_polygon.h b/source/blender/bmesh/intern/bmesh_polygon.h index a0c6ac5eeaa..7c2b1782584 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.h +++ b/source/blender/bmesh/intern/bmesh_polygon.h @@ -44,9 +44,8 @@ void BM_vert_normal_update_all(BMVert *v); void BM_face_normal_flip(BMesh *bm, BMFace *f); bool BM_face_point_inside_test(BMFace *f, const float co[3]); -void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], - const short newedge_oflag, const short newface_oflag, BMFace **newfaces, - const bool use_beauty); +void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], BMFace **newfaces, + const bool use_beauty, const bool use_tag); void BM_face_legal_splits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len); diff --git a/source/blender/bmesh/operators/bmo_triangulate.c b/source/blender/bmesh/operators/bmo_triangulate.c index 744f706681d..c4d15034c0f 100644 --- a/source/blender/bmesh/operators/bmo_triangulate.c +++ b/source/blender/bmesh/operators/bmo_triangulate.c @@ -37,45 +37,21 @@ #include "intern/bmesh_operators_private.h" /* own include */ -#define EDGE_NEW 1 -#define FACE_NEW 1 - #define ELE_NEW 1 #define FACE_MARK 2 #define EDGE_MARK 4 void bmo_triangulate_exec(BMesh *bm, BMOperator *op) { - BMOIter siter; - BMFace *face, **newfaces = NULL; - BLI_array_declare(newfaces); - float (*projectverts)[3] = NULL; - BLI_array_declare(projectverts); - int i; const bool use_beauty = BMO_slot_bool_get(op->slots_in, "use_beauty"); - BMOpSlot *slot_facemap_out = BMO_slot_get(op->slots_out, "face_map.out"); - - for (face = BMO_iter_new(&siter, op->slots_in, "faces", BM_FACE); face; face = BMO_iter_step(&siter)) { - - BLI_array_empty(projectverts); - BLI_array_empty(newfaces); - BLI_array_grow_items(projectverts, face->len * 3); - BLI_array_grow_items(newfaces, face->len); + BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE, BM_ELEM_TAG, false); + BMO_slot_buffer_hflag_enable(bm, op->slots_in, "faces", BM_FACE, BM_ELEM_TAG, false); - BM_face_triangulate(bm, face, projectverts, EDGE_NEW, FACE_NEW, newfaces, use_beauty); + BM_mesh_triangulate(bm, use_beauty, true); - BMO_slot_map_elem_insert(op, slot_facemap_out, face, face); - for (i = 0; newfaces[i]; i++) { - BMO_slot_map_elem_insert(op, slot_facemap_out, newfaces[i], face); - } - } - - BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "edges.out", BM_EDGE, EDGE_NEW); - BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "faces.out", BM_FACE, FACE_NEW); - - BLI_array_free(projectverts); - BLI_array_free(newfaces); + BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_TAG); + BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "faces.out", BM_FACE, BM_ELEM_TAG); } void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op) diff --git a/source/blender/bmesh/tools/bmesh_triangulate.c b/source/blender/bmesh/tools/bmesh_triangulate.c new file mode 100644 index 00000000000..7e6e41a12e6 --- /dev/null +++ b/source/blender/bmesh/tools/bmesh_triangulate.c @@ -0,0 +1,66 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Joseph Eagar + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/bmesh/tools/bmesh_triangulate.c + * \ingroup bmesh + * + * Triangulate. + * + */ + +#include "MEM_guardedalloc.h" + +#include "BLI_utildefines.h" +#include "BLI_array.h" + +#include "bmesh.h" + +#include "bmesh_triangulate.h" /* own include */ + +void BM_mesh_triangulate(BMesh *bm, const bool use_beauty, const bool tag_only) +{ + BMIter iter; + BMFace *face; + float (*projectverts)[3] = NULL; + BLI_array_declare(projectverts); + + if (tag_only == false) { + BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) { + BLI_array_empty(projectverts); + BLI_array_reserve(projectverts, face->len * 3); + + BM_face_triangulate(bm, face, projectverts, NULL, use_beauty, false); + } + } + else { + BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) { + if (BM_elem_flag_test(face, BM_ELEM_TAG)) { + BLI_array_empty(projectverts); + BLI_array_grow_items(projectverts, face->len * 3); + + BM_face_triangulate(bm, face, projectverts, NULL, use_beauty, true); + } + } + } + + BLI_array_free(projectverts); +} diff --git a/source/blender/bmesh/tools/bmesh_triangulate.h b/source/blender/bmesh/tools/bmesh_triangulate.h new file mode 100644 index 00000000000..9632ab5957f --- /dev/null +++ b/source/blender/bmesh/tools/bmesh_triangulate.h @@ -0,0 +1,35 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Joseph Eagar + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/bmesh/tools/bmesh_triangulate.c + * \ingroup bmesh + * + * Triangulate. + * + */ + +#ifndef __BMESH_TRIAMGULATE_H__ +#define __BMESH_TRIAMGULATE_H__ + +void BM_mesh_triangulate(BMesh *bm, const bool use_beauty, const bool tag_only); + +#endif /* __BMESH_TRIAMGULATE_H__ */ diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c index 645fd5eb2cf..2f0fbbd0507 100644 --- a/source/blender/modifiers/intern/MOD_triangulate.c +++ b/source/blender/modifiers/intern/MOD_triangulate.c @@ -33,8 +33,6 @@ #include "BKE_modifier.h" #include "BKE_tessmesh.h" -/* triangulation modifier, directly calls the bmesh operator */ - static DerivedMesh *triangulate_dm(DerivedMesh *dm, const int flag) { DerivedMesh *result; @@ -44,13 +42,7 @@ static DerivedMesh *triangulate_dm(DerivedMesh *dm, const int flag) bm = DM_to_bmesh(dm); - BM_mesh_elem_toolflags_ensure(bm); - BMO_push(bm, NULL); - - BMO_op_callf(bm, BMO_FLAG_DEFAULTS, - "triangulate faces=%af use_beauty=%b", - (flag & MOD_TRIANGULATE_BEAUTY)); - BMO_pop(bm); + BM_mesh_triangulate(bm, (flag & MOD_TRIANGULATE_BEAUTY), false); result = CDDM_from_bmesh(bm, FALSE); BM_mesh_free(bm); -- cgit v1.2.3 From dc727f0256562cb8fc1074fda9b9b7f407496ab2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 10:43:15 +0000 Subject: sculpt, replace bmo call to triangulate with BM_mesh_triangulate() --- source/blender/editors/sculpt_paint/sculpt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index ce7d72f9787..a81115aeae3 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -4527,7 +4527,7 @@ static void SCULPT_OT_set_persistent_base(wmOperatorType *ot) static void sculpt_dynamic_topology_triangulate(BMesh *bm) { - BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "triangulate faces=%af"); + BM_mesh_triangulate(bm, false, false); } void sculpt_pbvh_clear(Object *ob) -- cgit v1.2.3 From 1a750e00e72c06fc3acf883c436dc147d0626e52 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 29 Jan 2013 12:03:38 +0000 Subject: Alpha display changes: Previous alpha-overing on black for RGB display wasn't so much useful for artists, changed in a way: - Made RGBA display default for node editor backdrop and image editor, so it'll be clear that image does have alpha channel - RGB display will ignore alpha channel completely Reshuffled buttons for RGBA/RGB so now the order is following: RGBA | RGB | Alpha | Z Still to come: startup.blend shall be altered to make RGBA default. --- source/blender/editors/space_image/image_draw.c | 13 +++++-------- source/blender/editors/space_image/space_image.c | 2 +- source/blender/editors/space_node/drawnode.c | 8 -------- source/blender/editors/space_node/space_node.c | 2 +- source/blender/makesrna/intern/rna_space.c | 11 +++++++---- 5 files changed, 14 insertions(+), 22 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index ba4f8287cd7..915036cf70e 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -514,16 +514,12 @@ static void draw_image_buffer(const bContext *C, SpaceImage *sima, ARegion *ar, unsigned char *display_buffer; void *cache_handle; - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - if (sima->flag & SI_USE_ALPHA) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + fdrawcheckerboard(x, y, x + ibuf->x * zoomx, y + ibuf->y * zoomy); } - else { - glColor4f(0.0f, 0.0f, 0.0f, 1.0f); - glRecti(x, y, x + ibuf->x * zoomx, y + ibuf->y * zoomy); - } display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle); @@ -536,7 +532,8 @@ static void draw_image_buffer(const bContext *C, SpaceImage *sima, ARegion *ar, IMB_display_buffer_release(cache_handle); - glDisable(GL_BLEND); + if (sima->flag & SI_USE_ALPHA) + glDisable(GL_BLEND); } /* reset zoom */ diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 1c384ef38d7..35ba83a8bc6 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -152,7 +152,7 @@ static SpaceLink *image_new(const bContext *UNUSED(C)) simage->spacetype = SPACE_IMAGE; simage->zoom = 1.0f; simage->lock = TRUE; - simage->flag = SI_SHOW_GPENCIL; + simage->flag = SI_SHOW_GPENCIL | SI_USE_ALPHA; simage->iuser.ok = TRUE; simage->iuser.fie_ima = 2; diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index cca1858f112..1ec77bf58ed 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -3283,17 +3283,9 @@ void draw_nodespace_back_pix(const bContext *C, ARegion *ar, SpaceNode *snode) else { glPixelZoom(snode->zoom, snode->zoom); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glColor4f(0.0f, 0.0f, 0.0f, 1.0f); - glRecti(x, y, x + ibuf->x * snode->zoom, y + ibuf->y * snode->zoom); - glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, display_buffer); glPixelZoom(1.0f, 1.0f); - - glDisable(GL_BLEND); } } diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 513f6b43e9a..a5f6ca9ded0 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -119,7 +119,7 @@ static SpaceLink *node_new(const bContext *UNUSED(C)) snode = MEM_callocN(sizeof(SpaceNode), "initnode"); snode->spacetype = SPACE_NODE; - snode->flag = SNODE_SHOW_GPENCIL; + snode->flag = SNODE_SHOW_GPENCIL | SNODE_USE_ALPHA; /* backdrop */ snode->zoom = 1.0f; diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 09969ddc7e5..435fcd5fd06 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -80,9 +80,9 @@ EnumPropertyItem space_type_items[] = { }; static EnumPropertyItem draw_channels_items[] = { - {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"}, {SI_USE_ALPHA, "COLOR_ALPHA", ICON_IMAGE_RGB_ALPHA, "Color and Alpha", "Draw image with RGB colors and alpha transparency"}, + {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"}, {SI_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Draw alpha transparency channel"}, {SI_SHOW_ZBUF, "Z_BUFFER", ICON_IMAGE_ZDEPTH, "Z-Buffer", "Draw Z-buffer associated with image (mapped from camera clip start to end)"}, @@ -633,15 +633,18 @@ static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(bContext *UNUS if (alpha && zbuf) return draw_channels_items; - RNA_enum_items_add_value(&item, &totitem, draw_channels_items, 0); - if (alpha) { RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_USE_ALPHA); + RNA_enum_items_add_value(&item, &totitem, draw_channels_items, 0); RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_SHOW_ALPHA); } else if (zbuf) { + RNA_enum_items_add_value(&item, &totitem, draw_channels_items, 0); RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_SHOW_ZBUF); } + else { + RNA_enum_items_add_value(&item, &totitem, draw_channels_items, 0); + } RNA_enum_item_end(&item, &totitem); *free = 1; @@ -3062,9 +3065,9 @@ static void rna_def_space_node(BlenderRNA *brna) }; static EnumPropertyItem backdrop_channels_items[] = { - {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"}, {SNODE_USE_ALPHA, "COLOR_ALPHA", ICON_IMAGE_RGB_ALPHA, "Color and Alpha", "Draw image with RGB colors and alpha transparency"}, + {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"}, {SNODE_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Draw alpha transparency channel"}, {SNODE_SHOW_R, "RED", ICON_COLOR_RED, "Red", ""}, {SNODE_SHOW_G, "GREEN", ICON_COLOR_GREEN, "Green", ""}, -- cgit v1.2.3 From 6d2f104884f706b0358a9f6393e32cdc0430adac Mon Sep 17 00:00:00 2001 From: Stuart Broadfoot Date: Tue, 29 Jan 2013 12:32:43 +0000 Subject: Cycles Hair: Addition of render settings and static BVH strand width scaling Addition of a RNA function to toggle between the hair settings and rebuild the cache. This enables the usage of the render step, child number and full display percentage with f12 rendering. A scaling to the strand radius has also been added for the static bvh. This only matches up with dynamic for uniform scaling. A very small fix is included for multiple uvs/vertex colours when using child particles. --- source/blender/makesrna/intern/rna_particle.c | 50 +++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index bd3e4e6862d..a872ace6ae3 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -299,6 +299,7 @@ static void rna_ParticleSystem_co_hair(ParticleSystem *particlesystem, Object *o int path_nbr = 0; int totpart; int max_k = 0; + int step_nbr = 0; if (particlesystem == NULL) return; @@ -306,14 +307,21 @@ static void rna_ParticleSystem_co_hair(ParticleSystem *particlesystem, Object *o part = particlesystem->part; pars = particlesystem->particles; + if(particlesystem->renderdata) { + step_nbr = part->ren_step; + totchild = particlesystem->totchild; + } + else { + step_nbr = part->draw_step; + totchild = (int)((float)particlesystem->totchild * (float)(part->disp) / 100.0f); + } + if (part == NULL || pars == NULL || !psys_check_enabled(object, particlesystem)) return; if (part->ren_as == PART_DRAW_OB || part->ren_as == PART_DRAW_GR || part->ren_as == PART_DRAW_NOT) return; - totchild = particlesystem->totchild * part->disp / 100; - /* can happen for disconnected/global hair */ if (part->type == PART_HAIR && !particlesystem->childcache) totchild = 0; @@ -324,7 +332,7 @@ static void rna_ParticleSystem_co_hair(ParticleSystem *particlesystem, Object *o return; if (part->ren_as == PART_DRAW_PATH && particlesystem->pathcache) - path_nbr = (int)pow(2.0, part->draw_step); + path_nbr = (int)pow(2.0, step_nbr); if (particle_no < totpart) { @@ -373,7 +381,10 @@ static void rna_ParticleSystem_uv_on_emitter(ParticleSystem *particlesystem, Par part = particlesystem->part; + if(particlesystem->renderdata) totchild = particlesystem->totchild; + else + totchild = (int)((float)particlesystem->totchild * (float)(part->disp) / 100.0f); /* can happen for disconnected/global hair */ if (part->type == PART_HAIR && !particlesystem->childcache) @@ -419,7 +430,7 @@ static void rna_ParticleSystem_uv_on_emitter(ParticleSystem *particlesystem, Par if (n_uv && ELEM(PART_FROM_FACE, PART_FROM_FACE, PART_FROM_VOLUME)) { if (cpa->num != DMCACHE_NOTFOUND) { MFace *mface = modifier->dm->getTessFaceData(modifier->dm, cpa->num, CD_MFACE); - MTFace *mtface = (MTFace *)CustomData_get_layer_n(&modifier->dm->faceData, CD_MTFACE, 0); + MTFace *mtface = (MTFace *)CustomData_get_layer_n(&modifier->dm->faceData, CD_MTFACE, uv_no); mtface += cpa->num; psys_interpolate_uvs(mtface, mface->v4, cpa->fuv, n_uv); @@ -441,7 +452,7 @@ static void rna_ParticleSystem_uv_on_emitter(ParticleSystem *particlesystem, Par if (n_uv && ELEM(part->from, PART_FROM_FACE, PART_FROM_VOLUME)) { if (num != DMCACHE_NOTFOUND) { MFace *mface = modifier->dm->getTessFaceData(modifier->dm, num, CD_MFACE); - MTFace *mtface = (MTFace *)CustomData_get_layer_n(&modifier->dm->faceData, CD_MTFACE, 0); + MTFace *mtface = (MTFace *)CustomData_get_layer_n(&modifier->dm->faceData, CD_MTFACE, uv_no); mtface += num; psys_interpolate_uvs(mtface, mface->v4, parent->fuv, n_uv); @@ -470,7 +481,10 @@ static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, P part = particlesystem->part; + if(particlesystem->renderdata) totchild = particlesystem->totchild; + else + totchild = (int)((float)particlesystem->totchild * (float)(part->disp) / 100.0f); /* can happen for disconnected/global hair */ if (part->type == PART_HAIR && !particlesystem->childcache) @@ -520,7 +534,7 @@ static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, P if (n_mcol && ELEM(PART_FROM_FACE, PART_FROM_FACE, PART_FROM_VOLUME)) { if (cpa->num != DMCACHE_NOTFOUND) { MFace *mface = modifier->dm->getTessFaceData(modifier->dm, cpa->num, CD_MFACE); - MCol *mc = (MCol *)CustomData_get_layer_n(&modifier->dm->faceData, CD_MCOL, 0); + MCol *mc = (MCol *)CustomData_get_layer_n(&modifier->dm->faceData, CD_MCOL, vcol_no); mc += cpa->num * 4; psys_interpolate_mcol(mc, mface->v4, cpa->fuv, &mcol); @@ -546,7 +560,7 @@ static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, P if (n_mcol && ELEM(part->from, PART_FROM_FACE, PART_FROM_VOLUME)) { if (num != DMCACHE_NOTFOUND) { MFace *mface = modifier->dm->getTessFaceData(modifier->dm, num, CD_MFACE); - MCol *mc = (MCol *)CustomData_get_layer_n(&modifier->dm->faceData, CD_MCOL, 0); + MCol *mc = (MCol *)CustomData_get_layer_n(&modifier->dm->faceData, CD_MCOL, vcol_no); mc += num * 4; psys_interpolate_mcol(mc, mface->v4, parent->fuv, &mcol); @@ -564,6 +578,22 @@ static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, P } } +static void rna_ParticleSystem_ToggleRender(ParticleSystem *particlesystem, Scene *scene, Object *object) +{ + ParticleSystemModifierData *psmd = psys_get_modifier(object, particlesystem); + float mat[4][4]; + + unit_m4(mat); + + if (particlesystem->renderdata) + psys_render_restore(object, particlesystem); + else { + psys_render_set(object, particlesystem, mat, mat, 1, 1, 0.f); + psmd->flag &= ~eParticleSystemFlag_psys_updated; + particle_system_update(scene, object, particlesystem); + } +} + static void particle_recalc(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr, short flag) { if (ptr->type == &RNA_ParticleSystem) { @@ -3345,6 +3375,12 @@ static void rna_def_particle_system(BlenderRNA *brna) RNA_def_struct_path_func(srna, "rna_ParticleSystem_path"); + /* Toggle Render settings */ + func = RNA_def_function(srna, "ToggleRender", "rna_ParticleSystem_ToggleRender"); + RNA_def_function_ui_description(func, "Toggle render settings"); + prop = RNA_def_pointer(func, "scene", "Scene", "", "Scene"); + prop = RNA_def_pointer(func, "object", "Object", "", "Object"); + /* extract cached hair location data */ func = RNA_def_function(srna, "co_hair", "rna_ParticleSystem_co_hair"); RNA_def_function_ui_description(func, "Obtain cache hair data"); -- cgit v1.2.3 From d18fca88b9b292631b02fe98055372d4746866c3 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 29 Jan 2013 14:52:26 +0000 Subject: Preview Render: * Changing Material Preview type (Sphere, Monkey...) should not trigger ND_SHADING_DRAW. Caused Cycles 3D View render to re-start. It now only triggers an ND_SHADER update, which will be handled inside the Properties Editor Listener and executes a Preview Re-Render. --- source/blender/makesrna/intern/rna_material.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index 1221b84372c..35173c290de 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -114,7 +114,7 @@ static void rna_Material_update_previews(Main *bmain, Scene *scene, PointerRNA * if (ma->nodetree) ntreeClearPreview(ma->nodetree); - rna_Material_update(bmain, scene, ptr); + WM_main_add_notifier(NC_MATERIAL | ND_SHADING, ma); } -- cgit v1.2.3 From 2b875a947ff831dd8f7d4b5bc2d5df10f614864d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 15:05:23 +0000 Subject: skip calculating the normal for each face when triangulating, all callers make sure its valid. also remove some commented code (more then one generation of bmesh old). --- source/blender/blenlib/BLI_math_matrix.h | 1 + source/blender/blenlib/intern/math_matrix.c | 7 + source/blender/blenlib/intern/math_rotation.c | 2 + source/blender/bmesh/intern/bmesh_polygon.c | 195 +++++++++---------------- source/blender/bmesh/intern/bmesh_polygon.h | 2 +- source/blender/bmesh/tools/bmesh_triangulate.c | 15 +- 6 files changed, 83 insertions(+), 139 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index 415c503146c..c66536bc0e5 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -95,6 +95,7 @@ void mul_project_m4_v3(float M[4][4], float vec[3]); void mul_m3_v3(float M[3][3], float r[3]); void mul_v3_m3v3(float r[3], float M[3][3], float a[3]); +void mul_v2_m3v3(float r[2], float M[3][3], float a[3]); void mul_transposed_m3_v3(float M[3][3], float r[3]); void mul_m3_v3_double(float M[3][3], double r[3]); diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index 8f9ea917b8c..b7e7fea897f 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -411,6 +411,13 @@ void mul_v3_m3v3(float r[3], float M[3][3], float a[3]) r[2] = M[0][2] * a[0] + M[1][2] * a[1] + M[2][2] * a[2]; } +void mul_v2_m3v3(float r[2], float M[3][3], float a[3]) +{ + r[0] = M[0][0] * a[0] + M[1][0] * a[1] + M[2][0] * a[2]; + r[1] = M[0][1] * a[0] + M[1][1] * a[1] + M[2][1] * a[2]; + r[2] = M[0][2] * a[0] + M[1][2] * a[1] + M[2][2] * a[2]; +} + void mul_m3_v3(float M[3][3], float r[3]) { float tmp[3]; diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index b38b5a2de10..e6399ed356e 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -84,6 +84,8 @@ void mul_qt_qtqt(float q[4], const float q1[4], const float q2[4]) * \note: * Assumes a unit quaternion? * + * \note: multiplying by 3x3 matrix is ~25% faster. + * * in fact not, but you may want to use a unit quat, read on... * * Shortcut for 'q v q*' when \a v is actually a quaternion. diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index b8b7abdbc76..af8ae5f9454 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -297,39 +297,51 @@ static void scale_edge_v3f(float v1[3], float v2[3], const float fac) add_v3_v3v3(v2, v2, mid); } - /** - * \brief POLY ROTATE PLANE + * \brief POLY NORMAL TO MATRIX * - * Rotates a polygon so that it's - * normal is pointing towards the mesh Z axis + * Creates a 3x3 matrix from a normal. */ -void poly_rotate_plane(const float normal[3], float (*verts)[3], const int nverts) +static bool poly_normal_to_xy_mat3(float r_mat[3][3], const float normal[3]) { - - float up[3] = {0.0f, 0.0f, 1.0f}, axis[3], q[4]; - float mat[3][3]; + float up[3] = {0.0f, 0.0f, 1.0f}, axis[3]; float angle; - int i; cross_v3_v3v3(axis, normal, up); - angle = saacos(dot_v3v3(normal, up)); - if (angle < FLT_EPSILON) - return; + if (angle >= FLT_EPSILON) { + if (len_squared_v3(axis) < FLT_EPSILON) { + axis[0] = 0.0f; + axis[1] = 1.0f; + axis[2] = 0.0f; + } - if (len_squared_v3(axis) < FLT_EPSILON) { - axis[0] = 0.0f; - axis[1] = 1.0f; - axis[2] = 0.0f; + axis_angle_to_mat3(r_mat, axis, angle); + return true; } + else { + unit_m3(r_mat); + return false; + } +} - axis_angle_to_quat(q, axis, angle); - quat_to_mat3(mat, q); +/** + * \brief POLY ROTATE PLANE + * + * Rotates a polygon so that it's + * normal is pointing towards the mesh Z axis + */ +void poly_rotate_plane(const float normal[3], float (*verts)[3], const int nverts) +{ + float mat[3][3]; - for (i = 0; i < nverts; i++) - mul_m3_v3(mat, verts[i]); + if (poly_normal_to_xy_mat3(mat, normal)) { + int i; + for (i = 0; i < nverts; i++) { + mul_m3_v3(mat, verts[i]); + } + } } /** @@ -614,16 +626,16 @@ bool BM_face_point_inside_test(BMFace *f, const float co[3]) return crosses % 2 != 0; } -static bool bm_face_goodline(float const (*projectverts)[3], BMFace *f, int v1i, int v2i, int v3i) +static bool bm_face_goodline(float const (*projectverts)[2], BMFace *f, int v1i, int v2i, int v3i) { BMLoop *l_iter; BMLoop *l_first; - float v1[3], v2[3], v3[3], pv1[3]; - int i; - copy_v3_v3(v1, projectverts[v1i]); - copy_v3_v3(v2, projectverts[v2i]); - copy_v3_v3(v3, projectverts[v3i]); + float pv1[2]; + const float *v1 = projectverts[v1i]; + const float *v2 = projectverts[v2i]; + const float *v3 = projectverts[v3i]; + int i; /* v3 must be on the left side of [v1, v2] line, else we know [v1, v3] is outside of f! */ if (testedgesidef(v1, v2, v3)) { @@ -633,7 +645,7 @@ static bool bm_face_goodline(float const (*projectverts)[3], BMFace *f, int v1i, l_iter = l_first = BM_FACE_FIRST_LOOP(f); do { i = BM_elem_index_get(l_iter->v); - copy_v3_v3(pv1, projectverts[i]); + copy_v2_v2(pv1, projectverts[i]); if (ELEM3(i, v1i, v2i, v3i)) { #if 0 @@ -665,7 +677,7 @@ static bool bm_face_goodline(float const (*projectverts)[3], BMFace *f, int v1i, * \param abscoss Must be allocated by caller, and at least f->len length * (allow to avoid allocating a new one for each tri!). */ -static BMLoop *find_ear(BMFace *f, float (*verts)[3], const bool use_beauty, float *abscoss) +static BMLoop *find_ear(BMFace *f, float (*projectverts)[2], const bool use_beauty, float *abscoss) { BMLoop *bestear = NULL; @@ -711,7 +723,7 @@ static BMLoop *find_ear(BMFace *f, float (*verts)[3], const bool use_beauty, flo /* Last check we do not get overlapping triangles * (as much as possible, there are some cases with no good solution!) */ i4 = (i + 3) % 4; - if (!bm_face_goodline((float const (*)[3])verts, f, BM_elem_index_get(larr[i4]->v), + if (!bm_face_goodline((float const (*)[2])projectverts, f, BM_elem_index_get(larr[i4]->v), BM_elem_index_get(larr[i]->v), BM_elem_index_get(larr[i + 1]->v))) { i = !i; @@ -756,7 +768,7 @@ static BMLoop *find_ear(BMFace *f, float (*verts)[3], const bool use_beauty, flo if (BM_edge_exists(v1, v3)) { is_ear = false; } - else if (!bm_face_goodline((float const (*)[3])verts, f, BM_elem_index_get(v1), + else if (!bm_face_goodline((float const (*)[2])projectverts, f, BM_elem_index_get(v1), BM_elem_index_get(v2), BM_elem_index_get(v3))) { #if 0 @@ -767,19 +779,6 @@ static BMLoop *find_ear(BMFace *f, float (*verts)[3], const bool use_beauty, flo } if (is_ear) { -#if 0 /* Old, already commented code */ - /* if this code comes back, it needs to be converted to radians */ - angle = angle_v3v3v3(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2]); - if (!bestear || ABS(angle - 45.0f) < bestangle) { - bestear = l; - bestangle = ABS(45.0f - angle); - } - - if (angle > 20 && angle < 90) break; - if (angle < 100 && i > 5) break; - i += 1; -#endif - /* Compute highest cos (i.e. narrowest angle) of this tri. */ cos = *tcoss; tcos = fabsf(cos_v3v3v3(v2->co, v3->co, v1->co)); @@ -839,50 +838,39 @@ static BMLoop *find_ear(BMFace *f, float (*verts)[3], const bool use_beauty, flo * produces a "remaining" face with too much wide/narrow angles * (using cos (i.e. dot product of normalized vectors) of angles). * - * newfaces, if non-null, must be an array of BMFace pointers, - * with a length equal to f->len. It will be filled with the new - * triangles, and will be NULL-terminated. + * \param r_faces_new if non-null, must be an array of BMFace pointers, + * with a length equal to (f->len - 2). It will be filled with the new + * triangles. * * \note newedgeflag sets a flag layer flag, obviously not the header flag. */ void BM_face_triangulate(BMesh *bm, BMFace *f, - float (*projectverts)[3], BMFace **newfaces, + BMFace **r_faces_new, const bool use_beauty, const bool use_tag) { - int i, nvert, nf_i = 0; - bool done; - BMLoop *newl; + const float f_len_orig = f->len; + int i, nf_i = 0; + BMLoop *l_new; BMLoop *l_iter; BMLoop *l_first; /* BM_face_triangulate: temp absolute cosines of face corners */ - float *abscoss = BLI_array_alloca(abscoss, f->len); + float (*projectverts)[2] = BLI_array_alloca(projectverts, f_len_orig); + float *abscoss = BLI_array_alloca(abscoss, f_len_orig); + float mat[3][3]; + + poly_normal_to_xy_mat3(mat, f->no); /* copy vertex coordinates to vertspace area */ i = 0; l_iter = l_first = BM_FACE_FIRST_LOOP(f); do { - copy_v3_v3(projectverts[i], l_iter->v->co); - BM_elem_index_set(l_iter->v, i); /* set dirty! */ - i++; + mul_v2_m3v3(projectverts[i], mat, l_iter->v->co); + BM_elem_index_set(l_iter->v, i++); /* set dirty! */ } while ((l_iter = l_iter->next) != l_first); bm->elem_index_dirty |= BM_VERT; /* see above */ - /* bmesh_face_normal_update(bm, f, f->no, projectverts); */ - - calc_poly_normal(f->no, projectverts, f->len); - poly_rotate_plane(f->no, projectverts, i); - - nvert = f->len; - - /* calc_poly_plane(projectverts, i); */ - for (i = 0; i < nvert; i++) { - projectverts[i][2] = 0.0f; - } - - done = false; - while (!done && f->len > 3) { - done = true; + while (f->len > 3) { l_iter = find_ear(f, projectverts, use_beauty, abscoss); /* force triangulation - if we can't find an ear the face is degenerate */ @@ -890,70 +878,27 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, l_iter = BM_FACE_FIRST_LOOP(f); } - { - done = false; -/* printf("Subdividing face...\n");*/ - f = BM_face_split(bm, l_iter->f, l_iter->prev->v, l_iter->next->v, &newl, NULL, true); - - if (UNLIKELY(!f)) { - fprintf(stderr, "%s: triangulator failed to split face! (bmesh internal error)\n", __func__); - break; - } - - copy_v3_v3(f->no, l_iter->f->no); - - if (use_tag) { - BM_elem_flag_enable(newl->e, BM_ELEM_TAG); - BM_elem_flag_enable(f, BM_ELEM_TAG); - } - - if (newfaces) - newfaces[nf_i++] = f; - -#if 0 - l = f->loopbase; - do { - if (l->v == v) { - f->loopbase = l; - break; - } - l = l->next; - } while (l != f->loopbase); -#endif +/* printf("Subdividing face...\n");*/ + f = BM_face_split(bm, l_iter->f, l_iter->prev->v, l_iter->next->v, &l_new, NULL, true); + if (UNLIKELY(!f)) { + fprintf(stderr, "%s: triangulator failed to split face! (bmesh internal error)\n", __func__); + break; } - } - BLI_assert(f->len == 3); + copy_v3_v3(f->no, l_iter->f->no); -#if 0 /* XXX find_ear should now always return a corner, so no more need for this piece of code... */ - if (f->len > 3) { - l_iter = BM_FACE_FIRST_LOOP(f); - while (l_iter->f->len > 3) { - nextloop = l_iter->next->next; - f = BM_face_split(bm, l_iter->f, l_iter->v, nextloop->v, - &newl, NULL, true); - if (!f) { - printf("triangle fan step of triangulator failed.\n"); - - /* NULL-terminate */ - if (newfaces) newfaces[nf_i] = NULL; - return; - } + if (use_tag) { + BM_elem_flag_enable(l_new->e, BM_ELEM_TAG); + BM_elem_flag_enable(f, BM_ELEM_TAG); + } - if (newfaces) newfaces[nf_i++] = f; - - BMO_elem_flag_enable(bm, newl->e, newedge_oflag); - BMO_elem_flag_enable(bm, f, newface_oflag); - l_iter = nextloop; + if (r_faces_new) { + r_faces_new[nf_i++] = f; } } -#endif - /* NULL-terminate */ - if (newfaces) { - newfaces[nf_i] = NULL; - } + BLI_assert(f->len == 3); } /** diff --git a/source/blender/bmesh/intern/bmesh_polygon.h b/source/blender/bmesh/intern/bmesh_polygon.h index 7c2b1782584..601caae2337 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.h +++ b/source/blender/bmesh/intern/bmesh_polygon.h @@ -44,7 +44,7 @@ void BM_vert_normal_update_all(BMVert *v); void BM_face_normal_flip(BMesh *bm, BMFace *f); bool BM_face_point_inside_test(BMFace *f, const float co[3]); -void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], BMFace **newfaces, +void BM_face_triangulate(BMesh *bm, BMFace *f, BMFace **newfaces, const bool use_beauty, const bool use_tag); void BM_face_legal_splits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len); diff --git a/source/blender/bmesh/tools/bmesh_triangulate.c b/source/blender/bmesh/tools/bmesh_triangulate.c index 7e6e41a12e6..9948a15ea56 100644 --- a/source/blender/bmesh/tools/bmesh_triangulate.c +++ b/source/blender/bmesh/tools/bmesh_triangulate.c @@ -30,7 +30,6 @@ #include "MEM_guardedalloc.h" #include "BLI_utildefines.h" -#include "BLI_array.h" #include "bmesh.h" @@ -40,27 +39,17 @@ void BM_mesh_triangulate(BMesh *bm, const bool use_beauty, const bool tag_only) { BMIter iter; BMFace *face; - float (*projectverts)[3] = NULL; - BLI_array_declare(projectverts); if (tag_only == false) { BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) { - BLI_array_empty(projectverts); - BLI_array_reserve(projectverts, face->len * 3); - - BM_face_triangulate(bm, face, projectverts, NULL, use_beauty, false); + BM_face_triangulate(bm, face, NULL, use_beauty, false); } } else { BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) { if (BM_elem_flag_test(face, BM_ELEM_TAG)) { - BLI_array_empty(projectverts); - BLI_array_grow_items(projectverts, face->len * 3); - - BM_face_triangulate(bm, face, projectverts, NULL, use_beauty, true); + BM_face_triangulate(bm, face, NULL, use_beauty, true); } } } - - BLI_array_free(projectverts); } -- cgit v1.2.3 From d54b2e1e25c5a0bff29ca14a216696f90d4d5a49 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 29 Jan 2013 17:15:51 +0000 Subject: Fix #34003: hide confusing unlink button for pinned datablock in properties editor. --- source/blender/makesrna/intern/rna_space.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 435fcd5fd06..38112f95ec8 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -2045,7 +2045,7 @@ static void rna_def_space_buttons(BlenderRNA *brna) /* note: custom set function is ONLY to avoid rna setting a user for this. */ RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceProperties_pin_id_set", "rna_SpaceProperties_pin_id_typef", NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_PROPERTIES, "rna_SpaceProperties_pin_id_update"); prop = RNA_def_property(srna, "use_pin_id", PROP_BOOLEAN, PROP_NONE); -- cgit v1.2.3 From e9678e74b071b5edd1fac233ac6dac5df821242f Mon Sep 17 00:00:00 2001 From: Miika Hamalainen Date: Tue, 29 Jan 2013 19:27:05 +0000 Subject: Fix [#34008]: Scaling Smoke Domain In Z-Axis Crashes Blender Also as minor change skip base_res update on domain step if adaptive domain isn't enabled. --- source/blender/blenkernel/intern/smoke.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index be36e30808d..f56d03bfb57 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -213,8 +213,8 @@ static void smoke_pos_to_cell(SmokeDomainSettings *sds, float pos[3]) pos[2] *= 1.0f / sds->cell_size[2]; } -/* set domain resolution and dimensions from object derivedmesh */ -static void smoke_set_domain_from_derivedmesh(SmokeDomainSettings *sds, Object *ob, DerivedMesh *dm) +/* set domain transformations and base resolution from object derivedmesh */ +static void smoke_set_domain_from_derivedmesh(SmokeDomainSettings *sds, Object *ob, DerivedMesh *dm, int init_resolution) { size_t i; float min[3] = {FLT_MAX, FLT_MAX, FLT_MAX}, max[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX}; @@ -246,7 +246,10 @@ static void smoke_set_domain_from_derivedmesh(SmokeDomainSettings *sds, Object * /* calculate domain dimensions */ sub_v3_v3v3(size, max, min); - copy_v3_v3(sds->cell_size, size); + if (init_resolution) { + zero_v3_int(sds->base_res); + copy_v3_v3(sds->cell_size, size); + } mul_v3_v3(size, ob->size); copy_v3_v3(sds->global_size, size); copy_v3_v3(sds->dp0, min); @@ -254,18 +257,18 @@ static void smoke_set_domain_from_derivedmesh(SmokeDomainSettings *sds, Object * invert_m4_m4(sds->imat, ob->obmat); // prevent crash when initializing a plane as domain - if ((size[0] < FLT_EPSILON) || (size[1] < FLT_EPSILON) || (size[2] < FLT_EPSILON)) + if (!init_resolution || (size[0] < FLT_EPSILON) || (size[1] < FLT_EPSILON) || (size[2] < FLT_EPSILON)) return; /* define grid resolutions from longest domain side */ - if (size[0] > MAX2(size[1], size[2])) { + if (size[0] >= MAX2(size[1], size[2])) { scale = res / size[0]; sds->scale = size[0] / ob->size[0]; sds->base_res[0] = res; sds->base_res[1] = (int)(size[1] * scale + 0.5f); sds->base_res[2] = (int)(size[2] * scale + 0.5f); } - else if (size[1] > MAX2(size[0], size[2])) { + else if (size[1] >= MAX2(size[0], size[2])) { scale = res / size[1]; sds->scale = size[1] / ob->size[1]; sds->base_res[0] = (int)(size[0] * scale + 0.5f); @@ -293,7 +296,7 @@ static int smokeModifier_init(SmokeModifierData *smd, Object *ob, Scene *scene, SmokeDomainSettings *sds = smd->domain; int res[3]; /* set domain dimensions from derivedmesh */ - smoke_set_domain_from_derivedmesh(sds, ob, dm); + smoke_set_domain_from_derivedmesh(sds, ob, dm, TRUE); /* reset domain values */ zero_v3_int(sds->shift); zero_v3(sds->shift_f); @@ -1984,7 +1987,7 @@ static void step(Scene *scene, Object *ob, SmokeModifierData *smd, DerivedMesh * /* update object state */ invert_m4_m4(sds->imat, ob->obmat); copy_m4_m4(sds->obmat, ob->obmat); - smoke_set_domain_from_derivedmesh(sds, ob, domain_dm); + smoke_set_domain_from_derivedmesh(sds, ob, domain_dm, (sds->flags & MOD_SMOKE_ADAPTIVE_DOMAIN)); /* use global gravity if enabled */ if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) { -- cgit v1.2.3 From f02f491ed04b3427840c375de3fd62c9de59cd84 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 20:49:40 +0000 Subject: correction to r54188, also don't attempt to triangulate triangles. --- source/blender/blenlib/intern/math_matrix.c | 1 - source/blender/bmesh/intern/bmesh_polygon.c | 19 ++++++------------- source/blender/bmesh/tools/bmesh_triangulate.c | 8 ++++++-- 3 files changed, 12 insertions(+), 16 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index b7e7fea897f..d31916c43c1 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -415,7 +415,6 @@ void mul_v2_m3v3(float r[2], float M[3][3], float a[3]) { r[0] = M[0][0] * a[0] + M[1][0] * a[1] + M[2][0] * a[2]; r[1] = M[0][1] * a[0] + M[1][1] * a[1] + M[2][1] * a[2]; - r[2] = M[0][2] * a[0] + M[1][2] * a[1] + M[2][2] * a[2]; } void mul_m3_v3(float M[3][3], float r[3]) diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index af8ae5f9454..80cee7b8910 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -671,13 +671,14 @@ static bool bm_face_goodline(float const (*projectverts)[2], BMFace *f, int v1i, * \brief Find Ear * * Used by tessellator to find the next triangle to 'clip off' of a polygon while tessellating. + * * \param f The face to search. - * \param verts an array of face vert coords. + * \param projectverts an array of face vert coords. * \param use_beauty Currently only applies to quads, can be extended later on. * \param abscoss Must be allocated by caller, and at least f->len length * (allow to avoid allocating a new one for each tri!). */ -static BMLoop *find_ear(BMFace *f, float (*projectverts)[2], const bool use_beauty, float *abscoss) +static BMLoop *poly_find_ear(BMFace *f, float (*projectverts)[2], const bool use_beauty, float *abscoss) { BMLoop *bestear = NULL; @@ -826,15 +827,7 @@ static BMLoop *find_ear(BMFace *f, float (*projectverts)[2], const bool use_beau /** * \brief BMESH TRIANGULATE FACE * - * --- Prev description (wasn’t correct, ear clipping was currently simply picking the first tri in the loop!) - * Triangulates a face using a simple 'ear clipping' algorithm that tries to - * favor non-skinny triangles (angles less than 90 degrees). - * - * If the triangulator has bits left over (or cannot triangulate at all) - * it uses a simple fan triangulation, - * --- End of prev description - * - * Currently tries to repeatedly find the best triangle (i.e. the most "open" one), provided it does not + * Currently repeatedly find the best triangle (i.e. the most "open" one), provided it does not * produces a "remaining" face with too much wide/narrow angles * (using cos (i.e. dot product of normalized vectors) of angles). * @@ -842,7 +835,7 @@ static BMLoop *find_ear(BMFace *f, float (*projectverts)[2], const bool use_beau * with a length equal to (f->len - 2). It will be filled with the new * triangles. * - * \note newedgeflag sets a flag layer flag, obviously not the header flag. + * \note use_tag tags new flags and edges. */ void BM_face_triangulate(BMesh *bm, BMFace *f, BMFace **r_faces_new, @@ -871,7 +864,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, bm->elem_index_dirty |= BM_VERT; /* see above */ while (f->len > 3) { - l_iter = find_ear(f, projectverts, use_beauty, abscoss); + l_iter = poly_find_ear(f, projectverts, use_beauty, abscoss); /* force triangulation - if we can't find an ear the face is degenerate */ if (l_iter == NULL) { diff --git a/source/blender/bmesh/tools/bmesh_triangulate.c b/source/blender/bmesh/tools/bmesh_triangulate.c index 9948a15ea56..4ab5383f0b6 100644 --- a/source/blender/bmesh/tools/bmesh_triangulate.c +++ b/source/blender/bmesh/tools/bmesh_triangulate.c @@ -42,13 +42,17 @@ void BM_mesh_triangulate(BMesh *bm, const bool use_beauty, const bool tag_only) if (tag_only == false) { BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) { - BM_face_triangulate(bm, face, NULL, use_beauty, false); + if (face->len > 3) { + BM_face_triangulate(bm, face, NULL, use_beauty, false); + } } } else { BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) { if (BM_elem_flag_test(face, BM_ELEM_TAG)) { - BM_face_triangulate(bm, face, NULL, use_beauty, true); + if (face->len > 3) { + BM_face_triangulate(bm, face, NULL, use_beauty, true); + } } } } -- cgit v1.2.3 From 8f038c2410f530620abdb142aa751449f255d9ab Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 23:33:58 +0000 Subject: enable continuous grab for sliders, initially this was disabled because we didnt support un-grabbing at the new slider location. --- source/blender/editors/include/UI_interface.h | 2 +- .../blender/editors/interface/interface_handlers.c | 72 +++++++++++++++------- 2 files changed, 52 insertions(+), 22 deletions(-) (limited to 'source') diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index e9cb2eff7e3..c52b1ebb971 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -219,7 +219,7 @@ typedef enum { NUMSLI = (14 << 9), COLOR = (15 << 9), IDPOIN = (16 << 9), - HSVSLI = (17 << 9), + HSVSLI = (17 << 9), /* UNUSED, but code still references */ SCROLL = (18 << 9), BLOCK = (19 << 9), BUTM = (20 << 9), diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 0d65cd19034..5fa894a3605 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -291,15 +291,15 @@ static uiBut *ui_but_last(uiBlock *block) return NULL; } -static int ui_is_a_warp_but(uiBut *but) +static bool ui_is_a_warp_but(uiBut *but) { if (U.uiflag & USER_CONTINUOUS_MOUSE) { - if (ELEM6(but->type, NUM, NUMABS, HSVCIRCLE, TRACKPREVIEW, HSVCUBE, BUT_CURVE)) { - return TRUE; + if (ELEM7(but->type, NUM, NUMSLI, NUMABS, HSVCIRCLE, TRACKPREVIEW, HSVCUBE, BUT_CURVE)) { + return true; } } - return FALSE; + return false; } static float ui_mouse_scale_warp_factor(const short shift) @@ -2882,36 +2882,66 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton return retval; } -static int ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, const short shift, const short ctrl, int mx) +static bool ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, + const bool is_horizontal, const bool shift, const bool ctrl, int mx) { float deler, f, tempf, softmin, softmax, softrange; - int temp, lvalue, changed = 0; + int temp, lvalue; + bool changed = false; + float mx_fl, my_fl; + /* note, 'offs' is really from the widget drawing rounded corners see 'widget_numslider' */ + float offs; softmin = but->softmin; softmax = but->softmax; softrange = softmax - softmin; + /* yes, 'mx' as both x/y is intentional */ + ui_mouse_scale_warp(data, mx, mx, &mx_fl, &my_fl, shift); + if (but->type == NUMSLI) { - deler = (BLI_rctf_size_x(&but->rect) - 5.0f * but->aspect); + offs = (BLI_rctf_size_y(&but->rect) / 2.0f) * but->aspect; + deler = BLI_rctf_size_x(&but->rect) - offs; } else if (but->type == HSVSLI) { - deler = (BLI_rctf_size_x(&but->rect) / 2.0f - 5.0f * but->aspect); + offs = (BLI_rctf_size_y(&but->rect) / 2.0f) * but->aspect; + deler = (BLI_rctf_size_x(&but->rect) / 2.0f) - offs; } else if (but->type == SCROLL) { - int horizontal = (BLI_rctf_size_x(&but->rect) > BLI_rctf_size_y(&but->rect)); - float size = (horizontal) ? BLI_rctf_size_x(&but->rect) : -BLI_rctf_size_y(&but->rect); + const float size = (is_horizontal) ? BLI_rctf_size_x(&but->rect) : -BLI_rctf_size_y(&but->rect); deler = size * (but->softmax - but->softmin) / (but->softmax - but->softmin + but->a1); + offs = 0.0; } else { - deler = (BLI_rctf_size_x(&but->rect) - 5.0f * but->aspect); + offs = (BLI_rctf_size_y(&but->rect) / 2.0f) * but->aspect; + deler = (BLI_rctf_size_x(&but->rect) - offs); } - f = (float)(mx - data->dragstartx) / deler + data->dragfstart; - - if (shift) - f = (f - data->dragfstart) / 10.0f + data->dragfstart; - + f = (mx_fl - data->dragstartx) / deler + data->dragfstart; CLAMP(f, 0.0f, 1.0f); + + + /* deal with mouse correction */ +#ifdef USE_CONT_MOUSE_CORRECT + if (ui_is_a_warp_but(but)) { + /* OK but can go outside bounds */ + if (is_horizontal) { + data->ungrab_mval[0] = (but->rect.xmin + offs / but->aspect) + (f * deler); + data->ungrab_mval[1] = BLI_rctf_cent_y(&but->rect); + } + else { + data->ungrab_mval[1] = (but->rect.ymin + offs / but->aspect) + (f * deler); + data->ungrab_mval[0] = BLI_rctf_cent_x(&but->rect); + } + BLI_rctf_clamp_pt_v(&but->rect, data->ungrab_mval); + } +#endif + if (is_horizontal == false) { + mx_fl = my_fl; + } + /* done correcting mouse */ + + tempf = softmin + f * softrange; temp = floorf(tempf + 0.5f); @@ -2947,7 +2977,7 @@ static int ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, const short if (temp != lvalue) { data->value = temp; data->dragchange = 1; - changed = 1; + changed = true; } } else { @@ -2956,7 +2986,7 @@ static int ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, const short if (tempf != (float)data->value) { data->value = tempf; data->dragchange = 1; - changed = 1; + changed = true; } } @@ -3032,7 +3062,7 @@ static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButton click = 1; } else if (event->type == MOUSEMOVE) { - if (ui_numedit_but_SLI(but, data, event->shift, event->ctrl, mx)) + if (ui_numedit_but_SLI(but, data, true, event->shift, event->ctrl, mx)) ui_numedit_apply(C, block, but, data); } retval = WM_UI_HANDLER_BREAK; @@ -3109,7 +3139,7 @@ static int ui_do_but_SCROLL(bContext *C, uiBlock *block, uiBut *but, uiHandleBut { int mx, my /*, click = 0 */; int retval = WM_UI_HANDLER_CONTINUE; - int horizontal = (BLI_rctf_size_x(&but->rect) > BLI_rctf_size_y(&but->rect)); + bool horizontal = (BLI_rctf_size_x(&but->rect) > BLI_rctf_size_y(&but->rect)); mx = event->x; my = event->y; @@ -3146,7 +3176,7 @@ static int ui_do_but_SCROLL(bContext *C, uiBlock *block, uiBut *but, uiHandleBut button_activate_state(C, but, BUTTON_STATE_EXIT); } else if (event->type == MOUSEMOVE) { - if (ui_numedit_but_SLI(but, data, 0, 0, (horizontal) ? mx : my)) + if (ui_numedit_but_SLI(but, data, horizontal, false, false, (horizontal) ? mx : my)) ui_numedit_apply(C, block, but, data); } -- cgit v1.2.3 From 11cf747ba2d54999e8f5ebc56a2dcb58a6dde2cf Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 02:27:13 +0000 Subject: fix [#33987] X-ray mode on bones nullifies weight paint mode This effected vertex paint mode too. --- source/blender/editors/sculpt_paint/paint_vertex.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 5b04bdb8ee7..956f8d2c136 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1029,6 +1029,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, wmEvent *event) unsigned int index; view3d_operator_needs_opengl(C); + ED_view3d_init_mats_rv3d(vc.obact, vc.rv3d); if (use_vert_sel) { if (ED_mesh_pick_vert(C, vc.obact, event->mval, &index, ED_MESH_PICK_DEFAULT_VERT_SIZE, TRUE)) { @@ -1118,6 +1119,7 @@ static EnumPropertyItem *weight_paint_sample_enum_itemf(bContext *C, PointerRNA win->eventstate->y - vc.ar->winrct.ymin}; view3d_operator_needs_opengl(C); + ED_view3d_init_mats_rv3d(vc.obact, vc.rv3d); if (use_vert_sel) { if (ED_mesh_pick_vert(C, vc.obact, mval, &index, ED_MESH_PICK_DEFAULT_VERT_SIZE, TRUE)) { @@ -2230,7 +2232,8 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P indexar = wpd->indexar; view3d_operator_needs_opengl(C); - + ED_view3d_init_mats_rv3d(ob, vc->rv3d); + /* load projection matrix */ mult_m4_m4m4(mat, vc->rv3d->persmat, ob->obmat); @@ -2863,7 +2866,8 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P RNA_float_get_array(itemptr, "mouse", mval); view3d_operator_needs_opengl(C); - + ED_view3d_init_mats_rv3d(ob, vc->rv3d); + /* load projection matrix */ mult_m4_m4m4(mat, vc->rv3d->persmat, ob->obmat); -- cgit v1.2.3 From 2f53741cfe66fca724712f46a1321999a32a92e7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 03:12:19 +0000 Subject: bridge tool could make bow-tie quads when given 2 isolated edges. --- source/blender/bmesh/operators/bmo_connect.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'source') diff --git a/source/blender/bmesh/operators/bmo_connect.c b/source/blender/bmesh/operators/bmo_connect.c index 3a0e18b9ee5..9a17ebea38d 100644 --- a/source/blender/bmesh/operators/bmo_connect.c +++ b/source/blender/bmesh/operators/bmo_connect.c @@ -359,6 +359,17 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) /* Last point of loop 2 */ v4 = get_outer_vert(bm, ee2[clamp_index(-1, BLI_array_count(ee2))]); + /* ugh, happens when bridging single edges, user could just make a face + * but better support it for sake of completeness */ + if (v1 == v2) { + BLI_assert(BLI_array_count(ee1) == 1); + v2 = (vv1[0] == v2) ? vv1[1] : vv1[0]; + } + if (v3 == v4) { + BLI_assert(BLI_array_count(ee2) == 1); + v4 = (vv2[0] == v4) ? vv2[1] : vv2[0]; + } + /* If v1 is a better match for v4 than v3, AND v2 is a better match * for v3 than v4, the loops are in opposite directions, so reverse * the order of reads from vv1. We can avoid sqrt for comparison */ -- cgit v1.2.3 From 9191b783bb2bc1a2d4be2b2cd215735e68353a56 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Wed, 30 Jan 2013 05:55:17 +0000 Subject: BGE: Some various changes to make moving the character physics type easier: * Undoing the previous applyMovement() changes for characters. This was causing bugs for the Motion Actuator. * Creating a Character Motion type for the Motion Actuator with specific controls for characters. This includes moving, rotating and jumping. * Adding a KX_CharacterWrapper.walkDirection to set the character's direction and speed. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note, this also resolves the following bugs: [#33585] "Setting dLoc of motion actuator [0,0,0] via python won't stop object" reported by Manuel Bellersen (urfoex) [#33503] "Character physics type won´t accept more than one motion anymore" reported by Mr Larodos --- source/blender/editors/space_logic/logic_window.c | 19 ++++++++ source/blender/makesdna/DNA_actuator_types.h | 7 ++- source/blender/makesrna/intern/rna_actuator.c | 17 +++++++ .../gameengine/Converter/KX_ConvertActuators.cpp | 3 ++ .../Ketsji/KX_BulletPhysicsController.cpp | 17 +++++++ .../gameengine/Ketsji/KX_BulletPhysicsController.h | 3 ++ source/gameengine/Ketsji/KX_CharacterWrapper.cpp | 29 +++++++++++ source/gameengine/Ketsji/KX_CharacterWrapper.h | 2 + source/gameengine/Ketsji/KX_IPhysicsController.h | 3 ++ source/gameengine/Ketsji/KX_ObjectActuator.cpp | 41 ++++++++++++++-- source/gameengine/Ketsji/KX_ObjectActuator.h | 8 +++ .../Physics/Bullet/CcdPhysicsController.cpp | 57 ++++++++++++++++++---- .../Physics/Bullet/CcdPhysicsController.h | 7 ++- .../Physics/Bullet/CcdPhysicsEnvironment.cpp | 16 ++++++ source/gameengine/Physics/common/PHY_ICharacter.h | 4 ++ 15 files changed, 216 insertions(+), 17 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index f46151fd33a..fa7e888f8d7 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -1860,6 +1860,25 @@ static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr) uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NONE); break; + case ACT_OBJECT_CHARACTER: + split = uiLayoutSplit(layout, 0.9, FALSE); + row = uiLayoutRow(split, FALSE); + uiItemR(row, ptr, "offset_location", 0, NULL, ICON_NONE); + row = uiLayoutRow(split, TRUE); + uiItemR(row, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + uiItemR(row, ptr, "use_add_character_location", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + + split = uiLayoutSplit(layout, 0.9, FALSE); + row = uiLayoutRow(split, FALSE); + uiItemR(row, ptr, "offset_rotation", 0, NULL, ICON_NONE); + uiItemR(split, ptr, "use_local_rotation", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + + split = uiLayoutSplit(layout, 0.9, FALSE); + row = uiLayoutRow(split, FALSE); + split = uiLayoutSplit(row, 0.7, FALSE); + uiItemL(split, "", ICON_NONE); /*Just use this for some spacing */ + uiItemR(split, ptr, "use_character_jump", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + break; } } diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index b445d59db2c..7c4772f24e8 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -277,10 +277,13 @@ typedef struct bActuator { #define ACT_ANG_VEL_LOCAL 32 //#define ACT_ADD_LIN_VEL_LOCAL 64 #define ACT_ADD_LIN_VEL 64 +#define ACT_ADD_CHAR_LOC 128 +#define ACT_CHAR_JUMP 256 /* objectactuator->type */ -#define ACT_OBJECT_NORMAL 0 -#define ACT_OBJECT_SERVO 1 +#define ACT_OBJECT_NORMAL 0 +#define ACT_OBJECT_SERVO 1 +#define ACT_OBJECT_CHARACTER 2 /* actuator->type */ #define ACT_OBJECT 0 diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index b653289e44d..18035acdb63 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -389,6 +389,12 @@ static void rna_ObjectActuator_type_set(struct PointerRNA *ptr, int value) oa->forcerot[1] = 0.5f; oa->forcerot[2] = 0.0f; break; + + case ACT_OBJECT_CHARACTER: + memset(oa, 0, sizeof(bObjectActuator)); + oa->flag = ACT_DLOC_LOCAL | ACT_DROT_LOCAL; + oa->type = ACT_OBJECT_CHARACTER; + break; } } } @@ -701,6 +707,7 @@ static void rna_def_object_actuator(BlenderRNA *brna) static EnumPropertyItem prop_type_items[] = { {ACT_OBJECT_NORMAL, "OBJECT_NORMAL", 0, "Simple Motion", ""}, {ACT_OBJECT_SERVO, "OBJECT_SERVO", 0, "Servo Control", ""}, + {ACT_OBJECT_CHARACTER, "OBJECT_CHARACTER", 0, "Character Motion", ""}, {0, NULL, 0, NULL, NULL} }; @@ -867,6 +874,11 @@ static void rna_def_object_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Add", "Toggles between ADD and SET linV"); RNA_def_property_update(prop, NC_LOGIC, NULL); + prop = RNA_def_property(srna, "use_add_character_location", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_ADD_CHAR_LOC); + RNA_def_property_ui_text(prop, "Add", "Toggles between ADD and SET character location"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + prop = RNA_def_property(srna, "use_servo_limit_x", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SERVO_LIMIT_X); RNA_def_property_ui_text(prop, "X", "Set limit to force along the X axis"); @@ -881,6 +893,11 @@ static void rna_def_object_actuator(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SERVO_LIMIT_Z); RNA_def_property_ui_text(prop, "Z", "Set limit to force along the Z axis"); RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop = RNA_def_property(srna, "use_character_jump", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CHAR_JUMP); + RNA_def_property_ui_text(prop, "Jump", "Makes the character jump using the settings in the physics properties"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_camera_actuator(BlenderRNA *brna) diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index 695bf0c4dc8..05da38dd1af 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -180,7 +180,10 @@ void BL_ConvertActuators(const char* maggiename, bitLocalFlag.LinearVelocity = bool((obact->flag & ACT_LIN_VEL_LOCAL)!=0); bitLocalFlag.AngularVelocity = bool((obact->flag & ACT_ANG_VEL_LOCAL)!=0); bitLocalFlag.ServoControl = bool(obact->type == ACT_OBJECT_SERVO); + bitLocalFlag.CharacterMotion = bool(obact->type == ACT_OBJECT_CHARACTER); + bitLocalFlag.CharacterJump = bool((obact->flag & ACT_CHAR_JUMP)!=0); bitLocalFlag.AddOrSetLinV = bool((obact->flag & ACT_ADD_LIN_VEL)!=0); + bitLocalFlag.AddOrSetCharLoc = bool((obact->flag & ACT_ADD_CHAR_LOC)!=0); if (obact->reference && bitLocalFlag.ServoControl) { obref = converter->FindGameObject(obact->reference); diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp index 6ef0aed9fe2..262ec541cf9 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp @@ -75,6 +75,11 @@ void KX_BulletPhysicsController::SetLinVelocityMin(float val) CcdPhysicsController::SetLinVelocityMin(val); } +void KX_BulletPhysicsController::Jump() +{ + CcdPhysicsController::Jump(); +} + float KX_BulletPhysicsController::GetLinVelocityMax() { return (float)CcdPhysicsController::GetLinVelocityMax(); @@ -119,6 +124,11 @@ void KX_BulletPhysicsController::RelativeTranslate(const MT_Vector3& dloc,bool l } +void KX_BulletPhysicsController::SetWalkDirection(const MT_Vector3& dloc,bool local) +{ + CcdPhysicsController::SetWalkDirection(dloc[0],dloc[1],dloc[2],local); +} + void KX_BulletPhysicsController::RelativeRotate(const MT_Matrix3x3& drot,bool local) { float rotval[9]; @@ -155,6 +165,13 @@ MT_Vector3 KX_BulletPhysicsController::GetVelocity(const MT_Point3& pos) return MT_Vector3(linVel[0],linVel[1],linVel[2]); } +MT_Vector3 KX_BulletPhysicsController::GetWalkDirection() +{ + float dir[3]; + CcdPhysicsController::GetWalkDirection(dir[0], dir[1], dir[2]); + return MT_Vector3(dir[0], dir[1], dir[2]); +} + void KX_BulletPhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool local) { CcdPhysicsController::SetAngularVelocity(ang_vel.x(),ang_vel.y(),ang_vel.z(),local); diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h index aa42bf61a78..3d13744567b 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h @@ -40,11 +40,14 @@ public: virtual void RelativeRotate(const MT_Matrix3x3& drot,bool local); virtual void ApplyTorque(const MT_Vector3& torque,bool local); virtual void ApplyForce(const MT_Vector3& force,bool local); + virtual void SetWalkDirection(const MT_Vector3& dir,bool local); virtual MT_Vector3 GetLinearVelocity(); virtual MT_Vector3 GetAngularVelocity(); virtual MT_Vector3 GetVelocity(const MT_Point3& pos); + virtual MT_Vector3 GetWalkDirection(); virtual void SetAngularVelocity(const MT_Vector3& ang_vel,bool local); virtual void SetLinearVelocity(const MT_Vector3& lin_vel,bool local); + virtual void Jump(); virtual void getOrientation(MT_Quaternion& orn); virtual void setOrientation(const MT_Matrix3x3& orn); virtual void setPosition(const MT_Point3& pos); diff --git a/source/gameengine/Ketsji/KX_CharacterWrapper.cpp b/source/gameengine/Ketsji/KX_CharacterWrapper.cpp index 64bbbb7d344..a669bdd2586 100644 --- a/source/gameengine/Ketsji/KX_CharacterWrapper.cpp +++ b/source/gameengine/Ketsji/KX_CharacterWrapper.cpp @@ -5,6 +5,7 @@ #include "KX_CharacterWrapper.h" #include "PHY_ICharacter.h" +#include "KX_PyMath.h" KX_CharacterWrapper::KX_CharacterWrapper(PHY_ICharacter* character) : PyObjectPlus(), @@ -47,6 +48,7 @@ PyAttributeDef KX_CharacterWrapper::Attributes[] = { KX_PYATTRIBUTE_RW_FUNCTION("gravity", KX_CharacterWrapper, pyattr_get_gravity, pyattr_set_gravity), KX_PYATTRIBUTE_RW_FUNCTION("maxJumps", KX_CharacterWrapper, pyattr_get_max_jumps, pyattr_set_max_jumps), KX_PYATTRIBUTE_RO_FUNCTION("jumpCount", KX_CharacterWrapper, pyattr_get_jump_count), + KX_PYATTRIBUTE_RW_FUNCTION("walkDirection", KX_CharacterWrapper, pyattr_get_walk_dir, pyattr_set_walk_dir), { NULL } //Sentinel }; @@ -108,6 +110,33 @@ PyObject *KX_CharacterWrapper::pyattr_get_jump_count(void *self_v, const KX_PYAT return PyLong_FromLong(self->m_character->GetJumpCount()); } +PyObject *KX_CharacterWrapper::pyattr_get_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_CharacterWrapper* self = static_cast(self_v); + PHY__Vector3 vec = self->m_character->GetWalkDirection(); + MT_Vector3 retval = MT_Vector3(vec[0], vec[1], vec[2]); + + return PyObjectFrom(retval); +} + +int KX_CharacterWrapper::pyattr_set_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_CharacterWrapper* self = static_cast(self_v); + MT_Vector3 dir; + if (!PyVecTo(value, dir)) { + PyErr_SetString(PyExc_TypeError, "KX_CharacterWrapper.walkDirection: expected a vector"); + return PY_SET_ATTR_FAIL; + } + + PHY__Vector3 vec; + vec[0] = dir[0]; + vec[1] = dir[1]; + vec[2] = dir[2]; + + self->m_character->SetWalkDirection(vec); + return PY_SET_ATTR_SUCCESS; +} + PyMethodDef KX_CharacterWrapper::Methods[] = { KX_PYMETHODTABLE_NOARGS(KX_CharacterWrapper, jump), {NULL,NULL} //Sentinel diff --git a/source/gameengine/Ketsji/KX_CharacterWrapper.h b/source/gameengine/Ketsji/KX_CharacterWrapper.h index f1c977f4e5d..d4d8f195102 100644 --- a/source/gameengine/Ketsji/KX_CharacterWrapper.h +++ b/source/gameengine/Ketsji/KX_CharacterWrapper.h @@ -29,6 +29,8 @@ public: static PyObject* pyattr_get_max_jumps(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_max_jumps(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static PyObject* pyattr_get_jump_count(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); #endif // WITH_PYTHON private: diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.h b/source/gameengine/Ketsji/KX_IPhysicsController.h index 280b1816a1e..2019be57679 100644 --- a/source/gameengine/Ketsji/KX_IPhysicsController.h +++ b/source/gameengine/Ketsji/KX_IPhysicsController.h @@ -70,11 +70,14 @@ public: virtual void RelativeRotate(const MT_Matrix3x3& drot,bool local)=0; virtual void ApplyTorque(const MT_Vector3& torque,bool local)=0; virtual void ApplyForce(const MT_Vector3& force,bool local)=0; + virtual void SetWalkDirection(const MT_Vector3& dir,bool local)=0; virtual MT_Vector3 GetLinearVelocity()=0; virtual MT_Vector3 GetAngularVelocity()=0; virtual MT_Vector3 GetVelocity(const MT_Point3& pos)=0; + virtual MT_Vector3 GetWalkDirection()=0; virtual void SetAngularVelocity(const MT_Vector3& ang_vel,bool local)=0; virtual void SetLinearVelocity(const MT_Vector3& lin_vel,bool local)=0; + virtual void Jump()=0; virtual void resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) = 0; virtual void getOrientation(MT_Quaternion& orn)=0; diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp index 931039bc54c..16e4cade280 100644 --- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp +++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp @@ -81,6 +81,16 @@ KX_ObjectActuator( m_pid = m_torque; } + if (m_bitLocalFlag.CharacterMotion) + { + KX_GameObject *parent = static_cast(GetParent()); + + if (!parent->GetPhysicsController() || !parent->GetPhysicsController()->IsCharacter()) + { + printf("Character motion enabled on non-character object (%s), falling back to simple motion.\n", parent->GetName().Ptr()); + m_bitLocalFlag.CharacterMotion = false; + } + } if (m_reference) m_reference->RegisterActuator(this); UpdateFuzzyFlags(); @@ -116,10 +126,10 @@ bool KX_ObjectActuator::Update() m_active_combined_velocity = false; } - // Explicitly stop the movement if we're using a character (apply movement is a little different for characters) - if (parent->GetPhysicsController() && parent->GetPhysicsController()->IsCharacter()) { + // Explicitly stop the movement if we're using character motion + if (m_bitLocalFlag.CharacterMotion) { MT_Vector3 vec(0.0, 0.0, 0.0); - parent->ApplyMovement(vec, true); + parent->GetPhysicsController()->SetWalkDirection(vec, true); } m_linear_damping_active = false; @@ -205,7 +215,30 @@ bool KX_ObjectActuator::Update() m_previous_error = e; m_error_accumulator = I; parent->ApplyForce(m_force,(m_bitLocalFlag.LinearVelocity) != 0); - } else + } else if(m_bitLocalFlag.CharacterMotion) + { + MT_Vector3 dir = m_dloc; + + if (m_bitLocalFlag.AddOrSetCharLoc) { + MT_Vector3 old_dir = parent->GetPhysicsController()->GetWalkDirection(); + MT_Scalar mag = old_dir.length(); + if (mag < MT_EPSILON) + mag = dir.length(); + dir = (dir + old_dir).normalized() * mag; + } + + // We always want to set the walk direction since a walk direction of (0, 0, 0) should stop the character + parent->GetPhysicsController()->SetWalkDirection(dir, (m_bitLocalFlag.DLoc) != 0); + + if (!m_bitLocalFlag.ZeroDRot) + { + parent->ApplyRotation(m_drot,(m_bitLocalFlag.DRot) != 0); + } + if (m_bitLocalFlag.CharacterJump) + { + parent->GetPhysicsController()->Jump(); + } + }else { if (!m_bitLocalFlag.ZeroForce) { diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.h b/source/gameengine/Ketsji/KX_ObjectActuator.h index b0efee550af..1f2453e3700 100644 --- a/source/gameengine/Ketsji/KX_ObjectActuator.h +++ b/source/gameengine/Ketsji/KX_ObjectActuator.h @@ -54,7 +54,12 @@ struct KX_LocalFlags { LinearVelocity(false), AngularVelocity(false), AddOrSetLinV(false), + AddOrSetCharLoc(false), + ServoControl(false), + CharacterMotion(false), + CharacterJump(false), ZeroForce(false), + ZeroTorque(false), ZeroDRot(false), ZeroDLoc(false), ZeroLinearVelocity(false), @@ -69,7 +74,10 @@ struct KX_LocalFlags { bool LinearVelocity; bool AngularVelocity; bool AddOrSetLinV; + bool AddOrSetCharLoc; bool ServoControl; + bool CharacterMotion; + bool CharacterJump; bool ZeroForce; bool ZeroTorque; bool ZeroDRot; diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index cf96f22a345..0bf11fd2f9d 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -115,6 +115,11 @@ void BlenderBulletCharacterController::jump() m_jumps++; } +const btVector3& BlenderBulletCharacterController::getWalkDirection() +{ + return m_walkDirection; +} + CcdPhysicsController::CcdPhysicsController (const CcdConstructionInfo& ci) :m_cci(ci) { @@ -926,20 +931,27 @@ void CcdPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dloc if (local) dloc = xform.getBasis()*dloc; - if (m_characterController) - { - m_characterController->setWalkDirection(dloc/GetPhysicsEnvironment()->getNumTimeSubSteps()); - } - else - { - - xform.setOrigin(xform.getOrigin() + dloc); - SetCenterOfMassTransform(xform); - } + xform.setOrigin(xform.getOrigin() + dloc); + SetCenterOfMassTransform(xform); } } +void CcdPhysicsController::SetWalkDirection(float dirX,float dirY,float dirZ,bool local) +{ + + if (m_object && m_characterController) + { + btVector3 dir(dirX,dirY,dirZ); + btTransform xform = m_object->getWorldTransform(); + + if (local) + dir = xform.getBasis()*dir; + + m_characterController->setWalkDirection(dir/GetPhysicsEnvironment()->getNumTimeSubSteps()); + } +} + void CcdPhysicsController::RelativeRotate(const float rotval[9],bool local) { if (m_object) @@ -1267,6 +1279,13 @@ void CcdPhysicsController::applyImpulse(float attachX,float attachY,float attac } } + +void CcdPhysicsController::Jump() +{ + if (m_object && m_characterController) + m_characterController->jump(); +} + void CcdPhysicsController::SetActive(bool active) { } @@ -1323,6 +1342,24 @@ void CcdPhysicsController::GetVelocity(const float posX,const float posY,const linvZ = 0.f; } } + +void CcdPhysicsController::GetWalkDirection(float& dirX,float& dirY,float& dirZ) +{ + if (m_object && m_characterController) + { + const btVector3 dir = m_characterController->getWalkDirection(); + dirX = dir.x(); + dirY = dir.y(); + dirZ = dir.z(); + } + else + { + dirX = 0.f; + dirY = 0.f; + dirZ = 0.f; + } +} + void CcdPhysicsController::getReactionForce(float& forceX,float& forceY,float& forceZ) { } diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index b151c2f6b59..d06403a55a2 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -417,6 +417,8 @@ public: virtual bool canJump() const; virtual void jump(); + + const btVector3& getWalkDirection(); }; ///CcdPhysicsController is a physics object that supports continuous collision detection and time of impact based physics resolution. @@ -424,7 +426,7 @@ class CcdPhysicsController : public PHY_IPhysicsController { protected: btCollisionObject* m_object; - btKinematicCharacterController* m_characterController; + BlenderBulletCharacterController* m_characterController; class PHY_IMotionState* m_MotionState; @@ -517,6 +519,7 @@ protected: // kinematic methods virtual void RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local); + virtual void SetWalkDirection(float dirX,float dirY,float dirZ,bool local); virtual void RelativeRotate(const float drot[9],bool local); virtual void getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal); virtual void setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal); @@ -531,6 +534,7 @@ protected: virtual void SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local); virtual void SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local); virtual void applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ); + virtual void Jump(); virtual void SetActive(bool active); // reading out information from physics @@ -538,6 +542,7 @@ protected: virtual void GetAngularVelocity(float& angVelX,float& angVelY,float& angVelZ); virtual void GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ); virtual void getReactionForce(float& forceX,float& forceY,float& forceZ); + virtual void GetWalkDirection(float& dirX,float& dirY,float& dirZ); // dyna's that are rigidbody are free in orientation, dyna's with non-rigidbody are restricted virtual void setRigidBody(bool rigid); diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index cadba97023e..254624cd8a0 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -310,6 +310,22 @@ public: { return m_controller->getJumpCount(); } + + virtual void SetWalkDirection(PHY__Vector3 dir) + { + btVector3 vec = btVector3(dir[0], dir[1], dir[2]); + m_controller->setWalkDirection(vec); + } + + virtual PHY__Vector3 GetWalkDirection() + { + btVector3 vec = m_controller->getWalkDirection(); + PHY__Vector3 retval; + retval[0] = vec[0]; + retval[1] = vec[1]; + retval[2] = vec[2]; + return retval; + } }; class CcdOverlapFilterCallBack : public btOverlapFilterCallback diff --git a/source/gameengine/Physics/common/PHY_ICharacter.h b/source/gameengine/Physics/common/PHY_ICharacter.h index 63f6c0bd18a..8a599452816 100644 --- a/source/gameengine/Physics/common/PHY_ICharacter.h +++ b/source/gameengine/Physics/common/PHY_ICharacter.h @@ -15,6 +15,7 @@ class PHY_ICharacter { public: + virtual ~PHY_ICharacter(){}; virtual void Jump()= 0; virtual bool OnGround()= 0; @@ -27,6 +28,9 @@ public: virtual int GetJumpCount()= 0; + virtual void SetWalkDirection(PHY__Vector3 dir)=0; + virtual PHY__Vector3 GetWalkDirection()=0; + #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("GE:PHY_ICharacter") #endif -- cgit v1.2.3 From c8015a27888a4c87360b1af158fc9b70bd4112ae Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 11:06:02 +0000 Subject: fix [#33740] Incorecct UV mapping from camera view Bug was in fact that the options for this operator couldn't be accessed (unless you knew to press f6), now the redo panel sets the window area before polling. Now other operators that use the window region will show settings too. --- source/blender/editors/space_clip/clip_toolbar.c | 27 ++++++++++----- .../blender/editors/space_view3d/view3d_toolbar.c | 39 ++++++++++++++-------- source/blender/editors/util/undo.c | 1 + 3 files changed, 44 insertions(+), 23 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_clip/clip_toolbar.c b/source/blender/editors/space_clip/clip_toolbar.c index 1bdf5214192..ad70abf5732 100644 --- a/source/blender/editors/space_clip/clip_toolbar.c +++ b/source/blender/editors/space_clip/clip_toolbar.c @@ -219,23 +219,32 @@ static void clip_panel_operator_redo_operator(const bContext *C, Panel *pa, wmOp static void clip_panel_operator_redo(const bContext *C, Panel *pa) { wmOperator *op = WM_operator_last_redo(C); - uiBlock *block; + ARegion *ar; + ARegion *ar1; if (op == NULL) return; - if (WM_operator_poll((bContext *)C, op->type) == 0) - return; + /* keep in sync with logic in ED_undo_operator_repeat() */ + ar = CTX_wm_region(C); + ar1 = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW); + if (ar1) + CTX_wm_region_set((bContext *)C, ar1); + + if (WM_operator_poll((bContext *)C, op->type)) { + uiBlock *block = uiLayoutGetBlock(pa->layout); - block = uiLayoutGetBlock(pa->layout); + if (!WM_operator_check_ui_enabled(C, op->type->name)) + uiLayoutSetEnabled(pa->layout, FALSE); - if (!WM_operator_check_ui_enabled(C, op->type->name)) - uiLayoutSetEnabled(pa->layout, FALSE); + /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */ + uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, op); - /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */ - uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, op); + clip_panel_operator_redo_operator(C, pa, op); + } - clip_panel_operator_redo_operator(C, pa, op); + /* set region back */ + CTX_wm_region_set((bContext *)C, ar); } void ED_clip_tool_props_register(ARegionType *art) diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c index bfeb56036e6..30e6e934d21 100644 --- a/source/blender/editors/space_view3d/view3d_toolbar.c +++ b/source/blender/editors/space_view3d/view3d_toolbar.c @@ -101,22 +101,33 @@ static void view3d_panel_operator_redo_operator(const bContext *C, Panel *pa, wm static void view3d_panel_operator_redo(const bContext *C, Panel *pa) { wmOperator *op = WM_operator_last_redo(C); - uiBlock *block; - - if (op == NULL) - return; - if (WM_operator_poll((bContext *)C, op->type) == 0) + ARegion *ar; + ARegion *ar1; + + if (op == NULL) { return; - - block = uiLayoutGetBlock(pa->layout); - - if (!WM_operator_check_ui_enabled(C, op->type->name)) - uiLayoutSetEnabled(pa->layout, FALSE); + } - /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */ - uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, op); - - view3d_panel_operator_redo_operator(C, pa, op); + /* keep in sync with logic in ED_undo_operator_repeat() */ + ar = CTX_wm_region(C); + ar1 = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW); + if (ar1) + CTX_wm_region_set((bContext *)C, ar1); + + if (WM_operator_poll((bContext *)C, op->type)) { + uiBlock *block = uiLayoutGetBlock(pa->layout); + + if (!WM_operator_check_ui_enabled(C, op->type->name)) + uiLayoutSetEnabled(pa->layout, FALSE); + + /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */ + uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, op); + + view3d_panel_operator_redo_operator(C, pa, op); + } + + /* set region back */ + CTX_wm_region_set((bContext *)C, ar); } /* ******************* */ diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index 1dc7e0c90e8..e3d35807862 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -339,6 +339,7 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) wmWindowManager *wm = CTX_wm_manager(C); struct Scene *scene = CTX_data_scene(C); + /* keep in sync with logic in view3d_panel_operator_redo() */ ARegion *ar = CTX_wm_region(C); ARegion *ar1 = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW); -- cgit v1.2.3 From 54223ed05b7e2840865b5e46ed6d43573ff2b4ae Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 12:22:02 +0000 Subject: Add active region for operator execution. This means you can for example, uv unwrap in quad-view and change settings in the toolbar without defaulting back to the first quad-view region available. This may be displayed to the user later, for now this is set on executing registrable operators. --- source/blender/blenkernel/BKE_screen.h | 1 + source/blender/blenkernel/intern/screen.c | 14 ++++++ source/blender/blenloader/intern/readfile.c | 1 + source/blender/editors/space_view3d/space_view3d.c | 2 +- .../blender/editors/space_view3d/view3d_toolbar.c | 2 +- source/blender/editors/util/undo.c | 2 +- source/blender/makesdna/DNA_screen_types.h | 3 +- source/blender/windowmanager/WM_api.h | 2 + .../blender/windowmanager/intern/wm_event_system.c | 55 ++++++++++++++++------ 9 files changed, 64 insertions(+), 18 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index 3c6f886b59a..629acab9e34 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -261,6 +261,7 @@ void BKE_area_region_free(struct SpaceType *st, struct ARegion *ar); void BKE_screen_area_free(struct ScrArea *sa); struct ARegion *BKE_area_find_region_type(struct ScrArea *sa, int type); +struct ARegion *BKE_area_find_region_active_win(struct ScrArea *sa); struct ScrArea *BKE_screen_find_big_area(struct bScreen *sc, const int spacetype, const short min); void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene); diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 95b72d0185c..01f57b95378 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -355,6 +355,20 @@ ARegion *BKE_area_find_region_type(ScrArea *sa, int type) return NULL; } +ARegion *BKE_area_find_region_active_win(ScrArea *sa) +{ + if (sa) { + ARegion *ar = BLI_findlink(&sa->regionbase, sa->region_active_win); + if (ar && (ar->regiontype == RGN_TYPE_WINDOW)) { + return ar; + } + + /* fallback to any */ + return BKE_area_find_region_type(sa, RGN_TYPE_WINDOW); + } + return NULL; +} + /* note, using this function is generally a last resort, you really want to be * using the context when you can - campbell * -1 for any type */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 070cb4676a1..17175bec0c5 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -6005,6 +6005,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc) sa->handlers.first = sa->handlers.last = NULL; sa->type = NULL; /* spacetype callbacks */ + sa->region_active_win = -1; for (ar = sa->regionbase.first; ar; ar = ar->next) direct_link_region(fd, ar, sa->spacetype); diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index b2d58cf41de..658196a1bd4 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -146,7 +146,7 @@ RegionView3D *ED_view3d_context_rv3d(bContext *C) if (rv3d == NULL) { ScrArea *sa = CTX_wm_area(C); if (sa && sa->spacetype == SPACE_VIEW3D) { - ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW); + ARegion *ar = BKE_area_find_region_active_win(sa); if (ar) { rv3d = ar->regiondata; } diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c index 30e6e934d21..bb5b7aa6911 100644 --- a/source/blender/editors/space_view3d/view3d_toolbar.c +++ b/source/blender/editors/space_view3d/view3d_toolbar.c @@ -110,7 +110,7 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa) /* keep in sync with logic in ED_undo_operator_repeat() */ ar = CTX_wm_region(C); - ar1 = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW); + ar1 = BKE_area_find_region_active_win(CTX_wm_area(C)); if (ar1) CTX_wm_region_set((bContext *)C, ar1); diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index e3d35807862..8a0ef06ef12 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -341,7 +341,7 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) /* keep in sync with logic in view3d_panel_operator_redo() */ ARegion *ar = CTX_wm_region(C); - ARegion *ar1 = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW); + ARegion *ar1 = BKE_area_find_region_active_win(CTX_wm_area(C)); if (ar1) CTX_wm_region_set(C, ar1); diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index d6100dcdbce..ae8b341f536 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -142,9 +142,10 @@ typedef struct ScrArea { short winx, winy; /* size */ short headertype; /* OLD! 0=no header, 1= down, 2= up */ - short pad; short do_refresh; /* private, for spacetype refresh callback */ short cursor, flag; + short region_active_win; /* index of last used region of 'RGN_TYPE_WINDOW' + * runtuime variable, updated by executing operators */ struct SpaceType *type; /* callbacks for this space type */ diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index bea54154e47..7f32fd6698e 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -311,6 +311,8 @@ void WM_event_fileselect_event(struct bContext *C, void *ophandle, int eventval void WM_event_print(struct wmEvent *event); #endif +void WM_operator_region_active_win_set(struct bContext *C); + /* drag and drop */ struct wmDrag *WM_event_start_drag(struct bContext *C, int icon, int type, void *poin, double value); void WM_event_drag_image(struct wmDrag *, struct ImBuf *, float scale, int sx, int sy); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 84fee9ff34c..4a95c6ac091 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -453,6 +453,22 @@ static void wm_operator_print(bContext *C, wmOperator *op) MEM_freeN(buf); } +/** + * Sets the active region for this space from the context. + * + * \see #BKE_area_find_region_active_win + */ +void WM_operator_region_active_win_set(bContext *C) +{ + ScrArea *sa = CTX_wm_area(C); + if (sa) { + ARegion *ar = CTX_wm_region(C); + if (ar && ar->regiontype == RGN_TYPE_WINDOW) { + sa->region_active_win = BLI_findindex(&sa->regionbase, ar); + } + } +} + /* for debugging only, getting inspecting events manually is tedious */ #ifndef NDEBUG @@ -573,10 +589,13 @@ static void wm_operator_finished(bContext *C, wmOperator *op, int repeat) MEM_freeN(buf); } - if (wm_operator_register_check(wm, op->type)) + if (wm_operator_register_check(wm, op->type)) { wm_operator_register(C, op); - else + WM_operator_region_active_win_set(C); + } + else { WM_operator_free(op); + } } } @@ -1045,7 +1064,14 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA } if (!(ar && ar->regiontype == type) && area) { - ARegion *ar1 = BKE_area_find_region_type(area, type); + ARegion *ar1; + if (type == RGN_TYPE_WINDOW) { + ar1 = BKE_area_find_region_active_win(area); + } + else { + ar1 = BKE_area_find_region_type(area, type); + } + if (ar1) CTX_wm_region_set(C, ar1); } @@ -1417,20 +1443,10 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand if (ot->flag & OPTYPE_UNDO) wm->op_undo_depth--; - /* putting back screen context, reval can pass trough after modal failures! */ - if ((retval & OPERATOR_PASS_THROUGH) || wm_event_always_pass(event)) { - CTX_wm_area_set(C, area); - CTX_wm_region_set(C, region); - } - else { - /* this special cases is for areas and regions that get removed */ - CTX_wm_area_set(C, NULL); - CTX_wm_region_set(C, NULL); - } - if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) wm_operator_reports(C, op, retval, FALSE); + /* important to run 'wm_operator_finished' before NULLing the context members */ if (retval & OPERATOR_FINISHED) { wm_operator_finished(C, op, 0); handler->op = NULL; @@ -1440,6 +1456,17 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand handler->op = NULL; } + /* putting back screen context, reval can pass trough after modal failures! */ + if ((retval & OPERATOR_PASS_THROUGH) || wm_event_always_pass(event)) { + CTX_wm_area_set(C, area); + CTX_wm_region_set(C, region); + } + else { + /* this special cases is for areas and regions that get removed */ + CTX_wm_area_set(C, NULL); + CTX_wm_region_set(C, NULL); + } + /* remove modal handler, operator itself should have been canceled and freed */ if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) { WM_cursor_grab_disable(CTX_wm_window(C), NULL); -- cgit v1.2.3 From 4c971d572785c63a4c715210308664941c5c8f26 Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Wed, 30 Jan 2013 15:43:13 +0000 Subject: Patch by erwin94 [#34015] dilate/erode multithreading another patch for the dilate/erode step method, still without any functional changes. This time it keeps the general algorithm but uses the tile system to make it multithreaded. I could not measure a speedup on my 2-core laptop, but hope that it will be faster for more cores. The immediate speedup that is very visible though is that tiles come in as soon as they are calculated and a dilate/erode node does not block the whole image to be calculated. till then, David. --- .../operations/COM_DilateErodeOperation.cpp | 335 +++++++++++---------- .../operations/COM_DilateErodeOperation.h | 2 +- 2 files changed, 184 insertions(+), 153 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp index ecc618a5346..ecb4ef93e9b 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp @@ -323,124 +323,147 @@ DilateStepOperation::DilateStepOperation() : NodeOperation() void DilateStepOperation::initExecution() { this->m_inputProgram = this->getInputSocketReader(0); - this->m_cached_buffer = NULL; - this->initMutex(); +} + + +// small helper to pass data from initializeTileData to executePixel +typedef struct tile_info { + rcti rect; + int width; + float *buffer; +} tile_info; + +static tile_info *create_cache(int xmin, int xmax, int ymin, int ymax) +{ + tile_info *result = (tile_info *)MEM_mallocN(sizeof(tile_info), "dilate erode tile"); + result->rect.xmin = xmin; + result->rect.xmax = xmax; + result->rect.ymin = ymin; + result->rect.ymax = ymax; + result->width = xmax - xmin; + result->buffer = (float *)MEM_callocN(sizeof(float) * (ymax - ymin) * result->width, "dilate erode cache"); + return result; } void *DilateStepOperation::initializeTileData(rcti *rect) { - if (this->m_cached_buffer != NULL) { - return this->m_cached_buffer; - } - lockMutex(); - if (this->m_cached_buffer == NULL) { - MemoryBuffer *buffer = (MemoryBuffer *)this->m_inputProgram->initializeTileData(NULL); - float *rectf = buffer->convertToValueBuffer(); - int x, y, i; - int bwidth = buffer->getWidth(); - int bheight = buffer->getHeight(); - - /* - The following is based on the van Herk/Gil-Werman algorithm for morphology operations. - */ - int half_window = this->m_iterations; - int window = half_window * 2 + 1; - float *temp = (float *)MEM_mallocN((2 * window - 1) * sizeof(float), "dilate erode temp"); - float *buf = (float *)MEM_mallocN((max(bwidth, bheight) + 5 * half_window) * sizeof(float), "dilate erode buf"); - - for (y = 0; y < bheight; y++) { - for (x = 0; x < window - 1; x++) { - buf[x] = -MAXFLOAT; - } - for (x = 0; x < bwidth; x++) { - buf[x + window - 1] = rectf[bwidth * y + x]; - } - for (x = bwidth + window - 1; x < bwidth + 5 * half_window; x++) { - buf[x] = -MAXFLOAT; - } + MemoryBuffer *tile = (MemoryBuffer *)this->m_inputProgram->initializeTileData(NULL); + int x, y, i; + int width = tile->getWidth(); + int height = tile->getHeight(); + float *buffer = tile->getBuffer(); + + int half_window = this->m_iterations; + int window = half_window * 2 + 1; + + int xmin = max(0, rect->xmin - half_window); + int ymin = max(0, rect->ymin - half_window); + int xmax = min(width, rect->xmax + half_window); + int ymax = min(height, rect->ymax + half_window); + + int bwidth = rect->xmax - rect->xmin; + int bheight = rect->ymax - rect->ymin; + + // Note: Cache buffer has original tilesize width, but new height. + // We have to calculate the additional rows in the first pass, + // to have valid data available for the second pass. + tile_info *result = create_cache(rect->xmin, rect->xmax, ymin, ymax); + float *rectf = result->buffer; + + // temp holds maxima for every step in the algorithm, buf holds a + // single row or column of input values, padded with MAXFLOATs to + // simplify the logic. + float *temp = (float *)MEM_mallocN(sizeof(float) * (2 * window - 1), "dilate erode temp"); + float *buf = (float *)MEM_mallocN(sizeof(float) * (max(bwidth, bheight) + 5 * half_window), "dilate erode buf"); + + // The following is based on the van Herk/Gil-Werman algorithm for morphology operations. + // first pass, horizontal dilate/erode + for (y = ymin; y < ymax; y++) { + for (x = 0; x < bwidth + 5 * half_window; x++) { + buf[x] = -MAXFLOAT; + } + for (x = xmin; x < xmax; ++x) { + buf[x - rect->xmin + window - 1] = buffer[4*(y * width + x)]; + } - for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { - int start = (i + 1) * window - 1; + for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { + int start = (i + 1) * window - 1; - temp[window - 1] = buf[start]; - for (x = 1; x < window; x++) { - temp[window - 1 - x] = max(temp[window - x], buf[start - x]); - temp[window - 1 + x] = max(temp[window + x - 2], buf[start + x]); - } + temp[window - 1] = buf[start]; + for (x = 1; x < window; x++) { + temp[window - 1 - x] = max(temp[window - x], buf[start - x]); + temp[window - 1 + x] = max(temp[window + x - 2], buf[start + x]); + } - start = half_window + (i - 1) * window + 1; - for (x = -min(0, start); x < window - max(0, start + window - bwidth); x++) { - rectf[bwidth * y + (start + x)] = max(temp[x], temp[x + window - 1]); - } + start = half_window + (i - 1) * window + 1; + for (x = -min(0, start); x < window - max(0, start + window - bwidth); x++) { + rectf[bwidth * (y-ymin) + (start + x)] = max(temp[x], temp[x + window - 1]); } } + } - for (x = 0; x < bwidth; x++) { - for (y = 0; y < window - 1; y++) { - buf[y] = -MAXFLOAT; - } - for (y = 0; y < bheight; y++) { - buf[y + window - 1] = rectf[bwidth * y + x]; - } - for (y = bheight + window - 1; y < bheight + 5 * half_window; y++) { - buf[y] = -MAXFLOAT; - } + // second pass, vertical dilate/erode + for (x = 0; x < bwidth; x++) { + for (y = 0; y < bheight + 5 * half_window; y++) { + buf[y] = -MAXFLOAT; + } + for (y = ymin; y < ymax; y++) { + buf[y - rect->ymin + window - 1] = rectf[(y-ymin) * bwidth + x]; + } - for (i = 0; i < (bheight + 3 * half_window) / window; i++) { - int start = (i + 1) * window - 1; + for (i = 0; i < (bheight + 3 * half_window) / window; i++) { + int start = (i + 1) * window - 1; - temp[window - 1] = buf[start]; - for (y = 1; y < window; y++) { - temp[window - 1 - y] = max(temp[window - y], buf[start - y]); - temp[window - 1 + y] = max(temp[window + y - 2], buf[start + y]); - } + temp[window - 1] = buf[start]; + for (y = 1; y < window; y++) { + temp[window - 1 - y] = max(temp[window - y], buf[start - y]); + temp[window - 1 + y] = max(temp[window + y - 2], buf[start + y]); + } - start = half_window + (i - 1) * window + 1; - for (y = -min(0, start); y < window - max(0, start + window - bheight); y++) { - rectf[bwidth * (y + start) + x] = max(temp[y], temp[y + window - 1]); - } + start = half_window + (i - 1) * window + 1; + for (y = -min(0, start); y < window - max(0, start + window - bheight); y++) { + rectf[bwidth * (y + start + (rect->ymin-ymin)) + x] = max(temp[y], temp[y + window - 1]); } } - - MEM_freeN(temp); - MEM_freeN(buf); - this->m_cached_buffer = rectf; } - unlockMutex(); - return this->m_cached_buffer; + + MEM_freeN(temp); + MEM_freeN(buf); + + return result; } void DilateStepOperation::executePixel(float output[4], int x, int y, void *data) { - output[0] = this->m_cached_buffer[y * this->getWidth() + x]; + tile_info *tile = (tile_info *)data; + int nx = x - tile->rect.xmin; + int ny = y - tile->rect.ymin; + output[0] = tile->buffer[tile->width * ny + nx]; } void DilateStepOperation::deinitExecution() { this->m_inputProgram = NULL; - this->deinitMutex(); - if (this->m_cached_buffer) { - MEM_freeN(this->m_cached_buffer); - this->m_cached_buffer = NULL; - } +} + +void DilateStepOperation::deinitializeTileData(rcti *rect, void *data) +{ + tile_info *tile = (tile_info *)data; + MEM_freeN(tile->buffer); + MEM_freeN(tile); } bool DilateStepOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { - if (this->m_cached_buffer) { - return false; - } - else { - rcti newInput; - - newInput.xmax = getWidth(); - newInput.xmin = 0; - newInput.ymax = getHeight(); - newInput.ymin = 0; - - return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); - } + rcti newInput; + int it = this->m_iterations; + newInput.xmax = input->xmax + it; + newInput.xmin = input->xmin - it; + newInput.ymax = input->ymax + it; + newInput.ymin = input->ymin - it; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } // Erode step @@ -451,80 +474,88 @@ ErodeStepOperation::ErodeStepOperation() : DilateStepOperation() void *ErodeStepOperation::initializeTileData(rcti *rect) { - if (this->m_cached_buffer != NULL) { - return this->m_cached_buffer; - } - lockMutex(); - if (this->m_cached_buffer == NULL) { - MemoryBuffer *buffer = (MemoryBuffer *)this->m_inputProgram->initializeTileData(NULL); - float *rectf = buffer->convertToValueBuffer(); - int x, y, i; - int bwidth = buffer->getWidth(); - int bheight = buffer->getHeight(); - - int half_window = this->m_iterations; - int window = half_window * 2 + 1; - float *temp = (float *)MEM_mallocN((2 * window - 1) * sizeof(float), "dilate erode temp"); - float *buf = (float *)MEM_mallocN((max(bwidth, bheight) + 5 * half_window) * sizeof(float), "dilate erode buf"); - - for (y = 0; y < bheight; y++) { - for (x = 0; x < window - 1; x++) { - buf[x] = MAXFLOAT; - } - for (x = 0; x < bwidth; x++) { - buf[x + window - 1] = rectf[bwidth * y + x]; - } - for (x = bwidth + window - 1; x < bwidth + 5 * half_window; x++) { - buf[x] = MAXFLOAT; - } + MemoryBuffer *tile = (MemoryBuffer *)this->m_inputProgram->initializeTileData(NULL); + int x, y, i; + int width = tile->getWidth(); + int height = tile->getHeight(); + float *buffer = tile->getBuffer(); + + int half_window = this->m_iterations; + int window = half_window * 2 + 1; + + int xmin = max(0, rect->xmin - half_window); + int ymin = max(0, rect->ymin - half_window); + int xmax = min(width, rect->xmax + half_window); + int ymax = min(height, rect->ymax + half_window); + + int bwidth = rect->xmax - rect->xmin; + int bheight = rect->ymax - rect->ymin; + + // Note: Cache buffer has original tilesize width, but new height. + // We have to calculate the additional rows in the first pass, + // to have valid data available for the second pass. + tile_info *result = create_cache(rect->xmin, rect->xmax, ymin, ymax); + float *rectf = result->buffer; + + // temp holds maxima for every step in the algorithm, buf holds a + // single row or column of input values, padded with MAXFLOATs to + // simplify the logic. + float *temp = (float *)MEM_mallocN(sizeof(float) * (2 * window - 1), "dilate erode temp"); + float *buf = (float *)MEM_mallocN(sizeof(float) * (max(bwidth, bheight) + 5 * half_window), "dilate erode buf"); + + // The following is based on the van Herk/Gil-Werman algorithm for morphology operations. + // first pass, horizontal dilate/erode + for (y = ymin; y < ymax; y++) { + for (x = 0; x < bwidth + 5 * half_window; x++) { + buf[x] = MAXFLOAT; + } + for (x = xmin; x < xmax; ++x) { + buf[x - rect->xmin + window - 1] = buffer[4*(y * width + x)]; + } - for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { - int start = (i + 1) * window - 1; + for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { + int start = (i + 1) * window - 1; - temp[window - 1] = buf[start]; - for (x = 1; x < window; x++) { - temp[window - 1 - x] = min(temp[window - x], buf[start - x]); - temp[window - 1 + x] = min(temp[window + x - 2], buf[start + x]); - } + temp[window - 1] = buf[start]; + for (x = 1; x < window; x++) { + temp[window - 1 - x] = min(temp[window - x], buf[start - x]); + temp[window - 1 + x] = min(temp[window + x - 2], buf[start + x]); + } - start = half_window + (i - 1) * window + 1; - for (x = -min(0, start); x < window - max(0, start + window - bwidth); x++) { - rectf[bwidth * y + (start + x)] = min(temp[x], temp[x + window - 1]); - } + start = half_window + (i - 1) * window + 1; + for (x = -min(0, start); x < window - max(0, start + window - bwidth); x++) { + rectf[bwidth * (y-ymin) + (start + x)] = min(temp[x], temp[x + window - 1]); } } + } - for (x = 0; x < bwidth; x++) { - for (y = 0; y < window - 1; y++) { - buf[y] = MAXFLOAT; - } - for (y = 0; y < bheight; y++) { - buf[y + window - 1] = rectf[bwidth * y + x]; - } - for (y = bheight + window - 1; y < bheight + 5 * half_window; y++) { - buf[y] = MAXFLOAT; - } + // second pass, vertical dilate/erode + for (x = 0; x < bwidth; x++) { + for (y = 0; y < bheight + 5 * half_window; y++) { + buf[y] = MAXFLOAT; + } + for (y = ymin; y < ymax; y++) { + buf[y - rect->ymin + window - 1] = rectf[(y-ymin) * bwidth + x]; + } - for (i = 0; i < (bheight + 3 * half_window) / window; i++) { - int start = (i + 1) * window - 1; + for (i = 0; i < (bheight + 3 * half_window) / window; i++) { + int start = (i + 1) * window - 1; - temp[window - 1] = buf[start]; - for (y = 1; y < window; y++) { - temp[window - 1 - y] = min(temp[window - y], buf[start - y]); - temp[window - 1 + y] = min(temp[window + y - 2], buf[start + y]); - } + temp[window - 1] = buf[start]; + for (y = 1; y < window; y++) { + temp[window - 1 - y] = min(temp[window - y], buf[start - y]); + temp[window - 1 + y] = min(temp[window + y - 2], buf[start + y]); + } - start = half_window + (i - 1) * window + 1; - for (y = -min(0, start); y < window - max(0, start + window - bheight); y++) { - rectf[bwidth * (y + start) + x] = min(temp[y], temp[y + window - 1]); - } + start = half_window + (i - 1) * window + 1; + for (y = -min(0, start); y < window - max(0, start + window - bheight); y++) { + rectf[bwidth * (y + start + (rect->ymin-ymin)) + x] = min(temp[y], temp[y + window - 1]); } } - - MEM_freeN(temp); - MEM_freeN(buf); - this->m_cached_buffer = rectf; } - unlockMutex(); - return this->m_cached_buffer; + + MEM_freeN(temp); + MEM_freeN(buf); + + return result; } diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.h b/source/blender/compositor/operations/COM_DilateErodeOperation.h index 47480d47c3b..51bad81d0ca 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.h +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.h @@ -128,7 +128,6 @@ protected: int m_iterations; - float *m_cached_buffer; public: DilateStepOperation(); @@ -147,6 +146,7 @@ public: * Deinitialize the execution */ void deinitExecution(); + void deinitializeTileData(rcti *rect, void *data); void setIterations(int iterations) { this->m_iterations = iterations; } -- cgit v1.2.3 From 00025c74b49bb32b1803858b2d7731751a074514 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 21:17:09 +0000 Subject: add BLI_mempool_as_arrayN utility function for getting the mempool as a new array (utility function currently unused). --- source/blender/blenlib/intern/BLI_mempool.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c index 0d6b8a44a1e..bf228f7456a 100644 --- a/source/blender/blenlib/intern/BLI_mempool.c +++ b/source/blender/blenlib/intern/BLI_mempool.c @@ -235,7 +235,11 @@ void *BLI_mempool_calloc(BLI_mempool *pool) return retval; } -/* doesnt protect against double frees, don't be stupid! */ +/** + * Free an element from the mempool. + * + * \note doesnt protect against double frees, don't be stupid! + */ void BLI_mempool_free(BLI_mempool *pool, void *addr) { BLI_freenode *newhead = addr; @@ -325,6 +329,16 @@ void BLI_mempool_as_array(BLI_mempool *pool, void **data) BLI_assert((p - data) == pool->totused); } +/** + * Allocate an array from the mempool. + */ +void *BLI_mempool_as_arrayN(BLI_mempool *pool, const char *allocstr) +{ + void *data = MEM_mallocN(BLI_mempool_count(pool) * pool->esize, allocstr); + BLI_mempool_as_array(pool, data); + return data; +} + void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter) { BLI_assert(pool->flag & BLI_MEMPOOL_ALLOW_ITER); @@ -397,6 +411,9 @@ void *BLI_mempool_iterstep(BLI_mempool_iter *iter) #endif +/** + * Free the mempool its self (and all elements). + */ void BLI_mempool_destroy(BLI_mempool *pool) { BLI_mempool_chunk *mpchunk = NULL; -- cgit v1.2.3 From 4e7b18876c3e995f030f865072cdad0e0ca6ea94 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 21:17:38 +0000 Subject: style cleanup --- source/blender/blenlib/BLI_mempool.h | 7 ++++++ source/blender/bmesh/tools/bmesh_triangulate.h | 2 +- .../operations/COM_DilateErodeOperation.cpp | 16 ++++++------- source/blender/makesrna/intern/rna_particle.c | 27 +++++++++++++--------- 4 files changed, 32 insertions(+), 20 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_mempool.h b/source/blender/blenlib/BLI_mempool.h index 20ea89f3abf..a1cbad73239 100644 --- a/source/blender/blenlib/BLI_mempool.h +++ b/source/blender/blenlib/BLI_mempool.h @@ -92,6 +92,13 @@ __attribute__((nonnull(1))) #endif ; +void *BLI_mempool_as_arrayN(BLI_mempool *pool, const char *allocstr) +#ifdef __GNUC__ +__attribute__((warn_unused_result)) +__attribute__((nonnull(1, 2))) +#endif +; + /** iteration stuff. note: this may easy to produce bugs with **/ /* private structure */ typedef struct BLI_mempool_iter { diff --git a/source/blender/bmesh/tools/bmesh_triangulate.h b/source/blender/bmesh/tools/bmesh_triangulate.h index 9632ab5957f..ea271c98acb 100644 --- a/source/blender/bmesh/tools/bmesh_triangulate.h +++ b/source/blender/bmesh/tools/bmesh_triangulate.h @@ -20,7 +20,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/bmesh/tools/bmesh_triangulate.c +/** \file blender/bmesh/tools/bmesh_triangulate.h * \ingroup bmesh * * Triangulate. diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp index ecb4ef93e9b..b54e47c136d 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp @@ -383,7 +383,7 @@ void *DilateStepOperation::initializeTileData(rcti *rect) buf[x] = -MAXFLOAT; } for (x = xmin; x < xmax; ++x) { - buf[x - rect->xmin + window - 1] = buffer[4*(y * width + x)]; + buf[x - rect->xmin + window - 1] = buffer[4 * (y * width + x)]; } for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { @@ -397,7 +397,7 @@ void *DilateStepOperation::initializeTileData(rcti *rect) start = half_window + (i - 1) * window + 1; for (x = -min(0, start); x < window - max(0, start + window - bwidth); x++) { - rectf[bwidth * (y-ymin) + (start + x)] = max(temp[x], temp[x + window - 1]); + rectf[bwidth * (y - ymin) + (start + x)] = max(temp[x], temp[x + window - 1]); } } } @@ -408,7 +408,7 @@ void *DilateStepOperation::initializeTileData(rcti *rect) buf[y] = -MAXFLOAT; } for (y = ymin; y < ymax; y++) { - buf[y - rect->ymin + window - 1] = rectf[(y-ymin) * bwidth + x]; + buf[y - rect->ymin + window - 1] = rectf[(y - ymin) * bwidth + x]; } for (i = 0; i < (bheight + 3 * half_window) / window; i++) { @@ -422,7 +422,7 @@ void *DilateStepOperation::initializeTileData(rcti *rect) start = half_window + (i - 1) * window + 1; for (y = -min(0, start); y < window - max(0, start + window - bheight); y++) { - rectf[bwidth * (y + start + (rect->ymin-ymin)) + x] = max(temp[y], temp[y + window - 1]); + rectf[bwidth * (y + start + (rect->ymin - ymin)) + x] = max(temp[y], temp[y + window - 1]); } } } @@ -510,7 +510,7 @@ void *ErodeStepOperation::initializeTileData(rcti *rect) buf[x] = MAXFLOAT; } for (x = xmin; x < xmax; ++x) { - buf[x - rect->xmin + window - 1] = buffer[4*(y * width + x)]; + buf[x - rect->xmin + window - 1] = buffer[4 * (y * width + x)]; } for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { @@ -524,7 +524,7 @@ void *ErodeStepOperation::initializeTileData(rcti *rect) start = half_window + (i - 1) * window + 1; for (x = -min(0, start); x < window - max(0, start + window - bwidth); x++) { - rectf[bwidth * (y-ymin) + (start + x)] = min(temp[x], temp[x + window - 1]); + rectf[bwidth * (y - ymin) + (start + x)] = min(temp[x], temp[x + window - 1]); } } } @@ -535,7 +535,7 @@ void *ErodeStepOperation::initializeTileData(rcti *rect) buf[y] = MAXFLOAT; } for (y = ymin; y < ymax; y++) { - buf[y - rect->ymin + window - 1] = rectf[(y-ymin) * bwidth + x]; + buf[y - rect->ymin + window - 1] = rectf[(y - ymin) * bwidth + x]; } for (i = 0; i < (bheight + 3 * half_window) / window; i++) { @@ -549,7 +549,7 @@ void *ErodeStepOperation::initializeTileData(rcti *rect) start = half_window + (i - 1) * window + 1; for (y = -min(0, start); y < window - max(0, start + window - bheight); y++) { - rectf[bwidth * (y + start + (rect->ymin-ymin)) + x] = min(temp[y], temp[y + window - 1]); + rectf[bwidth * (y + start + (rect->ymin - ymin)) + x] = min(temp[y], temp[y + window - 1]); } } } diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index a872ace6ae3..0107cd8b51e 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -289,8 +289,8 @@ static void rna_Particle_uv_on_emitter(ParticleData *particle, ParticleSystemMod } } -static void rna_ParticleSystem_co_hair(ParticleSystem *particlesystem, Object *object, ParticleSystemModifierData *modifier, int particle_no, int step, - float n_co[3]) +static void rna_ParticleSystem_co_hair(ParticleSystem *particlesystem, Object *object, ParticleSystemModifierData *modifier, + int particle_no, int step, float n_co[3]) { ParticleSettings *part = 0; ParticleData *pars = 0; @@ -307,7 +307,7 @@ static void rna_ParticleSystem_co_hair(ParticleSystem *particlesystem, Object *o part = particlesystem->part; pars = particlesystem->particles; - if(particlesystem->renderdata) { + if (particlesystem->renderdata) { step_nbr = part->ren_step; totchild = particlesystem->totchild; } @@ -381,10 +381,12 @@ static void rna_ParticleSystem_uv_on_emitter(ParticleSystem *particlesystem, Par part = particlesystem->part; - if(particlesystem->renderdata) + if (particlesystem->renderdata) { totchild = particlesystem->totchild; - else + } + else { totchild = (int)((float)particlesystem->totchild * (float)(part->disp) / 100.0f); + } /* can happen for disconnected/global hair */ if (part->type == PART_HAIR && !particlesystem->childcache) @@ -466,10 +468,11 @@ static void rna_ParticleSystem_uv_on_emitter(ParticleSystem *particlesystem, Par } } -static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, ParticleSystemModifierData *modifier, ParticleData *particle, int particle_no, int vcol_no, - float n_mcol[3]) +static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, ParticleSystemModifierData *modifier, + ParticleData *particle, int particle_no, int vcol_no, + float n_mcol[3]) { - ParticleSettings *part = 0; + ParticleSettings *part; int totpart; int totchild = 0; int num; @@ -481,10 +484,12 @@ static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, P part = particlesystem->part; - if(particlesystem->renderdata) + if (particlesystem->renderdata) { totchild = particlesystem->totchild; - else + } + else { totchild = (int)((float)particlesystem->totchild * (float)(part->disp) / 100.0f); + } /* can happen for disconnected/global hair */ if (part->type == PART_HAIR && !particlesystem->childcache) @@ -495,7 +500,7 @@ static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, P if (particle_no >= totpart + totchild) return; -/* 3. start creating renderable things */ + /* 3. start creating renderable things */ /* setup per particle individual stuff */ if (particle_no < totpart) { -- cgit v1.2.3 From d7623c0e161297a66c44bf54e38a0db4c2d59942 Mon Sep 17 00:00:00 2001 From: Dan Eicher Date: Wed, 30 Jan 2013 23:54:49 +0000 Subject: GPencilStrokePoints.add() - use MEM_recallocN to initialize newly created points --- source/blender/makesrna/intern/rna_gpencil.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index b3c1f4dd505..9461a816652 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -118,7 +118,7 @@ static void rna_GPencil_stroke_point_add(bGPDstroke *stroke, int count) if (stroke->points == NULL) stroke->points = MEM_callocN(sizeof(bGPDspoint) * count, "gp_stroke_points"); else - stroke->points = MEM_reallocN(stroke->points, sizeof(bGPDspoint) * (stroke->totpoints + count)); + stroke->points = MEM_recallocN(stroke->points, sizeof(bGPDspoint) * (stroke->totpoints + count)); stroke->totpoints += count; } -- cgit v1.2.3 From 29456505f3749dd00fc53351faef0306836361f3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 05:37:52 +0000 Subject: fix/workaround [#34026] Blender starts with too large window Minimal change to stop blender window opening across all monitors. Workaround the problem by starting maximized, and using sane defaults for non maximized window. I checked on a few different solutions to this, Using Xinerama works OK, but with different size monitors and not knowing which one the window-manager will pick in advance - this can be wrong too. Now instead of opening with the screen size, just start maximized and use a default size for the non-maximized window (clamped by the screen size). This isn't perfect since you could have 2x monitors at 1024x768, open blender, un-maximize - and blender window would cross over into the second monitor. --- source/blender/windowmanager/intern/wm_window.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 44c5693c3e3..bd6342ebc25 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -425,6 +425,15 @@ void wm_window_add_ghostwindows(wmWindowManager *wm) wm_set_apple_prefsize(wm_init_state.size_x, wm_init_state.size_y); } #else + /* default size when un-maximized, unless the screen(s) are smaller */ + + /* clamp by these arbitrary values because currently wm_get_screensize() + * will span multiple monitors and using xinerama isnt totally reliable + * since we don't which monitor the window manager will put the blender + * window in. */ + wm_init_state.size_x = MIN2(1800, wm_init_state.size_x - 100); + wm_init_state.size_y = MIN2(980, wm_init_state.size_y - 100); + wm_init_state.start_x = 0; wm_init_state.start_y = 0; @@ -439,8 +448,14 @@ void wm_window_add_ghostwindows(wmWindowManager *wm) win->sizex = wm_init_state.size_x; win->sizey = wm_init_state.size_y; - /* we can't properly resize a maximized window */ - win->windowstate = GHOST_kWindowStateNormal; + if (wm_init_state.override_flag & WIN_OVERRIDE_GEOM) { + /* we can't properly resize a maximized window */ + win->windowstate = GHOST_kWindowStateNormal; + } + else { + /* otherwise default factory settings start maximized */ + win->windowstate = GHOST_kWindowStateMaximized; + } wm_init_state.override_flag &= ~WIN_OVERRIDE_GEOM; } -- cgit v1.2.3 From acf04f003f9713f3a834b790a20ba19d2616bc6a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 06:38:35 +0000 Subject: fix [#34050] Regression from 2.49, "Release confirms" interferes with loop cutting --- source/blender/editors/mesh/mesh_ops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 4fdbb9310b0..884c4a3bee1 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -197,7 +197,7 @@ void ED_operatormacros_mesh(void) OPTYPE_UNDO | OPTYPE_REGISTER); WM_operatortype_macro_define(ot, "MESH_OT_loopcut"); otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_edge_slide"); - RNA_struct_idprops_unset(otmacro->ptr, "release_confirm"); + RNA_boolean_set(otmacro->ptr, "release_confirm", false); ot = WM_operatortype_append_macro("MESH_OT_duplicate_move", "Add Duplicate", "Duplicate mesh and move", OPTYPE_UNDO | OPTYPE_REGISTER); -- cgit v1.2.3 From b77eccf80139ed8de65c205f6f723ae827e82c07 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 08:19:11 +0000 Subject: patch [#33985] Added FModifierEnvelope control_point add remove to API from Peter Staples (batfinger) --- source/blender/blenkernel/BKE_fcurve.h | 3 + source/blender/blenkernel/intern/fmodifier.c | 86 +++++++++++++++++++ source/blender/editors/animation/fmodifier_ui.c | 83 +----------------- source/blender/makesrna/intern/rna_fcurve.c | 107 ++++++++++++++++++++++++ 4 files changed, 197 insertions(+), 82 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h index bf2f1262eee..6ce7b952b97 100644 --- a/source/blender/blenkernel/BKE_fcurve.h +++ b/source/blender/blenkernel/BKE_fcurve.h @@ -41,6 +41,7 @@ struct FModifier; struct ChannelDriver; struct DriverVar; struct DriverTarget; +struct FCM_EnvelopeData; struct bAction; struct BezTriple; @@ -181,6 +182,8 @@ void evaluate_value_fmodifiers(ListBase *modifiers, struct FCurve *fcu, float *c void fcurve_bake_modifiers(struct FCurve *fcu, int start, int end); +int BKE_fcm_envelope_find_index(struct FCM_EnvelopeData *array, float frame, int arraylen, short *exists); + /* ************** F-Curves API ******************** */ /* -------- Data Managemnt -------- */ diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c index 7b007af86d6..c3fc659137d 100644 --- a/source/blender/blenkernel/intern/fmodifier.c +++ b/source/blender/blenkernel/intern/fmodifier.c @@ -480,6 +480,92 @@ static FModifierTypeInfo FMI_ENVELOPE = { fcm_envelope_evaluate /* evaluate */ }; +/* exported function for finding points */ + +/* Binary search algorithm for finding where to insert Envelope Data Point. + * Returns the index to insert at (data already at that index will be offset if replace is 0) + */ +#define BINARYSEARCH_FRAMEEQ_THRESH 0.0001f + +int BKE_fcm_envelope_find_index(FCM_EnvelopeData array[], float frame, int arraylen, short *exists) +{ + int start = 0, end = arraylen; + int loopbreaker = 0, maxloop = arraylen * 2; + + /* initialize exists-flag first */ + *exists = 0; + + /* sneaky optimizations (don't go through searching process if...): + * - keyframe to be added is to be added out of current bounds + * - keyframe to be added would replace one of the existing ones on bounds + */ + if ((arraylen <= 0) || (array == NULL)) { + printf("Warning: binarysearch_fcm_envelopedata_index() encountered invalid array\n"); + return 0; + } + else { + /* check whether to add before/after/on */ + float framenum; + + /* 'First' Point (when only one point, this case is used) */ + framenum = array[0].time; + if (IS_EQT(frame, framenum, BINARYSEARCH_FRAMEEQ_THRESH)) { + *exists = 1; + return 0; + } + else if (frame < framenum) { + return 0; + } + + /* 'Last' Point */ + framenum = array[(arraylen - 1)].time; + if (IS_EQT(frame, framenum, BINARYSEARCH_FRAMEEQ_THRESH)) { + *exists = 1; + return (arraylen - 1); + } + else if (frame > framenum) { + return arraylen; + } + } + + + /* most of the time, this loop is just to find where to put it + * - 'loopbreaker' is just here to prevent infinite loops + */ + for (loopbreaker = 0; (start <= end) && (loopbreaker < maxloop); loopbreaker++) { + /* compute and get midpoint */ + int mid = start + ((end - start) / 2); /* we calculate the midpoint this way to avoid int overflows... */ + float midfra = array[mid].time; + + /* check if exactly equal to midpoint */ + if (IS_EQT(frame, midfra, BINARYSEARCH_FRAMEEQ_THRESH)) { + *exists = 1; + return mid; + } + + /* repeat in upper/lower half */ + if (frame > midfra) { + start = mid + 1; + } + else if (frame < midfra) { + end = mid - 1; + } + } + + /* print error if loop-limit exceeded */ + if (loopbreaker == (maxloop - 1)) { + printf("Error: binarysearch_fcm_envelopedata_index() was taking too long\n"); + + // include debug info + printf("\tround = %d: start = %d, end = %d, arraylen = %d\n", loopbreaker, start, end, arraylen); + } + + /* not found, so return where to place it */ + return start; +} +#undef BINARYSEARCH_FRAMEEQ_THRESH + + /* Cycles F-Curve Modifier --------------------------- */ /* This modifier changes evaltime to something that exists within the curve's frame-range, diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c index 6bd774e084a..cc2366affe6 100644 --- a/source/blender/editors/animation/fmodifier_ui.c +++ b/source/blender/editors/animation/fmodifier_ui.c @@ -327,88 +327,7 @@ static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short uiItemR(col, &ptr, "depth", 0, NULL, ICON_NONE); } -/* --------------- */ - -#define BINARYSEARCH_FRAMEEQ_THRESH 0.0001f - -/* Binary search algorithm for finding where to insert Envelope Data Point. - * Returns the index to insert at (data already at that index will be offset if replace is 0) - */ -static int binarysearch_fcm_envelopedata_index(FCM_EnvelopeData array[], float frame, int arraylen, short *exists) -{ - int start = 0, end = arraylen; - int loopbreaker = 0, maxloop = arraylen * 2; - - /* initialize exists-flag first */ - *exists = 0; - - /* sneaky optimizations (don't go through searching process if...): - * - keyframe to be added is to be added out of current bounds - * - keyframe to be added would replace one of the existing ones on bounds - */ - if ((arraylen <= 0) || (array == NULL)) { - printf("Warning: binarysearch_fcm_envelopedata_index() encountered invalid array\n"); - return 0; - } - else { - /* check whether to add before/after/on */ - float framenum; - - /* 'First' Point (when only one point, this case is used) */ - framenum = array[0].time; - if (IS_EQT(frame, framenum, BINARYSEARCH_FRAMEEQ_THRESH)) { - *exists = 1; - return 0; - } - else if (frame < framenum) - return 0; - - /* 'Last' Point */ - framenum = array[(arraylen - 1)].time; - if (IS_EQT(frame, framenum, BINARYSEARCH_FRAMEEQ_THRESH)) { - *exists = 1; - return (arraylen - 1); - } - else if (frame > framenum) - return arraylen; - } - - - /* most of the time, this loop is just to find where to put it - * - 'loopbreaker' is just here to prevent infinite loops - */ - for (loopbreaker = 0; (start <= end) && (loopbreaker < maxloop); loopbreaker++) { - /* compute and get midpoint */ - int mid = start + ((end - start) / 2); /* we calculate the midpoint this way to avoid int overflows... */ - float midfra = array[mid].time; - - /* check if exactly equal to midpoint */ - if (IS_EQT(frame, midfra, BINARYSEARCH_FRAMEEQ_THRESH)) { - *exists = 1; - return mid; - } - - /* repeat in upper/lower half */ - if (frame > midfra) - start = mid + 1; - else if (frame < midfra) - end = mid - 1; - } - - /* print error if loop-limit exceeded */ - if (loopbreaker == (maxloop - 1)) { - printf("Error: binarysearch_fcm_envelopedata_index() was taking too long\n"); - - // include debug info - printf("\tround = %d: start = %d, end = %d, arraylen = %d\n", loopbreaker, start, end, arraylen); - } - - /* not found, so return where to place it */ - return start; -} - /* callback to add new envelope data point */ -// TODO: should we have a separate file for things like this? static void fmod_envelope_addpoint_cb(bContext *C, void *fcm_dv, void *UNUSED(arg)) { Scene *scene = CTX_data_scene(C); @@ -425,7 +344,7 @@ static void fmod_envelope_addpoint_cb(bContext *C, void *fcm_dv, void *UNUSED(ar /* check that no data exists for the current frame... */ if (env->data) { short exists = -1; - int i = binarysearch_fcm_envelopedata_index(env->data, (float)(scene->r.cfra), env->totvert, &exists); + int i = BKE_fcm_envelope_find_index(env->data, (float)(scene->r.cfra), env->totvert, &exists); /* binarysearch_...() will set exists by default to 0, so if it is non-zero, that means that the point exists already */ if (exists) diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index 4250acf5848..d5fa9ca9a47 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -633,6 +633,82 @@ static void rna_fcurve_range(FCurve *fcu, float range[2]) calc_fcurve_range(fcu, range, range + 1, FALSE, FALSE); } + +static FCM_EnvelopeData *rna_FModifierEnvelope_points_add(FModifier *fmod, ReportList *reports, float frame) +{ + FCM_EnvelopeData fed; + FMod_Envelope *env = (FMod_Envelope *)fmod->data; + + /* init template data */ + fed.min = -1.0f; + fed.max = 1.0f; + fed.time = frame; + fed.f1 = fed.f2 = 0; + int i; + + if (env->data) { + /* add point to end of control points */ + short exists = -1; + i = BKE_fcm_envelope_find_index(env->data, frame, env->totvert, &exists); + if (exists) { + BKE_reportf(reports, RPT_ERROR, "Already a control point at frame %.6f", frame); + return NULL; + } + + /* realloc memory for extra point */ + env->data = (FCM_EnvelopeData *) MEM_reallocN((void *)env->data, (env->totvert + 1) * sizeof(FCM_EnvelopeData)); + + /* move the points after the added point */ + if (i < env->totvert) { + memmove(env->data + i + 1, env->data + i, (env->totvert - i) * sizeof(FCM_EnvelopeData)); + } + + env->totvert++; + } + else { + env->data = MEM_mallocN(sizeof(FCM_EnvelopeData), "FCM_EnvelopeData"); + env->totvert = 1; + i = 0; + } + + /* add point to paste at index i */ + *(env->data + i) = fed; + return (env->data + i); +} + +void rna_FModifierEnvelope_points_remove(FModifier *fmod, ReportList *reports, PointerRNA *point) +{ + FCM_EnvelopeData *cp = point->data; + FMod_Envelope *env = (FMod_Envelope *)fmod->data; + + int index = (int)(cp - env->data); + + /* test point is in range */ + if (index < 0 || index >= env->totvert) { + BKE_report(reports, RPT_ERROR, "Control Point not in FEnvelopeModifier"); + return; + } + + if (env->totvert > 1) { + /* move data after the removed point */ + + memmove(env->data + index, env->data + (index + 1), sizeof(FCM_EnvelopeData) * ((env->totvert - index) - 1)); + + /* realloc smaller array */ + env->totvert--; + env->data = (FCM_EnvelopeData *) MEM_reallocN((void *)env->data, (env->totvert) * sizeof(FCM_EnvelopeData)); + } + else { + /* just free array, since the only vert was deleted */ + if (env->data) { + MEM_freeN(env->data); + env->data = NULL; + } + env->totvert = 0; + } + RNA_POINTER_INVALIDATE(point); +} + #else static void rna_def_fmodifier_generator(BlenderRNA *brna) @@ -770,6 +846,36 @@ static void rna_def_fmodifier_envelope_ctrl(BlenderRNA *brna) /* - selection flags (not implemented in UI yet though) */ } +static void rna_def_fmodifier_envelope_control_points(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "FModifierEnvelopeControlPoints"); + srna = RNA_def_struct(brna, "FModifierEnvelopeControlPoints", NULL); + RNA_def_struct_sdna(srna, "FModifier"); + + RNA_def_struct_ui_text(srna, "Control Points", "Control points defining the shape of the envelope"); + + func = RNA_def_function(srna, "add", "rna_FModifierEnvelope_points_add"); + RNA_def_function_ui_description(func, "Add a control point to a FModifierEnvelope"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_float(func, "frame", 0.0f, -FLT_MAX, FLT_MAX, "", + "Frame to add this control-point", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm = RNA_def_pointer(func, "point", "FModifierEnvelopeControlPoint", "", "Newly created control-point"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "remove", "rna_FModifierEnvelope_points_remove"); + RNA_def_function_ui_description(func, "Remove a control-point from an FModifierEnvelope"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer(func, "point", "FModifierEnvelopeControlPoint", "", "Control-point to remove"); + RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR); +} + + static void rna_def_fmodifier_envelope(BlenderRNA *brna) { StructRNA *srna; @@ -784,6 +890,7 @@ static void rna_def_fmodifier_envelope(BlenderRNA *brna) RNA_def_property_collection_sdna(prop, NULL, "data", "totvert"); RNA_def_property_struct_type(prop, "FModifierEnvelopeControlPoint"); RNA_def_property_ui_text(prop, "Control Points", "Control points defining the shape of the envelope"); + rna_def_fmodifier_envelope_control_points(brna, prop); /* Range Settings */ prop = RNA_def_property(srna, "reference_value", PROP_FLOAT, PROP_NONE); -- cgit v1.2.3 From baf29d883e4a22169890b1883e81090ec4c01277 Mon Sep 17 00:00:00 2001 From: Miika Hamalainen Date: Thu, 31 Jan 2013 08:55:00 +0000 Subject: Fix msvc compile --- source/blender/makesrna/intern/rna_fcurve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index d5fa9ca9a47..fbc91012a35 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -638,13 +638,13 @@ static FCM_EnvelopeData *rna_FModifierEnvelope_points_add(FModifier *fmod, Repor { FCM_EnvelopeData fed; FMod_Envelope *env = (FMod_Envelope *)fmod->data; + int i; /* init template data */ fed.min = -1.0f; fed.max = 1.0f; fed.time = frame; fed.f1 = fed.f2 = 0; - int i; if (env->data) { /* add point to end of control points */ -- cgit v1.2.3 From 4d2efa877e305fc29121030120b7c53ae57950c4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 09:53:34 +0000 Subject: start window non-maximized since this is more the `default` state for windows. (linux/win only) --- source/blender/windowmanager/intern/wm_window.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index bd6342ebc25..83eadf6e833 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -448,14 +448,8 @@ void wm_window_add_ghostwindows(wmWindowManager *wm) win->sizex = wm_init_state.size_x; win->sizey = wm_init_state.size_y; - if (wm_init_state.override_flag & WIN_OVERRIDE_GEOM) { - /* we can't properly resize a maximized window */ - win->windowstate = GHOST_kWindowStateNormal; - } - else { - /* otherwise default factory settings start maximized */ - win->windowstate = GHOST_kWindowStateMaximized; - } + /* we can't properly resize a maximized window */ + win->windowstate = GHOST_kWindowStateNormal; wm_init_state.override_flag &= ~WIN_OVERRIDE_GEOM; } -- cgit v1.2.3 From 73f301c3a8a28dd25ea850a54d968fc6c4f2b83e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 10:42:26 +0000 Subject: add ghost function getAllDisplayDimensions, GHOST_GetAllDisplayDimensions This returns the desktop size, not just the size of the active monitor, useful since this constrains the mouse and we dont have to detect the active monitor (which isn't so straightforward with xlib). carbon/cocoa are TODO, they still use getMainDisplayDimensions(). --- source/blender/windowmanager/intern/wm_window.c | 13 ++++++++++++- source/blender/windowmanager/wm_window.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 83eadf6e833..a5f30fc5c62 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -114,6 +114,17 @@ void wm_get_screensize(int *width_r, int *height_r) *height_r = uiheight; } +/* size of all screens, useful since the mouse is bound by this */ +void wm_get_screensize_all(int *width_r, int *height_r) +{ + unsigned int uiwidth; + unsigned int uiheight; + + GHOST_GetAllDisplayDimensions(g_system, &uiwidth, &uiheight); + *width_r = uiwidth; + *height_r = uiheight; +} + /* keeps offset and size within monitor bounds */ /* XXX solve dual screen... */ static void wm_window_check_position(rcti *rect) @@ -829,7 +840,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr GHOST_DisposeRectangle(client_rect); - wm_get_screensize(&scr_w, &scr_h); + wm_get_screensize_all(&scr_w, &scr_h); sizex = r - l; sizey = b - t; posx = l; diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h index ce360f5ef56..739ead27bdb 100644 --- a/source/blender/windowmanager/wm_window.h +++ b/source/blender/windowmanager/wm_window.h @@ -40,6 +40,7 @@ void wm_ghost_init (bContext *C); void wm_ghost_exit(void); void wm_get_screensize(int *width_r, int *height_r); +void wm_get_screensize_all(int *width_r, int *height_r); wmWindow *wm_window_new (bContext *C); void wm_window_free (bContext *C, wmWindowManager *wm, wmWindow *win); -- cgit v1.2.3 From dbf54dacf7e3fabe6ccb0e36a1743c91ac445b28 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 11:05:09 +0000 Subject: Add Xinerama support for GHOST_GetMainDisplayDimensions() so X11 works as it should (previously would include all monitors). Now the active monitor size is used on startup. Currently the cursor position is checked for intersection with the monitor bounds to find the active screen. --- source/blender/makesrna/intern/rna_fcurve.c | 1 - source/blender/windowmanager/intern/wm_window.c | 13 +++---------- 2 files changed, 3 insertions(+), 11 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index fbc91012a35..1b3c6ef70bb 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -647,7 +647,6 @@ static FCM_EnvelopeData *rna_FModifierEnvelope_points_add(FModifier *fmod, Repor fed.f1 = fed.f2 = 0; if (env->data) { - /* add point to end of control points */ short exists = -1; i = BKE_fcm_envelope_find_index(env->data, frame, env->totvert, &exists); if (exists) { diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index a5f30fc5c62..caf4e2bd1ac 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -436,18 +436,11 @@ void wm_window_add_ghostwindows(wmWindowManager *wm) wm_set_apple_prefsize(wm_init_state.size_x, wm_init_state.size_y); } #else - /* default size when un-maximized, unless the screen(s) are smaller */ - - /* clamp by these arbitrary values because currently wm_get_screensize() - * will span multiple monitors and using xinerama isnt totally reliable - * since we don't which monitor the window manager will put the blender - * window in. */ - wm_init_state.size_x = MIN2(1800, wm_init_state.size_x - 100); - wm_init_state.size_y = MIN2(980, wm_init_state.size_y - 100); - + /* note!, this isnt quite correct, active screen maybe offset 1000s if PX, + * we'd need a wm_get_screensize like function that gives offset, + * in practice the window manager will likely move to the correct monitor */ wm_init_state.start_x = 0; wm_init_state.start_y = 0; - #endif } -- cgit v1.2.3 From e6613389e76eedc9712576cce887e9492cfa523f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 11:10:43 +0000 Subject: write all crashlogs into the temp directory (not next to blend files). --- source/creator/creator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/creator/creator.c b/source/creator/creator.c index 624b1148072..d88498f3ff7 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -548,7 +548,8 @@ static void blender_crash_handler(int signum) BLI_make_file_string("/", fname, BLI_temporary_dir(), "blender.crash.txt"); } else { - BLI_strncpy(fname, G.main->name, sizeof(fname)); + const char *fname_base = BLI_path_basename(G.main->name); + BLI_make_file_string("/", fname, BLI_temporary_dir(), fname_base); BLI_replace_extension(fname, sizeof(fname), ".crash.txt"); } -- cgit v1.2.3 From 9c99bcd3685cc49768502074b8a7ba9572d2dbc4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 11:17:08 +0000 Subject: replace BLI_make_file_string with BLI_join_dirfile since its much more simple and does whats needed. --- source/creator/creator.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/creator/creator.c b/source/creator/creator.c index d88498f3ff7..b0022ffa118 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -545,11 +545,10 @@ static void blender_crash_handler(int signum) char fname[FILE_MAX]; if (!G.main->name[0]) { - BLI_make_file_string("/", fname, BLI_temporary_dir(), "blender.crash.txt"); + BLI_join_dirfile(fname, sizeof(fname), BLI_temporary_dir(), "blender.crash.txt"); } else { - const char *fname_base = BLI_path_basename(G.main->name); - BLI_make_file_string("/", fname, BLI_temporary_dir(), fname_base); + BLI_join_dirfile(fname, sizeof(fname), BLI_temporary_dir(), BLI_path_basename(G.main->name)); BLI_replace_extension(fname, sizeof(fname), ".crash.txt"); } -- cgit v1.2.3 From 7d3c6b27601e761b4aa4122a273bd9d308bff25d Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Thu, 31 Jan 2013 12:54:06 +0000 Subject: Fix bevel bug #33906, unwanted distortion with skewed meshes. The code for making a rounded profile edge at a vertex needed a special case for when that profile is on the third face (the one not touched by the beveled edge) when only one edge is beveled and the three faces are not orthogonal. --- source/blender/bmesh/tools/bmesh_bevel.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index 5461e5fe788..d82cd678787 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -1654,7 +1654,13 @@ static void build_vmesh(BevelParams *bp, BMesh *bm, BevVert *bv) if (v->ebev) { va = mesh_vert(vm, i, 0, 0)->co; vb = mesh_vert(vm, i, 0, ns)->co; - project_to_edge(v->ebev->e, va, vb, midco); + if (bv->edgecount == 3 && bv->selcount == 1) { + /* special case: profile cuts the third face, so line it up with that */ + copy_v3_v3(midco, bv->v->co); + } + else { + project_to_edge(v->ebev->e, va, vb, midco); + } for (k = 1; k < ns; k++) { get_point_on_round_edge(v->ebev, k, va, midco, vb, co); copy_v3_v3(mesh_vert(vm, i, 0, k)->co, co); -- cgit v1.2.3 From ba7e37c2b6ea87c08dac697257360edcea2ae8f4 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 Jan 2013 13:44:13 +0000 Subject: Fix #33874: active UV map chooser in uv editor should not have X button as you can't not have an active UV map. --- source/blender/editors/interface/interface_layout.c | 6 +++++- source/blender/makesrna/intern/rna_mesh.c | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 10375824518..487277ed0a9 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1393,7 +1393,11 @@ void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRN /* turn button into search button */ if (searchprop) { - but->type = SEARCH_MENU_UNLINK; + if(RNA_property_flag(prop) & PROP_NEVER_UNLINK) + but->type = SEARCH_MENU; + else + but->type = SEARCH_MENU_UNLINK; + but->hardmax = MAX2(but->hardmax, 256.0f); but->rnasearchpoin = *searchptr; but->rnasearchprop = searchprop; diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 025279b3836..4b4006f0012 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -2422,7 +2422,7 @@ static void rna_def_loop_colors(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_struct_type(prop, "MeshLoopColorLayer"); RNA_def_property_pointer_funcs(prop, "rna_Mesh_vertex_color_active_get", "rna_Mesh_vertex_color_active_set", NULL, NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK); RNA_def_property_ui_text(prop, "Active Vertex Color Layer", "Active vertex color layer"); RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); @@ -2450,7 +2450,7 @@ static void rna_def_uv_layers(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_struct_type(prop, "MeshUVLoopLayer"); RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_layer_active_get", "rna_Mesh_uv_layer_active_set", NULL, NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK); RNA_def_property_ui_text(prop, "Active UV loop layer", "Active UV loop layer"); RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); @@ -2600,7 +2600,7 @@ static void rna_def_uv_textures(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_struct_type(prop, "MeshTexturePolyLayer"); RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_active_get", "rna_Mesh_uv_texture_active_set", NULL, NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK); RNA_def_property_ui_text(prop, "Active UV Map", "Active UV Map"); RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); -- cgit v1.2.3 From 3a4c317b877c3c5c061808d2aa8a437fe30d5eee Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 31 Jan 2013 14:25:07 +0000 Subject: =?UTF-8?q?Fix=20UI=20translation=20partly=20missing=20in=20scons?= =?UTF-8?q?=20builds=20(reported=20by=20Leon=20Cheung=20and=20Gabriel=20Ga?= =?UTF-8?q?zz=C3=A1n=20on=20ML,=20and=20lockal=20on=20IRC,=20thanks).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The problem is that, when HAVE__BOOL is not defined (as it is the case in scons currently), BLI_utildefines.h defines bool as a standard type. Was using signed char, which makes eg "bool foo = 1024" be false (overflow)! Especially nasty when using bitflags (think we have been lucky to not have worse bugs because of that)! So changed fallback bool type to unsigned int. --- source/blender/blenlib/BLI_utildefines.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 43b1e7871cd..983fc421d46 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -45,7 +45,11 @@ # ifdef __cplusplus typedef bool _BLI_Bool; # else -# define _BLI_Bool signed char +/* using char here may cause nasty tricky bugs, e.g. + * bool do_translate = RNA_property_flag(prop) & PROP_STRING_PY_TRANSLATE; + * as PROP_STRING_PY_TRANSLATE is farther than 8th bit, do_translate would be always false! + */ +# define _BLI_Bool unsigned int # endif # else # define _BLI_Bool _Bool -- cgit v1.2.3 From a5cef69a0dc0b86d13d2fd16695db77094804c96 Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Thu, 31 Jan 2013 15:08:37 +0000 Subject: Apply patch [#33999] Wrapping mode for the "translate" compositing node this patch enables the translate node to wrap around the image borders. This is especially needed if the translate node is not used to position elements on a layer but when it is used instead for seamless backgrounds like mountains or clouds that should be repeated over time (by animating the x/y values). No trunk without docs! So here is my documentation: http://wiki.blender.org/index.php/User:Plasmasolutions/TranslateNodeExtension The code is properly documented and should be easy to read and understand. When there are any problems or issues, please comment, I'll tackle them right away! Greetings, Thomas Beck * optimized determination dependant areas * fixed some issues with scale node There are still some issues when scaling very small values (x=0.0001) - At Mind - --- .../blender/compositor/nodes/COM_TranslateNode.cpp | 7 +- .../operations/COM_TranslateOperation.cpp | 118 +++++++++++++++++++-- .../compositor/operations/COM_TranslateOperation.h | 7 ++ source/blender/editors/space_node/drawnode.c | 8 ++ source/blender/makesdna/DNA_node_types.h | 5 + source/blender/makesrna/intern/rna_nodetree.c | 22 ++++ .../blender/makesrna/intern/rna_nodetree_types.h | 2 +- .../composite/nodes/node_composite_translate.c | 8 ++ 8 files changed, 167 insertions(+), 10 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/nodes/COM_TranslateNode.cpp b/source/blender/compositor/nodes/COM_TranslateNode.cpp index c805f8f8baa..1d21b23fa74 100644 --- a/source/blender/compositor/nodes/COM_TranslateNode.cpp +++ b/source/blender/compositor/nodes/COM_TranslateNode.cpp @@ -37,10 +37,15 @@ void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContex InputSocket *inputYSocket = this->getInputSocket(2); OutputSocket *outputSocket = this->getOutputSocket(0); TranslateOperation *operation = new TranslateOperation(); - + + bNode *editorNode = this->getbNode(); + NodeTranslateData *data = (NodeTranslateData *)editorNode->storage; + operation->setWrapping(data->wrap_axis); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); inputXSocket->relinkConnections(operation->getInputSocket(1), 1, graph); inputYSocket->relinkConnections(operation->getInputSocket(2), 2, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } + diff --git a/source/blender/compositor/operations/COM_TranslateOperation.cpp b/source/blender/compositor/operations/COM_TranslateOperation.cpp index 761f55a1455..c34931471c7 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.cpp +++ b/source/blender/compositor/operations/COM_TranslateOperation.cpp @@ -15,9 +15,10 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * Contributor: - * Jeroen Bakker + * Contributor: + * Jeroen Bakker * Monique Dewanchand + * Thomas Beck (plasmasolutions.de) */ #include "COM_TranslateOperation.h" @@ -40,6 +41,12 @@ void TranslateOperation::initExecution() this->m_inputXOperation = this->getInputSocketReader(1); this->m_inputYOperation = this->getInputSocketReader(2); + ensureDelta(); + + //Calculate the relative offset once per execution, no need to do this per pixel + this->m_relativeOffsetX = fmodf(this->getDeltaX(), this->getWidth()); + this->m_relativeOffsetY = fmodf(this->getDeltaY(), this->getHeight()); + } void TranslateOperation::deinitExecution() @@ -53,18 +60,113 @@ void TranslateOperation::deinitExecution() void TranslateOperation::executePixel(float output[4], float x, float y, PixelSampler sampler) { ensureDelta(); - this->m_inputOperation->read(output, x - this->getDeltaX(), y - this->getDeltaY(), sampler); + + float originalXPos = x - this->getDeltaX(); + float originalYPos = y - this->getDeltaY(); + + switch(m_wrappingType) { + case 0: + //Intentionally empty, originalXPos and originalYPos have been set before + break; + case 1: + // wrap only on the x-axis + originalXPos = this->getWrappedOriginalXPos(x); + break; + case 2: + // wrap only on the y-axis + originalYPos = this->getWrappedOriginalYPos(y); + break; + case 3: + // wrap on both + originalXPos = this->getWrappedOriginalXPos(x); + originalYPos = this->getWrappedOriginalYPos(y); + break; + } + + this->m_inputOperation->read(output, originalXPos , originalYPos, sampler); + } bool TranslateOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { - ensureDelta(); rcti newInput; - - newInput.xmax = input->xmax - this->getDeltaX(); + + ensureDelta(); + newInput.xmin = input->xmin - this->getDeltaX(); - newInput.ymax = input->ymax - this->getDeltaY(); + newInput.xmax = input->xmax - this->getDeltaX(); newInput.ymin = input->ymin - this->getDeltaY(); - + newInput.ymax = input->ymax - this->getDeltaY(); + + if (m_wrappingType == 1 || m_wrappingType == 3){ + // wrap only on the x-axis if tile is wrapping + newInput.xmin = getWrappedOriginalXPos(input->xmin); + newInput.xmax = getWrappedOriginalXPos(input->xmax); + if(newInput.xmin > newInput.xmax){ + newInput.xmin = 0; + newInput.xmax = this->getWidth(); + } + } + if(m_wrappingType == 2 || m_wrappingType == 3) { + // wrap only on the y-axis if tile is wrapping + newInput.ymin = getWrappedOriginalYPos(input->ymin); + newInput.ymax = getWrappedOriginalYPos(input->ymax); + if (newInput.ymin > newInput.ymax){ + newInput.ymin = 0; + newInput.ymax = this->getHeight(); + } + } + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } + +void TranslateOperation::setWrapping(char wrapping_type) +{ + m_wrappingType = wrapping_type; +} + +float TranslateOperation::getWrappedOriginalXPos(float x) +{ + float originalXPos = 0; + + // Positive offset: Append image data from the left + if ( this->m_relativeOffsetX > 0 ) { + if ( x < this->m_relativeOffsetX ) + originalXPos = this->getWidth() - this->m_relativeOffsetX + x; + else + originalXPos = x - this->m_relativeOffsetX; + } else { + // Negative offset: Append image data from the right + if (x < (this->getWidth() + this->m_relativeOffsetX)) + originalXPos = x - this->m_relativeOffsetX; + else + originalXPos = x - (this->getWidth() + this->m_relativeOffsetX); + } + + while (originalXPos < 0) originalXPos += this->m_width; + return fmodf(originalXPos, this->getWidth()); +} + + +float TranslateOperation::getWrappedOriginalYPos(float y) +{ + float originalYPos = 0; + + // Positive offset: Append image data from the bottom + if ( this->m_relativeOffsetY > 0 ) { + if ( y < this->m_relativeOffsetY ) + originalYPos = this->getHeight()- this->m_relativeOffsetY + y; + else + originalYPos = y - this->m_relativeOffsetY; + } else { + // Negative offset: Append image data from the top + if (y < (this->getHeight() + this->m_relativeOffsetY)) + originalYPos = y - this->m_relativeOffsetY; + else + originalYPos = y - (this->getHeight() + this->m_relativeOffsetY); + } + + while (originalYPos < 0) originalYPos += this->m_height; + return fmodf(originalYPos, this->getHeight()); +} diff --git a/source/blender/compositor/operations/COM_TranslateOperation.h b/source/blender/compositor/operations/COM_TranslateOperation.h index faaadb1ced2..d93f09e2ab6 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.h +++ b/source/blender/compositor/operations/COM_TranslateOperation.h @@ -33,6 +33,9 @@ private: float m_deltaX; float m_deltaY; bool m_isDeltaSet; + float m_relativeOffsetX; + float m_relativeOffsetY; + char m_wrappingType; public: TranslateOperation(); bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); @@ -54,6 +57,10 @@ public: this->m_isDeltaSet = true; } } + + void setWrapping(char wrapping_type); + float getWrappedOriginalXPos(float x); + float getWrappedOriginalYPos(float y); }; #endif diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 1ec77bf58ed..d2bb51981de 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2379,6 +2379,11 @@ static void node_composit_buts_stabilize2d(uiLayout *layout, bContext *C, Pointe uiItemR(layout, ptr, "filter_type", 0, "", ICON_NONE); } +static void node_composit_buts_translate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "wrap_axis", 0, NULL, ICON_NONE); +} + static void node_composit_buts_transform(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { uiItemR(layout, ptr, "filter_type", 0, "", ICON_NONE); @@ -2931,6 +2936,9 @@ static void node_composit_set_butfunc(bNodeType *ntype) case CMP_NODE_TRANSFORM: ntype->uifunc = node_composit_buts_transform; break; + case CMP_NODE_TRANSLATE: + ntype->uifunc = node_composit_buts_translate; + break; case CMP_NODE_MOVIEDISTORTION: ntype->uifunc = node_composit_buts_moviedistortion; break; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index a05ff66e683..83d884be1cc 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -711,6 +711,11 @@ typedef struct NodeTrackPosData { char track_name[64]; } NodeTrackPosData; +typedef struct NodeTranslateData { + char wrap_axis, pad[7]; +} NodeTranslateData; + + typedef struct NodeShaderScript { int mode; int flag; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index fe5b6e15f44..f5e3867cfe4 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -4225,6 +4225,28 @@ static void def_cmp_trackpos(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } +static void def_cmp_translate(StructRNA *srna) +{ + static EnumPropertyItem translate_items[] = { + {0, "NONE", 0, "None", "No wrapping on x and y"}, + {1, "XAXIS", 0, "X-Axis", "Wrap all pixels on the x-Axis"}, + {2, "YAXIS", 0, "Y-Axis", "Wrap all pixels on the y-Axis"}, + {3, "BOTH", 0, "Both axes", "Wrap all pixels on the both axes"}, + {0, NULL, 0, NULL, NULL} + }; + + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeTranslateData", "storage"); + + prop = RNA_def_property(srna, "wrap_axis", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "wrap_axis"); + RNA_def_property_enum_items(prop, translate_items); + RNA_def_property_ui_text(prop, "Wrapping", "Wrap image on a specific axis"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); +} + + /* -- Texture Nodes --------------------------------------------------------- */ static void def_tex_output(StructRNA *srna) diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h index 46f2306f284..d6e0ce2f11a 100644 --- a/source/blender/makesrna/intern/rna_nodetree_types.h +++ b/source/blender/makesrna/intern/rna_nodetree_types.h @@ -127,7 +127,7 @@ DefNode( CompositorNode, CMP_NODE_R_LAYERS, def_cmp_render_layers, "R_LAY DefNode( CompositorNode, CMP_NODE_COMPOSITE, 0, "COMPOSITE", Composite, "Composite", "" ) DefNode( CompositorNode, CMP_NODE_OUTPUT_FILE, def_cmp_output_file, "OUTPUT_FILE", OutputFile, "File Output", "" ) DefNode( CompositorNode, CMP_NODE_TEXTURE, def_texture, "TEXTURE", Texture, "Texture", "" ) -DefNode( CompositorNode, CMP_NODE_TRANSLATE, 0, "TRANSLATE", Translate, "Translate", "" ) +DefNode( CompositorNode, CMP_NODE_TRANSLATE, def_cmp_translate, "TRANSLATE", Translate, "Translate", "" ) DefNode( CompositorNode, CMP_NODE_ZCOMBINE, def_cmp_zcombine, "ZCOMBINE", Zcombine, "Z Combine", "" ) DefNode( CompositorNode, CMP_NODE_COMBRGBA, 0, "COMBRGBA", CombRGBA, "Combine RGBA", "" ) DefNode( CompositorNode, CMP_NODE_DILATEERODE, def_cmp_dilate_erode, "DILATEERODE", DilateErode, "Dilate/Erode", "" ) diff --git a/source/blender/nodes/composite/nodes/node_composite_translate.c b/source/blender/nodes/composite/nodes/node_composite_translate.c index 7c7c6304d27..60b32563569 100644 --- a/source/blender/nodes/composite/nodes/node_composite_translate.c +++ b/source/blender/nodes/composite/nodes/node_composite_translate.c @@ -46,6 +46,12 @@ static bNodeSocketTemplate cmp_node_translate_out[] = { { -1, 0, "" } }; +static void node_composit_init_translate(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + NodeTranslateData *data = MEM_callocN(sizeof(NodeTranslateData), "node translate data"); + node->storage = data; +} + void register_node_type_cmp_translate(bNodeTreeType *ttype) { static bNodeType ntype; @@ -53,6 +59,8 @@ void register_node_type_cmp_translate(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_translate_in, cmp_node_translate_out); node_type_size(&ntype, 140, 100, 320); + node_type_init(&ntype, node_composit_init_translate); + node_type_storage(&ntype, "NodeTranslateData", node_free_standard_storage, node_copy_standard_storage); nodeRegisterType(ttype, &ntype); } -- cgit v1.2.3 From 757546036c0c67e2c345547a68d95e17d7e1a0ac Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 Jan 2013 15:31:47 +0000 Subject: Cycles: disable unnecessary preview render job for per node previews, they don't work so was just wasting CPU time. --- source/blender/editors/render/render_preview.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source') diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index 16ebaf58a59..994c7275ecd 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -1100,6 +1100,10 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M ShaderPreview *sp; Scene *scene = CTX_data_scene(C); + /* node previews not supported for cycles */ + if (BKE_scene_use_new_shading_nodes(scene) && method == PR_NODE_RENDER) + return; + wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Shader Preview", WM_JOB_EXCL_RENDER, WM_JOB_TYPE_RENDER_PREVIEW); sp = MEM_callocN(sizeof(ShaderPreview), "shader preview"); -- cgit v1.2.3 From 7b6e78e48a63952a699b2af346d7ac6a131b15ad Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 Jan 2013 16:19:44 +0000 Subject: Fix #34034: keyframe display of color/curve buttons was broken after revision 53132 which changed the RNA index to -1 for these. Also made it so that these buttons no longer display "Insert Single Keyframe" and only "Insert Keyframe" as you can't edit individual components here so it's only confusing. --- source/blender/editors/interface/interface_anim.c | 15 ++++++++- .../blender/editors/interface/interface_handlers.c | 38 ++++++++++++---------- 2 files changed, 34 insertions(+), 19 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 5d62ef768d2..0fc99fbfbe1 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -57,7 +57,11 @@ static FCurve *ui_but_get_fcurve(uiBut *but, bAction **action, int *driven) { - return rna_get_fcurve(&but->rnapoin, but->rnaprop, but->rnaindex, action, driven); + /* for entire array buttons we check the first component, it's not perfect + * but works well enough in typical cases */ + int rnaindex = (but->rnaindex == -1)? 0: but->rnaindex; + + return rna_get_fcurve(&but->rnapoin, but->rnaprop, rnaindex, action, driven); } void ui_but_anim_flag(uiBut *but, float cfra) @@ -131,6 +135,7 @@ int ui_but_anim_expression_create(uiBut *but, const char *str) ID *id; FCurve *fcu; char *path; + int rnaindex; short ok = 0; /* button must have RNA-pointer to a numeric-capable property */ @@ -140,6 +145,14 @@ int ui_but_anim_expression_create(uiBut *but, const char *str) return 0; } + if (RNA_property_array_length(&but->rnapoin, but->rnaprop) != 0) { + if (but->rnaindex == -1) { + if (G.debug & G_DEBUG) + printf("ERROR: create expression failed - can't create expression for entire array\n"); + return 0; + } + } + /* make sure we have animdata for this */ /* FIXME: until materials can be handled by depsgraph, don't allow drivers to be created for them */ id = (ID *)but->rnapoin.id.data; diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 5fa894a3605..66deb0c5bce 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -4752,7 +4752,7 @@ static int ui_but_menu(bContext *C, uiBut *but) { uiPopupMenu *pup; uiLayout *layout; - int length; + bool is_array, is_array_component; const char *name; uiStringInfo label = {BUT_GET_LABEL, NULL}; @@ -4779,12 +4779,14 @@ static int ui_but_menu(bContext *C, uiBut *but) if (is_anim) is_anim = RNA_property_path_from_ID_check(&but->rnapoin, but->rnaprop); - length = RNA_property_array_length(&but->rnapoin, but->rnaprop); + /* determine if we can key a single component of an array */ + is_array = RNA_property_array_length(&but->rnapoin, but->rnaprop) != 0; + is_array_component = (is_array && but->rnaindex != -1); /* Keyframes */ if (but->flag & UI_BUT_ANIMATED_KEY) { /* replace/delete keyfraemes */ - if (length) { + if (is_array_component) { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Replace Keyframes"), ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1); uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Replace Single Keyframe"), @@ -4796,9 +4798,9 @@ static int ui_but_menu(bContext *C, uiBut *but) } else { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Replace Keyframe"), - ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); + ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1); uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Keyframe"), - ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 0); + ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 1); } /* keyframe settings */ @@ -4810,7 +4812,7 @@ static int ui_but_menu(bContext *C, uiBut *but) /* pass */ } else if (is_anim) { - if (length) { + if (is_array_component) { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Insert Keyframes"), ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1); uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Insert Single Keyframe"), @@ -4818,12 +4820,12 @@ static int ui_but_menu(bContext *C, uiBut *but) } else { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Insert Keyframe"), - ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); + ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1); } } if (but->flag & UI_BUT_ANIMATED) { - if (length) { + if (is_array_component) { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Clear Keyframes"), ICON_NONE, "ANIM_OT_keyframe_clear_button", "all", 1); uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Clear Single Keyframes"), @@ -4831,7 +4833,7 @@ static int ui_but_menu(bContext *C, uiBut *but) } else { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Clear Keyframes"), - ICON_NONE, "ANIM_OT_keyframe_clear_button", "all", 0); + ICON_NONE, "ANIM_OT_keyframe_clear_button", "all", 1); } } @@ -4839,7 +4841,7 @@ static int ui_but_menu(bContext *C, uiBut *but) if (but->flag & UI_BUT_DRIVEN) { uiItemS(layout); - if (length) { + if (is_array_component) { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Drivers"), ICON_NONE, "ANIM_OT_driver_button_remove", "all", 1); uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Single Driver"), @@ -4847,7 +4849,7 @@ static int ui_but_menu(bContext *C, uiBut *but) } else { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Driver"), - ICON_NONE, "ANIM_OT_driver_button_remove", "all", 0); + ICON_NONE, "ANIM_OT_driver_button_remove", "all", 1); } uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Copy Driver"), @@ -4863,7 +4865,7 @@ static int ui_but_menu(bContext *C, uiBut *but) else if (is_anim) { uiItemS(layout); - if (length) { + if (is_array_component) { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Drivers"), ICON_NONE, "ANIM_OT_driver_button_add", "all", 1); uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Single Driver"), @@ -4871,7 +4873,7 @@ static int ui_but_menu(bContext *C, uiBut *but) } else { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Driver"), - ICON_NONE, "ANIM_OT_driver_button_add", "all", 0); + ICON_NONE, "ANIM_OT_driver_button_add", "all", 1); } if (ANIM_driver_can_paste()) { @@ -4885,7 +4887,7 @@ static int ui_but_menu(bContext *C, uiBut *but) if (is_anim) { uiItemS(layout); - if (length) { + if (is_array_component) { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add All to Keying Set"), ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 1); uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Single to Keying Set"), @@ -4895,7 +4897,7 @@ static int ui_but_menu(bContext *C, uiBut *but) } else { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add to Keying Set"), - ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 0); + ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 1); uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Remove from Keying Set"), ICON_NONE, "ANIM_OT_keyingset_button_remove"); } @@ -4908,15 +4910,15 @@ static int ui_but_menu(bContext *C, uiBut *but) /* Copy Property Value * Paste Property Value */ - if (length) { + if (is_array_component) { uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset All to Default Values"), ICON_NONE, "UI_OT_reset_default_button", "all", 1); uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset Single to Default Value"), ICON_NONE, "UI_OT_reset_default_button", "all", 0); } else { - uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset to Default Value"), - ICON_NONE, "UI_OT_reset_default_button"); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset to Default Value"), + ICON_NONE, "UI_OT_reset_default_button", "all", 1); } uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Copy Data Path"), -- cgit v1.2.3 From a9015e3f7da9c4885fe6d73841037fcce8cc48cd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 21:15:38 +0000 Subject: style cleanup --- .../operations/COM_TranslateOperation.cpp | 52 +++++++++++++--------- .../blender/editors/interface/interface_layout.c | 2 +- source/blender/makesdna/DNA_node_types.h | 2 +- 3 files changed, 33 insertions(+), 23 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/operations/COM_TranslateOperation.cpp b/source/blender/compositor/operations/COM_TranslateOperation.cpp index c34931471c7..253c5df8f9d 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.cpp +++ b/source/blender/compositor/operations/COM_TranslateOperation.cpp @@ -64,7 +64,7 @@ void TranslateOperation::executePixel(float output[4], float x, float y, PixelSa float originalXPos = x - this->getDeltaX(); float originalYPos = y - this->getDeltaY(); - switch(m_wrappingType) { + switch (m_wrappingType) { case 0: //Intentionally empty, originalXPos and originalYPos have been set before break; @@ -83,7 +83,7 @@ void TranslateOperation::executePixel(float output[4], float x, float y, PixelSa break; } - this->m_inputOperation->read(output, originalXPos , originalYPos, sampler); + this->m_inputOperation->read(output, originalXPos, originalYPos, sampler); } @@ -98,20 +98,20 @@ bool TranslateOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe newInput.ymin = input->ymin - this->getDeltaY(); newInput.ymax = input->ymax - this->getDeltaY(); - if (m_wrappingType == 1 || m_wrappingType == 3){ + if (m_wrappingType == 1 || m_wrappingType == 3) { // wrap only on the x-axis if tile is wrapping newInput.xmin = getWrappedOriginalXPos(input->xmin); newInput.xmax = getWrappedOriginalXPos(input->xmax); - if(newInput.xmin > newInput.xmax){ + if (newInput.xmin > newInput.xmax) { newInput.xmin = 0; newInput.xmax = this->getWidth(); } } - if(m_wrappingType == 2 || m_wrappingType == 3) { + if (m_wrappingType == 2 || m_wrappingType == 3) { // wrap only on the y-axis if tile is wrapping newInput.ymin = getWrappedOriginalYPos(input->ymin); newInput.ymax = getWrappedOriginalYPos(input->ymax); - if (newInput.ymin > newInput.ymax){ + if (newInput.ymin > newInput.ymax) { newInput.ymin = 0; newInput.ymax = this->getHeight(); } @@ -131,17 +131,22 @@ float TranslateOperation::getWrappedOriginalXPos(float x) float originalXPos = 0; // Positive offset: Append image data from the left - if ( this->m_relativeOffsetX > 0 ) { - if ( x < this->m_relativeOffsetX ) + if (this->m_relativeOffsetX > 0) { + if (x < this->m_relativeOffsetX) { originalXPos = this->getWidth() - this->m_relativeOffsetX + x; - else - originalXPos = x - this->m_relativeOffsetX; - } else { + } + else { + originalXPos = x - this->m_relativeOffsetX; + } + } + else { // Negative offset: Append image data from the right - if (x < (this->getWidth() + this->m_relativeOffsetX)) + if (x < (this->getWidth() + this->m_relativeOffsetX)) { originalXPos = x - this->m_relativeOffsetX; - else + } + else { originalXPos = x - (this->getWidth() + this->m_relativeOffsetX); + } } while (originalXPos < 0) originalXPos += this->m_width; @@ -154,17 +159,22 @@ float TranslateOperation::getWrappedOriginalYPos(float y) float originalYPos = 0; // Positive offset: Append image data from the bottom - if ( this->m_relativeOffsetY > 0 ) { - if ( y < this->m_relativeOffsetY ) - originalYPos = this->getHeight()- this->m_relativeOffsetY + y; - else - originalYPos = y - this->m_relativeOffsetY; - } else { + if (this->m_relativeOffsetY > 0) { + if (y < this->m_relativeOffsetY) { + originalYPos = this->getHeight() - this->m_relativeOffsetY + y; + } + else { + originalYPos = y - this->m_relativeOffsetY; + } + } + else { // Negative offset: Append image data from the top - if (y < (this->getHeight() + this->m_relativeOffsetY)) + if (y < (this->getHeight() + this->m_relativeOffsetY)) { originalYPos = y - this->m_relativeOffsetY; - else + } + else { originalYPos = y - (this->getHeight() + this->m_relativeOffsetY); + } } while (originalYPos < 0) originalYPos += this->m_height; diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 487277ed0a9..3b764d5bdef 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1393,7 +1393,7 @@ void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRN /* turn button into search button */ if (searchprop) { - if(RNA_property_flag(prop) & PROP_NEVER_UNLINK) + if (RNA_property_flag(prop) & PROP_NEVER_UNLINK) but->type = SEARCH_MENU; else but->type = SEARCH_MENU_UNLINK; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 83d884be1cc..376d775f719 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -712,7 +712,7 @@ typedef struct NodeTrackPosData { } NodeTrackPosData; typedef struct NodeTranslateData { - char wrap_axis, pad[7]; + char wrap_axis, pad[7]; } NodeTranslateData; -- cgit v1.2.3 From 2007d57fdc10fd26f063303634b6eb0768eab58e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 21:56:14 +0000 Subject: ui_but_anim_expression_create was never returning true, even when it succeeded. --- source/blender/editors/interface/interface_anim.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 0fc99fbfbe1..3a4a6442fd6 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -135,8 +135,7 @@ int ui_but_anim_expression_create(uiBut *but, const char *str) ID *id; FCurve *fcu; char *path; - int rnaindex; - short ok = 0; + bool ok = false; /* button must have RNA-pointer to a numeric-capable property */ if (ELEM(NULL, but->rnapoin.data, but->rnaprop)) { @@ -181,6 +180,7 @@ int ui_but_anim_expression_create(uiBut *but, const char *str) /* updates */ driver->flag |= DRIVER_FLAG_RECOMPILE; WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME, NULL); + ok = true; } } -- cgit v1.2.3 From c734808fb0422339341a3567bea90498b4046e9d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 22:18:37 +0000 Subject: fix error with flipped vertex slide failing, also fix bug where you could be flipped and in proportional vertex slide mode. --- source/blender/editors/transform/transform.c | 30 ++++++++++------------ source/blender/editors/transform/transform.h | 3 ++- source/blender/editors/transform/transform_input.c | 12 ++++++++- 3 files changed, 26 insertions(+), 19 deletions(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 114a8c7a06c..f6c9c27dd76 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -5625,7 +5625,7 @@ void initEdgeSlide(TransInfo *t) /* set custom point first if you want value to be initialized by init */ setCustomPoints(t, &t->mouse, sld->end, sld->start); - initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO); + initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO_FLIP); t->idx_max = 0; t->num.idx_max = 0; @@ -5876,19 +5876,14 @@ static void calcVertSlideCustomPoints(struct TransInfo *t) TransDataVertSlideVert *sv = &sld->sv[sld->curr_sv_index]; float *co_orig = sv->co_orig_2d; float *co_curr = sv->co_link_orig_2d[sv->co_link_curr]; - float co_curr_flip[2]; - - flip_v2_v2v2(co_curr_flip, co_orig, co_curr); + const int start[2] = {co_orig[0], co_orig[1]}; + const int end[2] = {co_curr[0], co_curr[1]}; - { - const int start[2] = {co_orig[0], co_orig[1]}; - const int end[2] = {co_curr_flip[0], co_curr_flip[1]}; - if (!sld->flipped_vtx) { - setCustomPoints(t, &t->mouse, end, start); - } - else { - setCustomPoints(t, &t->mouse, start, end); - } + if (sld->flipped_vtx && sld->is_proportional == false) { + setCustomPoints(t, &t->mouse, start, end); + } + else { + setCustomPoints(t, &t->mouse, end, start); } } @@ -6144,16 +6139,17 @@ int handleEventVertSlide(struct TransInfo *t, struct wmEvent *event) case EKEY: if (event->val == KM_PRESS) { sld->is_proportional = !sld->is_proportional; + if (sld->flipped_vtx) { + calcVertSlideCustomPoints(t); + } return 1; } break; case FKEY: { if (event->val == KM_PRESS) { - if (sld->is_proportional == FALSE) { - sld->flipped_vtx = !sld->flipped_vtx; - calcVertSlideCustomPoints(t); - } + sld->flipped_vtx = !sld->flipped_vtx; + calcVertSlideCustomPoints(t); return 1; } break; diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index c72c6a83d82..a27fe91c3c3 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -677,7 +677,8 @@ typedef enum { INPUT_HORIZONTAL_ABSOLUTE, INPUT_VERTICAL_RATIO, INPUT_VERTICAL_ABSOLUTE, - INPUT_CUSTOM_RATIO + INPUT_CUSTOM_RATIO, + INPUT_CUSTOM_RATIO_FLIP } MouseInputMode; void initMouseInput(TransInfo *t, MouseInput *mi, const int center[2], const int mval[2]); diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index c805dfe1b41..2e34de6c568 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -180,7 +180,7 @@ void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, const int start[2], c data[3] = end[1]; } -static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, const int mval[2], float output[3]) +static void InputCustomRatioFlip(TransInfo *UNUSED(t), MouseInput *mi, const int mval[2], float output[3]) { double length; double distance; @@ -213,6 +213,12 @@ static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, const int mva } } +static void InputCustomRatio(TransInfo *t, MouseInput *mi, const int mval[2], float output[3]) +{ + InputCustomRatioFlip(t, mi, mval, output); + output[0] = -output[0]; +} + static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, const int mval[2], float output[3]) { double dx2 = mval[0] - mi->center[0]; @@ -358,6 +364,10 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode) mi->apply = InputCustomRatio; t->helpline = HLP_NONE; break; + case INPUT_CUSTOM_RATIO_FLIP: + mi->apply = InputCustomRatioFlip; + t->helpline = HLP_NONE; + break; case INPUT_NONE: default: mi->apply = NULL; -- cgit v1.2.3 From 63419193546b677103345a6543f8f99c4192293f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Feb 2013 01:01:20 +0000 Subject: code cleanup: make wmEvent's 'const' in interface code (reduces manual checking that they are not modified). --- .../blender/editors/interface/interface_handlers.c | 82 +++++++++++----------- .../blender/editors/interface/interface_intern.h | 8 +-- source/blender/editors/interface/interface_panel.c | 6 +- .../blender/editors/interface/interface_regions.c | 4 +- source/blender/windowmanager/WM_api.h | 4 +- source/blender/windowmanager/WM_types.h | 2 +- 6 files changed, 53 insertions(+), 53 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 66deb0c5bce..54d7493e516 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -214,14 +214,14 @@ typedef struct uiAfterFunc { static int ui_but_contains_pt(uiBut *but, int mx, int my); static int ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y); static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState state); -static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata); +static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *userdata); static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiButtonActivateType type); static void button_timers_tooltip_remove(bContext *C, uiBut *but); /* ******************** menu navigation helpers ************** */ /* assumes event type is MOUSEPAN */ -void ui_pan_to_scroll(wmEvent *event, int *type, int *val) +void ui_pan_to_scroll(const wmEvent *event, int *type, int *val) { static int lastdy = 0; int dy = event->prevy - event->y; @@ -721,7 +721,7 @@ static void ui_apply_but_CHARTAB(bContext *C, uiBut *but, uiHandleButtonData *da /* ****************** drag drop code *********************** */ -static int ui_but_mouse_inside_icon(uiBut *but, ARegion *ar, wmEvent *event) +static int ui_but_mouse_inside_icon(uiBut *but, ARegion *ar, const wmEvent *event) { rcti rect; int x = event->x, y = event->y; @@ -745,7 +745,7 @@ static int ui_but_mouse_inside_icon(uiBut *but, ARegion *ar, wmEvent *event) return BLI_rcti_isect_pt(&rect, x, y); } -static int ui_but_start_drag(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_but_start_drag(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { /* prevent other WM gestures to start while we try to drag */ WM_gestures_remove(C); @@ -1162,7 +1162,7 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut /* ******************* drop event ******************** */ /* only call if event type is EVT_DROP */ -static void ui_but_drop(bContext *C, wmEvent *event, uiBut *but, uiHandleButtonData *data) +static void ui_but_drop(bContext *C, const wmEvent *event, uiBut *but, uiHandleButtonData *data) { wmDrag *wmd; ListBase *drags = event->customdata; /* drop event type has listbase customdata by default */ @@ -1911,7 +1911,7 @@ static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa } -static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my, changed = 0, inbox = 0, update = 0, retval = WM_UI_HANDLER_CONTINUE; @@ -2103,7 +2103,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle ED_region_tag_redraw(data->region); } -static void ui_do_but_textedit_select(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static void ui_do_but_textedit_select(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my, retval = WM_UI_HANDLER_CONTINUE; @@ -2292,7 +2292,7 @@ int ui_button_open_menu_direction(uiBut *but) /* ***************** events for different button types *************** */ -static int ui_do_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { if (data->state == BUTTON_STATE_HIGHLIGHT) { if (event->type == LEFTMOUSE && event->val == KM_PRESS) { @@ -2320,7 +2320,7 @@ static int ui_do_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEv return WM_UI_HANDLER_CONTINUE; } -static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { if (data->state == BUTTON_STATE_HIGHLIGHT) { if (ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val == KM_PRESS) { @@ -2381,7 +2381,7 @@ static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data return WM_UI_HANDLER_CONTINUE; } -static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { if (data->state == BUTTON_STATE_HIGHLIGHT) { if (ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val == KM_PRESS) { @@ -2406,7 +2406,7 @@ static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, w return WM_UI_HANDLER_CONTINUE; } -static int ui_do_but_TEX(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_TEX(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { if (data->state == BUTTON_STATE_HIGHLIGHT) { if (ELEM(event->type, LEFTMOUSE, EVT_BUT_OPEN) && event->val == KM_PRESS) { @@ -2431,7 +2431,7 @@ static int ui_do_but_TEX(bContext *C, uiBlock *block, uiBut *but, uiHandleButton return WM_UI_HANDLER_CONTINUE; } -static int ui_do_but_SEARCH_UNLINK(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_SEARCH_UNLINK(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { /* unlink icon is on right */ if (ELEM(event->type, LEFTMOUSE, EVT_BUT_OPEN) && event->val == KM_PRESS) { @@ -2459,7 +2459,7 @@ static int ui_do_but_SEARCH_UNLINK(bContext *C, uiBlock *block, uiBut *but, uiHa return ui_do_but_TEX(C, block, but, data, event); } -static int ui_do_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { if (data->state == BUTTON_STATE_HIGHLIGHT) { if (ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val == KM_PRESS) { @@ -2472,7 +2472,7 @@ static int ui_do_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data, wmEv return WM_UI_HANDLER_CONTINUE; } -static int ui_do_but_EXIT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_EXIT(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { if (data->state == BUTTON_STATE_HIGHLIGHT) { @@ -2730,7 +2730,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i return changed; } -static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my; /* mouse location scaled to fit the UI */ int screen_mx, screen_my; /* mouse location kept at screen pixel coords */ @@ -2993,7 +2993,7 @@ static bool ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, return changed; } -static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my, click = 0; int retval = WM_UI_HANDLER_CONTINUE; @@ -3135,7 +3135,7 @@ static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButton return retval; } -static int ui_do_but_SCROLL(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_SCROLL(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my /*, click = 0 */; int retval = WM_UI_HANDLER_CONTINUE; @@ -3187,7 +3187,7 @@ static int ui_do_but_SCROLL(bContext *C, uiBlock *block, uiBut *but, uiHandleBut } -static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { if (data->state == BUTTON_STATE_HIGHLIGHT) { @@ -3350,7 +3350,7 @@ static int ui_numedit_but_NORMAL(uiBut *but, uiHandleButtonData *data, int mx, i return changed; } -static int ui_do_but_NORMAL(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_NORMAL(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my; @@ -3536,7 +3536,7 @@ static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, wmNDOF ui_set_but_vectorf(but, data->vec); } -static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my; @@ -3736,7 +3736,7 @@ static void ui_ndofedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, wmND } -static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my; mx = event->x; @@ -3855,7 +3855,7 @@ static int ui_numedit_but_COLORBAND(uiBut *but, uiHandleButtonData *data, int mx return changed; } -static int ui_do_but_COLORBAND(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_COLORBAND(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { ColorBand *coba; CBData *cbd; @@ -4019,7 +4019,7 @@ static int ui_numedit_but_CURVE(uiBut *but, uiHandleButtonData *data, int snap, return changed; } -static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my, a, changed = 0; @@ -4201,7 +4201,7 @@ static int ui_numedit_but_HISTOGRAM(uiBut *but, uiHandleButtonData *data, int mx return changed; } -static int ui_do_but_HISTOGRAM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_HISTOGRAM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my; @@ -4284,7 +4284,7 @@ static int ui_numedit_but_WAVEFORM(uiBut *but, uiHandleButtonData *data, int mx, return changed; } -static int ui_do_but_WAVEFORM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_WAVEFORM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my; @@ -4359,7 +4359,7 @@ static int ui_numedit_but_VECTORSCOPE(uiBut *but, uiHandleButtonData *data, int return changed; } -static int ui_do_but_VECTORSCOPE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_VECTORSCOPE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my; @@ -4404,7 +4404,7 @@ static int ui_do_but_VECTORSCOPE(bContext *C, uiBlock *block, uiBut *but, uiHand } #ifdef WITH_INTERNATIONAL -static int ui_do_but_CHARTAB(bContext *UNUSED(C), uiBlock *UNUSED(block), uiBut *UNUSED(but), uiHandleButtonData *UNUSED(data), wmEvent *UNUSED(event)) +static int ui_do_but_CHARTAB(bContext *UNUSED(C), uiBlock *UNUSED(block), uiBut *UNUSED(but), uiHandleButtonData *UNUSED(data), const wmEvent *UNUSED(event)) { /* XXX 2.50 bad global and state access */ #if 0 @@ -4509,7 +4509,7 @@ static int ui_do_but_CHARTAB(bContext *UNUSED(C), uiBlock *UNUSED(block), uiBut #endif -static int ui_do_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { VECCOPY2D(but->linkto, event->mval); @@ -4576,7 +4576,7 @@ static int ui_numedit_but_TRACKPREVIEW(bContext *C, uiBut *but, uiHandleButtonDa return changed; } -static int ui_do_but_TRACKPREVIEW(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_TRACKPREVIEW(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { int mx, my; @@ -5038,7 +5038,7 @@ static int ui_but_menu(bContext *C, uiBut *but) return 1; } -static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) +static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *event) { uiHandleButtonData *data; int retval; @@ -5951,7 +5951,7 @@ void uiContextAnimUpdate(const bContext *C) /************** handle activating a button *************/ -static uiBut *uit_but_find_open_event(ARegion *ar, wmEvent *event) +static uiBut *uit_but_find_open_event(ARegion *ar, const wmEvent *event) { uiBlock *block; uiBut *but; @@ -5964,7 +5964,7 @@ static uiBut *uit_but_find_open_event(ARegion *ar, wmEvent *event) return NULL; } -static int ui_handle_button_over(bContext *C, wmEvent *event, ARegion *ar) +static int ui_handle_button_over(bContext *C, const wmEvent *event, ARegion *ar) { uiBut *but; @@ -6019,7 +6019,7 @@ static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiBu /************ handle events for an activated button ***********/ -static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but) +static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but) { uiHandleButtonData *data; uiBlock *block; @@ -6193,7 +6193,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but) return retval; } -static int ui_handle_list_event(bContext *C, wmEvent *event, ARegion *ar) +static int ui_handle_list_event(bContext *C, const wmEvent *event, ARegion *ar) { uiBut *but = ui_list_find_mouse_over(ar, event->x, event->y); int retval = WM_UI_HANDLER_CONTINUE; @@ -6280,7 +6280,7 @@ static int ui_handle_list_event(bContext *C, wmEvent *event, ARegion *ar) return retval; } -static void ui_handle_button_return_submenu(bContext *C, wmEvent *event, uiBut *but) +static void ui_handle_button_return_submenu(bContext *C, const wmEvent *event, uiBut *but) { uiHandleButtonData *data; uiPopupBlockHandle *menu; @@ -6483,7 +6483,7 @@ static int ui_menu_scroll(ARegion *ar, uiBlock *block, int my, uiBut *to_bt) return 0; } -static int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, int level) +static int ui_handle_menu_event(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu, int level) { ARegion *ar; uiBlock *block; @@ -6894,7 +6894,7 @@ static int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle return retval; } -static int ui_handle_menu_return_submenu(bContext *C, wmEvent *event, uiPopupBlockHandle *menu) +static int ui_handle_menu_return_submenu(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu) { ARegion *ar; uiBut *but; @@ -6943,7 +6943,7 @@ static int ui_handle_menu_return_submenu(bContext *C, wmEvent *event, uiPopupBlo return WM_UI_HANDLER_BREAK; } -static int ui_handle_menus_recursive(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, int level) +static int ui_handle_menus_recursive(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu, int level) { uiBut *but; uiHandleButtonData *data; @@ -6981,7 +6981,7 @@ static int ui_handle_menus_recursive(bContext *C, wmEvent *event, uiPopupBlockHa /* *************** UI event handlers **************** */ -static int ui_handler_region(bContext *C, wmEvent *event, void *UNUSED(userdata)) +static int ui_handler_region(bContext *C, const wmEvent *event, void *UNUSED(userdata)) { ARegion *ar; uiBut *but; @@ -7039,7 +7039,7 @@ static void ui_handler_remove_region(bContext *C, void *UNUSED(userdata)) ui_apply_but_funcs_after(C); } -static int ui_handler_region_menu(bContext *C, wmEvent *event, void *UNUSED(userdata)) +static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *UNUSED(userdata)) { ARegion *ar; uiBut *but; @@ -7094,7 +7094,7 @@ static int ui_handler_region_menu(bContext *C, wmEvent *event, void *UNUSED(user } /* two types of popups, one with operator + enum, other with regular callbacks */ -static int ui_handler_popup(bContext *C, wmEvent *event, void *userdata) +static int ui_handler_popup(bContext *C, const wmEvent *event, void *userdata) { uiPopupBlockHandle *menu = userdata; diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 0b94a0dabdc..eb7f09c7b34 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -319,7 +319,7 @@ struct uiBlock { void *handle_func_arg; /* custom extra handling */ - int (*block_event_func)(const struct bContext *C, struct uiBlock *, struct wmEvent *); + int (*block_event_func)(const struct bContext *C, struct uiBlock *, const struct wmEvent *); /* extra draw function for custom blocks */ void (*drawextra)(const struct bContext *C, void *idv, void *arg1, void *arg2, rcti *rect); @@ -468,7 +468,7 @@ ARegion *ui_searchbox_create(struct bContext *C, struct ARegion *butregion, uiBu int ui_searchbox_inside(struct ARegion *ar, int x, int y); void ui_searchbox_update(struct bContext *C, struct ARegion *ar, uiBut *but, int reset); void ui_searchbox_autocomplete(struct bContext *C, struct ARegion *ar, uiBut *but, char *str); -void ui_searchbox_event(struct bContext *C, struct ARegion *ar, uiBut *but, struct wmEvent *event); +void ui_searchbox_event(struct bContext *C, struct ARegion *ar, uiBut *but, const struct wmEvent *event); void ui_searchbox_apply(uiBut *but, struct ARegion *ar); void ui_searchbox_free(struct bContext *C, struct ARegion *ar); void ui_but_search_test(uiBut *but); @@ -489,7 +489,7 @@ int ui_step_name_menu(uiBut *but, int step); struct AutoComplete; /* interface_panel.c */ -extern int ui_handler_panel_region(struct bContext *C, struct wmEvent *event); +extern int ui_handler_panel_region(struct bContext *C, const struct wmEvent *event); extern void ui_draw_aligned_panel(struct uiStyle *style, uiBlock *block, rcti *rect); /* interface_draw.c */ @@ -507,7 +507,7 @@ void ui_draw_but_IMAGE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rct void ui_draw_but_TRACKPREVIEW(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect); /* interface_handlers.c */ -extern void ui_pan_to_scroll(struct wmEvent *event, int *type, int *val); +extern void ui_pan_to_scroll(const struct wmEvent *event, int *type, int *val); extern void ui_button_activate_do(struct bContext *C, struct ARegion *ar, uiBut *but); extern void ui_button_active_free(const struct bContext *C, uiBut *but); extern int ui_button_is_active(struct ARegion *ar); diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index c2c1de9cbd7..151eb2c6088 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -1016,7 +1016,7 @@ static void check_panel_overlap(ARegion *ar, Panel *panel) /************************ panel dragging ****************************/ -static void ui_do_drag(const bContext *C, wmEvent *event, Panel *panel) +static void ui_do_drag(const bContext *C, const wmEvent *event, Panel *panel) { uiHandlePanelData *data = panel->activedata; ScrArea *sa = CTX_wm_area(C); @@ -1134,7 +1134,7 @@ static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, in /* XXX should become modal keymap */ /* AKey is opening/closing panels, independent of button state now */ -int ui_handler_panel_region(bContext *C, wmEvent *event) +int ui_handler_panel_region(bContext *C, const wmEvent *event) { ARegion *ar = CTX_wm_region(C); uiBlock *block; @@ -1277,7 +1277,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) /**************** window level modal panel interaction **************/ /* note, this is modal handler and should not swallow events for animation */ -static int ui_handler_panel(bContext *C, wmEvent *event, void *userdata) +static int ui_handler_panel(bContext *C, const wmEvent *event, void *userdata) { Panel *panel = userdata; uiHandlePanelData *data = panel->activedata; diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index e846fc3f078..939cb251960 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -893,7 +893,7 @@ void ui_searchbox_apply(uiBut *but, ARegion *ar) } } -void ui_searchbox_event(bContext *C, ARegion *ar, uiBut *but, wmEvent *event) +void ui_searchbox_event(bContext *C, ARegion *ar, uiBut *but, const wmEvent *event) { uiSearchboxData *data = ar->regiondata; int type = event->type, val = event->val; @@ -2195,7 +2195,7 @@ static void uiBlockPicker(uiBlock *block, float rgba[4], PointerRNA *ptr, Proper } -static int ui_picker_small_wheel_cb(const bContext *UNUSED(C), uiBlock *block, wmEvent *event) +static int ui_picker_small_wheel_cb(const bContext *UNUSED(C), uiBlock *block, const wmEvent *event) { float add = 0.0f; diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 7f32fd6698e..e91d4f388af 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -148,11 +148,11 @@ void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap); struct wmEventHandler *WM_event_add_ui_handler( const struct bContext *C, ListBase *handlers, - int (*func)(struct bContext *C, struct wmEvent *event, void *userdata), + int (*func)(struct bContext *C, const struct wmEvent *event, void *userdata), void (*remove)(struct bContext *C, void *userdata), void *userdata); void WM_event_remove_ui_handler(ListBase *handlers, - int (*func)(struct bContext *C, struct wmEvent *event, void *userdata), + int (*func)(struct bContext *C, const struct wmEvent *event, void *userdata), void (*remove)(struct bContext *C, void *userdata), void *userdata, int postpone); void WM_event_remove_area_handler(struct ListBase *handlers, void *area); diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 86fd4856f7e..bbaa655025b 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -188,7 +188,7 @@ enum { #define WM_UI_HANDLER_CONTINUE 0 #define WM_UI_HANDLER_BREAK 1 -typedef int (*wmUIHandlerFunc)(struct bContext *C, struct wmEvent *event, void *userdata); +typedef int (*wmUIHandlerFunc)(struct bContext *C, const struct wmEvent *event, void *userdata); typedef void (*wmUIHandlerRemoveFunc)(struct bContext *C, void *userdata); /* ************** Notifiers ****************** */ -- cgit v1.2.3 From a47bef36225b06fb2237bf2cd03332a1ee0337d5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Feb 2013 01:11:27 +0000 Subject: fix for [#33803], error was caused by sloppy coding in r53487, converting trackpad to wheel events. if you moved your mouse fast over a button the event would get converted to a wheel, even if the input event wasnt a MOUSEPAN event. When Alt was held this was noticable because Alt+Wheel changes button values. added an assert to avoid this happening again. --- source/blender/editors/interface/interface_handlers.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 54d7493e516..c2ba69ae064 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -225,7 +225,11 @@ void ui_pan_to_scroll(const wmEvent *event, int *type, int *val) { static int lastdy = 0; int dy = event->prevy - event->y; - + + /* This event should be originally from event->type, + * converting wrong event into wheel is bad, see [#33803] */ + BLI_assert(*type == MOUSEPAN); + /* sign differs, reset */ if ((dy > 0 && lastdy < 0) || (dy < 0 && lastdy > 0)) lastdy = dy; @@ -2745,7 +2749,9 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton if (data->state == BUTTON_STATE_HIGHLIGHT) { int type = event->type, val = event->val; - ui_pan_to_scroll(event, &type, &val); + if (type == MOUSEPAN) { + ui_pan_to_scroll(event, &type, &val); + } /* XXX hardcoded keymap check.... */ if (type == MOUSEPAN && event->alt) @@ -3004,8 +3010,10 @@ static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButton if (data->state == BUTTON_STATE_HIGHLIGHT) { int type = event->type, val = event->val; - - ui_pan_to_scroll(event, &type, &val); + + if (type == MOUSEPAN) { + ui_pan_to_scroll(event, &type, &val); + } /* XXX hardcoded keymap check.... */ if (type == MOUSEPAN && event->alt) -- cgit v1.2.3 From 7dc33e3ef8429d7d541e8c0291826a2d42c56566 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 1 Feb 2013 06:24:49 +0000 Subject: Move opencl and reigidbody from source/blender/ to intern/ This modules does not depend on any blender-specific data structures or algorithms and due to our policy better be placed to intern/ Shall be no functional changes, tested CMake and SCons on Linux, hopefully other platforms will work as well. P.S. SVN history shall be preserved for the files. --- source/blender/CMakeLists.txt | 5 - source/blender/SConscript | 6 +- source/blender/blenkernel/CMakeLists.txt | 2 +- source/blender/blenkernel/SConscript | 2 +- source/blender/compositor/CMakeLists.txt | 2 +- source/blender/compositor/SConscript | 2 +- source/blender/editors/physics/CMakeLists.txt | 2 +- source/blender/editors/physics/SConscript | 2 +- source/blender/makesrna/SConscript | 3 +- source/blender/makesrna/intern/CMakeLists.txt | 2 +- source/blender/makesrna/intern/SConscript | 2 +- source/blender/opencl/CMakeLists.txt | 42 - source/blender/opencl/OCL_opencl.h | 37 - source/blender/opencl/SConscript | 34 - source/blender/opencl/intern/OCL_opencl.c | 37 - source/blender/opencl/intern/clew.c | 311 ------ source/blender/opencl/intern/clew.h | 1317 ------------------------- source/blender/rigidbody/CMakeLists.txt | 35 - source/blender/rigidbody/RBI_api.h | 309 ------ source/blender/rigidbody/SConscript | 42 - source/blender/rigidbody/rb_bullet_api.cpp | 949 ------------------ source/blenderplayer/CMakeLists.txt | 2 +- source/creator/CMakeLists.txt | 4 +- 23 files changed, 13 insertions(+), 3136 deletions(-) delete mode 100644 source/blender/opencl/CMakeLists.txt delete mode 100644 source/blender/opencl/OCL_opencl.h delete mode 100644 source/blender/opencl/SConscript delete mode 100644 source/blender/opencl/intern/OCL_opencl.c delete mode 100644 source/blender/opencl/intern/clew.c delete mode 100644 source/blender/opencl/intern/clew.h delete mode 100644 source/blender/rigidbody/CMakeLists.txt delete mode 100644 source/blender/rigidbody/RBI_api.h delete mode 100644 source/blender/rigidbody/SConscript delete mode 100644 source/blender/rigidbody/rb_bullet_api.cpp (limited to 'source') diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt index 36b05fd31f4..50e13188965 100644 --- a/source/blender/CMakeLists.txt +++ b/source/blender/CMakeLists.txt @@ -107,12 +107,7 @@ add_subdirectory(modifiers) add_subdirectory(makesdna) add_subdirectory(makesrna) -if(WITH_BULLET) - add_subdirectory(rigidbody) -endif() - if(WITH_COMPOSITOR) - add_subdirectory(opencl) # later on this may be used more generally add_subdirectory(compositor) endif() diff --git a/source/blender/SConscript b/source/blender/SConscript index 80457c739b6..8a4e2a39aa1 100644 --- a/source/blender/SConscript +++ b/source/blender/SConscript @@ -61,12 +61,8 @@ if env['WITH_BF_OPENEXR']: if env['WITH_BF_QUICKTIME']: SConscript (['quicktime/SConscript']) -if env['WITH_BF_BULLET']: - SConscript (['rigidbody/SConscript']) - if env['WITH_BF_COLLADA']: SConscript (['collada/SConscript']) if env['WITH_BF_COMPOSITOR']: - SConscript (['compositor/SConscript', - 'opencl/SConscript']) + SConscript (['compositor/SConscript']) diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index fefd4c89fbe..cb6da194dad 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -264,7 +264,7 @@ if(WITH_BULLET) ${BULLET_INCLUDE_DIRS} ) list(APPEND INC - ../rigidbody + ../../../intern/rigidbody ) add_definitions(-DWITH_BULLET) endif() diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript index e53e4724071..aa7d8a51b8c 100644 --- a/source/blender/blenkernel/SConscript +++ b/source/blender/blenkernel/SConscript @@ -41,7 +41,7 @@ incs += ' ../render/extern/include ../makesrna' incs += ' ../imbuf ../ikplugin ../avi #/intern/elbeem/extern ../nodes ../modifiers' incs += ' #/intern/iksolver/extern ../blenloader' incs += ' #/extern/bullet2/src' -incs += ' ../rigidbody' +incs += ' #/intern/rigidbody' incs += ' #/intern/opennl/extern #/intern/bsp/extern' incs += ' ../gpu #/extern/glew/include' incs += ' ../bmesh' diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index 0e8ddf4068c..efecf1a7565 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -35,13 +35,13 @@ set(INC ../imbuf ../makesdna ../makesrna - ../opencl ../windowmanager ../nodes ../nodes/composite ../nodes/intern ../render/extern/include ../render/intern/include + ../../../intern/opencl ../../../intern/guardedalloc ) diff --git a/source/blender/compositor/SConscript b/source/blender/compositor/SConscript index 1872bf2afac..64169ac7403 100644 --- a/source/blender/compositor/SConscript +++ b/source/blender/compositor/SConscript @@ -32,7 +32,7 @@ sources = env.Glob('intern/*.cpp') + env.Glob('nodes/*.cpp') + env.Glob('operati incs = '. nodes intern operations ../blenlib ../blenkernel ../makesdna ../render/extern/include ../render/intern/include' incs += ' ../makesrna ../blenloader ../../../intern/guardedalloc ../imbuf ../windowmanager ' -incs += '../opencl ../nodes ../nodes/intern ../nodes/composite ' +incs += '#intern/opencl ../nodes ../nodes/intern ../nodes/composite ' if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): incs += ' ' + env['BF_PTHREADS_INC'] diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt index 435327319aa..29d8aec4224 100644 --- a/source/blender/editors/physics/CMakeLists.txt +++ b/source/blender/editors/physics/CMakeLists.txt @@ -64,7 +64,7 @@ endif() if(WITH_BULLET) list(APPEND INC - ../../rigidbody + ../../../../intern/rigidbody ) add_definitions(-DWITH_BULLET) endif() diff --git a/source/blender/editors/physics/SConscript b/source/blender/editors/physics/SConscript index b68cc944925..7916ea24bde 100644 --- a/source/blender/editors/physics/SConscript +++ b/source/blender/editors/physics/SConscript @@ -33,7 +33,7 @@ incs = '../include ../../blenfont ../../blenlib ../../blenkernel ../../makesdna incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' incs += ' ../../gpu ../../blenloader ../../bmesh' incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern' -incs += ' ../../rigidbody' +incs += ' #/intern/rigidbody' defs = [] diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript index 47750617e55..6031e797905 100644 --- a/source/blender/makesrna/SConscript +++ b/source/blender/makesrna/SConscript @@ -38,7 +38,6 @@ incs += ' ../render/extern/include #/intern/cycles/blender' incs += ' ../nodes' incs += ' #/extern/glew/include' incs += ' #/intern/smoke/extern' -incs += ' ../rigidbody' incs += ' ../bmesh' @@ -49,7 +48,7 @@ if env['WITH_BF_SMOKE']: if env['WITH_BF_BULLET']: defs.append('WITH_BULLET') - incs += ' ../../rigidbody' + incs += ' #/intern/rigidbody' if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 210857a4690..849c61f30b3 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -240,7 +240,7 @@ endif() if(WITH_BULLET) list(APPEND INC - ../../rigidbody + ../../../../intern/rigidbody ) add_definitions(-DWITH_BULLET) endif() diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript index 33d43e1e019..f8608f0c28b 100644 --- a/source/blender/makesrna/intern/SConscript +++ b/source/blender/makesrna/intern/SConscript @@ -68,7 +68,7 @@ if env['WITH_BF_SMOKE']: if env['WITH_BF_BULLET']: defs.append('WITH_BULLET') - incs += ' ../../rigidbody' + incs += ' #/intern/rigidbody' if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') diff --git a/source/blender/opencl/CMakeLists.txt b/source/blender/opencl/CMakeLists.txt deleted file mode 100644 index b3c76db1bca..00000000000 --- a/source/blender/opencl/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# The Original Code is Copyright (C) 2006, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Jacques Beaurain. -# -# ***** END GPL LICENSE BLOCK ***** - -set(INC - . -) - -set(INC_SYS - -) - -set(SRC - OCL_opencl.h - intern/clew.h - intern/clew.c - intern/OCL_opencl.c -) - - -blender_add_lib(bf_opencl "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/opencl/OCL_opencl.h b/source/blender/opencl/OCL_opencl.h deleted file mode 100644 index 4ee167b2fb4..00000000000 --- a/source/blender/opencl/OCL_opencl.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor: - * Jeroen Bakker - * Monique Dewanchand - */ - -#ifndef OCL_OPENCL_H -#define OCL_OPENCL_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "intern/clew.h" -void OCL_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/source/blender/opencl/SConscript b/source/blender/opencl/SConscript deleted file mode 100644 index 388789a5b50..00000000000 --- a/source/blender/opencl/SConscript +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python -# -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# The Original Code is Copyright (C) 2006, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Nathan Letwory. -# -# ***** END GPL LICENSE BLOCK ***** - -Import ('env') - -sources = env.Glob('intern/*.c') - -incs = '.' - -env.BlenderLib ( 'bf_opencl', sources, Split(incs), libtype=['core','player'], priority = [192,192] ) diff --git a/source/blender/opencl/intern/OCL_opencl.c b/source/blender/opencl/intern/OCL_opencl.c deleted file mode 100644 index e3130e16bde..00000000000 --- a/source/blender/opencl/intern/OCL_opencl.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor: - * Jeroen Bakker - * Monique Dewanchand - */ - -#include "OCL_opencl.h" - -void OCL_init(void) -{ -#ifdef _WIN32 - const char *path = "OpenCL.dll"; -#elif defined(__APPLE__) - const char *path = "/Library/Frameworks/OpenCL.framework/OpenCL"; -#else - const char *path = "libOpenCL.so"; -#endif - - clewInit(path); -} - diff --git a/source/blender/opencl/intern/clew.c b/source/blender/opencl/intern/clew.c deleted file mode 100644 index d68eb17288f..00000000000 --- a/source/blender/opencl/intern/clew.c +++ /dev/null @@ -1,311 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2009 Organic Vectory B.V. -// Written by George van Venrooij -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file license.txt) -////////////////////////////////////////////////////////////////////////// - -#include "clew.h" - -//! \file clew.c -//! \brief OpenCL run-time loader source - -#ifndef CLCC_GENERATE_DOCUMENTATION -#ifdef _WIN32 - #define WIN32_LEAN_AND_MEAN - #define VC_EXTRALEAN - #include - - typedef HMODULE CLCC_DYNLIB_HANDLE; - - #define CLCC_DYNLIB_OPEN LoadLibrary - #define CLCC_DYNLIB_CLOSE FreeLibrary - #define CLCC_DYNLIB_IMPORT GetProcAddress -#else - #include - - typedef void* CLCC_DYNLIB_HANDLE; - - #define CLCC_DYNLIB_OPEN(path) dlopen(path, RTLD_NOW | RTLD_GLOBAL) - #define CLCC_DYNLIB_CLOSE dlclose - #define CLCC_DYNLIB_IMPORT dlsym -#endif -#else - //typedef implementation_defined CLCC_DYNLIB_HANDLE; - //#define CLCC_DYNLIB_OPEN(path) implementation_defined - //#define CLCC_DYNLIB_CLOSE implementation_defined - //#define CLCC_DYNLIB_IMPORT implementation_defined -#endif - -#include - -//! \brief module handle -static CLCC_DYNLIB_HANDLE module = NULL; - -// Variables holding function entry points -#ifndef CLCC_GENERATE_DOCUMENTATION -PFNCLGETPLATFORMIDS __oclGetPlatformIDs = NULL; -PFNCLGETPLATFORMINFO __oclGetPlatformInfo = NULL; -PFNCLGETDEVICEIDS __oclGetDeviceIDs = NULL; -PFNCLGETDEVICEINFO __oclGetDeviceInfo = NULL; -PFNCLCREATECONTEXT __oclCreateContext = NULL; -PFNCLCREATECONTEXTFROMTYPE __oclCreateContextFromType = NULL; -PFNCLRETAINCONTEXT __oclRetainContext = NULL; -PFNCLRELEASECONTEXT __oclReleaseContext = NULL; -PFNCLGETCONTEXTINFO __oclGetContextInfo = NULL; -PFNCLCREATECOMMANDQUEUE __oclCreateCommandQueue = NULL; -PFNCLRETAINCOMMANDQUEUE __oclRetainCommandQueue = NULL; -PFNCLRELEASECOMMANDQUEUE __oclReleaseCommandQueue = NULL; -PFNCLGETCOMMANDQUEUEINFO __oclGetCommandQueueInfo = NULL; -PFNCLSETCOMMANDQUEUEPROPERTY __oclSetCommandQueueProperty = NULL; -PFNCLCREATEBUFFER __oclCreateBuffer = NULL; -PFNCLCREATEIMAGE2D __oclCreateImage2D = NULL; -PFNCLCREATEIMAGE3D __oclCreateImage3D = NULL; -PFNCLRETAINMEMOBJECT __oclRetainMemObject = NULL; -PFNCLRELEASEMEMOBJECT __oclReleaseMemObject = NULL; -PFNCLGETSUPPORTEDIMAGEFORMATS __oclGetSupportedImageFormats = NULL; -PFNCLGETMEMOBJECTINFO __oclGetMemObjectInfo = NULL; -PFNCLGETIMAGEINFO __oclGetImageInfo = NULL; -PFNCLCREATESAMPLER __oclCreateSampler = NULL; -PFNCLRETAINSAMPLER __oclRetainSampler = NULL; -PFNCLRELEASESAMPLER __oclReleaseSampler = NULL; -PFNCLGETSAMPLERINFO __oclGetSamplerInfo = NULL; -PFNCLCREATEPROGRAMWITHSOURCE __oclCreateProgramWithSource = NULL; -PFNCLCREATEPROGRAMWITHBINARY __oclCreateProgramWithBinary = NULL; -PFNCLRETAINPROGRAM __oclRetainProgram = NULL; -PFNCLRELEASEPROGRAM __oclReleaseProgram = NULL; -PFNCLBUILDPROGRAM __oclBuildProgram = NULL; -PFNCLUNLOADCOMPILER __oclUnloadCompiler = NULL; -PFNCLGETPROGRAMINFO __oclGetProgramInfo = NULL; -PFNCLGETPROGRAMBUILDINFO __oclGetProgramBuildInfo = NULL; -PFNCLCREATEKERNEL __oclCreateKernel = NULL; -PFNCLCREATEKERNELSINPROGRAM __oclCreateKernelsInProgram = NULL; -PFNCLRETAINKERNEL __oclRetainKernel = NULL; -PFNCLRELEASEKERNEL __oclReleaseKernel = NULL; -PFNCLSETKERNELARG __oclSetKernelArg = NULL; -PFNCLGETKERNELINFO __oclGetKernelInfo = NULL; -PFNCLGETKERNELWORKGROUPINFO __oclGetKernelWorkGroupInfo = NULL; -PFNCLWAITFOREVENTS __oclWaitForEvents = NULL; -PFNCLGETEVENTINFO __oclGetEventInfo = NULL; -PFNCLRETAINEVENT __oclRetainEvent = NULL; -PFNCLRELEASEEVENT __oclReleaseEvent = NULL; -PFNCLGETEVENTPROFILINGINFO __oclGetEventProfilingInfo = NULL; -PFNCLFLUSH __oclFlush = NULL; -PFNCLFINISH __oclFinish = NULL; -PFNCLENQUEUEREADBUFFER __oclEnqueueReadBuffer = NULL; -PFNCLENQUEUEWRITEBUFFER __oclEnqueueWriteBuffer = NULL; -PFNCLENQUEUECOPYBUFFER __oclEnqueueCopyBuffer = NULL; -PFNCLENQUEUEREADIMAGE __oclEnqueueReadImage = NULL; -PFNCLENQUEUEWRITEIMAGE __oclEnqueueWriteImage = NULL; -PFNCLENQUEUECOPYIMAGE __oclEnqueueCopyImage = NULL; -PFNCLENQUEUECOPYIMAGETOBUFFER __oclEnqueueCopyImageToBuffer = NULL; -PFNCLENQUEUECOPYBUFFERTOIMAGE __oclEnqueueCopyBufferToImage = NULL; -PFNCLENQUEUEMAPBUFFER __oclEnqueueMapBuffer = NULL; -PFNCLENQUEUEMAPIMAGE __oclEnqueueMapImage = NULL; -PFNCLENQUEUEUNMAPMEMOBJECT __oclEnqueueUnmapMemObject = NULL; -PFNCLENQUEUENDRANGEKERNEL __oclEnqueueNDRangeKernel = NULL; -PFNCLENQUEUETASK __oclEnqueueTask = NULL; -PFNCLENQUEUENATIVEKERNEL __oclEnqueueNativeKernel = NULL; -PFNCLENQUEUEMARKER __oclEnqueueMarker = NULL; -PFNCLENQUEUEWAITFOREVENTS __oclEnqueueWaitForEvents = NULL; -PFNCLENQUEUEBARRIER __oclEnqueueBarrier = NULL; -PFNCLGETEXTENSIONFUNCTIONADDRESS __oclGetExtensionFunctionAddress = NULL; -#endif // CLCC_GENERATE_DOCUMENTATION - - -//! \brief Unloads OpenCL dynamic library, should not be called directly -static void clewExit(void) -{ - if (module != NULL) - { - // Ignore errors - CLCC_DYNLIB_CLOSE(module); - module = NULL; - } -} - -//! \param path path to dynamic library to load -//! \return CLEW_ERROR_OPEN_FAILED if the library could not be opened -//! CLEW_ERROR_ATEXIT_FAILED if atexit(clewExit) failed -//! CLEW_SUCCESS when the library was succesfully loaded -int clewInit(const char* path) -{ - int error = 0; - - // Check if already initialized - if (module != NULL) - { - return CLEW_SUCCESS; - } - - // Load library - module = CLCC_DYNLIB_OPEN(path); - - // Check for errors - if (module == NULL) - { - return CLEW_ERROR_OPEN_FAILED; - } - - // Set unloading - error = atexit(clewExit); - - if (error) - { - // Failure queing atexit, shutdown with error - CLCC_DYNLIB_CLOSE(module); - module = NULL; - - return CLEW_ERROR_ATEXIT_FAILED; - } - - // Determine function entry-points - __oclGetPlatformIDs = (PFNCLGETPLATFORMIDS )CLCC_DYNLIB_IMPORT(module, "clGetPlatformIDs"); - __oclGetPlatformInfo = (PFNCLGETPLATFORMINFO )CLCC_DYNLIB_IMPORT(module, "clGetPlatformInfo"); - __oclGetDeviceIDs = (PFNCLGETDEVICEIDS )CLCC_DYNLIB_IMPORT(module, "clGetDeviceIDs"); - __oclGetDeviceInfo = (PFNCLGETDEVICEINFO )CLCC_DYNLIB_IMPORT(module, "clGetDeviceInfo"); - __oclCreateContext = (PFNCLCREATECONTEXT )CLCC_DYNLIB_IMPORT(module, "clCreateContext"); - __oclCreateContextFromType = (PFNCLCREATECONTEXTFROMTYPE )CLCC_DYNLIB_IMPORT(module, "clCreateContextFromType"); - __oclRetainContext = (PFNCLRETAINCONTEXT )CLCC_DYNLIB_IMPORT(module, "clRetainContext"); - __oclReleaseContext = (PFNCLRELEASECONTEXT )CLCC_DYNLIB_IMPORT(module, "clReleaseContext"); - __oclGetContextInfo = (PFNCLGETCONTEXTINFO )CLCC_DYNLIB_IMPORT(module, "clGetContextInfo"); - __oclCreateCommandQueue = (PFNCLCREATECOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clCreateCommandQueue"); - __oclRetainCommandQueue = (PFNCLRETAINCOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clRetainCommandQueue"); - __oclReleaseCommandQueue = (PFNCLRELEASECOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clReleaseCommandQueue"); - __oclGetCommandQueueInfo = (PFNCLGETCOMMANDQUEUEINFO )CLCC_DYNLIB_IMPORT(module, "clGetCommandQueueInfo"); - __oclSetCommandQueueProperty = (PFNCLSETCOMMANDQUEUEPROPERTY )CLCC_DYNLIB_IMPORT(module, "clSetCommandQueueProperty"); - __oclCreateBuffer = (PFNCLCREATEBUFFER )CLCC_DYNLIB_IMPORT(module, "clCreateBuffer"); - __oclCreateImage2D = (PFNCLCREATEIMAGE2D )CLCC_DYNLIB_IMPORT(module, "clCreateImage2D"); - __oclCreateImage3D = (PFNCLCREATEIMAGE3D )CLCC_DYNLIB_IMPORT(module, "clCreateImage3D"); - __oclRetainMemObject = (PFNCLRETAINMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clRetainMemObject"); - __oclReleaseMemObject = (PFNCLRELEASEMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clReleaseMemObject"); - __oclGetSupportedImageFormats = (PFNCLGETSUPPORTEDIMAGEFORMATS )CLCC_DYNLIB_IMPORT(module, "clGetSupportedImageFormats"); - __oclGetMemObjectInfo = (PFNCLGETMEMOBJECTINFO )CLCC_DYNLIB_IMPORT(module, "clGetMemObjectInfo"); - __oclGetImageInfo = (PFNCLGETIMAGEINFO )CLCC_DYNLIB_IMPORT(module, "clGetImageInfo"); - __oclCreateSampler = (PFNCLCREATESAMPLER )CLCC_DYNLIB_IMPORT(module, "clCreateSampler"); - __oclRetainSampler = (PFNCLRETAINSAMPLER )CLCC_DYNLIB_IMPORT(module, "clRetainSampler"); - __oclReleaseSampler = (PFNCLRELEASESAMPLER )CLCC_DYNLIB_IMPORT(module, "clReleaseSampler"); - __oclGetSamplerInfo = (PFNCLGETSAMPLERINFO )CLCC_DYNLIB_IMPORT(module, "clGetSamplerInfo"); - __oclCreateProgramWithSource = (PFNCLCREATEPROGRAMWITHSOURCE )CLCC_DYNLIB_IMPORT(module, "clCreateProgramWithSource"); - __oclCreateProgramWithBinary = (PFNCLCREATEPROGRAMWITHBINARY )CLCC_DYNLIB_IMPORT(module, "clCreateProgramWithBinary"); - __oclRetainProgram = (PFNCLRETAINPROGRAM )CLCC_DYNLIB_IMPORT(module, "clRetainProgram"); - __oclReleaseProgram = (PFNCLRELEASEPROGRAM )CLCC_DYNLIB_IMPORT(module, "clReleaseProgram"); - __oclBuildProgram = (PFNCLBUILDPROGRAM )CLCC_DYNLIB_IMPORT(module, "clBuildProgram"); - __oclUnloadCompiler = (PFNCLUNLOADCOMPILER )CLCC_DYNLIB_IMPORT(module, "clUnloadCompiler"); - __oclGetProgramInfo = (PFNCLGETPROGRAMINFO )CLCC_DYNLIB_IMPORT(module, "clGetProgramInfo"); - __oclGetProgramBuildInfo = (PFNCLGETPROGRAMBUILDINFO )CLCC_DYNLIB_IMPORT(module, "clGetProgramBuildInfo"); - __oclCreateKernel = (PFNCLCREATEKERNEL )CLCC_DYNLIB_IMPORT(module, "clCreateKernel"); - __oclCreateKernelsInProgram = (PFNCLCREATEKERNELSINPROGRAM )CLCC_DYNLIB_IMPORT(module, "clCreateKernelsInProgram"); - __oclRetainKernel = (PFNCLRETAINKERNEL )CLCC_DYNLIB_IMPORT(module, "clRetainKernel"); - __oclReleaseKernel = (PFNCLRELEASEKERNEL )CLCC_DYNLIB_IMPORT(module, "clReleaseKernel"); - __oclSetKernelArg = (PFNCLSETKERNELARG )CLCC_DYNLIB_IMPORT(module, "clSetKernelArg"); - __oclGetKernelInfo = (PFNCLGETKERNELINFO )CLCC_DYNLIB_IMPORT(module, "clGetKernelInfo"); - __oclGetKernelWorkGroupInfo = (PFNCLGETKERNELWORKGROUPINFO )CLCC_DYNLIB_IMPORT(module, "clGetKernelWorkGroupInfo"); - __oclWaitForEvents = (PFNCLWAITFOREVENTS )CLCC_DYNLIB_IMPORT(module, "clWaitForEvents"); - __oclGetEventInfo = (PFNCLGETEVENTINFO )CLCC_DYNLIB_IMPORT(module, "clGetEventInfo"); - __oclRetainEvent = (PFNCLRETAINEVENT )CLCC_DYNLIB_IMPORT(module, "clRetainEvent"); - __oclReleaseEvent = (PFNCLRELEASEEVENT )CLCC_DYNLIB_IMPORT(module, "clReleaseEvent"); - __oclGetEventProfilingInfo = (PFNCLGETEVENTPROFILINGINFO )CLCC_DYNLIB_IMPORT(module, "clGetEventProfilingInfo"); - __oclFlush = (PFNCLFLUSH )CLCC_DYNLIB_IMPORT(module, "clFlush"); - __oclFinish = (PFNCLFINISH )CLCC_DYNLIB_IMPORT(module, "clFinish"); - __oclEnqueueReadBuffer = (PFNCLENQUEUEREADBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueReadBuffer"); - __oclEnqueueWriteBuffer = (PFNCLENQUEUEWRITEBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueWriteBuffer"); - __oclEnqueueCopyBuffer = (PFNCLENQUEUECOPYBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyBuffer"); - __oclEnqueueReadImage = (PFNCLENQUEUEREADIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueReadImage"); - __oclEnqueueWriteImage = (PFNCLENQUEUEWRITEIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueWriteImage"); - __oclEnqueueCopyImage = (PFNCLENQUEUECOPYIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyImage"); - __oclEnqueueCopyImageToBuffer = (PFNCLENQUEUECOPYIMAGETOBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyImageToBuffer"); - __oclEnqueueCopyBufferToImage = (PFNCLENQUEUECOPYBUFFERTOIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyBufferToImage"); - __oclEnqueueMapBuffer = (PFNCLENQUEUEMAPBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueMapBuffer"); - __oclEnqueueMapImage = (PFNCLENQUEUEMAPIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueMapImage"); - __oclEnqueueUnmapMemObject = (PFNCLENQUEUEUNMAPMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clEnqueueUnmapMemObject"); - __oclEnqueueNDRangeKernel = (PFNCLENQUEUENDRANGEKERNEL )CLCC_DYNLIB_IMPORT(module, "clEnqueueNDRangeKernel"); - __oclEnqueueTask = (PFNCLENQUEUETASK )CLCC_DYNLIB_IMPORT(module, "clEnqueueTask"); - __oclEnqueueNativeKernel = (PFNCLENQUEUENATIVEKERNEL )CLCC_DYNLIB_IMPORT(module, "clEnqueueNativeKernel"); - __oclEnqueueMarker = (PFNCLENQUEUEMARKER )CLCC_DYNLIB_IMPORT(module, "clEnqueueMarker"); - __oclEnqueueWaitForEvents = (PFNCLENQUEUEWAITFOREVENTS )CLCC_DYNLIB_IMPORT(module, "clEnqueueWaitForEvents"); - __oclEnqueueBarrier = (PFNCLENQUEUEBARRIER )CLCC_DYNLIB_IMPORT(module, "clEnqueueBarrier"); - __oclGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS )CLCC_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress"); - - return CLEW_SUCCESS; -} - -//! \param error CL error code -//! \return a string representation of the error code -const char* clewErrorString(cl_int error) -{ - static const char* strings[] = - { - // Error Codes - "CL_SUCCESS" // 0 - , "CL_DEVICE_NOT_FOUND" // -1 - , "CL_DEVICE_NOT_AVAILABLE" // -2 - , "CL_COMPILER_NOT_AVAILABLE" // -3 - , "CL_MEM_OBJECT_ALLOCATION_FAILURE" // -4 - , "CL_OUT_OF_RESOURCES" // -5 - , "CL_OUT_OF_HOST_MEMORY" // -6 - , "CL_PROFILING_INFO_NOT_AVAILABLE" // -7 - , "CL_MEM_COPY_OVERLAP" // -8 - , "CL_IMAGE_FORMAT_MISMATCH" // -9 - , "CL_IMAGE_FORMAT_NOT_SUPPORTED" // -10 - , "CL_BUILD_PROGRAM_FAILURE" // -11 - , "CL_MAP_FAILURE" // -12 - - , "" // -13 - , "" // -14 - , "" // -15 - , "" // -16 - , "" // -17 - , "" // -18 - , "" // -19 - - , "" // -20 - , "" // -21 - , "" // -22 - , "" // -23 - , "" // -24 - , "" // -25 - , "" // -26 - , "" // -27 - , "" // -28 - , "" // -29 - - , "CL_INVALID_VALUE" // -30 - , "CL_INVALID_DEVICE_TYPE" // -31 - , "CL_INVALID_PLATFORM" // -32 - , "CL_INVALID_DEVICE" // -33 - , "CL_INVALID_CONTEXT" // -34 - , "CL_INVALID_QUEUE_PROPERTIES" // -35 - , "CL_INVALID_COMMAND_QUEUE" // -36 - , "CL_INVALID_HOST_PTR" // -37 - , "CL_INVALID_MEM_OBJECT" // -38 - , "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" // -39 - , "CL_INVALID_IMAGE_SIZE" // -40 - , "CL_INVALID_SAMPLER" // -41 - , "CL_INVALID_BINARY" // -42 - , "CL_INVALID_BUILD_OPTIONS" // -43 - , "CL_INVALID_PROGRAM" // -44 - , "CL_INVALID_PROGRAM_EXECUTABLE" // -45 - , "CL_INVALID_KERNEL_NAME" // -46 - , "CL_INVALID_KERNEL_DEFINITION" // -47 - , "CL_INVALID_KERNEL" // -48 - , "CL_INVALID_ARG_INDEX" // -49 - , "CL_INVALID_ARG_VALUE" // -50 - , "CL_INVALID_ARG_SIZE" // -51 - , "CL_INVALID_KERNEL_ARGS" // -52 - , "CL_INVALID_WORK_DIMENSION" // -53 - , "CL_INVALID_WORK_GROUP_SIZE" // -54 - , "CL_INVALID_WORK_ITEM_SIZE" // -55 - , "CL_INVALID_GLOBAL_OFFSET" // -56 - , "CL_INVALID_EVENT_WAIT_LIST" // -57 - , "CL_INVALID_EVENT" // -58 - , "CL_INVALID_OPERATION" // -59 - , "CL_INVALID_GL_OBJECT" // -60 - , "CL_INVALID_BUFFER_SIZE" // -61 - , "CL_INVALID_MIP_LEVEL" // -62 - , "CL_INVALID_GLOBAL_WORK_SIZE" // -63 - }; - - return strings[-error]; -} diff --git a/source/blender/opencl/intern/clew.h b/source/blender/opencl/intern/clew.h deleted file mode 100644 index bb7e0134dcf..00000000000 --- a/source/blender/opencl/intern/clew.h +++ /dev/null @@ -1,1317 +0,0 @@ -#ifndef CLCC_CLEW_HPP_INCLUDED -#define CLCC_CLEW_HPP_INCLUDED - -////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2009 Organic Vectory B.V. -// Written by George van Venrooij -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file license.txt) -////////////////////////////////////////////////////////////////////////// - -//! \file clew.h -//! \brief OpenCL run-time loader header -//! -//! This file contains a copy of the contents of CL.H and CL_PLATFORM.H from the -//! official OpenCL spec. The purpose of this code is to load the OpenCL dynamic -//! library at run-time and thus allow the executable to function on many -//! platforms regardless of the vendor of the OpenCL driver actually installed. -//! Some of the techniques used here were inspired by work done in the GLEW -//! library (http://glew.sourceforge.net/) - -// Run-time dynamic linking functionality based on concepts used in GLEW -#ifdef __OPENCL_CL_H -#error cl.h included before clew.h -#endif - -#ifdef __OPENCL_CL_PLATFORM_H -#error cl_platform.h included before clew.h -#endif - -#ifndef CLCC_GENERATE_DOCUMENTATION -// Prevent cl.h inclusion -#define __OPENCL_CL_H -// Prevent cl_platform.h inclusion -#define __CL_PLATFORM_H -#endif // CLCC_GENERATE_DOCUMENTATION - -/******************************************************************************* -* Copyright (c) 2008-2009 The Khronos Group Inc. -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and/or associated documentation files (the -* "Materials"), to deal in the Materials without restriction, including -* without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Materials, and to -* permit persons to whom the Materials are furnished to do so, subject to -* the following conditions: -* -* The above copyright notice and this permission notice shall be included -* in all copies or substantial portions of the Materials. -* -* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -******************************************************************************/ -#ifdef __APPLE__ -/* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef CLCC_GENERATE_DOCUMENTATION - -#if defined(_WIN32) -#define CL_API_ENTRY -#define CL_API_CALL __stdcall -#else -#define CL_API_ENTRY -#define CL_API_CALL -#endif - -#if defined(__APPLE__) -//JBKK removed for compatibility with blender trunk #define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER -#define CL_API_SUFFIX__VERSION_1_0 -#define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) -#else -#define CL_API_SUFFIX__VERSION_1_0 -#define CL_EXTENSION_WEAK_LINK -#endif - -#if defined(_WIN32) && defined(_MSC_VER) - -/* scalar types */ -typedef signed __int8 cl_char; -typedef unsigned __int8 cl_uchar; -typedef signed __int16 cl_short; -typedef unsigned __int16 cl_ushort; -typedef signed __int32 cl_int; -typedef unsigned __int32 cl_uint; -typedef signed __int64 cl_long; -typedef unsigned __int64 cl_ulong; - -typedef unsigned __int16 cl_half; -typedef float cl_float; -typedef double cl_double; - - -/* -* Vector types -* -* Note: OpenCL requires that all types be naturally aligned. -* This means that vector types must be naturally aligned. -* For example, a vector of four floats must be aligned to -* a 16 byte boundary (calculated as 4 * the natural 4-byte -* alignment of the float). The alignment qualifiers here -* will only function properly if your compiler supports them -* and if you don't actively work to defeat them. For example, -* in order for a cl_float4 to be 16 byte aligned in a struct, -* the start of the struct must itself be 16-byte aligned. -* -* Maintaining proper alignment is the user's responsibility. -*/ -typedef signed __int8 cl_char2[2]; -typedef signed __int8 cl_char4[4]; -typedef signed __int8 cl_char8[8]; -typedef signed __int8 cl_char16[16]; -typedef unsigned __int8 cl_uchar2[2]; -typedef unsigned __int8 cl_uchar4[4]; -typedef unsigned __int8 cl_uchar8[8]; -typedef unsigned __int8 cl_uchar16[16]; - -typedef signed __int16 cl_short2[2]; -typedef signed __int16 cl_short4[4]; -typedef signed __int16 cl_short8[8]; -typedef signed __int16 cl_short16[16]; -typedef unsigned __int16 cl_ushort2[2]; -typedef unsigned __int16 cl_ushort4[4]; -typedef unsigned __int16 cl_ushort8[8]; -typedef unsigned __int16 cl_ushort16[16]; - -typedef signed __int32 cl_int2[2]; -typedef signed __int32 cl_int4[4]; -typedef signed __int32 cl_int8[8]; -typedef signed __int32 cl_int16[16]; -typedef unsigned __int32 cl_uint2[2]; -typedef unsigned __int32 cl_uint4[4]; -typedef unsigned __int32 cl_uint8[8]; -typedef unsigned __int32 cl_uint16[16]; - -typedef signed __int64 cl_long2[2]; -typedef signed __int64 cl_long4[4]; -typedef signed __int64 cl_long8[8]; -typedef signed __int64 cl_long16[16]; -typedef unsigned __int64 cl_ulong2[2]; -typedef unsigned __int64 cl_ulong4[4]; -typedef unsigned __int64 cl_ulong8[8]; -typedef unsigned __int64 cl_ulong16[16]; - -typedef float cl_float2[2]; -typedef float cl_float4[4]; -typedef float cl_float8[8]; -typedef float cl_float16[16]; - -typedef double cl_double2[2]; -typedef double cl_double4[4]; -typedef double cl_double8[8]; -typedef double cl_double16[16]; -/* There are no vector types for half */ - -#else - -#include - -/* scalar types */ -typedef int8_t cl_char; -typedef uint8_t cl_uchar; -typedef int16_t cl_short __attribute__((aligned(2))); -typedef uint16_t cl_ushort __attribute__((aligned(2))); -typedef int32_t cl_int __attribute__((aligned(4))); -typedef uint32_t cl_uint __attribute__((aligned(4))); -typedef int64_t cl_long __attribute__((aligned(8))); -typedef uint64_t cl_ulong __attribute__((aligned(8))); - -typedef uint16_t cl_half __attribute__((aligned(2))); -typedef float cl_float __attribute__((aligned(4))); -typedef double cl_double __attribute__((aligned(8))); - -/* -* Vector types -* -* Note: OpenCL requires that all types be naturally aligned. -* This means that vector types must be naturally aligned. -* For example, a vector of four floats must be aligned to -* a 16 byte boundary (calculated as 4 * the natural 4-byte -* alignment of the float). The alignment qualifiers here -* will only function properly if your compiler supports them -* and if you don't actively work to defeat them. For example, -* in order for a cl_float4 to be 16 byte aligned in a struct, -* the start of the struct must itself be 16-byte aligned. -* -* Maintaining proper alignment is the user's responsibility. -*/ -typedef int8_t cl_char2[2] __attribute__((aligned(2))); -typedef int8_t cl_char4[4] __attribute__((aligned(4))); -typedef int8_t cl_char8[8] __attribute__((aligned(8))); -typedef int8_t cl_char16[16] __attribute__((aligned(16))); -typedef uint8_t cl_uchar2[2] __attribute__((aligned(2))); -typedef uint8_t cl_uchar4[4] __attribute__((aligned(4))); -typedef uint8_t cl_uchar8[8] __attribute__((aligned(8))); -typedef uint8_t cl_uchar16[16] __attribute__((aligned(16))); - -typedef int16_t cl_short2[2] __attribute__((aligned(4))); -typedef int16_t cl_short4[4] __attribute__((aligned(8))); -typedef int16_t cl_short8[8] __attribute__((aligned(16))); -typedef int16_t cl_short16[16] __attribute__((aligned(32))); -typedef uint16_t cl_ushort2[2] __attribute__((aligned(4))); -typedef uint16_t cl_ushort4[4] __attribute__((aligned(8))); -typedef uint16_t cl_ushort8[8] __attribute__((aligned(16))); -typedef uint16_t cl_ushort16[16] __attribute__((aligned(32))); - -typedef int32_t cl_int2[2] __attribute__((aligned(8))); -typedef int32_t cl_int4[4] __attribute__((aligned(16))); -typedef int32_t cl_int8[8] __attribute__((aligned(32))); -typedef int32_t cl_int16[16] __attribute__((aligned(64))); -typedef uint32_t cl_uint2[2] __attribute__((aligned(8))); -typedef uint32_t cl_uint4[4] __attribute__((aligned(16))); -typedef uint32_t cl_uint8[8] __attribute__((aligned(32))); -typedef uint32_t cl_uint16[16] __attribute__((aligned(64))); - -typedef int64_t cl_long2[2] __attribute__((aligned(16))); -typedef int64_t cl_long4[4] __attribute__((aligned(32))); -typedef int64_t cl_long8[8] __attribute__((aligned(64))); -typedef int64_t cl_long16[16] __attribute__((aligned(128))); -typedef uint64_t cl_ulong2[2] __attribute__((aligned(16))); -typedef uint64_t cl_ulong4[4] __attribute__((aligned(32))); -typedef uint64_t cl_ulong8[8] __attribute__((aligned(64))); -typedef uint64_t cl_ulong16[16] __attribute__((aligned(128))); - -typedef float cl_float2[2] __attribute__((aligned(8))); -typedef float cl_float4[4] __attribute__((aligned(16))); -typedef float cl_float8[8] __attribute__((aligned(32))); -typedef float cl_float16[16] __attribute__((aligned(64))); - -typedef double cl_double2[2] __attribute__((aligned(16))); -typedef double cl_double4[4] __attribute__((aligned(32))); -typedef double cl_double8[8] __attribute__((aligned(64))); -typedef double cl_double16[16] __attribute__((aligned(128))); - -/* There are no vector types for half */ - -#endif - -/******************************************************************************/ - -// Macro names and corresponding values defined by OpenCL - -#define CL_CHAR_BIT 8 -#define CL_SCHAR_MAX 127 -#define CL_SCHAR_MIN (-127-1) -#define CL_CHAR_MAX CL_SCHAR_MAX -#define CL_CHAR_MIN CL_SCHAR_MIN -#define CL_UCHAR_MAX 255 -#define CL_SHRT_MAX 32767 -#define CL_SHRT_MIN (-32767-1) -#define CL_USHRT_MAX 65535 -#define CL_INT_MAX 2147483647 -#define CL_INT_MIN (-2147483647-1) -#define CL_UINT_MAX 0xffffffffU -#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) -#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) -#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) - -#define CL_FLT_DIG 6 -#define CL_FLT_MANT_DIG 24 -#define CL_FLT_MAX_10_EXP +38 -#define CL_FLT_MAX_EXP +128 -#define CL_FLT_MIN_10_EXP -37 -#define CL_FLT_MIN_EXP -125 -#define CL_FLT_RADIX 2 -#if defined(_MSC_VER) -// MSVC doesn't understand hex floats -#define CL_FLT_MAX 3.402823466e+38F -#define CL_FLT_MIN 1.175494351e-38F -#define CL_FLT_EPSILON 1.192092896e-07F -#else -#define CL_FLT_MAX 0x1.fffffep127f -#define CL_FLT_MIN 0x1.0p-126f -#define CL_FLT_EPSILON 0x1.0p-23f -#endif - -#define CL_DBL_DIG 15 -#define CL_DBL_MANT_DIG 53 -#define CL_DBL_MAX_10_EXP +308 -#define CL_DBL_MAX_EXP +1024 -#define CL_DBL_MIN_10_EXP -307 -#define CL_DBL_MIN_EXP -1021 -#define CL_DBL_RADIX 2 -#if defined(_MSC_VER) -// MSVC doesn't understand hex floats -#define CL_DBL_MAX 1.7976931348623158e+308 -#define CL_DBL_MIN 2.2250738585072014e-308 -#define CL_DBL_EPSILON 2.2204460492503131e-016 -#else -#define CL_DBL_MAX 0x1.fffffffffffffp1023 -#define CL_DBL_MIN 0x1.0p-1022 -#define CL_DBL_EPSILON 0x1.0p-52 -#endif - -#include - - -// CL.h contents -/******************************************************************************/ - -typedef struct _cl_platform_id * cl_platform_id; -typedef struct _cl_device_id * cl_device_id; -typedef struct _cl_context * cl_context; -typedef struct _cl_command_queue * cl_command_queue; -typedef struct _cl_mem * cl_mem; -typedef struct _cl_program * cl_program; -typedef struct _cl_kernel * cl_kernel; -typedef struct _cl_event * cl_event; -typedef struct _cl_sampler * cl_sampler; - -typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ -typedef cl_ulong cl_bitfield; -typedef cl_bitfield cl_device_type; -typedef cl_uint cl_platform_info; -typedef cl_uint cl_device_info; -typedef cl_bitfield cl_device_address_info; -typedef cl_bitfield cl_device_fp_config; -typedef cl_uint cl_device_mem_cache_type; -typedef cl_uint cl_device_local_mem_type; -typedef cl_bitfield cl_device_exec_capabilities; -typedef cl_bitfield cl_command_queue_properties; - -typedef intptr_t cl_context_properties; -typedef cl_uint cl_context_info; -typedef cl_uint cl_command_queue_info; -typedef cl_uint cl_channel_order; -typedef cl_uint cl_channel_type; -typedef cl_bitfield cl_mem_flags; -typedef cl_uint cl_mem_object_type; -typedef cl_uint cl_mem_info; -typedef cl_uint cl_image_info; -typedef cl_uint cl_addressing_mode; -typedef cl_uint cl_filter_mode; -typedef cl_uint cl_sampler_info; -typedef cl_bitfield cl_map_flags; -typedef cl_uint cl_program_info; -typedef cl_uint cl_program_build_info; -typedef cl_int cl_build_status; -typedef cl_uint cl_kernel_info; -typedef cl_uint cl_kernel_work_group_info; -typedef cl_uint cl_event_info; -typedef cl_uint cl_command_type; -typedef cl_uint cl_profiling_info; - -typedef struct _cl_image_format { - cl_channel_order image_channel_order; - cl_channel_type image_channel_data_type; -} cl_image_format; - - - -/******************************************************************************/ - -// Error Codes -#define CL_SUCCESS 0 -#define CL_DEVICE_NOT_FOUND -1 -#define CL_DEVICE_NOT_AVAILABLE -2 -#define CL_COMPILER_NOT_AVAILABLE -3 -#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4 -#define CL_OUT_OF_RESOURCES -5 -#define CL_OUT_OF_HOST_MEMORY -6 -#define CL_PROFILING_INFO_NOT_AVAILABLE -7 -#define CL_MEM_COPY_OVERLAP -8 -#define CL_IMAGE_FORMAT_MISMATCH -9 -#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10 -#define CL_BUILD_PROGRAM_FAILURE -11 -#define CL_MAP_FAILURE -12 - -#define CL_INVALID_VALUE -30 -#define CL_INVALID_DEVICE_TYPE -31 -#define CL_INVALID_PLATFORM -32 -#define CL_INVALID_DEVICE -33 -#define CL_INVALID_CONTEXT -34 -#define CL_INVALID_QUEUE_PROPERTIES -35 -#define CL_INVALID_COMMAND_QUEUE -36 -#define CL_INVALID_HOST_PTR -37 -#define CL_INVALID_MEM_OBJECT -38 -#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39 -#define CL_INVALID_IMAGE_SIZE -40 -#define CL_INVALID_SAMPLER -41 -#define CL_INVALID_BINARY -42 -#define CL_INVALID_BUILD_OPTIONS -43 -#define CL_INVALID_PROGRAM -44 -#define CL_INVALID_PROGRAM_EXECUTABLE -45 -#define CL_INVALID_KERNEL_NAME -46 -#define CL_INVALID_KERNEL_DEFINITION -47 -#define CL_INVALID_KERNEL -48 -#define CL_INVALID_ARG_INDEX -49 -#define CL_INVALID_ARG_VALUE -50 -#define CL_INVALID_ARG_SIZE -51 -#define CL_INVALID_KERNEL_ARGS -52 -#define CL_INVALID_WORK_DIMENSION -53 -#define CL_INVALID_WORK_GROUP_SIZE -54 -#define CL_INVALID_WORK_ITEM_SIZE -55 -#define CL_INVALID_GLOBAL_OFFSET -56 -#define CL_INVALID_EVENT_WAIT_LIST -57 -#define CL_INVALID_EVENT -58 -#define CL_INVALID_OPERATION -59 -#define CL_INVALID_GL_OBJECT -60 -#define CL_INVALID_BUFFER_SIZE -61 -#define CL_INVALID_MIP_LEVEL -62 -#define CL_INVALID_GLOBAL_WORK_SIZE -63 - -// OpenCL Version -#define CL_VERSION_1_0 1 - -// cl_bool -#define CL_FALSE 0 -#define CL_TRUE 1 - -// cl_platform_info -#define CL_PLATFORM_PROFILE 0x0900 -#define CL_PLATFORM_VERSION 0x0901 -#define CL_PLATFORM_NAME 0x0902 -#define CL_PLATFORM_VENDOR 0x0903 -#define CL_PLATFORM_EXTENSIONS 0x0904 - -// cl_device_type - bitfield -#define CL_DEVICE_TYPE_DEFAULT (1 << 0) -#define CL_DEVICE_TYPE_CPU (1 << 1) -#define CL_DEVICE_TYPE_GPU (1 << 2) -#define CL_DEVICE_TYPE_ACCELERATOR (1 << 3) -#define CL_DEVICE_TYPE_ALL 0xFFFFFFFF - -// cl_device_info -#define CL_DEVICE_TYPE 0x1000 -#define CL_DEVICE_VENDOR_ID 0x1001 -#define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002 -#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003 -#define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004 -#define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005 -#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006 -#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007 -#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008 -#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009 -#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A -#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B -#define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C -#define CL_DEVICE_ADDRESS_BITS 0x100D -#define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E -#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F -#define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010 -#define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011 -#define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012 -#define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013 -#define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014 -#define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015 -#define CL_DEVICE_IMAGE_SUPPORT 0x1016 -#define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017 -#define CL_DEVICE_MAX_SAMPLERS 0x1018 -#define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019 -#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A -#define CL_DEVICE_SINGLE_FP_CONFIG 0x101B -#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C -#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D -#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E -#define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F -#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020 -#define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021 -#define CL_DEVICE_LOCAL_MEM_TYPE 0x1022 -#define CL_DEVICE_LOCAL_MEM_SIZE 0x1023 -#define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024 -#define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025 -#define CL_DEVICE_ENDIAN_LITTLE 0x1026 -#define CL_DEVICE_AVAILABLE 0x1027 -#define CL_DEVICE_COMPILER_AVAILABLE 0x1028 -#define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029 -#define CL_DEVICE_QUEUE_PROPERTIES 0x102A -#define CL_DEVICE_NAME 0x102B -#define CL_DEVICE_VENDOR 0x102C -#define CL_DRIVER_VERSION 0x102D -#define CL_DEVICE_PROFILE 0x102E -#define CL_DEVICE_VERSION 0x102F -#define CL_DEVICE_EXTENSIONS 0x1030 -#define CL_DEVICE_PLATFORM 0x1031 - -// cl_device_fp_config - bitfield -#define CL_FP_DENORM (1 << 0) -#define CL_FP_INF_NAN (1 << 1) -#define CL_FP_ROUND_TO_NEAREST (1 << 2) -#define CL_FP_ROUND_TO_ZERO (1 << 3) -#define CL_FP_ROUND_TO_INF (1 << 4) -#define CL_FP_FMA (1 << 5) - -// cl_device_mem_cache_type -#define CL_NONE 0x0 -#define CL_READ_ONLY_CACHE 0x1 -#define CL_READ_WRITE_CACHE 0x2 - -// cl_device_local_mem_type -#define CL_LOCAL 0x1 -#define CL_GLOBAL 0x2 - -// cl_device_exec_capabilities - bitfield -#define CL_EXEC_KERNEL (1 << 0) -#define CL_EXEC_NATIVE_KERNEL (1 << 1) - -// cl_command_queue_properties - bitfield -#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0) -#define CL_QUEUE_PROFILING_ENABLE (1 << 1) - -// cl_context_info -#define CL_CONTEXT_REFERENCE_COUNT 0x1080 -#define CL_CONTEXT_DEVICES 0x1081 -#define CL_CONTEXT_PROPERTIES 0x1082 - -// cl_context_properties -#define CL_CONTEXT_PLATFORM 0x1084 - -// cl_command_queue_info -#define CL_QUEUE_CONTEXT 0x1090 -#define CL_QUEUE_DEVICE 0x1091 -#define CL_QUEUE_REFERENCE_COUNT 0x1092 -#define CL_QUEUE_PROPERTIES 0x1093 - -// cl_mem_flags - bitfield -#define CL_MEM_READ_WRITE (1 << 0) -#define CL_MEM_WRITE_ONLY (1 << 1) -#define CL_MEM_READ_ONLY (1 << 2) -#define CL_MEM_USE_HOST_PTR (1 << 3) -#define CL_MEM_ALLOC_HOST_PTR (1 << 4) -#define CL_MEM_COPY_HOST_PTR (1 << 5) - -// cl_channel_order -#define CL_R 0x10B0 -#define CL_A 0x10B1 -#define CL_RG 0x10B2 -#define CL_RA 0x10B3 -#define CL_RGB 0x10B4 -#define CL_RGBA 0x10B5 -#define CL_BGRA 0x10B6 -#define CL_ARGB 0x10B7 -#define CL_INTENSITY 0x10B8 -#define CL_LUMINANCE 0x10B9 - -// cl_channel_type -#define CL_SNORM_INT8 0x10D0 -#define CL_SNORM_INT16 0x10D1 -#define CL_UNORM_INT8 0x10D2 -#define CL_UNORM_INT16 0x10D3 -#define CL_UNORM_SHORT_565 0x10D4 -#define CL_UNORM_SHORT_555 0x10D5 -#define CL_UNORM_INT_101010 0x10D6 -#define CL_SIGNED_INT8 0x10D7 -#define CL_SIGNED_INT16 0x10D8 -#define CL_SIGNED_INT32 0x10D9 -#define CL_UNSIGNED_INT8 0x10DA -#define CL_UNSIGNED_INT16 0x10DB -#define CL_UNSIGNED_INT32 0x10DC -#define CL_HALF_FLOAT 0x10DD -#define CL_FLOAT 0x10DE - -// cl_mem_object_type -#define CL_MEM_OBJECT_BUFFER 0x10F0 -#define CL_MEM_OBJECT_IMAGE2D 0x10F1 -#define CL_MEM_OBJECT_IMAGE3D 0x10F2 - -// cl_mem_info -#define CL_MEM_TYPE 0x1100 -#define CL_MEM_FLAGS 0x1101 -#define CL_MEM_SIZE 0x1102 -#define CL_MEM_HOST_PTR 0x1103 -#define CL_MEM_MAP_COUNT 0x1104 -#define CL_MEM_REFERENCE_COUNT 0x1105 -#define CL_MEM_CONTEXT 0x1106 - -// cl_image_info -#define CL_IMAGE_FORMAT 0x1110 -#define CL_IMAGE_ELEMENT_SIZE 0x1111 -#define CL_IMAGE_ROW_PITCH 0x1112 -#define CL_IMAGE_SLICE_PITCH 0x1113 -#define CL_IMAGE_WIDTH 0x1114 -#define CL_IMAGE_HEIGHT 0x1115 -#define CL_IMAGE_DEPTH 0x1116 - -// cl_addressing_mode -#define CL_ADDRESS_NONE 0x1130 -#define CL_ADDRESS_CLAMP_TO_EDGE 0x1131 -#define CL_ADDRESS_CLAMP 0x1132 -#define CL_ADDRESS_REPEAT 0x1133 - -// cl_filter_mode -#define CL_FILTER_NEAREST 0x1140 -#define CL_FILTER_LINEAR 0x1141 - -// cl_sampler_info -#define CL_SAMPLER_REFERENCE_COUNT 0x1150 -#define CL_SAMPLER_CONTEXT 0x1151 -#define CL_SAMPLER_NORMALIZED_COORDS 0x1152 -#define CL_SAMPLER_ADDRESSING_MODE 0x1153 -#define CL_SAMPLER_FILTER_MODE 0x1154 - -// cl_map_flags - bitfield -#define CL_MAP_READ (1 << 0) -#define CL_MAP_WRITE (1 << 1) - -// cl_program_info -#define CL_PROGRAM_REFERENCE_COUNT 0x1160 -#define CL_PROGRAM_CONTEXT 0x1161 -#define CL_PROGRAM_NUM_DEVICES 0x1162 -#define CL_PROGRAM_DEVICES 0x1163 -#define CL_PROGRAM_SOURCE 0x1164 -#define CL_PROGRAM_BINARY_SIZES 0x1165 -#define CL_PROGRAM_BINARIES 0x1166 - -// cl_program_build_info -#define CL_PROGRAM_BUILD_STATUS 0x1181 -#define CL_PROGRAM_BUILD_OPTIONS 0x1182 -#define CL_PROGRAM_BUILD_LOG 0x1183 - -// cl_build_status -#define CL_BUILD_SUCCESS 0 -#define CL_BUILD_NONE -1 -#define CL_BUILD_ERROR -2 -#define CL_BUILD_IN_PROGRESS -3 - -// cl_kernel_info -#define CL_KERNEL_FUNCTION_NAME 0x1190 -#define CL_KERNEL_NUM_ARGS 0x1191 -#define CL_KERNEL_REFERENCE_COUNT 0x1192 -#define CL_KERNEL_CONTEXT 0x1193 -#define CL_KERNEL_PROGRAM 0x1194 - -// cl_kernel_work_group_info -#define CL_KERNEL_WORK_GROUP_SIZE 0x11B0 -#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1 -#define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2 - -// cl_event_info -#define CL_EVENT_COMMAND_QUEUE 0x11D0 -#define CL_EVENT_COMMAND_TYPE 0x11D1 -#define CL_EVENT_REFERENCE_COUNT 0x11D2 -#define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3 - -// cl_command_type -#define CL_COMMAND_NDRANGE_KERNEL 0x11F0 -#define CL_COMMAND_TASK 0x11F1 -#define CL_COMMAND_NATIVE_KERNEL 0x11F2 -#define CL_COMMAND_READ_BUFFER 0x11F3 -#define CL_COMMAND_WRITE_BUFFER 0x11F4 -#define CL_COMMAND_COPY_BUFFER 0x11F5 -#define CL_COMMAND_READ_IMAGE 0x11F6 -#define CL_COMMAND_WRITE_IMAGE 0x11F7 -#define CL_COMMAND_COPY_IMAGE 0x11F8 -#define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9 -#define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA -#define CL_COMMAND_MAP_BUFFER 0x11FB -#define CL_COMMAND_MAP_IMAGE 0x11FC -#define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD -#define CL_COMMAND_MARKER 0x11FE -#define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF -#define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200 - -// command execution status -#define CL_COMPLETE 0x0 -#define CL_RUNNING 0x1 -#define CL_SUBMITTED 0x2 -#define CL_QUEUED 0x3 - -// cl_profiling_info -#define CL_PROFILING_COMMAND_QUEUED 0x1280 -#define CL_PROFILING_COMMAND_SUBMIT 0x1281 -#define CL_PROFILING_COMMAND_START 0x1282 -#define CL_PROFILING_COMMAND_END 0x1283 - -/********************************************************************************************************/ - -/********************************************************************************************************/ - -// Function signature typedef's - -// Platform API -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETPLATFORMIDS)(cl_uint /* num_entries */, - cl_platform_id * /* platforms */, - cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETPLATFORMINFO)(cl_platform_id /* platform */, - cl_platform_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -// Device APIs -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETDEVICEIDS)(cl_platform_id /* platform */, - cl_device_type /* device_type */, - cl_uint /* num_entries */, - cl_device_id * /* devices */, - cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETDEVICEINFO)(cl_device_id /* device */, - cl_device_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -// Context APIs -typedef CL_API_ENTRY cl_context (CL_API_CALL * -PFNCLCREATECONTEXT)(const cl_context_properties * /* properties */, - cl_uint /* num_devices */, - const cl_device_id * /* devices */, - void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */, - void * /* user_data */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_context (CL_API_CALL * -PFNCLCREATECONTEXTFROMTYPE)(const cl_context_properties * /* properties */, - cl_device_type /* device_type */, - void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */, - void * /* user_data */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRETAINCONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRELEASECONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETCONTEXTINFO)(cl_context /* context */, - cl_context_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -// Command Queue APIs -typedef CL_API_ENTRY cl_command_queue (CL_API_CALL * -PFNCLCREATECOMMANDQUEUE)(cl_context /* context */, - cl_device_id /* device */, - cl_command_queue_properties /* properties */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRETAINCOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRELEASECOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETCOMMANDQUEUEINFO)(cl_command_queue /* command_queue */, - cl_command_queue_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLSETCOMMANDQUEUEPROPERTY)(cl_command_queue /* command_queue */, - cl_command_queue_properties /* properties */, - cl_bool /* enable */, - cl_command_queue_properties * /* old_properties */) CL_API_SUFFIX__VERSION_1_0; - -// Memory Object APIs -typedef CL_API_ENTRY cl_mem (CL_API_CALL * -PFNCLCREATEBUFFER)(cl_context /* context */, - cl_mem_flags /* flags */, - size_t /* size */, - void * /* host_ptr */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_mem (CL_API_CALL * -PFNCLCREATEIMAGE2D)(cl_context /* context */, - cl_mem_flags /* flags */, - const cl_image_format * /* image_format */, - size_t /* image_width */, - size_t /* image_height */, - size_t /* image_row_pitch */, - void * /* host_ptr */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_mem (CL_API_CALL * -PFNCLCREATEIMAGE3D)(cl_context /* context */, - cl_mem_flags /* flags */, - const cl_image_format * /* image_format */, - size_t /* image_width */, - size_t /* image_height */, - size_t /* image_depth */, - size_t /* image_row_pitch */, - size_t /* image_slice_pitch */, - void * /* host_ptr */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRETAINMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRELEASEMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETSUPPORTEDIMAGEFORMATS)(cl_context /* context */, - cl_mem_flags /* flags */, - cl_mem_object_type /* image_type */, - cl_uint /* num_entries */, - cl_image_format * /* image_formats */, - cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETMEMOBJECTINFO)(cl_mem /* memobj */, - cl_mem_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETIMAGEINFO)(cl_mem /* image */, - cl_image_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -// Sampler APIs -typedef CL_API_ENTRY cl_sampler (CL_API_CALL * -PFNCLCREATESAMPLER)(cl_context /* context */, - cl_bool /* normalized_coords */, - cl_addressing_mode /* addressing_mode */, - cl_filter_mode /* filter_mode */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRETAINSAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRELEASESAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETSAMPLERINFO)(cl_sampler /* sampler */, - cl_sampler_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -// Program Object APIs -typedef CL_API_ENTRY cl_program (CL_API_CALL * -PFNCLCREATEPROGRAMWITHSOURCE)(cl_context /* context */, - cl_uint /* count */, - const char ** /* strings */, - const size_t * /* lengths */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_program (CL_API_CALL * -PFNCLCREATEPROGRAMWITHBINARY)(cl_context /* context */, - cl_uint /* num_devices */, - const cl_device_id * /* device_list */, - const size_t * /* lengths */, - const unsigned char ** /* binaries */, - cl_int * /* binary_status */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRETAINPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRELEASEPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLBUILDPROGRAM)(cl_program /* program */, - cl_uint /* num_devices */, - const cl_device_id * /* device_list */, - const char * /* options */, - void (*pfn_notify)(cl_program /* program */, void * /* user_data */), - void * /* user_data */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLUNLOADCOMPILER)(void) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETPROGRAMINFO)(cl_program /* program */, - cl_program_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETPROGRAMBUILDINFO)(cl_program /* program */, - cl_device_id /* device */, - cl_program_build_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -// Kernel Object APIs -typedef CL_API_ENTRY cl_kernel (CL_API_CALL * -PFNCLCREATEKERNEL)(cl_program /* program */, - const char * /* kernel_name */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLCREATEKERNELSINPROGRAM)(cl_program /* program */, - cl_uint /* num_kernels */, - cl_kernel * /* kernels */, - cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRETAINKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRELEASEKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLSETKERNELARG)(cl_kernel /* kernel */, - cl_uint /* arg_index */, - size_t /* arg_size */, - const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETKERNELINFO)(cl_kernel /* kernel */, - cl_kernel_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETKERNELWORKGROUPINFO)(cl_kernel /* kernel */, - cl_device_id /* device */, - cl_kernel_work_group_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -// Event Object APIs -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLWAITFOREVENTS)(cl_uint /* num_events */, - const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETEVENTINFO)(cl_event /* event */, - cl_event_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRETAINEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLRELEASEEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; - -// Profiling APIs -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLGETEVENTPROFILINGINFO)(cl_event /* event */, - cl_profiling_info /* param_name */, - size_t /* param_value_size */, - void * /* param_value */, - size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; - -// Flush and Finish APIs -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLFLUSH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLFINISH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; - -// Enqueued Commands APIs -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUEREADBUFFER)(cl_command_queue /* command_queue */, - cl_mem /* buffer */, - cl_bool /* blocking_read */, - size_t /* offset */, - size_t /* cb */, - void * /* ptr */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUEWRITEBUFFER)(cl_command_queue /* command_queue */, - cl_mem /* buffer */, - cl_bool /* blocking_write */, - size_t /* offset */, - size_t /* cb */, - const void * /* ptr */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUECOPYBUFFER)(cl_command_queue /* command_queue */, - cl_mem /* src_buffer */, - cl_mem /* dst_buffer */, - size_t /* src_offset */, - size_t /* dst_offset */, - size_t /* cb */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUEREADIMAGE)(cl_command_queue /* command_queue */, - cl_mem /* image */, - cl_bool /* blocking_read */, - const size_t * /* origin[3] */, - const size_t * /* region[3] */, - size_t /* row_pitch */, - size_t /* slice_pitch */, - void * /* ptr */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUEWRITEIMAGE)(cl_command_queue /* command_queue */, - cl_mem /* image */, - cl_bool /* blocking_write */, - const size_t * /* origin[3] */, - const size_t * /* region[3] */, - size_t /* input_row_pitch */, - size_t /* input_slice_pitch */, - const void * /* ptr */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUECOPYIMAGE)(cl_command_queue /* command_queue */, - cl_mem /* src_image */, - cl_mem /* dst_image */, - const size_t * /* src_origin[3] */, - const size_t * /* dst_origin[3] */, - const size_t * /* region[3] */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUECOPYIMAGETOBUFFER)(cl_command_queue /* command_queue */, - cl_mem /* src_image */, - cl_mem /* dst_buffer */, - const size_t * /* src_origin[3] */, - const size_t * /* region[3] */, - size_t /* dst_offset */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUECOPYBUFFERTOIMAGE)(cl_command_queue /* command_queue */, - cl_mem /* src_buffer */, - cl_mem /* dst_image */, - size_t /* src_offset */, - const size_t * /* dst_origin[3] */, - const size_t * /* region[3] */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY void * (CL_API_CALL * -PFNCLENQUEUEMAPBUFFER)(cl_command_queue /* command_queue */, - cl_mem /* buffer */, - cl_bool /* blocking_map */, - cl_map_flags /* map_flags */, - size_t /* offset */, - size_t /* cb */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY void * (CL_API_CALL * -PFNCLENQUEUEMAPIMAGE)(cl_command_queue /* command_queue */, - cl_mem /* image */, - cl_bool /* blocking_map */, - cl_map_flags /* map_flags */, - const size_t * /* origin[3] */, - const size_t * /* region[3] */, - size_t * /* image_row_pitch */, - size_t * /* image_slice_pitch */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */, - cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUEUNMAPMEMOBJECT)(cl_command_queue /* command_queue */, - cl_mem /* memobj */, - void * /* mapped_ptr */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUENDRANGEKERNEL)(cl_command_queue /* command_queue */, - cl_kernel /* kernel */, - cl_uint /* work_dim */, - const size_t * /* global_work_offset */, - const size_t * /* global_work_size */, - const size_t * /* local_work_size */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUETASK)(cl_command_queue /* command_queue */, - cl_kernel /* kernel */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUENATIVEKERNEL)(cl_command_queue /* command_queue */, - void (*user_func)(void *), - void * /* args */, - size_t /* cb_args */, - cl_uint /* num_mem_objects */, - const cl_mem * /* mem_list */, - const void ** /* args_mem_loc */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUEMARKER)(cl_command_queue /* command_queue */, - cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUEWAITFOREVENTS)(cl_command_queue /* command_queue */, - cl_uint /* num_events */, - const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; - -typedef CL_API_ENTRY cl_int (CL_API_CALL * -PFNCLENQUEUEBARRIER)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; - -// Extension function access -// -// Returns the extension function address for the given function name, -// or NULL if a valid function can not be found. The client must -// check to make sure the address is not NULL, before using or -// calling the returned function address. -// -typedef CL_API_ENTRY void * (CL_API_CALL * PFNCLGETEXTENSIONFUNCTIONADDRESS)(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0; - - -#define CLEW_STATIC - -#ifdef CLEW_STATIC -# define CLEWAPI extern -#else -# ifdef CLEW_BUILD -# define CLEWAPI extern __declspec(dllexport) -# else -# define CLEWAPI extern __declspec(dllimport) -# endif -#endif - -#if defined(_WIN32) -#define CLEW_FUN_EXPORT extern -#else -#define CLEW_FUN_EXPORT CLEWAPI -#endif - -#define CLEW_GET_FUN(x) x - - -// Variables holding function entry points -CLEW_FUN_EXPORT PFNCLGETPLATFORMIDS __oclGetPlatformIDs ; -CLEW_FUN_EXPORT PFNCLGETPLATFORMINFO __oclGetPlatformInfo ; -CLEW_FUN_EXPORT PFNCLGETDEVICEIDS __oclGetDeviceIDs ; -CLEW_FUN_EXPORT PFNCLGETDEVICEINFO __oclGetDeviceInfo ; -CLEW_FUN_EXPORT PFNCLCREATECONTEXT __oclCreateContext ; -CLEW_FUN_EXPORT PFNCLCREATECONTEXTFROMTYPE __oclCreateContextFromType ; -CLEW_FUN_EXPORT PFNCLRETAINCONTEXT __oclRetainContext ; -CLEW_FUN_EXPORT PFNCLRELEASECONTEXT __oclReleaseContext ; -CLEW_FUN_EXPORT PFNCLGETCONTEXTINFO __oclGetContextInfo ; -CLEW_FUN_EXPORT PFNCLCREATECOMMANDQUEUE __oclCreateCommandQueue ; -CLEW_FUN_EXPORT PFNCLRETAINCOMMANDQUEUE __oclRetainCommandQueue ; -CLEW_FUN_EXPORT PFNCLRELEASECOMMANDQUEUE __oclReleaseCommandQueue ; -CLEW_FUN_EXPORT PFNCLGETCOMMANDQUEUEINFO __oclGetCommandQueueInfo ; -CLEW_FUN_EXPORT PFNCLSETCOMMANDQUEUEPROPERTY __oclSetCommandQueueProperty ; -CLEW_FUN_EXPORT PFNCLCREATEBUFFER __oclCreateBuffer ; -CLEW_FUN_EXPORT PFNCLCREATEIMAGE2D __oclCreateImage2D ; -CLEW_FUN_EXPORT PFNCLCREATEIMAGE3D __oclCreateImage3D ; -CLEW_FUN_EXPORT PFNCLRETAINMEMOBJECT __oclRetainMemObject ; -CLEW_FUN_EXPORT PFNCLRELEASEMEMOBJECT __oclReleaseMemObject ; -CLEW_FUN_EXPORT PFNCLGETSUPPORTEDIMAGEFORMATS __oclGetSupportedImageFormats ; -CLEW_FUN_EXPORT PFNCLGETMEMOBJECTINFO __oclGetMemObjectInfo ; -CLEW_FUN_EXPORT PFNCLGETIMAGEINFO __oclGetImageInfo ; -CLEW_FUN_EXPORT PFNCLCREATESAMPLER __oclCreateSampler ; -CLEW_FUN_EXPORT PFNCLRETAINSAMPLER __oclRetainSampler ; -CLEW_FUN_EXPORT PFNCLRELEASESAMPLER __oclReleaseSampler ; -CLEW_FUN_EXPORT PFNCLGETSAMPLERINFO __oclGetSamplerInfo ; -CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHSOURCE __oclCreateProgramWithSource ; -CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHBINARY __oclCreateProgramWithBinary ; -CLEW_FUN_EXPORT PFNCLRETAINPROGRAM __oclRetainProgram ; -CLEW_FUN_EXPORT PFNCLRELEASEPROGRAM __oclReleaseProgram ; -CLEW_FUN_EXPORT PFNCLBUILDPROGRAM __oclBuildProgram ; -CLEW_FUN_EXPORT PFNCLUNLOADCOMPILER __oclUnloadCompiler ; -CLEW_FUN_EXPORT PFNCLGETPROGRAMINFO __oclGetProgramInfo ; -CLEW_FUN_EXPORT PFNCLGETPROGRAMBUILDINFO __oclGetProgramBuildInfo ; -CLEW_FUN_EXPORT PFNCLCREATEKERNEL __oclCreateKernel ; -CLEW_FUN_EXPORT PFNCLCREATEKERNELSINPROGRAM __oclCreateKernelsInProgram ; -CLEW_FUN_EXPORT PFNCLRETAINKERNEL __oclRetainKernel ; -CLEW_FUN_EXPORT PFNCLRELEASEKERNEL __oclReleaseKernel ; -CLEW_FUN_EXPORT PFNCLSETKERNELARG __oclSetKernelArg ; -CLEW_FUN_EXPORT PFNCLGETKERNELINFO __oclGetKernelInfo ; -CLEW_FUN_EXPORT PFNCLGETKERNELWORKGROUPINFO __oclGetKernelWorkGroupInfo ; -CLEW_FUN_EXPORT PFNCLWAITFOREVENTS __oclWaitForEvents ; -CLEW_FUN_EXPORT PFNCLGETEVENTINFO __oclGetEventInfo ; -CLEW_FUN_EXPORT PFNCLRETAINEVENT __oclRetainEvent ; -CLEW_FUN_EXPORT PFNCLRELEASEEVENT __oclReleaseEvent ; -CLEW_FUN_EXPORT PFNCLGETEVENTPROFILINGINFO __oclGetEventProfilingInfo ; -CLEW_FUN_EXPORT PFNCLFLUSH __oclFlush ; -CLEW_FUN_EXPORT PFNCLFINISH __oclFinish ; -CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFER __oclEnqueueReadBuffer ; -CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFER __oclEnqueueWriteBuffer ; -CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFER __oclEnqueueCopyBuffer ; -CLEW_FUN_EXPORT PFNCLENQUEUEREADIMAGE __oclEnqueueReadImage ; -CLEW_FUN_EXPORT PFNCLENQUEUEWRITEIMAGE __oclEnqueueWriteImage ; -CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGE __oclEnqueueCopyImage ; -CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGETOBUFFER __oclEnqueueCopyImageToBuffer ; -CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERTOIMAGE __oclEnqueueCopyBufferToImage ; -CLEW_FUN_EXPORT PFNCLENQUEUEMAPBUFFER __oclEnqueueMapBuffer ; -CLEW_FUN_EXPORT PFNCLENQUEUEMAPIMAGE __oclEnqueueMapImage ; -CLEW_FUN_EXPORT PFNCLENQUEUEUNMAPMEMOBJECT __oclEnqueueUnmapMemObject ; -CLEW_FUN_EXPORT PFNCLENQUEUENDRANGEKERNEL __oclEnqueueNDRangeKernel ; -CLEW_FUN_EXPORT PFNCLENQUEUETASK __oclEnqueueTask ; -CLEW_FUN_EXPORT PFNCLENQUEUENATIVEKERNEL __oclEnqueueNativeKernel ; -CLEW_FUN_EXPORT PFNCLENQUEUEMARKER __oclEnqueueMarker ; -CLEW_FUN_EXPORT PFNCLENQUEUEWAITFOREVENTS __oclEnqueueWaitForEvents ; -CLEW_FUN_EXPORT PFNCLENQUEUEBARRIER __oclEnqueueBarrier ; -CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESS __oclGetExtensionFunctionAddress ; - - -#define clGetPlatformIDs CLEW_GET_FUN(__oclGetPlatformIDs ) -#define clGetPlatformInfo CLEW_GET_FUN(__oclGetPlatformInfo ) -#define clGetDeviceIDs CLEW_GET_FUN(__oclGetDeviceIDs ) -#define clGetDeviceInfo CLEW_GET_FUN(__oclGetDeviceInfo ) -#define clCreateContext CLEW_GET_FUN(__oclCreateContext ) -#define clCreateContextFromType CLEW_GET_FUN(__oclCreateContextFromType ) -#define clRetainContext CLEW_GET_FUN(__oclRetainContext ) -#define clReleaseContext CLEW_GET_FUN(__oclReleaseContext ) -#define clGetContextInfo CLEW_GET_FUN(__oclGetContextInfo ) -#define clCreateCommandQueue CLEW_GET_FUN(__oclCreateCommandQueue ) -#define clRetainCommandQueue CLEW_GET_FUN(__oclRetainCommandQueue ) -#define clReleaseCommandQueue CLEW_GET_FUN(__oclReleaseCommandQueue ) -#define clGetCommandQueueInfo CLEW_GET_FUN(__oclGetCommandQueueInfo ) -#define clSetCommandQueueProperty CLEW_GET_FUN(__oclSetCommandQueueProperty ) -#define clCreateBuffer CLEW_GET_FUN(__oclCreateBuffer ) -#define clCreateImage2D CLEW_GET_FUN(__oclCreateImage2D ) -#define clCreateImage3D CLEW_GET_FUN(__oclCreateImage3D ) -#define clRetainMemObject CLEW_GET_FUN(__oclRetainMemObject ) -#define clReleaseMemObject CLEW_GET_FUN(__oclReleaseMemObject ) -#define clGetSupportedImageFormats CLEW_GET_FUN(__oclGetSupportedImageFormats ) -#define clGetMemObjectInfo CLEW_GET_FUN(__oclGetMemObjectInfo ) -#define clGetImageInfo CLEW_GET_FUN(__oclGetImageInfo ) -#define clCreateSampler CLEW_GET_FUN(__oclCreateSampler ) -#define clRetainSampler CLEW_GET_FUN(__oclRetainSampler ) -#define clReleaseSampler CLEW_GET_FUN(__oclReleaseSampler ) -#define clGetSamplerInfo CLEW_GET_FUN(__oclGetSamplerInfo ) -#define clCreateProgramWithSource CLEW_GET_FUN(__oclCreateProgramWithSource ) -#define clCreateProgramWithBinary CLEW_GET_FUN(__oclCreateProgramWithBinary ) -#define clRetainProgram CLEW_GET_FUN(__oclRetainProgram ) -#define clReleaseProgram CLEW_GET_FUN(__oclReleaseProgram ) -#define clBuildProgram CLEW_GET_FUN(__oclBuildProgram ) -#define clUnloadCompiler CLEW_GET_FUN(__oclUnloadCompiler ) -#define clGetProgramInfo CLEW_GET_FUN(__oclGetProgramInfo ) -#define clGetProgramBuildInfo CLEW_GET_FUN(__oclGetProgramBuildInfo ) -#define clCreateKernel CLEW_GET_FUN(__oclCreateKernel ) -#define clCreateKernelsInProgram CLEW_GET_FUN(__oclCreateKernelsInProgram ) -#define clRetainKernel CLEW_GET_FUN(__oclRetainKernel ) -#define clReleaseKernel CLEW_GET_FUN(__oclReleaseKernel ) -#define clSetKernelArg CLEW_GET_FUN(__oclSetKernelArg ) -#define clGetKernelInfo CLEW_GET_FUN(__oclGetKernelInfo ) -#define clGetKernelWorkGroupInfo CLEW_GET_FUN(__oclGetKernelWorkGroupInfo ) -#define clWaitForEvents CLEW_GET_FUN(__oclWaitForEvents ) -#define clGetEventInfo CLEW_GET_FUN(__oclGetEventInfo ) -#define clRetainEvent CLEW_GET_FUN(__oclRetainEvent ) -#define clReleaseEvent CLEW_GET_FUN(__oclReleaseEvent ) -#define clGetEventProfilingInfo CLEW_GET_FUN(__oclGetEventProfilingInfo ) -#define clFlush CLEW_GET_FUN(__oclFlush ) -#define clFinish CLEW_GET_FUN(__oclFinish ) -#define clEnqueueReadBuffer CLEW_GET_FUN(__oclEnqueueReadBuffer ) -#define clEnqueueWriteBuffer CLEW_GET_FUN(__oclEnqueueWriteBuffer ) -#define clEnqueueCopyBuffer CLEW_GET_FUN(__oclEnqueueCopyBuffer ) -#define clEnqueueReadImage CLEW_GET_FUN(__oclEnqueueReadImage ) -#define clEnqueueWriteImage CLEW_GET_FUN(__oclEnqueueWriteImage ) -#define clEnqueueCopyImage CLEW_GET_FUN(__oclEnqueueCopyImage ) -#define clEnqueueCopyImageToBuffer CLEW_GET_FUN(__oclEnqueueCopyImageToBuffer ) -#define clEnqueueCopyBufferToImage CLEW_GET_FUN(__oclEnqueueCopyBufferToImage ) -#define clEnqueueMapBuffer CLEW_GET_FUN(__oclEnqueueMapBuffer ) -#define clEnqueueMapImage CLEW_GET_FUN(__oclEnqueueMapImage ) -#define clEnqueueUnmapMemObject CLEW_GET_FUN(__oclEnqueueUnmapMemObject ) -#define clEnqueueNDRangeKernel CLEW_GET_FUN(__oclEnqueueNDRangeKernel ) -#define clEnqueueTask CLEW_GET_FUN(__oclEnqueueTask ) -#define clEnqueueNativeKernel CLEW_GET_FUN(__oclEnqueueNativeKernel ) -#define clEnqueueMarker CLEW_GET_FUN(__oclEnqueueMarker ) -#define clEnqueueWaitForEvents CLEW_GET_FUN(__oclEnqueueWaitForEvents ) -#define clEnqueueBarrier CLEW_GET_FUN(__oclEnqueueBarrier ) -#define clGetExtensionFunctionAddress CLEW_GET_FUN(__oclGetExtensionFunctionAddress ) - -#endif // CLCC_GENERATE_DOCUMENTATION - -#define CLEW_SUCCESS 0 //!< Success error code -#define CLEW_ERROR_OPEN_FAILED -1 //!< Error code for failing to open the dynamic library -#define CLEW_ERROR_ATEXIT_FAILED -2 //!< Error code for failing to queue the closing of the dynamic library to atexit() - -//! \brief Load OpenCL dynamic library and set function entry points -int clewInit (const char*); -//! \brief Convert an OpenCL error code to its string equivalent -const char* clewErrorString (cl_int error); - -#ifdef __cplusplus -} -#endif - -#endif // CLCC_CLEW_HPP_INCLUDED diff --git a/source/blender/rigidbody/CMakeLists.txt b/source/blender/rigidbody/CMakeLists.txt deleted file mode 100644 index 903fbe66f01..00000000000 --- a/source/blender/rigidbody/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# The Original Code is Copyright (C) 2006, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# ***** END GPL LICENSE BLOCK ***** - -SET(INC - . - ../../../extern/bullet2/src -) - -set(SRC - rb_bullet_api.cpp - - RBI_api.h -) - -blender_add_lib(bf_rigidbody "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/rigidbody/RBI_api.h b/source/blender/rigidbody/RBI_api.h deleted file mode 100644 index ee5006f2838..00000000000 --- a/source/blender/rigidbody/RBI_api.h +++ /dev/null @@ -1,309 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2013 Blender Foundation, - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Joshua Leung, Sergej Reich - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file RBI_api.h - * \ingroup RigidBody - * \brief Rigid Body API for interfacing with external Physics Engines - */ - -#ifndef __RB_API_H__ -#define __RB_API_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* API Notes: - * Currently, this API is optimised for Bullet RigidBodies, and doesn't - * take into account other Physics Engines. Some tweaking may be necessary - * to allow other systems to be used, in particular there may be references - * to datatypes that aren't used here... - * - * -- Joshua Leung (22 June 2010) - */ - -/* ********************************** */ -/* Partial Type Defines - Aliases for the type of data we store */ - -// ---------- - -/* Dynamics World */ -typedef struct rbDynamicsWorld rbDynamicsWorld; - -/* Rigid Body */ -typedef struct rbRigidBody rbRigidBody; - -/* Collision Shape */ -typedef struct rbCollisionShape rbCollisionShape; - -/* Mesh Data (for Collision Shapes of Meshes) */ -typedef struct rbMeshData rbMeshData; - -/* Constraint */ -typedef struct rbConstraint rbConstraint; - -/* ********************************** */ -/* Dynamics World Methods */ - -/* Setup ---------------------------- */ - -/* Create a new dynamics world instance */ -// TODO: add args to set the type of constraint solvers, etc. -extern rbDynamicsWorld *RB_dworld_new(const float gravity[3]); - -/* Delete the given dynamics world, and free any extra data it may require */ -extern void RB_dworld_delete(rbDynamicsWorld *world); - -/* Settings ------------------------- */ - -/* Gravity */ -extern void RB_dworld_get_gravity(rbDynamicsWorld *world, float g_out[3]); -extern void RB_dworld_set_gravity(rbDynamicsWorld *world, const float g_in[3]); - -/* Constraint Solver */ -extern void RB_dworld_set_solver_iterations(rbDynamicsWorld *world, int num_solver_iterations); -/* Split Impulse */ -extern void RB_dworld_set_split_impulse(rbDynamicsWorld *world, int split_impulse); - -/* Simulation ----------------------- */ - -/* Step the simulation by the desired amount (in seconds) with extra controls on substep sizes and maximum substeps */ -extern void RB_dworld_step_simulation(rbDynamicsWorld *world, float timeStep, int maxSubSteps, float timeSubStep); - -/* Export -------------------------- */ - -/* Exports the dynamics world to physics simulator's serialisation format */ -void RB_dworld_export(rbDynamicsWorld *world, const char *filename); - -/* ********************************** */ -/* Rigid Body Methods */ - -/* Setup ---------------------------- */ - -/* Add RigidBody to dynamics world */ -extern void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *body, int col_groups); - -/* Remove RigidBody from dynamics world */ -extern void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *body); - -/* ............ */ - -/* Create new RigidBody instance */ -extern rbRigidBody *RB_body_new(rbCollisionShape *shape, const float loc[3], const float rot[4]); - -/* Delete the given RigidBody instance */ -extern void RB_body_delete(rbRigidBody *body); - -/* Settings ------------------------- */ - -/* 'Type' */ -extern void RB_body_set_type(rbRigidBody *body, int type, float mass); - -/* ............ */ - -/* Collision Shape */ -extern void RB_body_set_collision_shape(rbRigidBody *body, rbCollisionShape *shape); - -/* ............ */ - -/* Mass */ -extern float RB_body_get_mass(rbRigidBody *body); -extern void RB_body_set_mass(rbRigidBody *body, float value); - -/* Friction */ -extern float RB_body_get_friction(rbRigidBody *body); -extern void RB_body_set_friction(rbRigidBody *body, float value); - -/* Restitution */ -extern float RB_body_get_restitution(rbRigidBody *body); -extern void RB_body_set_restitution(rbRigidBody *body, float value); - -/* Damping */ -extern float RB_body_get_linear_damping(rbRigidBody *body); -extern void RB_body_set_linear_damping(rbRigidBody *body, float value); - -extern float RB_body_get_angular_damping(rbRigidBody *body); -extern void RB_body_set_angular_damping(rbRigidBody *body, float value); - -extern void RB_body_set_damping(rbRigidBody *object, float linear, float angular); - -/* Sleeping Thresholds */ -extern float RB_body_get_linear_sleep_thresh(rbRigidBody *body); -extern void RB_body_set_linear_sleep_thresh(rbRigidBody *body, float value); - -extern float RB_body_get_angular_sleep_thresh(rbRigidBody *body); -extern void RB_body_set_angular_sleep_thresh(rbRigidBody *body, float value); - -extern void RB_body_set_sleep_thresh(rbRigidBody *body, float linear, float angular); - -/* Linear Velocity */ -extern void RB_body_get_linear_velocity(rbRigidBody *body, float v_out[3]); -extern void RB_body_set_linear_velocity(rbRigidBody *body, const float v_in[3]); - -/* Angular Velocity */ -extern void RB_body_get_angular_velocity(rbRigidBody *body, float v_out[3]); -extern void RB_body_set_angular_velocity(rbRigidBody *body, const float v_in[3]); - -/* Linear/Angular Factor, used to lock translation/roation axes */ -extern void RB_body_set_linear_factor(rbRigidBody *object, float x, float y, float z); -extern void RB_body_set_angular_factor(rbRigidBody *object, float x, float y, float z); - -/* Kinematic State */ -extern void RB_body_set_kinematic_state(rbRigidBody *body, int kinematic); - -/* RigidBody Interface - Rigid Body Activation States */ -extern int RB_body_get_activation_state(rbRigidBody *body); -extern void RB_body_set_activation_state(rbRigidBody *body, int use_deactivation); -extern void RB_body_activate(rbRigidBody *body); -extern void RB_body_deactivate(rbRigidBody *body); - - -/* Simulation ----------------------- */ - -/* Get current transform matrix of RigidBody to use in Blender (OpenGL format) */ -extern void RB_body_get_transform_matrix(rbRigidBody *body, float m_out[4][4]); - -/* Set RigidBody's location and rotation */ -extern void RB_body_set_loc_rot(rbRigidBody *body, const float loc[3], const float rot[4]); -/* Set RigidBody's local scaling */ -extern void RB_body_set_scale(rbRigidBody *body, const float scale[3]); - -/* ............ */ - -/* Get RigidBody's position as vector */ -void RB_body_get_position(rbRigidBody *body, float v_out[3]); -/* Get RigidBody's orientation as quaternion */ -void RB_body_get_orientation(rbRigidBody *body, float v_out[4]); - -/* ............ */ - -extern void RB_body_apply_central_force(rbRigidBody *body, const float v_in[3]); - -/* ********************************** */ -/* Collision Shape Methods */ - -/* Setup (Standard Shapes) ----------- */ - -extern rbCollisionShape *RB_shape_new_box(float x, float y, float z); -extern rbCollisionShape *RB_shape_new_sphere(float radius); -extern rbCollisionShape *RB_shape_new_capsule(float radius, float height); -extern rbCollisionShape *RB_shape_new_cone(float radius, float height); -extern rbCollisionShape *RB_shape_new_cylinder(float radius, float height); - -/* Setup (Convex Hull) ------------ */ - -extern rbCollisionShape *RB_shape_new_convex_hull(float *verts, int stride, int count, float margin, bool *can_embed); - -/* Setup (Triangle Mesh) ---------- */ - -/* 1 */ -extern rbMeshData *RB_trimesh_data_new(void); -extern void RB_trimesh_add_triangle(rbMeshData *mesh, const float v1[3], const float v2[3], const float v3[3]); -/* 2a - Triangle Meshes */ -extern rbCollisionShape *RB_shape_new_trimesh(rbMeshData *mesh); -/* 2b - GImpact Meshes */ -extern rbCollisionShape *RB_shape_new_gimpact_mesh(rbMeshData *mesh); - - -/* Cleanup --------------------------- */ - -extern void RB_shape_delete(rbCollisionShape *shape); - -/* Settings --------------------------- */ - -/* Collision Margin */ -extern float RB_shape_get_margin(rbCollisionShape *shape); -extern void RB_shape_set_margin(rbCollisionShape *shape, float value); - -/* ********************************** */ -/* Constraints */ - -/* Setup ----------------------------- */ - -/* Add Rigid Body Constraint to simulation world */ -extern void RB_dworld_add_constraint(rbDynamicsWorld *world, rbConstraint *con, int disable_collisions); - -/* Remove Rigid Body Constraint from simulation world */ -extern void RB_dworld_remove_constraint(rbDynamicsWorld *world, rbConstraint *con); - -extern rbConstraint *RB_constraint_new_point(float pivot[3], rbRigidBody *rb1, rbRigidBody *rb2); -extern rbConstraint *RB_constraint_new_fixed(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2); -extern rbConstraint *RB_constraint_new_hinge(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2); -extern rbConstraint *RB_constraint_new_slider(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2); -extern rbConstraint *RB_constraint_new_piston(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2); -extern rbConstraint *RB_constraint_new_6dof(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2); -extern rbConstraint *RB_constraint_new_6dof_spring(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2); - -/* ............ */ - -/* Cleanup --------------------------- */ - -extern void RB_constraint_delete(rbConstraint *con); - -/* Settings --------------------------- */ - -/* Enable or disable constraint */ -extern void RB_constraint_set_enabled(rbConstraint *con, int enabled); - -/* Limits */ -#define RB_LIMIT_LIN_X 0 -#define RB_LIMIT_LIN_Y 1 -#define RB_LIMIT_LIN_Z 2 -#define RB_LIMIT_ANG_X 3 -#define RB_LIMIT_ANG_Y 4 -#define RB_LIMIT_ANG_Z 5 -/* Bullet uses the following convention: - * - lower limit == upper limit -> axis is locked - * - lower limit > upper limit -> axis is free - * - lower limit < upper limit -> axis is limited in given range - */ -extern void RB_constraint_set_limits_hinge(rbConstraint *con, float lower, float upper); -extern void RB_constraint_set_limits_slider(rbConstraint *con, float lower, float upper); -extern void RB_constraint_set_limits_piston(rbConstraint *con, float lin_lower, float lin_upper, float ang_lower, float ang_upper); -extern void RB_constraint_set_limits_6dof(rbConstraint *con, float axis, float lower, float upper); - -/* 6dof spring specific */ -extern void RB_constraint_set_stiffness_6dof_spring(rbConstraint *con, float axis, float stiffness); -extern void RB_constraint_set_damping_6dof_spring(rbConstraint *con, float axis, float damping); -extern void RB_constraint_set_spring_6dof_spring(rbConstraint *con, float axis, int enable); -extern void RB_constraint_set_equilibrium_6dof_spring(rbConstraint *con); - -/* Set number of constraint solver iterations made per step, this overrided world setting - * To use default set it to -1 */ -extern void RB_constraint_set_solver_iterations(rbConstraint *con, int num_solver_iterations); - -/* Set breaking impulse threshold, if constraint shouldn't break it can be set to FLT_MAX */ -extern void RB_constraint_set_breaking_threshold(rbConstraint *con, float threshold); - -/* ********************************** */ - -#ifdef __cplusplus -} -#endif - -#endif /* __RB_API_H__ */ - diff --git a/source/blender/rigidbody/SConscript b/source/blender/rigidbody/SConscript deleted file mode 100644 index 14c80304983..00000000000 --- a/source/blender/rigidbody/SConscript +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/python -# $Id: SConscript $ -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# The Original Code is Copyright (C) 2010, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Joshua Leung -# -# ***** END GPL LICENSE BLOCK ***** - -Import('env') - -# XXX: we need a contingency plan for when not compiling with Bullet, -# since this module will always get included... -# This problem will also apply to other engines at a later date too... -sources = env.Glob('*.cpp') - -incs = [ - '.', - '../../../extern/bullet2/src', - ] - -env.BlenderLib('bf_rigidbody', sources=sources, - includes=incs, defines=[], - libtype=['core', 'player'], priority=[180, 30]) diff --git a/source/blender/rigidbody/rb_bullet_api.cpp b/source/blender/rigidbody/rb_bullet_api.cpp deleted file mode 100644 index c4a4532bad1..00000000000 --- a/source/blender/rigidbody/rb_bullet_api.cpp +++ /dev/null @@ -1,949 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2013 Blender Foundation - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Joshua Leung, Sergej Reich - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file rb_bullet_api.cpp - * \ingroup RigidBody - * \brief Rigid Body API implementation for Bullet - */ - -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -/* This file defines the "RigidBody interface" for the - * Bullet Physics Engine. This API is designed to be used - * from C-code in Blender as part of the Rigid Body simulation - * system. - * - * It is based on the Bullet C-API, but is heavily modified to - * give access to more data types and to offer a nicer interface. - * - * -- Joshua Leung, June 2010 - */ - -#include - -#include "RBI_api.h" - -#include "btBulletDynamicsCommon.h" - -#include "LinearMath/btVector3.h" -#include "LinearMath/btScalar.h" -#include "LinearMath/btMatrix3x3.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btConvexHullComputer.h" - -#include "BulletCollision/Gimpact/btGImpactShape.h" -#include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h" -#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h" - -struct rbDynamicsWorld { - btDiscreteDynamicsWorld *dynamicsWorld; - btDefaultCollisionConfiguration *collisionConfiguration; - btDispatcher *dispatcher; - btBroadphaseInterface *pairCache; - btConstraintSolver *constraintSolver; - btOverlapFilterCallback *filterCallback; -}; -struct rbRigidBody { - btRigidBody *body; - int col_groups; -}; - -struct rbCollisionShape { - btCollisionShape *cshape; - btTriangleMesh *mesh; -}; - -struct rbFilterCallback : public btOverlapFilterCallback -{ - virtual bool needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const - { - rbRigidBody *rb0 = (rbRigidBody *)((btRigidBody *)proxy0->m_clientObject)->getUserPointer(); - rbRigidBody *rb1 = (rbRigidBody *)((btRigidBody *)proxy1->m_clientObject)->getUserPointer(); - - bool collides; - collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - collides = collides && (rb0->col_groups & rb1->col_groups); - - return collides; - } -}; - -static inline void copy_v3_btvec3(float vec[3], const btVector3 &btvec) -{ - vec[0] = (float)btvec[0]; - vec[1] = (float)btvec[1]; - vec[2] = (float)btvec[2]; -} -static inline void copy_quat_btquat(float quat[3], const btQuaternion &btquat) -{ - quat[0] = btquat.getW(); - quat[1] = btquat.getX(); - quat[2] = btquat.getY(); - quat[3] = btquat.getZ(); -} - -/* ********************************** */ -/* Dynamics World Methods */ - -/* Setup ---------------------------- */ - -rbDynamicsWorld *RB_dworld_new(const float gravity[3]) -{ - rbDynamicsWorld *world = new rbDynamicsWorld; - - /* collision detection/handling */ - world->collisionConfiguration = new btDefaultCollisionConfiguration(); - - world->dispatcher = new btCollisionDispatcher(world->collisionConfiguration); - btGImpactCollisionAlgorithm::registerAlgorithm((btCollisionDispatcher *)world->dispatcher); // XXX: experimental - - world->pairCache = new btDbvtBroadphase(); - - world->filterCallback = new rbFilterCallback(); - world->pairCache->getOverlappingPairCache()->setOverlapFilterCallback(world->filterCallback); - - /* constraint solving */ - world->constraintSolver = new btSequentialImpulseConstraintSolver(); - - /* world */ - world->dynamicsWorld = new btDiscreteDynamicsWorld(world->dispatcher, - world->pairCache, - world->constraintSolver, - world->collisionConfiguration); - - RB_dworld_set_gravity(world, gravity); - - return world; -} - -void RB_dworld_delete(rbDynamicsWorld *world) -{ - /* bullet doesn't like if we free these in a different order */ - delete world->dynamicsWorld; - delete world->constraintSolver; - delete world->pairCache; - delete world->dispatcher; - delete world->collisionConfiguration; - delete world->filterCallback; - delete world; -} - -/* Settings ------------------------- */ - -/* Gravity */ -void RB_dworld_get_gravity(rbDynamicsWorld *world, float g_out[3]) -{ - copy_v3_btvec3(g_out, world->dynamicsWorld->getGravity()); -} - -void RB_dworld_set_gravity(rbDynamicsWorld *world, const float g_in[3]) -{ - world->dynamicsWorld->setGravity(btVector3(g_in[0], g_in[1], g_in[2])); -} - -/* Constraint Solver */ -void RB_dworld_set_solver_iterations(rbDynamicsWorld *world, int num_solver_iterations) -{ - btContactSolverInfo& info = world->dynamicsWorld->getSolverInfo(); - - info.m_numIterations = num_solver_iterations; -} - -/* Split Impulse */ -void RB_dworld_set_split_impulse(rbDynamicsWorld *world, int split_impulse) -{ - btContactSolverInfo& info = world->dynamicsWorld->getSolverInfo(); - - info.m_splitImpulse = split_impulse; -} - -/* Simulation ----------------------- */ - -void RB_dworld_step_simulation(rbDynamicsWorld *world, float timeStep, int maxSubSteps, float timeSubStep) -{ - world->dynamicsWorld->stepSimulation(timeStep, maxSubSteps, timeSubStep); -} - -/* Export -------------------------- */ - -/* Exports entire dynamics world to Bullet's "*.bullet" binary format - * which is similar to Blender's SDNA system... - * < rbDynamicsWorld: dynamics world to write to file - * < filename: assumed to be a valid filename, with .bullet extension - */ -void RB_dworld_export(rbDynamicsWorld *world, const char *filename) -{ - //create a large enough buffer. There is no method to pre-calculate the buffer size yet. - int maxSerializeBufferSize = 1024 * 1024 * 5; - - btDefaultSerializer *serializer = new btDefaultSerializer(maxSerializeBufferSize); - world->dynamicsWorld->serialize(serializer); - - FILE *file = fopen(filename, "wb"); - fwrite(serializer->getBufferPointer(), serializer->getCurrentBufferSize(), 1, file); - fclose(file); -} - -/* ********************************** */ -/* Rigid Body Methods */ - -/* Setup ---------------------------- */ - -void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *object, int col_groups) -{ - btRigidBody *body = object->body; - object->col_groups = col_groups; - - world->dynamicsWorld->addRigidBody(body); -} - -void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *object) -{ - btRigidBody *body = object->body; - - world->dynamicsWorld->removeRigidBody(body); -} - -/* ............ */ - -rbRigidBody *RB_body_new(rbCollisionShape *shape, const float loc[3], const float rot[4]) -{ - rbRigidBody *object = new rbRigidBody; - /* current transform */ - btTransform trans; - trans.setOrigin(btVector3(loc[0], loc[1], loc[2])); - trans.setRotation(btQuaternion(rot[1], rot[2], rot[3], rot[0])); - - /* create motionstate, which is necessary for interpolation (includes reverse playback) */ - btDefaultMotionState *motionState = new btDefaultMotionState(trans); - - /* make rigidbody */ - btRigidBody::btRigidBodyConstructionInfo rbInfo(1.0f, motionState, shape->cshape); - - object->body = new btRigidBody(rbInfo); - - object->body->setUserPointer(object); - - return object; -} - -void RB_body_delete(rbRigidBody *object) -{ - btRigidBody *body = object->body; - - /* motion state */ - btMotionState *ms = body->getMotionState(); - if (ms) - delete ms; - - /* collision shape is done elsewhere... */ - - /* body itself */ - - /* manually remove constraint refs of the rigid body, normally this happens when removing constraints from the world - * but since we delete everything when the world is rebult, we need to do it manually here */ - for (int i = body->getNumConstraintRefs() - 1; i >= 0; i--) { - btTypedConstraint *con = body->getConstraintRef(i); - body->removeConstraintRef(con); - } - - delete body; - delete object; -} - -/* Settings ------------------------- */ - -void RB_body_set_collision_shape(rbRigidBody *object, rbCollisionShape *shape) -{ - btRigidBody *body = object->body; - - /* set new collision shape */ - body->setCollisionShape(shape->cshape); - - /* recalculate inertia, since that depends on the collision shape... */ - RB_body_set_mass(object, RB_body_get_mass(object)); -} - -/* ............ */ - -float RB_body_get_mass(rbRigidBody *object) -{ - btRigidBody *body = object->body; - - /* there isn't really a mass setting, but rather 'inverse mass' - * which we convert back to mass by taking the reciprocal again - */ - float value = (float)body->getInvMass(); - - if (value) - value = 1.0 / value; - - return value; -} - -void RB_body_set_mass(rbRigidBody *object, float value) -{ - btRigidBody *body = object->body; - btVector3 localInertia(0, 0, 0); - - /* calculate new inertia if non-zero mass */ - if (value) { - btCollisionShape *shape = body->getCollisionShape(); - shape->calculateLocalInertia(value, localInertia); - } - - body->setMassProps(value, localInertia); - body->updateInertiaTensor(); -} - - -float RB_body_get_friction(rbRigidBody *object) -{ - btRigidBody *body = object->body; - return body->getFriction(); -} - -void RB_body_set_friction(rbRigidBody *object, float value) -{ - btRigidBody *body = object->body; - body->setFriction(value); -} - - -float RB_body_get_restitution(rbRigidBody *object) -{ - btRigidBody *body = object->body; - return body->getRestitution(); -} - -void RB_body_set_restitution(rbRigidBody *object, float value) -{ - btRigidBody *body = object->body; - body->setRestitution(value); -} - - -float RB_body_get_linear_damping(rbRigidBody *object) -{ - btRigidBody *body = object->body; - return body->getLinearDamping(); -} - -void RB_body_set_linear_damping(rbRigidBody *object, float value) -{ - RB_body_set_damping(object, value, RB_body_get_linear_damping(object)); -} - -float RB_body_get_angular_damping(rbRigidBody *object) -{ - btRigidBody *body = object->body; - return body->getAngularDamping(); -} - -void RB_body_set_angular_damping(rbRigidBody *object, float value) -{ - RB_body_set_damping(object, RB_body_get_linear_damping(object), value); -} - -void RB_body_set_damping(rbRigidBody *object, float linear, float angular) -{ - btRigidBody *body = object->body; - body->setDamping(linear, angular); -} - - -float RB_body_get_linear_sleep_thresh(rbRigidBody *object) -{ - btRigidBody *body = object->body; - return body->getLinearSleepingThreshold(); -} - -void RB_body_set_linear_sleep_thresh(rbRigidBody *object, float value) -{ - RB_body_set_sleep_thresh(object, value, RB_body_get_angular_sleep_thresh(object)); -} - -float RB_body_get_angular_sleep_thresh(rbRigidBody *object) -{ - btRigidBody *body = object->body; - return body->getAngularSleepingThreshold(); -} - -void RB_body_set_angular_sleep_thresh(rbRigidBody *object, float value) -{ - RB_body_set_sleep_thresh(object, RB_body_get_linear_sleep_thresh(object), value); -} - -void RB_body_set_sleep_thresh(rbRigidBody *object, float linear, float angular) -{ - btRigidBody *body = object->body; - body->setSleepingThresholds(linear, angular); -} - -/* ............ */ - -void RB_body_get_linear_velocity(rbRigidBody *object, float v_out[3]) -{ - btRigidBody *body = object->body; - - copy_v3_btvec3(v_out, body->getLinearVelocity()); -} - -void RB_body_set_linear_velocity(rbRigidBody *object, const float v_in[3]) -{ - btRigidBody *body = object->body; - - body->setLinearVelocity(btVector3(v_in[0], v_in[1], v_in[2])); -} - - -void RB_body_get_angular_velocity(rbRigidBody *object, float v_out[3]) -{ - btRigidBody *body = object->body; - - copy_v3_btvec3(v_out, body->getAngularVelocity()); -} - -void RB_body_set_angular_velocity(rbRigidBody *object, const float v_in[3]) -{ - btRigidBody *body = object->body; - - body->setAngularVelocity(btVector3(v_in[0], v_in[1], v_in[2])); -} - -void RB_body_set_linear_factor(rbRigidBody *object, float x, float y, float z) -{ - btRigidBody *body = object->body; - body->setLinearFactor(btVector3(x, y, z)); -} - -void RB_body_set_angular_factor(rbRigidBody *object, float x, float y, float z) -{ - btRigidBody *body = object->body; - body->setAngularFactor(btVector3(x, y, z)); -} - -/* ............ */ - -void RB_body_set_kinematic_state(rbRigidBody *object, int kinematic) -{ - btRigidBody *body = object->body; - if (kinematic) - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - else - body->setCollisionFlags(body->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); -} - -/* ............ */ - -void RB_body_set_activation_state(rbRigidBody *object, int use_deactivation) -{ - btRigidBody *body = object->body; - if (use_deactivation) - body->forceActivationState(ACTIVE_TAG); - else - body->setActivationState(DISABLE_DEACTIVATION); -} -void RB_body_activate(rbRigidBody *object) -{ - btRigidBody *body = object->body; - body->setActivationState(ACTIVE_TAG); -} -void RB_body_deactivate(rbRigidBody *object) -{ - btRigidBody *body = object->body; - body->setActivationState(ISLAND_SLEEPING); -} - -/* ............ */ - - - -/* Simulation ----------------------- */ - -/* The transform matrices Blender uses are OpenGL-style matrices, - * while Bullet uses the Right-Handed coordinate system style instead. - */ - -void RB_body_get_transform_matrix(rbRigidBody *object, float m_out[4][4]) -{ - btRigidBody *body = object->body; - btMotionState *ms = body->getMotionState(); - - btTransform trans; - ms->getWorldTransform(trans); - - trans.getOpenGLMatrix((btScalar *)m_out); -} - -void RB_body_set_loc_rot(rbRigidBody *object, const float loc[3], const float rot[4]) -{ - btRigidBody *body = object->body; - btMotionState *ms = body->getMotionState(); - - /* set transform matrix */ - btTransform trans; - trans.setOrigin(btVector3(loc[0], loc[1], loc[2])); - trans.setRotation(btQuaternion(rot[1], rot[2], rot[3], rot[0])); - - ms->setWorldTransform(trans); -} - -void RB_body_set_scale(rbRigidBody *object, const float scale[3]) -{ - btRigidBody *body = object->body; - - /* apply scaling factor from matrix above to the collision shape */ - btCollisionShape *cshape = body->getCollisionShape(); - if (cshape) { - cshape->setLocalScaling(btVector3(scale[0], scale[1], scale[2])); - - /* GIimpact shapes have to be updated to take scaling into account */ - if (cshape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) - ((btGImpactMeshShape *)cshape)->updateBound(); - } -} - -/* ............ */ -/* Read-only state info about status of simulation */ - -void RB_body_get_position(rbRigidBody *object, float v_out[3]) -{ - btRigidBody *body = object->body; - - copy_v3_btvec3(v_out, body->getWorldTransform().getOrigin()); -} - -void RB_body_get_orientation(rbRigidBody *object, float v_out[4]) -{ - btRigidBody *body = object->body; - - copy_quat_btquat(v_out, body->getWorldTransform().getRotation()); -} - -/* ............ */ -/* Overrides for simulation */ - -void RB_body_apply_central_force(rbRigidBody *object, const float v_in[3]) -{ - btRigidBody *body = object->body; - - body->applyCentralForce(btVector3(v_in[0], v_in[1], v_in[2])); -} - -/* ********************************** */ -/* Collision Shape Methods */ - -/* Setup (Standard Shapes) ----------- */ - -rbCollisionShape *RB_shape_new_box(float x, float y, float z) -{ - rbCollisionShape *shape = new rbCollisionShape; - shape->cshape = new btBoxShape(btVector3(x, y, z)); - shape->mesh = NULL; - return shape; -} - -rbCollisionShape *RB_shape_new_sphere(float radius) -{ - rbCollisionShape *shape = new rbCollisionShape; - shape->cshape = new btSphereShape(radius); - shape->mesh = NULL; - return shape; -} - -rbCollisionShape *RB_shape_new_capsule(float radius, float height) -{ - rbCollisionShape *shape = new rbCollisionShape; - shape->cshape = new btCapsuleShapeZ(radius, height); - shape->mesh = NULL; - return shape; -} - -rbCollisionShape *RB_shape_new_cone(float radius, float height) -{ - rbCollisionShape *shape = new rbCollisionShape; - shape->cshape = new btConeShapeZ(radius, height); - shape->mesh = NULL; - return shape; -} - -rbCollisionShape *RB_shape_new_cylinder(float radius, float height) -{ - rbCollisionShape *shape = new rbCollisionShape; - shape->cshape = new btCylinderShapeZ(btVector3(radius, radius, height)); - shape->mesh = NULL; - return shape; -} - -/* Setup (Convex Hull) ------------ */ - -rbCollisionShape *RB_shape_new_convex_hull(float *verts, int stride, int count, float margin, bool *can_embed) -{ - btConvexHullComputer hull_computer = btConvexHullComputer(); - - // try to embed the margin, if that fails don't shrink the hull - if (hull_computer.compute(verts, stride, count, margin, 0.0f) < 0.0f) { - hull_computer.compute(verts, stride, count, 0.0f, 0.0f); - *can_embed = false; - } - - rbCollisionShape *shape = new rbCollisionShape; - btConvexHullShape *hull_shape = new btConvexHullShape(&(hull_computer.vertices[0].getX()), hull_computer.vertices.size()); - - shape->cshape = hull_shape; - shape->mesh = NULL; - return shape; -} - -/* Setup (Triangle Mesh) ---------- */ - -/* Need to call rbTriMeshNewData() followed by rbTriMeshAddTriangle() several times - * to set up the mesh buffer BEFORE calling rbShapeNewTriMesh(). Otherwise, - * we get nasty crashes... - */ - -rbMeshData *RB_trimesh_data_new() -{ - // XXX: welding threshold? - return (rbMeshData *) new btTriangleMesh(true, false); -} - -void RB_trimesh_add_triangle(rbMeshData *mesh, const float v1[3], const float v2[3], const float v3[3]) -{ - btTriangleMesh *meshData = reinterpret_cast(mesh); - - /* cast vertices to usable forms for Bt-API */ - btVector3 vtx1((btScalar)v1[0], (btScalar)v1[1], (btScalar)v1[2]); - btVector3 vtx2((btScalar)v2[0], (btScalar)v2[1], (btScalar)v2[2]); - btVector3 vtx3((btScalar)v3[0], (btScalar)v3[1], (btScalar)v3[2]); - - /* add to the mesh - * - remove duplicated verts is enabled - */ - meshData->addTriangle(vtx1, vtx2, vtx3, false); -} - -rbCollisionShape *RB_shape_new_trimesh(rbMeshData *mesh) -{ - rbCollisionShape *shape = new rbCollisionShape; - btTriangleMesh *tmesh = reinterpret_cast(mesh); - - /* triangle-mesh we create is a BVH wrapper for triangle mesh data (for faster lookups) */ - // RB_TODO perhaps we need to allow saving out this for performance when rebuilding? - btBvhTriangleMeshShape *unscaledShape = new btBvhTriangleMeshShape(tmesh, true, true); - - shape->cshape = new btScaledBvhTriangleMeshShape(unscaledShape, btVector3(1.0f, 1.0f, 1.0f)); - shape->mesh = tmesh; - return shape; -} - -rbCollisionShape *RB_shape_new_gimpact_mesh(rbMeshData *mesh) -{ - rbCollisionShape *shape = new rbCollisionShape; - /* interpret mesh buffer as btTriangleIndexVertexArray (i.e. an impl of btStridingMeshInterface) */ - btTriangleMesh *tmesh = reinterpret_cast(mesh); - - btGImpactMeshShape *gimpactShape = new btGImpactMeshShape(tmesh); - gimpactShape->updateBound(); // TODO: add this to the update collision margin call? - - shape->cshape = gimpactShape; - shape->mesh = tmesh; - return shape; -} - -/* Cleanup --------------------------- */ - -void RB_shape_delete(rbCollisionShape *shape) -{ - if (shape->cshape->getShapeType() == SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE) { - btBvhTriangleMeshShape *child_shape = ((btScaledBvhTriangleMeshShape *)shape->cshape)->getChildShape(); - if (child_shape) - delete child_shape; - } - if (shape->mesh) - delete shape->mesh; - delete shape->cshape; - delete shape; -} - -/* Settings --------------------------- */ - -float RB_shape_get_margin(rbCollisionShape *shape) -{ - return shape->cshape->getMargin(); -} - -void RB_shape_set_margin(rbCollisionShape *shape, float value) -{ - shape->cshape->setMargin(value); -} - -/* ********************************** */ -/* Constraints */ - -/* Setup ----------------------------- */ - -void RB_dworld_add_constraint(rbDynamicsWorld *world, rbConstraint *con, int disable_collisions) -{ - btTypedConstraint *constraint = reinterpret_cast(con); - - world->dynamicsWorld->addConstraint(constraint, disable_collisions); -} - -void RB_dworld_remove_constraint(rbDynamicsWorld *world, rbConstraint *con) -{ - btTypedConstraint *constraint = reinterpret_cast(con); - - world->dynamicsWorld->removeConstraint(constraint); -} - -/* ............ */ - -static void make_constraint_transforms(btTransform &transform1, btTransform &transform2, btRigidBody *body1, btRigidBody *body2, float pivot[3], float orn[4]) -{ - btTransform pivot_transform = btTransform(); - pivot_transform.setOrigin(btVector3(pivot[0], pivot[1], pivot[2])); - pivot_transform.setRotation(btQuaternion(orn[1], orn[2], orn[3], orn[0])); - - transform1 = body1->getWorldTransform().inverse() * pivot_transform; - transform2 = body2->getWorldTransform().inverse() * pivot_transform; -} - -rbConstraint *RB_constraint_new_point(float pivot[3], rbRigidBody *rb1, rbRigidBody *rb2) -{ - btRigidBody *body1 = rb1->body; - btRigidBody *body2 = rb2->body; - - btVector3 pivot1 = body1->getWorldTransform().inverse() * btVector3(pivot[0], pivot[1], pivot[2]); - btVector3 pivot2 = body2->getWorldTransform().inverse() * btVector3(pivot[0], pivot[1], pivot[2]); - - btTypedConstraint *con = new btPoint2PointConstraint(*body1, *body2, pivot1, pivot2); - - return (rbConstraint *)con; -} - -rbConstraint *RB_constraint_new_fixed(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2) -{ - btRigidBody *body1 = rb1->body; - btRigidBody *body2 = rb2->body; - btTransform transform1; - btTransform transform2; - - make_constraint_transforms(transform1, transform2, body1, body2, pivot, orn); - - btGeneric6DofConstraint *con = new btGeneric6DofConstraint(*body1, *body2, transform1, transform2, true); - - /* lock all axes */ - for (int i = 0; i < 6; i++) - con->setLimit(i, 0, 0); - - return (rbConstraint *)con; -} - -rbConstraint *RB_constraint_new_hinge(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2) -{ - btRigidBody *body1 = rb1->body; - btRigidBody *body2 = rb2->body; - btTransform transform1; - btTransform transform2; - - make_constraint_transforms(transform1, transform2, body1, body2, pivot, orn); - - btHingeConstraint *con = new btHingeConstraint(*body1, *body2, transform1, transform2); - - return (rbConstraint *)con; -} - -rbConstraint *RB_constraint_new_slider(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2) -{ - btRigidBody *body1 = rb1->body; - btRigidBody *body2 = rb2->body; - btTransform transform1; - btTransform transform2; - - make_constraint_transforms(transform1, transform2, body1, body2, pivot, orn); - - btSliderConstraint *con = new btSliderConstraint(*body1, *body2, transform1, transform2, true); - - return (rbConstraint *)con; -} - -rbConstraint *RB_constraint_new_piston(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2) -{ - btRigidBody *body1 = rb1->body; - btRigidBody *body2 = rb2->body; - btTransform transform1; - btTransform transform2; - - make_constraint_transforms(transform1, transform2, body1, body2, pivot, orn); - - btSliderConstraint *con = new btSliderConstraint(*body1, *body2, transform1, transform2, true); - con->setUpperAngLimit(-1.0f); // unlock rotation axis - - return (rbConstraint *)con; -} - -rbConstraint *RB_constraint_new_6dof(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2) -{ - btRigidBody *body1 = rb1->body; - btRigidBody *body2 = rb2->body; - btTransform transform1; - btTransform transform2; - - make_constraint_transforms(transform1, transform2, body1, body2, pivot, orn); - - btTypedConstraint *con = new btGeneric6DofConstraint(*body1, *body2, transform1, transform2, true); - - return (rbConstraint *)con; -} - -rbConstraint *RB_constraint_new_6dof_spring(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2) -{ - btRigidBody *body1 = rb1->body; - btRigidBody *body2 = rb2->body; - btTransform transform1; - btTransform transform2; - - make_constraint_transforms(transform1, transform2, body1, body2, pivot, orn); - - btTypedConstraint *con = new btGeneric6DofSpringConstraint(*body1, *body2, transform1, transform2, true); - - return (rbConstraint *)con; -} - -/* Cleanup ----------------------------- */ - -void RB_constraint_delete(rbConstraint *con) -{ - btTypedConstraint *constraint = reinterpret_cast(con); - delete constraint; -} - -/* Settings ------------------------- */ - -void RB_constraint_set_enabled(rbConstraint *con, int enabled) -{ - btTypedConstraint *constraint = reinterpret_cast(con); - - constraint->setEnabled(enabled); -} - -void RB_constraint_set_limits_hinge(rbConstraint *con, float lower, float upper) -{ - btHingeConstraint *constraint = reinterpret_cast(con); - - // RB_TODO expose these - float softness = 0.9f; - float bias_factor = 0.3f; - float relaxation_factor = 1.0f; - - constraint->setLimit(lower, upper, softness, bias_factor, relaxation_factor); -} - -void RB_constraint_set_limits_slider(rbConstraint *con, float lower, float upper) -{ - btSliderConstraint *constraint = reinterpret_cast(con); - - constraint->setLowerLinLimit(lower); - constraint->setUpperLinLimit(upper); -} - -void RB_constraint_set_limits_piston(rbConstraint *con, float lin_lower, float lin_upper, float ang_lower, float ang_upper) -{ - btSliderConstraint *constraint = reinterpret_cast(con); - - constraint->setLowerLinLimit(lin_lower); - constraint->setUpperLinLimit(lin_upper); - constraint->setLowerAngLimit(ang_lower); - constraint->setUpperAngLimit(ang_upper); -} - -void RB_constraint_set_limits_6dof(rbConstraint *con, float axis, float lower, float upper) -{ - btGeneric6DofConstraint *constraint = reinterpret_cast(con); - - constraint->setLimit(axis, lower, upper); -} - -void RB_constraint_set_stiffness_6dof_spring(rbConstraint *con, float axis, float stiffness) -{ - btGeneric6DofSpringConstraint *constraint = reinterpret_cast(con); - - constraint->setStiffness(axis, stiffness); -} - -void RB_constraint_set_damping_6dof_spring(rbConstraint *con, float axis, float damping) -{ - btGeneric6DofSpringConstraint *constraint = reinterpret_cast(con); - - constraint->setDamping(axis, damping); -} - -void RB_constraint_set_spring_6dof_spring(rbConstraint *con, float axis, int enable) -{ - btGeneric6DofSpringConstraint *constraint = reinterpret_cast(con); - - constraint->enableSpring(axis, enable); -} - -void RB_constraint_set_equilibrium_6dof_spring(rbConstraint *con) -{ - btGeneric6DofSpringConstraint *constraint = reinterpret_cast(con); - - constraint->setEquilibriumPoint(); -} - -void RB_constraint_set_solver_iterations(rbConstraint *con, int num_solver_iterations) -{ - btTypedConstraint *constraint = reinterpret_cast(con); - - constraint->setOverrideNumSolverIterations(num_solver_iterations); -} - -void RB_constraint_set_breaking_threshold(rbConstraint *con, float threshold) -{ - btTypedConstraint *constraint = reinterpret_cast(con); - - constraint->setBreakingImpulseThreshold(threshold); -} - -/* ********************************** */ diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt index b2a47115630..fb06c5e4477 100644 --- a/source/blenderplayer/CMakeLists.txt +++ b/source/blenderplayer/CMakeLists.txt @@ -95,7 +95,7 @@ endif() bf_rna bf_bmesh bf_blenkernel - bf_rigidbody + bf_intern_rigidbody bf_blenloader ge_blen_routines bf_editor_datafiles diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 2115b2a5ff6..bb5f34167bc 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -918,7 +918,7 @@ endif() if(WITH_COMPOSITOR) # added for opencl compositor list_insert_before(BLENDER_SORTED_LIBS "bf_blenkernel" "bf_compositor") - list_insert_after(BLENDER_SORTED_LIBS "bf_compositor" "bf_opencl") + list_insert_after(BLENDER_SORTED_LIBS "bf_compositor" "bf_intern_opencl") endif() if(WITH_LIBMV) @@ -971,7 +971,7 @@ endif() endif() if(WITH_BULLET) - list_insert_after(BLENDER_SORTED_LIBS "bf_blenkernel" "bf_rigidbody") + list_insert_after(BLENDER_SORTED_LIBS "bf_blenkernel" "bf_intern_rigidbody") endif() if(WITH_BULLET AND NOT WITH_BULLET_SYSTEM) -- cgit v1.2.3 From 2a71e4e4f0c703a613b74fb1d0710b341987e6e3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Feb 2013 08:24:18 +0000 Subject: make WITH_HEADLESS build again. --- source/blender/editors/interface/interface_icons.c | 8 ++++++-- source/blender/python/intern/bpy_rna.c | 3 +++ source/creator/creator.c | 7 +++++-- 3 files changed, 14 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 619fb18cd7a..1a3d8d20d47 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -130,6 +130,7 @@ static IconTexture icongltex = {0, 0, 0, 0.0f, 0.0f}; /* **************************************************** */ +#ifndef WITH_HEADLESS static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type) { @@ -469,6 +470,7 @@ static void vicon_move_down_draw(int x, int y, int w, int h, float UNUSED(alpha) } #ifndef WITH_HEADLESS + static void init_brush_icons(void) { @@ -781,6 +783,8 @@ static void free_iconfile_list(struct ListBase *list) } } +#endif /* WITH_HEADLESS */ + int UI_iconfile_get_index(const char *filename) { IconFile *ifile; @@ -1134,9 +1138,9 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al else if (di->type == ICON_TYPE_BUFFER) { /* it is a builtin icon */ iimg = di->data.buffer.image; - +#ifndef WITH_HEADLESS icon_verify_datatoc(iimg); - +#endif if (!iimg->rect) return; /* something has gone wrong! */ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 4de92d090fc..7359979c992 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -6542,6 +6542,9 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self) static PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE; +/** + * Accessed from Python as 'bpy.types' + */ PyObject *BPY_rna_types(void) { BPy_BaseTypeRNA *self; diff --git a/source/creator/creator.c b/source/creator/creator.c index b0022ffa118..7916d34bf13 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -1485,10 +1485,13 @@ int main(int argc, const char **argv) #if defined(WITH_PYTHON_MODULE) || defined(WITH_HEADLESS) - G.background = 1; /* python module mode ALWAYS runs in background mode (for now) */ + G.background = true; /* python module mode ALWAYS runs in background mode (for now) */ + (void)blender_esc; #else /* for all platforms, even windos has it! */ - if (G.background) signal(SIGINT, blender_esc); /* ctrl c out bg render */ + if (G.background) { + signal(SIGINT, blender_esc); /* ctrl c out bg render */ + } #endif /* background render uses this font too */ -- cgit v1.2.3 From 496c3e4f8fc8c1e9319477f3f2f75f6474bb4b5f Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Feb 2013 15:17:39 +0000 Subject: Fix #34070: set origin operator did not work for lattice objects. --- source/blender/blenkernel/BKE_lattice.h | 5 ++ source/blender/blenkernel/intern/lattice.c | 63 ++++++++++++++++++++++++ source/blender/editors/object/object_transform.c | 14 ++++++ 3 files changed, 82 insertions(+) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index a0bebd752b5..fe88f0c580a 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -75,5 +75,10 @@ void BKE_lattice_modifiers_calc(struct Scene *scene, struct Object *ob); struct MDeformVert *BKE_lattice_deform_verts_get(struct Object *lattice); +void BKE_lattice_minmax(struct Lattice *lt, float min[3], float max[3]); +void BKE_lattice_center_median(struct Lattice *lt, float cent[3]); +void BKE_lattice_center_bounds(struct Lattice *lt, float cent[3]); +void BKE_lattice_translate(struct Lattice *lt, float offset[3], int do_keys); + #endif diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index fa01e9fd933..05d7933e1b5 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -1003,3 +1003,66 @@ struct MDeformVert *BKE_lattice_deform_verts_get(struct Object *oblatt) if (lt->editlatt) lt = lt->editlatt->latt; return lt->dvert; } + +void BKE_lattice_center_median(struct Lattice *lt, float cent[3]) +{ + int i, numVerts; + + if (lt->editlatt) lt = lt->editlatt->latt; + numVerts = lt->pntsu * lt->pntsv * lt->pntsw; + + zero_v3(cent); + + for (i = 0; i < numVerts; i++) + add_v3_v3(cent, lt->def[i].vec); + + mul_v3_fl(cent, 1.0f / (float)numVerts); +} + +void BKE_lattice_minmax(struct Lattice *lt, float min[3], float max[3]) +{ + int i, numVerts; + + if (lt->editlatt) lt = lt->editlatt->latt; + numVerts = lt->pntsu * lt->pntsv * lt->pntsw; + + for (i = 0; i < numVerts; i++) + minmax_v3v3_v3(min, max, lt->def[i].vec); +} + +void BKE_lattice_center_bounds(struct Lattice *lt, float cent[3]) +{ + float min[3], max[3]; + + INIT_MINMAX(min, max); + + BKE_lattice_minmax(lt, min, max); + mid_v3_v3v3(cent, min, max); +} + +void BKE_lattice_translate(Lattice *lt, float offset[3], int do_keys) +{ + int i, numVerts; + + numVerts = lt->pntsu * lt->pntsv * lt->pntsw; + + if (lt->def) + for (i = 0; i < numVerts; i++) + add_v3_v3(lt->def[i].vec, offset); + + if (lt->editlatt) + for (i = 0; i < numVerts; i++) + add_v3_v3(lt->editlatt->latt->def[i].vec, offset); + + if (do_keys && lt->key) { + KeyBlock *kb; + + for (kb = lt->key->block.first; kb; kb = kb->next) { + float *fp = kb->data; + for (i = kb->totelem; i--; fp += 3) { + add_v3_v3(fp, offset); + } + } + } +} + diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index 7a2eb5667a2..d933a6de166 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -899,6 +899,20 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) break; } } + else if (ob->type == OB_LATTICE) { + Lattice *lt = ob->data; + + if (centermode == ORIGIN_TO_CURSOR) { /* done */ } + else if (around == V3D_CENTROID) { BKE_lattice_center_median(lt, cent); } + else { BKE_lattice_center_bounds(lt, cent); } + + negate_v3_v3(cent_neg, cent); + BKE_lattice_translate(lt, cent_neg, 1); + + tot_change++; + lt->id.flag |= LIB_DOIT; + do_inverse_offset = TRUE; + } /* offset other selected objects */ if (do_inverse_offset && (centermode != GEOMETRY_TO_ORIGIN)) { -- cgit v1.2.3 From 6baf63c83b2f138ba3d52d4123a6ee8cb9078cb5 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Feb 2013 15:17:51 +0000 Subject: Fix some warnings in the collade code, but did not fix two because they seem to indicate bugs, left a comment about those. --- source/blender/collada/AnimationExporter.cpp | 9 ++++----- source/blender/collada/ArmatureExporter.cpp | 4 ++-- source/blender/collada/ArmatureExporter.h | 2 +- source/blender/collada/ArmatureImporter.cpp | 6 ++---- source/blender/collada/ControllerExporter.cpp | 1 + source/blender/collada/DocumentImporter.cpp | 4 +--- source/blender/collada/SceneExporter.cpp | 1 - source/blender/collada/TransformReader.cpp | 1 + 8 files changed, 12 insertions(+), 16 deletions(-) (limited to 'source') diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index 493d15135a7..e29435005bd 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -439,11 +439,11 @@ void AnimationExporter::sample_and_write_bone_animation_matrix(Object *ob_arm, B std::vector fra; //char prefix[256]; - FCurve *fcu = (FCurve *)ob_arm->adt->action->curves.first; - //Check if there is a fcurve in the armature for the bone in param //when baking this check is not needed, solve every bone for every frame. - /*while (fcu) { + /*FCurve *fcu = (FCurve *)ob_arm->adt->action->curves.first; + + while (fcu) { std::string bone_name = getObjectBoneName(ob_arm, fcu); int val = BLI_strcasecmp((char *)bone_name.c_str(), bone->name); if (val == 0) break; @@ -901,8 +901,7 @@ std::string AnimationExporter::create_4x4_source(std::vector &frames, Obj bPoseChannel *parchan = NULL; bPoseChannel *pchan = NULL; - bPoseChannel *rootchan = NULL; - + if (ob->type == OB_ARMATURE ){ bPose *pose = ob->pose; pchan = BKE_pose_channel_find_name(pose, bone->name); diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index 36993eae7b6..9792da3a9d7 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -111,12 +111,12 @@ bool ArmatureExporter::add_instance_controller(Object *ob) return true; } +#if 0 void ArmatureExporter::operator()(Object *ob) { Object *ob_arm = bc_get_assigned_armature(ob); } -#if 0 bool ArmatureExporter::already_written(Object *ob_arm) { @@ -248,7 +248,7 @@ void ArmatureExporter::add_blender_leaf_bone(Bone *bone, Object *ob_arm, COLLADA void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node) { - bPoseChannel *pchan = BKE_pose_channel_find_name(ob_arm->pose, bone->name); + //bPoseChannel *pchan = BKE_pose_channel_find_name(ob_arm->pose, bone->name); float mat[4][4]; diff --git a/source/blender/collada/ArmatureExporter.h b/source/blender/collada/ArmatureExporter.h index e2496a4e578..6222496a9f7 100644 --- a/source/blender/collada/ArmatureExporter.h +++ b/source/blender/collada/ArmatureExporter.h @@ -67,7 +67,7 @@ public: //void export_controllers(Scene *sce);*/ - void operator()(Object *ob); + //void operator()(Object *ob); private: Scene *scene; diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index 58c3f34e093..8328f4bc873 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -200,7 +200,6 @@ void ArmatureImporter::add_leaf_bone(float mat[4][4], EditBone *bone, COLLADAFW void ArmatureImporter::fix_leaf_bones( ) { // just setting tail for leaf bones here - float correctionMin = 1.0f; std::vector::iterator it; for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) { LeafBone& leaf = *it; @@ -212,7 +211,7 @@ void ArmatureImporter::fix_leaf_bones( ) mul_v3_fl(vec, leaf_bone_length); add_v3_v3v3(leaf.bone->tail, leaf.bone->head , vec); - } + } } #if 0 @@ -466,8 +465,6 @@ void ArmatureImporter::set_pose(Object *ob_arm, COLLADAFW::Node *root_node, con float mat[4][4]; float obmat[4][4]; - float angle = 0.0f; - // object-space get_node_mat(obmat, root_node, NULL, NULL); @@ -492,6 +489,7 @@ void ArmatureImporter::set_pose(Object *ob_arm, COLLADAFW::Node *root_node, con } + //float angle = 0.0f; ///*mat4_to_axis_angle(ax, &angle, mat); //pchan->bone->roll = angle;*/ diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp index d41c907ee98..396775e3c0e 100644 --- a/source/blender/collada/ControllerExporter.cpp +++ b/source/blender/collada/ControllerExporter.cpp @@ -393,6 +393,7 @@ void ControllerExporter::add_weight_extras(Key *key){ //skip the basis kb = kb->next; for (; kb; kb = kb->next) { + // XXX why is the weight not used here and set to 0.0? float weight = kb->curval; extra.addExtraTechniqueParameter ("KHR", "morph_weights" , 0.000, "MORPH_WEIGHT_TO_TARGET"); } diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 1d8be5910c6..b818008ac17 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -414,7 +414,7 @@ void DocumentImporter::create_constraints(ExtraTags *et, Object *ob){ std::string name; short* type = 0; et->setData("type", type); - bConstraint * con = BKE_add_ob_constraint(ob, "Test_con", *type); + BKE_add_ob_constraint(ob, "Test_con", *type); } } @@ -425,8 +425,6 @@ void DocumentImporter::write_node(COLLADAFW::Node *node, COLLADAFW::Node *parent bool is_joint = node->getType() == COLLADAFW::Node::JOINT; bool read_transform = true; - ExtraTags *et = getExtraTags(node->getUniqueId()); - std::vector *objects_done = new std::vector(); if (is_joint) { diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp index bb33e4084e0..6f620ff7947 100644 --- a/source/blender/collada/SceneExporter.cpp +++ b/source/blender/collada/SceneExporter.cpp @@ -209,7 +209,6 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce) cti->get_constraint_targets(con, &targets); if(cti){ - int i = 1; for (ct = (bConstraintTarget*)targets.first; ct; ct = ct->next){ obtar = ct->tar; std::string tar_id(id_name(obtar)); diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp index 24124c7b58d..8165417f21d 100644 --- a/source/blender/collada/TransformReader.cpp +++ b/source/blender/collada/TransformReader.cpp @@ -47,6 +47,7 @@ void TransformReader::get_node_mat(float mat[4][4], COLLADAFW::Node *node, std:: COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); if(type == COLLADAFW::Transformation::MATRIX){ + // XXX why does this return and discard all following transformations? dae_matrix_to_mat4(tm, mat); return; } -- cgit v1.2.3 From 5a51800a413c3e287bfe42de0c123892b21658f9 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Fri, 1 Feb 2013 16:03:42 +0000 Subject: Compile fix Patch [#34075] by Davis Sorenson (dsavi), thanks. --- source/blender/editors/object/object_transform.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source') diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index d933a6de166..c7b611b3607 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -57,6 +57,7 @@ #include "BKE_tessmesh.h" #include "BKE_multires.h" #include "BKE_armature.h" +#include "BKE_lattice.h" #include "RNA_define.h" #include "RNA_access.h" -- cgit v1.2.3 From 4838a2c75a77ede4e2a23b711012088beaa2626c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Feb 2013 18:00:41 +0000 Subject: Fix python foreach_get/foreach_set not working with dynamic sized arrays. --- source/blender/makesrna/intern/rna_access.c | 33 +++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index aecc114f328..11a2d947313 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -3147,6 +3147,21 @@ int RNA_raw_type_sizeof(RawPropertyType type) } } +static int rna_property_array_length_all_dimensions(PointerRNA *ptr, PropertyRNA *prop) +{ + int i, len[RNA_MAX_ARRAY_DIMENSION]; + const int dim = RNA_property_array_dimension(ptr, prop, len); + int size; + + if(dim == 0) + return 0; + + for(size = 1, i = 0; i < dim; i++) + size *= len[i]; + + return size; +} + static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *inarray, RawPropertyType intype, int inlen, int set) { @@ -3181,12 +3196,18 @@ static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *pro return 0; } - /* check item array */ - itemlen = RNA_property_array_length(&itemptr, itemprop); - + /* dynamic array? need to get length per item */ + if(itemprop->getlength) { + itemprop = NULL; + } /* try to access as raw array */ - if (RNA_property_collection_raw_array(ptr, prop, itemprop, &out)) { - int arraylen = (itemlen == 0) ? 1 : itemlen; + else if (RNA_property_collection_raw_array(ptr, prop, itemprop, &out)) { + int arraylen; + + /* check item array */ + itemlen = RNA_property_array_length(&itemptr, itemprop); + + arraylen = (itemlen == 0) ? 1 : itemlen; if (in.len != arraylen * out.len) { BKE_reportf(reports, RPT_ERROR, "Array length mismatch (expected %d, got %d)", out.len * arraylen, in.len); @@ -3243,7 +3264,7 @@ static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *pro iprop = RNA_struct_find_property(&itemptr, propname); if (iprop) { - itemlen = RNA_property_array_length(&itemptr, iprop); + itemlen = rna_property_array_length_all_dimensions(&itemptr, iprop); itemtype = RNA_property_type(iprop); } else { -- cgit v1.2.3 From 6fca85780b966bf610d8e73dc65c538747cbd485 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 00:34:34 +0000 Subject: style cleanup: also correct doc example for 'foreach_get/set' --- source/blender/editors/physics/particle_edit.c | 2 +- source/blender/python/intern/bpy_rna.c | 4 ++-- source/blender/render/intern/source/convertblender.c | 2 +- source/blender/render/intern/source/renderdatabase.c | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index deddc649956..bbd10a119e5 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -3397,7 +3397,7 @@ static int brush_add(PEData *data, short number) weight[w] = 0.0f; } - if(totw > 0.0f) { + if (totw > 0.0f) { for (w=0; wflag & R_BAKING && re->r.bake_flag & R_BAKE_VCOL) + if (re->flag & R_BAKING && re->r.bake_flag & R_BAKE_VCOL) need_origindex= 1; /* check autosmooth and displacement, we then have to skip only-verts optimize */ diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c index b25f2f4201a..0a8af1c368b 100644 --- a/source/blender/render/intern/source/renderdatabase.c +++ b/source/blender/render/intern/source/renderdatabase.c @@ -361,8 +361,8 @@ int *RE_vlakren_get_origindex(ObjectRen *obr, VlakRen *vlak, int verify) int nr= vlak->index>>8; origindex= obr->vlaknodes[nr].origindex; - if(origindex==NULL) { - if(verify) + if (origindex==NULL) { + if (verify) origindex= obr->vlaknodes[nr].origindex= MEM_callocN(256*RE_VLAK_ORIGINDEX_ELEMS*sizeof(int), "origindex table"); else return NULL; @@ -440,7 +440,7 @@ VlakRen *RE_vlakren_copy(ObjectRen *obr, VlakRen *vlr) } origindex= RE_vlakren_get_origindex(obr, vlr, 0); - if(origindex) { + if (origindex) { origindex1= RE_vlakren_get_origindex(obr, vlr1, 1); /* Just an int, but memcpy for consistency. */ memcpy(origindex1, origindex, sizeof(int)*RE_VLAK_ORIGINDEX_ELEMS); @@ -791,7 +791,7 @@ void free_renderdata_vlaknodes(VlakTableNode *vlaknodes) MEM_freeN(vlaknodes[a].mtface); if (vlaknodes[a].mcol) MEM_freeN(vlaknodes[a].mcol); - if(vlaknodes[a].origindex) + if (vlaknodes[a].origindex) MEM_freeN(vlaknodes[a].origindex); if (vlaknodes[a].surfnor) MEM_freeN(vlaknodes[a].surfnor); -- cgit v1.2.3 From c93d6f460662c79f6e82be51d2064517d7c79769 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 04:13:38 +0000 Subject: add missing break in direct_link_constraints, CONSTRAINT_SPACEONCE flag was getting set to CONSTRAINT_TYPE_KINEMATIC. --- source/blender/blenloader/intern/readfile.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 17175bec0c5..b2c5677a5c6 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2679,15 +2679,15 @@ static void direct_link_constraints(FileData *fd, ListBase *lb) data->prop = newdataadr(fd, data->prop); if (data->prop) IDP_DirectLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); - } break; + } case CONSTRAINT_TYPE_SPLINEIK: { bSplineIKConstraint *data= con->data; - + data->points= newdataadr(fd, data->points); - } break; + } case CONSTRAINT_TYPE_KINEMATIC: { bKinematicConstraint *data = con->data; @@ -2697,14 +2697,15 @@ static void direct_link_constraints(FileData *fd, ListBase *lb) /* version patch for runtime flag, was not cleared in some case */ data->flag &= ~CONSTRAINT_IK_AUTO; + break; } case CONSTRAINT_TYPE_CHILDOF: { /* XXX version patch, in older code this flag wasn't always set, and is inherent to type */ if (con->ownspace == CONSTRAINT_SPACE_POSE) con->flag |= CONSTRAINT_SPACEONCE; - } break; + } } } } -- cgit v1.2.3 From 9da4cab9fdc63505b9f0e7f96214cc03ca9ad554 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 04:48:21 +0000 Subject: style cleanup: comment format --- .../BlenderRoutines/KX_BlenderCanvas.cpp | 10 ++++---- .../gameengine/BlenderRoutines/KX_BlenderCanvas.h | 5 ++-- .../BlenderRoutines/KX_BlenderKeyboardDevice.cpp | 24 +++++++++---------- .../BlenderRoutines/KX_BlenderMouseDevice.cpp | 26 ++++++++++---------- .../Converter/BL_BlenderDataConversion.cpp | 2 +- source/gameengine/Expressions/EmptyValue.cpp | 28 +++++++++++----------- source/gameengine/Expressions/PyObjectPlus.cpp | 8 +++---- source/gameengine/GameLogic/SCA_IInputDevice.h | 25 +++++++++---------- source/gameengine/GameLogic/SCA_LogicManager.h | 8 +++---- source/gameengine/GameLogic/SCA_RandomActuator.cpp | 20 +++++----------- source/gameengine/GamePlayer/ghost/GPG_ghost.cpp | 10 ++++---- source/gameengine/Ketsji/KX_GameObject.h | 4 ++-- .../NG_LoopBackNetworkDeviceInterface.h | 4 ++-- .../gameengine/Network/NG_NetworkDeviceInterface.h | 18 +++++++------- source/gameengine/Network/NG_NetworkMessage.h | 4 ++-- .../Physics/Bullet/CcdPhysicsController.cpp | 10 ++++---- .../Physics/Bullet/CcdPhysicsController.h | 8 +++---- source/gameengine/Physics/common/PHY_IController.h | 8 +++---- .../Physics/common/PHY_IGraphicController.h | 10 ++++---- .../gameengine/Physics/common/PHY_IMotionState.h | 6 ++--- .../Physics/common/PHY_IPhysicsController.h | 14 +++++------ .../Physics/common/PHY_IPhysicsEnvironment.cpp | 7 +++--- .../Physics/common/PHY_IPhysicsEnvironment.h | 7 +++--- .../gameengine/Rasterizer/RAS_IPolygonMaterial.h | 4 ++-- .../RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h | 5 ++-- source/gameengine/SceneGraph/SG_ParentRelation.h | 4 ++-- source/gameengine/VideoTexture/VideoFFmpeg.cpp | 2 +- 27 files changed, 137 insertions(+), 144 deletions(-) (limited to 'source') diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp index 719041e8d41..6ab1d032bf2 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp @@ -154,11 +154,11 @@ SetViewPort( int x1, int y1, int x2, int y2 ) { - /* x1 and y1 are the min pixel coordinate (e.g. 0) - x2 and y2 are the max pixel coordinate - the width,height is calculated including both pixels - therefore: max - min + 1 - */ + /* x1 and y1 are the min pixel coordinate (e.g. 0) + * x2 and y2 are the max pixel coordinate + * the width,height is calculated including both pixels + * therefore: max - min + 1 + */ int vp_width = (x2 - x1) + 1; int vp_height = (y2 - y1) + 1; int minx = m_frame_rect.GetLeft(); diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h index 4117c13aede..430f956bc7f 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h @@ -58,8 +58,9 @@ struct wmWindow; class KX_BlenderCanvas : public RAS_ICanvas { private: - /** Rect that defines the area used for rendering, - relative to the context */ + /** + * Rect that defines the area used for rendering, + * relative to the context */ RAS_Rect m_displayarea; int m_viewport[4]; diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp index 19ba46ed6d7..5917ce40440 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp @@ -49,8 +49,8 @@ KX_BlenderKeyboardDevice::~KX_BlenderKeyboardDevice() } /** - IsPressed gives boolean information about keyboard status, true if pressed, false if not -*/ + * IsPressed gives boolean information about keyboard status, true if pressed, false if not + */ bool KX_BlenderKeyboardDevice::IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode) { @@ -64,11 +64,11 @@ bool KX_BlenderKeyboardDevice::IsPressed(SCA_IInputDevice::KX_EnumInputs inputco return m_eventStatusTables[m_currentTable][inputcode]; } */ -/** - NextFrame toggles currentTable with previousTable, - and copy relevant event information from previous to current - (pressed keys need to be remembered) -*/ +/** + * NextFrame toggles currentTable with previousTable, + * and copy relevant event information from previous to current + * (pressed keys need to be remembered) + */ void KX_BlenderKeyboardDevice::NextFrame() { SCA_IInputDevice::NextFrame(); @@ -87,13 +87,11 @@ void KX_BlenderKeyboardDevice::NextFrame() } } -/** - ConvertBlenderEvent translates blender keyboard events into ketsji kbd events - extra event information is stored, like ramp-mode (just released/pressed) +/** + * ConvertBlenderEvent translates blender keyboard events into ketsji kbd events + * extra event information is stored, like ramp-mode (just released/pressed) */ - - -bool KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode,short val) +bool KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode, short val) { bool result = false; diff --git a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp index 8d90eacd27f..0cdc10264a5 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp @@ -46,8 +46,8 @@ KX_BlenderMouseDevice::~KX_BlenderMouseDevice() } /** - IsPressed gives boolean information about mouse status, true if pressed, false if not -*/ + * IsPressed gives boolean information about mouse status, true if pressed, false if not + */ bool KX_BlenderMouseDevice::IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode) { @@ -62,11 +62,11 @@ bool KX_BlenderMouseDevice::IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode) } */ -/** - NextFrame toggles currentTable with previousTable, - and copy relevant event information from previous to current - (pressed keys need to be remembered) -*/ +/** + * NextFrame toggles currentTable with previousTable, + * and copy relevant event information from previous to current + * (pressed keys need to be remembered) + */ void KX_BlenderMouseDevice::NextFrame() { SCA_IInputDevice::NextFrame(); @@ -104,13 +104,11 @@ void KX_BlenderMouseDevice::NextFrame() } -/** - ConvertBlenderEvent translates blender mouse events into ketsji kbd events - extra event information is stored, like ramp-mode (just released/pressed) -*/ - - -bool KX_BlenderMouseDevice::ConvertBlenderEvent(unsigned short incode,short val) +/** + * ConvertBlenderEvent translates blender mouse events into ketsji kbd events + * extra event information is stored, like ramp-mode (just released/pressed) + */ +bool KX_BlenderMouseDevice::ConvertBlenderEvent(unsigned short incode, short val) { bool result = false; diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index ae902e23d65..8b81abf1728 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -933,7 +933,7 @@ static RAS_MaterialBucket *material_from_mesh(Material *ma, MFace *mface, MTFace if (ma) { alpha_blend = ma->game.alpha_blend; /* Commented out for now. If we ever get rid of - * "Texture Face/Singletexture" we can then think about it */ + * "Texture Face/Singletexture" we can then think about it */ /* Texture Face mode ignores texture but requires "Face Textures to be True "*/ #if 0 diff --git a/source/gameengine/Expressions/EmptyValue.cpp b/source/gameengine/Expressions/EmptyValue.cpp index 2bb8f69ac51..8170c588a28 100644 --- a/source/gameengine/Expressions/EmptyValue.cpp +++ b/source/gameengine/Expressions/EmptyValue.cpp @@ -30,9 +30,9 @@ CEmptyValue::CEmptyValue() /* -pre: -effect: constructs a new CEmptyValue -*/ + * pre: + * effect: constructs a new CEmptyValue + */ { SetModified(false); } @@ -41,9 +41,9 @@ effect: constructs a new CEmptyValue CEmptyValue::~CEmptyValue() /* -pre: -effect: deletes the object -*/ + * pre: + * effect: deletes the object + */ { } @@ -52,10 +52,10 @@ effect: deletes the object CValue * CEmptyValue::Calc(VALUE_OPERATOR op, CValue * val) /* -pre: -ret: a new object containing the result of applying operator op to this -object and val -*/ + * pre: + * ret: a new object containing the result of applying operator op to this + * object and val + */ { return val->CalcFinal(VALUE_EMPTY_TYPE, op, this); @@ -65,10 +65,10 @@ object and val CValue * CEmptyValue::CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue * val) /* -pre: the type of val is dtype -ret: a new object containing the result of applying operator op to val and -this object -*/ + * pre: the type of val is dtype + * ret: a new object containing the result of applying operator op to val and + * this object + */ { return val->AddRef(); } diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp index 4e910a885eb..52ad95c71b6 100644 --- a/source/gameengine/Expressions/PyObjectPlus.cpp +++ b/source/gameengine/Expressions/PyObjectPlus.cpp @@ -43,7 +43,7 @@ * Center for the Neural Basis of Cognition (CNBC) * http://www.python.org/doc/PyCPP.html * -------------------------------*/ + * ----------------------------- */ #include #include @@ -103,7 +103,7 @@ void PyObjectPlus::InvalidateProxy() // check typename of each parent /*------------------------------ * PyObjectPlus Type -- Every class, even the abstract one should have a Type -------------------------------*/ + * ----------------------------- */ PyTypeObject PyObjectPlus::Type = { @@ -217,8 +217,8 @@ PyObject *PyObjectPlus::py_base_new(PyTypeObject *type, PyObject *args, PyObject } /** - * \param self A PyObjectPlus_Proxy - */ + * \param self A PyObjectPlus_Proxy + */ void PyObjectPlus::py_base_dealloc(PyObject *self) // python wrapper { #ifdef USE_WEAKREFS diff --git a/source/gameengine/GameLogic/SCA_IInputDevice.h b/source/gameengine/GameLogic/SCA_IInputDevice.h index 1a403f40955..ceb9c1e1d4f 100644 --- a/source/gameengine/GameLogic/SCA_IInputDevice.h +++ b/source/gameengine/GameLogic/SCA_IInputDevice.h @@ -269,7 +269,7 @@ public: KX_MAX_KEYS - } ; // enum + }; // enum protected: @@ -301,17 +301,18 @@ public: virtual void HookEscape(); - /* Next frame: we calculate the new key states. This goes as follows: - * - * KX_NO_INPUTSTATUS -> KX_NO_INPUTSTATUS - * KX_JUSTACTIVATED -> KX_ACTIVE - * KX_ACTIVE -> KX_ACTIVE - * KX_JUSTRELEASED -> KX_NO_INPUTSTATUS - * - * Getting new events provides the - * KX_NO_INPUTSTATUS->KX_JUSTACTIVATED and - * KX_ACTIVE->KX_JUSTRELEASED transitions. - */ + /** + * Next frame: we calculate the new key states. This goes as follows: + * + * KX_NO_INPUTSTATUS -> KX_NO_INPUTSTATUS + * KX_JUSTACTIVATED -> KX_ACTIVE + * KX_ACTIVE -> KX_ACTIVE + * KX_JUSTRELEASED -> KX_NO_INPUTSTATUS + * + * Getting new events provides the + * KX_NO_INPUTSTATUS->KX_JUSTACTIVATED and + * KX_ACTIVE->KX_JUSTRELEASED transitions. + */ virtual void NextFrame(); diff --git a/source/gameengine/GameLogic/SCA_LogicManager.h b/source/gameengine/GameLogic/SCA_LogicManager.h index 690930196b3..4d8c20065b5 100644 --- a/source/gameengine/GameLogic/SCA_LogicManager.h +++ b/source/gameengine/GameLogic/SCA_LogicManager.h @@ -52,7 +52,7 @@ using namespace std; typedef std::list controllerlist; typedef std::map sensormap_t; -/** +/** * This manager handles sensor, controllers and actuators. * logic executes each frame the following way: * find triggering sensors @@ -63,7 +63,7 @@ typedef std::map sensormap_t; * clear triggering sensors * clear triggered controllers * (actuators may be active during a longer timeframe) -*/ + */ #include "SCA_ILogicBrick.h" #include "SCA_IActuator.h" @@ -117,8 +117,8 @@ public: void RemoveGameObject(const STR_String& gameobjname); /** - * remove Logic Bricks from the running logicmanager - */ + * remove Logic Bricks from the running logicmanager + */ void RemoveSensor(SCA_ISensor* sensor); void RemoveController(SCA_IController* controller); void RemoveActuator(SCA_IActuator* actuator); diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.cpp b/source/gameengine/GameLogic/SCA_RandomActuator.cpp index 5568072abcf..db6b4a63423 100644 --- a/source/gameengine/GameLogic/SCA_RandomActuator.cpp +++ b/source/gameengine/GameLogic/SCA_RandomActuator.cpp @@ -178,23 +178,15 @@ bool SCA_RandomActuator::Update() case KX_RANDOMACT_FLOAT_NORMAL: { /* normal (big numbers): para1 = mean, para2 = std dev */ - /* - - 070301 - nzc - Changed the termination condition. I think I - made a small mistake here, but it only affects distro's where - the seed equals 0. In that case, the algorithm locks. Let's - just guard that case separately. - - */ + /* 070301 - nzc: Changed the termination condition. I think I + * made a small mistake here, but it only affects distro's where + * the seed equals 0. In that case, the algorithm locks. Let's + * just guard that case separately. + */ float x = 0.0, y = 0.0, s = 0.0, t = 0.0; if (m_base->GetSeed() == 0) { - /* - - 070301 - nzc - Just taking the mean here seems reasonable. - - */ + /* 070301 - nzc: Just taking the mean here seems reasonable. */ tmpval = new CFloatValue(m_parameter1); } else { diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp index 26e9bcbf65d..5082fca2032 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp @@ -258,10 +258,10 @@ static void usage(const char* program, bool isBlenderPlayer) static void get_filename(int argc, char **argv, char *filename) { #ifdef __APPLE__ -/* On Mac we park the game file (called game.blend) in the application bundle. -* The executable is located in the bundle as well. -* Therefore, we can locate the game relative to the executable. - */ + /* On Mac we park the game file (called game.blend) in the application bundle. + * The executable is located in the bundle as well. + * Therefore, we can locate the game relative to the executable. + */ int srclen = ::strlen(argv[0]); int len = 0; char *gamefile = NULL; @@ -471,7 +471,7 @@ int main(int argc, char** argv) break; case SCREEN_SAVER_MODE_PASSWORD: /* This is W95 only, which we currently do not support. - Fall-back to normal screen saver behavior in that case... */ + * Fall-back to normal screen saver behavior in that case... */ case SCREEN_SAVER_MODE_SAVER: fullScreen = true; fullScreenParFound = true; diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index e71af674a79..253b5e26ebe 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -501,8 +501,8 @@ public: void SetUserCollisionGroup(short filter); void SetUserCollisionMask(short mask); /** - * Extra broadphase check for user controllable collisions - */ + * Extra broadphase check for user controllable collisions + */ bool CheckCollision(KX_GameObject *other); /** diff --git a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h index 7581486c80a..8bbb1e91e35 100644 --- a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h +++ b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h @@ -45,8 +45,8 @@ public: virtual ~NG_LoopBackNetworkDeviceInterface(); /** - * Clear message buffer - */ + * Clear message buffer + */ virtual void NextFrame(); bool Connect(char *address, unsigned int port, char *password, diff --git a/source/gameengine/Network/NG_NetworkDeviceInterface.h b/source/gameengine/Network/NG_NetworkDeviceInterface.h index 6da478ecda5..7fcf799db31 100644 --- a/source/gameengine/Network/NG_NetworkDeviceInterface.h +++ b/source/gameengine/Network/NG_NetworkDeviceInterface.h @@ -49,16 +49,16 @@ public: virtual void NextFrame()=0; /** - * Mark network connection online - */ + * Mark network connection online + */ void Online(void) { m_online = true; } /** - * Mark network connection offline - */ + * Mark network connection offline + */ void Offline(void) { m_online = false; } /** - * Is the network connection established ? - */ + * Is the network connection established ? + */ bool IsOnline(void) { return m_online; } virtual bool Connect(char *address, unsigned int port, char *password, @@ -67,9 +67,9 @@ public: virtual void SendNetworkMessage(NG_NetworkMessage* msg)=0; /** - * read NG_NetworkMessage from library buffer, may be - * irrelevant for loopbackdevices - */ + * read NG_NetworkMessage from library buffer, may be + * irrelevant for loopbackdevices + */ virtual std::vector RetrieveNetworkMessages()=0; diff --git a/source/gameengine/Network/NG_NetworkMessage.h b/source/gameengine/Network/NG_NetworkMessage.h index 5185849f8d7..6ed266557fc 100644 --- a/source/gameengine/Network/NG_NetworkMessage.h +++ b/source/gameengine/Network/NG_NetworkMessage.h @@ -123,8 +123,8 @@ public: } /** - * get the unique Network Message ID - */ + * get the unique Network Message ID + */ int GetMessageID() { return m_uniqueMessageID; } diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 0bf11fd2f9d..01c56b43f4f 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -675,9 +675,9 @@ CcdPhysicsController::~CcdPhysicsController() } - /** - SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding') - */ +/** + * SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding') + */ bool CcdPhysicsController::SynchronizeMotionStates(float time) { //sync non-static to motionstate, and static from motionstate (todo: add kinematic etc.) @@ -760,8 +760,8 @@ bool CcdPhysicsController::SynchronizeMotionStates(float time) } /** - WriteMotionStateToDynamics synchronizes dynas, kinematic and deformable entities (and do 'late binding') - */ + * WriteMotionStateToDynamics synchronizes dynas, kinematic and deformable entities (and do 'late binding') + */ void CcdPhysicsController::WriteMotionStateToDynamics(bool nondynaonly) { diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index d06403a55a2..b271b9c424f 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -503,12 +503,12 @@ protected: /** - SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding') - */ + * SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding') + */ virtual bool SynchronizeMotionStates(float time); /** - WriteMotionStateToDynamics ynchronizes dynas, kinematic and deformable entities (and do 'late binding') - */ + * WriteMotionStateToDynamics ynchronizes dynas, kinematic and deformable entities (and do 'late binding') + */ virtual void WriteMotionStateToDynamics(bool nondynaonly); virtual void WriteDynamicsToMotionState(); diff --git a/source/gameengine/Physics/common/PHY_IController.h b/source/gameengine/Physics/common/PHY_IController.h index 003c4edf598..77864b740bd 100644 --- a/source/gameengine/Physics/common/PHY_IController.h +++ b/source/gameengine/Physics/common/PHY_IController.h @@ -41,10 +41,10 @@ class PHY_IPhysicsEnvironment; #endif /** - PHY_IController is the abstract simplified Interface to objects - controlled by the physics engine. This includes the physics objects - and the graphics object for view frustrum and occlusion culling. -*/ + * PHY_IController is the abstract simplified Interface to objects + * controlled by the physics engine. This includes the physics objects + * and the graphics object for view frustrum and occlusion culling. + */ class PHY_IController { public: diff --git a/source/gameengine/Physics/common/PHY_IGraphicController.h b/source/gameengine/Physics/common/PHY_IGraphicController.h index cb13eda4f18..fb36481ddbc 100644 --- a/source/gameengine/Physics/common/PHY_IGraphicController.h +++ b/source/gameengine/Physics/common/PHY_IGraphicController.h @@ -36,16 +36,16 @@ /** - PHY_IPhysicsController is the abstract simplified Interface to a physical object. - It contains the IMotionState and IDeformableMesh Interfaces. -*/ + * PHY_IPhysicsController is the abstract simplified Interface to a physical object. + * It contains the IMotionState and IDeformableMesh Interfaces. + */ class PHY_IGraphicController : public PHY_IController { public: virtual ~PHY_IGraphicController(); /** - SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding') - */ + * SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding') + */ virtual bool SetGraphicTransform()=0; virtual void Activate(bool active=true)=0; virtual void setLocalAabb(const PHY__Vector3& aabbMin,const PHY__Vector3& aabbMax)=0; diff --git a/source/gameengine/Physics/common/PHY_IMotionState.h b/source/gameengine/Physics/common/PHY_IMotionState.h index ccf7cf74724..61ed87362c0 100644 --- a/source/gameengine/Physics/common/PHY_IMotionState.h +++ b/source/gameengine/Physics/common/PHY_IMotionState.h @@ -37,9 +37,9 @@ #endif /** - PHY_IMotionState is the Interface to explicitly synchronize the world transformation. - Default implementations for mayor graphics libraries like OpenGL and DirectX can be provided. -*/ + * PHY_IMotionState is the Interface to explicitly synchronize the world transformation. + * Default implementations for mayor graphics libraries like OpenGL and DirectX can be provided. + */ class PHY_IMotionState { diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h index bc7671abe80..871edeec752 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsController.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h @@ -38,21 +38,21 @@ class PHY_IMotionState; class PHY_IPhysicsEnvironment; /** - PHY_IPhysicsController is the abstract simplified Interface to a physical object. - It contains the IMotionState and IDeformableMesh Interfaces. -*/ + * PHY_IPhysicsController is the abstract simplified Interface to a physical object. + * It contains the IMotionState and IDeformableMesh Interfaces. + */ class PHY_IPhysicsController : public PHY_IController { public: virtual ~PHY_IPhysicsController(); /** - SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding') - */ + * SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding') + */ virtual bool SynchronizeMotionStates(float time)=0; /** - WriteMotionStateToDynamics ynchronizes dynas, kinematic and deformable entities (and do 'late binding') - */ + * WriteMotionStateToDynamics ynchronizes dynas, kinematic and deformable entities (and do 'late binding') + */ virtual void WriteMotionStateToDynamics(bool nondynaonly)=0; virtual void WriteDynamicsToMotionState()=0; diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp index 142318cc7c2..110ffc705fe 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp @@ -33,9 +33,10 @@ #include "PHY_IPhysicsEnvironment.h" /** -* Physics Environment takes care of stepping the simulation and is a container for physics entities (rigidbodies,constraints, materials etc.) -* A derived class may be able to 'construct' entities by loading and/or converting -*/ + * Physics Environment takes care of stepping the simulation and is a container for physics entities + * (rigidbodies,constraints, materials etc.) + * A derived class may be able to 'construct' entities by loading and/or converting + */ diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h index bfbe570ad0c..6a76745c7ca 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h @@ -96,9 +96,10 @@ public: }; /** -* Physics Environment takes care of stepping the simulation and is a container for physics entities (rigidbodies,constraints, materials etc.) -* A derived class may be able to 'construct' entities by loading and/or converting -*/ + * Physics Environment takes care of stepping the simulation and is a container for physics entities + * (rigidbodies,constraints, materials etc.) + * A derived class may be able to 'construct' entities by loading and/or converting + */ class PHY_IPhysicsEnvironment { public: diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h index b267879611e..7aeeb364b47 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h @@ -177,8 +177,8 @@ public: virtual void Replace_IScene(SCA_IScene *val) {} /* overridden by KX_BlenderMaterial */ /** - * \return the equivalent drawing mode for the material settings (equivalent to old TexFace tface->mode). - */ + * \return the equivalent drawing mode for the material settings (equivalent to old TexFace tface->mode). + */ int ConvertFaceMode(struct GameSettings *game, bool image) const; /* diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h index 5ff2709747d..64c07358d95 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h @@ -117,8 +117,9 @@ protected: /** Stores the caching information for the last material activated. */ RAS_IPolyMaterial::TCachingInfo m_materialCachingInfo; - /** Making use of a Strategy desing pattern for storage behavior. - Examples of concrete strategies: Vertex Arrays, VBOs, Immediate Mode*/ + /** + * Making use of a Strategy desing pattern for storage behavior. + * Examples of concrete strategies: Vertex Arrays, VBOs, Immediate Mode*/ int m_storage_type; RAS_IStorage* m_storage; RAS_IStorage* m_failsafe_storage; //So derived mesh can use immediate mode diff --git a/source/gameengine/SceneGraph/SG_ParentRelation.h b/source/gameengine/SceneGraph/SG_ParentRelation.h index 6e314996456..ce45b42c148 100644 --- a/source/gameengine/SceneGraph/SG_ParentRelation.h +++ b/source/gameengine/SceneGraph/SG_ParentRelation.h @@ -29,7 +29,7 @@ /** \file SG_ParentRelation.h * \ingroup bgesg * \page SG_ParentRelationPage SG_ParentRelation - + * * \section SG_ParentRelationSection SG_ParentRelation * * This is an abstract interface class to the Scene Graph library. @@ -48,7 +48,7 @@ * should not be value types and should be allocated on the heap. * */ - + #ifndef __SG_PARENTRELATION_H__ #define __SG_PARENTRELATION_H__ diff --git a/source/gameengine/VideoTexture/VideoFFmpeg.cpp b/source/gameengine/VideoTexture/VideoFFmpeg.cpp index 10eef9e0cf2..93a1d09869b 100644 --- a/source/gameengine/VideoTexture/VideoFFmpeg.cpp +++ b/source/gameengine/VideoTexture/VideoFFmpeg.cpp @@ -1022,7 +1022,7 @@ AVFrame *VideoFFmpeg::grabFrame(long position) AVFrame * input = m_frame; /* This means the data wasnt read properly, - this check stops crashing */ + * this check stops crashing */ if ( input->data[0]==0 && input->data[1]==0 && input->data[2]==0 && input->data[3]==0) { -- cgit v1.2.3 From 518bfbb1c92e786c8f2cb651819d0302ec13e6ef Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 04:58:03 +0000 Subject: style cleanup --- source/blender/blenkernel/BKE_particle.h | 2 +- source/blender/blenkernel/intern/displist.c | 2 +- source/blender/blenkernel/intern/mesh.c | 2 +- source/blender/blenkernel/intern/pbvh_bmesh.c | 2 +- source/blender/blenkernel/intern/scene.c | 2 +- source/blender/blenlib/intern/math_geom.c | 4 ++-- source/blender/bmesh/tools/bmesh_bevel.c | 4 ++-- source/blender/collada/SceneExporter.cpp | 2 +- source/blender/collada/TransformReader.cpp | 6 +++--- source/blender/editors/animation/anim_markers.c | 5 ++--- source/blender/editors/interface/interface.c | 2 +- source/blender/editors/interface/interface_anim.c | 2 +- source/blender/editors/screen/screen_ops.c | 4 ++-- source/blender/editors/sculpt_paint/paint_image.c | 2 +- source/blender/editors/space_image/image_draw.c | 6 +++--- source/blender/editors/space_outliner/outliner_edit.c | 4 ++-- source/blender/editors/transform/transform_input.c | 2 +- source/blender/editors/uvedit/uvedit_smart_stitch.c | 2 +- source/blender/makesdna/DNA_brush_types.h | 2 +- source/blender/makesrna/intern/makesrna.c | 4 ++-- source/blender/makesrna/intern/rna_curve.c | 2 +- source/blender/makesrna/intern/rna_sequencer.c | 2 +- source/blender/nodes/composite/nodes/node_composite_channelMatte.c | 4 ++-- source/blender/nodes/intern/node_common.c | 2 +- source/blender/nodes/shader/node_shader_util.c | 2 +- source/blender/render/intern/source/bake.c | 6 +++--- source/blender/windowmanager/intern/wm_event_system.c | 6 +++--- source/creator/creator.c | 2 +- 28 files changed, 43 insertions(+), 44 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 3394c4f4ce0..a9a8bc32064 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -96,7 +96,7 @@ typedef struct SPHData { float *gravity; float hfac; /* Average distance to neighbours (other particles in the support domain), - for calculating the Courant number (adaptive time step). */ + * for calculating the Courant number (adaptive time step). */ int pass; float element_size; float flow[3]; diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index ada33691c15..08b107849b6 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -507,7 +507,7 @@ void BKE_displist_fill(ListBase *dispbase, ListBase *to, int flipnormal) dl = dl->next; } - /* XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) { */ + /* XXX (obedit && obedit->actcol) ? (obedit->actcol-1) : 0)) { */ if (totvert && (tot = BLI_scanfill_calc(&sf_ctx, BLI_SCANFILL_CALC_REMOVE_DOUBLES | BLI_SCANFILL_CALC_HOLES))) { if (tot) { dlnew = MEM_callocN(sizeof(DispList), "filldisplist"); diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 03df0c28944..dba2fd50706 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1489,7 +1489,7 @@ void BKE_mesh_from_nurbs_displist(Object *ob, ListBase *dispbase, int use_orco_u if (dm == NULL) { if (BKE_mesh_nurbs_displist_to_mdata(ob, dispbase, &allvert, &totvert, &alledge, &totedge, &allloop, - &allpoly, (use_orco_uv)? &alluv: NULL, + &allpoly, (use_orco_uv) ? &alluv : NULL, &totloop, &totpoly) != 0) { /* Error initializing */ diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c index 9a0b1a76988..666c85d2f6b 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.c +++ b/source/blender/blenkernel/intern/pbvh_bmesh.c @@ -770,7 +770,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *bvh, BMEdge *e, BMVert *v1, BM_edge_kill(bvh->bm, e); /* For all remaining faces of v2, create a new face that is the - same except it uses v1 instead of v2 */ + * same except it uses v1 instead of v2 */ /* Note: this could be done with BM_vert_splice(), but that * requires handling other issues like duplicate edges, so doesn't * really buy anything. */ diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 9e8cf985f71..4ac9312d57d 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1065,7 +1065,7 @@ static void scene_depsgraph_hack(Scene *scene, Scene *scene_parent) if (ob->depsflag) { int recalc = 0; - // printf("depshack %s\n", ob->id.name+2); + // printf("depshack %s\n", ob->id.name + 2); if (ob->depsflag & OB_DEPS_EXTRA_OB_RECALC) recalc |= OB_RECALC_OB; diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index fc1d0e99a30..70a02544acf 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -2378,7 +2378,7 @@ void interp_weights_poly_v3(float *w, float v[][3], const int n, const float co[ t2 = mean_value_half_tan_v3(co, vmid, vnext); len = len_v3v3(co, vmid); - w[i] = (len != 0.0f)? (t1 + t2) / len: 0.0f; + w[i] = (len != 0.0f) ? (t1 + t2) / len: 0.0f; totweight += w[i]; } @@ -2430,7 +2430,7 @@ void interp_weights_poly_v2(float *w, float v[][2], const int n, const float co[ t2 = mean_value_half_tan_v2(co, vmid, vnext); len = len_v2v2(co, vmid); - w[i] = (len != 0.0f)? (t1 + t2) / len: 0.0f; + w[i] = (len != 0.0f) ? (t1 + t2) / len: 0.0f; totweight += w[i]; } diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index d82cd678787..e60ce562c6c 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -518,7 +518,7 @@ static int bev_ccw_test(BMEdge *a, BMEdge *b, BMFace *f) * We want M to make M*A=B where A has the left side above, as columns * and B has the right side as columns - both extended into homogeneous coords. * So M = B*(Ainverse). Doing Ainverse by hand gives the code below. -*/ + */ static int make_unit_square_map(const float va[3], const float vmid[3], const float vb[3], float r_mat[4][4]) { @@ -1304,7 +1304,7 @@ static void fix_vmesh_tangents(VMesh *vm, BevVert *bv) /* Also want (i, 1, k) snapped to plane of adjacent face for * 1 < k < ns - 1, but current initial cage and subdiv rules - * ensure this, so nothing to do */ + * ensure this, so nothing to do */ } while ((bndv = bndv->next) != vm->boundstart); } diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp index 6f620ff7947..e3b56208aeb 100644 --- a/source/blender/collada/SceneExporter.cpp +++ b/source/blender/collada/SceneExporter.cpp @@ -184,7 +184,7 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce) if (ob->constraints.first != NULL ){ bConstraint *con = (bConstraint*) ob->constraints.first; - while(con){ + while (con) { std::string con_name(id_name(con)); std::string con_tag = con_name + "_constraint"; colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"type",con->type); diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp index 8165417f21d..913c0710cc6 100644 --- a/source/blender/collada/TransformReader.cpp +++ b/source/blender/collada/TransformReader.cpp @@ -45,13 +45,13 @@ void TransformReader::get_node_mat(float mat[4][4], COLLADAFW::Node *node, std:: COLLADAFW::Transformation *tm = node->getTransformations()[i]; COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); - - if(type == COLLADAFW::Transformation::MATRIX){ + + if (type == COLLADAFW::Transformation::MATRIX){ // XXX why does this return and discard all following transformations? dae_matrix_to_mat4(tm, mat); return; } - else{ + else { switch (type) { case COLLADAFW::Transformation::TRANSLATE: dae_translate_to_mat4(tm, cur); diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index ef1b73fc58f..ccd8309f794 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -146,16 +146,15 @@ int ED_markers_post_apply_transform(ListBase *markers, Scene *scene, int mode, f marker->frame += (int)floorf(value + 0.5f); changed++; } + break; } - break; - case TFM_TIME_SCALE: { /* rescale the distance between the marker and the current frame */ marker->frame = cfra + (int)floorf(((float)(marker->frame - cfra) * value) + 0.5f); changed++; + break; } - break; } } } diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 1dee497ff11..589ff3e1951 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -997,7 +997,7 @@ void ui_fontscale(short *points, float aspect) /* project button or block (but==NULL) to pixels in regionspace */ static void ui_but_to_pixelrect(rcti *rect, const ARegion *ar, uiBlock *block, uiBut *but) { - rctf rectf = (but)? but->rect: block->rect; + rctf rectf = (but) ? but->rect : block->rect; ui_block_to_window_fl(ar, block, &rectf.xmin, &rectf.ymin); ui_block_to_window_fl(ar, block, &rectf.xmax, &rectf.ymax); diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 3a4a6442fd6..e4c163e9162 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -59,7 +59,7 @@ static FCurve *ui_but_get_fcurve(uiBut *but, bAction **action, int *driven) { /* for entire array buttons we check the first component, it's not perfect * but works well enough in typical cases */ - int rnaindex = (but->rnaindex == -1)? 0: but->rnaindex; + int rnaindex = (but->rnaindex == -1) ? 0 : but->rnaindex; return rna_get_fcurve(&but->rnapoin, but->rnaprop, rnaindex, action, driven); } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index e7f5e57552c..2ace91b5e05 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -3598,8 +3598,8 @@ static void SCENE_OT_delete(wmOperatorType *ot) /* ***************** region alpha blending ***************** */ /* implementation note: a disapplearing region needs at least 1 last draw with 100% backbuffer - texture over it- then triple buffer will clear it entirely. - This because flag RGN_HIDDEN is set in end - region doesnt draw at all then */ + * texture over it- then triple buffer will clear it entirely. + * This because flag RGN_HIDDEN is set in end - region doesnt draw at all then */ typedef struct RegionAlphaInfo { ScrArea *sa; diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index c60097e20eb..74399857a97 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -4347,7 +4347,7 @@ static int project_paint_sub_stroke(ProjPaintState *ps, BrushPainter *painter, c pos[1] = (float)(mval_i[1]); // we may want to use this later - // BKE_brush_painter_require_imbuf(painter, ((ibuf->rect_float)? 1: 0), 0, 0); + // BKE_brush_painter_require_imbuf(painter, ((ibuf->rect_float) ? 1 : 0), 0, 0); if (BKE_brush_painter_paint(painter, project_paint_op, pos, time, pressure, ps, 0)) { return 1; diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 915036cf70e..00bc3d1d26b 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -425,11 +425,11 @@ static void sima_draw_alpha_pixelsf(float x1, float y1, int rectx, int recty, fl MEM_freeN(trectf); /* ogl trick below is slower... (on ATI 9600) */ // glColorMask(1, 0, 0, 0); -// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf+3); +// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf + 3); // glColorMask(0, 1, 0, 0); -// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf+2); +// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf + 2); // glColorMask(0, 0, 1, 0); -// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf+1); +// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf + 1); // glColorMask(1, 1, 1, 1); } diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c index a087ff65f63..41641c80188 100644 --- a/source/blender/editors/space_outliner/outliner_edit.c +++ b/source/blender/editors/space_outliner/outliner_edit.c @@ -1309,8 +1309,8 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa * for now, we don't supply one, and just let this use the KeyingSet name */ BKE_keyingset_add_path(ks, id, NULL, path, array_index, flag, groupmode); ks->active_path = BLI_countlist(&ks->paths); + break; } - break; case KEYINGSET_EDITMODE_REMOVE: { /* find the relevant path, then remove it from the KeyingSet */ @@ -1322,8 +1322,8 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa ks->active_path = 0; } + break; } - break; } /* free path, since it had to be generated */ diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index 2e34de6c568..dd1510498b0 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -238,7 +238,7 @@ static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, const int mval[2], double deler = (((dx1 * dx1 + dy1 * dy1) + (dx2 * dx2 + dy2 * dy2) - (dx3 * dx3 + dy3 * dy3)) / (2.0 * ((A * B) ? (A * B) : 1.0))); - /* ((A*B)?(A*B):1.0) this takes care of potential divide by zero errors */ + /* ((A * B) ? (A * B) : 1.0) this takes care of potential divide by zero errors */ float dphi; diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c index b1bb5c85e50..1b43d829947 100644 --- a/source/blender/editors/uvedit/uvedit_smart_stitch.c +++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c @@ -650,7 +650,7 @@ static void stitch_uv_edge_generate_linked_edges(GHash *edge_hash, StitchState * edge2 = BLI_ghash_lookup(edge_hash, &edgetmp); /* here I am taking care of non manifold case, assuming more than two matching edges. - * I am not too sure we want this though */ + * I am not too sure we want this though */ last_set->next = edge2; last_set = edge2; /* set first, similarly to uv elements. Now we can iterate among common edges easily */ diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h index 41c47f8de15..62d696ec255 100644 --- a/source/blender/makesdna/DNA_brush_types.h +++ b/source/blender/makesdna/DNA_brush_types.h @@ -164,7 +164,7 @@ typedef enum BrushSculptTool { } BrushSculptTool; /* ImagePaintSettings.tool */ -typedef enum BrushImagePaintTool{ +typedef enum BrushImagePaintTool { PAINT_TOOL_DRAW = 0, PAINT_TOOL_SOFTEN = 1, PAINT_TOOL_SMEAR = 2, diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 41b6e3e5ca6..01df05677e7 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -3427,7 +3427,7 @@ static const char *cpp_classes = "" "namespace BL {\n" "\n" "#define BOOLEAN_PROPERTY(sname, identifier) \\\n" -" inline bool sname::identifier(void) { return sname##_##identifier##_get(&ptr)? true: false; } \\\n" +" inline bool sname::identifier(void) { return sname##_##identifier##_get(&ptr) ? true: false; } \\\n" " inline void sname::identifier(int value) { sname##_##identifier##_set(&ptr, value); }\n" "\n" "#define BOOLEAN_ARRAY_PROPERTY(sname, size, identifier) \\\n" @@ -3586,7 +3586,7 @@ static const char *cpp_classes = "" "public:\n" " Pointer(const PointerRNA &p) : ptr(p) { }\n" " operator const PointerRNA&() { return ptr; }\n" -" bool is_a(StructRNA *type) { return RNA_struct_is_a(ptr.type, type)? true: false; }\n" +" bool is_a(StructRNA *type) { return RNA_struct_is_a(ptr.type, type) ? true: false; }\n" " operator void*() { return ptr.data; }\n" " operator bool() { return ptr.data != NULL; }\n" "\n" diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index 21aed20ccc3..8f8136b0a28 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -460,7 +460,7 @@ static void rna_Curve_body_set(PointerRNA *ptr, const char *value) /* don't know why this is +4, just duplicating load_editText() */ cu->strinfo = MEM_callocN((len + 4) * sizeof(CharInfo), "strinfo"); - /*BLI_strncpy_wchar_as_utf8(cu->str, value, len+1); *//* value is not wchar_t */ + /*BLI_strncpy_wchar_as_utf8(cu->str, value, len + 1); *//* value is not wchar_t */ BLI_strncpy(cu->str, value, len + 1); } diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index f7daf6a3b06..d699e8ae0bb 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -413,7 +413,7 @@ static void rna_Sequence_name_set(PointerRNA *ptr, const char *value) /* fix all the animation data which may link to this */ /* don't rename everywhere because these are per scene */ - /* BKE_all_animdata_fix_paths_rename(NULL, "sequence_editor.sequences_all", oldname, seq->name+2); */ + /* BKE_all_animdata_fix_paths_rename(NULL, "sequence_editor.sequences_all", oldname, seq->name + 2); */ adt = BKE_animdata_from_id(&scene->id); if (adt) BKE_animdata_fix_paths_rename(&scene->id, adt, NULL, "sequence_editor.sequences_all", oldname, seq->name + 2, 0, 0, 1); diff --git a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c index a54a8507882..bfeeb7ddc99 100644 --- a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c @@ -34,12 +34,12 @@ /* ******************* Channel Matte Node ********************************* */ -static bNodeSocketTemplate cmp_node_channel_matte_in[] ={ +static bNodeSocketTemplate cmp_node_channel_matte_in[] = { {SOCK_RGBA, 1, N_("Image"), 1.0f, 1.0f, 1.0f, 1.0f}, {-1, 0, ""} }; -static bNodeSocketTemplate cmp_node_channel_matte_out[] ={ +static bNodeSocketTemplate cmp_node_channel_matte_out[] = { {SOCK_RGBA, 0, N_("Image")}, {SOCK_FLOAT, 0, N_("Matte")}, {-1, 0, ""} diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index dc8d427c0ae..d59061dfc0a 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -197,7 +197,7 @@ void node_group_remove_socket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out) /* groups display their internal tree name as label */ const char *node_group_label(bNode *node) { - return (node->id)? node->id->name+2: IFACE_("Missing Datablock"); + return (node->id)? node->id->name + 2: IFACE_("Missing Datablock"); } int node_group_valid(bNodeTree *ntree, bNodeTemplate *ntemp) diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c index f567e36cc19..3eb2cdc8ab7 100644 --- a/source/blender/nodes/shader/node_shader_util.c +++ b/source/blender/nodes/shader/node_shader_util.c @@ -277,7 +277,7 @@ void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs) bNodeStack *stack; bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1]; + GPUNodeStack gpuin[MAX_SOCKET + 1], gpuout[MAX_SOCKET + 1]; int do_it; stack= exec->stack; diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c index d4451d570a4..0ac88c3f5b0 100644 --- a/source/blender/render/intern/source/bake.c +++ b/source/blender/render/intern/source/bake.c @@ -734,8 +734,8 @@ static void bake_single_vertex(BakeShade *bs, VertRen *vert, float u, float v) } /* Bake all vertices of a face. Actually, this still works on a face-by-face - basis, and each vertex on each face is shaded. Vertex colors are a property - of loops, not vertices. */ + * basis, and each vertex on each face is shaded. Vertex colors are a property + * of loops, not vertices. */ static void shade_verts(BakeShade *bs) { VlakRen *vlr = bs->vlr; @@ -756,7 +756,7 @@ static void shade_verts(BakeShade *bs) zero_v3(bs->dyco); /* Shade each vertex of the face. u and v are barycentric coordinates; since - we're only interested in vertices, these will be 0 or 1. */ + * we're only interested in vertices, these will be 0 or 1. */ if ((vlr->flag & R_FACE_SPLIT) == 0) { /* Processing triangle face, whole quad, or first half of split quad. */ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 4a95c6ac091..9e3722777ba 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -282,7 +282,7 @@ void wm_event_do_notifiers(bContext *C) /* XXX context in notifiers? */ CTX_wm_window_set(C, win); - /* printf("notifier win %d screen %s cat %x\n", win->winid, win->screen->id.name+2, note->category); */ + /* printf("notifier win %d screen %s cat %x\n", win->winid, win->screen->id.name + 2, note->category); */ ED_screen_do_listen(C, note); for (ar = win->screen->regionbase.first; ar; ar = ar->next) { @@ -1383,8 +1383,8 @@ static void wm_event_modalkeymap(const bContext *C, wmOperator *op, wmEvent *eve } else { /* modal keymap checking returns handled events fine, but all hardcoded modal - handling typically swallows all events (OPERATOR_RUNNING_MODAL). - This bypass just disables support for double clicks in hardcoded modal handlers */ + * handling typically swallows all events (OPERATOR_RUNNING_MODAL). + * This bypass just disables support for double clicks in hardcoded modal handlers */ if (event->val == KM_DBL_CLICK) { event->prevval = event->val; event->val = KM_PRESS; diff --git a/source/creator/creator.c b/source/creator/creator.c index 7916d34bf13..af1d9c544e4 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -921,7 +921,7 @@ static int set_ge_parameters(int argc, const char **argv, void *data) } - } /* if (*(argv[a+1]) == '=') */ + } /* if (*(argv[a + 1]) == '=') */ } return a; -- cgit v1.2.3 From ae4db7eb5929ae51f362faeb39fb04e4bf22005f Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sat, 2 Feb 2013 05:38:57 +0000 Subject: Bugfix: "Extend" transform tool would leave dangling "temp meta strips" if none of those strips occurred on the same side of CFRA indicator as the mouse --- source/blender/editors/transform/transform_conversions.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 39c51ff456e..7d62775ae58 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -2642,6 +2642,14 @@ static void createTransNlaData(bContext *C, TransInfo *t) /* stop if trying to build list if nothing selected */ if (count == 0) { + /* clear temp metas that may have been created but aren't needed now + * because they fell on the wrong side of CFRA + */ + for (ale = anim_data.first; ale; ale = ale->next) { + NlaTrack *nlt = (NlaTrack *)ale->data; + BKE_nlastrips_clear_metas(&nlt->strips, 0, 1); + } + /* cleanup temp list */ BLI_freelistN(&anim_data); return; @@ -2686,14 +2694,14 @@ static void createTransNlaData(bContext *C, TransInfo *t) tdn->oldTrack = tdn->nlt = nlt; tdn->strip = strip; tdn->trackIndex = BLI_findindex(&adt->nla_tracks, nlt); - + yval = (float)(tdn->trackIndex * NLACHANNEL_STEP(snla)); - + tdn->h1[0] = strip->start; tdn->h1[1] = yval; tdn->h2[0] = strip->end; tdn->h2[1] = yval; - + center[0] = (float)CFRA; center[1] = yval; center[2] = 0.0f; -- cgit v1.2.3 From 58ba7f7cf468d3beeaf0814c65d429241bf0d70b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 06:06:34 +0000 Subject: triangulate was checking existance of edges unnecessarily, splitting face already does this. --- source/blender/bmesh/intern/bmesh_polygon.c | 57 +++++++++-------------------- 1 file changed, 17 insertions(+), 40 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index 80cee7b8910..83fb15c432a 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -734,60 +734,38 @@ static BMLoop *poly_find_ear(BMFace *f, float (*projectverts)[2], const bool use } else { - BMVert *v1, *v2, *v3; - /* float angle, bestangle = 180.0f; */ - float cos, tcos, bestcos = 1.0f; - float *tcoss; - bool is_ear; - int i = 0, j, len; + float cos, bestcos = 1.0f; + int i, j, len; /* Compute cos of all corners! */ + i = 0; l_iter = l_first = BM_FACE_FIRST_LOOP(f); len = l_iter->f->len; - tcoss = abscoss; do { - v1 = l_iter->prev->v; - v2 = l_iter->v; - v3 = l_iter->next->v; + const BMVert *v1 = l_iter->prev->v; + const BMVert *v2 = l_iter->v; + const BMVert *v3 = l_iter->next->v; - *tcoss = fabsf(cos_v3v3v3(v1->co, v2->co, v3->co)); + abscoss[i] = fabsf(cos_v3v3v3(v1->co, v2->co, v3->co)); /* printf("tcoss: %f\n", *tcoss);*/ - tcoss++; + i++; } while ((l_iter = l_iter->next) != l_first); + i = 0; l_iter = l_first; - tcoss = abscoss; do { - is_ear = true; + const BMVert *v1 = l_iter->prev->v; + const BMVert *v2 = l_iter->v; + const BMVert *v3 = l_iter->next->v; - v1 = l_iter->prev->v; - v2 = l_iter->v; - v3 = l_iter->next->v; - - /* We may have already internal edges... */ - if (BM_edge_exists(v1, v3)) { - is_ear = false; - } - else if (!bm_face_goodline((float const (*)[2])projectverts, f, BM_elem_index_get(v1), - BM_elem_index_get(v2), BM_elem_index_get(v3))) + if (bm_face_goodline((float const (*)[2])projectverts, f, + BM_elem_index_get(v1), BM_elem_index_get(v2), BM_elem_index_get(v3))) { -#if 0 - printf("(%d, %d, %d) would not be a valid tri!\n", - BM_elem_index_get(v1), BM_elem_index_get(v2), BM_elem_index_get(v3)); -#endif - is_ear = false; - } - - if (is_ear) { /* Compute highest cos (i.e. narrowest angle) of this tri. */ - cos = *tcoss; - tcos = fabsf(cos_v3v3v3(v2->co, v3->co, v1->co)); - if (tcos > cos) - cos = tcos; - tcos = fabsf(cos_v3v3v3(v3->co, v1->co, v2->co)); - if (tcos > cos) - cos = tcos; + cos = max_fff(abscoss[i], + fabsf(cos_v3v3v3(v2->co, v3->co, v1->co)), + fabsf(cos_v3v3v3(v3->co, v1->co, v2->co))); /* Compare to prev best (i.e. lowest) cos. */ if (cos < bestcos) { @@ -816,7 +794,6 @@ static BMLoop *poly_find_ear(BMFace *f, float (*projectverts)[2], const bool use #endif } } - tcoss++; i++; } while ((l_iter = l_iter->next) != l_first); } -- cgit v1.2.3 From 0dbb08d4eb31adf69b01624a271727900b4b35cc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 13:55:47 +0000 Subject: code style checker now tests for: 'SomeText{' (no space before {). also removed duplicate break;, probably error from merge. --- source/blender/collada/AnimationExporter.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'source') diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index e29435005bd..e751f987524 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -730,7 +730,6 @@ void AnimationExporter::get_source_values(BezTriple *bezt, COLLADASW::InputSeman values[1] = bezt->vec[2][1]; } break; - break; default: *length = 0; break; -- cgit v1.2.3 From b6c82b2e8402120ca564aecd2106f3dcdbfe05eb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 14:11:58 +0000 Subject: fix for glitch drawing file selector dividers (would draw apart or on top of each other depending on the view) --- source/blender/editors/interface/view2d.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 41bbed8eb19..ae89b25d5ea 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -1029,16 +1029,16 @@ void UI_view2d_view_ortho(View2D *v2d) /* XXX ton: this flag set by outliner, for icons */ if (v2d->flag & V2D_PIXELOFS_X) { - curmasked.xmin = floorf(curmasked.xmin) - 0.001f; - curmasked.xmax = floorf(curmasked.xmax) - 0.001f; + curmasked.xmin = floorf(curmasked.xmin) - (0.001f + xofs); + curmasked.xmax = floorf(curmasked.xmax) - (0.001f + xofs); } if (v2d->flag & V2D_PIXELOFS_Y) { - curmasked.ymin = floorf(curmasked.ymin) - 0.001f; - curmasked.ymax = floorf(curmasked.ymax) - 0.001f; + curmasked.ymin = floorf(curmasked.ymin) - (0.001f + yofs); + curmasked.ymax = floorf(curmasked.ymax) - (0.001f + yofs); } /* set matrix on all appropriate axes */ - wmOrtho2(curmasked.xmin - xofs, curmasked.xmax - xofs, curmasked.ymin - yofs, curmasked.ymax - yofs); + wmOrtho2(curmasked.xmin, curmasked.xmax, curmasked.ymin, curmasked.ymax); /* XXX is this necessary? */ glLoadIdentity(); -- cgit v1.2.3 From ad2b4c6e542d733fe3b771586d6fea6c12b6ed16 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sat, 2 Feb 2013 16:54:18 +0000 Subject: Remove loose edges created during undo in dynamic-topology sculpt mode Fixes [#34043] "Dyntopo: noise appear during sculpting (parasite edges)" projects.blender.org/tracker/index.php?func=detail&aid=34043&group_id=9&atid=498 --- source/blender/bmesh/intern/bmesh_log.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c index 1337cb7c8eb..1d77ff6ebe9 100644 --- a/source/blender/bmesh/intern/bmesh_log.c +++ b/source/blender/bmesh/intern/bmesh_log.c @@ -252,8 +252,25 @@ static void bm_log_faces_unmake(BMesh *bm, BMLog *log, GHash *faces) void *key = BLI_ghashIterator_getKey(&gh_iter); unsigned int id = GET_INT_FROM_POINTER(key); BMFace *f = bm_log_face_from_id(log, id); + BMVert *v_tri[3]; + BMEdge *e_tri[3]; + int i; + + /* Remove any unused edges */ + BM_face_as_array_vert_tri(f, v_tri); + for (i = 0; i < 3; i++) { + BMVert *v1 = v_tri[i]; + BMVert *v2 = v_tri[i == 2 ? 0 : i + 1]; + e_tri[i] = BM_edge_exists(v1, v2); + } BM_face_kill(bm, f); + + for (i = 0; i < 3; i++) { + BMEdge *e = e_tri[i]; + if (BM_edge_face_count(e) == 0) + BM_edge_kill(bm, e); + } } } -- cgit v1.2.3 From f0d4b85feffb625efb406d3fba81b076a3a1fc4f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 02:54:24 +0000 Subject: improve BMesh api use from r54265, no need to do edge lookups from the faces verts since the face stores these already. also remove ScrArea.cursor, historic runtime variable. --- source/blender/bmesh/intern/bmesh_log.c | 19 ++++++++----------- source/blender/makesdna/DNA_screen_types.h | 3 ++- 2 files changed, 10 insertions(+), 12 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c index 1d77ff6ebe9..2389751fa74 100644 --- a/source/blender/bmesh/intern/bmesh_log.c +++ b/source/blender/bmesh/intern/bmesh_log.c @@ -252,24 +252,21 @@ static void bm_log_faces_unmake(BMesh *bm, BMLog *log, GHash *faces) void *key = BLI_ghashIterator_getKey(&gh_iter); unsigned int id = GET_INT_FROM_POINTER(key); BMFace *f = bm_log_face_from_id(log, id); - BMVert *v_tri[3]; BMEdge *e_tri[3]; + BMLoop *l_iter; int i; - /* Remove any unused edges */ - BM_face_as_array_vert_tri(f, v_tri); - for (i = 0; i < 3; i++) { - BMVert *v1 = v_tri[i]; - BMVert *v2 = v_tri[i == 2 ? 0 : i + 1]; - e_tri[i] = BM_edge_exists(v1, v2); + l_iter = BM_FACE_FIRST_LOOP(f); + for (i = 0; i < 3; i++, l_iter = l_iter->next) { + e_tri[i] = l_iter->e; } + /* Remove any unused edges */ BM_face_kill(bm, f); - for (i = 0; i < 3; i++) { - BMEdge *e = e_tri[i]; - if (BM_edge_face_count(e) == 0) - BM_edge_kill(bm, e); + if (BM_edge_is_wire(e_tri[i])) { + BM_edge_kill(bm, e_tri[i]); + } } } } diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index ae8b341f536..ceae4e28d1f 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -143,9 +143,10 @@ typedef struct ScrArea { short headertype; /* OLD! 0=no header, 1= down, 2= up */ short do_refresh; /* private, for spacetype refresh callback */ - short cursor, flag; + short flag; short region_active_win; /* index of last used region of 'RGN_TYPE_WINDOW' * runtuime variable, updated by executing operators */ + short pad; struct SpaceType *type; /* callbacks for this space type */ -- cgit v1.2.3 From 1f21efdeac19d57b60554da920935a97d682b9b9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 06:09:29 +0000 Subject: fix [#34073] Combined EdgeLoop slides weirdly on even try concave check on co-linear edges could fail, avoid by using the loop-direction + face normal. --- source/blender/bmesh/intern/bmesh_queries.c | 23 +++++++++++++++++++++++ source/blender/bmesh/intern/bmesh_queries.h | 1 + source/blender/editors/transform/transform.c | 10 +++------- 3 files changed, 27 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index bf30db78a61..b2b710a0d36 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -1057,6 +1057,29 @@ void BM_loop_calc_face_normal(BMLoop *l, float r_normal[3]) } } +/** + * \brief BM_loop_calc_face_direction + * + * Calculate the direction a loop is pointing. + * + * \param l The loop to calculate the direction at + * \param r_dir Resulting direction + */ +void BM_loop_calc_face_direction(BMLoop *l, float r_dir[3]) +{ + float v_prev[3]; + float v_next[3]; + + sub_v3_v3v3(v_prev, l->v->co, l->prev->v->co); + sub_v3_v3v3(v_next, l->next->v->co, l->v->co); + + normalize_v3(v_prev); + normalize_v3(v_next); + + add_v3_v3v3(r_dir, v_prev, v_next); + normalize_v3(r_dir); +} + /** * \brief BM_loop_calc_face_tangent * diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index 4172b3905cd..b285c531bb5 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -66,6 +66,7 @@ bool BM_loop_is_convex(BMLoop *l); float BM_loop_calc_face_angle(BMLoop *l); void BM_loop_calc_face_normal(BMLoop *l, float r_normal[3]); +void BM_loop_calc_face_direction(BMLoop *l, float r_normal[3]); void BM_loop_calc_face_tangent(BMLoop *l, float r_tangent[3]); float BM_edge_calc_face_angle(BMEdge *e); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index f6c9c27dd76..cfa6a72163e 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4920,7 +4920,6 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, /* When there is no edge to slide along, * we must slide along the vector defined by the face we're attach to */ BMLoop *l_tmp = BM_face_vert_share_loop(l_first->f, v); - float tvec[3]; BLI_assert(ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next)); @@ -4930,12 +4929,9 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, sub_v3_v3v3(vec_accum, l_tmp->next->next->v->co, v->co); } else { - BM_loop_calc_face_tangent(l_tmp, vec_accum); - if (!BM_loop_is_convex(l_tmp)) { - negate_v3(vec_accum); - } - cross_v3_v3v3(tvec, vec_accum, l_tmp->f->no); - cross_v3_v3v3(vec_accum, l_tmp->f->no, tvec); + float tdir[3]; + BM_loop_calc_face_direction(l_tmp, tdir); + cross_v3_v3v3(vec_accum, l_tmp->f->no, tdir); len_v3_ensure(vec_accum, (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f); } } -- cgit v1.2.3 From bb22b7c58083a45fca60f0c9e135a54714beed27 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 07:24:31 +0000 Subject: add dist_to_line_v3() for completeness, (had dist_to_line_v2 already) --- source/blender/blenlib/BLI_math_geom.h | 1 + source/blender/blenlib/intern/math_geom.c | 9 +++++++++ 2 files changed, 10 insertions(+) (limited to 'source') diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index 448396811d3..d475d476c6d 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -68,6 +68,7 @@ void closest_to_line_segment_v2(float closest[2], const float p[2], const float float dist_to_plane_normalized_v3(const float p[3], const float plane_co[3], const float plane_no_unit[3]); float dist_to_plane_v3(const float p[3], const float plane_co[3], const float plane_no[3]); float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]); +float dist_to_line_v3(const float p[3], const float l1[3], const float l2[3]); float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]); float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]); void closest_to_line_segment_v3(float r[3], const float p[3], const float l1[3], const float l2[3]); diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 70a02544acf..e1dfe40cdf4 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -304,6 +304,15 @@ float dist_to_line_segment_v3(const float v1[3], const float v2[3], const float return len_v3v3(closest, v1); } +float dist_to_line_v3(const float v1[3], const float v2[3], const float v3[3]) +{ + float closest[3]; + + closest_to_line_v3(closest, v1, v2, v3); + + return len_v3v3(closest, v1); +} + /* Adapted from "Real-Time Collision Detection" by Christer Ericson, * published by Morgan Kaufmann Publishers, copyright 2005 Elsevier Inc. * -- cgit v1.2.3 From 415b425e6523a67c9c387cf0e29730bb882ef2b5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 07:26:58 +0000 Subject: improve edge slide with ngon's, distance calculation was average edge length. now use the slide vector to find opposite ngon edge which sets the slide destination. --- source/blender/editors/transform/transform.c | 58 ++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'source') diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index cfa6a72163e..787791814cc 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4889,6 +4889,45 @@ static void len_v3_ensure(float v[3], const float length) mul_v3_fl(v, length); } +/** + * Find the closest point on the ngon on the opposite side. + * used to set the edge slide distance for ngons. + */ +static bool bm_loop_calc_opposite_co(BMLoop *l_tmp, + const float plane_no[3], + float r_co[3]) +{ + /* skip adjacent edges */ + BMLoop *l_first = l_tmp->next; + BMLoop *l_last = l_tmp->prev; + BMLoop *l_iter; + float dist = FLT_MAX; + + l_iter = l_first; + do { + float tvec[3]; + if (isect_line_plane_v3(tvec, + l_iter->v->co, l_iter->next->v->co, + l_tmp->v->co, plane_no, false)) + { + const float fac = line_point_factor_v3(tvec, l_iter->v->co, l_iter->next->v->co); + /* allow some overlap to avoid missing the intersection because of float precision */ + if ((fac > -FLT_EPSILON) && (fac < 1.0f + FLT_EPSILON)) { + /* likelyhood of multiple intersections per ngon is quite low, + * it would have to loop back on its self, but better support it + * so check for the closest opposite edge */ + const float tdist = len_v3v3(l_tmp->v->co, tvec); + if (tdist < dist) { + copy_v3_v3(r_co, tvec); + dist = tdist; + } + } + } + } while ((l_iter = l_iter->next) != l_last); + + return (dist != FLT_MAX); +} + /** * Given 2 edges and a loop, step over the loops * and calculate a direction to slide along. @@ -4932,7 +4971,26 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, float tdir[3]; BM_loop_calc_face_direction(l_tmp, tdir); cross_v3_v3v3(vec_accum, l_tmp->f->no, tdir); +#if 0 + /* rough guess, we can do better! */ len_v3_ensure(vec_accum, (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f); +#else + /* be clever, check the opposite ngon edge to slide into. + * this gives best results */ + { + float tvec[3]; + float dist; + + if (bm_loop_calc_opposite_co(l_tmp, tdir, tvec)) { + dist = len_v3v3(l_tmp->v->co, tvec); + } + else { + dist = (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f; + } + + len_v3_ensure(vec_accum, dist); + } +#endif } } -- cgit v1.2.3 From c6491074992e939d1c2838a133e340b12a230afe Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 08:07:14 +0000 Subject: when triangulating ngons, use beauty option to rotate edges. gives much nicer results and means you can preserve original edges without triangulating ngons one at a time --- source/blender/bmesh/operators/bmo_triangulate.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source') diff --git a/source/blender/bmesh/operators/bmo_triangulate.c b/source/blender/bmesh/operators/bmo_triangulate.c index c4d15034c0f..bbcb07e1174 100644 --- a/source/blender/bmesh/operators/bmo_triangulate.c +++ b/source/blender/bmesh/operators/bmo_triangulate.c @@ -50,6 +50,12 @@ void bmo_triangulate_exec(BMesh *bm, BMOperator *op) BM_mesh_triangulate(bm, use_beauty, true); + if (use_beauty) { + BMO_op_callf(bm, op->flag, + "beautify_fill faces=%hf constrain_edges=%He", + BM_ELEM_TAG, BM_ELEM_TAG); + } + BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_TAG); BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "faces.out", BM_FACE, BM_ELEM_TAG); } -- cgit v1.2.3 From 4e94fca8965a0012631b4fd92c96fce41fd1d3d9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 08:13:15 +0000 Subject: fix for error in own recent change, sculpt triangulate was done on a bmesh with uninitialized faces normals, add warning that BM_mesh_bm_from_me() dosn't calculate face normals. --- source/blender/bmesh/intern/bmesh_mesh_conv.c | 10 ++++++++-- source/blender/editors/sculpt_paint/sculpt.c | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c index a63b715fd14..6697430a88d 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_conv.c +++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c @@ -162,7 +162,11 @@ char BM_mesh_cd_flag_from_bmesh(BMesh *bm) return cd_flag; } -/* Mesh -> BMesh */ +/** + * \brief Mesh -> BMesh + * + * \warning This function doesn't calculate face normals. + */ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr) { MVert *mvert; @@ -465,7 +469,9 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr) } -/* BMesh -> Mesh */ +/** + * \brief BMesh -> Mesh + */ static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert) { BMVert **vertMap = NULL; diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index a81115aeae3..82d279cc8b8 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -4571,6 +4571,7 @@ void sculpt_dynamic_topology_enable(bContext *C) ss->bm = BM_mesh_create(&bm_mesh_allocsize_default); BM_mesh_bm_from_me(ss->bm, me, TRUE, ob->shapenr); + BM_mesh_normals_update(ss->bm, false); sculpt_dynamic_topology_triangulate(ss->bm); BM_data_layer_add(ss->bm, &ss->bm->vdata, CD_PAINT_MASK); BM_mesh_normals_update(ss->bm, TRUE); -- cgit v1.2.3 From 0510735f4eb342a12dcc316be639ee256766060b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 09:44:37 +0000 Subject: fix BM_loop_calc_face_tangent for concave face corners, caused a bug in wire-frame operator. --- source/blender/bmesh/intern/bmesh_queries.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index b2b710a0d36..60ebb99ce05 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -1093,23 +1093,27 @@ void BM_loop_calc_face_tangent(BMLoop *l, float r_tangent[3]) { float v_prev[3]; float v_next[3]; + float dir[3]; sub_v3_v3v3(v_prev, l->prev->v->co, l->v->co); sub_v3_v3v3(v_next, l->v->co, l->next->v->co); normalize_v3(v_prev); normalize_v3(v_next); + add_v3_v3v3(dir, v_prev, v_next); - if (compare_v3v3(v_prev, v_next, FLT_EPSILON) == false) { - float dir[3]; + if (compare_v3v3(v_prev, v_next, FLT_EPSILON * 10.0f) == false) { float nor[3]; /* for this purpose doesn't need to be normalized */ - add_v3_v3v3(dir, v_prev, v_next); cross_v3_v3v3(nor, v_prev, v_next); + /* concave face check */ + if (UNLIKELY(dot_v3v3(nor, l->f->no) < 0.0f)) { + negate_v3(nor); + } cross_v3_v3v3(r_tangent, dir, nor); } else { /* prev/next are the same - compare with face normal since we don't have one */ - cross_v3_v3v3(r_tangent, v_next, l->f->no); + cross_v3_v3v3(r_tangent, dir, l->f->no); } normalize_v3(r_tangent); -- cgit v1.2.3 From 2cfe44cc94b42ed21dcb8c61d7b5c0f2cb9c9d68 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sun, 3 Feb 2013 10:26:51 +0000 Subject: Bug fix #34090 Animation of render output size is not supported, not for render borders either. This commit makes the border rna properties disable animation support. --- source/blender/makesrna/intern/rna_scene.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 300be20b25e..4763c4d3071 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -3727,27 +3727,33 @@ static void rna_def_scene_render_data(BlenderRNA *brna) "(note that this disables save_buffers and full_sample)"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "border_min_x", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "border.xmin"); RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Border Minimum X", "Minimum X value to for the render border"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); prop = RNA_def_property(srna, "border_min_y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "border.ymin"); RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Border Minimum Y", "Minimum Y value for the render border"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); prop = RNA_def_property(srna, "border_max_x", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "border.xmax"); RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Border Maximum X", "Maximum X value for the render border"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); prop = RNA_def_property(srna, "border_max_y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "border.ymax"); RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Border Maximum Y", "Maximum Y value for the render border"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); -- cgit v1.2.3 From 89bda7899d09f0ece87e477eff1290bd134a57cb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 10:28:28 +0000 Subject: style cleanup & some spelling --- source/blender/bmesh/intern/bmesh_log.c | 2 +- source/blender/bmesh/intern/bmesh_walkers_impl.c | 2 +- source/blender/gpu/intern/gpu_buffers.c | 2 +- source/blender/makesrna/intern/rna_access.c | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c index 2389751fa74..36a5412e401 100644 --- a/source/blender/bmesh/intern/bmesh_log.c +++ b/source/blender/bmesh/intern/bmesh_log.c @@ -736,7 +736,7 @@ void BM_log_redo(BMesh *bm, BMLog *log) * vertex in the map of added vertices. * * If the vertex already existed prior to the current log entry, a - * seperate key/value map of modified vertices is used (using the + * separate key/value map of modified vertices is used (using the * vertex's ID as the key). The values stored in that case are * the vertex's original state so that an undo can restore the * previous state. diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c index bbe02a49967..ac6d4089372 100644 --- a/source/blender/bmesh/intern/bmesh_walkers_impl.c +++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c @@ -858,7 +858,7 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker) if (!EDGE_CHECK(e)) { /* walker won't traverse to a non-manifold edge, but may * be started on one, and should not traverse *away* from - * a non-manfold edge (non-manifold edges are never in an + * a non-manifold edge (non-manifold edges are never in an * edge ring with manifold edges */ return e; } diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index fedcb58e1a3..5bef7a8ae0b 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -1391,7 +1391,7 @@ void GPU_update_mesh_buffers(GPU_Buffers *buffers, MVert *mvert, vert_data = glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); if (vert_data) { - /* Vertex data is shared if smooth-shaded, but seperate + /* Vertex data is shared if smooth-shaded, but separate copies are made for flat shading because normals shouldn't be shared. */ if (buffers->smooth) { diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 11a2d947313..adfb096b25f 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -3153,10 +3153,10 @@ static int rna_property_array_length_all_dimensions(PointerRNA *ptr, PropertyRNA const int dim = RNA_property_array_dimension(ptr, prop, len); int size; - if(dim == 0) + if (dim == 0) return 0; - for(size = 1, i = 0; i < dim; i++) + for (size = 1, i = 0; i < dim; i++) size *= len[i]; return size; @@ -3197,7 +3197,7 @@ static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *pro } /* dynamic array? need to get length per item */ - if(itemprop->getlength) { + if (itemprop->getlength) { itemprop = NULL; } /* try to access as raw array */ -- cgit v1.2.3 From 48e9c158db478bd14946f5ea6b7bf73a804fe7f8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 12:19:14 +0000 Subject: fix [#34093] Metastrips don't behave correctly with alt+leftarrow --- source/blender/editors/space_sequencer/sequencer_edit.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 15528093869..97943f7e6ac 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -2463,9 +2463,15 @@ void SEQUENCER_OT_strip_jump(wmOperatorType *ot) static void swap_sequence(Scene *scene, Sequence *seqa, Sequence *seqb) { int gap = seqb->startdisp - seqa->enddisp; - seqb->start = (seqb->start - seqb->startdisp) + seqa->startdisp; + int seq_a_start; + int seq_b_start; + + seq_b_start = (seqb->start - seqb->startdisp) + seqa->startdisp; + BKE_sequence_translate(scene, seqb, seq_b_start - seqb->start); BKE_sequence_calc(scene, seqb); - seqa->start = (seqa->start - seqa->startdisp) + seqb->enddisp + gap; + + seq_a_start = (seqa->start - seqa->startdisp) + seqb->enddisp + gap; + BKE_sequence_translate(scene, seqa, seq_a_start - seqa->start); BKE_sequence_calc(scene, seqa); } -- cgit v1.2.3 From bc3cb6ff766eadeeb358dbf2fac5a76db58355db Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 15:03:55 +0000 Subject: remove paranoid null check from BLI_ghash_lookup(), was the only ghash function with a null check, callers better check the ghash exists first. --- source/blender/blenlib/intern/BLI_ghash.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c index 7d2fc38272d..7ebe4430e20 100644 --- a/source/blender/blenlib/intern/BLI_ghash.c +++ b/source/blender/blenlib/intern/BLI_ghash.c @@ -78,9 +78,9 @@ void BLI_ghash_insert(GHash *gh, void *key, void *val) unsigned int hash = gh->hashfp(key) % gh->nbuckets; Entry *e = (Entry *)BLI_mempool_alloc(gh->entrypool); + e->next = gh->buckets[hash]; e->key = key; e->val = val; - e->next = gh->buckets[hash]; gh->buckets[hash] = e; if (++gh->nentries > (float)gh->nbuckets / 2) { @@ -109,13 +109,13 @@ void BLI_ghash_insert(GHash *gh, void *key, void *val) void *BLI_ghash_lookup(GHash *gh, const void *key) { - if (gh) { - unsigned int hash = gh->hashfp(key) % gh->nbuckets; - Entry *e; + const unsigned int hash = gh->hashfp(key) % gh->nbuckets; + Entry *e; - for (e = gh->buckets[hash]; e; e = e->next) - if (gh->cmpfp(key, e->key) == 0) - return e->val; + for (e = gh->buckets[hash]; e; e = e->next) { + if (gh->cmpfp(key, e->key) == 0) { + return e->val; + } } return NULL; } -- cgit v1.2.3 From abe41ba65f2b1117b0d1bf1730db3fef21ec1e27 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Sun, 3 Feb 2013 15:06:16 +0000 Subject: Fix for [#34022] Lines on renders using Blur node in flat mode --- .../blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp | 4 ++-- .../blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp | 4 ++-- source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp | 4 ++-- source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp index 0efead77cd4..08a777f0233 100644 --- a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp @@ -182,8 +182,8 @@ bool GaussianAlphaXBlurOperation::determineDependingAreaOfInterest(rcti *input, #endif { if (this->m_sizeavailable && this->m_gausstab != NULL) { - newInput.xmax = input->xmax + this->m_rad; - newInput.xmin = input->xmin - this->m_rad; + newInput.xmax = input->xmax + this->m_rad + 1; + newInput.xmin = input->xmin - this->m_rad - 1; newInput.ymax = input->ymax; newInput.ymin = input->ymin; } diff --git a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp index 1f9cc8e461a..1448d84b747 100644 --- a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp @@ -184,8 +184,8 @@ bool GaussianAlphaYBlurOperation::determineDependingAreaOfInterest(rcti *input, if (this->m_sizeavailable && this->m_gausstab != NULL) { newInput.xmax = input->xmax; newInput.xmin = input->xmin; - newInput.ymax = input->ymax + this->m_rad; - newInput.ymin = input->ymin - this->m_rad; + newInput.ymax = input->ymax + this->m_rad + 1; + newInput.ymin = input->ymin - this->m_rad - 1; } else { newInput.xmax = this->getWidth(); diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp index 573a19466e8..d8497fafa04 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -133,8 +133,8 @@ bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadB } { if (this->m_sizeavailable && this->m_gausstab != NULL) { - newInput.xmax = input->xmax + this->m_rad; - newInput.xmin = input->xmin - this->m_rad; + newInput.xmax = input->xmax + this->m_rad + 1; + newInput.xmin = input->xmin - this->m_rad - 1; newInput.ymax = input->ymax; newInput.ymin = input->ymin; } diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp index 0c0a4d8aa4f..72bc8ca7b01 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp @@ -136,8 +136,8 @@ bool GaussianYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadB if (this->m_sizeavailable && this->m_gausstab != NULL) { newInput.xmax = input->xmax; newInput.xmin = input->xmin; - newInput.ymax = input->ymax + this->m_rad; - newInput.ymin = input->ymin - this->m_rad; + newInput.ymax = input->ymax + this->m_rad + 1; + newInput.ymin = input->ymin - this->m_rad - 1; } else { newInput.xmax = this->getWidth(); -- cgit v1.2.3 From b58b107db409c877b523f90ff8feb5c4db7688a8 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Sun, 3 Feb 2013 15:38:06 +0000 Subject: Fix for [#34089] Crash opening file containing translation node saved before rev54235 --- source/blender/blenloader/intern/readfile.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'source') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index b2c5677a5c6..91d4480220a 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -7342,6 +7342,17 @@ static void do_version_node_cleanup_dynamic_sockets_264(void *UNUSED(data), ID * } } +static void do_version_node_fix_translate_wrapping(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree) +{ + bNode *node; + + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == CMP_NODE_TRANSLATE && node->storage == NULL) { + node->storage = MEM_callocN(sizeof(NodeTranslateData), "node translate data"); + } + } +} + static void do_version_node_fix_internal_links_264(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree) { bNode *node; @@ -8716,6 +8727,17 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } + // add storage for compositor translate nodes when not existing + if (!MAIN_VERSION_ATLEAST(main, 265, 9)) { + bNodeTreeType *ntreetype; + + ntreetype = ntreeGetType(NTREE_COMPOSIT); + if (ntreetype && ntreetype->foreach_nodetree) + ntreetype->foreach_nodetree(main, NULL, do_version_node_fix_translate_wrapping); + } + + + // if (main->versionfile < 265 || (main->versionfile == 265 && main->subversionfile < 7)) { /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ -- cgit v1.2.3 From 2950214527812503b009995c638d2be37efaa22f Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Sun, 3 Feb 2013 17:22:26 +0000 Subject: One fix for bug [#33785] compositor is (unnecessarily?) slow Added additional buffers - new subtree - for groupnodes. One needs to be aware of how groupnodes should be created. Having translate & scale nodes, with the translate inside the groupnode and the scale node outside, causes artefacts. Both should be inside or outside the groupnode. Same holds for other distort nodes. --- source/blender/compositor/nodes/COM_GroupNode.cpp | 4 ++-- .../compositor/nodes/COM_SocketProxyNode.cpp | 22 ++++++++++++++++++---- .../blender/compositor/nodes/COM_SocketProxyNode.h | 4 +++- 3 files changed, 23 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/nodes/COM_GroupNode.cpp b/source/blender/compositor/nodes/COM_GroupNode.cpp index e10d7dbad2e..32190010aa6 100644 --- a/source/blender/compositor/nodes/COM_GroupNode.cpp +++ b/source/blender/compositor/nodes/COM_GroupNode.cpp @@ -58,7 +58,7 @@ void GroupNode::ungroup(ExecutionSystem &system) InputSocket *inputSocket = inputsockets[index]; bNodeSocket *editorInput = inputSocket->getbNodeSocket(); if (editorInput->groupsock) { - SocketProxyNode *proxy = new SocketProxyNode(bnode, editorInput, editorInput->groupsock); + SocketProxyNode *proxy = new SocketProxyNode(bnode, editorInput, editorInput->groupsock, false); inputSocket->relinkConnections(proxy->getInputSocket(0), index, &system); ExecutionSystemHelper::addNode(system.getNodes(), proxy); } @@ -68,7 +68,7 @@ void GroupNode::ungroup(ExecutionSystem &system) OutputSocket *outputSocket = outputsockets[index]; bNodeSocket *editorOutput = outputSocket->getbNodeSocket(); if (editorOutput->groupsock) { - SocketProxyNode *proxy = new SocketProxyNode(bnode, editorOutput->groupsock, editorOutput); + SocketProxyNode *proxy = new SocketProxyNode(bnode, editorOutput->groupsock, editorOutput, true); outputSocket->relinkConnections(proxy->getOutputSocket(0)); ExecutionSystemHelper::addNode(system.getNodes(), proxy); } diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp index bfb32a96156..e6026675d20 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp @@ -27,11 +27,14 @@ #include "COM_SetValueOperation.h" #include "COM_SetVectorOperation.h" #include "COM_SetColorOperation.h" +#include "COM_WriteBufferOperation.h" +#include "COM_ReadBufferOperation.h" -SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput) : Node(editorNode, false) +SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput, bool buffer) : Node(editorNode, false) { DataType dt; - + this->m_buffer = buffer; + dt = COM_DT_VALUE; if (editorInput->type == SOCK_RGBA) dt = COM_DT_COLOR; if (editorInput->type == SOCK_VECTOR) dt = COM_DT_VECTOR; @@ -49,11 +52,22 @@ void SocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorCont InputSocket *inputsocket = this->getInputSocket(0); if (outputsocket->isConnected()) { if (inputsocket->isConnected()) { - SocketProxyOperation *operation = new SocketProxyOperation(this->getOutputSocket()->getDataType()); + SocketProxyOperation *operation = new SocketProxyOperation(this->getOutputSocket()->getDataType()); inputsocket->relinkConnections(operation->getInputSocket(0)); outputsocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); - } + if (m_buffer){ + WriteBufferOperation * writeOperation = new WriteBufferOperation(); + ReadBufferOperation * readOperation = new ReadBufferOperation(); + readOperation->setMemoryProxy(writeOperation->getMemoryProxy()); + + operation->getOutputSocket()->relinkConnections(readOperation->getOutputSocket()); + addLink(graph, operation->getOutputSocket(), writeOperation->getInputSocket(0)); + + graph->addOperation(writeOperation); + graph->addOperation(readOperation); + } + } else { /* If input is not connected, add a constant value operation instead */ switch (outputsocket->getDataType()) { diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.h b/source/blender/compositor/nodes/COM_SocketProxyNode.h index ea50be418e2..a83ac094b2b 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.h +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.h @@ -30,8 +30,10 @@ * @ingroup Node */ class SocketProxyNode : public Node { +private: + bool m_buffer; public: - SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput); + SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput, bool buffer); void convertToOperations(ExecutionSystem *graph, CompositorContext *context); virtual bool isProxyNode() const { return true; } -- cgit v1.2.3 From c584e01beeaa8c800f9b50bbe9d866037b42230b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 00:02:26 +0000 Subject: drawvolume was timing drawing unnecessarily, replace local defined timing functions with calls to TIMEIT_* macros from PIL_time.h and disable by default. --- source/blender/editors/space_view3d/drawvolume.c | 62 +++++------------------- 1 file changed, 12 insertions(+), 50 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c index 29daee3e11b..70d3857601f 100644 --- a/source/blender/editors/space_view3d/drawvolume.c +++ b/source/blender/editors/space_view3d/drawvolume.c @@ -74,61 +74,18 @@ #include "ED_mesh.h" - #include "BLF_api.h" - #include "view3d_intern.h" // own include +struct GPUTexture; -#ifdef _WIN32 -#include -#include -#include -#include - -static LARGE_INTEGER liFrequency; -static LARGE_INTEGER liStartTime; -static LARGE_INTEGER liCurrentTime; +// #define DEBUG_DRAW_TIME -static void tstart(void) -{ - QueryPerformanceFrequency(&liFrequency); - QueryPerformanceCounter(&liStartTime); -} -static void tend(void) -{ - QueryPerformanceCounter(&liCurrentTime); -} -static double tval(void) -{ - return ((double)( (liCurrentTime.QuadPart - liStartTime.QuadPart) * (double)1000.0 / (double)liFrequency.QuadPart)); -} -#else -#include -static struct timeval _tstart, _tend; -static struct timezone tz; -static void tstart(void) -{ - gettimeofday(&_tstart, &tz); -} -static void tend(void) -{ - gettimeofday(&_tend, &tz); -} - #if 0 -static double tval() -{ - double t1, t2; - t1 = ( double ) _tstart.tv_sec * 1000 + ( double ) _tstart.tv_usec / (1000); - t2 = ( double ) _tend.tv_sec * 1000 + ( double ) _tend.tv_usec / (1000); - return t2 - t1; -} - #endif +#ifdef DEBUG_DRAW_TIME +# include "PIL_time.h" #endif -struct GPUTexture; - static int intersect_edges(float *points, float a, float b, float c, float d, float edges[12][2][3]) { int i; @@ -275,7 +232,10 @@ void draw_smoke_volume(SmokeDomainSettings *sds, Object *ob, return; } - tstart(); +#ifdef DEBUG_DRAW_TIME + TIMEIT_START(draw); +#endif + /* generate flame spectrum texture */ #define SPEC_WIDTH 256 #define FIRE_THRESH 7 @@ -522,8 +482,10 @@ void draw_smoke_volume(SmokeDomainSettings *sds, Object *ob, n++; } - tend(); - // printf ( "Draw Time: %f\n",(float) tval() ); +#ifdef DEBUG_DRAW_TIME + printf("Draw Time: %f\n", (float)TIMEIT_VALUE(draw)); + TIMEIT_END(draw); +#endif if (tex_shadow) GPU_texture_unbind(tex_shadow); -- cgit v1.2.3 From 9d4be17de42deb3109febc8433bf2acea2196218 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 00:05:15 +0000 Subject: style cleanup --- source/blender/compositor/nodes/COM_GroupNode.cpp | 4 ++-- .../compositor/nodes/COM_SocketProxyNode.cpp | 22 +++++++++++----------- .../operations/COM_GaussianAlphaXBlurOperation.cpp | 4 ++-- .../operations/COM_GaussianAlphaYBlurOperation.cpp | 4 ++-- .../operations/COM_GaussianXBlurOperation.cpp | 4 ++-- .../operations/COM_GaussianYBlurOperation.cpp | 4 ++-- source/blender/makesdna/DNA_rigidbody_types.h | 6 +++--- source/gameengine/GameLogic/SCA_IObject.h | 2 +- source/gameengine/Ketsji/KX_ObjectActuator.cpp | 4 ++-- 9 files changed, 27 insertions(+), 27 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/nodes/COM_GroupNode.cpp b/source/blender/compositor/nodes/COM_GroupNode.cpp index 32190010aa6..4cef337d994 100644 --- a/source/blender/compositor/nodes/COM_GroupNode.cpp +++ b/source/blender/compositor/nodes/COM_GroupNode.cpp @@ -58,7 +58,7 @@ void GroupNode::ungroup(ExecutionSystem &system) InputSocket *inputSocket = inputsockets[index]; bNodeSocket *editorInput = inputSocket->getbNodeSocket(); if (editorInput->groupsock) { - SocketProxyNode *proxy = new SocketProxyNode(bnode, editorInput, editorInput->groupsock, false); + SocketProxyNode *proxy = new SocketProxyNode(bnode, editorInput, editorInput->groupsock, false); inputSocket->relinkConnections(proxy->getInputSocket(0), index, &system); ExecutionSystemHelper::addNode(system.getNodes(), proxy); } @@ -68,7 +68,7 @@ void GroupNode::ungroup(ExecutionSystem &system) OutputSocket *outputSocket = outputsockets[index]; bNodeSocket *editorOutput = outputSocket->getbNodeSocket(); if (editorOutput->groupsock) { - SocketProxyNode *proxy = new SocketProxyNode(bnode, editorOutput->groupsock, editorOutput, true); + SocketProxyNode *proxy = new SocketProxyNode(bnode, editorOutput->groupsock, editorOutput, true); outputSocket->relinkConnections(proxy->getOutputSocket(0)); ExecutionSystemHelper::addNode(system.getNodes(), proxy); } diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp index e6026675d20..185fa502fcd 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp @@ -52,22 +52,22 @@ void SocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorCont InputSocket *inputsocket = this->getInputSocket(0); if (outputsocket->isConnected()) { if (inputsocket->isConnected()) { - SocketProxyOperation *operation = new SocketProxyOperation(this->getOutputSocket()->getDataType()); + SocketProxyOperation *operation = new SocketProxyOperation(this->getOutputSocket()->getDataType()); inputsocket->relinkConnections(operation->getInputSocket(0)); outputsocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); - if (m_buffer){ - WriteBufferOperation * writeOperation = new WriteBufferOperation(); - ReadBufferOperation * readOperation = new ReadBufferOperation(); - readOperation->setMemoryProxy(writeOperation->getMemoryProxy()); + if (m_buffer) { + WriteBufferOperation *writeOperation = new WriteBufferOperation(); + ReadBufferOperation *readOperation = new ReadBufferOperation(); + readOperation->setMemoryProxy(writeOperation->getMemoryProxy()); - operation->getOutputSocket()->relinkConnections(readOperation->getOutputSocket()); - addLink(graph, operation->getOutputSocket(), writeOperation->getInputSocket(0)); + operation->getOutputSocket()->relinkConnections(readOperation->getOutputSocket()); + addLink(graph, operation->getOutputSocket(), writeOperation->getInputSocket(0)); - graph->addOperation(writeOperation); - graph->addOperation(readOperation); - } - } + graph->addOperation(writeOperation); + graph->addOperation(readOperation); + } + } else { /* If input is not connected, add a constant value operation instead */ switch (outputsocket->getDataType()) { diff --git a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp index 08a777f0233..aaf5f92505b 100644 --- a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp @@ -182,8 +182,8 @@ bool GaussianAlphaXBlurOperation::determineDependingAreaOfInterest(rcti *input, #endif { if (this->m_sizeavailable && this->m_gausstab != NULL) { - newInput.xmax = input->xmax + this->m_rad + 1; - newInput.xmin = input->xmin - this->m_rad - 1; + newInput.xmax = input->xmax + this->m_rad + 1; + newInput.xmin = input->xmin - this->m_rad - 1; newInput.ymax = input->ymax; newInput.ymin = input->ymin; } diff --git a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp index 1448d84b747..650805f91d5 100644 --- a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp @@ -184,8 +184,8 @@ bool GaussianAlphaYBlurOperation::determineDependingAreaOfInterest(rcti *input, if (this->m_sizeavailable && this->m_gausstab != NULL) { newInput.xmax = input->xmax; newInput.xmin = input->xmin; - newInput.ymax = input->ymax + this->m_rad + 1; - newInput.ymin = input->ymin - this->m_rad - 1; + newInput.ymax = input->ymax + this->m_rad + 1; + newInput.ymin = input->ymin - this->m_rad - 1; } else { newInput.xmax = this->getWidth(); diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp index d8497fafa04..af231d118a6 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -133,8 +133,8 @@ bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadB } { if (this->m_sizeavailable && this->m_gausstab != NULL) { - newInput.xmax = input->xmax + this->m_rad + 1; - newInput.xmin = input->xmin - this->m_rad - 1; + newInput.xmax = input->xmax + this->m_rad + 1; + newInput.xmin = input->xmin - this->m_rad - 1; newInput.ymax = input->ymax; newInput.ymin = input->ymin; } diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp index 72bc8ca7b01..7bf85a953f4 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp @@ -136,8 +136,8 @@ bool GaussianYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadB if (this->m_sizeavailable && this->m_gausstab != NULL) { newInput.xmax = input->xmax; newInput.xmin = input->xmin; - newInput.ymax = input->ymax + this->m_rad + 1; - newInput.ymin = input->ymin - this->m_rad - 1; + newInput.ymax = input->ymax + this->m_rad + 1; + newInput.ymin = input->ymin - this->m_rad - 1; } else { newInput.xmax = this->getWidth(); diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h index b70687be725..ca703130edc 100644 --- a/source/blender/makesdna/DNA_rigidbody_types.h +++ b/source/blender/makesdna/DNA_rigidbody_types.h @@ -76,11 +76,11 @@ typedef struct RigidBodyWorld { /* Flags for RigidBodyWorld */ typedef enum eRigidBodyWorld_Flag { /* should sim world be skipped when evaluating (user setting) */ - RBW_FLAG_MUTED = (1<<0), + RBW_FLAG_MUTED = (1 << 0), /* sim data needs to be rebuilt */ - RBW_FLAG_NEEDS_REBUILD = (1<<1), + RBW_FLAG_NEEDS_REBUILD = (1 << 1), /* usse split impulse when stepping the simulation */ - RBW_FLAG_USE_SPLIT_IMPULSE = (1<<2) + RBW_FLAG_USE_SPLIT_IMPULSE = (1 << 2) } eRigidBodyWorld_Flag; /* ******************************** */ diff --git a/source/gameengine/GameLogic/SCA_IObject.h b/source/gameengine/GameLogic/SCA_IObject.h index 0189af00322..365e2b0c853 100644 --- a/source/gameengine/GameLogic/SCA_IObject.h +++ b/source/gameengine/GameLogic/SCA_IObject.h @@ -221,7 +221,7 @@ public: OBJ_ARMATURE=0, OBJ_CAMERA=1, OBJ_LIGHT=2, - }ObjectTypes; + } ObjectTypes; }; diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp index 16e4cade280..9355ad0adfd 100644 --- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp +++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp @@ -238,8 +238,8 @@ bool KX_ObjectActuator::Update() { parent->GetPhysicsController()->Jump(); } - }else - { + } + else { if (!m_bitLocalFlag.ZeroForce) { parent->ApplyForce(m_force,(m_bitLocalFlag.Force) != 0); -- cgit v1.2.3 From 69993c5d4089bb58758f9a190237dc4651d72d44 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 00:18:09 +0000 Subject: style cleanup: spaces -> tabs --- source/blender/blenkernel/intern/CCGSubSurf.c | 2 +- source/blender/blenkernel/intern/idprop.c | 1 - source/blender/blenkernel/intern/seqmodifier.c | 2 +- source/blender/blenkernel/intern/sequencer.c | 2 +- source/blender/blenloader/intern/readfile.c | 26 +++++++++++----------- source/blender/collada/AnimationExporter.cpp | 26 +++++++++++----------- source/blender/collada/ArmatureExporter.cpp | 2 +- source/blender/collada/ArmatureImporter.cpp | 14 +++++------- source/blender/collada/ControllerExporter.cpp | 10 ++++----- source/blender/collada/DocumentImporter.cpp | 4 ++-- source/blender/collada/GeometryExporter.cpp | 2 +- source/blender/collada/SceneExporter.cpp | 2 +- source/blender/collada/TransformWriter.cpp | 2 +- .../compositor/nodes/COM_SocketProxyNode.cpp | 2 +- source/blender/editors/gpencil/drawgpencil.c | 1 - source/blender/editors/interface/interface_draw.c | 2 +- source/blender/editors/interface/interface_panel.c | 2 +- source/blender/editors/physics/particle_edit.c | 2 +- source/blender/editors/sculpt_paint/sculpt.c | 1 - source/blender/editors/space_node/drawnode.c | 2 +- .../blender/editors/uvedit/uvedit_parametrizer.c | 2 +- source/blender/imbuf/intern/thumbs.c | 2 +- .../composite/nodes/node_composite_bokehimage.c | 2 +- .../nodes/composite/nodes/node_composite_gamma.c | 2 +- .../blender/nodes/shader/nodes/node_shader_gamma.c | 2 +- .../blender/render/intern/source/pixelblending.c | 2 +- source/blender/render/intern/source/pixelshading.c | 2 +- source/blender/render/intern/source/strand.c | 4 ++-- .../gameengine/GamePlayer/common/GPC_RawImage.cpp | 1 - 29 files changed, 60 insertions(+), 66 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c index 2079c783898..e58d484b0c0 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.c +++ b/source/blender/blenkernel/intern/CCGSubSurf.c @@ -230,7 +230,7 @@ int ccg_gridsize(int level) { BLI_assert(level > 0); BLI_assert(level <= 31); - + return (1 << (level - 1)) + 1; } diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c index 9086ef49e4d..9fdf51ceba9 100644 --- a/source/blender/blenkernel/intern/idprop.c +++ b/source/blender/blenkernel/intern/idprop.c @@ -27,7 +27,6 @@ * \ingroup bke */ - #include #include #include diff --git a/source/blender/blenkernel/intern/seqmodifier.c b/source/blender/blenkernel/intern/seqmodifier.c index 3d8a2f7cddf..9ea405ef636 100644 --- a/source/blender/blenkernel/intern/seqmodifier.c +++ b/source/blender/blenkernel/intern/seqmodifier.c @@ -135,7 +135,7 @@ static void modifier_apply_threaded(ImBuf *ibuf, ImBuf *mask, modifier_apply_thr init_data.apply_callback = apply_callback; IMB_processor_apply_threaded(ibuf->y, sizeof(ModifierThread), &init_data, - modifier_init_handle, modifier_do_thread); + modifier_init_handle, modifier_do_thread); } /* **** Color Balance Modifier **** */ diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 2c1fd092fbb..6f9299ce090 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -1746,7 +1746,7 @@ void BKE_sequencer_color_balance_apply(StripColorBalance *cb, ImBuf *ibuf, float init_data.mask = mask_input; IMB_processor_apply_threaded(ibuf->y, sizeof(ColorBalanceThread), &init_data, - color_balance_init_handle, color_balance_do_thread); + color_balance_init_handle, color_balance_do_thread); /* color balance either happens on float buffer or byte buffer, but never on both, * free byte buffer if there's float buffer since float buffer would be used for diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 91d4480220a..83d7e07c5a3 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -7344,13 +7344,13 @@ static void do_version_node_cleanup_dynamic_sockets_264(void *UNUSED(data), ID * static void do_version_node_fix_translate_wrapping(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree) { - bNode *node; + bNode *node; - for (node = ntree->nodes.first; node; node = node->next) { - if (node->type == CMP_NODE_TRANSLATE && node->storage == NULL) { - node->storage = MEM_callocN(sizeof(NodeTranslateData), "node translate data"); - } - } + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == CMP_NODE_TRANSLATE && node->storage == NULL) { + node->storage = MEM_callocN(sizeof(NodeTranslateData), "node translate data"); + } + } } static void do_version_node_fix_internal_links_264(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree) @@ -8727,14 +8727,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } - // add storage for compositor translate nodes when not existing - if (!MAIN_VERSION_ATLEAST(main, 265, 9)) { - bNodeTreeType *ntreetype; + // add storage for compositor translate nodes when not existing + if (!MAIN_VERSION_ATLEAST(main, 265, 9)) { + bNodeTreeType *ntreetype; - ntreetype = ntreeGetType(NTREE_COMPOSIT); - if (ntreetype && ntreetype->foreach_nodetree) - ntreetype->foreach_nodetree(main, NULL, do_version_node_fix_translate_wrapping); - } + ntreetype = ntreeGetType(NTREE_COMPOSIT); + if (ntreetype && ntreetype->foreach_nodetree) + ntreetype->foreach_nodetree(main, NULL, do_version_node_fix_translate_wrapping); + } diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index e751f987524..4a0696dc857 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -84,9 +84,9 @@ void AnimationExporter::operator()(Object *ob) } } - - export_object_constraint_animation(ob); - + + export_object_constraint_animation(ob); + //This needs to be handled by extra profiles, so postponed for now //export_morph_animation(ob); @@ -149,11 +149,11 @@ void AnimationExporter::operator()(Object *ob) void AnimationExporter::export_object_constraint_animation(Object *ob) { std::vector fra; - //Takes frames of target animations + //Takes frames of target animations make_anim_frames_from_targets(ob, fra); - + if (fra.size()) - dae_baked_object_animation(fra, ob); + dae_baked_object_animation(fra, ob); } void AnimationExporter::export_morph_animation(Object *ob) @@ -274,8 +274,8 @@ void AnimationExporter::dae_animation(Object *ob, FCurve *fcu, char *transformNa //axis names for colors else if (!strcmp(transformName, "color") || - !strcmp(transformName, "specular_color") || - !strcmp(transformName, "diffuse_color") || + !strcmp(transformName, "specular_color") || + !strcmp(transformName, "diffuse_color") || !strcmp(transformName, "alpha")) { const char *axis_names[] = {"R", "G", "B"}; @@ -285,9 +285,9 @@ void AnimationExporter::dae_animation(Object *ob, FCurve *fcu, char *transformNa //axis names for transforms else if (!strcmp(transformName, "location") || - !strcmp(transformName, "scale") || + !strcmp(transformName, "scale") || !strcmp(transformName, "rotation_euler") || - !strcmp(transformName, "rotation_quaternion")) + !strcmp(transformName, "rotation_quaternion")) { const char *axis_names[] = {"X", "Y", "Z"}; if (fcu->array_index < 3) @@ -526,7 +526,7 @@ void AnimationExporter::dae_baked_object_animation(std::vector &fra, Obje return; BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s", (char*)translate_id(ob_name).c_str(), - "object_matrix"); + "object_matrix"); openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING); @@ -897,7 +897,7 @@ std::string AnimationExporter::create_4x4_source(std::vector &frames, Obj add_source_parameters(param, semantic, false, NULL, true); source.prepareToAppendValues(); - + bPoseChannel *parchan = NULL; bPoseChannel *pchan = NULL; @@ -916,7 +916,7 @@ std::string AnimationExporter::create_4x4_source(std::vector &frames, Obj int j = 0; for (it = frames.begin(); it != frames.end(); it++) { float mat[4][4], ipar[4][4]; - + float ctime = BKE_scene_frame_get_from_ctime(scene, *it); CFRA = BKE_scene_frame_get_from_ctime(scene, *it); //BKE_scene_update_for_newframe(G.main,scene,scene->lay); diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index 9792da3a9d7..0929bfda6e7 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -104,7 +104,7 @@ bool ArmatureExporter::add_instance_controller(Object *ob) for (bone = (Bone *)arm->bonebase.first; bone; bone = bone->next) { write_bone_URLs(ins, ob_arm, bone); } - + InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob, this->export_settings->active_uv_only); ins.add(); diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index 8328f4bc873..86d9de64085 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -319,7 +319,7 @@ void ArmatureImporter::create_armature_bones( ) if (!ob_arm) continue; - + ED_armature_to_edit(ob_arm); /* @@ -327,8 +327,8 @@ void ArmatureImporter::create_armature_bones( ) * check if bones have already been created for a given joint */ - create_bone(NULL, *ri , NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature *)ob_arm->data); - + create_bone(NULL, *ri , NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature *)ob_arm->data); + //leaf bone tails are derived from the matrix, so no need of this. fix_leaf_bones(); @@ -336,15 +336,13 @@ void ArmatureImporter::create_armature_bones( ) unskinned_armature_map[(*ri)->getUniqueId()] = ob_arm; ED_armature_from_edit(ob_arm); - + //This serves no purpose, as pose is automatically reset later, in BKE_where_is_bone() //set_pose(ob_arm, *ri, NULL, NULL); ED_armature_edit_free(ob_arm); DAG_id_tag_update(&ob_arm->id, OB_RECALC_OB | OB_RECALC_DATA); } - - } void ArmatureImporter::create_armature_bones(SkinInfo& skin) @@ -650,12 +648,12 @@ bool ArmatureImporter::write_controller(const COLLADAFW::Controller *controller) void ArmatureImporter::make_shape_keys(){ std::vector::iterator mc; float weight; - + for (mc = morph_controllers.begin(); mc != morph_controllers.end(); mc++) { //Controller data COLLADAFW::UniqueIdArray& morphTargetIds = (*mc)->getMorphTargets(); COLLADAFW::FloatOrDoubleArray& morphWeights = (*mc)->getMorphWeights(); - + //Prereq: all the geometries must be imported and mesh objects must be made Object *source_ob = this->mesh_importer->get_object_by_geom_uid((*mc)->getSource()); diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp index 396775e3c0e..c8307589af4 100644 --- a/source/blender/collada/ControllerExporter.cpp +++ b/source/blender/collada/ControllerExporter.cpp @@ -96,7 +96,7 @@ bool ControllerExporter::add_instance_controller(Object *ob) for (bone = (Bone *)arm->bonebase.first; bone; bone = bone->next) { write_bone_URLs(ins, ob_arm, bone); } - + InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob, this->export_settings->active_uv_only); ins.add(); @@ -302,7 +302,7 @@ void ControllerExporter::export_morph_controller(Object *ob, Key *key) openMorph(controller_id, controller_name, COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob, use_instantiation))); - + std::string targets_id = add_morph_targets(key, ob); std::string morph_weights_id = add_morph_weights(key, ob); @@ -320,7 +320,7 @@ void ControllerExporter::export_morph_controller(Object *ob, Key *key) { BKE_libblock_free_us(&(G.main->mesh), me); } - + //support for animations //can also try the base element and param alternative add_weight_extras(key); @@ -337,7 +337,7 @@ std::string ControllerExporter::add_morph_targets(Key *key, Object *ob) source.setArrayId(source_id + ARRAY_ID_SUFFIX); source.setAccessorCount(key->totkey - 1); source.setAccessorStride(1); - + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); param.push_back("IDREF"); @@ -366,7 +366,7 @@ std::string ControllerExporter::add_morph_weights(Key *key, Object *ob) source.setArrayId(source_id + ARRAY_ID_SUFFIX); source.setAccessorCount(key->totkey - 1); source.setAccessorStride(1); - + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); param.push_back("MORPH_WEIGHT"); diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index b818008ac17..524645a4bb2 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -426,7 +426,7 @@ void DocumentImporter::write_node(COLLADAFW::Node *node, COLLADAFW::Node *parent bool read_transform = true; std::vector *objects_done = new std::vector(); - + if (is_joint) { armature_importer.add_joint(node, parent_node == NULL || parent_node->getType() != COLLADAFW::Node::JOINT, par, sce); } @@ -1203,7 +1203,7 @@ bool DocumentImporter::is_armature(COLLADAFW::Node *node){ if(child_nodes[i]->getType() == COLLADAFW::Node::JOINT) return true; else continue; } - + //no child is JOINT return false; diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp index 6673e1de815..0720c1f9b81 100644 --- a/source/blender/collada/GeometryExporter.cpp +++ b/source/blender/collada/GeometryExporter.cpp @@ -157,7 +157,7 @@ void GeometryExporter::operator()(Object *ob) if (this->export_settings->apply_modifiers) { BKE_libblock_free_us(&(G.main->mesh), me); } - + if (this->export_settings->include_shapekeys) { Key * key = BKE_key_from_object(ob); if(key) { diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp index e3b56208aeb..3a06ca3bc0e 100644 --- a/source/blender/collada/SceneExporter.cpp +++ b/source/blender/collada/SceneExporter.cpp @@ -216,7 +216,7 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce) } } } - + con = con->next; } } diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp index f06c8cb9e00..fb8ba567192 100644 --- a/source/blender/collada/TransformWriter.cpp +++ b/source/blender/collada/TransformWriter.cpp @@ -111,7 +111,7 @@ void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob) node.addMatrix("parentinverse", dmat); } } - + double d_obmat[4][4]; converter.mat4_to_dae_double(d_obmat, ob->obmat); node.addMatrix("transform",d_obmat); diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp index 185fa502fcd..ded6186ad77 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp @@ -33,7 +33,7 @@ SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput, bool buffer) : Node(editorNode, false) { DataType dt; - this->m_buffer = buffer; + this->m_buffer = buffer; dt = COM_DT_VALUE; if (editorInput->type == SOCK_RGBA) dt = COM_DT_COLOR; diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c index 3e092ed8c5b..09a7890a539 100644 --- a/source/blender/editors/gpencil/drawgpencil.c +++ b/source/blender/editors/gpencil/drawgpencil.c @@ -27,7 +27,6 @@ * \ingroup edgpencil */ - #include #include #include diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index 792553f842c..e19e89af5da 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -373,7 +373,7 @@ void uiRoundRect(float minx, float miny, float maxx, float maxy, float rad) glEnable(GL_BLEND); uiDrawBox(GL_LINE_LOOP, minx, miny, maxx, maxy, rad); - + glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); } diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 151eb2c6088..1b2034d6e40 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -875,7 +875,7 @@ static void ui_do_animate(const bContext *C, Panel *panel) void uiBeginPanels(const bContext *UNUSED(C), ARegion *ar) { Panel *pa; - + /* set all panels as inactive, so that at the end we know * which ones were used */ for (pa = ar->panels.first; pa; pa = pa->next) { diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index bbd10a119e5..78377834b9f 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -4151,7 +4151,7 @@ int PE_minmax(Scene *scene, float min[3], float max[3]) BKE_object_minmax(ob, min, max, TRUE); ok= 1; } - + return ok; } diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 82d279cc8b8..c4d09de3d0e 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -654,7 +654,6 @@ static int sculpt_brush_test_cyl(SculptBrushTest *test, float co[3], float locat /* ===== Sculpting ===== * */ - static float overlapped_curve(Brush *br, float x) { diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index d2bb51981de..f3deef45a1b 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1983,7 +1983,7 @@ static void node_composit_buts_distance_matte(uiLayout *layout, bContext *UNUSED uiLayout *col, *row; col = uiLayoutColumn(layout, TRUE); - + uiItemL(layout, IFACE_("Color Space:"), ICON_NONE); row = uiLayoutRow(layout, FALSE); uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE); diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c index 5d3a5983030..7e3302e233e 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.c +++ b/source/blender/editors/uvedit/uvedit_parametrizer.c @@ -1057,7 +1057,7 @@ static PFace *p_face_add(PHandle *handle) e1->pair = NULL; e2->pair = NULL; e3->pair = NULL; - + e1->flag = 0; e2->flag = 0; e3->flag = 0; diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c index 94bb85b49ea..c1d80ad9067 100644 --- a/source/blender/imbuf/intern/thumbs.c +++ b/source/blender/imbuf/intern/thumbs.c @@ -154,7 +154,7 @@ static void escape_uri_string(const char *string, char *escaped_string, int len, *q++ = *p; } } - + *q = '\0'; } diff --git a/source/blender/nodes/composite/nodes/node_composite_bokehimage.c b/source/blender/nodes/composite/nodes/node_composite_bokehimage.c index 8324b77b2d1..fa21e122ebf 100644 --- a/source/blender/nodes/composite/nodes/node_composite_bokehimage.c +++ b/source/blender/nodes/composite/nodes/node_composite_bokehimage.c @@ -36,7 +36,7 @@ #include "../node_composite_util.h" /* **************** Bokeh image Tools ******************** */ - + static bNodeSocketTemplate cmp_node_bokehimage_out[] = { { SOCK_RGBA, 0, N_("Image"), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, { -1, 0, "" } diff --git a/source/blender/nodes/composite/nodes/node_composite_gamma.c b/source/blender/nodes/composite/nodes/node_composite_gamma.c index e7fbdeaedd7..8a9966a2420 100644 --- a/source/blender/nodes/composite/nodes/node_composite_gamma.c +++ b/source/blender/nodes/composite/nodes/node_composite_gamma.c @@ -34,7 +34,7 @@ #include "node_composite_util.h" /* **************** Gamma Tools ******************** */ - + static bNodeSocketTemplate cmp_node_gamma_in[] = { { SOCK_RGBA, 1, N_("Image"), 1.0f, 1.0f, 1.0f, 1.0f}, { SOCK_FLOAT, 1, N_("Gamma"), 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED}, diff --git a/source/blender/nodes/shader/nodes/node_shader_gamma.c b/source/blender/nodes/shader/nodes/node_shader_gamma.c index c49554c44be..365bac77004 100644 --- a/source/blender/nodes/shader/nodes/node_shader_gamma.c +++ b/source/blender/nodes/shader/nodes/node_shader_gamma.c @@ -29,7 +29,7 @@ #include "node_shader_util.h" /* **************** Gamma Tools ******************** */ - + static bNodeSocketTemplate sh_node_gamma_in[] = { { SOCK_RGBA, 1, N_("Color"), 1.0f, 1.0f, 1.0f, 1.0f}, { SOCK_FLOAT, 1, N_("Gamma"), 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED}, diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c index 21ff1151cfb..66fd2209881 100644 --- a/source/blender/render/intern/source/pixelblending.c +++ b/source/blender/render/intern/source/pixelblending.c @@ -120,7 +120,7 @@ void addalphaAddfacFloat(float dest[4], const float source[4], char addfac) else #endif dest[0] = c; - + c = (m * dest[1]) + source[1]; #ifdef RE_FLOAT_COLOR_CLIPPING if (c >= RE_FULL_COLOR_FLOAT) dest[1] = RE_FULL_COLOR_FLOAT; diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c index 3420648cb52..8a023a2c009 100644 --- a/source/blender/render/intern/source/pixelshading.c +++ b/source/blender/render/intern/source/pixelshading.c @@ -286,7 +286,7 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz, /* fill in col */ float t, zn, radist, ringf=0.0f, linef=0.0f, alpha, si, co; int a; - + if (R.wrld.mode & WO_MIST) { if (har->type & HA_ONLYSKY) { /* stars but no mist */ diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c index a37ffb1eb28..8b83ca4b6c3 100644 --- a/source/blender/render/intern/source/strand.c +++ b/source/blender/render/intern/source/strand.c @@ -676,14 +676,14 @@ static void strand_render(Render *re, StrandSegment *sseg, float winmat[4][4], S else { float hoco1[4], hoco2[4]; int a, obi, index; - + obi= sseg->obi - re->objectinstance; index= sseg->strand->index; projectvert(p1->co, winmat, hoco1); projectvert(p2->co, winmat, hoco2); - + for (a=0; a #include -- cgit v1.2.3 From 452840559714feb293fdb2c3849a82ce265759cd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 10:14:31 +0000 Subject: add BM_edge_is_contiguous(), check for python api. --- source/blender/bmesh/intern/bmesh_queries.c | 13 +++++++++++++ source/blender/bmesh/intern/bmesh_queries.h | 1 + source/blender/python/bmesh/bmesh_py_types.c | 15 ++++++++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 60ebb99ce05..2284e183d97 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -762,6 +762,19 @@ int BM_edge_is_manifold(BMEdge *e) } #endif +/** + * Tests that the edge is manifold and + * that both its faces point the same way. + */ +bool BM_edge_is_contiguous(BMEdge *e) +{ + const BMLoop *l = e->l; + const BMLoop *l_other = l->radial_next; + return (l && (l_other != l) && /* not 0 or 1 face users */ + (l_other->radial_next == l) && /* 2 face users */ + (l_other->v != l->v)); +} + /** * Tests whether or not an edge is on the boundary * of a shell (has one face associated with it) diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index b285c531bb5..7cb5749a4bf 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -61,6 +61,7 @@ bool BM_edge_is_wire(BMEdge *e); bool BM_vert_is_manifold(BMVert *v); bool BM_edge_is_manifold(BMEdge *e); bool BM_edge_is_boundary(BMEdge *e); +bool BM_edge_is_contiguous(BMEdge *e); bool BM_loop_is_convex(BMLoop *l); diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 202d1964bd6..a573c4ae75f 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -412,6 +412,14 @@ static PyObject *bpy_bmedge_is_manifold_get(BPy_BMEdge *self) return PyBool_FromLong(BM_edge_is_manifold(self->e)); } +PyDoc_STRVAR(bpy_bmedge_is_contiguous_doc, +"True when this edge is manifold, between two faces with the same winding (read-only).\n\n:type: boolean" +); +static PyObject *bpy_bmedge_is_contiguous_get(BPy_BMEdge *self) +{ + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_edge_is_contiguous(self->e)); +} PyDoc_STRVAR(bpy_bmedge_is_wire_doc, "True when this edge is not connected to any faces (read-only).\n\n:type: boolean" @@ -678,10 +686,11 @@ static PyGetSetDef bpy_bmedge_getseters[] = { {(char *)"link_loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmedge_link_loops_doc, (void *)BM_LOOPS_OF_EDGE}, /* readonly checks */ - {(char *)"is_manifold", (getter)bpy_bmedge_is_manifold_get, (setter)NULL, (char *)bpy_bmedge_is_manifold_doc, NULL}, - {(char *)"is_wire", (getter)bpy_bmedge_is_wire_get, (setter)NULL, (char *)bpy_bmedge_is_wire_doc, NULL}, + {(char *)"is_manifold", (getter)bpy_bmedge_is_manifold_get, (setter)NULL, (char *)bpy_bmedge_is_manifold_doc, NULL}, + {(char *)"is_contiguous", (getter)bpy_bmedge_is_contiguous_get, (setter)NULL, (char *)bpy_bmedge_is_contiguous_doc, NULL}, + {(char *)"is_wire", (getter)bpy_bmedge_is_wire_get, (setter)NULL, (char *)bpy_bmedge_is_wire_doc, NULL}, {(char *)"is_boundary", (getter)bpy_bmedge_is_boundary_get, (setter)NULL, (char *)bpy_bmedge_is_boundary_doc, NULL}, - {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, + {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; -- cgit v1.2.3 From 29a15f287f7f945e72967d1feef8584bef1c4141 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 11:28:31 +0000 Subject: fix [#34098] Crash after using Decimate or Remesh modifiers converting a derived mesh to a mesh didnt clear its selection history, which could be invalid after applying a modifier. --- source/blender/blenkernel/intern/DerivedMesh.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source') diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 8ca6d045712..8e740075bc6 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -562,6 +562,13 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob) tmp.key = NULL; } + /* Clear selection history */ + tmp.mselect = NULL; + tmp.totselect = 0; + if (me->mselect) { + MEM_freeN(me->mselect); + } + *me = tmp; } -- cgit v1.2.3 From df1fe576213e0a5245fd5c219af071f007a4b9b2 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 4 Feb 2013 12:14:59 +0000 Subject: Fix #34079: RGB and HSV values inconsistency Use COLOR_GAMMA subtype for new image color since this color is actually being color managed. Also made it so byte and float buffers would have the same exact display color after creation with the same color value. Also made it so color strip's color have COLOR_GAMMA subtype, otherwise swatch color wouldn't match render result which is not nice at all. --- source/blender/editors/space_image/image_ops.c | 6 +----- source/blender/makesrna/RNA_types.h | 2 +- source/blender/makesrna/intern/rna_sequencer.c | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 23adf7eb575..8bb51edde02 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1735,11 +1735,6 @@ static int image_new_exec(bContext *C, wmOperator *op) RNA_float_get_array(op->ptr, "color", color); alpha = RNA_boolean_get(op->ptr, "alpha"); - if (!floatbuf) { - /* OCIO_TODO: perhaps we need to convert to display space, not just to sRGB */ - linearrgb_to_srgb_v3_v3(color, color); - } - if (!alpha) color[3] = 1.0f; @@ -1806,6 +1801,7 @@ void IMAGE_OT_new(wmOperatorType *ot) RNA_def_int(ot->srna, "width", 1024, 1, INT_MAX, "Width", "Image width", 1, 16384); RNA_def_int(ot->srna, "height", 1024, 1, INT_MAX, "Height", "Image height", 1, 16384); prop = RNA_def_float_color(ot->srna, "color", 4, NULL, 0.0f, FLT_MAX, "Color", "Default fill color", 0.0f, 1.0f); + RNA_def_property_subtype(prop, PROP_COLOR_GAMMA); RNA_def_property_float_array_default(prop, default_color); RNA_def_boolean(ot->srna, "alpha", 1, "Alpha", "Create an image with an alpha channel"); RNA_def_enum(ot->srna, "generated_type", image_generated_type_items, IMA_GENTYPE_BLANK, diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index d3a8742ede7..300134fc8b6 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -134,7 +134,7 @@ typedef enum PropertySubType { PROP_AXISANGLE = 28, PROP_XYZ = 29, PROP_XYZ_LENGTH = 29 | PROP_UNIT_LENGTH, - PROP_COLOR_GAMMA = 30, + PROP_COLOR_GAMMA = 30, /* used for colors which would be color managed before display */ PROP_COORDS = 31, /* generic array, no units applied, only that x/y/z/w are used (python vec) */ /* booleans */ diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index d699e8ae0bb..a2704619ee6 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -2111,7 +2111,7 @@ static void rna_def_solid_color(StructRNA *srna) RNA_def_struct_sdna_from(srna, "SolidColorVars", "effectdata"); - prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR); + prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "col"); RNA_def_property_ui_text(prop, "Color", ""); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_update"); -- cgit v1.2.3 From 88aa33d3f426837db88c3d4bf880f9433058287e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 12:32:24 +0000 Subject: fix [#34104] vertex color: color select bug changing the hue in a color picker on a panel when black/white was selected would fail because the hue from the previous state wasnt stored. --- source/blender/editors/interface/interface.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source') diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 589ff3e1951..2fc942dab27 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -927,6 +927,8 @@ void uiEndBlock(const bContext *C, uiBlock *block) block->auto_open = block->oldblock->auto_open; block->auto_open_last = block->oldblock->auto_open_last; block->tooltipdisabled = block->oldblock->tooltipdisabled; + copy_v3_v3(ui_block_hsv_get(block), + ui_block_hsv_get(block->oldblock)); block->oldblock = NULL; } -- cgit v1.2.3 From 932be982d61726b5619ad568009b5fb2421638d8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 13:17:34 +0000 Subject: fix [#34107] Grease pencil crash after box select --- source/blender/editors/animation/keyframes_edit.c | 9 +++++- .../blender/editors/space_action/action_select.c | 35 ++++++++++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c index 015c2667a93..decbc351cad 100644 --- a/source/blender/editors/animation/keyframes_edit.c +++ b/source/blender/editors/animation/keyframes_edit.c @@ -300,7 +300,14 @@ static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, Key /* loop through each F-Curve, working on the keyframes until the first curve aborts */ for (ale = anim_data.first; ale; ale = ale->next) { - ret_code = ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb); + switch (ale->datatype) { + case ALE_MASKLAY: + case ALE_GPFRAME: + break; + default: + ret_code = ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb); + break; + } if (ret_code) break; diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c index d0f76c21019..5eeb62a9e1d 100644 --- a/source/blender/editors/space_action/action_select.c +++ b/source/blender/editors/space_action/action_select.c @@ -259,12 +259,35 @@ static void borderselect_action(bAnimContext *ac, rcti rect, short mode, short s !((ymax < rectf.ymin) || (ymin > rectf.ymax))) { /* loop over data selecting */ - if (ale->type == ANIMTYPE_GPLAYER) - ED_gplayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode); - else if (ale->type == ANIMTYPE_MASKLAYER) - ED_masklayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode); - else - ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL); + switch (ale->type) { + case ANIMTYPE_GPDATABLOCK: + { + bGPdata *gpd = ale->data; + bGPDlayer *gpl; + for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { + ED_gplayer_frames_select_border(gpl, rectf.xmin, rectf.xmax, selectmode); + } + break; + } + case ANIMTYPE_GPLAYER: + ED_gplayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode); + break; + case ANIMTYPE_MASKDATABLOCK: + { + Mask *mask = ale->data; + MaskLayer *masklay; + for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) { + ED_masklayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode); + } + break; + } + case ANIMTYPE_MASKLAYER: + ED_masklayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode); + break; + default: + ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL); + break; + } } /* set minimum extent to be the maximum of the next channel */ -- cgit v1.2.3 From 42bbd7d62edd64d3622b2a8491d5d245162f3497 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 13:50:09 +0000 Subject: fix for memory leak selecting dope sheet summary with mask/grease-pencil data. --- source/blender/editors/space_action/action_select.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source') diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c index 5eeb62a9e1d..964a6a20c37 100644 --- a/source/blender/editors/space_action/action_select.c +++ b/source/blender/editors/space_action/action_select.c @@ -967,6 +967,7 @@ static void actkeys_mselect_single(bAnimContext *ac, bAnimListElem *ale, short s else if (ale->type == ANIMTYPE_MASKLAYER) ED_mask_select_frame(ale->data, selx, select_mode); } + BLI_freelistN(&anim_data); } else { ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL); -- cgit v1.2.3 From 1c1fb24f312464c0642fbc86db223c4f7dbe4c54 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 15:48:29 +0000 Subject: fix for rangefunc being unused for int & int array. also cast strlen to an int to avoid overflow. --- source/blender/imbuf/intern/colormanagement.c | 2 +- source/blender/makesrna/intern/rna_define.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index 86f47fe07c4..8cb721e84f1 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -2110,7 +2110,7 @@ static void colormanage_description_strip(char *description) { int i, n; - for (i = strlen(description) - 1; i >= 0; i--) { + for (i = (int)strlen(description) - 1; i >= 0; i--) { if (ELEM(description[i], '\r', '\n')) { description[i] = '\0'; } diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c index 4e6c3748230..8bed562cbf7 100644 --- a/source/blender/makesrna/intern/rna_define.c +++ b/source/blender/makesrna/intern/rna_define.c @@ -2120,6 +2120,7 @@ void RNA_def_property_int_funcs_runtime(PropertyRNA *prop, IntPropertyGetFunc ge if (getfunc) iprop->get_ex = getfunc; if (setfunc) iprop->set_ex = setfunc; + if (rangefunc) iprop->range_ex = rangefunc; if (getfunc || setfunc) { /* don't save in id properties */ @@ -2136,6 +2137,7 @@ void RNA_def_property_int_array_funcs_runtime(PropertyRNA *prop, IntArrayPropert if (getfunc) iprop->getarray_ex = getfunc; if (setfunc) iprop->setarray_ex = setfunc; + if (rangefunc) iprop->range_ex = rangefunc; if (getfunc || setfunc) { /* don't save in id properties */ -- cgit v1.2.3 From 03687b7c66d7064870bbe8d01f889c85de1fad7d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 4 Feb 2013 16:12:42 +0000 Subject: Compositor "Relative" option for Translate node, same as for other nodes this makes it possible to specify an offset relative to the render resolution (so 0.5 is half the image rather than giving the number of pixels). It's a bit late but it's a trivial change and needed for 4k mango render. --- source/blender/compositor/nodes/COM_TranslateNode.cpp | 12 ++++++++++-- .../blender/compositor/operations/COM_TranslateOperation.cpp | 9 +++++++++ .../blender/compositor/operations/COM_TranslateOperation.h | 8 ++++++-- source/blender/editors/space_node/drawnode.c | 1 + source/blender/makesdna/DNA_node_types.h | 4 +++- source/blender/makesrna/intern/rna_nodetree.c | 5 +++++ 6 files changed, 34 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/nodes/COM_TranslateNode.cpp b/source/blender/compositor/nodes/COM_TranslateNode.cpp index 1d21b23fa74..887190b44b9 100644 --- a/source/blender/compositor/nodes/COM_TranslateNode.cpp +++ b/source/blender/compositor/nodes/COM_TranslateNode.cpp @@ -38,10 +38,18 @@ void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContex OutputSocket *outputSocket = this->getOutputSocket(0); TranslateOperation *operation = new TranslateOperation(); - bNode *editorNode = this->getbNode(); - NodeTranslateData *data = (NodeTranslateData *)editorNode->storage; + bNode *bnode = this->getbNode(); + NodeTranslateData *data = (NodeTranslateData *)bnode->storage; operation->setWrapping(data->wrap_axis); + if (data->relative) { + const RenderData *rd = context->getRenderData(); + float fx = rd->xsch * rd->size / 100.0f; + float fy = rd->ysch * rd->size / 100.0f; + + operation->setFactorXY(fx, fy); + } + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); inputXSocket->relinkConnections(operation->getInputSocket(1), 1, graph); inputYSocket->relinkConnections(operation->getInputSocket(2), 2, graph); diff --git a/source/blender/compositor/operations/COM_TranslateOperation.cpp b/source/blender/compositor/operations/COM_TranslateOperation.cpp index 253c5df8f9d..27651a772ee 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.cpp +++ b/source/blender/compositor/operations/COM_TranslateOperation.cpp @@ -34,6 +34,8 @@ TranslateOperation::TranslateOperation() : NodeOperation() this->m_inputXOperation = NULL; this->m_inputYOperation = NULL; this->m_isDeltaSet = false; + this->m_factorX = 1.0f; + this->m_factorY = 1.0f; } void TranslateOperation::initExecution() { @@ -180,3 +182,10 @@ float TranslateOperation::getWrappedOriginalYPos(float y) while (originalYPos < 0) originalYPos += this->m_height; return fmodf(originalYPos, this->getHeight()); } + +float TranslateOperation::setFactorXY(float factorX, float factorY) +{ + m_factorX = factorX; + m_factorY = factorY; +} + diff --git a/source/blender/compositor/operations/COM_TranslateOperation.h b/source/blender/compositor/operations/COM_TranslateOperation.h index d93f09e2ab6..4512f97550c 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.h +++ b/source/blender/compositor/operations/COM_TranslateOperation.h @@ -35,6 +35,8 @@ private: bool m_isDeltaSet; float m_relativeOffsetX; float m_relativeOffsetY; + float m_factorX; + float m_factorY; char m_wrappingType; public: TranslateOperation(); @@ -44,8 +46,8 @@ public: void initExecution(); void deinitExecution(); - float getDeltaX() { return this->m_deltaX; } - float getDeltaY() { return this->m_deltaY; } + float getDeltaX() { return this->m_deltaX * this->m_factorX; } + float getDeltaY() { return this->m_deltaY * this->m_factorY; } inline void ensureDelta() { if (!this->m_isDeltaSet) { @@ -61,6 +63,8 @@ public: void setWrapping(char wrapping_type); float getWrappedOriginalXPos(float x); float getWrappedOriginalYPos(float y); + + float setFactorXY(float factorX, float factorY); }; #endif diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index f3deef45a1b..9b342ed8f44 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2381,6 +2381,7 @@ static void node_composit_buts_stabilize2d(uiLayout *layout, bContext *C, Pointe static void node_composit_buts_translate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { + uiItemR(layout, ptr, "use_relative", 0, NULL, ICON_NONE); uiItemR(layout, ptr, "wrap_axis", 0, NULL, ICON_NONE); } diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 376d775f719..116b2327d29 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -712,7 +712,9 @@ typedef struct NodeTrackPosData { } NodeTrackPosData; typedef struct NodeTranslateData { - char wrap_axis, pad[7]; + char wrap_axis; + char relative; + char pad[6]; } NodeTranslateData; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index f5e3867cfe4..a3eaeb64cda 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -4239,6 +4239,11 @@ static void def_cmp_translate(StructRNA *srna) RNA_def_struct_sdna_from(srna, "NodeTranslateData", "storage"); + prop = RNA_def_property(srna, "use_relative", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "relative", 1); + RNA_def_property_ui_text(prop, "Relative", "Use relative (percent) values to define blur radius"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); + prop = RNA_def_property(srna, "wrap_axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "wrap_axis"); RNA_def_property_enum_items(prop, translate_items); -- cgit v1.2.3 From 9d713688bacfb9832cd7951eccaa05b5b977ff9a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 16:20:39 +0000 Subject: code cleanup: warnings --- source/blender/blenkernel/intern/customdata.c | 3 +++ source/blender/bmesh/tools/bmesh_bevel.c | 1 + 2 files changed, 4 insertions(+) (limited to 'source') diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index f3548f776f5..580a69466c9 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -1242,12 +1242,15 @@ void CustomData_update_typemap(CustomData *data) } } +/* currently only used in BLI_assert */ +#ifndef NDEBUG static int customdata_typemap_is_valid(const CustomData *data) { CustomData data_copy = *data; CustomData_update_typemap(&data_copy); return (memcmp(data->typemap, data_copy.typemap, sizeof(data->typemap)) == 0); } +#endif void CustomData_merge(const struct CustomData *source, struct CustomData *dest, CustomDataMask mask, int alloctype, int totelem) diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index e60ce562c6c..1e74354603b 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -384,6 +384,7 @@ static void offset_in_two_planes(EdgeHalf *e1, EdgeHalf *e2, EdgeHalf *emid, int iret; BLI_assert(f1 != NULL && f2 != NULL); + (void)f1, (void)f2; /* UNUSED */ /* get direction vectors for two offset lines */ sub_v3_v3v3(dir1, v->co, BM_edge_other_vert(e1->e, v)->co); -- cgit v1.2.3 From a6f5a729fcd4e2686f955c8029818f0e92f8c8a2 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Mon, 4 Feb 2013 16:50:20 +0000 Subject: Compile fix for r54300, setFactorXY function does not return a value. --- source/blender/compositor/operations/COM_TranslateOperation.cpp | 2 +- source/blender/compositor/operations/COM_TranslateOperation.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/operations/COM_TranslateOperation.cpp b/source/blender/compositor/operations/COM_TranslateOperation.cpp index 27651a772ee..32b9398094d 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.cpp +++ b/source/blender/compositor/operations/COM_TranslateOperation.cpp @@ -183,7 +183,7 @@ float TranslateOperation::getWrappedOriginalYPos(float y) return fmodf(originalYPos, this->getHeight()); } -float TranslateOperation::setFactorXY(float factorX, float factorY) +void TranslateOperation::setFactorXY(float factorX, float factorY) { m_factorX = factorX; m_factorY = factorY; diff --git a/source/blender/compositor/operations/COM_TranslateOperation.h b/source/blender/compositor/operations/COM_TranslateOperation.h index 4512f97550c..accca527400 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.h +++ b/source/blender/compositor/operations/COM_TranslateOperation.h @@ -64,7 +64,7 @@ public: float getWrappedOriginalXPos(float x); float getWrappedOriginalYPos(float y); - float setFactorXY(float factorX, float factorY); + void setFactorXY(float factorX, float factorY); }; #endif -- cgit v1.2.3 From ea723386c31e4c691e6a64f6c69a83b30f8c3010 Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Mon, 4 Feb 2013 17:38:37 +0000 Subject: updated fix for [#34089] Crash opening file containing translation node saved before rev54235 some of our artists work to much on trunk :) Especially our beloved Pablo Vazquez. We increased the blender file sub-version for checking if translate nodes needed to be updated. Happy blending. --- source/blender/blenloader/intern/readfile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 83d7e07c5a3..e55eb81c820 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8728,7 +8728,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } // add storage for compositor translate nodes when not existing - if (!MAIN_VERSION_ATLEAST(main, 265, 9)) { + if (!MAIN_VERSION_ATLEAST(main, 265, 10)) { bNodeTreeType *ntreetype; ntreetype = ntreeGetType(NTREE_COMPOSIT); -- cgit v1.2.3 From 55ff9ecdd95ab16b9fc636162e14de8949041e27 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 4 Feb 2013 19:12:17 +0000 Subject: The usual UI messages tweaks... --- source/blender/makesrna/intern/rna_actuator.c | 4 ++-- source/blender/makesrna/intern/rna_fcurve.c | 2 +- source/blender/makesrna/intern/rna_nodetree.c | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 18035acdb63..fe4a23cb393 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -876,7 +876,7 @@ static void rna_def_object_actuator(BlenderRNA *brna) prop = RNA_def_property(srna, "use_add_character_location", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_ADD_CHAR_LOC); - RNA_def_property_ui_text(prop, "Add", "Toggles between ADD and SET character location"); + RNA_def_property_ui_text(prop, "Add", "Toggle between ADD and SET character location"); RNA_def_property_update(prop, NC_LOGIC, NULL); prop = RNA_def_property(srna, "use_servo_limit_x", PROP_BOOLEAN, PROP_NONE); @@ -896,7 +896,7 @@ static void rna_def_object_actuator(BlenderRNA *brna) prop = RNA_def_property(srna, "use_character_jump", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CHAR_JUMP); - RNA_def_property_ui_text(prop, "Jump", "Makes the character jump using the settings in the physics properties"); + RNA_def_property_ui_text(prop, "Jump", "Make the character jump using the settings in the physics properties"); RNA_def_property_update(prop, NC_LOGIC, NULL); } diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index 1b3c6ef70bb..82e2cb3b0ea 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -684,7 +684,7 @@ void rna_FModifierEnvelope_points_remove(FModifier *fmod, ReportList *reports, P /* test point is in range */ if (index < 0 || index >= env->totvert) { - BKE_report(reports, RPT_ERROR, "Control Point not in FEnvelopeModifier"); + BKE_report(reports, RPT_ERROR, "Control point not in Envelope F-Modifier"); return; } diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index a3eaeb64cda..fdae2979432 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -4228,10 +4228,10 @@ static void def_cmp_trackpos(StructRNA *srna) static void def_cmp_translate(StructRNA *srna) { static EnumPropertyItem translate_items[] = { - {0, "NONE", 0, "None", "No wrapping on x and y"}, - {1, "XAXIS", 0, "X-Axis", "Wrap all pixels on the x-Axis"}, - {2, "YAXIS", 0, "Y-Axis", "Wrap all pixels on the y-Axis"}, - {3, "BOTH", 0, "Both axes", "Wrap all pixels on the both axes"}, + {0, "NONE", 0, "None", "No wrapping on X and Y"}, + {1, "XAXIS", 0, "X Axis", "Wrap all pixels on the X axis"}, + {2, "YAXIS", 0, "Y Axis", "Wrap all pixels on the Y axis"}, + {3, "BOTH", 0, "Both Axes", "Wrap all pixels on both axes"}, {0, NULL, 0, NULL, NULL} }; -- cgit v1.2.3 From ae27a548f87e938facffc02f015e4a11d45f24cd Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Mon, 4 Feb 2013 23:50:31 +0000 Subject: rigidbody: Fix [#34106] Deleting an object with Bullet Constraint crashes Blender Constraints are deleted before rigid bodies so need to check if constraint exists in case both the constraint and ridid body are on the same object. --- source/blender/blenkernel/intern/rigidbody.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 7cab0d7471f..bbcb77ef191 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -853,7 +853,7 @@ void BKE_rigidbody_remove_object(Scene *scene, Object *ob) if (rbw->constraints) { for (go = rbw->constraints->gobject.first; go; go = go->next) { Object *obt = go->ob; - if (obt) { + if (obt && obt->rigidbody_constraint) { rbc = obt->rigidbody_constraint; if (rbc->ob1 == ob) { rbc->ob1 = NULL; -- cgit v1.2.3 From 9d8ec8b30f5d07155912b76127e44df5da8c27b6 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Mon, 4 Feb 2013 23:50:34 +0000 Subject: rigidbody: Don't allow collision shape to be animated While it's fun to be able to change collison shape while the simulation is running it can cause crashes in some cases. --- source/blender/makesrna/intern/rna_rigidbody.c | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_rigidbody.c b/source/blender/makesrna/intern/rna_rigidbody.c index 938ef7a5032..71ff7bfd6ec 100644 --- a/source/blender/makesrna/intern/rna_rigidbody.c +++ b/source/blender/makesrna/intern/rna_rigidbody.c @@ -188,25 +188,6 @@ static void rna_RigidBodyOb_disabled_set(PointerRNA *ptr, int value) #endif } -static void rna_RigidBodyOb_shape_set(PointerRNA *ptr, int value) -{ - RigidBodyOb *rbo = (RigidBodyOb *)ptr->data; - Object *ob = (Object *)ptr->id.data; - - rbo->shape = value; - - /* force creation of new collision shape reflecting this */ - BKE_rigidbody_validate_sim_shape(ob, TRUE); - -#ifdef WITH_BULLET - /* now tell RB sim about it */ - if (rbo->physics_object && rbo->physics_shape) { - RB_body_set_collision_shape(rbo->physics_object, rbo->physics_shape); - } -#endif -} - - static void rna_RigidBodyOb_mass_set(PointerRNA *ptr, float value) { RigidBodyOb *rbo = (RigidBodyOb *)ptr->data; @@ -642,8 +623,8 @@ static void rna_def_rigidbody_object(BlenderRNA *brna) prop = RNA_def_property(srna, "collision_shape", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "shape"); RNA_def_property_enum_items(prop, rigidbody_ob_shape_items); - RNA_def_property_enum_funcs(prop, NULL, "rna_RigidBodyOb_shape_set", NULL); RNA_def_property_ui_text(prop, "Collision Shape", "Collision Shape of object in Rigid Body Simulations"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset"); prop = RNA_def_property(srna, "kinematic", PROP_BOOLEAN, PROP_NONE); -- cgit v1.2.3 From ace88b6962427944bd6851c1174f020ef769a4b7 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Mon, 4 Feb 2013 23:50:36 +0000 Subject: rigidbody: Fix [#34108] Rigid body with no polygons crashes blender Fall back to using box shape in case creating shape from mesh fails. --- source/blender/blenkernel/intern/rigidbody.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source') diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index bbcb77ef191..3ed6d0dfc8f 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -416,6 +416,10 @@ void BKE_rigidbody_validate_sim_shape(Object *ob, short rebuild) rbo->physics_shape = new_shape; RB_shape_set_margin(rbo->physics_shape, RBO_GET_MARGIN(rbo)); } + else { /* otherwise fall back to box shape */ + rbo->shape = RB_SHAPE_BOX; + BKE_rigidbody_validate_sim_shape(ob, true); + } } /* --------------------- */ -- cgit v1.2.3 From e9ef8d6effa0fa0d8b7d9a7764643d714c0ab2bd Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Mon, 4 Feb 2013 23:50:38 +0000 Subject: rigidbody: Avoid always making passive objects kinematic It's only needed when they're being transformed. Also deactivate passive objects after transformation so they don't keep acitvating deactivated objects. Fixes issues with using "start deactivated". --- source/blender/blenkernel/intern/rigidbody.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 3ed6d0dfc8f..6789e3803ce 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -958,7 +958,7 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o RB_shape_set_margin(rbo->physics_shape, RBO_GET_MARGIN(rbo) * MIN3(scale[0], scale[1], scale[2])); /* make transformed objects temporarily kinmatic so that they can be moved by the user during simulation */ - if ((ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ) || rbo->type == RBO_TYPE_PASSIVE) { + if (ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ) { RB_body_set_kinematic_state(rbo->physics_object, TRUE); RB_body_set_mass(rbo->physics_object, 0.0f); } @@ -1118,6 +1118,9 @@ static void rigidbody_update_simulation_post_step(RigidBodyWorld *rbw) if (ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ) { RB_body_set_kinematic_state(rbo->physics_object, rbo->flag & RBO_FLAG_KINEMATIC || rbo->flag & RBO_FLAG_DISABLED); RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo)); + /* deactivate passive objects so they don't interfere with deactivation of active objects */ + if (rbo->type == RBO_TYPE_PASSIVE) + RB_body_deactivate(rbo->physics_object); } } } @@ -1178,8 +1181,12 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], flo copy_qt_qt(rbo->orn, ob->quat); copy_qt_qt(ob->quat, quat); } - if (rbo->physics_object) + if (rbo->physics_object) { + /* allow passive objects to return to original transform */ + if (rbo->type == RBO_TYPE_PASSIVE) + RB_body_set_kinematic_state(rbo->physics_object, TRUE); RB_body_set_loc_rot(rbo->physics_object, rbo->pos, rbo->orn); + } // RB_TODO update rigid body physics object's loc/rot for dynamic objects here as well (needs to be done outside bullet's update loop) } -- cgit v1.2.3 From 936a38c607de098e3b09c5c00337130ebdd47b44 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 02:28:49 +0000 Subject: fix for valgrind warning - using uninitialized variable. Though in practice it didn't cause any problems. Getting the 'CTX_data_main' while un-fullscreen'ing a space would do a context lookup into the view3d_context which had an uninitialized layer. since view3d_context doesn't hold a 'main' member it never did anything but cleaner not to do context lookups while modifying the view. - noticed while checking on a real bug :) --- source/blender/editors/screen/screen_edit.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index cca713ec14a..7c22dff1b01 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1337,13 +1337,14 @@ int ED_screen_area_active(const bContext *C) /* Do NOT call in area/region queues! */ void ED_screen_set(bContext *C, bScreen *sc) { + Main *bmain = CTX_data_main(C); wmWindowManager *wm = CTX_wm_manager(C); wmWindow *win = CTX_wm_window(C); bScreen *oldscreen = CTX_wm_screen(C); ID *id; /* validate screen, it's called with notifier reference */ - for (id = CTX_data_main(C)->screen.first; id; id = id->next) + for (id = bmain->screen.first; id; id = id->next) if (sc == (bScreen *)id) break; if (id == NULL) @@ -1355,7 +1356,7 @@ void ED_screen_set(bContext *C, bScreen *sc) if (sc->full) { /* find associated full */ bScreen *sc1; - for (sc1 = CTX_data_main(C)->screen.first; sc1; sc1 = sc1->id.next) { + for (sc1 = bmain->screen.first; sc1; sc1 = sc1->id.next) { ScrArea *sa = sc1->areabase.first; if (sa->full == sc) { sc = sc1; -- cgit v1.2.3 From a8601a5702b5b510af46459ed7a36f65a3e4755d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 04:41:11 +0000 Subject: fix [#34113] operator_menu_enum() - Tooltip not showing descriptions Python wasn't able to set 'OperatorType.prop', which is used by uiButGetStrInfo(). add 'bl_property' to python operators which is assigned to OperatorType.prop when registering. (api docs coming next) --- source/blender/python/intern/bpy_intern_string.c | 3 + source/blender/python/intern/bpy_intern_string.h | 1 + source/blender/python/intern/bpy_operator_wrap.c | 76 +++++++++++++++++++----- 3 files changed, 66 insertions(+), 14 deletions(-) (limited to 'source') diff --git a/source/blender/python/intern/bpy_intern_string.c b/source/blender/python/intern/bpy_intern_string.c index 70ea57bb33f..294f230ce99 100644 --- a/source/blender/python/intern/bpy_intern_string.c +++ b/source/blender/python/intern/bpy_intern_string.c @@ -35,6 +35,7 @@ PyObject *bpy_intern_str_register; PyObject *bpy_intern_str_unregister; PyObject *bpy_intern_str_bl_rna; +PyObject *bpy_intern_str_bl_property; PyObject *bpy_intern_str_order; PyObject *bpy_intern_str_attr; PyObject *bpy_intern_str___slots__; @@ -46,6 +47,7 @@ void bpy_intern_string_init(void) bpy_intern_str_register = PyUnicode_FromString("register"); bpy_intern_str_unregister = PyUnicode_FromString("unregister"); bpy_intern_str_bl_rna = PyUnicode_FromString("bl_rna"); + bpy_intern_str_bl_property = PyUnicode_FromString("bl_property"); bpy_intern_str_order = PyUnicode_FromString("order"); bpy_intern_str_attr = PyUnicode_FromString("attr"); bpy_intern_str___slots__ = PyUnicode_FromString("__slots__"); @@ -58,6 +60,7 @@ void bpy_intern_string_exit(void) Py_DECREF(bpy_intern_str_register); Py_DECREF(bpy_intern_str_unregister); Py_DECREF(bpy_intern_str_bl_rna); + Py_DECREF(bpy_intern_str_bl_property); Py_DECREF(bpy_intern_str_order); Py_DECREF(bpy_intern_str_attr); Py_DECREF(bpy_intern_str___slots__); diff --git a/source/blender/python/intern/bpy_intern_string.h b/source/blender/python/intern/bpy_intern_string.h index 0b7ca2cd47b..2e0d18d8b7f 100644 --- a/source/blender/python/intern/bpy_intern_string.h +++ b/source/blender/python/intern/bpy_intern_string.h @@ -30,6 +30,7 @@ void bpy_intern_string_exit(void); extern PyObject *bpy_intern_str_register; extern PyObject *bpy_intern_str_unregister; extern PyObject *bpy_intern_str_bl_rna; +extern PyObject *bpy_intern_str_bl_property; extern PyObject *bpy_intern_str_order; extern PyObject *bpy_intern_str_attr; extern PyObject *bpy_intern_str___slots__; diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index cb2e12ba996..e13dc6ecddd 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -29,10 +29,8 @@ * functionality. */ - #include -#include "bpy_operator_wrap.h" #include "WM_api.h" #include "WM_types.h" @@ -42,6 +40,8 @@ #include "RNA_define.h" #include "bpy_rna.h" +#include "bpy_intern_string.h" +#include "bpy_operator_wrap.h" /* own include */ static void operator_properties_init(wmOperatorType *ot) { @@ -57,6 +57,66 @@ static void operator_properties_init(wmOperatorType *ot) PyErr_Print(); /* failed to register operator props */ PyErr_Clear(); } + + /* set the default property: ot->prop */ + { + /* picky developers will notice that 'bl_property' won't work with inheritance + * get direct from the dict to avoid raising a load of attribute errors (yes this isnt ideal) - campbell */ + PyTypeObject *py_class = ot->ext.data; + PyObject *py_class_dict = py_class->tp_dict; + PyObject *bl_property = PyDict_GetItem(py_class_dict, bpy_intern_str_bl_property); + const char *prop_id; + bool prop_raise_error; + + if (bl_property) { + if (PyUnicode_Check(bl_property)) { + /* since the property is explicitly given, raise an error if its not found */ + prop_id = _PyUnicode_AsString(bl_property); + prop_raise_error = true; + } + else { + PyErr_Format(PyExc_ValueError, + "%.200s.bl_property should be a string, not %.200s", + ot->idname, Py_TYPE(bl_property)->tp_name); + + /* this could be done cleaner, for now its OK */ + PyErr_Print(); + PyErr_Clear(); + + prop_id = NULL; + prop_raise_error = false; + } + } + else { + prop_id = "type"; + prop_raise_error = false; + } + + if (prop_id) { + /* fallback to hard-coded string */ + PointerRNA ptr; + PropertyRNA *prop; + + RNA_pointer_create(NULL, ot->srna, NULL, &ptr); + prop = RNA_struct_find_property(&ptr, prop_id); + if (prop) { + ot->prop = prop; + } + else { + if (prop_raise_error) { + PyErr_Format(PyExc_ValueError, + "%.200s.bl_property '%.200s' not found", + ot->idname, prop_id); + + /* this could be done cleaner, for now its OK */ + PyErr_Print(); + PyErr_Clear(); + } + } + } + } + /* end 'ot->prop' assignment */ + } void operator_wrapper(wmOperatorType *ot, void *userdata) @@ -68,18 +128,6 @@ void operator_wrapper(wmOperatorType *ot, void *userdata) ot->srna = srna; /* restore */ operator_properties_init(ot); - - /* XXX - not nice, set the first enum as searchable, should have a way for python to set */ - { - PointerRNA ptr; - PropertyRNA *prop; - - RNA_pointer_create(NULL, ot->srna, NULL, &ptr); - prop = RNA_struct_find_property(&ptr, "type"); - if (prop) { - ot->prop = prop; - } - } } void macro_wrapper(wmOperatorType *ot, void *userdata) -- cgit v1.2.3 From ec97183876faa5b18debc75fb64b024da41f9012 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 05:09:19 +0000 Subject: add python api docstring for 'bpy.types.Operator.bl_property' --- source/blender/python/intern/bpy_operator_wrap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index e13dc6ecddd..9d92ff51213 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -88,12 +88,12 @@ static void operator_properties_init(wmOperatorType *ot) } } else { + /* fallback to hard-coded string (pre 2.66, could be deprecated) */ prop_id = "type"; prop_raise_error = false; } if (prop_id) { - /* fallback to hard-coded string */ PointerRNA ptr; PropertyRNA *prop; -- cgit v1.2.3 From 2c0a3cf42ee3800b783d1c82a82658984161aa64 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 05:39:18 +0000 Subject: fix [#34113] operator_menu_enum() - Tooltip not showing descriptions second fix from this report which makes the menu show tips even when 'bl_property' isn't set. --- source/blender/editors/interface/interface_layout.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'source') diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 3b764d5bdef..c69f53a53d2 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -624,6 +624,18 @@ void uiFileBrowseContextProperty(const bContext *C, PointerRNA *ptr, PropertyRNA /********************* Button Items *************************/ +/** + * Update a buttons tip with an enum's description if possible. + */ +static void ui_but_tip_from_enum_item(uiBut *but, EnumPropertyItem *item) +{ + if (but->tip == NULL || but->tip[0] == '\0') { + if (item->description && item->description[0]) { + but->tip = item->description; + } + } +} + /* disabled item */ static void ui_item_disabled(uiLayout *layout, const char *name) { @@ -837,6 +849,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname else { uiItemEnumO_ptr__internal(column, ot, item[i].name, item[i].icon, prop, item[i].value); } + ui_but_tip_from_enum_item(block->buttons.last, &item[i]); } else { if (item[i].name) { @@ -849,6 +862,8 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname uiItemL(column, item[i].name, ICON_NONE); bt = block->buttons.last; bt->flag = UI_TEXT_LEFT; + + ui_but_tip_from_enum_item(bt, &item[i]); } else { /* XXX bug here, colums draw bottom item badly */ uiItemS(column); @@ -1239,6 +1254,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname for (i = 0; i < totitem; i++) { if (item[i].identifier[0]) { uiItemEnumR(column, item[i].name, ICON_NONE, ptr, propname, item[i].value); + ui_but_tip_from_enum_item(block->buttons.last, &item[i]); } else { if (item[i].name) { @@ -1251,6 +1267,8 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname uiItemL(column, item[i].name, ICON_NONE); bt = block->buttons.last; bt->flag = UI_TEXT_LEFT; + + ui_but_tip_from_enum_item(bt, &item[i]); } else uiItemS(column); -- cgit v1.2.3 From 791e38afd2637134f4fea1ad8a8cfb48317bbc86 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 08:16:04 +0000 Subject: fix [#34105] bake artifacts different threads could allocate the mask buffer and overwrite the same pointer, regression since 2.65 --- source/blender/render/intern/source/bake.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c index 0ac88c3f5b0..f36cd0f48c7 100644 --- a/source/blender/render/intern/source/bake.c +++ b/source/blender/render/intern/source/bake.c @@ -818,10 +818,13 @@ static void shade_tface(BakeShade *bs) BLI_lock_thread(LOCK_CUSTOM1); userdata = bs->ibuf->userdata; if (userdata == NULL) /* since the thread was locked, its possible another thread alloced the value */ - userdata = MEM_callocN(sizeof(BakeImBufuserData), "BakeMask"); + userdata = MEM_callocN(sizeof(BakeImBufuserData), STRINGIFY(BakeImBufuserData)); - if (bs->use_mask) - userdata->mask_buffer = MEM_callocN(sizeof(char) * bs->rectx * bs->recty, "BakeMask"); + if (bs->use_mask) { + if (userdata->mask_buffer == NULL) { + userdata->mask_buffer = MEM_callocN(sizeof(char) * bs->rectx * bs->recty, "BakeMask"); + } + } if (bs->use_displacement_buffer) userdata->displacement_buffer = MEM_callocN(sizeof(float) * bs->rectx * bs->recty, "BakeDisp"); -- cgit v1.2.3 From 9ddf928dbd732a9394a17c65ac95ecee30f3efcd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 09:42:40 +0000 Subject: remove stringify macro from alloc's --- source/blender/blenkernel/intern/mask_rasterize.c | 4 ++-- source/blender/blenkernel/intern/node.c | 2 +- source/blender/blenloader/intern/readfile.c | 2 +- source/blender/nodes/composite/nodes/node_composite_mask.c | 2 +- source/blender/render/intern/source/bake.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/mask_rasterize.c b/source/blender/blenkernel/intern/mask_rasterize.c index 73452b216ff..e3423c93f3c 100644 --- a/source/blender/blenkernel/intern/mask_rasterize.c +++ b/source/blender/blenkernel/intern/mask_rasterize.c @@ -213,7 +213,7 @@ MaskRasterHandle *BKE_maskrasterize_handle_new(void) { MaskRasterHandle *mr_handle; - mr_handle = MEM_callocN(sizeof(MaskRasterHandle), STRINGIFY(MaskRasterHandle)); + mr_handle = MEM_callocN(sizeof(MaskRasterHandle), "MaskRasterHandle"); return mr_handle; } @@ -569,7 +569,7 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas unsigned int masklay_index; mr_handle->layers_tot = BLI_countlist(&mask->masklayers); - mr_handle->layers = MEM_mallocN(sizeof(MaskRasterLayer) * mr_handle->layers_tot, STRINGIFY(MaskRasterLayer)); + mr_handle->layers = MEM_mallocN(sizeof(MaskRasterLayer) * mr_handle->layers_tot, "MaskRasterLayer"); BLI_rctf_init_minmax(&mr_handle->bounds); for (masklay = mask->masklayers.first, masklay_index = 0; masklay; masklay = masklay->next, masklay_index++) { diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index c73bd5ef8fd..2062cc01d02 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1634,7 +1634,7 @@ void BKE_node_clipboard_add_node(bNode *node) { #ifdef USE_NODE_CB_VALIDATE /* add extra info */ - bNodeClipboardExtraInfo *node_info = MEM_mallocN(sizeof(bNodeClipboardExtraInfo), STRINGIFY(bNodeClipboardExtraInfo)); + bNodeClipboardExtraInfo *node_info = MEM_mallocN(sizeof(bNodeClipboardExtraInfo), "bNodeClipboardExtraInfo"); node_info->id = node->id; if (node->id) { diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index e55eb81c820..077a716b17a 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8979,7 +8979,7 @@ static void sort_bhead_old_map(FileData *fd) fd->tot_bheadmap = tot; if (tot == 0) return; - bhs = fd->bheadmap = MEM_mallocN(tot*sizeof(struct BHeadSort), STRINGIFY(BHeadSort)); + bhs = fd->bheadmap = MEM_mallocN(tot * sizeof(struct BHeadSort), "BHeadSort"); for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead), bhs++) { bhs->bhead = bhead; diff --git a/source/blender/nodes/composite/nodes/node_composite_mask.c b/source/blender/nodes/composite/nodes/node_composite_mask.c index 0bac68ab1ac..8be6ecd27fd 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mask.c +++ b/source/blender/nodes/composite/nodes/node_composite_mask.c @@ -47,7 +47,7 @@ static bNodeSocketTemplate cmp_node_mask_out[] = { static void node_composit_init_mask(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { - NodeMask *data = MEM_callocN(sizeof(NodeMask), STRINGIFY(NodeMask)); + NodeMask *data = MEM_callocN(sizeof(NodeMask), "NodeMask"); data->size_x = data->size_y = 256; node->storage = data; diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c index f36cd0f48c7..665361e7d14 100644 --- a/source/blender/render/intern/source/bake.c +++ b/source/blender/render/intern/source/bake.c @@ -818,7 +818,7 @@ static void shade_tface(BakeShade *bs) BLI_lock_thread(LOCK_CUSTOM1); userdata = bs->ibuf->userdata; if (userdata == NULL) /* since the thread was locked, its possible another thread alloced the value */ - userdata = MEM_callocN(sizeof(BakeImBufuserData), STRINGIFY(BakeImBufuserData)); + userdata = MEM_callocN(sizeof(BakeImBufuserData), "BakeImBufuserData"); if (bs->use_mask) { if (userdata->mask_buffer == NULL) { -- cgit v1.2.3 From e7cead09944a97854309c5eea56fb4fadb92fb3d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 11:30:50 +0000 Subject: own recent change to triangulate bmesh operator stopped filling in mapping slot 'face_map.out', not used by blender its self but useful for scripts, enable this again. --- source/blender/bmesh/operators/bmo_triangulate.c | 3 +- source/blender/bmesh/tools/bmesh_triangulate.c | 40 +++++++++++++++++++---- source/blender/bmesh/tools/bmesh_triangulate.h | 3 +- source/blender/editors/sculpt_paint/sculpt.c | 2 +- source/blender/modifiers/intern/MOD_triangulate.c | 2 +- 5 files changed, 40 insertions(+), 10 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/operators/bmo_triangulate.c b/source/blender/bmesh/operators/bmo_triangulate.c index bbcb07e1174..e06929e339d 100644 --- a/source/blender/bmesh/operators/bmo_triangulate.c +++ b/source/blender/bmesh/operators/bmo_triangulate.c @@ -44,11 +44,12 @@ void bmo_triangulate_exec(BMesh *bm, BMOperator *op) { const bool use_beauty = BMO_slot_bool_get(op->slots_in, "use_beauty"); + BMOpSlot *slot_facemap_out = BMO_slot_get(op->slots_out, "face_map.out"); BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE, BM_ELEM_TAG, false); BMO_slot_buffer_hflag_enable(bm, op->slots_in, "faces", BM_FACE, BM_ELEM_TAG, false); - BM_mesh_triangulate(bm, use_beauty, true); + BM_mesh_triangulate(bm, use_beauty, true, op, slot_facemap_out); if (use_beauty) { BMO_op_callf(bm, op->flag, diff --git a/source/blender/bmesh/tools/bmesh_triangulate.c b/source/blender/bmesh/tools/bmesh_triangulate.c index 4ab5383f0b6..79f6c76afc7 100644 --- a/source/blender/bmesh/tools/bmesh_triangulate.c +++ b/source/blender/bmesh/tools/bmesh_triangulate.c @@ -30,28 +30,56 @@ #include "MEM_guardedalloc.h" #include "BLI_utildefines.h" +#include "BLI_array.h" #include "bmesh.h" #include "bmesh_triangulate.h" /* own include */ -void BM_mesh_triangulate(BMesh *bm, const bool use_beauty, const bool tag_only) +/** + * a version of #BM_face_triangulate that maps to #BMOpSlot + */ +static void bm_face_triangulate_mapping(BMesh *bm, BMFace *face, const bool use_beauty, const bool use_tag, + BMOperator *op, BMOpSlot *slot_facemap_out) +{ + const int faces_array_tot = face->len - 3; + BMFace **faces_array = BLI_array_alloca(faces_array, faces_array_tot); + BLI_assert(face->len > 3); + + BM_face_triangulate(bm, face, faces_array, use_beauty, use_tag); + + if (faces_array) { + int i; + BMO_slot_map_elem_insert(op, slot_facemap_out, face, face); + for (i = 0; i < faces_array_tot; i++) { + BMO_slot_map_elem_insert(op, slot_facemap_out, faces_array[i], face); + } + } +} + + +void BM_mesh_triangulate(BMesh *bm, const bool use_beauty, const bool tag_only, + BMOperator *op, BMOpSlot *slot_facemap_out) { BMIter iter; BMFace *face; - if (tag_only == false) { + if (slot_facemap_out) { + /* same as below but call: bm_face_triangulate_mapping() */ BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) { if (face->len > 3) { - BM_face_triangulate(bm, face, NULL, use_beauty, false); + if (tag_only == false || BM_elem_flag_test(face, BM_ELEM_TAG)) { + bm_face_triangulate_mapping(bm, face, use_beauty, tag_only, + op, slot_facemap_out); + } } } } else { BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) { - if (BM_elem_flag_test(face, BM_ELEM_TAG)) { - if (face->len > 3) { - BM_face_triangulate(bm, face, NULL, use_beauty, true); + if (face->len > 3) { + if (tag_only == false || BM_elem_flag_test(face, BM_ELEM_TAG)) { + BM_face_triangulate(bm, face, NULL, use_beauty, tag_only); } } } diff --git a/source/blender/bmesh/tools/bmesh_triangulate.h b/source/blender/bmesh/tools/bmesh_triangulate.h index ea271c98acb..936a90d3a16 100644 --- a/source/blender/bmesh/tools/bmesh_triangulate.h +++ b/source/blender/bmesh/tools/bmesh_triangulate.h @@ -30,6 +30,7 @@ #ifndef __BMESH_TRIAMGULATE_H__ #define __BMESH_TRIAMGULATE_H__ -void BM_mesh_triangulate(BMesh *bm, const bool use_beauty, const bool tag_only); +void BM_mesh_triangulate(BMesh *bm, const bool use_beauty, const bool tag_only, + BMOperator *op, BMOpSlot *slot_facemap_out); #endif /* __BMESH_TRIAMGULATE_H__ */ diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index c4d09de3d0e..10f4dc2aebc 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -4526,7 +4526,7 @@ static void SCULPT_OT_set_persistent_base(wmOperatorType *ot) static void sculpt_dynamic_topology_triangulate(BMesh *bm) { - BM_mesh_triangulate(bm, false, false); + BM_mesh_triangulate(bm, false, false, NULL, NULL); } void sculpt_pbvh_clear(Object *ob) diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c index 2f0fbbd0507..1c22e9bf364 100644 --- a/source/blender/modifiers/intern/MOD_triangulate.c +++ b/source/blender/modifiers/intern/MOD_triangulate.c @@ -42,7 +42,7 @@ static DerivedMesh *triangulate_dm(DerivedMesh *dm, const int flag) bm = DM_to_bmesh(dm); - BM_mesh_triangulate(bm, (flag & MOD_TRIANGULATE_BEAUTY), false); + BM_mesh_triangulate(bm, (flag & MOD_TRIANGULATE_BEAUTY), false, NULL, NULL); result = CDDM_from_bmesh(bm, FALSE); BM_mesh_free(bm); -- cgit v1.2.3 From fdfa5910b50e9e3af5fdd1a24d1affdfbdafc523 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 12:46:15 +0000 Subject: Fix #34040: Moving Normal Node with enabled Cycles Material Preview crashes Issue was caused by couple of circumstances: - Normal Map node requires tesselated faces to compute tangent space - All temporary meshes needed for Cycles export were adding to G.main - Undo pushes would temporary set meshes tessfaces to NULL - Moving node will cause undo push and tree re-evaluate fr preview All this leads to threading conflict between preview render and undo system. Solved it in way that all temporary meshes are adding to that exact Main which was passed to Cycles via BlendData. This required couple of mechanic changes like adding extra parameter to *_add() functions and adding some *_ex() functions to make it possible RNA adds objects to Main passed to new() RNA function. This was tricky to pass Main to RNA function and IMO that's not so nice to pass main to function, so ended up with such decision: - Object.to_mesh() will add temp mesh to G.main - Added Main.meshes.new_from_object() which does the same as to_mesh, but adds temporary mesh to specified Main. So now all temporary meshes needed for preview render would be added to preview_main which does not conflict with undo pushes. Viewport render shall not be an issue because object sync happens from main thread in this case. It could be some issues with final render, but that's not so much likely to happen, so shall be fine. Thanks to Brecht for review! --- source/blender/blenkernel/BKE_action.h | 3 +- source/blender/blenkernel/BKE_armature.h | 2 +- source/blender/blenkernel/BKE_brush.h | 3 +- source/blender/blenkernel/BKE_camera.h | 3 +- source/blender/blenkernel/BKE_curve.h | 3 +- source/blender/blenkernel/BKE_group.h | 3 +- source/blender/blenkernel/BKE_image.h | 4 +- source/blender/blenkernel/BKE_lamp.h | 3 +- source/blender/blenkernel/BKE_lattice.h | 3 +- source/blender/blenkernel/BKE_library.h | 6 + source/blender/blenkernel/BKE_mask.h | 2 +- source/blender/blenkernel/BKE_material.h | 2 +- source/blender/blenkernel/BKE_mball.h | 3 +- source/blender/blenkernel/BKE_mesh.h | 4 +- source/blender/blenkernel/BKE_movieclip.h | 2 +- source/blender/blenkernel/BKE_node.h | 2 +- source/blender/blenkernel/BKE_object.h | 5 +- source/blender/blenkernel/BKE_speaker.h | 4 +- source/blender/blenkernel/BKE_text.h | 4 +- source/blender/blenkernel/BKE_texture.h | 3 +- source/blender/blenkernel/BKE_world.h | 3 +- source/blender/blenkernel/intern/action.c | 4 +- source/blender/blenkernel/intern/anim_sys.c | 4 +- source/blender/blenkernel/intern/armature.c | 4 +- source/blender/blenkernel/intern/brush.c | 6 +- source/blender/blenkernel/intern/camera.c | 4 +- source/blender/blenkernel/intern/curve.c | 4 +- source/blender/blenkernel/intern/group.c | 4 +- source/blender/blenkernel/intern/image.c | 22 +- source/blender/blenkernel/intern/ipo.c | 4 +- source/blender/blenkernel/intern/lamp.c | 4 +- source/blender/blenkernel/intern/lattice.c | 4 +- source/blender/blenkernel/intern/library.c | 9 +- source/blender/blenkernel/intern/mask.c | 8 +- source/blender/blenkernel/intern/material.c | 6 +- source/blender/blenkernel/intern/mball.c | 4 +- source/blender/blenkernel/intern/mesh.c | 19 +- source/blender/blenkernel/intern/movieclip.c | 12 +- source/blender/blenkernel/intern/node.c | 4 +- source/blender/blenkernel/intern/object.c | 38 +- source/blender/blenkernel/intern/paint.c | 3 +- source/blender/blenkernel/intern/speaker.c | 4 +- source/blender/blenkernel/intern/text.c | 6 +- source/blender/blenkernel/intern/texture.c | 3 +- source/blender/blenkernel/intern/world.c | 3 +- source/blender/blenloader/intern/readfile.c | 2 +- source/blender/editors/animation/keyframing.c | 2 +- source/blender/editors/armature/poselib.c | 3 +- source/blender/editors/interface/interface_ops.c | 5 +- source/blender/editors/mask/mask_ops.c | 4 +- source/blender/editors/object/object_add.c | 2 +- source/blender/editors/object/object_group.c | 5 +- .../blender/editors/physics/rigidbody_constraint.c | 3 +- source/blender/editors/physics/rigidbody_object.c | 3 +- source/blender/editors/render/render_shading.c | 9 +- source/blender/editors/sculpt_paint/paint_ops.c | 5 +- source/blender/editors/space_action/action_edit.c | 5 +- source/blender/editors/space_clip/clip_ops.c | 3 +- source/blender/editors/space_image/image_ops.c | 4 +- source/blender/editors/space_node/node_add.c | 4 +- source/blender/editors/space_node/node_edit.c | 6 +- source/blender/editors/space_node/node_group.c | 2 +- source/blender/editors/space_node/node_header.c | 2 +- source/blender/editors/space_text/text_ops.c | 6 +- source/blender/makesrna/intern/rna_internal.h | 2 + source/blender/makesrna/intern/rna_main_api.c | 392 ++++++++++++++++----- source/blender/makesrna/intern/rna_object_api.c | 191 +--------- source/blender/modifiers/intern/MOD_boolean_util.c | 3 +- 68 files changed, 494 insertions(+), 419 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 4f54f93a7fc..12c9f6b449f 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -44,6 +44,7 @@ struct FCurve; struct bPose; struct bItasc; struct bPoseChannel; +struct Main; struct Object; struct Scene; struct ID; @@ -56,7 +57,7 @@ extern "C" { /* Action Lib Stuff ----------------- */ /* Allocate a new bAction with the given name */ -struct bAction *add_empty_action(const char name[]); +struct bAction *add_empty_action(struct Main *bmain, const char name[]); /* Allocate a copy of the given Action and all its data */ struct bAction *BKE_action_copy(struct bAction *src); diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h index 765a00b8d4b..fb9e9f4e691 100644 --- a/source/blender/blenkernel/BKE_armature.h +++ b/source/blender/blenkernel/BKE_armature.h @@ -73,7 +73,7 @@ typedef struct PoseTree { extern "C" { #endif -struct bArmature *BKE_armature_add(const char *name); +struct bArmature *BKE_armature_add(struct Main *bmain, const char *name); struct bArmature *BKE_armature_from_object(struct Object *ob); void BKE_armature_bonelist_free(struct ListBase *lb); void BKE_armature_free(struct bArmature *arm); diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h index 91f0525d4f3..cfae15961d7 100644 --- a/source/blender/blenkernel/BKE_brush.h +++ b/source/blender/blenkernel/BKE_brush.h @@ -37,12 +37,13 @@ struct ID; struct Brush; struct ImBuf; struct ImagePool; +struct Main; struct Scene; struct wmOperator; // enum CurveMappingPreset; /* datablock functions */ -struct Brush *BKE_brush_add(const char *name); +struct Brush *BKE_brush_add(struct Main *bmain, const char *name); struct Brush *BKE_brush_copy(struct Brush *brush); void BKE_brush_make_local(struct Brush *brush); void BKE_brush_free(struct Brush *brush); diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h index 2a27934c038..057cd79b9e4 100644 --- a/source/blender/blenkernel/BKE_camera.h +++ b/source/blender/blenkernel/BKE_camera.h @@ -39,6 +39,7 @@ extern "C" { #include "DNA_vec_types.h" struct Camera; +struct Main; struct Object; struct RegionView3D; struct RenderData; @@ -48,7 +49,7 @@ struct View3D; /* Camera Datablock */ -void *BKE_camera_add(const char *name); +void *BKE_camera_add(struct Main *bmain, const char *name); struct Camera *BKE_camera_copy(struct Camera *cam); void BKE_camera_make_local(struct Camera *cam); void BKE_camera_free(struct Camera *ca); diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 536bbecb79b..358f884f74e 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -39,6 +39,7 @@ struct Curve; struct EditNurb; struct ListBase; struct ListBase; +struct Main; struct Nurb; struct Object; struct Scene; @@ -57,7 +58,7 @@ struct Scene; void BKE_curve_unlink(struct Curve *cu); void BKE_curve_free(struct Curve *cu); void BKE_curve_editfont_free(struct Curve *cu); -struct Curve *BKE_curve_add(const char *name, int type); +struct Curve *BKE_curve_add(struct Main *bmain, const char *name, int type); struct Curve *BKE_curve_copy(struct Curve *cu); void BKE_curve_make_local(struct Curve *cu); short BKE_curve_type_get(struct Curve *cu); diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h index 3e9803a908b..8c36a73a088 100644 --- a/source/blender/blenkernel/BKE_group.h +++ b/source/blender/blenkernel/BKE_group.h @@ -36,13 +36,14 @@ struct Base; struct Group; struct GroupObject; +struct Main; struct Object; struct bAction; struct Scene; void BKE_group_free(struct Group *group); void BKE_group_unlink(struct Group *group); -struct Group *add_group(const char *name); +struct Group *add_group(struct Main *bmain, const char *name); struct Group *BKE_group_copy(struct Group *group); int add_to_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base); int rem_from_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base); diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index bfee5e820c3..f098defb907 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -153,12 +153,12 @@ struct ImBuf *BKE_image_pool_acquire_ibuf(struct Image *ima, struct ImageUser *i void BKE_image_pool_release_ibuf(struct Image *ima, struct ImBuf *ibuf, struct ImagePool *pool); /* returns a new image or NULL if it can't load */ -struct Image *BKE_image_load(const char *filepath); +struct Image *BKE_image_load(struct Main *bmain, const char *filepath); /* returns existing Image when filename/type is same (frame optional) */ struct Image *BKE_image_load_exists(const char *filepath); /* adds image, adds ibuf, generates color or pattern */ -struct Image *BKE_image_add_generated(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short uvtestgrid, float color[4]); +struct Image *BKE_image_add_generated(struct Main *bmain, unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short gen_type, float color[4]); /* adds image from imbuf, owns imbuf */ struct Image *BKE_image_add_from_imbuf(struct ImBuf *ibuf); diff --git a/source/blender/blenkernel/BKE_lamp.h b/source/blender/blenkernel/BKE_lamp.h index 244decf9d52..205c7c7d1e6 100644 --- a/source/blender/blenkernel/BKE_lamp.h +++ b/source/blender/blenkernel/BKE_lamp.h @@ -37,9 +37,10 @@ extern "C" { #endif struct Lamp; +struct Main; struct Scene; -struct Lamp *BKE_lamp_add(const char *name) WARN_UNUSED; +struct Lamp *BKE_lamp_add(struct Main *bmain, const char *name) WARN_UNUSED; struct Lamp *BKE_lamp_copy(struct Lamp *la) WARN_UNUSED; struct Lamp *localize_lamp(struct Lamp *la) WARN_UNUSED; void BKE_lamp_make_local(struct Lamp *la); diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index fe88f0c580a..b195af18a8e 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -35,6 +35,7 @@ */ struct Lattice; +struct Main; struct Object; struct Scene; struct DerivedMesh; @@ -42,7 +43,7 @@ struct BPoint; struct MDeformVert; void BKE_lattice_resize(struct Lattice *lt, int u, int v, int w, struct Object *ltOb); -struct Lattice *BKE_lattice_add(const char *name); +struct Lattice *BKE_lattice_add(struct Main *bmain, const char *name); struct Lattice *BKE_lattice_copy(struct Lattice *lt); void BKE_lattice_free(struct Lattice *lt); void BKE_lattice_make_local(struct Lattice *lt); diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index b9bb67fa509..5aa82be0541 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -51,6 +51,12 @@ __attribute__((warn_unused_result)) __attribute__((nonnull)) #endif ; +void *BKE_libblock_copy_ex(struct Main *bmain, struct ID *id) +#ifdef __GNUC__ +__attribute__((warn_unused_result)) +__attribute__((nonnull)) +#endif +; void *BKE_libblock_copy(struct ID *id) #ifdef __GNUC__ __attribute__((warn_unused_result)) diff --git a/source/blender/blenkernel/BKE_mask.h b/source/blender/blenkernel/BKE_mask.h index cc15ceecbac..b40ad4814f0 100644 --- a/source/blender/blenkernel/BKE_mask.h +++ b/source/blender/blenkernel/BKE_mask.h @@ -98,7 +98,7 @@ void BKE_mask_point_select_set(struct MaskSplinePoint *point, const short do_sel void BKE_mask_point_select_set_handle(struct MaskSplinePoint *point, const short do_select); /* general */ -struct Mask *BKE_mask_new(const char *name); +struct Mask *BKE_mask_new(struct Main *bmain, const char *name); struct Mask *BKE_mask_copy_nolib(struct Mask *mask); struct Mask *BKE_mask_copy(struct Mask *mask); diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index dd1b1a7752b..350eaf23f6f 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -52,7 +52,7 @@ void BKE_material_free_ex(struct Material *ma, int do_id_user); void test_object_materials(struct ID *id); void resize_object_material(struct Object *ob, const short totcol); void init_material(struct Material *ma); -struct Material *BKE_material_add(const char *name); +struct Material *BKE_material_add(struct Main *bmain, const char *name); struct Material *BKE_material_copy(struct Material *ma); struct Material *localize_material(struct Material *ma); struct Material *give_node_material(struct Material *ma); /* returns node material or self */ diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index 7a0eea1b009..662bfab10a1 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -32,6 +32,7 @@ * \since March 2001 * \author nzc */ +struct Main; struct MetaBall; struct Object; struct Scene; @@ -39,7 +40,7 @@ struct MetaElem; void BKE_mball_unlink(struct MetaBall *mb); void BKE_mball_free(struct MetaBall *mb); -struct MetaBall *BKE_mball_add(const char *name); +struct MetaBall *BKE_mball_add(struct Main *bmain, const char *name); struct MetaBall *BKE_mball_copy(struct MetaBall *mb); void BKE_mball_make_local(struct MetaBall *mb); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index cfe562e231c..24535eb1fd6 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -39,6 +39,7 @@ struct DispList; struct ListBase; struct BMEditMesh; struct BMesh; +struct Main; struct Mesh; struct MPoly; struct MLoop; @@ -146,7 +147,8 @@ void BKE_mesh_flush_select_from_verts(struct Mesh *me); void BKE_mesh_unlink(struct Mesh *me); void BKE_mesh_free(struct Mesh *me, int unlink); -struct Mesh *BKE_mesh_add(const char *name); +struct Mesh *BKE_mesh_add(struct Main *bmain, const char *name); +struct Mesh *BKE_mesh_copy_ex(struct Main *bmain, struct Mesh *me); struct Mesh *BKE_mesh_copy(struct Mesh *me); void mesh_update_customdata_pointers(struct Mesh *me, const short do_ensure_tess_cd); diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h index 25d2678ea47..5777a4094bc 100644 --- a/source/blender/blenkernel/BKE_movieclip.h +++ b/source/blender/blenkernel/BKE_movieclip.h @@ -43,7 +43,7 @@ struct MovieDistortion; void BKE_movieclip_free(struct MovieClip *clip); void BKE_movieclip_unlink(struct Main *bmain, struct MovieClip *clip); -struct MovieClip *BKE_movieclip_file_add(const char *name); +struct MovieClip *BKE_movieclip_file_add(struct Main *bmain, const char *name); void BKE_movieclip_reload(struct MovieClip *clip); struct ImBuf *BKE_movieclip_get_ibuf(struct MovieClip *clip, struct MovieClipUser *user); diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 718fa2f9ecd..5024b3636c5 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -299,7 +299,7 @@ struct bNodeTreeType *ntreeGetType(int type); struct bNodeType *ntreeGetNodeType(struct bNodeTree *ntree); struct bNodeSocketType *ntreeGetSocketType(int type); -struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype); +struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, int type, int nodetype); void ntreeInitTypes(struct bNodeTree *ntree); /* copy/free funcs, need to manage ID users */ diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index bfae1bd2390..54189e26c92 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -49,6 +49,7 @@ struct bAction; struct RenderData; struct rctf; struct MovieClip; +struct Main; void BKE_object_workob_clear(struct Object *workob); void BKE_object_workob_calc_parent(struct Scene *scene, struct Object *ob, struct Object *workob); @@ -78,12 +79,12 @@ void BKE_object_unlink(struct Object *ob); int BKE_object_exists_check(struct Object *obtest); int BKE_object_is_in_editmode(struct Object *ob); -struct Object *BKE_object_add_only_object(int type, const char *name); +struct Object *BKE_object_add_only_object(struct Main *bmain, int type, const char *name); struct Object *BKE_object_add(struct Scene *scene, int type); void *BKE_object_obdata_add_from_type(int type); +struct Object *BKE_object_copy_ex(struct Main *bmain, struct Object *ob, int copy_caches); struct Object *BKE_object_copy(struct Object *ob); -struct Object *BKE_object_copy_with_caches(struct Object *ob); void BKE_object_make_local(struct Object *ob); int BKE_object_is_libdata(struct Object *ob); int BKE_object_obdata_is_libdata(struct Object *ob); diff --git a/source/blender/blenkernel/BKE_speaker.h b/source/blender/blenkernel/BKE_speaker.h index 52c177fce57..e2f0fa50a86 100644 --- a/source/blender/blenkernel/BKE_speaker.h +++ b/source/blender/blenkernel/BKE_speaker.h @@ -33,7 +33,9 @@ * \brief General operations for speakers. */ -void *BKE_speaker_add(const char *name); +struct Main; + +void *BKE_speaker_add(struct Main *bmain, const char *name); struct Speaker *BKE_speaker_copy(struct Speaker *spk); void BKE_speaker_make_local(struct Speaker *spk); void BKE_speaker_free(struct Speaker *spk); diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h index be30eba0559..dc84bc67647 100644 --- a/source/blender/blenkernel/BKE_text.h +++ b/source/blender/blenkernel/BKE_text.h @@ -45,10 +45,10 @@ struct SpaceText; void BKE_text_free (struct Text *text); void txt_set_undostate (int u); int txt_get_undostate (void); -struct Text* BKE_text_add (const char *name); +struct Text* BKE_text_add (struct Main *bmain, const char *name); int txt_extended_ascii_as_utf8(char **str); int BKE_text_reload (struct Text *text); -struct Text* BKE_text_load (const char *file, const char *relpath); +struct Text* BKE_text_load (struct Main *bmain, const char *file, const char *relpath); struct Text* BKE_text_copy (struct Text *ta); void BKE_text_unlink (struct Main *bmain, struct Text *text); void BKE_text_clear (struct Text *text); diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h index 78fdd26c9e0..f1796373367 100644 --- a/source/blender/blenkernel/BKE_texture.h +++ b/source/blender/blenkernel/BKE_texture.h @@ -44,6 +44,7 @@ struct EnvMap; struct HaloRen; struct Lamp; struct LampRen; +struct Main; struct Material; struct MTex; struct OceanTex; @@ -69,7 +70,7 @@ int colorband_element_remove(struct ColorBand *coba, int index); void colorband_update_sort(struct ColorBand *coba); void default_tex(struct Tex *tex); -struct Tex *add_texture(const char *name); +struct Tex *add_texture(struct Main *bmain, const char *name); void tex_set_type(struct Tex *tex, int type); void default_mtex(struct MTex *mtex); struct MTex *add_mtex(void); diff --git a/source/blender/blenkernel/BKE_world.h b/source/blender/blenkernel/BKE_world.h index 7a23bff0184..6bb35e46539 100644 --- a/source/blender/blenkernel/BKE_world.h +++ b/source/blender/blenkernel/BKE_world.h @@ -33,11 +33,12 @@ * \author nzc */ +struct Main; struct World; void BKE_world_free(struct World *sc); void BKE_world_free_ex(struct World *sc, int do_id_user); -struct World *add_world(const char *name); +struct World *add_world(struct Main *bmian, const char *name); struct World *BKE_world_copy(struct World *wrld); struct World *localize_world(struct World *wrld); void BKE_world_make_local(struct World *wrld); diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 5ccf9146440..509442b1d4e 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -78,11 +78,11 @@ /* ***************** Library data level operations on action ************** */ -bAction *add_empty_action(const char name[]) +bAction *add_empty_action(Main *bmain, const char name[]) { bAction *act; - act = BKE_libblock_alloc(&G.main->action, ID_AC, name); + act = BKE_libblock_alloc(&bmain->action, ID_AC, name); return act; } diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index df2cc7cc461..74e44eab281 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -499,7 +499,7 @@ void BKE_animdata_separate_by_basepath(ID *srcID, ID *dstID, ListBase *basepaths if (srcAdt->action) { /* set up an action if necessary, and name it in a similar way so that it can be easily found again */ if (dstAdt->action == NULL) { - dstAdt->action = add_empty_action(srcAdt->action->id.name + 2); + dstAdt->action = add_empty_action(G.main, srcAdt->action->id.name + 2); } else if (dstAdt->action == srcAdt->action) { printf("Argh! Source and Destination share animation! ('%s' and '%s' both use '%s') Making new empty action\n", @@ -507,7 +507,7 @@ void BKE_animdata_separate_by_basepath(ID *srcID, ID *dstID, ListBase *basepaths /* TODO: review this... */ id_us_min(&dstAdt->action->id); - dstAdt->action = add_empty_action(dstAdt->action->id.name + 2); + dstAdt->action = add_empty_action(G.main, dstAdt->action->id.name + 2); } /* loop over base paths, trying to fix for each one... */ diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 3a705a07e22..b678ef6d93c 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -74,11 +74,11 @@ /* **************** Generic Functions, data level *************** */ -bArmature *BKE_armature_add(const char *name) +bArmature *BKE_armature_add(Main *bmain, const char *name) { bArmature *arm; - arm = BKE_libblock_alloc(&G.main->armature, ID_AR, name); + arm = BKE_libblock_alloc(&bmain->armature, ID_AR, name); arm->deformflag = ARM_DEF_VGROUP | ARM_DEF_ENVELOPE; arm->flag = ARM_COL_CUSTOM; /* custom bone-group colors */ arm->layer = 1; diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 70eaa00b82e..9a32a50ca00 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -109,11 +109,11 @@ static void brush_defaults(Brush *brush) /* Datablock add/copy/free/make_local */ -Brush *BKE_brush_add(const char *name) +Brush *BKE_brush_add(Main *bmain, const char *name) { Brush *brush; - brush = BKE_libblock_alloc(&G.main->brush, ID_BR, name); + brush = BKE_libblock_alloc(&bmain->brush, ID_BR, name); /* enable fake user by default */ brush->id.flag |= LIB_FAKEUSER; @@ -419,7 +419,7 @@ int BKE_brush_texture_set_nr(Brush *brush, int nr) idtest = (ID *)BLI_findlink(&G.main->tex, nr - 1); if (idtest == NULL) { /* new tex */ if (id) idtest = (ID *)BKE_texture_copy((Tex *)id); - else idtest = (ID *)add_texture("Tex"); + else idtest = (ID *)add_texture(G.main, "Tex"); idtest->us--; } if (idtest != id) { diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c index d1842b99831..34c2d144f4c 100644 --- a/source/blender/blenkernel/intern/camera.c +++ b/source/blender/blenkernel/intern/camera.c @@ -50,11 +50,11 @@ /****************************** Camera Datablock *****************************/ -void *BKE_camera_add(const char *name) +void *BKE_camera_add(Main *bmain, const char *name) { Camera *cam; - cam = BKE_libblock_alloc(&G.main->camera, ID_CA, name); + cam = BKE_libblock_alloc(&bmain->camera, ID_CA, name); cam->lens = 35.0f; cam->sensor_x = DEFAULT_SENSOR_WIDTH; diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index a6e68b9b2d5..5f7662f5004 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -167,11 +167,11 @@ void BKE_curve_free(Curve *cu) MEM_freeN(cu->tb); } -Curve *BKE_curve_add(const char *name, int type) +Curve *BKE_curve_add(Main *bmain, const char *name, int type) { Curve *cu; - cu = BKE_libblock_alloc(&G.main->curve, ID_CU, name); + cu = BKE_libblock_alloc(&bmain->curve, ID_CU, name); copy_v3_fl(cu->size, 1.0f); cu->flag = CU_FRONT | CU_BACK | CU_DEFORM_BOUNDS_OFF | CU_PATH_RADIUS; cu->pathlen = 100; diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c index 20d874e7243..639d256a067 100644 --- a/source/blender/blenkernel/intern/group.c +++ b/source/blender/blenkernel/intern/group.c @@ -127,11 +127,11 @@ void BKE_group_unlink(Group *group) group->id.us = 0; } -Group *add_group(const char *name) +Group *add_group(Main *bmain, const char *name) { Group *group; - group = BKE_libblock_alloc(&G.main->group, ID_GR, name); + group = BKE_libblock_alloc(&bmain->group, ID_GR, name); group->layer = (1 << 20) - 1; return group; } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 82b0d231869..39d76eb36f1 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -242,11 +242,11 @@ void BKE_image_free(Image *ima) } /* only image block itself */ -static Image *image_alloc(const char *name, short source, short type) +static Image *image_alloc(Main *bmain, const char *name, short source, short type) { Image *ima; - ima = BKE_libblock_alloc(&G.main->image, ID_IM, name); + ima = BKE_libblock_alloc(&bmain->image, ID_IM, name); if (ima) { ima->ok = IMA_OK; @@ -325,7 +325,7 @@ static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int frame) /* empty image block, of similar type and filename */ Image *BKE_image_copy(Image *ima) { - Image *nima = image_alloc(ima->id.name + 2, ima->source, ima->type); + Image *nima = image_alloc(G.main, ima->id.name + 2, ima->source, ima->type); BLI_strncpy(nima->name, ima->name, sizeof(ima->name)); @@ -568,7 +568,7 @@ static void image_init_color_management(Image *ima) } } -Image *BKE_image_load(const char *filepath) +Image *BKE_image_load(Main *bmain, const char *filepath) { Image *ima; int file, len; @@ -576,7 +576,7 @@ Image *BKE_image_load(const char *filepath) char str[FILE_MAX]; BLI_strncpy(str, filepath, sizeof(str)); - BLI_path_abs(str, G.main->name); + BLI_path_abs(str, bmain->name); /* exists? */ file = BLI_open(str, O_BINARY | O_RDONLY, 0); @@ -589,7 +589,7 @@ Image *BKE_image_load(const char *filepath) while (len > 0 && filepath[len - 1] != '/' && filepath[len - 1] != '\\') len--; libname = filepath + len; - ima = image_alloc(libname, IMA_SRC_FILE, IMA_TYPE_IMAGE); + ima = image_alloc(bmain, libname, IMA_SRC_FILE, IMA_TYPE_IMAGE); BLI_strncpy(ima->name, filepath, sizeof(ima->name)); if (BLI_testextensie_array(filepath, imb_ext_movie)) @@ -631,7 +631,7 @@ Image *BKE_image_load_exists(const char *filepath) } } - return BKE_image_load(filepath); + return BKE_image_load(G.main, filepath); } static ImBuf *add_ibuf_size(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short gen_type, @@ -691,10 +691,10 @@ static ImBuf *add_ibuf_size(unsigned int width, unsigned int height, const char } /* adds new image block, creates ImBuf and initializes color */ -Image *BKE_image_add_generated(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short gen_type, float color[4]) +Image *BKE_image_add_generated(Main *bmain, unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short gen_type, float color[4]) { /* on save, type is changed to FILE in editsima.c */ - Image *ima = image_alloc(name, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST); + Image *ima = image_alloc(bmain, name, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST); if (ima) { ImBuf *ibuf; @@ -720,7 +720,7 @@ Image *BKE_image_add_from_imbuf(ImBuf *ibuf) /* on save, type is changed to FILE in editsima.c */ Image *ima; - ima = image_alloc(BLI_path_basename(ibuf->name), IMA_SRC_FILE, IMA_TYPE_IMAGE); + ima = image_alloc(G.main, BLI_path_basename(ibuf->name), IMA_SRC_FILE, IMA_TYPE_IMAGE); if (ima) { BLI_strncpy(ima->name, ibuf->name, FILE_MAX); @@ -2104,7 +2104,7 @@ Image *BKE_image_verify_viewer(int type, const char *name) break; if (ima == NULL) - ima = image_alloc(name, IMA_SRC_VIEWER, type); + ima = image_alloc(G.main, name, IMA_SRC_VIEWER, type); /* happens on reload, imagewindow cannot be image user when hidden*/ if (ima->id.us == 0) diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 59dd02849dd..c5364744b2d 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -1548,7 +1548,7 @@ static void ipo_to_animdata(ID *id, Ipo *ipo, char actname[], char constname[], BLI_snprintf(nameBuf, sizeof(nameBuf), "CDA:%s", ipo->id.name + 2); - adt->action = add_empty_action(nameBuf); + adt->action = add_empty_action(G.main, nameBuf); if (G.debug & G_DEBUG) printf("\t\tadded new action - '%s'\n", nameBuf); } @@ -2093,7 +2093,7 @@ void do_versions_ipos_to_animato(Main *main) bAction *new_act; /* add a new action for this, and convert all data into that action */ - new_act = add_empty_action(id->name + 2); + new_act = add_empty_action(main, id->name + 2); ipo_to_animato(NULL, ipo, NULL, NULL, NULL, NULL, &new_act->curves, &drivers); new_act->idroot = ipo->blocktype; } diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c index 2f37db846f3..32cc5c6c22e 100644 --- a/source/blender/blenkernel/intern/lamp.c +++ b/source/blender/blenkernel/intern/lamp.c @@ -54,11 +54,11 @@ #include "BKE_main.h" #include "BKE_node.h" -Lamp *BKE_lamp_add(const char *name) +Lamp *BKE_lamp_add(Main *bmain, const char *name) { Lamp *la; - la = BKE_libblock_alloc(&G.main->lamp, ID_LA, name); + la = BKE_libblock_alloc(&bmain->lamp, ID_LA, name); la->r = la->g = la->b = la->k = 1.0f; la->haint = la->energy = 1.0f; diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 05d7933e1b5..fd57a88e279 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -180,11 +180,11 @@ void BKE_lattice_resize(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb) MEM_freeN(vertexCos); } -Lattice *BKE_lattice_add(const char *name) +Lattice *BKE_lattice_add(Main *bmain, const char *name) { Lattice *lt; - lt = BKE_libblock_alloc(&G.main->latt, ID_LT, name); + lt = BKE_libblock_alloc(&bmain->latt, ID_LT, name); lt->flag = LT_GRID; diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index 817068ae41e..cd40f752b03 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -742,13 +742,13 @@ void BKE_libblock_copy_data(ID *id, const ID *id_from, const short do_action) } /* used everywhere in blenkernel */ -void *BKE_libblock_copy(ID *id) +void *BKE_libblock_copy_ex(Main *bmain, ID *id) { ID *idn; ListBase *lb; size_t idn_len; - lb = which_libbase(G.main, GS(id->name)); + lb = which_libbase(bmain, GS(id->name)); idn = BKE_libblock_alloc(lb, GS(id->name), id->name + 2); assert(idn != NULL); @@ -769,6 +769,11 @@ void *BKE_libblock_copy(ID *id) return idn; } +void *BKE_libblock_copy(ID *id) +{ + return BKE_libblock_copy_ex(G.main, id); +} + static void BKE_library_free(Library *lib) { if (lib->packedfile) diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c index bda924060d5..960432d6b3d 100644 --- a/source/blender/blenkernel/intern/mask.c +++ b/source/blender/blenkernel/intern/mask.c @@ -698,18 +698,18 @@ void BKE_mask_point_select_set_handle(MaskSplinePoint *point, const short do_sel } /* only mask block itself */ -static Mask *mask_alloc(const char *name) +static Mask *mask_alloc(Main *bmain, const char *name) { Mask *mask; - mask = BKE_libblock_alloc(&G.main->mask, ID_MSK, name); + mask = BKE_libblock_alloc(&bmain->mask, ID_MSK, name); mask->id.flag |= LIB_FAKEUSER; return mask; } -Mask *BKE_mask_new(const char *name) +Mask *BKE_mask_new(Main *bmain, const char *name) { Mask *mask; char mask_name[MAX_ID_NAME - 2]; @@ -719,7 +719,7 @@ Mask *BKE_mask_new(const char *name) else strcpy(mask_name, "Mask"); - mask = mask_alloc(mask_name); + mask = mask_alloc(bmain, mask_name); /* arbitrary defaults */ mask->sfra = 1; diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index f19dc93198d..47117658b5e 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -206,11 +206,11 @@ void init_material(Material *ma) ma->preview = NULL; } -Material *BKE_material_add(const char *name) +Material *BKE_material_add(Main *bmain, const char *name) { Material *ma; - ma = BKE_libblock_alloc(&G.main->mat, ID_MA, name); + ma = BKE_libblock_alloc(&bmain->mat, ID_MA, name); init_material(ma); @@ -1778,7 +1778,7 @@ static short convert_tfacenomaterial(Main *main, Mesh *me, MTFace *tf, int flag) } /* create a new material */ else { - ma = BKE_material_add(idname + 2); + ma = BKE_material_add(main, idname + 2); if (ma) { printf("TexFace Convert: Material \"%s\" created.\n", idname + 2); diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index b3f71e58e9f..d939b9cc3c0 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -196,11 +196,11 @@ void BKE_mball_free(MetaBall *mb) if (mb->disp.first) BKE_displist_free(&mb->disp); } -MetaBall *BKE_mball_add(const char *name) +MetaBall *BKE_mball_add(Main *bmain, const char *name) { MetaBall *mb; - mb = BKE_libblock_alloc(&G.main->mball, ID_MB, name); + mb = BKE_libblock_alloc(&bmain->mball, ID_MB, name); mb->size[0] = mb->size[1] = mb->size[2] = 1.0; mb->texflag = MB_AUTOSPACE; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index dba2fd50706..20ccc33bc4e 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -445,11 +445,11 @@ static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata) mesh->totface = 0; } -Mesh *BKE_mesh_add(const char *name) +Mesh *BKE_mesh_add(Main *bmain, const char *name) { Mesh *me; - me = BKE_libblock_alloc(&G.main->mesh, ID_ME, name); + me = BKE_libblock_alloc(&bmain->mesh, ID_ME, name); me->size[0] = me->size[1] = me->size[2] = 1.0; me->smoothresh = 30; @@ -466,7 +466,7 @@ Mesh *BKE_mesh_add(const char *name) return me; } -Mesh *BKE_mesh_copy(Mesh *me) +Mesh *BKE_mesh_copy_ex(Main *bmain, Mesh *me) { Mesh *men; MTFace *tface; @@ -474,7 +474,7 @@ Mesh *BKE_mesh_copy(Mesh *me) int a, i; const int do_tessface = ((me->totface != 0) && (me->totpoly == 0)); /* only do tessface if we have no polys */ - men = BKE_libblock_copy(&me->id); + men = BKE_libblock_copy_ex(bmain, &me->id); men->mat = MEM_dupallocN(me->mat); for (a = 0; a < men->totcol; a++) { @@ -527,6 +527,11 @@ Mesh *BKE_mesh_copy(Mesh *me) return men; } +Mesh *BKE_mesh_copy(Mesh *me) +{ + return BKE_mesh_copy_ex(G.main, me); +} + BMesh *BKE_mesh_to_bmesh(Mesh *me, Object *ob) { BMesh *bm; @@ -1497,7 +1502,7 @@ void BKE_mesh_from_nurbs_displist(Object *ob, ListBase *dispbase, int use_orco_u } /* make mesh */ - me = BKE_mesh_add("Mesh"); + me = BKE_mesh_add(G.main, "Mesh"); me->totvert = totvert; me->totedge = totedge; me->totloop = totloop; @@ -1519,7 +1524,7 @@ void BKE_mesh_from_nurbs_displist(Object *ob, ListBase *dispbase, int use_orco_u BKE_mesh_calc_edges(me, TRUE); } else { - me = BKE_mesh_add("Mesh"); + me = BKE_mesh_add(G.main, "Mesh"); DM_to_mesh(dm, me, ob); } @@ -1635,7 +1640,7 @@ void BKE_mesh_from_curve(Scene *scene, Object *ob) BLI_edgehash_free(eh, NULL); if (edges.first) { - Curve *cu = BKE_curve_add(ob->id.name + 2, OB_CURVE); + Curve *cu = BKE_curve_add(G.main, ob->id.name + 2, OB_CURVE); cu->flag |= CU_3D; while (edges.first) { diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 69e368f0d08..943d9e9452a 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -479,11 +479,11 @@ static void put_imbuf_cache(MovieClip *clip, MovieClipUser *user, ImBuf *ibuf, i /*********************** common functions *************************/ /* only image block itself */ -static MovieClip *movieclip_alloc(const char *name) +static MovieClip *movieclip_alloc(Main *bmain, const char *name) { MovieClip *clip; - clip = BKE_libblock_alloc(&G.main->movieclip, ID_MC, name); + clip = BKE_libblock_alloc(&bmain->movieclip, ID_MC, name); clip->aspx = clip->aspy = 1.0f; @@ -542,7 +542,7 @@ static void detect_clip_source(MovieClip *clip) * otherwise creates new. * does not load ibuf itself * pass on optional frame for #name images */ -MovieClip *BKE_movieclip_file_add(const char *name) +MovieClip *BKE_movieclip_file_add(Main *bmain, const char *name) { MovieClip *clip; int file, len; @@ -550,7 +550,7 @@ MovieClip *BKE_movieclip_file_add(const char *name) char str[FILE_MAX], strtest[FILE_MAX]; BLI_strncpy(str, name, sizeof(str)); - BLI_path_abs(str, G.main->name); + BLI_path_abs(str, bmain->name); /* exists? */ file = BLI_open(str, O_BINARY | O_RDONLY, 0); @@ -559,7 +559,7 @@ MovieClip *BKE_movieclip_file_add(const char *name) close(file); /* ** first search an identical clip ** */ - for (clip = G.main->movieclip.first; clip; clip = clip->id.next) { + for (clip = bmain->movieclip.first; clip; clip = clip->id.next) { BLI_strncpy(strtest, clip->name, sizeof(clip->name)); BLI_path_abs(strtest, G.main->name); @@ -580,7 +580,7 @@ MovieClip *BKE_movieclip_file_add(const char *name) len--; libname = name + len; - clip = movieclip_alloc(libname); + clip = movieclip_alloc(bmain, libname); BLI_strncpy(clip->name, name, sizeof(clip->name)); detect_clip_source(clip); diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 2062cc01d02..97bee320ecb 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -656,7 +656,7 @@ void nodeDetachNode(struct bNode *node) } } -bNodeTree *ntreeAddTree(const char *name, int type, int nodetype) +bNodeTree *ntreeAddTree(Main *bmain, const char *name, int type, int nodetype) { bNodeTree *ntree; bNodeType *ntype; @@ -670,7 +670,7 @@ bNodeTree *ntreeAddTree(const char *name, int type, int nodetype) BLI_strncpy(ntree->id.name + 2, name, sizeof(ntree->id.name)); } else - ntree = BKE_libblock_alloc(&G.main->nodetree, ID_NT, name); + ntree = BKE_libblock_alloc(&bmain->nodetree, ID_NT, name); ntree->type = type; ntree->nodetype = nodetype; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index aac1d9f1f7b..2312d801e0d 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -829,16 +829,16 @@ int BKE_object_exists_check(Object *obtest) void *BKE_object_obdata_add_from_type(int type) { switch (type) { - case OB_MESH: return BKE_mesh_add("Mesh"); - case OB_CURVE: return BKE_curve_add("Curve", OB_CURVE); - case OB_SURF: return BKE_curve_add("Surf", OB_SURF); - case OB_FONT: return BKE_curve_add("Text", OB_FONT); - case OB_MBALL: return BKE_mball_add("Meta"); - case OB_CAMERA: return BKE_camera_add("Camera"); - case OB_LAMP: return BKE_lamp_add("Lamp"); - case OB_LATTICE: return BKE_lattice_add("Lattice"); - case OB_ARMATURE: return BKE_armature_add("Armature"); - case OB_SPEAKER: return BKE_speaker_add("Speaker"); + case OB_MESH: return BKE_mesh_add(G.main, "Mesh"); + case OB_CURVE: return BKE_curve_add(G.main, "Curve", OB_CURVE); + case OB_SURF: return BKE_curve_add(G.main, "Surf", OB_SURF); + case OB_FONT: return BKE_curve_add(G.main, "Text", OB_FONT); + case OB_MBALL: return BKE_mball_add(G.main, "Meta"); + case OB_CAMERA: return BKE_camera_add(G.main, "Camera"); + case OB_LAMP: return BKE_lamp_add(G.main, "Lamp"); + case OB_LATTICE: return BKE_lattice_add(G.main, "Lattice"); + case OB_ARMATURE: return BKE_armature_add(G.main, "Armature"); + case OB_SPEAKER: return BKE_speaker_add(G.main, "Speaker"); case OB_EMPTY: return NULL; default: printf("BKE_object_obdata_add_from_type: Internal error, bad type: %d\n", type); @@ -867,14 +867,14 @@ static const char *get_obdata_defname(int type) } /* more general add: creates minimum required data, but without vertices etc. */ -Object *BKE_object_add_only_object(int type, const char *name) +Object *BKE_object_add_only_object(Main *bmain, int type, const char *name) { Object *ob; if (!name) name = get_obdata_defname(type); - ob = BKE_libblock_alloc(&G.main->object, ID_OB, name); + ob = BKE_libblock_alloc(&bmain->object, ID_OB, name); /* default object vars */ ob->type = type; @@ -960,7 +960,7 @@ Object *BKE_object_add(struct Scene *scene, int type) char name[MAX_ID_NAME]; BLI_strncpy(name, get_obdata_defname(type), sizeof(name)); - ob = BKE_object_add_only_object(type, name); + ob = BKE_object_add_only_object(G.main, type, name); ob->data = BKE_object_obdata_add_from_type(type); @@ -1226,13 +1226,13 @@ void BKE_object_transform_copy(Object *ob_tar, const Object *ob_src) copy_v3_v3(ob_tar->size, ob_src->size); } -static Object *object_copy_do(Object *ob, int copy_caches) +Object *BKE_object_copy_ex(Main *bmain, Object *ob, int copy_caches) { Object *obn; ModifierData *md; int a; - obn = BKE_libblock_copy(&ob->id); + obn = BKE_libblock_copy_ex(bmain, &ob->id); if (ob->totcol) { obn->mat = MEM_dupallocN(ob->mat); @@ -1308,13 +1308,7 @@ static Object *object_copy_do(Object *ob, int copy_caches) /* copy objects, will re-initialize cached simulation data */ Object *BKE_object_copy(Object *ob) { - return object_copy_do(ob, FALSE); -} - -/* copy objects, will duplicate cached simulation data */ -Object *BKE_object_copy_with_caches(Object *ob) -{ - return object_copy_do(ob, TRUE); + return BKE_object_copy_ex(G.main, ob, FALSE); } static void extern_local_object(Object *ob) diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index dc8aed91c00..d34d5eaa250 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -43,6 +43,7 @@ #include "BKE_brush.h" #include "BKE_context.h" +#include "BKE_global.h" #include "BKE_library.h" #include "BKE_paint.h" #include "BKE_subsurf.h" @@ -179,7 +180,7 @@ void BKE_paint_init(Paint *p, const char col[3]) /* If there's no brush, create one */ brush = paint_brush(p); if (brush == NULL) - brush = BKE_brush_add("Brush"); + brush = BKE_brush_add(G.main, "Brush"); paint_brush_set(p, brush); memcpy(p->paint_cursor_col, col, 3); diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c index f6599cc9648..f3391803294 100644 --- a/source/blender/blenkernel/intern/speaker.c +++ b/source/blender/blenkernel/intern/speaker.c @@ -42,11 +42,11 @@ #include "BKE_main.h" #include "BKE_speaker.h" -void *BKE_speaker_add(const char *name) +void *BKE_speaker_add(Main *bmain, const char *name) { Speaker *spk; - spk = BKE_libblock_alloc(&G.main->speaker, ID_SPK, name); + spk = BKE_libblock_alloc(&bmain->speaker, ID_SPK, name); spk->attenuation = 1.0f; spk->cone_angle_inner = 360.0f; diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index a0f611a5a7b..3be9097ce82 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -171,9 +171,8 @@ void BKE_text_free(Text *text) #endif } -Text *BKE_text_add(const char *name) +Text *BKE_text_add(Main *bmain, const char *name) { - Main *bmain = G.main; Text *ta; TextLine *tmp; @@ -363,9 +362,8 @@ int BKE_text_reload(Text *text) return 1; } -Text *BKE_text_load(const char *file, const char *relpath) +Text *BKE_text_load(Main *bmain, const char *file, const char *relpath) { - Main *bmain = G.main; FILE *fp; int i, llen, len; unsigned char *buffer; diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 2e909f11eaa..55a0f3752a1 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -540,9 +540,8 @@ void tex_set_type(Tex *tex, int type) /* ------------------------------------------------------------------------- */ -Tex *add_texture(const char *name) +Tex *add_texture(Main *bmain, const char *name) { - Main *bmain = G.main; Tex *tex; tex = BKE_libblock_alloc(&bmain->tex, ID_TE, name); diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c index ad101c41dc5..206f829eaa8 100644 --- a/source/blender/blenkernel/intern/world.c +++ b/source/blender/blenkernel/intern/world.c @@ -79,9 +79,8 @@ void BKE_world_free(World *wrld) BKE_world_free_ex(wrld, TRUE); } -World *add_world(const char *name) +World *add_world(Main *bmain, const char *name) { - Main *bmain = G.main; World *wrld; wrld = BKE_libblock_alloc(&bmain->world, ID_WO, name); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 077a716b17a..8a695ab4edb 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -10027,7 +10027,7 @@ static void give_base_to_groups(Main *mainvar, Scene *scene) Base *base; /* BKE_object_add(...) messes with the selection */ - Object *ob = BKE_object_add_only_object(OB_EMPTY, group->id.name+2); + Object *ob = BKE_object_add_only_object(mainvar, OB_EMPTY, group->id.name+2); ob->type = OB_EMPTY; ob->lay = scene->lay; diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 64832a1311f..c99f939300e 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -143,7 +143,7 @@ bAction *verify_adt_action(ID *id, short add) if ((adt->action == NULL) && (add)) { char actname[sizeof(id->name) - 2]; BLI_snprintf(actname, sizeof(actname), "%sAction", id->name + 2); - adt->action = add_empty_action(actname); + adt->action = add_empty_action(G.main, actname); } /* return the action */ diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c index 04815b9c33c..b2c1b7fdcd0 100644 --- a/source/blender/editors/armature/poselib.c +++ b/source/blender/editors/armature/poselib.c @@ -54,6 +54,7 @@ #include "BKE_action.h" #include "BKE_armature.h" #include "BKE_depsgraph.h" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_library.h" #include "BKE_object.h" @@ -196,7 +197,7 @@ static bAction *poselib_init_new(Object *ob) /* init object's poselib action (unlink old one if there) */ if (ob->poselib) id_us_min(&ob->poselib->id); - ob->poselib = add_empty_action("PoseLib"); + ob->poselib = add_empty_action(G.main, "PoseLib"); return ob->poselib; } diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index e57e52d74b6..e03a171da18 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -661,11 +661,12 @@ static int reports_to_text_poll(bContext *C) static int reports_to_text_exec(bContext *C, wmOperator *UNUSED(op)) { ReportList *reports = CTX_wm_reports(C); + Main *bmain = CTX_data_main(C); Text *txt; char *str; /* create new text-block to write to */ - txt = BKE_text_add("Recent Reports"); + txt = BKE_text_add(bmain, "Recent Reports"); /* convert entire list to a display string, and add this to the text-block * - if commandline debug option enabled, show debug reports too @@ -803,7 +804,7 @@ static int editsource_text_edit(bContext *C, wmOperator *op, } if (text == NULL) { - text = BKE_text_load(filepath, bmain->name); + text = BKE_text_load(bmain, filepath, bmain->name); } if (text == NULL) { diff --git a/source/blender/editors/mask/mask_ops.c b/source/blender/editors/mask/mask_ops.c index 35f85f3faee..0a996c11f14 100644 --- a/source/blender/editors/mask/mask_ops.c +++ b/source/blender/editors/mask/mask_ops.c @@ -36,6 +36,7 @@ #include "BKE_context.h" #include "BKE_depsgraph.h" +#include "BKE_main.h" #include "BKE_mask.h" #include "DNA_scene_types.h" @@ -261,9 +262,10 @@ int ED_mask_feather_find_nearest(const bContext *C, Mask *mask, float normal_co[ Mask *ED_mask_new(bContext *C, const char *name) { ScrArea *sa = CTX_wm_area(C); + Main *bmain = CTX_data_main(C); Mask *mask; - mask = BKE_mask_new(name); + mask = BKE_mask_new(bmain, name); if (sa && sa->spacedata.first) { switch (sa->spacetype) { diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 8457b278c6c..3b2ddfe15ee 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -1558,7 +1558,7 @@ static int convert_exec(bContext *C, wmOperator *op) mb = newob->data; mb->id.us--; - newob->data = BKE_mesh_add("Mesh"); + newob->data = BKE_mesh_add(bmain, "Mesh"); newob->type = OB_MESH; me = newob->data; diff --git a/source/blender/editors/object/object_group.c b/source/blender/editors/object/object_group.c index 7bf1a5db3b1..9b683a1ba98 100644 --- a/source/blender/editors/object/object_group.c +++ b/source/blender/editors/object/object_group.c @@ -311,7 +311,7 @@ static int group_create_exec(bContext *C, wmOperator *op) RNA_string_get(op->ptr, "name", name); - group = add_group(name); + group = add_group(bmain, name); CTX_DATA_BEGIN (C, Base *, base, selected_bases) { @@ -348,12 +348,13 @@ static int group_add_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene = CTX_data_scene(C); Object *ob = ED_object_context(C); + Main *bmain = CTX_data_main(C); Group *group; if (ob == NULL) return OPERATOR_CANCELLED; - group = add_group("Group"); + group = add_group(bmain, "Group"); add_to_group(group, ob, scene, NULL); WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); diff --git a/source/blender/editors/physics/rigidbody_constraint.c b/source/blender/editors/physics/rigidbody_constraint.c index fac835a414a..b2f53379090 100644 --- a/source/blender/editors/physics/rigidbody_constraint.c +++ b/source/blender/editors/physics/rigidbody_constraint.c @@ -45,6 +45,7 @@ #include "BKE_context.h" #include "BKE_depsgraph.h" +#include "BKE_global.h" #include "BKE_group.h" #include "BKE_object.h" #include "BKE_report.h" @@ -87,7 +88,7 @@ void ED_rigidbody_con_add(wmOperator *op, Scene *scene, Object *ob, int type) } /* create constraint group if it doesn't already exits */ if (rbw->constraints == NULL) { - rbw->constraints = add_group("RigidBodyConstraints"); + rbw->constraints = add_group(G.main, "RigidBodyConstraints"); } /* make rigidbody constraint settings */ ob->rigidbody_constraint = BKE_rigidbody_create_constraint(scene, ob, type); diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c index 38ed903a161..fa258c98567 100644 --- a/source/blender/editors/physics/rigidbody_object.c +++ b/source/blender/editors/physics/rigidbody_object.c @@ -46,6 +46,7 @@ #include "BKE_context.h" #include "BKE_depsgraph.h" +#include "BKE_global.h" #include "BKE_group.h" #include "BKE_object.h" #include "BKE_report.h" @@ -113,7 +114,7 @@ void ED_rigidbody_ob_add(wmOperator *op, Scene *scene, Object *ob, int type) scene->rigidbody_world = rbw; } if (rbw->group == NULL) { - rbw->group = add_group("RigidBodyWorld"); + rbw->group = add_group(G.main, "RigidBodyWorld"); } /* make rigidbody object settings */ diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index 53e1f49d544..e00db9b5850 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -367,6 +367,7 @@ static int new_material_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene = CTX_data_scene(C); Material *ma = CTX_data_pointer_get_type(C, "material", &RNA_Material).data; + Main *bmain = CTX_data_main(C); PointerRNA ptr, idptr; PropertyRNA *prop; @@ -375,7 +376,7 @@ static int new_material_exec(bContext *C, wmOperator *UNUSED(op)) ma = BKE_material_copy(ma); } else { - ma = BKE_material_add("Material"); + ma = BKE_material_add(bmain, "Material"); if (BKE_scene_use_new_shading_nodes(scene)) { ED_node_shader_default(scene, &ma->id); @@ -420,6 +421,7 @@ void MATERIAL_OT_new(wmOperatorType *ot) static int new_texture_exec(bContext *C, wmOperator *UNUSED(op)) { Tex *tex = CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; + Main *bmain = CTX_data_main(C); PointerRNA ptr, idptr; PropertyRNA *prop; @@ -427,7 +429,7 @@ static int new_texture_exec(bContext *C, wmOperator *UNUSED(op)) if (tex) tex = BKE_texture_copy(tex); else - tex = add_texture("Texture"); + tex = add_texture(bmain, "Texture"); /* hook into UI */ uiIDContextProperty(C, &ptr, &prop); @@ -467,6 +469,7 @@ static int new_world_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene = CTX_data_scene(C); World *wo = CTX_data_pointer_get_type(C, "world", &RNA_World).data; + Main *bmain = CTX_data_main(C); PointerRNA ptr, idptr; PropertyRNA *prop; @@ -475,7 +478,7 @@ static int new_world_exec(bContext *C, wmOperator *UNUSED(op)) wo = BKE_world_copy(wo); } else { - wo = add_world("World"); + wo = add_world(bmain, "World"); if (BKE_scene_use_new_shading_nodes(scene)) { ED_node_shader_default(scene, &wo->id); diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index 618d545b084..408572c7979 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -62,11 +62,12 @@ static int brush_add_exec(bContext *C, wmOperator *UNUSED(op)) /*int type = RNA_enum_get(op->ptr, "type");*/ Paint *paint = paint_get_active_from_context(C); struct Brush *br = paint_brush(paint); + Main *bmain = CTX_data_main(C); if (br) br = BKE_brush_copy(br); else - br = BKE_brush_add("Brush"); + br = BKE_brush_add(bmain, "Brush"); paint_brush_set(paint, br); @@ -272,7 +273,7 @@ static int brush_generic_tool_set(Main *bmain, Paint *paint, const int tool, brush = brush_tool_cycle(bmain, brush_orig, tool, tool_offset, ob_mode); if (!brush && brush_tool(brush_orig, tool_offset) != tool && create_missing) { - brush = BKE_brush_add(tool_name); + brush = BKE_brush_add(bmain, tool_name); brush_tool_set(brush, tool_offset, tool); brush->ob_mode = ob_mode; brush->toggle_brush = brush_orig; diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index a80d425b90a..7e99e6c065d 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -53,6 +53,7 @@ #include "BKE_action.h" #include "BKE_fcurve.h" #include "BKE_global.h" +#include "BKE_main.h" #include "BKE_nla.h" #include "BKE_context.h" #include "BKE_report.h" @@ -104,8 +105,10 @@ static int act_new_exec(bContext *C, wmOperator *UNUSED(op)) action = BKE_action_copy(oldact); } else { + Main *bmain = CTX_data_main(C); + /* just make a new (empty) action */ - action = add_empty_action("Action"); + action = add_empty_action(bmain, "Action"); } /* when creating new ID blocks, use is already 1 (fake user), diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index cf4e76a8427..dfb69be6f18 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -160,6 +160,7 @@ static int open_exec(bContext *C, wmOperator *op) { SpaceClip *sc = CTX_wm_space_clip(C); bScreen *screen = CTX_wm_screen(C); + Main *bmain = CTX_data_main(C); PropertyPointerRNA *pprop; PointerRNA idptr; MovieClip *clip = NULL; @@ -191,7 +192,7 @@ static int open_exec(bContext *C, wmOperator *op) errno = 0; - clip = BKE_movieclip_file_add(str); + clip = BKE_movieclip_file_add(bmain, str); if (!clip) { if (op->customdata) diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 8bb51edde02..2d2d29d9eaa 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1716,6 +1716,7 @@ static int image_new_exec(bContext *C, wmOperator *op) Scene *scene; Object *obedit; Image *ima; + Main *bmain; PointerRNA ptr, idptr; PropertyRNA *prop; char name[MAX_ID_NAME - 2]; @@ -1726,6 +1727,7 @@ static int image_new_exec(bContext *C, wmOperator *op) sima = CTX_wm_space_image(C); scene = CTX_data_scene(C); obedit = CTX_data_edit_object(C); + bmain = CTX_data_main(C); RNA_string_get(op->ptr, "name", name); width = RNA_int_get(op->ptr, "width"); @@ -1738,7 +1740,7 @@ static int image_new_exec(bContext *C, wmOperator *op) if (!alpha) color[3] = 1.0f; - ima = BKE_image_add_generated(width, height, name, alpha ? 32 : 24, floatbuf, gen_type, color); + ima = BKE_image_add_generated(bmain, width, height, name, alpha ? 32 : 24, floatbuf, gen_type, color); if (!ima) return OPERATOR_CANCELLED; diff --git a/source/blender/editors/space_node/node_add.c b/source/blender/editors/space_node/node_add.c index b47be150417..22631568d03 100644 --- a/source/blender/editors/space_node/node_add.c +++ b/source/blender/editors/space_node/node_add.c @@ -441,6 +441,7 @@ static int new_node_tree_exec(bContext *C, wmOperator *op) { SpaceNode *snode; bNodeTree *ntree; + Main *bmain; PointerRNA ptr, idptr; PropertyRNA *prop; int treetype; @@ -448,6 +449,7 @@ static int new_node_tree_exec(bContext *C, wmOperator *op) /* retrieve state */ snode = CTX_wm_space_node(C); + bmain = CTX_data_main(C); if (RNA_struct_property_is_set(op->ptr, "type")) treetype = RNA_enum_get(op->ptr, "type"); @@ -457,7 +459,7 @@ static int new_node_tree_exec(bContext *C, wmOperator *op) if (RNA_struct_property_is_set(op->ptr, "name")) RNA_string_get(op->ptr, "name", treename); - ntree = ntreeAddTree(treename, treetype, 0); + ntree = ntreeAddTree(bmain, treename, treetype, 0); if (!ntree) return OPERATOR_CANCELLED; diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 321eaa32e80..fb4e4f62e52 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -328,7 +328,7 @@ void ED_node_shader_default(Scene *scene, ID *id) int output_type, shader_type; float color[3], strength = 1.0f; - ntree = ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0); + ntree = ntreeAddTree(G.main, "Shader Nodetree", NTREE_SHADER, 0); switch (GS(id->name)) { case ID_MA: @@ -424,7 +424,7 @@ void ED_node_composit_default(Scene *sce) return; } - sce->nodetree = ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, 0); + sce->nodetree = ntreeAddTree(G.main, "Compositing Nodetree", NTREE_COMPOSIT, 0); sce->nodetree->chunksize = 256; sce->nodetree->edit_quality = NTREE_QUALITY_HIGH; @@ -468,7 +468,7 @@ void ED_node_texture_default(Tex *tx) return; } - tx->nodetree = ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, 0); + tx->nodetree = ntreeAddTree(G.main, "Texture Nodetree", NTREE_TEXTURE, 0); ntemp.type = TEX_NODE_OUTPUT; out = nodeAddNode(tx->nodetree, &ntemp); diff --git a/source/blender/editors/space_node/node_group.c b/source/blender/editors/space_node/node_group.c index 4dd9c89375d..7572ca04a33 100644 --- a/source/blender/editors/space_node/node_group.c +++ b/source/blender/editors/space_node/node_group.c @@ -1039,7 +1039,7 @@ static bNode *node_group_make_from_selected(bNodeTree *ntree) node_get_selected_minmax(ntree, NULL, min, max); /* new nodetree */ - ngroup = ntreeAddTree("NodeGroup", ntree->type, NODE_GROUP); + ngroup = ntreeAddTree(G.main, "NodeGroup", ntree->type, NODE_GROUP); /* make group node */ ntemp.type = NODE_GROUP; diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c index e82917feb21..e92d93485a1 100644 --- a/source/blender/editors/space_node/node_header.c +++ b/source/blender/editors/space_node/node_header.c @@ -136,7 +136,7 @@ static void do_node_add_group(bContext *C, void *UNUSED(arg), int event) ntemp.type = -event; switch (ntemp.type) { case NODE_GROUP: - ntemp.ngroup = ntreeAddTree("Group", snode->treetype, ntemp.type); + ntemp.ngroup = ntreeAddTree(bmain, "Group", snode->treetype, ntemp.type); break; default: ntemp.ngroup = NULL; diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 21966ef614c..1f209f90007 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -161,11 +161,12 @@ void text_update_edited(Text *text) static int text_new_exec(bContext *C, wmOperator *UNUSED(op)) { SpaceText *st = CTX_wm_space_text(C); + Main *bmain = CTX_data_main(C); Text *text; PointerRNA ptr, idptr; PropertyRNA *prop; - text = BKE_text_add("Text"); + text = BKE_text_add(bmain, "Text"); /* hook into UI */ uiIDContextProperty(C, &ptr, &prop); @@ -226,6 +227,7 @@ static int text_open_cancel(bContext *UNUSED(C), wmOperator *op) static int text_open_exec(bContext *C, wmOperator *op) { SpaceText *st = CTX_wm_space_text(C); + Main *bmain = CTX_data_main(C); Text *text; PropertyPointerRNA *pprop; PointerRNA idptr; @@ -234,7 +236,7 @@ static int text_open_exec(bContext *C, wmOperator *op) RNA_string_get(op->ptr, "filepath", str); - text = BKE_text_load(str, G.main->name); + text = BKE_text_load(bmain, str, G.main->name); if (!text) { if (op->customdata) MEM_freeN(op->customdata); diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 76947d856f8..d908e84430b 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -398,6 +398,8 @@ PointerRNA rna_pointer_inherit_refine(struct PointerRNA *ptr, struct StructRNA * int rna_parameter_size(struct PropertyRNA *parm); int rna_parameter_size_alloc(struct PropertyRNA *parm); +struct Mesh *rna_Main_meshes_new_from_object(struct Main *bmain, struct ReportList *reports, struct Scene *sce, struct Object *ob, int apply_modifiers, int settings); + /* XXX, these should not need to be defined here~! */ struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct bContext *C, struct ReportList *reports); struct MTex *rna_mtex_texture_slots_create(struct ID *self, struct bContext *C, struct ReportList *reports, int index); diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c index e9ed3aa8682..ab94b88e3d7 100644 --- a/source/blender/makesrna/intern/rna_main_api.c +++ b/source/blender/makesrna/intern/rna_main_api.c @@ -34,6 +34,7 @@ #include #include "DNA_ID.h" +#include "DNA_modifier_types.h" #include "BLI_path_util.h" @@ -48,6 +49,8 @@ #include "BKE_main.h" #include "BKE_camera.h" #include "BKE_curve.h" +#include "BKE_DerivedMesh.h" +#include "BKE_displist.h" #include "BKE_mesh.h" #include "BKE_armature.h" #include "BKE_lamp.h" @@ -99,17 +102,17 @@ #include "BLF_translation.h" -static Camera *rna_Main_cameras_new(Main *UNUSED(bmain), const char *name) +static Camera *rna_Main_cameras_new(Main *bmain, const char *name) { - ID *id = BKE_camera_add(name); + ID *id = BKE_camera_add(bmain, name); id_us_min(id); return (Camera *)id; } -static void rna_Main_cameras_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *camera_ptr) +static void rna_Main_cameras_remove(Main *bmain, ReportList *reports, PointerRNA *camera_ptr) { Camera *camera = camera_ptr->data; if (ID_REAL_USERS(camera) <= 0) { - BKE_libblock_free(&G.main->camera, camera); + BKE_libblock_free(&bmain->camera, camera); RNA_POINTER_INVALIDATE(camera_ptr); } else { @@ -144,7 +147,7 @@ static void rna_Main_scenes_remove(Main *bmain, bContext *C, ReportList *reports } } -static Object *rna_Main_objects_new(Main *UNUSED(bmain), ReportList *reports, const char *name, ID *data) +static Object *rna_Main_objects_new(Main *bmain, ReportList *reports, const char *name, ID *data) { Object *ob; int type = OB_EMPTY; @@ -189,7 +192,7 @@ static Object *rna_Main_objects_new(Main *UNUSED(bmain), ReportList *reports, co id_us_plus(data); } - ob = BKE_object_add_only_object(type, name); + ob = BKE_object_add_only_object(bmain, type, name); id_us_min(&ob->id); ob->data = data; @@ -198,12 +201,12 @@ static Object *rna_Main_objects_new(Main *UNUSED(bmain), ReportList *reports, co return ob; } -static void rna_Main_objects_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *object_ptr) +static void rna_Main_objects_remove(Main *bmain, ReportList *reports, PointerRNA *object_ptr) { Object *object = object_ptr->data; if (ID_REAL_USERS(object) <= 0) { BKE_object_unlink(object); /* needed or ID pointers to this are not cleared */ - BKE_libblock_free(&G.main->object, object); + BKE_libblock_free(&bmain->object, object); RNA_POINTER_INVALIDATE(object_ptr); } else { @@ -212,17 +215,17 @@ static void rna_Main_objects_remove(Main *UNUSED(bmain), ReportList *reports, Po } } -static Material *rna_Main_materials_new(Main *UNUSED(bmain), const char *name) +static Material *rna_Main_materials_new(Main *bmain, const char *name) { - ID *id = (ID *)BKE_material_add(name); + ID *id = (ID *)BKE_material_add(bmain, name); id_us_min(id); return (Material *)id; } -static void rna_Main_materials_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *material_ptr) +static void rna_Main_materials_remove(Main *bmain, ReportList *reports, PointerRNA *material_ptr) { Material *material = material_ptr->data; if (ID_REAL_USERS(material) <= 0) { - BKE_libblock_free(&G.main->mat, material); + BKE_libblock_free(&bmain->mat, material); RNA_POINTER_INVALIDATE(material_ptr); } else { @@ -231,18 +234,18 @@ static void rna_Main_materials_remove(Main *UNUSED(bmain), ReportList *reports, } } -static bNodeTree *rna_Main_nodetree_new(Main *UNUSED(bmain), const char *name, int type) +static bNodeTree *rna_Main_nodetree_new(Main *bmain, const char *name, int type) { - bNodeTree *tree = ntreeAddTree(name, type, NODE_GROUP); + bNodeTree *tree = ntreeAddTree(bmain, name, type, NODE_GROUP); id_us_min(&tree->id); return tree; } -static void rna_Main_nodetree_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *tree_ptr) +static void rna_Main_nodetree_remove(Main *bmain, ReportList *reports, PointerRNA *tree_ptr) { bNodeTree *tree = tree_ptr->data; if (ID_REAL_USERS(tree) <= 0) { - BKE_libblock_free(&G.main->nodetree, tree); + BKE_libblock_free(&bmain->nodetree, tree); RNA_POINTER_INVALIDATE(tree_ptr); } else { @@ -251,18 +254,212 @@ static void rna_Main_nodetree_remove(Main *UNUSED(bmain), ReportList *reports, P } } -static Mesh *rna_Main_meshes_new(Main *UNUSED(bmain), const char *name) +static Mesh *rna_Main_meshes_new(Main *bmain, const char *name) { - Mesh *me = BKE_mesh_add(name); + Mesh *me = BKE_mesh_add(bmain, name); id_us_min(&me->id); return me; } -static void rna_Main_meshes_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *mesh_ptr) + +/* copied from Mesh_getFromObject and adapted to RNA interface */ +/* settings: 1 - preview, 2 - render */ +Mesh *rna_Main_meshes_new_from_object(Main *bmain, ReportList *reports, Scene *sce, Object *ob, int apply_modifiers, int settings) { - Mesh *mesh = mesh_ptr->data; + Mesh *tmpmesh; + Curve *tmpcu = NULL, *copycu; + Object *tmpobj = NULL; + int render = settings == eModifierMode_Render, i; + int cage = !apply_modifiers; + + /* perform the mesh extraction based on type */ + switch (ob->type) { + case OB_FONT: + case OB_CURVE: + case OB_SURF: + { + ListBase dispbase = {NULL, NULL}; + DerivedMesh *derivedFinal = NULL; + int uv_from_orco; + + /* copies object and modifiers (but not the data) */ + tmpobj = BKE_object_copy_ex(bmain, ob, TRUE); + tmpcu = (Curve *)tmpobj->data; + tmpcu->id.us--; + + /* if getting the original caged mesh, delete object modifiers */ + if (cage) + BKE_object_free_modifiers(tmpobj); + + /* copies the data */ + copycu = tmpobj->data = BKE_curve_copy((Curve *) ob->data); + + /* temporarily set edit so we get updates from edit mode, but + * also because for text datablocks copying it while in edit + * mode gives invalid data structures */ + copycu->editfont = tmpcu->editfont; + copycu->editnurb = tmpcu->editnurb; + /* get updated display list, and convert to a mesh */ + BKE_displist_make_curveTypes_forRender(sce, tmpobj, &dispbase, &derivedFinal, FALSE); + + copycu->editfont = NULL; + copycu->editnurb = NULL; + + tmpobj->derivedFinal = derivedFinal; + + /* convert object type to mesh */ + uv_from_orco = (tmpcu->flag & CU_UV_ORCO) != 0; + BKE_mesh_from_nurbs_displist(tmpobj, &dispbase, uv_from_orco); + + tmpmesh = tmpobj->data; + + BKE_displist_free(&dispbase); + + /* BKE_mesh_from_nurbs changes the type to a mesh, check it worked */ + if (tmpobj->type != OB_MESH) { + BKE_libblock_free_us(&(G.main->object), tmpobj); + BKE_report(reports, RPT_ERROR, "Cannot convert curve to mesh (does the curve have any segments?)"); + return NULL; + } + + BKE_libblock_free_us(&bmain->object, tmpobj); + break; + } + + case OB_MBALL: + { + /* metaballs don't have modifiers, so just convert to mesh */ + Object *basis_ob = BKE_mball_basis_find(sce, ob); + /* todo, re-generatre for render-res */ + /* metaball_polygonize(scene, ob) */ + + if (ob != basis_ob) + return NULL; /* only do basis metaball */ + + tmpmesh = BKE_mesh_add(bmain, "Mesh"); + /* BKE_mesh_add gives us a user count we don't need */ + tmpmesh->id.us--; + + if (render) { + ListBase disp = {NULL, NULL}; + BKE_displist_make_mball_forRender(sce, ob, &disp); + BKE_mesh_from_metaball(&disp, tmpmesh); + BKE_displist_free(&disp); + } + else + BKE_mesh_from_metaball(&ob->disp, tmpmesh); + + break; + + } + case OB_MESH: + /* copies object and modifiers (but not the data) */ + if (cage) { + /* copies the data */ + tmpmesh = BKE_mesh_copy_ex(bmain, ob->data); + /* if not getting the original caged mesh, get final derived mesh */ + } + else { + /* Make a dummy mesh, saves copying */ + DerivedMesh *dm; + /* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */ + CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter, + * for example, needs CD_MASK_MDEFORMVERT */ + + /* Write the display mesh into the dummy mesh */ + if (render) + dm = mesh_create_derived_render(sce, ob, mask); + else + dm = mesh_create_derived_view(sce, ob, mask); + + tmpmesh = BKE_mesh_add(bmain, "Mesh"); + DM_to_mesh(dm, tmpmesh, ob); + dm->release(dm); + } + + /* BKE_mesh_add/copy gives us a user count we don't need */ + tmpmesh->id.us--; + + break; + default: + BKE_report(reports, RPT_ERROR, "Object does not have geometry data"); + return NULL; + } + + /* Copy materials to new mesh */ + switch (ob->type) { + case OB_SURF: + case OB_FONT: + case OB_CURVE: + tmpmesh->totcol = tmpcu->totcol; + + /* free old material list (if it exists) and adjust user counts */ + if (tmpcu->mat) { + for (i = tmpcu->totcol; i-- > 0; ) { + /* are we an object material or data based? */ + + tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpcu->mat[i]; + + if (tmpmesh->mat[i]) { + tmpmesh->mat[i]->id.us++; + } + } + } + break; + +#if 0 + /* Crashes when assigning the new material, not sure why */ + case OB_MBALL: + tmpmb = (MetaBall *)ob->data; + tmpmesh->totcol = tmpmb->totcol; + + /* free old material list (if it exists) and adjust user counts */ + if (tmpmb->mat) { + for (i = tmpmb->totcol; i-- > 0; ) { + tmpmesh->mat[i] = tmpmb->mat[i]; /* CRASH HERE ??? */ + if (tmpmesh->mat[i]) { + tmpmb->mat[i]->id.us++; + } + } + } + break; +#endif + + case OB_MESH: + if (!cage) { + Mesh *origmesh = ob->data; + tmpmesh->flag = origmesh->flag; + tmpmesh->mat = MEM_dupallocN(origmesh->mat); + tmpmesh->totcol = origmesh->totcol; + tmpmesh->smoothresh = origmesh->smoothresh; + if (origmesh->mat) { + for (i = origmesh->totcol; i-- > 0; ) { + /* are we an object material or data based? */ + tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : origmesh->mat[i]; + + if (tmpmesh->mat[i]) { + tmpmesh->mat[i]->id.us++; + } + } + } + } + break; + } /* end copy materials */ + + /* cycles and exporters rely on this still */ + BKE_mesh_tessface_ensure(tmpmesh); + + /* make sure materials get updated in objects */ + test_object_materials(&tmpmesh->id); + + return tmpmesh; +} + +static void rna_Main_meshes_remove(Main *bmain, ReportList *reports, PointerRNA *mesh_ptr) +{ + Mesh *mesh = mesh_ptr->data; if (ID_REAL_USERS(mesh) <= 0) { - BKE_libblock_free(&G.main->mesh, mesh); + BKE_libblock_free(&bmain->mesh, mesh); RNA_POINTER_INVALIDATE(mesh_ptr); } else { @@ -271,18 +468,18 @@ static void rna_Main_meshes_remove(Main *UNUSED(bmain), ReportList *reports, Poi } } -static Lamp *rna_Main_lamps_new(Main *UNUSED(bmain), const char *name, int type) +static Lamp *rna_Main_lamps_new(Main *bmain, const char *name, int type) { - Lamp *lamp = BKE_lamp_add(name); + Lamp *lamp = BKE_lamp_add(bmain, name); lamp->type = type; id_us_min(&lamp->id); return lamp; } -static void rna_Main_lamps_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *lamp_ptr) +static void rna_Main_lamps_remove(Main *bmain, ReportList *reports, PointerRNA *lamp_ptr) { Lamp *lamp = lamp_ptr->data; if (ID_REAL_USERS(lamp) <= 0) { - BKE_libblock_free(&G.main->lamp, lamp); + BKE_libblock_free(&bmain->lamp, lamp); RNA_POINTER_INVALIDATE(lamp_ptr); } else { @@ -291,19 +488,19 @@ static void rna_Main_lamps_remove(Main *UNUSED(bmain), ReportList *reports, Poin } } -static Image *rna_Main_images_new(Main *UNUSED(bmain), const char *name, int width, int height, int alpha, int float_buffer) +static Image *rna_Main_images_new(Main *bmain, const char *name, int width, int height, int alpha, int float_buffer) { float color[4] = {0.0, 0.0, 0.0, 1.0}; - Image *image = BKE_image_add_generated(width, height, name, alpha ? 32 : 24, float_buffer, 0, color); + Image *image = BKE_image_add_generated(bmain, width, height, name, alpha ? 32 : 24, float_buffer, 0, color); id_us_min(&image->id); return image; } -static Image *rna_Main_images_load(Main *UNUSED(bmain), ReportList *reports, const char *filepath) +static Image *rna_Main_images_load(Main *bmain, ReportList *reports, const char *filepath) { Image *ima; errno = 0; - ima = BKE_image_load(filepath); + ima = BKE_image_load(bmain, filepath); if (!ima) { BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath, @@ -312,11 +509,11 @@ static Image *rna_Main_images_load(Main *UNUSED(bmain), ReportList *reports, con return ima; } -static void rna_Main_images_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *image_ptr) +static void rna_Main_images_remove(Main *bmain, ReportList *reports, PointerRNA *image_ptr) { Image *image = image_ptr->data; if (ID_REAL_USERS(image) <= 0) { - BKE_libblock_free(&G.main->image, image); + BKE_libblock_free(&bmain->image, image); RNA_POINTER_INVALIDATE(image_ptr); } else { @@ -325,17 +522,17 @@ static void rna_Main_images_remove(Main *UNUSED(bmain), ReportList *reports, Poi } } -static Lattice *rna_Main_lattices_new(Main *UNUSED(bmain), const char *name) +static Lattice *rna_Main_lattices_new(Main *bmain, const char *name) { - Lattice *lt = BKE_lattice_add(name); + Lattice *lt = BKE_lattice_add(bmain, name); id_us_min(<->id); return lt; } -static void rna_Main_lattices_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *lt_ptr) +static void rna_Main_lattices_remove(Main *bmain, ReportList *reports, PointerRNA *lt_ptr) { Lattice *lt = lt_ptr->data; if (ID_REAL_USERS(lt) <= 0) { - BKE_libblock_free(&G.main->latt, lt); + BKE_libblock_free(&bmain->latt, lt); RNA_POINTER_INVALIDATE(lt_ptr); } else { @@ -344,17 +541,17 @@ static void rna_Main_lattices_remove(Main *UNUSED(bmain), ReportList *reports, P } } -static Curve *rna_Main_curves_new(Main *UNUSED(bmain), const char *name, int type) +static Curve *rna_Main_curves_new(Main *bmain, const char *name, int type) { - Curve *cu = BKE_curve_add(name, type); + Curve *cu = BKE_curve_add(bmain, name, type); id_us_min(&cu->id); return cu; } -static void rna_Main_curves_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *cu_ptr) +static void rna_Main_curves_remove(Main *bmain, ReportList *reports, PointerRNA *cu_ptr) { Curve *cu = cu_ptr->data; if (ID_REAL_USERS(cu) <= 0) { - BKE_libblock_free(&G.main->curve, cu); + BKE_libblock_free(&bmain->curve, cu); RNA_POINTER_INVALIDATE(cu_ptr); } else { @@ -363,17 +560,17 @@ static void rna_Main_curves_remove(Main *UNUSED(bmain), ReportList *reports, Poi } } -static MetaBall *rna_Main_metaballs_new(Main *UNUSED(bmain), const char *name) +static MetaBall *rna_Main_metaballs_new(Main *bmain, const char *name) { - MetaBall *mb = BKE_mball_add(name); + MetaBall *mb = BKE_mball_add(bmain, name); id_us_min(&mb->id); return mb; } -static void rna_Main_metaballs_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *mb_ptr) +static void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, PointerRNA *mb_ptr) { MetaBall *mb = mb_ptr->data; if (ID_REAL_USERS(mb) <= 0) { - BKE_libblock_free(&G.main->mball, mb); + BKE_libblock_free(&bmain->mball, mb); RNA_POINTER_INVALIDATE(mb_ptr); } else { @@ -409,18 +606,18 @@ static void rna_Main_fonts_remove(Main *bmain, ReportList *reports, PointerRNA * } } -static Tex *rna_Main_textures_new(Main *UNUSED(bmain), const char *name, int type) +static Tex *rna_Main_textures_new(Main *bmain, const char *name, int type) { - Tex *tex = add_texture(name); + Tex *tex = add_texture(bmain, name); tex_set_type(tex, type); id_us_min(&tex->id); return tex; } -static void rna_Main_textures_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *tex_ptr) +static void rna_Main_textures_remove(Main *bmain, ReportList *reports, PointerRNA *tex_ptr) { Tex *tex = tex_ptr->data; if (ID_REAL_USERS(tex) <= 0) { - BKE_libblock_free(&G.main->tex, tex); + BKE_libblock_free(&bmain->tex, tex); RNA_POINTER_INVALIDATE(tex_ptr); } else { @@ -429,17 +626,17 @@ static void rna_Main_textures_remove(Main *UNUSED(bmain), ReportList *reports, P } } -static Brush *rna_Main_brushes_new(Main *UNUSED(bmain), const char *name) +static Brush *rna_Main_brushes_new(Main *bmain, const char *name) { - Brush *brush = BKE_brush_add(name); + Brush *brush = BKE_brush_add(bmain, name); id_us_min(&brush->id); return brush; } -static void rna_Main_brushes_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *brush_ptr) +static void rna_Main_brushes_remove(Main *bmain, ReportList *reports, PointerRNA *brush_ptr) { Brush *brush = brush_ptr->data; if (ID_REAL_USERS(brush) <= 0) { - BKE_libblock_free(&G.main->brush, brush); + BKE_libblock_free(&bmain->brush, brush); RNA_POINTER_INVALIDATE(brush_ptr); } else { @@ -448,17 +645,17 @@ static void rna_Main_brushes_remove(Main *UNUSED(bmain), ReportList *reports, Po } } -static World *rna_Main_worlds_new(Main *UNUSED(bmain), const char *name) +static World *rna_Main_worlds_new(Main *bmain, const char *name) { - World *world = add_world(name); + World *world = add_world(bmain, name); id_us_min(&world->id); return world; } -static void rna_Main_worlds_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *world_ptr) +static void rna_Main_worlds_remove(Main *bmain, ReportList *reports, PointerRNA *world_ptr) { Group *world = world_ptr->data; if (ID_REAL_USERS(world) <= 0) { - BKE_libblock_free(&G.main->world, world); + BKE_libblock_free(&bmain->world, world); RNA_POINTER_INVALIDATE(world_ptr); } else { @@ -467,29 +664,29 @@ static void rna_Main_worlds_remove(Main *UNUSED(bmain), ReportList *reports, Poi } } -static Group *rna_Main_groups_new(Main *UNUSED(bmain), const char *name) +static Group *rna_Main_groups_new(Main *bmain, const char *name) { - return add_group(name); + return add_group(bmain, name); } -static void rna_Main_groups_remove(Main *UNUSED(bmain), PointerRNA *group_ptr) +static void rna_Main_groups_remove(Main *bmain, PointerRNA *group_ptr) { Group *group = group_ptr->data; BKE_group_unlink(group); - BKE_libblock_free(&G.main->group, group); + BKE_libblock_free(&bmain->group, group); RNA_POINTER_INVALIDATE(group_ptr); } -static Speaker *rna_Main_speakers_new(Main *UNUSED(bmain), const char *name) +static Speaker *rna_Main_speakers_new(Main *bmain, const char *name) { - Speaker *speaker = BKE_speaker_add(name); + Speaker *speaker = BKE_speaker_add(bmain, name); id_us_min(&speaker->id); return speaker; } -static void rna_Main_speakers_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *speaker_ptr) +static void rna_Main_speakers_remove(Main *bmain, ReportList *reports, PointerRNA *speaker_ptr) { Speaker *speaker = speaker_ptr->data; if (ID_REAL_USERS(speaker) <= 0) { - BKE_libblock_free(&G.main->speaker, speaker); + BKE_libblock_free(&bmain->speaker, speaker); RNA_POINTER_INVALIDATE(speaker_ptr); } else { @@ -498,15 +695,15 @@ static void rna_Main_speakers_remove(Main *UNUSED(bmain), ReportList *reports, P } } -static Text *rna_Main_texts_new(Main *UNUSED(bmain), const char *name) +static Text *rna_Main_texts_new(Main *bmain, const char *name) { - return BKE_text_add(name); + return BKE_text_add(bmain, name); } -static void rna_Main_texts_remove(Main *UNUSED(bmain), PointerRNA *text_ptr) +static void rna_Main_texts_remove(Main *bmain, PointerRNA *text_ptr) { Text *text = text_ptr->data; - BKE_text_unlink(G.main, text); - BKE_libblock_free(&G.main->text, text); + BKE_text_unlink(bmain, text); + BKE_libblock_free(&bmain->text, text); RNA_POINTER_INVALIDATE(text_ptr); } @@ -515,7 +712,7 @@ static Text *rna_Main_texts_load(Main *bmain, ReportList *reports, const char *f Text *txt; errno = 0; - txt = BKE_text_load(filepath, bmain->name); + txt = BKE_text_load(bmain, filepath, bmain->name); if (!txt) BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath, @@ -524,17 +721,17 @@ static Text *rna_Main_texts_load(Main *bmain, ReportList *reports, const char *f return txt; } -static bArmature *rna_Main_armatures_new(Main *UNUSED(bmain), const char *name) +static bArmature *rna_Main_armatures_new(Main *bmain, const char *name) { - bArmature *arm = BKE_armature_add(name); + bArmature *arm = BKE_armature_add(bmain, name); id_us_min(&arm->id); return arm; } -static void rna_Main_armatures_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *arm_ptr) +static void rna_Main_armatures_remove(Main *bmain, ReportList *reports, PointerRNA *arm_ptr) { bArmature *arm = arm_ptr->data; if (ID_REAL_USERS(arm) <= 0) { - BKE_libblock_free(&G.main->armature, arm); + BKE_libblock_free(&bmain->armature, arm); RNA_POINTER_INVALIDATE(arm_ptr); } else { @@ -543,18 +740,18 @@ static void rna_Main_armatures_remove(Main *UNUSED(bmain), ReportList *reports, } } -static bAction *rna_Main_actions_new(Main *UNUSED(bmain), const char *name) +static bAction *rna_Main_actions_new(Main *bmain, const char *name) { - bAction *act = add_empty_action(name); + bAction *act = add_empty_action(bmain, name); id_us_min(&act->id); act->id.flag &= ~LIB_FAKEUSER; return act; } -static void rna_Main_actions_remove(Main *UNUSED(bmain), ReportList *reports, PointerRNA *act_ptr) +static void rna_Main_actions_remove(Main *bmain, ReportList *reports, PointerRNA *act_ptr) { bAction *act = act_ptr->data; if (ID_REAL_USERS(act) <= 0) { - BKE_libblock_free(&G.main->action, act); + BKE_libblock_free(&bmain->action, act); RNA_POINTER_INVALIDATE(act_ptr); } else { @@ -582,12 +779,12 @@ static void rna_Main_particles_remove(Main *bmain, ReportList *reports, PointerR } } -static MovieClip *rna_Main_movieclip_load(Main *UNUSED(bmain), ReportList *reports, const char *filepath) +static MovieClip *rna_Main_movieclip_load(Main *bmain, ReportList *reports, const char *filepath) { MovieClip *clip; errno = 0; - clip = BKE_movieclip_file_add(filepath); + clip = BKE_movieclip_file_add(bmain, filepath); if (!clip) BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath, @@ -596,28 +793,28 @@ static MovieClip *rna_Main_movieclip_load(Main *UNUSED(bmain), ReportList *repor return clip; } -static void rna_Main_movieclips_remove(Main *UNUSED(bmain), PointerRNA *clip_ptr) +static void rna_Main_movieclips_remove(Main *bmain, PointerRNA *clip_ptr) { MovieClip *clip = clip_ptr->data; - BKE_movieclip_unlink(G.main, clip); - BKE_libblock_free(&G.main->movieclip, clip); + BKE_movieclip_unlink(bmain, clip); + BKE_libblock_free(&bmain->movieclip, clip); RNA_POINTER_INVALIDATE(clip_ptr); } -static Mask *rna_Main_mask_new(Main *UNUSED(bmain), const char *name) +static Mask *rna_Main_mask_new(Main *bmain, const char *name) { Mask *mask; - mask = BKE_mask_new("Mask"); + mask = BKE_mask_new(bmain, "Mask"); return mask; } -static void rna_Main_masks_remove(Main *UNUSED(bmain), PointerRNA *mask_ptr) +static void rna_Main_masks_remove(Main *bmain, PointerRNA *mask_ptr) { Mask *mask = mask_ptr->data; - BKE_mask_free(G.main, mask); - BKE_libblock_free(&G.main->mask, mask); + BKE_mask_free(bmain, mask); + BKE_libblock_free(&bmain->mask, mask); RNA_POINTER_INVALIDATE(mask_ptr); } @@ -911,6 +1108,12 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop) PropertyRNA *parm; PropertyRNA *prop; + static EnumPropertyItem mesh_type_items[] = { + {eModifierMode_Realtime, "PREVIEW", 0, "Preview", "Apply modifier preview settings"}, + {eModifierMode_Render, "RENDER", 0, "Render", "Apply modifier render settings"}, + {0, NULL, 0, NULL, NULL} + }; + RNA_def_property_srna(cprop, "BlendDataMeshes"); srna = RNA_def_struct(brna, "BlendDataMeshes", NULL); RNA_def_struct_sdna(srna, "Main"); @@ -924,6 +1127,21 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop) parm = RNA_def_pointer(func, "mesh", "Mesh", "", "New mesh datablock"); RNA_def_function_return(func, parm); + func = RNA_def_function(srna, "new_from_object", "rna_Main_meshes_new_from_object"); + RNA_def_function_ui_description(func, "Add a new mesh created from object with modifiers applied"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer(func, "scene", "Scene", "", "Scene within which to evaluate modifiers"); + RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL); + parm = RNA_def_pointer(func, "object", "Object", "", "Object to create mesh from"); + RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL); + parm = RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers"); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm = RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply"); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm = RNA_def_pointer(func, "mesh", "Mesh", "", + "Mesh created from object, remove it if it is only used for export"); + RNA_def_function_return(func, parm); + func = RNA_def_function(srna, "remove", "rna_Main_meshes_remove"); RNA_def_function_flag(func, FUNC_USE_REPORTS); RNA_def_function_ui_description(func, "Remove a mesh from the current blendfile"); diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 40b8d4cce66..51725bda7f9 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -65,8 +65,6 @@ static EnumPropertyItem space_items[] = { #include "BKE_context.h" #include "BKE_customdata.h" #include "BKE_depsgraph.h" -#include "BKE_DerivedMesh.h" -#include "BKE_displist.h" #include "BKE_font.h" #include "BKE_global.h" #include "BKE_main.h" @@ -113,194 +111,7 @@ static void rna_Scene_mat_convert_space(Object *ob, ReportList *reports, bPoseCh /* settings: 0 - preview, 1 - render */ static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_modifiers, int settings) { - Mesh *tmpmesh; - Curve *tmpcu = NULL, *copycu; - Object *tmpobj = NULL; - int render = settings == eModifierMode_Render, i; - int cage = !apply_modifiers; - - /* perform the mesh extraction based on type */ - switch (ob->type) { - case OB_FONT: - case OB_CURVE: - case OB_SURF: - { - ListBase dispbase = {NULL, NULL}; - DerivedMesh *derivedFinal = NULL; - int uv_from_orco; - - /* copies object and modifiers (but not the data) */ - tmpobj = BKE_object_copy_with_caches(ob); - tmpcu = (Curve *)tmpobj->data; - tmpcu->id.us--; - - /* if getting the original caged mesh, delete object modifiers */ - if (cage) - BKE_object_free_modifiers(tmpobj); - - /* copies the data */ - copycu = tmpobj->data = BKE_curve_copy((Curve *) ob->data); - - /* temporarily set edit so we get updates from edit mode, but - * also because for text datablocks copying it while in edit - * mode gives invalid data structures */ - copycu->editfont = tmpcu->editfont; - copycu->editnurb = tmpcu->editnurb; - - /* get updated display list, and convert to a mesh */ - BKE_displist_make_curveTypes_forRender(sce, tmpobj, &dispbase, &derivedFinal, FALSE); - - copycu->editfont = NULL; - copycu->editnurb = NULL; - - tmpobj->derivedFinal = derivedFinal; - - /* convert object type to mesh */ - uv_from_orco = (tmpcu->flag & CU_UV_ORCO) != 0; - BKE_mesh_from_nurbs_displist(tmpobj, &dispbase, uv_from_orco); - - tmpmesh = tmpobj->data; - - BKE_displist_free(&dispbase); - - /* BKE_mesh_from_nurbs changes the type to a mesh, check it worked */ - if (tmpobj->type != OB_MESH) { - BKE_libblock_free_us(&(G.main->object), tmpobj); - BKE_report(reports, RPT_ERROR, "Cannot convert curve to mesh (does the curve have any segments?)"); - return NULL; - } - - BKE_libblock_free_us(&G.main->object, tmpobj); - break; - } - - case OB_MBALL: - { - /* metaballs don't have modifiers, so just convert to mesh */ - Object *basis_ob = BKE_mball_basis_find(sce, ob); - /* todo, re-generatre for render-res */ - /* metaball_polygonize(scene, ob) */ - - if (ob != basis_ob) - return NULL; /* only do basis metaball */ - - tmpmesh = BKE_mesh_add("Mesh"); - /* BKE_mesh_add gives us a user count we don't need */ - tmpmesh->id.us--; - - if (render) { - ListBase disp = {NULL, NULL}; - BKE_displist_make_mball_forRender(sce, ob, &disp); - BKE_mesh_from_metaball(&disp, tmpmesh); - BKE_displist_free(&disp); - } - else - BKE_mesh_from_metaball(&ob->disp, tmpmesh); - - break; - - } - case OB_MESH: - /* copies object and modifiers (but not the data) */ - if (cage) { - /* copies the data */ - tmpmesh = BKE_mesh_copy(ob->data); - /* if not getting the original caged mesh, get final derived mesh */ - } - else { - /* Make a dummy mesh, saves copying */ - DerivedMesh *dm; - /* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */ - CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter, - * for example, needs CD_MASK_MDEFORMVERT */ - - /* Write the display mesh into the dummy mesh */ - if (render) - dm = mesh_create_derived_render(sce, ob, mask); - else - dm = mesh_create_derived_view(sce, ob, mask); - - tmpmesh = BKE_mesh_add("Mesh"); - DM_to_mesh(dm, tmpmesh, ob); - dm->release(dm); - } - - /* BKE_mesh_add/copy gives us a user count we don't need */ - tmpmesh->id.us--; - - break; - default: - BKE_report(reports, RPT_ERROR, "Object does not have geometry data"); - return NULL; - } - - /* Copy materials to new mesh */ - switch (ob->type) { - case OB_SURF: - case OB_FONT: - case OB_CURVE: - tmpmesh->totcol = tmpcu->totcol; - - /* free old material list (if it exists) and adjust user counts */ - if (tmpcu->mat) { - for (i = tmpcu->totcol; i-- > 0; ) { - /* are we an object material or data based? */ - - tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpcu->mat[i]; - - if (tmpmesh->mat[i]) { - tmpmesh->mat[i]->id.us++; - } - } - } - break; - -#if 0 - /* Crashes when assigning the new material, not sure why */ - case OB_MBALL: - tmpmb = (MetaBall *)ob->data; - tmpmesh->totcol = tmpmb->totcol; - - /* free old material list (if it exists) and adjust user counts */ - if (tmpmb->mat) { - for (i = tmpmb->totcol; i-- > 0; ) { - tmpmesh->mat[i] = tmpmb->mat[i]; /* CRASH HERE ??? */ - if (tmpmesh->mat[i]) { - tmpmb->mat[i]->id.us++; - } - } - } - break; -#endif - - case OB_MESH: - if (!cage) { - Mesh *origmesh = ob->data; - tmpmesh->flag = origmesh->flag; - tmpmesh->mat = MEM_dupallocN(origmesh->mat); - tmpmesh->totcol = origmesh->totcol; - tmpmesh->smoothresh = origmesh->smoothresh; - if (origmesh->mat) { - for (i = origmesh->totcol; i-- > 0; ) { - /* are we an object material or data based? */ - tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : origmesh->mat[i]; - - if (tmpmesh->mat[i]) { - tmpmesh->mat[i]->id.us++; - } - } - } - } - break; - } /* end copy materials */ - - /* cycles and exporters rely on this still */ - BKE_mesh_tessface_ensure(tmpmesh); - - /* make sure materials get updated in objects */ - test_object_materials(&tmpmesh->id); - - return tmpmesh; + return rna_Main_meshes_new_from_object(G.main, reports, sce, ob, apply_modifiers, settings); } /* mostly a copy from convertblender.c */ diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c index 0cf4f6a008f..a3d93b5437e 100644 --- a/source/blender/modifiers/intern/MOD_boolean_util.c +++ b/source/blender/modifiers/intern/MOD_boolean_util.c @@ -46,6 +46,7 @@ #include "BKE_cdderivedmesh.h" #include "BKE_depsgraph.h" +#include "BKE_global.h" #include "BKE_material.h" #include "BKE_mesh.h" #include "BKE_object.h" @@ -295,7 +296,7 @@ static Object *AddNewBlenderMesh(Scene *scene, Base *base) basen->flag &= ~SELECT; /* Initialize the mesh data associated with this object. */ - ob_new->data = BKE_mesh_add("Mesh"); + ob_new->data = BKE_mesh_add(G.main, "Mesh"); /* Finally assign the object type. */ ob_new->type = OB_MESH; -- cgit v1.2.3 From 9d02ac41dca23f3862d84ad64fabdc57a22d4d81 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 13:04:01 +0000 Subject: Attempt to fix collada compilation after recent commit I don't have recent collada compiled here atm, so perhaps there're more issues here. --- source/blender/collada/DocumentImporter.cpp | 12 ++++++------ source/blender/collada/MeshImporter.cpp | 2 +- source/blender/collada/collada_utils.cpp | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 524645a4bb2..49fb713ce06 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -601,7 +601,7 @@ bool DocumentImporter::writeMaterial(const COLLADAFW::Material *cmat) return true; const std::string& str_mat_id = cmat->getName().size() ? cmat->getName() : cmat->getOriginalId(); - Material *ma = BKE_material_add((char *)str_mat_id.c_str()); + Material *ma = BKE_material_add(G.main, (char *)str_mat_id.c_str()); this->uid_effect_map[cmat->getInstantiatedEffect()] = ma; this->uid_material_map[cmat->getUniqueId()] = ma; @@ -625,7 +625,7 @@ MTex *DocumentImporter::create_texture(COLLADAFW::EffectCommon *ef, COLLADAFW::T ma->mtex[i] = add_mtex(); ma->mtex[i]->texco = TEXCO_UV; - ma->mtex[i]->tex = add_texture("Texture"); + ma->mtex[i]->tex = add_texture(G.main, "Texture"); ma->mtex[i]->tex->type = TEX_IMAGE; ma->mtex[i]->tex->ima = uid_image_map[ima_uid]; @@ -831,8 +831,8 @@ bool DocumentImporter::writeCamera(const COLLADAFW::Camera *camera) cam_id = camera->getOriginalId(); cam_name = camera->getName(); - if (cam_name.size()) cam = (Camera *)BKE_camera_add((char *)cam_name.c_str()); - else cam = (Camera *)BKE_camera_add((char *)cam_id.c_str()); + if (cam_name.size()) cam = (Camera *)BKE_camera_add(G.main, (char *)cam_name.c_str()); + else cam = (Camera *)BKE_camera_add(G.main, (char *)cam_id.c_str()); if (!cam) { fprintf(stderr, "Cannot create camera.\n"); @@ -981,8 +981,8 @@ bool DocumentImporter::writeLight(const COLLADAFW::Light *light) la_id = light->getOriginalId(); la_name = light->getName(); - if (la_name.size()) lamp = (Lamp *)BKE_lamp_add((char *)la_name.c_str()); - else lamp = (Lamp *)BKE_lamp_add((char *)la_id.c_str()); + if (la_name.size()) lamp = (Lamp *)BKE_lamp_add(G.main, (char *)la_name.c_str()); + else lamp = (Lamp *)BKE_lamp_add(G.main, (char *)la_id.c_str()); if (!lamp) { fprintf(stderr, "Cannot create lamp.\n"); diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp index febfb772430..6d4e77f6a86 100644 --- a/source/blender/collada/MeshImporter.cpp +++ b/source/blender/collada/MeshImporter.cpp @@ -1296,7 +1296,7 @@ bool MeshImporter::write_geometry(const COLLADAFW::Geometry *geom) } const std::string& str_geom_id = mesh->getName().size() ? mesh->getName() : mesh->getOriginalId(); - Mesh *me = BKE_mesh_add((char *)str_geom_id.c_str()); + Mesh *me = BKE_mesh_add(G.main, (char *)str_geom_id.c_str()); me->id.us--; // is already 1 here, but will be set later in set_mesh // store the Mesh pointer to link it later with an Object diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index 7bdda387d5e..e000e603eae 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -151,7 +151,7 @@ Mesh *bc_to_mesh_apply_modifiers(Scene *scene, Object *ob, BC_export_mesh_type e } } - tmpmesh = BKE_mesh_add("ColladaMesh"); // name is not important here + tmpmesh = BKE_mesh_add(G.main, "ColladaMesh"); // name is not important here DM_to_mesh(dm, tmpmesh, ob); dm->release(dm); return tmpmesh; -- cgit v1.2.3 From 48cfe610db32778d5e1bb4451592236f13e3d5e7 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 13:10:26 +0000 Subject: Tracking settings for new clip didn't match default reset --- source/blender/blenkernel/intern/tracking.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 3c5d94a21e4..8b81e474e76 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -169,8 +169,9 @@ void BKE_tracking_settings_init(MovieTracking *tracking) tracking->settings.default_motion_model = TRACK_MOTION_MODEL_TRANSLATION; tracking->settings.default_minimum_correlation = 0.75; - tracking->settings.default_pattern_size = 11; + tracking->settings.default_pattern_size = 15; tracking->settings.default_search_size = 61; + tracking->settings.default_algorithm_flag |= TRACK_ALGORITHM_FLAG_USE_BRUTE; tracking->settings.dist = 1; tracking->settings.object_distance = 1; tracking->settings.reconstruction_success_threshold = 1e-3; -- cgit v1.2.3 From dad053a1524dd4e697a3db3651503edff710510c Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 5 Feb 2013 13:16:21 +0000 Subject: * One more fix for Collada. --- source/blender/collada/collada_utils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index e000e603eae..58e6301a084 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -49,6 +49,7 @@ extern "C" { #include "BKE_customdata.h" #include "BKE_depsgraph.h" #include "BKE_object.h" +#include "BKE_global.h" #include "BKE_mesh.h" #include "BKE_scene.h" #include "BKE_DerivedMesh.h" @@ -124,7 +125,7 @@ int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space) Object *bc_add_object(Scene *scene, int type, const char *name) { - Object *ob = BKE_object_add_only_object(type, name); + Object *ob = BKE_object_add_only_object(G.main, type, name); ob->data = BKE_object_obdata_add_from_type(type); ob->lay = scene->lay; -- cgit v1.2.3 From dd83387e0be79bd104b780515b6b34a12850b0ae Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 5 Feb 2013 13:31:59 +0000 Subject: And one more "G.main" compile fix, this time for BGE ;) --- source/gameengine/GamePlayer/ghost/GPG_ghost.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp index 5082fca2032..5b2cfddd141 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp @@ -907,7 +907,7 @@ int main(int argc, char** argv) if (domeWarp) { //XXX to do: convert relative to absolute path - domeText= BKE_text_load(domeWarp, ""); + domeText= BKE_text_load(G.main, domeWarp, ""); if (!domeText) printf("error: invalid warpdata text file - %s\n", domeWarp); else -- cgit v1.2.3 From 1ca0d66bd20739132fb43fb07f80edac347ce745 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Feb 2013 13:33:54 +0000 Subject: Fix particle child render resolution access not working outside of the render thread, and rename ToggleRender to set_resolution to follow RNA conventions. --- source/blender/blenkernel/intern/particle.c | 6 ++---- source/blender/makesrna/intern/rna_particle.c | 31 +++++++++++++++++---------- 2 files changed, 22 insertions(+), 15 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 71854a93f4d..c01ea4e518d 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -684,8 +684,6 @@ void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[4][4], floa ParticleRenderData *data; ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys); - if (G.is_rendering == FALSE) - return; if (psys->renderdata) return; @@ -2384,7 +2382,7 @@ void psys_find_parents(ParticleSimulationData *sim) int from = PART_FROM_FACE; totparent = (int)(totchild * part->parents * 0.3f); - if (G.is_rendering && part->child_nbr && part->ren_child_nbr) + if ((sim->psys->renderdata || G.is_rendering) && part->child_nbr && part->ren_child_nbr) totparent *= (float)part->child_nbr / (float)part->ren_child_nbr; tree = BLI_kdtree_new(totparent); @@ -2461,7 +2459,7 @@ static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float c if (totchild && part->childtype == PART_CHILD_FACES) { totparent = (int)(totchild * part->parents * 0.3f); - if (G.is_rendering && part->child_nbr && part->ren_child_nbr) + if ((psys->renderdata || G.is_rendering) && part->child_nbr && part->ren_child_nbr) totparent *= (float)part->child_nbr / (float)part->ren_child_nbr; /* part->parents could still be 0 so we can't test with totparent */ diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index 0107cd8b51e..dbf80f01335 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -583,20 +583,22 @@ static void rna_ParticleSystem_mcol_on_emitter(ParticleSystem *particlesystem, P } } -static void rna_ParticleSystem_ToggleRender(ParticleSystem *particlesystem, Scene *scene, Object *object) +static void rna_ParticleSystem_set_resolution(ParticleSystem *particlesystem, Scene *scene, Object *object, int resolution) { - ParticleSystemModifierData *psmd = psys_get_modifier(object, particlesystem); - float mat[4][4]; + if (resolution == eModifierMode_Render) { + ParticleSystemModifierData *psmd = psys_get_modifier(object, particlesystem); + float mat[4][4]; + + unit_m4(mat); - unit_m4(mat); - - if (particlesystem->renderdata) - psys_render_restore(object, particlesystem); - else { psys_render_set(object, particlesystem, mat, mat, 1, 1, 0.f); psmd->flag &= ~eParticleSystemFlag_psys_updated; particle_system_update(scene, object, particlesystem); } + else { + if (particlesystem->renderdata) + psys_render_restore(object, particlesystem); + } } static void particle_recalc(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr, short flag) @@ -3082,6 +3084,12 @@ static void rna_def_particle_system(BlenderRNA *brna) PropertyRNA *prop; FunctionRNA *func; + static EnumPropertyItem resolution_items[] = { + {eModifierMode_Realtime, "PREVIEW", 0, "Preview", "Apply modifier preview settings"}, + {eModifierMode_Render, "RENDER", 0, "Render", "Apply modifier render settings"}, + {0, NULL, 0, NULL, NULL} + }; + srna = RNA_def_struct(brna, "ParticleSystem", NULL); RNA_def_struct_ui_text(srna, "Particle System", "Particle system in an object"); RNA_def_struct_ui_icon(srna, ICON_PARTICLE_DATA); @@ -3380,11 +3388,12 @@ static void rna_def_particle_system(BlenderRNA *brna) RNA_def_struct_path_func(srna, "rna_ParticleSystem_path"); - /* Toggle Render settings */ - func = RNA_def_function(srna, "ToggleRender", "rna_ParticleSystem_ToggleRender"); - RNA_def_function_ui_description(func, "Toggle render settings"); + /* set viewport or render resolution */ + func = RNA_def_function(srna, "set_resolution", "rna_ParticleSystem_set_resolution"); + RNA_def_function_ui_description(func, "Set the resolution to use for the number of particles"); prop = RNA_def_pointer(func, "scene", "Scene", "", "Scene"); prop = RNA_def_pointer(func, "object", "Object", "", "Object"); + prop = RNA_def_enum(func, "resolution", resolution_items, 0, "", "Resolution settings to apply"); /* extract cached hair location data */ func = RNA_def_function(srna, "co_hair", "rna_ParticleSystem_co_hair"); -- cgit v1.2.3 From 4c3d5a4294756944eba2ab536751e38eecc2bd8d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 14:25:22 +0000 Subject: add RNA_define_animate_sdna() so animation can be easily disabled when defining many properties - currently use to disable animating brushes and toolsettings. --- source/blender/makesrna/RNA_define.h | 1 + source/blender/makesrna/intern/makesrna.c | 7 +++++++ source/blender/makesrna/intern/rna_define.c | 18 ++++++++++++++++-- source/blender/makesrna/intern/rna_internal.h | 2 +- source/blender/makesrna/intern/rna_scene.c | 8 ++++++-- source/blender/makesrna/intern/rna_sculpt_paint.c | 3 +++ 6 files changed, 34 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h index cd6d74c3488..0d6e66904e7 100644 --- a/source/blender/makesrna/RNA_define.h +++ b/source/blender/makesrna/RNA_define.h @@ -43,6 +43,7 @@ BlenderRNA *RNA_create(void); void RNA_define_free(BlenderRNA *brna); void RNA_free(BlenderRNA *brna); void RNA_define_verify_sdna(int verify); +void RNA_define_animate_sdna(int animate); void RNA_init(void); void RNA_exit(void); diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 01df05677e7..e1844faf6e9 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -3882,6 +3882,13 @@ static int rna_preprocess(const char *outfile) if (PROCESS_ITEMS[i].define) { PROCESS_ITEMS[i].define(brna); + /* sanity check */ + if (!DefRNA.animate) { + fprintf(stderr, + "Error: DefRNA.animate left disabled in %s\n", + PROCESS_ITEMS[i].filename); + } + for (ds = DefRNA.structs.first; ds; ds = ds->cont.next) if (!ds->filename) ds->filename = PROCESS_ITEMS[i].filename; diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c index 8bed562cbf7..2719016856d 100644 --- a/source/blender/makesrna/intern/rna_define.c +++ b/source/blender/makesrna/intern/rna_define.c @@ -61,7 +61,7 @@ /* Global used during defining */ -BlenderDefRNA DefRNA = {NULL, {NULL, NULL}, {NULL, NULL}, NULL, 0, 0, 0, 1}; +BlenderDefRNA DefRNA = {NULL, {NULL, NULL}, {NULL, NULL}, NULL, 0, 0, 0, 1, 1}; /* Duplicated code since we can't link in blenkernel or blenlib */ @@ -506,6 +506,13 @@ void RNA_define_verify_sdna(int verify) DefRNA.verify = verify; } +#ifndef RNA_RUNTIME +void RNA_define_animate_sdna(int animate) +{ + DefRNA.animate = animate; +} +#endif + void RNA_struct_free_extension(StructRNA *srna, ExtensionRNA *ext) { #ifdef RNA_RUNTIME @@ -1031,8 +1038,15 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier if (type != PROP_COLLECTION && type != PROP_POINTER) { prop->flag = PROP_EDITABLE; - if (type != PROP_STRING) + if (type != PROP_STRING) { +#ifdef RNA_RUNTIME prop->flag |= PROP_ANIMATABLE; +#else + if (DefRNA.animate) { + prop->flag |= PROP_ANIMATABLE; + } +#endif + } } if (type == PROP_STRING) { diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index d908e84430b..eaa69a8124c 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -117,7 +117,7 @@ typedef struct BlenderDefRNA { ListBase structs; ListBase allocs; struct StructRNA *laststruct; - int error, silent, preprocess, verify; + int error, silent, preprocess, verify, animate; } BlenderDefRNA; extern BlenderDefRNA DefRNA; diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 4763c4d3071..6c8242e4333 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -4708,15 +4708,19 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Sequencer Color Space Settings", "Settings of color space sequencer is working in"); /* Nestled Data */ + /* *** Non-Animated *** */ + RNA_define_animate_sdna(false); rna_def_tool_settings(brna); rna_def_unified_paint_settings(brna); rna_def_unit_settings(brna); rna_def_scene_image_format_data(brna); - rna_def_scene_render_data(brna); rna_def_scene_game_data(brna); - rna_def_scene_render_layer(brna); rna_def_transform_orientation(brna); rna_def_selected_uv_element(brna); + RNA_define_animate_sdna(true); + /* *** Animated *** */ + rna_def_scene_render_data(brna); + rna_def_scene_render_layer(brna); /* Scene API */ RNA_api_scene(srna); diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c index 08bac1da7a7..ff0c9d9dec6 100644 --- a/source/blender/makesrna/intern/rna_sculpt_paint.c +++ b/source/blender/makesrna/intern/rna_sculpt_paint.c @@ -676,12 +676,15 @@ static void rna_def_particle_edit(BlenderRNA *brna) void RNA_def_sculpt_paint(BlenderRNA *brna) { + /* *** Non-Animated *** */ + RNA_define_animate_sdna(false); rna_def_paint(brna); rna_def_sculpt(brna); rna_def_uv_sculpt(brna); rna_def_vertex_paint(brna); rna_def_image_paint(brna); rna_def_particle_edit(brna); + RNA_define_animate_sdna(true); } #endif -- cgit v1.2.3 From ef457d599467ac9211bb9e3dc218e5c40f5a6a9a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 14:33:55 +0000 Subject: fix [#34118] Crash, when clicking "Assign image to UV Map" --- source/blender/editors/mesh/mesh_data.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index 1d13aa36a6b..3b7517d3987 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -575,13 +575,19 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); View3D *v3d = CTX_wm_view3d(C); - Base *base = ED_view3d_give_base_under_cursor(C, event->mval); + Base *base; Image *ima = NULL; Mesh *me; Object *obedit; int exitmode = 0; - char name[MAX_ID_NAME - 2]; + if (v3d == NULL) { + BKE_report(op->reports, RPT_ERROR, "No 3D View Available"); + return OPERATOR_CANCELLED; + } + + base = ED_view3d_give_base_under_cursor(C, event->mval); + /* Check context */ if (base == NULL || base->object->type != OB_MESH) { BKE_report(op->reports, RPT_ERROR, "Not an object or mesh"); @@ -596,6 +602,7 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) ima = BKE_image_load_exists(path); } else { + char name[MAX_ID_NAME - 2]; RNA_string_get(op->ptr, "name", name); ima = (Image *)BKE_libblock_find_name(ID_IM, name); } -- cgit v1.2.3 From adf9dffa30fe9767fc38cef60866372253d9b76b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 14:38:19 +0000 Subject: set drag/drop operators as 'INTERNAL', there not useful to access from operator search. --- source/blender/editors/mesh/mesh_data.c | 4 ++-- source/blender/editors/object/object_relations.c | 2 +- source/blender/editors/space_outliner/outliner_edit.c | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index 3b7517d3987..0c9a5aab537 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -648,7 +648,7 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) void MESH_OT_drop_named_image(wmOperatorType *ot) { /* identifiers */ - ot->name = "Assign Image to UV Map"; + ot->name = "Drop Image to Mesh UV Map"; ot->description = "Assign Image to active UV Map, or create an UV Map"; ot->idname = "MESH_OT_drop_named_image"; @@ -657,7 +657,7 @@ void MESH_OT_drop_named_image(wmOperatorType *ot) ot->invoke = drop_named_image_invoke; /* flags */ - ot->flag = OPTYPE_UNDO; + ot->flag = OPTYPE_UNDO | OPTYPE_INTERNAL; /* properties */ RNA_def_string(ot->srna, "name", "Image", MAX_ID_NAME - 2, "Name", "Image name to assign"); diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index da12db50cc5..33b159f3cf2 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -2168,7 +2168,7 @@ void OBJECT_OT_drop_named_material(wmOperatorType *ot) ot->poll = ED_operator_objectmode; /* flags */ - ot->flag = OPTYPE_UNDO; + ot->flag = OPTYPE_UNDO | OPTYPE_INTERNAL; /* properties */ RNA_def_string(ot->srna, "name", "Material", MAX_ID_NAME - 2, "Name", "Material name to assign"); diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c index 41641c80188..ab660b9cd4a 100644 --- a/source/blender/editors/space_outliner/outliner_edit.c +++ b/source/blender/editors/space_outliner/outliner_edit.c @@ -1637,7 +1637,7 @@ void OUTLINER_OT_parent_drop(wmOperatorType *ot) ot->poll = ED_operator_outliner_active; /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; /* properties */ RNA_def_string(ot->srna, "child", "Object", MAX_ID_NAME, "Child", "Child Object"); @@ -1726,7 +1726,7 @@ void OUTLINER_OT_parent_clear(wmOperatorType *ot) ot->poll = ED_operator_outliner_active; /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; /* properties */ RNA_def_string(ot->srna, "dragged_obj", "Object", MAX_ID_NAME, "Child", "Child Object"); @@ -1819,7 +1819,7 @@ void OUTLINER_OT_scene_drop(wmOperatorType *ot) ot->poll = ED_operator_outliner_active; /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; /* properties */ RNA_def_string(ot->srna, "object", "Object", MAX_ID_NAME, "Object", "Target Object"); @@ -1883,7 +1883,7 @@ void OUTLINER_OT_material_drop(wmOperatorType *ot) ot->poll = ED_operator_outliner_active; /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; /* properties */ RNA_def_string(ot->srna, "object", "Object", MAX_ID_NAME, "Object", "Target Object"); -- cgit v1.2.3 From 2fc46efbd688f336fcdea571cf892fcc21f23608 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 5 Feb 2013 15:01:08 +0000 Subject: Compositor: * Bump BLENDER_SUBVERSION to "10", to reflect changes in r54304. (Compositor Translate Node) --- source/blender/blenkernel/BKE_blender.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 2548d95c383..871e9918f6f 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -42,7 +42,7 @@ extern "C" { * and keep comment above the defines. * Use STRINGIFY() rather than defining with quotes */ #define BLENDER_VERSION 265 -#define BLENDER_SUBVERSION 9 +#define BLENDER_SUBVERSION 10 /* 262 was the last editmesh release but it has compatibility code for bmesh data */ #define BLENDER_MINVERSION 262 -- cgit v1.2.3 From 134c656878f63e597b250fa2a89eaf9196120d57 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 5 Feb 2013 16:16:07 +0000 Subject: New matcap collection for default in release. It's now 24 images, ordered from regular diffuse to more shiny, stone, wax, eflective, glass and two non-realistic ones. The menu now shows it in 3 rows. I made the previews a bit smaller, 96 pixels, like the brushes for painting. Thanks everyone for submitting pics! I updated the credit file too, but name from one person is missing still, will be added next. --- source/blender/editors/datafiles/CMakeLists.txt | 8 ++++++++ source/blender/editors/datafiles/SConscript | 8 ++++++++ source/blender/editors/include/ED_datafiles.h | 24 ++++++++++++++++++++++ source/blender/editors/include/UI_icons.h | 8 ++++++++ source/blender/editors/interface/interface_icons.c | 12 +++++++++-- .../editors/interface/interface_templates.c | 7 ++++--- source/blender/makesrna/intern/rna_space.c | 8 ++++++++ 7 files changed, 70 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt index ed3088696b1..8d108644470 100644 --- a/source/blender/editors/datafiles/CMakeLists.txt +++ b/source/blender/editors/datafiles/CMakeLists.txt @@ -100,6 +100,14 @@ if(WITH_BLENDER) data_to_c_simple(../../../../release/datafiles/matcaps/mc14.jpg SRC) data_to_c_simple(../../../../release/datafiles/matcaps/mc15.jpg SRC) data_to_c_simple(../../../../release/datafiles/matcaps/mc16.jpg SRC) + data_to_c_simple(../../../../release/datafiles/matcaps/mc17.jpg SRC) + data_to_c_simple(../../../../release/datafiles/matcaps/mc18.jpg SRC) + data_to_c_simple(../../../../release/datafiles/matcaps/mc19.jpg SRC) + data_to_c_simple(../../../../release/datafiles/matcaps/mc20.jpg SRC) + data_to_c_simple(../../../../release/datafiles/matcaps/mc21.jpg SRC) + data_to_c_simple(../../../../release/datafiles/matcaps/mc22.jpg SRC) + data_to_c_simple(../../../../release/datafiles/matcaps/mc23.jpg SRC) + data_to_c_simple(../../../../release/datafiles/matcaps/mc24.jpg SRC) endif() diff --git a/source/blender/editors/datafiles/SConscript b/source/blender/editors/datafiles/SConscript index fb1f9f37975..c17ab386fe6 100644 --- a/source/blender/editors/datafiles/SConscript +++ b/source/blender/editors/datafiles/SConscript @@ -95,6 +95,14 @@ sources.extend(( os.path.join(env['DATA_SOURCES'], "mc14.jpg.c"), os.path.join(env['DATA_SOURCES'], "mc15.jpg.c"), os.path.join(env['DATA_SOURCES'], "mc16.jpg.c"), + os.path.join(env['DATA_SOURCES'], "mc17.jpg.c"), + os.path.join(env['DATA_SOURCES'], "mc18.jpg.c"), + os.path.join(env['DATA_SOURCES'], "mc19.jpg.c"), + os.path.join(env['DATA_SOURCES'], "mc20.jpg.c"), + os.path.join(env['DATA_SOURCES'], "mc21.jpg.c"), + os.path.join(env['DATA_SOURCES'], "mc22.jpg.c"), + os.path.join(env['DATA_SOURCES'], "mc23.jpg.c"), + os.path.join(env['DATA_SOURCES'], "mc24.jpg.c"), )) diff --git a/source/blender/editors/include/ED_datafiles.h b/source/blender/editors/include/ED_datafiles.h index 19552d60387..81dbb8e9aa5 100644 --- a/source/blender/editors/include/ED_datafiles.h +++ b/source/blender/editors/include/ED_datafiles.h @@ -206,6 +206,30 @@ extern char datatoc_mc15_jpg[]; extern int datatoc_mc16_jpg_size; extern char datatoc_mc16_jpg[]; +extern int datatoc_mc17_jpg_size; +extern char datatoc_mc17_jpg[]; + +extern int datatoc_mc18_jpg_size; +extern char datatoc_mc18_jpg[]; + +extern int datatoc_mc19_jpg_size; +extern char datatoc_mc19_jpg[]; + +extern int datatoc_mc20_jpg_size; +extern char datatoc_mc20_jpg[]; + +extern int datatoc_mc21_jpg_size; +extern char datatoc_mc21_jpg[]; + +extern int datatoc_mc22_jpg_size; +extern char datatoc_mc22_jpg[]; + +extern int datatoc_mc23_jpg_size; +extern char datatoc_mc23_jpg[]; + +extern int datatoc_mc24_jpg_size; +extern char datatoc_mc24_jpg[]; + #endif /* __ED_DATAFILES_H__ */ diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index f5ac3f19b5b..0560cbd69cc 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -1007,6 +1007,14 @@ DEF_ICON(MATCAP_13) DEF_ICON(MATCAP_14) DEF_ICON(MATCAP_15) DEF_ICON(MATCAP_16) +DEF_ICON(MATCAP_17) +DEF_ICON(MATCAP_18) +DEF_ICON(MATCAP_19) +DEF_ICON(MATCAP_20) +DEF_ICON(MATCAP_21) +DEF_ICON(MATCAP_22) +DEF_ICON(MATCAP_23) +DEF_ICON(MATCAP_24) /* vector icons, VICO_ prefix added */ DEF_VICO(VIEW3D_VEC) diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 1a3d8d20d47..086e9dad895 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -533,7 +533,7 @@ static void icon_verify_datatoc(IconImage *iimg) iimg->datatoc_size, IB_rect, NULL, ""); /* w and h were set on initialize */ if (bbuf->x != iimg->h && bbuf->y != iimg->w) - IMB_scalefastImBuf(bbuf, iimg->w, iimg->h); + IMB_scaleImBuf(bbuf, iimg->w, iimg->h); iimg->rect = bbuf->rect; bbuf->rect = NULL; @@ -550,7 +550,7 @@ static void init_matcap_icons(void) int size = datatoc_ ##name## _jpg_size; \ DrawInfo *di; \ \ - di = def_internal_icon(NULL, icon_id, 0, 0, 128, ICON_TYPE_BUFFER); \ + di = def_internal_icon(NULL, icon_id, 0, 0, 96, ICON_TYPE_BUFFER); \ di->data.buffer.image->datatoc_rect = rect; \ di->data.buffer.image->datatoc_size = size; \ } (void)0 @@ -571,6 +571,14 @@ static void init_matcap_icons(void) INIT_MATCAP_ICON(ICON_MATCAP_14, mc14); INIT_MATCAP_ICON(ICON_MATCAP_15, mc15); INIT_MATCAP_ICON(ICON_MATCAP_16, mc16); + INIT_MATCAP_ICON(ICON_MATCAP_17, mc17); + INIT_MATCAP_ICON(ICON_MATCAP_18, mc18); + INIT_MATCAP_ICON(ICON_MATCAP_19, mc19); + INIT_MATCAP_ICON(ICON_MATCAP_20, mc20); + INIT_MATCAP_ICON(ICON_MATCAP_21, mc21); + INIT_MATCAP_ICON(ICON_MATCAP_22, mc22); + INIT_MATCAP_ICON(ICON_MATCAP_23, mc23); + INIT_MATCAP_ICON(ICON_MATCAP_24, mc24); #undef INIT_MATCAP_ICON diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 26a8f703545..ff47d481fc8 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -1585,11 +1585,12 @@ static uiBlock *icon_view_menu(bContext *C, ARegion *ar, void *arg_litem) for (a = 0; item[a].identifier; a++) { int x, y; - x = (a % 8) * UI_UNIT_X * 6; - y = (a / 8) * UI_UNIT_X * 6; + /* XXX hardcoded size to 5 x unit */ + x = (a % 8) * UI_UNIT_X * 5; + y = (a / 8) * UI_UNIT_X * 5; icon = item[a].icon; - but = uiDefIconButR_prop(block, ROW, 0, icon, x, y, UI_UNIT_X * 6, UI_UNIT_Y * 6, &cb.ptr, cb.prop, -1, 0, icon, -1, -1, NULL); + but = uiDefIconButR_prop(block, ROW, 0, icon, x, y, UI_UNIT_X * 5, UI_UNIT_Y * 5, &cb.ptr, cb.prop, -1, 0, icon, -1, -1, NULL); uiButSetFlag(but, UI_HAS_ICON | UI_ICON_PREVIEW); } diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 38112f95ec8..a742e6d4a1a 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -1550,6 +1550,14 @@ static void rna_def_space_view3d(BlenderRNA *brna) {ICON_MATCAP_14, "14", ICON_MATCAP_14, "", ""}, {ICON_MATCAP_15, "15", ICON_MATCAP_15, "", ""}, {ICON_MATCAP_16, "16", ICON_MATCAP_16, "", ""}, + {ICON_MATCAP_17, "17", ICON_MATCAP_17, "", ""}, + {ICON_MATCAP_18, "18", ICON_MATCAP_18, "", ""}, + {ICON_MATCAP_19, "19", ICON_MATCAP_19, "", ""}, + {ICON_MATCAP_20, "20", ICON_MATCAP_20, "", ""}, + {ICON_MATCAP_21, "21", ICON_MATCAP_21, "", ""}, + {ICON_MATCAP_22, "22", ICON_MATCAP_22, "", ""}, + {ICON_MATCAP_23, "23", ICON_MATCAP_23, "", ""}, + {ICON_MATCAP_24, "24", ICON_MATCAP_24, "", ""}, {0, NULL, 0, NULL, NULL} }; -- cgit v1.2.3 From 6afecfe579b1e6caa13427dfa2c4291590d9901d Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Tue, 5 Feb 2013 21:51:15 +0000 Subject: rigidbody: Don't use units for spring stiffness --- source/blender/makesrna/intern/rna_rigidbody.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_rigidbody.c b/source/blender/makesrna/intern/rna_rigidbody.c index 71ff7bfd6ec..c8f6a44a96e 100644 --- a/source/blender/makesrna/intern/rna_rigidbody.c +++ b/source/blender/makesrna/intern/rna_rigidbody.c @@ -951,7 +951,7 @@ static void rna_def_rigidbody_constraint(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Upper Z Angle Limit", "Upper limit of Z axis rotation"); RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset"); - prop = RNA_def_property(srna, "spring_stiffness_x", PROP_FLOAT, PROP_UNIT_LENGTH); + prop = RNA_def_property(srna, "spring_stiffness_x", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_x"); RNA_def_property_range(prop, 0.0f, FLT_MAX); RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3); @@ -960,7 +960,7 @@ static void rna_def_rigidbody_constraint(BlenderRNA *brna) RNA_def_property_ui_text(prop, "X Axis Stiffness", "Stiffness on the X axis"); RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset"); - prop = RNA_def_property(srna, "spring_stiffness_y", PROP_FLOAT, PROP_UNIT_LENGTH); + prop = RNA_def_property(srna, "spring_stiffness_y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_y"); RNA_def_property_range(prop, 0.0f, FLT_MAX); RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3); @@ -969,7 +969,7 @@ static void rna_def_rigidbody_constraint(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Y Axis Stiffness", "Stiffness on the Y axis"); RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset"); - prop = RNA_def_property(srna, "spring_stiffness_z", PROP_FLOAT, PROP_UNIT_LENGTH); + prop = RNA_def_property(srna, "spring_stiffness_z", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_z"); RNA_def_property_range(prop, 0.0f, FLT_MAX); RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3); -- cgit v1.2.3 From f40dc450543bd3a812332a6d45bcf0b0a63a8f62 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 00:48:17 +0000 Subject: fix [#34125] Crash when bake margin = 0 regression since 2.65, just missing NULL check. --- source/blender/render/intern/source/bake.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c index 665361e7d14..f304ca517ad 100644 --- a/source/blender/render/intern/source/bake.c +++ b/source/blender/render/intern/source/bake.c @@ -1072,12 +1072,14 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up if (!ibuf) continue; - userdata = (BakeImBufuserData *) ibuf->userdata; - RE_bake_ibuf_filter(ibuf, userdata->mask_buffer, re->r.bake_filter); + if (userdata) { + userdata = (BakeImBufuserData *) ibuf->userdata; + RE_bake_ibuf_filter(ibuf, userdata->mask_buffer, re->r.bake_filter); - if (use_displacement_buffer) { - RE_bake_ibuf_normalize_displacement(ibuf, userdata->displacement_buffer, userdata->mask_buffer, - displacement_min, displacement_max); + if (use_displacement_buffer) { + RE_bake_ibuf_normalize_displacement(ibuf, userdata->displacement_buffer, userdata->mask_buffer, + displacement_min, displacement_max); + } } ibuf->userflags |= IB_BITMAPDIRTY; -- cgit v1.2.3 From 6ff014a7fe2621da897c7511fe100ea5ff2af2a9 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Wed, 6 Feb 2013 01:36:23 +0000 Subject: Bugfix [#34123] Armature "Switch Direction" doesn't work when selected bone belongs to more than one chain For example: /----->C A-->B-: \----->D If bone B is selected, then it would get operated on twice, creating the illusion that it had not been operated on. This is because we traverse up the chains (child to parent) as the EditBone structure only stores parent to children relationships only. A second invocation of this operator would then work fine, as all the links to other bones would have been removed, thus preventing further problems. Fixed by tagging bones that have been operated on. --- source/blender/editors/armature/editarmature.c | 101 +++++++++++++++---------- 1 file changed, 63 insertions(+), 38 deletions(-) (limited to 'source') diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index ca2fe48543a..fc38364577e 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3658,6 +3658,16 @@ void ARMATURE_OT_subdivide(wmOperatorType *ot) * easy to retrieve any hierarchical/chain relationships which are necessary for * this to be done easily. */ + +/* helper to clear BONE_TRANSFORM flags */ +static void armature_clear_swap_done_flags(bArmature *arm) +{ + EditBone *ebone; + + for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { + ebone->flag &= ~BONE_TRANSFORM; + } +} static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -3669,9 +3679,16 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)) /* get chains of bones (ends on chains) */ chains_find_tips(arm->edbo, &chains); if (chains.first == NULL) return OPERATOR_CANCELLED; - + + /* ensure that mirror bones will also be operated on */ armature_tag_select_mirrored(arm); - + + /* clear BONE_TRANSFORM flags + * - used to prevent duplicate/cancelling operations from occurring [#34123] + * - BONE_DONE cannot be used here as that's already used for mirroring + */ + armature_clear_swap_done_flags(arm); + /* loop over chains, only considering selected and visible bones */ for (chain = chains.first; chain; chain = chain->next) { EditBone *ebo, *child = NULL, *parent = NULL; @@ -3684,51 +3701,59 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)) */ parent = ebo->parent; - /* only if selected and editable */ - if (EBONE_VISIBLE(arm, ebo) && EBONE_EDITABLE(ebo)) { - /* swap head and tail coordinates */ - SWAP(float, ebo->head[0], ebo->tail[0]); - SWAP(float, ebo->head[1], ebo->tail[1]); - SWAP(float, ebo->head[2], ebo->tail[2]); - - /* do parent swapping: - * - use 'child' as new parent - * - connected flag is only set if points are coincidental - */ - ebo->parent = child; - if ((child) && equals_v3v3(ebo->head, child->tail)) - ebo->flag |= BONE_CONNECTED; - else - ebo->flag &= ~BONE_CONNECTED; - - /* get next bones - * - child will become the new parent of next bone - */ - child = ebo; - } - else { - /* not swapping this bone, however, if its 'parent' got swapped, unparent us from it - * as it will be facing in opposite direction - */ - if ((parent) && (EBONE_VISIBLE(arm, parent) && EBONE_EDITABLE(parent))) { - ebo->parent = NULL; - ebo->flag &= ~BONE_CONNECTED; + /* skip bone if already handled... [#34123] */ + if ((ebo->flag & BONE_TRANSFORM) == 0) { + /* only if selected and editable */ + if (EBONE_VISIBLE(arm, ebo) && EBONE_EDITABLE(ebo)) { + /* swap head and tail coordinates */ + SWAP(float, ebo->head[0], ebo->tail[0]); + SWAP(float, ebo->head[1], ebo->tail[1]); + SWAP(float, ebo->head[2], ebo->tail[2]); + + /* do parent swapping: + * - use 'child' as new parent + * - connected flag is only set if points are coincidental + */ + ebo->parent = child; + if ((child) && equals_v3v3(ebo->head, child->tail)) + ebo->flag |= BONE_CONNECTED; + else + ebo->flag &= ~BONE_CONNECTED; + + /* get next bones + * - child will become the new parent of next bone + */ + child = ebo; + } + else { + /* not swapping this bone, however, if its 'parent' got swapped, unparent us from it + * as it will be facing in opposite direction + */ + if ((parent) && (EBONE_VISIBLE(arm, parent) && EBONE_EDITABLE(parent))) { + ebo->parent = NULL; + ebo->flag &= ~BONE_CONNECTED; + } + + /* get next bones + * - child will become new parent of next bone (not swapping occurred, + * so set to NULL to prevent infinite-loop) + */ + child = NULL; } - /* get next bones - * - child will become new parent of next bone (not swapping occurred, - * so set to NULL to prevent infinite-loop) - */ - child = NULL; + /* tag as done (to prevent double-swaps) */ + ebo->flag |= BONE_TRANSFORM; } } } /* free chains */ BLI_freelistN(&chains); - + + /* clear temp flags */ + armature_clear_swap_done_flags(arm); armature_tag_unselect(arm); - + /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); -- cgit v1.2.3 From 441c7fb79a83b7d6f9e86cd2a3b0c8eaeec6d07c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 02:48:03 +0000 Subject: fix for crashes running some operators in background mode and some divide by zero errors. --- source/blender/blenkernel/intern/curve.c | 4 +++- source/blender/editors/armature/editarmature.c | 4 +++- source/blender/editors/mesh/editmesh_tools.c | 8 ++++--- source/blender/editors/object/object_add.c | 9 ++++--- source/blender/editors/object/object_transform.c | 8 ++++--- source/blender/editors/space_info/info_ops.c | 6 ++--- source/blender/editors/transform/transform.c | 30 +++++++++++++++++------- source/blender/render/intern/source/rayshade.c | 8 +++++-- 8 files changed, 52 insertions(+), 25 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 5f7662f5004..7d6212f8760 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -3436,7 +3436,9 @@ int BKE_curve_center_median(Curve *cu, float cent[3]) } } - mul_v3_fl(cent, 1.0f / (float)total); + if (total) { + mul_v3_fl(cent, 1.0f / (float)total); + } return (total != 0); } diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index fc38364577e..3bcb4002ece 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -563,7 +563,9 @@ void docenter_armature(Scene *scene, Object *ob, float cursor[3], int centermode add_v3_v3(cent, ebone->head); add_v3_v3(cent, ebone->tail); } - mul_v3_fl(cent, 1.0f / (float)total); + if (total) { + mul_v3_fl(cent, 1.0f / (float)total); + } } else { float min[3], max[3]; diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 3e8219bfd1c..7961a629405 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3955,9 +3955,11 @@ static int edbm_select_mirror_exec(bContext *C, wmOperator *op) BMEditMesh *em = BMEdit_FromObject(obedit); int extend = RNA_boolean_get(op->ptr, "extend"); - EDBM_select_mirrored(obedit, em, extend); - EDBM_selectmode_flush(em); - WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); + if (em->bm->totvert && em->bm->totvertsel) { + EDBM_select_mirrored(obedit, em, extend); + EDBM_selectmode_flush(em); + WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); + } return OPERATOR_FINISHED; } diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 3b2ddfe15ee..ffaa6f61cae 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -2005,7 +2005,8 @@ void OBJECT_OT_duplicate(wmOperatorType *ot) static int add_named_exec(bContext *C, wmOperator *op) { - wmEvent *event = CTX_wm_window(C)->eventstate; + wmWindow *win = CTX_wm_window(C); + wmEvent *event = win ? win->eventstate : NULL; Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); Base *basen, *base; @@ -2037,8 +2038,10 @@ static int add_named_exec(bContext *C, wmOperator *op) basen->lay = basen->object->lay = scene->lay; - ED_object_location_from_view(C, basen->object->loc); - ED_view3d_cursor3d_position(C, basen->object->loc, event->x, event->y); + if (event) { + ED_object_location_from_view(C, basen->object->loc); + ED_view3d_cursor3d_position(C, basen->object->loc, event->x, event->y); + } ED_base_object_activate(C, basen); diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index c7b611b3607..68075e7b6f9 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -700,9 +700,11 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) } else { if (around == V3D_CENTROID) { - const float total_div = 1.0f / (float)em->bm->totvert; - BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { - madd_v3_v3fl(cent, eve->co, total_div); + if (em->bm->totvert) { + const float total_div = 1.0f / (float)em->bm->totvert; + BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { + madd_v3_v3fl(cent, eve->co, total_div); + } } } else { diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c index 663d136fdf2..22668a3de3a 100644 --- a/source/blender/editors/space_info/info_ops.c +++ b/source/blender/editors/space_info/info_ops.c @@ -266,10 +266,10 @@ static int unpack_item_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); ID *id; - char idname[BKE_ST_MAXNAME]; + char idname[MAX_ID_NAME - 2]; int type = RNA_int_get(op->ptr, "id_type"); int method = RNA_enum_get(op->ptr, "method"); - + RNA_string_get(op->ptr, "id_name", idname); id = BKE_libblock_find_name(type, idname); @@ -319,7 +319,7 @@ void FILE_OT_unpack_item(wmOperatorType *ot) /* properties */ RNA_def_enum(ot->srna, "method", unpack_item_method_items, PF_USE_LOCAL, "Method", "How to unpack"); RNA_def_string(ot->srna, "id_name", "", BKE_ST_MAXNAME, "ID name", "Name of ID block to unpack"); - RNA_def_int(ot->srna, "id_type", 0, 0, INT_MAX, "ID Type", "Identifier type of ID block", 0, INT_MAX); + RNA_def_int(ot->srna, "id_type", ID_IM, 0, INT_MAX, "ID Type", "Identifier type of ID block", 0, INT_MAX); } diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 787791814cc..98d4c5e7b81 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -6023,7 +6023,7 @@ static int createVertSlideVerts(TransInfo *t) if (t->spacetype == SPACE_VIEW3D) { /* background mode support */ // v3d = t->sa ? t->sa->spacedata.first : NULL; - rv3d = t->ar ? t->ar->regiondata : NULL; + rv3d = ar ? ar->regiondata : NULL; } sld->is_proportional = true; @@ -6089,18 +6089,30 @@ static int createVertSlideVerts(TransInfo *t) if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN)) { BMVert *v_other = BM_edge_other_vert(e, v); copy_v3_v3(sv_array[j].co_link_orig_3d[k], v_other->co); - ED_view3d_project_float_v2_m4(ar, - sv_array[j].co_link_orig_3d[k], - sv_array[j].co_link_orig_2d[k], - projectMat); + if (ar) { + ED_view3d_project_float_v2_m4(ar, + sv_array[j].co_link_orig_3d[k], + sv_array[j].co_link_orig_2d[k], + projectMat); + } + else { + copy_v2_v2(sv_array[j].co_link_orig_2d[k], + sv_array[j].co_link_orig_3d[k]); + } k++; } } - ED_view3d_project_float_v2_m4(ar, - sv_array[j].co_orig_3d, - sv_array[j].co_orig_2d, - projectMat); + if (ar) { + ED_view3d_project_float_v2_m4(ar, + sv_array[j].co_orig_3d, + sv_array[j].co_orig_2d, + projectMat); + } + else { + copy_v2_v2(sv_array[j].co_orig_2d, + sv_array[j].co_orig_3d); + } j++; } diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index bef5902588c..fe23f31c6d7 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -433,14 +433,18 @@ void makeraytree(Render *re) * This is ONLY needed to kept a bogus behavior of SUN and HEMI lights */ INIT_MINMAX(min, max); RE_rayobject_merge_bb(re->raytree, min, max); + if (min[0] > max[0]) { /* empty raytree */ + zero_v3(min); + zero_v3(max); + } for (i=0; i<3; i++) { + /* TODO: explain why add top both min and max??? */ min[i] += 0.01f; max[i] += 0.01f; sub[i] = max[i]-min[i]; } - re->maxdist = dot_v3v3(sub, sub); - if (re->maxdist > 0.0f) re->maxdist= sqrt(re->maxdist); + re->maxdist = len_v3(sub); re->i.infostr= "Raytree finished"; re->stats_draw(re->sdh, &re->i); -- cgit v1.2.3 From 23bf087338204b45e5b72c1269bd013a88cf3f9d Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Wed, 6 Feb 2013 08:40:12 +0000 Subject: Code clean up translate node added constants. moved the code to a separate class. so it can be reused for other nodes --- source/blender/compositor/CMakeLists.txt | 2 + .../blender/compositor/nodes/COM_TranslateNode.cpp | 13 ++- .../operations/COM_TranslateOperation.cpp | 105 ------------------ .../compositor/operations/COM_TranslateOperation.h | 5 - .../compositor/operations/COM_WrapOperation.cpp | 117 +++++++++++++++++++++ .../compositor/operations/COM_WrapOperation.h | 47 +++++++++ source/blender/makesdna/DNA_node_types.h | 6 ++ source/blender/makesrna/intern/rna_nodetree.c | 8 +- 8 files changed, 187 insertions(+), 116 deletions(-) create mode 100644 source/blender/compositor/operations/COM_WrapOperation.cpp create mode 100644 source/blender/compositor/operations/COM_WrapOperation.h (limited to 'source') diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index efecf1a7565..ba897a87f97 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -580,6 +580,8 @@ set(SRC # Distort operation operations/COM_TranslateOperation.h operations/COM_TranslateOperation.cpp + operations/COM_WrapOperation.h + operations/COM_WrapOperation.cpp operations/COM_RotateOperation.h operations/COM_RotateOperation.cpp operations/COM_ScaleOperation.h diff --git a/source/blender/compositor/nodes/COM_TranslateNode.cpp b/source/blender/compositor/nodes/COM_TranslateNode.cpp index 887190b44b9..433ee2e5972 100644 --- a/source/blender/compositor/nodes/COM_TranslateNode.cpp +++ b/source/blender/compositor/nodes/COM_TranslateNode.cpp @@ -23,6 +23,7 @@ #include "COM_TranslateNode.h" #include "COM_TranslateOperation.h" +#include "COM_WrapOperation.h" #include "COM_ExecutionSystem.h" TranslateNode::TranslateNode(bNode *editorNode) : Node(editorNode) @@ -40,7 +41,16 @@ void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContex bNode *bnode = this->getbNode(); NodeTranslateData *data = (NodeTranslateData *)bnode->storage; - operation->setWrapping(data->wrap_axis); + + if (data->wrap_axis) { + WrapOperation *wrapOperation = new WrapOperation(); + wrapOperation->setWrapping(data->wrap_axis); + inputSocket->relinkConnections(wrapOperation->getInputSocket(0), 0, graph); + addLink(graph, wrapOperation->getOutputSocket(), operation->getInputSocket(0)); + graph->addOperation(wrapOperation); + } else { + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); + } if (data->relative) { const RenderData *rd = context->getRenderData(); @@ -50,7 +60,6 @@ void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContex operation->setFactorXY(fx, fy); } - inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); inputXSocket->relinkConnections(operation->getInputSocket(1), 1, graph); inputYSocket->relinkConnections(operation->getInputSocket(2), 2, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); diff --git a/source/blender/compositor/operations/COM_TranslateOperation.cpp b/source/blender/compositor/operations/COM_TranslateOperation.cpp index 32b9398094d..9f6924eb428 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.cpp +++ b/source/blender/compositor/operations/COM_TranslateOperation.cpp @@ -44,11 +44,6 @@ void TranslateOperation::initExecution() this->m_inputYOperation = this->getInputSocketReader(2); ensureDelta(); - - //Calculate the relative offset once per execution, no need to do this per pixel - this->m_relativeOffsetX = fmodf(this->getDeltaX(), this->getWidth()); - this->m_relativeOffsetY = fmodf(this->getDeltaY(), this->getHeight()); - } void TranslateOperation::deinitExecution() @@ -66,27 +61,7 @@ void TranslateOperation::executePixel(float output[4], float x, float y, PixelSa float originalXPos = x - this->getDeltaX(); float originalYPos = y - this->getDeltaY(); - switch (m_wrappingType) { - case 0: - //Intentionally empty, originalXPos and originalYPos have been set before - break; - case 1: - // wrap only on the x-axis - originalXPos = this->getWrappedOriginalXPos(x); - break; - case 2: - // wrap only on the y-axis - originalYPos = this->getWrappedOriginalYPos(y); - break; - case 3: - // wrap on both - originalXPos = this->getWrappedOriginalXPos(x); - originalYPos = this->getWrappedOriginalYPos(y); - break; - } - this->m_inputOperation->read(output, originalXPos, originalYPos, sampler); - } bool TranslateOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) @@ -100,89 +75,9 @@ bool TranslateOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe newInput.ymin = input->ymin - this->getDeltaY(); newInput.ymax = input->ymax - this->getDeltaY(); - if (m_wrappingType == 1 || m_wrappingType == 3) { - // wrap only on the x-axis if tile is wrapping - newInput.xmin = getWrappedOriginalXPos(input->xmin); - newInput.xmax = getWrappedOriginalXPos(input->xmax); - if (newInput.xmin > newInput.xmax) { - newInput.xmin = 0; - newInput.xmax = this->getWidth(); - } - } - if (m_wrappingType == 2 || m_wrappingType == 3) { - // wrap only on the y-axis if tile is wrapping - newInput.ymin = getWrappedOriginalYPos(input->ymin); - newInput.ymax = getWrappedOriginalYPos(input->ymax); - if (newInput.ymin > newInput.ymax) { - newInput.ymin = 0; - newInput.ymax = this->getHeight(); - } - } - - return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } -void TranslateOperation::setWrapping(char wrapping_type) -{ - m_wrappingType = wrapping_type; -} - -float TranslateOperation::getWrappedOriginalXPos(float x) -{ - float originalXPos = 0; - - // Positive offset: Append image data from the left - if (this->m_relativeOffsetX > 0) { - if (x < this->m_relativeOffsetX) { - originalXPos = this->getWidth() - this->m_relativeOffsetX + x; - } - else { - originalXPos = x - this->m_relativeOffsetX; - } - } - else { - // Negative offset: Append image data from the right - if (x < (this->getWidth() + this->m_relativeOffsetX)) { - originalXPos = x - this->m_relativeOffsetX; - } - else { - originalXPos = x - (this->getWidth() + this->m_relativeOffsetX); - } - } - - while (originalXPos < 0) originalXPos += this->m_width; - return fmodf(originalXPos, this->getWidth()); -} - - -float TranslateOperation::getWrappedOriginalYPos(float y) -{ - float originalYPos = 0; - - // Positive offset: Append image data from the bottom - if (this->m_relativeOffsetY > 0) { - if (y < this->m_relativeOffsetY) { - originalYPos = this->getHeight() - this->m_relativeOffsetY + y; - } - else { - originalYPos = y - this->m_relativeOffsetY; - } - } - else { - // Negative offset: Append image data from the top - if (y < (this->getHeight() + this->m_relativeOffsetY)) { - originalYPos = y - this->m_relativeOffsetY; - } - else { - originalYPos = y - (this->getHeight() + this->m_relativeOffsetY); - } - } - - while (originalYPos < 0) originalYPos += this->m_height; - return fmodf(originalYPos, this->getHeight()); -} - void TranslateOperation::setFactorXY(float factorX, float factorY) { m_factorX = factorX; diff --git a/source/blender/compositor/operations/COM_TranslateOperation.h b/source/blender/compositor/operations/COM_TranslateOperation.h index accca527400..d53c3e464fc 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.h +++ b/source/blender/compositor/operations/COM_TranslateOperation.h @@ -37,7 +37,6 @@ private: float m_relativeOffsetY; float m_factorX; float m_factorY; - char m_wrappingType; public: TranslateOperation(); bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); @@ -60,10 +59,6 @@ public: } } - void setWrapping(char wrapping_type); - float getWrappedOriginalXPos(float x); - float getWrappedOriginalYPos(float y); - void setFactorXY(float factorX, float factorY); }; diff --git a/source/blender/compositor/operations/COM_WrapOperation.cpp b/source/blender/compositor/operations/COM_WrapOperation.cpp new file mode 100644 index 00000000000..37a93520c7c --- /dev/null +++ b/source/blender/compositor/operations/COM_WrapOperation.cpp @@ -0,0 +1,117 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Thomas Beck (plasmasolutions.de) + */ + +#include "COM_WrapOperation.h" + +WrapOperation::WrapOperation() : NodeOperation() +{ + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->m_inputOperation = NULL; +} +void WrapOperation::initExecution() +{ + this->m_inputOperation = this->getInputSocketReader(0); +} + +void WrapOperation::deinitExecution() +{ + this->m_inputOperation = NULL; +} + +inline float WrapOperation::getWrappedOriginalXPos(float x) +{ + while (x < 0) x += this->m_width; + return fmodf(x, this->getWidth()); +} + +inline float WrapOperation::getWrappedOriginalYPos(float y) +{ + while (y < 0) y += this->m_height; + return fmodf(y, this->getHeight()); +} + +void WrapOperation::executePixel(float output[4], float x, float y, PixelSampler sampler) +{ + float nx, ny; + nx = x; + ny = y; + switch (m_wrappingType) { + case CMP_NODE_WRAP_NONE: + //Intentionally empty, originalXPos and originalYPos have been set before + break; + case CMP_NODE_WRAP_X: + // wrap only on the x-axis + nx = this->getWrappedOriginalXPos(x); + break; + case CMP_NODE_WRAP_Y: + // wrap only on the y-axis + ny = this->getWrappedOriginalYPos(y); + break; + case CMP_NODE_WRAP_XY: + // wrap on both + nx = this->getWrappedOriginalXPos(x); + ny = this->getWrappedOriginalYPos(y); + break; + } + + this->m_inputOperation->read(output, nx, ny, sampler); + +} + +bool WrapOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ + rcti newInput; + + newInput.xmin = input->xmin; + newInput.xmax = input->xmax; + newInput.ymin = input->ymin; + newInput.ymax = input->ymax; + + if (m_wrappingType == 1 || m_wrappingType == 3) { + // wrap only on the x-axis if tile is wrapping + newInput.xmin = getWrappedOriginalXPos(input->xmin); + newInput.xmax = getWrappedOriginalXPos(input->xmax); + if (newInput.xmin > newInput.xmax) { + newInput.xmin = 0; + newInput.xmax = this->getWidth(); + } + } + if (m_wrappingType == 2 || m_wrappingType == 3) { + // wrap only on the y-axis if tile is wrapping + newInput.ymin = getWrappedOriginalYPos(input->ymin); + newInput.ymax = getWrappedOriginalYPos(input->ymax); + if (newInput.ymin > newInput.ymax) { + newInput.ymin = 0; + newInput.ymax = this->getHeight(); + } + } + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} + +void WrapOperation::setWrapping(int wrapping_type) +{ + m_wrappingType = wrapping_type; +} diff --git a/source/blender/compositor/operations/COM_WrapOperation.h b/source/blender/compositor/operations/COM_WrapOperation.h new file mode 100644 index 00000000000..b84d85e7b5d --- /dev/null +++ b/source/blender/compositor/operations/COM_WrapOperation.h @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_WrapOperation_h_ +#define _COM_WrapOperation_h_ + +#include "COM_NodeOperation.h" + +class WrapOperation : public NodeOperation { +private: + SocketReader *m_inputOperation; + int m_wrappingType; +public: + WrapOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float output[4], float x, float y, PixelSampler sampler); + + void initExecution(); + void deinitExecution(); + + void setWrapping(int wrapping_type); + float getWrappedOriginalXPos(float x); + float getWrappedOriginalYPos(float y); + + void setFactorXY(float factorX, float factorY); +}; + +#endif diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 116b2327d29..7f2e388cd69 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -844,6 +844,12 @@ typedef struct NodeShaderNormalMap { #define CMP_NODE_BLUR_ASPECT_Y 1 #define CMP_NODE_BLUR_ASPECT_X 2 +/* wrapping */ +#define CMP_NODE_WRAP_NONE 0 +#define CMP_NODE_WRAP_X 1 +#define CMP_NODE_WRAP_Y 2 +#define CMP_NODE_WRAP_XY 3 + #define CMP_NODE_MASK_MBLUR_SAMPLES_MAX 64 #endif diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index fdae2979432..fee4b429a11 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -4228,10 +4228,10 @@ static void def_cmp_trackpos(StructRNA *srna) static void def_cmp_translate(StructRNA *srna) { static EnumPropertyItem translate_items[] = { - {0, "NONE", 0, "None", "No wrapping on X and Y"}, - {1, "XAXIS", 0, "X Axis", "Wrap all pixels on the X axis"}, - {2, "YAXIS", 0, "Y Axis", "Wrap all pixels on the Y axis"}, - {3, "BOTH", 0, "Both Axes", "Wrap all pixels on both axes"}, + {CMP_NODE_WRAP_NONE, "NONE", 0, "None", "No wrapping on X and Y"}, + {CMP_NODE_WRAP_X, "XAXIS", 0, "X Axis", "Wrap all pixels on the X axis"}, + {CMP_NODE_WRAP_Y, "YAXIS", 0, "Y Axis", "Wrap all pixels on the Y axis"}, + {CMP_NODE_WRAP_XY, "BOTH", 0, "Both Axes", "Wrap all pixels on both axes"}, {0, NULL, 0, NULL, NULL} }; -- cgit v1.2.3 From 2ea0826e7f8d1677e696df9097cb2322025a3b9a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 11:24:13 +0000 Subject: add more path debug prints when PATH_DEBUG is defined. --- source/blender/blenlib/intern/path_util.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index 06b1f1f09b1..5265d862ab8 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -848,7 +848,7 @@ const char *BLI_getDefaultDocumentFolder(void) /* ************************************************************* */ /* ************************************************************* */ -// #define PATH_DEBUG2 +// #define PATH_DEBUG static char *blender_version_decimal(const int ver) { @@ -871,14 +871,14 @@ static int test_path(char *targetpath, const char *path_base, const char *path_s BLI_strncpy(targetpath, tmppath, sizeof(tmppath)); if (BLI_is_dir(targetpath)) { -#ifdef PATH_DEBUG2 - printf("\tpath found: %s\n", targetpath); +#ifdef PATH_DEBUG + printf("\t%s found: %s\n", __func__, targetpath); #endif return 1; } else { -#ifdef PATH_DEBUG2 - printf("\tpath missing: %s\n", targetpath); +#ifdef PATH_DEBUG + printf("\t%s missing: %s\n", __func__, targetpath); #endif //targetpath[0] = '\0'; return 0; @@ -892,10 +892,16 @@ static int test_env_path(char *path, const char *envvar) if (BLI_is_dir(env)) { BLI_strncpy(path, env, FILE_MAX); +#ifdef PATH_DEBUG + printf("\t%s env %s found: %s\n", __func__, envvar, env); +#endif return 1; } else { path[0] = '\0'; +#ifdef PATH_DEBUG + printf("\t%s env %s missing: %s\n", __func__, envvar, env); +#endif return 0; } } @@ -904,8 +910,8 @@ static int get_path_local(char *targetpath, const char *folder_name, const char { char relfolder[FILE_MAX]; -#ifdef PATH_DEBUG2 - printf("get_path_local...\n"); +#ifdef PATH_DEBUG + printf("%s...\n", __func__); #endif if (folder_name) { @@ -964,8 +970,8 @@ static int get_path_user(char *targetpath, const char *folder_name, const char * if (!user_path[0]) return 0; -#ifdef PATH_DEBUG2 - printf("get_path_user: %s\n", user_path); +#ifdef PATH_DEBUG + printf("%s: %s\n", __func__, user_path); #endif if (subfolder_name) { @@ -1034,8 +1040,8 @@ static int get_path_system(char *targetpath, const char *folder_name, const char if (!system_path[0]) return 0; -#ifdef PATH_DEBUG2 - printf("get_path_system: %s\n", system_path); +#ifdef PATH_DEBUG + printf("%s: %s\n", __func__, system_path); #endif if (subfolder_name) { @@ -1174,7 +1180,7 @@ char *BLI_get_folder_version(const int id, const int ver, const int do_check) #ifdef PATH_DEBUG -#undef PATH_DEBUG +# undef PATH_DEBUG #endif void BLI_setenv(const char *env, const char *val) -- cgit v1.2.3 From f0ce8a563d71a659c6ed0398b8bf3c51a8109cd0 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 6 Feb 2013 12:16:53 +0000 Subject: Bugfix #34046 Linked Armature with local proxy, using feature "Custom shape at other bone" stopped working on undo/redo. It was actually a bug in the original commit (r26600, april 2010), storing a pointer from the library bone into the local proxy bone. That's strictly forbidden in Blender, but it never showed up because on every undo-redo a complete proxy-sync was called again. To allow undo/redo I had to disable this syncing, except for file load. Hence the feature got lost :) The fix is simple; just store the pointer to its own local bone instead. --- source/blender/blenkernel/intern/armature.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index b678ef6d93c..480814a28c3 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -1655,7 +1655,8 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected else { /* always copy custom shape */ pchan->custom = pchanp->custom; - pchan->custom_tx = pchanp->custom_tx; + if (pchanp->custom_tx) + pchan->custom_tx = BKE_pose_channel_find_name(pose, pchanp->custom_tx->name); /* ID-Property Syncing */ { -- cgit v1.2.3 From c80db5878b799890895fca7d595c830dd63603eb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 13:07:45 +0000 Subject: some fixes for building blender as a python module again (wip, more work needed). --- source/blender/python/generic/idprop_py_api.c | 2 +- source/creator/creator.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index 10ca7a943cb..f0db5358d0a 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -1497,7 +1497,7 @@ PyObject *BPyInit_idprop(void) mod = PyModule_Create(&IDProp_module_def); - /* bmesh.types */ + /* idprop.types */ PyModule_AddObject(mod, "types", (submodule = BPyInit_idprop_types())); PyDict_SetItemString(sys_modules, PyModule_GetName(submodule), submodule); Py_INCREF(submodule); diff --git a/source/creator/creator.c b/source/creator/creator.c index af1d9c544e4..0efbc2531d5 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -158,7 +158,10 @@ extern char build_system[]; #endif /* Local Function prototypes */ -#ifndef WITH_PYTHON_MODULE +#ifdef WITH_PYTHON_MODULE +int main_python_enter(int argc, const char **argv); +void main_python_exit(void); +#else static int print_help(int argc, const char **argv, void *data); static int print_version(int argc, const char **argv, void *data); #endif @@ -173,10 +176,10 @@ static int print_version(int argc, const char **argv, void *data); /* Initialize callbacks for the modules that need them */ static void setCallbacks(void); -static bool use_crash_handler = true; - #ifndef WITH_PYTHON_MODULE +static bool use_crash_handler = true; + /* set breakpoints here when running in debug mode, useful to catch floating point errors */ #if defined(__linux__) || defined(_WIN32) || defined(OSX_SSE_FPE) static void fpe_handler(int UNUSED(sig)) @@ -1469,12 +1472,14 @@ int main(int argc, const char **argv) setupArguments(C, ba, &syshandle); BLI_argsParse(ba, 1, NULL, NULL); -#endif if (use_crash_handler) { /* after parsing args */ signal(SIGSEGV, blender_crash_handler); } +#else + (void)syshandle; +#endif /* after level 1 args, this is so playanim skips RNA init */ RNA_init(); @@ -1486,7 +1491,6 @@ int main(int argc, const char **argv) #if defined(WITH_PYTHON_MODULE) || defined(WITH_HEADLESS) G.background = true; /* python module mode ALWAYS runs in background mode (for now) */ - (void)blender_esc; #else /* for all platforms, even windos has it! */ if (G.background) { -- cgit v1.2.3 From 12ef1b63e255b7387f7432d3266c33adcca5258c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 13:14:11 +0000 Subject: fix for building blender as a python module, changes to internal import behavior of py3.3 broke it. --- source/blender/python/generic/idprop_py_api.c | 2 ++ source/blender/python/intern/bpy_interface.c | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index f0db5358d0a..a0e2f1a0854 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -1454,6 +1454,8 @@ static PyObject *BPyInit_idprop_types(void) submodule = PyModule_Create(&IDProp_types_module_def); + IDProp_Init_Types(); + #define MODULE_TYPE_ADD(s, t) \ PyModule_AddObject(s, t.tp_name, (PyObject *)&t); Py_INCREF((PyObject *)&t) diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index e9fa00c7868..4f40382bdc4 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -310,11 +310,33 @@ void BPY_python_start(int argc, const char **argv) (void)argv; /* must run before python initializes */ - PyImport_ExtendInittab(bpy_internal_modules); + /* broken in py3.3, load explicitly below */ + // PyImport_ExtendInittab(bpy_internal_modules); #endif bpy_intern_string_init(); + +#ifdef WITH_PYTHON_MODULE + { + /* Manually load all modules */ + struct _inittab *inittab_item; + PyObject *sys_modules = PyImport_GetModuleDict(); + + for (inittab_item = bpy_internal_modules; inittab_item->name; inittab_item++) { + PyObject *mod = inittab_item->initfunc(); + if (mod) { + PyDict_SetItemString(sys_modules, inittab_item->name, mod); + } + else { + PyErr_Print(); + PyErr_Clear(); + } + // Py_DECREF(mod); /* ideally would decref, but in this case we never wan't to free */ + } + } +#endif + /* bpy.* and lets us import it */ BPy_init_modules(); -- cgit v1.2.3 From 8b1fb0fd2aac4a393cca8bb4e9fa21dc5f53cced Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 6 Feb 2013 13:59:54 +0000 Subject: Fix #34115, Group Node corrupted by frames. The group node operators offset nodes when moving them between node trees, but this should only be done for "free", un-parented nodes not attached to a frame, otherwise the node loc is relative to the parent node. --- source/blender/editors/space_node/node_group.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_node/node_group.c b/source/blender/editors/space_node/node_group.c index 7572ca04a33..943f12c4c54 100644 --- a/source/blender/editors/space_node/node_group.c +++ b/source/blender/editors/space_node/node_group.c @@ -457,8 +457,10 @@ static int node_group_ungroup(bNodeTree *ntree, bNode *gnode) /* ensure unique node name in the nodee tree */ nodeUniqueName(ntree, node); - node->locx += gnode->locx; - node->locy += gnode->locy; + if (!node->parent) { + node->locx += gnode->locx; + node->locy += gnode->locy; + } node->flag |= NODE_SELECT; } @@ -673,8 +675,10 @@ static int node_group_separate_selected(bNodeTree *ntree, bNode *gnode, int make /* ensure unique node name in the node tree */ nodeUniqueName(ntree, newnode); - newnode->locx += gnode->locx; - newnode->locy += gnode->locy; + if (!newnode->parent) { + newnode->locx += gnode->locx; + newnode->locy += gnode->locy; + } } else { /* ensure valid parent pointers, detach if child stays inside the group */ @@ -865,12 +869,14 @@ static int node_group_make_test(bNodeTree *ntree, bNode *gnode) static void node_get_selected_minmax(bNodeTree *ntree, bNode *gnode, float *min, float *max) { bNode *node; + float loc[2]; INIT_MINMAX2(min, max); for (node = ntree->nodes.first; node; node = node->next) { if (node == gnode) continue; if (node->flag & NODE_SELECT) { - minmax_v2v2_v2(min, max, &node->locx); + nodeToView(node, 0.0f, 0.0f, &loc[0], &loc[1]); + minmax_v2v2_v2(min, max, loc); } } } @@ -921,8 +927,10 @@ static int node_group_make_insert_selected(bNodeTree *ntree, bNode *gnode) /* ensure unique node name in the ngroup */ nodeUniqueName(ngroup, node); - node->locx -= 0.5f * (min[0] + max[0]); - node->locy -= 0.5f * (min[1] + max[1]); + if (!node->parent) { + node->locx -= 0.5f * (min[0] + max[0]); + node->locy -= 0.5f * (min[1] + max[1]); + } } else { /* if the parent is to be inserted but not the child, detach properly */ -- cgit v1.2.3 From 296444e1dc28db95642ab5a804b9b0df606a4725 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 14:02:19 +0000 Subject: style cleanup: some warnigs & spelling. --- source/blender/blenkernel/intern/brush.c | 2 +- source/blender/blenkernel/intern/displist.c | 2 +- source/blender/blenkernel/intern/editderivedmesh.c | 1 + source/blender/blenkernel/intern/mesh.c | 1 + source/blender/blenkernel/intern/nla.c | 6 +++--- source/blender/blenkernel/intern/pointcache.c | 2 +- source/blender/blenkernel/intern/rigidbody.c | 2 +- source/blender/blenkernel/intern/scene.c | 2 +- source/blender/bmesh/intern/bmesh_mesh.c | 2 +- source/blender/compositor/nodes/COM_TranslateNode.cpp | 3 ++- source/blender/editors/interface/interface_handlers.c | 2 +- source/blender/editors/screen/screen_ops.c | 2 +- source/blender/editors/space_file/filesel.c | 2 +- source/blender/makesrna/intern/rna_image_api.c | 4 ++-- source/blender/python/intern/bpy_interface.c | 2 +- 15 files changed, 19 insertions(+), 16 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 9a32a50ca00..2ce5053bdcc 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -656,7 +656,7 @@ void BKE_brush_imbuf_new(const Scene *scene, Brush *brush, short flt, short texf * available. my ussual solution to this is to use the * ratio of change of the size to change the unprojected * radius. Not completely convinced that is correct. - * In anycase, a better solution is needed to prevent + * In any case, a better solution is needed to prevent * inconsistency. */ void BKE_brush_size_set(Scene *scene, Brush *brush, int size) diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 08b107849b6..6f85d4de60e 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -759,7 +759,7 @@ static ModifierData *curve_get_tessellate_point(Scene *scene, Object *ob, int fo /* this modifiers are moving point of tessellation automatically * (some of them even can't be applied on tessellated curve), set flag - * for incformation button in modifier's header + * for information button in modifier's header */ md->mode |= eModifierMode_ApplyOnSpline; } diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index d41893b4335..d652b97e2fa 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -248,6 +248,7 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *em) totfilltri = BLI_scanfill_calc_ex(&sf_ctx, 0, efa->no); BLI_assert(totfilltri <= efa->len - 2); + (void)totfilltri; for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri = sf_tri->next) { BMLoop **l_ptr = looptris[i++]; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 20ccc33bc4e..21641e77b0b 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -2579,6 +2579,7 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata, totfilltri = BLI_scanfill_calc(&sf_ctx, 0); BLI_assert(totfilltri <= mp->totloop - 2); + (void)totfilltri; for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri = sf_tri->next, mf++) { mface_to_poly_map[mface_index] = poly_index; diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index 6f585198524..143f2186020 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -1447,9 +1447,9 @@ void BKE_nla_validate_state(AnimData *adt) if (strip->extendmode != NLASTRIP_EXTEND_NOTHING) { /* 1) First strip must be set to extend hold, otherwise, stuff before acts dodgy * 2) Only overwrite extend mode if *not* changing it will most probably result in - * occlusion problems, which will occur iff - * - blendmode = REPLACE - * - all channels the same (this is fiddly to test, so is currently assumed) + * occlusion problems, which will occur if... + * - blendmode = REPLACE + * - all channels the same (this is fiddly to test, so is currently assumed) * * Should fix problems such as [#29869] */ diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index ef096adc7a7..4302032ade1 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -1275,7 +1275,7 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup if (scene && (duplis-- > 0) && (ob->transflag & OB_DUPLI)) { ListBase *lb_dupli_ob; - /* don't update the dupli groups, we only wan't their pid's */ + /* don't update the dupli groups, we only want their pid's */ if ((lb_dupli_ob = object_duplilist_ex(scene, ob, FALSE, FALSE))) { DupliObject *dob; for (dob= lb_dupli_ob->first; dob; dob= dob->next) { diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 6789e3803ce..58afc658867 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -354,7 +354,7 @@ void BKE_rigidbody_validate_sim_shape(Object *ob, short rebuild) /* if automatically determining dimensions, use the Object's boundbox * - assume that all quadrics are standing upright on local z-axis * - assume even distribution of mass around the Object's pivot - * (i.e. Object pivot is centralised in boundbox) + * (i.e. Object pivot is centralized in boundbox) */ // XXX: all dimensions are auto-determined now... later can add stored settings for this /* get object dimensions without scaling */ diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 4ac9312d57d..30550edc007 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -716,7 +716,7 @@ void BKE_scene_unlink(Main *bmain, Scene *sce, Scene *newsce) } /* used by metaballs - * doesnt return the original duplicated object, only dupli's + * doesn't return the original duplicated object, only dupli's */ int BKE_scene_base_iter_next(Scene **scene, int val, Base **base, Object **ob) { diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index e72ad5dae3c..3c4fa490477 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -245,7 +245,7 @@ void BM_mesh_free(BMesh *bm) BM_mesh_data_free(bm); if (bm->py_handle) { - /* keep this out of 'BM_mesh_data_free' because we wan't python + /* keep this out of 'BM_mesh_data_free' because we want python * to be able to clear the mesh and maintain access. */ extern void bpy_bm_generic_invalidate(void *self); diff --git a/source/blender/compositor/nodes/COM_TranslateNode.cpp b/source/blender/compositor/nodes/COM_TranslateNode.cpp index 433ee2e5972..44d796c2911 100644 --- a/source/blender/compositor/nodes/COM_TranslateNode.cpp +++ b/source/blender/compositor/nodes/COM_TranslateNode.cpp @@ -48,7 +48,8 @@ void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContex inputSocket->relinkConnections(wrapOperation->getInputSocket(0), 0, graph); addLink(graph, wrapOperation->getOutputSocket(), operation->getInputSocket(0)); graph->addOperation(wrapOperation); - } else { + } + else { inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); } diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index c2ba69ae064..648857170ed 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -6973,7 +6973,7 @@ static int ui_handle_menus_recursive(bContext *C, const wmEvent *event, uiPopupB retval = ui_handle_menu_return_submenu(C, event, menu); submenu = NULL; /* hint not to use this, it may be freed by call above */ (void)submenu; - /* we may wan't to quit the submenu and handle the even in this menu, + /* we may want to quit the submenu and handle the even in this menu, * if its important to use it, check 'data->menu' first */ if ((retval == WM_UI_HANDLER_BREAK) && do_ret_out_parent) { retval = ui_handle_menu_event(C, event, menu, level); diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 2ace91b5e05..da2facc244a 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -360,7 +360,7 @@ int ED_operator_editarmature(bContext *C) /** * \brief check for pose mode (no mixed modes) * - * We wan't to enable most pose operations in weight paint mode, + * We want to enable most pose operations in weight paint mode, * when it comes to transforming bones, but managing bomes layers/groups * can be left for pose mode only. (not weight paint mode) */ diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index 778a3f4df3e..d33697bf5d6 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -95,7 +95,7 @@ FileSelectParams *ED_fileselect_get_params(struct SpaceFile *sfile) } /** - * \note RNA_struct_property_is_set_ex is used here because we wan't + * \note RNA_struct_property_is_set_ex is used here because we want * the previously used settings to be used here rather then overriding them */ short ED_fileselect_set_params(SpaceFile *sfile) { diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c index 686e6c80f1d..5d45e0d23b6 100644 --- a/source/blender/makesrna/intern/rna_image_api.c +++ b/source/blender/makesrna/intern/rna_image_api.c @@ -318,9 +318,9 @@ void RNA_api_image(StructRNA *srna) RNA_def_function_ui_description(func, "Delay the image from being cleaned from the cache due inactivity"); RNA_def_function_flag(func, FUNC_USE_REPORTS); RNA_def_int(func, "filter", GL_LINEAR_MIPMAP_NEAREST, -INT_MAX, INT_MAX, "Filter", - "The texture minifying function to use if the image wan't loaded", -INT_MAX, INT_MAX); + "The texture minifying function to use if the image wasn't loaded", -INT_MAX, INT_MAX); RNA_def_int(func, "mag", GL_LINEAR, -INT_MAX, INT_MAX, "Magnification", - "The texture magnification function to use if the image wan't loaded", -INT_MAX, INT_MAX); + "The texture magnification function to use if the image wasn't loaded", -INT_MAX, INT_MAX); /* return value */ parm = RNA_def_int(func, "error", 0, -INT_MAX, INT_MAX, "Error", "OpenGL error value", -INT_MAX, INT_MAX); RNA_def_function_return(func, parm); diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 4f40382bdc4..543ddebe61f 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -332,7 +332,7 @@ void BPY_python_start(int argc, const char **argv) PyErr_Print(); PyErr_Clear(); } - // Py_DECREF(mod); /* ideally would decref, but in this case we never wan't to free */ + // Py_DECREF(mod); /* ideally would decref, but in this case we never want to free */ } } #endif -- cgit v1.2.3 From c30fb009ccf23cd9dc78d342ebddc2286594c88a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 15:57:12 +0000 Subject: problem with own changes to triabgulate: calling beauty fill directly would re-allocate the faces which mean't triangulates output slots pointers became invalid. (noticed when using from py api) --- source/blender/bmesh/intern/bmesh_opdefines.c | 2 +- source/blender/bmesh/intern/bmesh_operators.c | 6 +++--- source/blender/bmesh/operators/bmo_triangulate.c | 14 ++++---------- source/blender/editors/mesh/editmesh_knife.c | 2 +- source/blender/editors/mesh/editmesh_tools.c | 16 ++++++++++++++-- 5 files changed, 23 insertions(+), 17 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 4147da82363..75439638fe1 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -1436,7 +1436,7 @@ static BMOpDefine bmo_beautify_fill_def = { "beautify_fill", /* slots_in */ {{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */ - {"constrain_edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* edges that can't be flipped */ + {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* edges that can be flipped */ {{'\0'}}, }, /* slots_out */ diff --git a/source/blender/bmesh/intern/bmesh_operators.c b/source/blender/bmesh/intern/bmesh_operators.c index 3308a014d25..98958596324 100644 --- a/source/blender/bmesh/intern/bmesh_operators.c +++ b/source/blender/bmesh/intern/bmesh_operators.c @@ -562,7 +562,7 @@ static int bmo_mesh_flag_count(BMesh *bm, const char htype, const short oflag, BMElemF *ele_f; int i; - BLI_assert(ELEM(true, false, test_for_enabled)); + BLI_assert((unsigned int)test_for_enabled <= 1); for (i = 0; i < 3; i++) { if (htype & flag_types[i]) { @@ -938,7 +938,7 @@ static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, int totelement, i = 0; BLI_assert(op->slots_in == slot_args || op->slots_out == slot_args); - BLI_assert(ELEM(true, false, test_for_enabled)); + BLI_assert((unsigned int)test_for_enabled <= 1); if (test_for_enabled) totelement = BMO_mesh_enabled_flag_count(bm, htype, oflag); @@ -1586,7 +1586,7 @@ static int bmo_opname_to_opcode(const char *opname) * **Utility** * * Pass an existing slot which is copied to either an input or output slot. - * Taking the operator and slot-name pair of args. + * Taking the operator and slot-name pair of args (BMOperator *, const char *). * - `s` - slot_in (lower case) * - `S` - slot_out (upper case) * diff --git a/source/blender/bmesh/operators/bmo_triangulate.c b/source/blender/bmesh/operators/bmo_triangulate.c index e06929e339d..1007e0529bf 100644 --- a/source/blender/bmesh/operators/bmo_triangulate.c +++ b/source/blender/bmesh/operators/bmo_triangulate.c @@ -51,12 +51,6 @@ void bmo_triangulate_exec(BMesh *bm, BMOperator *op) BM_mesh_triangulate(bm, use_beauty, true, op, slot_facemap_out); - if (use_beauty) { - BMO_op_callf(bm, op->flag, - "beautify_fill faces=%hf constrain_edges=%He", - BM_ELEM_TAG, BM_ELEM_TAG); - } - BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_TAG); BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "faces.out", BM_FACE, BM_ELEM_TAG); } @@ -69,7 +63,7 @@ void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op) BMEdge *e; int stop = 0; - BMO_slot_buffer_flag_enable(bm, op->slots_in, "constrain_edges", BM_EDGE, EDGE_MARK); + BMO_slot_buffer_flag_enable(bm, op->slots_in, "edges", BM_EDGE, EDGE_MARK); BMO_ITER (f, &siter, op->slots_in, "faces", BM_FACE) { if (f->len == 3) { @@ -83,7 +77,7 @@ void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op) BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { BMVert *v1, *v2, *v3, *v4; - if (!BM_edge_is_manifold(e) || BMO_elem_flag_test(bm, e, EDGE_MARK)) { + if (!BM_edge_is_manifold(e) || !BMO_elem_flag_test(bm, e, EDGE_MARK)) { continue; } @@ -123,7 +117,7 @@ void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op) if (fac1 > fac2) { e = BM_edge_rotate(bm, e, false, BM_EDGEROT_CHECK_EXISTS); if (e) { - BMO_elem_flag_enable(bm, e, ELE_NEW); + BMO_elem_flag_enable(bm, e, ELE_NEW | EDGE_MARK); BMO_elem_flag_enable(bm, e->l->f, FACE_MARK | ELE_NEW); BMO_elem_flag_enable(bm, e->l->radial_next->f, FACE_MARK | ELE_NEW); @@ -194,7 +188,7 @@ void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op) BLI_smallhash_release(&hash); /* clean up fill */ - BMO_op_initf(bm, &bmop, op->flag, "beautify_fill faces=%ff constrain_edges=%fe", ELE_NEW, EDGE_MARK); + BMO_op_initf(bm, &bmop, op->flag, "beautify_fill faces=%ff edges=%Fe", ELE_NEW, EDGE_MARK); BMO_op_exec(bm, &bmop); BMO_slot_buffer_flag_enable(bm, bmop.slots_out, "geom.out", BM_FACE | BM_EDGE, ELE_NEW); BMO_op_finish(bm, &bmop); diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c index e49dc3c28f9..3bf68a6d42d 100644 --- a/source/blender/editors/mesh/editmesh_knife.c +++ b/source/blender/editors/mesh/editmesh_knife.c @@ -1853,7 +1853,7 @@ static void remerge_faces(KnifeTool_OpData *kcd) BMOperator bmop; int idx; - BMO_op_initf(bm, &bmop, "beautify_fill faces=%ff constrain_edges=%fe", FACE_NEW, BOUNDARY); + BMO_op_initf(bm, &bmop, "beautify_fill faces=%ff edges=%Fe", FACE_NEW, BOUNDARY); BMO_op_exec(bm, &bmop); BMO_slot_buffer_flag_enable(bm, &bmop, "geom.out", BM_FACE, FACE_NEW); diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 7961a629405..cc09c85b32f 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3355,7 +3355,7 @@ static int edbm_beautify_fill_exec(bContext *C, wmOperator *op) Object *obedit = CTX_data_edit_object(C); BMEditMesh *em = BMEdit_FromObject(obedit); - if (!EDBM_op_callf(em, op, "beautify_fill faces=%hf", BM_ELEM_SELECT)) + if (!EDBM_op_callf(em, op, "beautify_fill faces=%hf edges=ae", BM_ELEM_SELECT)) return OPERATOR_CANCELLED; EDBM_update_generic(em, TRUE, TRUE); @@ -3384,10 +3384,22 @@ static int edbm_quads_convert_to_tris_exec(bContext *C, wmOperator *op) { Object *obedit = CTX_data_edit_object(C); BMEditMesh *em = BMEdit_FromObject(obedit); + BMOperator bmop; int use_beauty = RNA_boolean_get(op->ptr, "use_beauty"); - if (!EDBM_op_callf(em, op, "triangulate faces=%hf use_beauty=%b", BM_ELEM_SELECT, use_beauty)) + EDBM_op_init(em, &bmop, op, "triangulate faces=%hf use_beauty=%b", BM_ELEM_SELECT, use_beauty); + BMO_op_exec(em->bm, &bmop); + + /* now call beauty fill */ + if (use_beauty) { + EDBM_op_callf(em, op, + "beautify_fill faces=%S edges=%S", + &bmop, "faces.out", &bmop, "edges.out"); + } + + if (!EDBM_op_finish(em, &bmop, op, TRUE)) { return OPERATOR_CANCELLED; + } EDBM_update_generic(em, TRUE, TRUE); -- cgit v1.2.3 From a85355fdb9c8f6eefde27d7bc258efccd7bd79eb Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Feb 2013 20:49:33 +0000 Subject: Fix #34139: render display did not convert to straight alpha when dithering was enabled. --- source/blender/imbuf/intern/colormanagement.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index 8cb721e84f1..00a4699676d 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -2371,7 +2371,7 @@ static void partial_buffer_update_rect(ImBuf *ibuf, unsigned char *display_buffe int display_index = (ymin * display_stride + xmin) * channels; IMB_buffer_byte_from_float(display_buffer + display_index, display_buffer_float, channels, dither, - IB_PROFILE_SRGB, IB_PROFILE_SRGB, FALSE, width, height, display_stride, width); + IB_PROFILE_SRGB, IB_PROFILE_SRGB, TRUE, width, height, display_stride, width); MEM_freeN(display_buffer_float); } -- cgit v1.2.3 From 808c2d840e296ffb26750185b27a2eb94b9eee48 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 00:46:53 +0000 Subject: minor glitch in file selector, when opening with an operator sort wasn't set. --- source/blender/editors/space_file/filesel.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index d33697bf5d6..8c45b161d26 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -244,9 +244,11 @@ short ED_fileselect_set_params(SpaceFile *sfile) params->display = FILE_SHORTDISPLAY; params->filter = 0; params->filter_glob[0] = '\0'; - params->sort = FILE_SORT_ALPHA; } + /* operator has no setting for this */ + params->sort = FILE_SORT_ALPHA; + /* initialize the list with previous folders */ if (!sfile->folders_prev) -- cgit v1.2.3 From 07a3ebbd38650223f2a3ea06cf5ff778bdb5662a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 02:03:31 +0000 Subject: fix for annoyance where header menus would get scroller arrows added because it would be clamped within the screen a few pixels. This was caused from using theme shadow setting to clip the popups and a hard-coded value to translate the popup within screen bounds - these values should be the same. --- source/blender/editors/include/UI_interface.h | 3 +++ source/blender/editors/interface/interface.c | 15 ++++++++------- source/blender/editors/interface/interface_regions.c | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index c52b1ebb971..434fb58184f 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -85,6 +85,9 @@ typedef struct uiLayout uiLayout; #define UI_MAX_DRAW_STR 400 #define UI_MAX_NAME_STR 128 +/* use for clamping popups within the screen */ +#define UI_SCREEN_MARGIN 10 + /* uiBlock->dt */ #define UI_EMBOSS 0 /* use widget style for drawing */ #define UI_EMBOSSN 1 /* Nothing, only icon and/or text */ diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 2fc942dab27..4a5f3acad4f 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -319,6 +319,7 @@ static void ui_popup_bounds_block(const bContext *C, uiBlock *block, eBlockBound wmWindow *window = CTX_wm_window(C); int startx, starty, endx, endy, width, height, oldwidth, oldheight; int oldbounds, xmax, ymax; + const int margin = UI_SCREEN_MARGIN; oldbounds = block->bounds; @@ -356,20 +357,20 @@ static void ui_popup_bounds_block(const bContext *C, uiBlock *block, eBlockBound startx = window->eventstate->x + block->rect.xmin + (block->mx * width) / oldwidth; starty = window->eventstate->y + block->rect.ymin + (block->my * height) / oldheight; - if (startx < 10) - startx = 10; - if (starty < 10) - starty = 10; + if (startx < margin) + startx = margin; + if (starty < margin) + starty = margin; endx = startx + width; endy = starty + height; if (endx > xmax) { - endx = xmax - 10; + endx = xmax - margin; startx = endx - width; } - if (endy > ymax - 20) { - endy = ymax - 20; + if (endy > ymax - margin) { + endy = ymax - margin; starty = endy - height; } diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 939cb251960..9b2ed9f0984 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -1532,7 +1532,7 @@ static void ui_block_region_draw(const bContext *C, ARegion *ar) static void ui_popup_block_clip(wmWindow *window, uiBlock *block) { uiBut *bt; - int width = UI_ThemeMenuShadowWidth(); + int width = UI_SCREEN_MARGIN; int winx, winy; if (block->flag & UI_BLOCK_NO_WIN_CLIP) { -- cgit v1.2.3 From 0152d11e0116251b3ac91cec85141988bae938ec Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 02:50:35 +0000 Subject: when using blender as a python module, force factory-startup --- source/creator/creator.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source') diff --git a/source/creator/creator.c b/source/creator/creator.c index 0efbc2531d5..3260f0c3976 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -1478,6 +1478,7 @@ int main(int argc, const char **argv) signal(SIGSEGV, blender_crash_handler); } #else + G.factory_startup = true; /* using preferences or user startup makes no sense for py-as-module */ (void)syshandle; #endif -- cgit v1.2.3 From 8d47c2a2086251cc329f7d11ca4b102022e225da Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 04:04:12 +0000 Subject: fix for regression in bpy-api, python context passed to operators couldn't override collections. --- source/blender/python/intern/bpy_interface.c | 5 +++-- source/tests/batch_import.py | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 543ddebe61f..632018f2bf0 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -765,6 +765,7 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult * //result->ptr = ((BPy_StructRNA *)item)->ptr; CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data); + CTX_data_type_set(result, CTX_DATA_TYPE_POINTER); done = true; } else if (PySequence_Check(item)) { @@ -795,12 +796,12 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult * } Py_DECREF(seq_fast); - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); done = true; } } - if (done == 0) { + if (done == false) { if (item) printf("PyContext '%s' not a valid type\n", member); else printf("PyContext '%s' not found\n", member); } diff --git a/source/tests/batch_import.py b/source/tests/batch_import.py index 77595bd091f..a2c5fb59055 100644 --- a/source/tests/batch_import.py +++ b/source/tests/batch_import.py @@ -134,8 +134,7 @@ def batch_import(operator="", print("\tSaving: %r" % fout_blend) fout_dir = os.path.dirname(fout_blend) - if not os.path.exists(fout_dir): - os.makedirs(fout_dir) + os.makedirs(fout_dir, exist_ok=True) bpy.ops.wm.save_as_mainfile(filepath=fout_blend) -- cgit v1.2.3 From d648e036199ebb95fdc88945fe15144db302c121 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 7 Feb 2013 07:24:02 +0000 Subject: Fix #34145: 'Save Image' incorrect file type. Own mistake in 16bit PNG support, wrong bitmask for custom flags ftype really needs cleanup.. --- source/blender/imbuf/IMB_imbuf_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index 49e2e7fc80d..e30f1618c81 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -175,7 +175,7 @@ typedef struct ImBuf { * The bit flag is stored in the ImBuf.ftype variable. * Note that the lower 11 bits is used for storing custom flags */ -#define IB_CUSTOM_FLAGS_MASK 0x400 +#define IB_CUSTOM_FLAGS_MASK 0x7ff #define PNG (1 << 30) #define TGA (1 << 28) -- cgit v1.2.3 From 67da51fe768d3a336fe3ac90b813f548f566f390 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 7 Feb 2013 07:24:22 +0000 Subject: fix for [#34133] Creation of an RGBA buffer from an RGB color and an alpha channel not possible. --- source/blender/compositor/nodes/COM_SetAlphaNode.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/compositor/nodes/COM_SetAlphaNode.cpp b/source/blender/compositor/nodes/COM_SetAlphaNode.cpp index 709dc75b502..dd3ff5fbaa7 100644 --- a/source/blender/compositor/nodes/COM_SetAlphaNode.cpp +++ b/source/blender/compositor/nodes/COM_SetAlphaNode.cpp @@ -27,7 +27,11 @@ void SetAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { SetAlphaOperation *operation = new SetAlphaOperation(); - + + if (!this->getInputSocket(0)->isConnected() && this->getInputSocket(1)->isConnected()) { + operation->setResolutionInputSocketIndex(1); + } + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); -- cgit v1.2.3 From 95bca1c6bc379c073c0d933d72aeff7bcfdd2563 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 7 Feb 2013 14:15:30 +0000 Subject: Small UI annoyance: proxy build progress could is incorrect in some cases --- source/blender/blenkernel/intern/sequencer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 6f9299ce090..f1724bdfc6b 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -1434,7 +1434,7 @@ void BKE_sequencer_proxy_rebuild(SeqIndexBuildContext *context, short *stop, sho seq_proxy_build_frame(render_context, seq, cfra, 100); } - *progress = (float) cfra / (seq->enddisp - seq->endstill - seq->startdisp + seq->startstill); + *progress = (float) (cfra - seq->startdisp - seq->startstill) / (seq->enddisp - seq->endstill - seq->startdisp - seq->startstill); *do_update = TRUE; if (*stop || G.is_break) -- cgit v1.2.3 From 3a31e1ef27d48ed2841ae863754bf17d954ece35 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 14:41:08 +0000 Subject: start blender maximized on X11 - finding screen limits taking window borders, title bar, panels & multi-monitor is quite involved - without this size if often wrong. For sizes outside the screen bounds many window managers will ignore the requested size. Also opening maximized was default with 2.49. --- source/blender/windowmanager/intern/wm_window.c | 20 +++++++++++++++++++- source/blender/windowmanager/wm_window.h | 6 ++++++ 2 files changed, 25 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index caf4e2bd1ac..d8b987a196c 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -43,6 +43,7 @@ #include "GHOST_C-api.h" +#include "BLI_math.h" #include "BLI_blenlib.h" #include "BLI_utildefines.h" @@ -442,6 +443,13 @@ void wm_window_add_ghostwindows(wmWindowManager *wm) wm_init_state.start_x = 0; wm_init_state.start_y = 0; #endif + +#if !defined(__APPLE__) && !defined(WIN32) /* X11 */ + /* X11, start maximized but use default same size */ + wm_init_state.size_x = min_ii(wm_init_state.size_x, WM_WIN_INIT_SIZE_X); + wm_init_state.size_y = min_ii(wm_init_state.size_y, WM_WIN_INIT_SIZE_Y); +#endif + } for (win = wm->windows.first; win; win = win->next) { @@ -452,8 +460,18 @@ void wm_window_add_ghostwindows(wmWindowManager *wm) win->sizex = wm_init_state.size_x; win->sizey = wm_init_state.size_y; - /* we can't properly resize a maximized window */ +#if !defined(__APPLE__) && !defined(WIN32) /* X11 */ + if (wm_init_state.override_flag & WIN_OVERRIDE_GEOM) { + /* we can't properly resize a maximized window */ + win->windowstate = GHOST_kWindowStateNormal; + } + else { + /* loading without userpref, default to maximized */ + win->windowstate = GHOST_kWindowStateMaximized; + } +#else win->windowstate = GHOST_kWindowStateNormal; +#endif wm_init_state.override_flag &= ~WIN_OVERRIDE_GEOM; } diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h index 739ead27bdb..c4c64ed429f 100644 --- a/source/blender/windowmanager/wm_window.h +++ b/source/blender/windowmanager/wm_window.h @@ -69,5 +69,11 @@ void wm_window_testbreak (void); int wm_window_duplicate_exec(bContext *C, struct wmOperator *op); int wm_window_fullscreen_toggle_exec(bContext *C, struct wmOperator *op); +/* Initial (unmaximized) size to start with for + * systems that can't find it for themselves (X11). + * Clamped by real desktop limits */ +#define WM_WIN_INIT_SIZE_X 1800 +#define WM_WIN_INIT_SIZE_Y 1000 + #endif /* __WM_WINDOW_H__ */ -- cgit v1.2.3 From 7cb62127b36d82182642043c57ced97d7f804a69 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 7 Feb 2013 15:36:59 +0000 Subject: Fix #34156: Spec. and Alpha Intensity OpenGL issue Issue was caused by alpha pipeline cleanup: apparently depending on use_alpha flag different channels for spec/alpha would be used. Made it so talpha is computed from Image->ignore_alpha instead of always considering to be TRUTH. This is not so much trivial to understand what's going on here, but it's not new issue. Anyway, if someone have got ideas how to improve feedback here -- ideas are welcome! For now only regression is fixed. --- source/blender/gpu/intern/gpu_material.c | 2 +- source/blender/render/intern/source/imagetexture.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 9731d7a6b3a..b5ef27a338d 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -1035,7 +1035,7 @@ static void do_material_tex(GPUShadeInput *shi) GPU_link(mat, "mtex_image", texco, GPU_image(tex->ima, &tex->iuser, FALSE), &tin, &trgb); rgbnor= TEX_RGB; - talpha= 1; + talpha = (tex->ima->flag & IMA_IGNORE_ALPHA) == 0; } else { continue; diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c index 0a427d57ebc..55dadc14989 100644 --- a/source/blender/render/intern/source/imagetexture.c +++ b/source/blender/render/intern/source/imagetexture.c @@ -224,8 +224,10 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul } /* keep this before interpolation [#29761] */ - if ((tex->imaflag & TEX_CALCALPHA) == 0) { - texres->talpha = TRUE; + if (tex->ima && (tex->ima->flag & IMA_IGNORE_ALPHA) == 0) { + if ((tex->imaflag & TEX_CALCALPHA) == 0) { + texres->talpha = TRUE; + } } /* interpolate */ @@ -1092,8 +1094,10 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float tex /* mipmap test */ image_mipmap_test(tex, ibuf); - if ((tex->imaflag & TEX_CALCALPHA) == 0) - texres->talpha = 1; + if (tex->ima && (tex->ima->flag & IMA_IGNORE_ALPHA) == 0) { + if ((tex->imaflag & TEX_CALCALPHA) == 0) + texres->talpha = 1; + } texr.talpha = texres->talpha; if (tex->imaflag & TEX_IMAROT) { @@ -1506,8 +1510,10 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const /* mipmap test */ image_mipmap_test(tex, ibuf); - if ((tex->imaflag & TEX_CALCALPHA) == 0) { - texres->talpha = TRUE; + if (tex->ima && (tex->ima->flag & IMA_IGNORE_ALPHA) == 0) { + if ((tex->imaflag & TEX_CALCALPHA) == 0) { + texres->talpha = TRUE; + } } texr.talpha= texres->talpha; -- cgit v1.2.3 From faaee15407767812d0fc40adb5256e9d2919c35d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 7 Feb 2013 21:29:31 +0000 Subject: Fix part of #34083: crash trying to play surround .wav file in the game engine on Windows, it still doesn't play but it doesn't crash at least. --- source/gameengine/Ketsji/KX_SoundActuator.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp index 2a4f2b3e7d9..5438ae5a97c 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.cpp +++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp @@ -132,10 +132,13 @@ void KX_SoundActuator::play() handle3d->setConeVolumeOuter(m_3d.cone_outer_gain); } - if (loop) - m_handle->setLoopCount(-1); - m_handle->setPitch(m_pitch); - m_handle->setVolume(m_volume); + if (m_handle.get()) { + if (loop) + m_handle->setLoopCount(-1); + m_handle->setPitch(m_pitch); + m_handle->setVolume(m_volume); + } + m_isplaying = true; } -- cgit v1.2.3 From dbcf735636ad777db721532e30ea7a5050a17b86 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 00:27:35 +0000 Subject: fix warning message when imported Collada nodes have < 3 edges. --- source/blender/collada/MeshImporter.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp index 6d4e77f6a86..bf5a39cfae8 100644 --- a/source/blender/collada/MeshImporter.cpp +++ b/source/blender/collada/MeshImporter.cpp @@ -63,10 +63,9 @@ extern "C" { // get node name, or fall back to original id if not present (name is optional) template -static const char *bc_get_dae_name(T *node) +static const std::string bc_get_dae_name(T *node) { - const std::string& name = node->getName(); - return name.size() ? name.c_str() : node->getOriginalId().c_str(); + return node->getName().size() ? node->getName(): node->getOriginalId(); } static const char *bc_primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type) @@ -268,7 +267,7 @@ bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh) // checks if mesh has su { COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives(); - const char *name = bc_get_dae_name(mesh); + const std::string &name = bc_get_dae_name(mesh); for (unsigned i = 0; i < prim_arr.getCount(); i++) { @@ -287,7 +286,7 @@ bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh) // checks if mesh has su int count = vca[j]; if (count < 3) { fprintf(stderr, "Primitive %s in %s has at least one face with vertex count < 3\n", - type_str, name); + type_str, name.c_str()); return false; } } @@ -305,7 +304,7 @@ bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh) // checks if mesh has su } if (mesh->getPositions().empty()) { - fprintf(stderr, "Mesh %s has no vertices.\n", name); + fprintf(stderr, "Mesh %s has no vertices.\n", name.c_str()); return false; } @@ -1291,7 +1290,7 @@ bool MeshImporter::write_geometry(const COLLADAFW::Geometry *geom) COLLADAFW::Mesh *mesh = (COLLADAFW::Mesh *)geom; if (!is_nice_mesh(mesh)) { - fprintf(stderr, "Ignoring mesh %s\n", bc_get_dae_name(mesh)); + fprintf(stderr, "Ignoring mesh %s\n", bc_get_dae_name(mesh).c_str()); return true; } -- cgit v1.2.3 From 286d67b7145801fac588894b60a84ca0672ab2a9 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 00:28:58 +0000 Subject: fix null pointer issue when child nodes reference to unknown/invalid mesh --- source/blender/collada/DocumentImporter.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 49fb713ce06..fa181d4a6e9 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -448,13 +448,23 @@ void DocumentImporter::write_node(COLLADAFW::Node *node, COLLADAFW::Node *parent while (geom_done < geom.getCount()) { ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map, material_texture_mapping_map); - objects_done->push_back(ob); + if (ob == NULL) { + std::string id = node->getOriginalId(); + std::string name = node->getName(); + fprintf(stderr, + "...contains a reference to an unknown instance_mesh.\n", + id.c_str(), + name.c_str()); + } + else { + objects_done->push_back(ob); + } ++geom_done; } while (camera_done < camera.getCount()) { ob = create_camera_object(camera[camera_done], sce); if (ob == NULL) { - std::string id = node->getOriginalId(); + std::string id = node->getOriginalId(); std::string name = node->getName(); fprintf(stderr, "...contains a reference to an unknown instance_camera.\n", id.c_str(), name.c_str()); } @@ -537,6 +547,7 @@ void DocumentImporter::write_node(COLLADAFW::Node *node, COLLADAFW::Node *parent } // if node has child nodes write them COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes(); + ob = *objects_done->begin(); for (unsigned int i = 0; i < child_nodes.getCount(); i++) { write_node(child_nodes[i], node, sce, ob, is_library_node); } -- cgit v1.2.3 From cef952a750d86fe823bc0805032637f7a07394f5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 8 Feb 2013 04:43:36 +0000 Subject: fix for error in own recent commit, null check before assignment. --- source/blender/render/intern/source/bake.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c index f304ca517ad..cb6f9611bfd 100644 --- a/source/blender/render/intern/source/bake.c +++ b/source/blender/render/intern/source/bake.c @@ -1072,8 +1072,8 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up if (!ibuf) continue; + userdata = (BakeImBufuserData *)ibuf->userdata; if (userdata) { - userdata = (BakeImBufuserData *) ibuf->userdata; RE_bake_ibuf_filter(ibuf, userdata->mask_buffer, re->r.bake_filter); if (use_displacement_buffer) { -- cgit v1.2.3 From bc5df753aaaf116520d15df0aa53a054e6b1606a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 8 Feb 2013 08:18:44 +0000 Subject: Fix part #33935: Texture painting slow down with mouse, but not with tablet Issue is solved for painting on byte buffer with default sRGB display enabled. In this case it is possible to skip any color space transform and just apply dither if needed. Still not sure if there's a regression in painting on flaots or not, will continue investigation. --- source/blender/imbuf/intern/colormanagement.c | 126 ++++++++++++++++++-------- 1 file changed, 87 insertions(+), 39 deletions(-) (limited to 'source') diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index 00a4699676d..23804291a65 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -1353,6 +1353,23 @@ static void display_buffer_apply_threaded(ImBuf *ibuf, float *buffer, unsigned c display_buffer_init_handle, do_display_buffer_apply_thread); } +static int is_ibuf_rect_in_display_space(ImBuf *ibuf, const ColorManagedViewSettings *view_settings, + const ColorManagedDisplaySettings *display_settings) +{ + if ((view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) == 0 && + view_settings->exposure == 0.0f && + view_settings->gamma == 1.0f) + { + const char *from_colorspace = ibuf->rect_colorspace->name; + const char *to_colorspace = display_transform_get_colorspace_name(view_settings, display_settings); + + if (to_colorspace && !strcmp(from_colorspace, to_colorspace)) + return TRUE; + } + + return FALSE; +} + static void colormanage_display_buffer_process_ex(ImBuf *ibuf, float *display_buffer, unsigned char *display_buffer_byte, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings) @@ -1366,16 +1383,7 @@ static void colormanage_display_buffer_process_ex(ImBuf *ibuf, float *display_bu * computation noticeable faster */ if (ibuf->rect_float == NULL && ibuf->rect_colorspace) { - if ((view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) == 0 && - view_settings->exposure == 0.0f && - view_settings->gamma == 1.0f) - { - const char *from_colorspace = ibuf->rect_colorspace->name; - const char *to_colorspace = display_transform_get_colorspace_name(view_settings, display_settings); - - if (to_colorspace && !strcmp(from_colorspace, to_colorspace)) - skip_transform = TRUE; - } + skip_transform = is_ibuf_rect_in_display_space(ibuf, view_settings, display_settings); } if (skip_transform == FALSE) @@ -2332,37 +2340,67 @@ static void partial_buffer_update_rect(ImBuf *ibuf, unsigned char *display_buffe int is_data = ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA; if (dither != 0.0f) { + /* cm_processor is NULL in cases byte_buffer's space matches display + * buffer's space + * in this case we could skip extra transform and only apply dither + * use 4 channels for easier byte->float->byte conversion here so + * (this is only needed to apply dither, in other cases we'll convert + * byte buffer to display directly) + */ + if (!cm_processor) + channels = 4; + display_buffer_float = MEM_callocN(channels * width * height * sizeof(float), "display buffer for dither"); } - for (y = ymin; y < ymax; y++) { - for (x = xmin; x < xmax; x++) { - int display_index = (y * display_stride + x) * channels; - int linear_index = ((y - linear_offset_y) * linear_stride + (x - linear_offset_x)) * channels; - float pixel[4]; - - if (linear_buffer) { - copy_v4_v4(pixel, (float *) linear_buffer + linear_index); - } - else if (byte_buffer) { - rgba_uchar_to_float(pixel, byte_buffer + linear_index); - IMB_colormanagement_colorspace_to_scene_linear_v3(pixel, rect_colorspace); - straight_to_premul_v4(pixel); - } - - if (!is_data) { - IMB_colormanagement_processor_apply_v4_predivide(cm_processor, pixel); + if (cm_processor) { + for (y = ymin; y < ymax; y++) { + for (x = xmin; x < xmax; x++) { + int display_index = (y * display_stride + x) * channels; + int linear_index = ((y - linear_offset_y) * linear_stride + (x - linear_offset_x)) * channels; + float pixel[4]; + + if (linear_buffer) { + copy_v4_v4(pixel, (float *) linear_buffer + linear_index); + } + else if (byte_buffer) { + rgba_uchar_to_float(pixel, byte_buffer + linear_index); + IMB_colormanagement_colorspace_to_scene_linear_v3(pixel, rect_colorspace); + straight_to_premul_v4(pixel); + } + + if (!is_data) { + IMB_colormanagement_processor_apply_v4_predivide(cm_processor, pixel); + } + + if (display_buffer_float) { + int index = ((y - ymin) * width + (x - xmin)) * channels; + + copy_v4_v4(display_buffer_float + index, pixel); + } + else { + float pixel_straight[4]; + premul_to_straight_v4_v4(pixel_straight, pixel); + rgba_float_to_uchar(display_buffer + display_index, pixel_straight); + } } + } + } + else { + if (display_buffer_float) { + /* huh, for dither we need float buffer first, no cheaper way. currently */ + IMB_buffer_float_from_byte(display_buffer_float, byte_buffer, + IB_PROFILE_SRGB, IB_PROFILE_SRGB, TRUE, + width, height, width, display_stride); + } + else { + int i, width = xmax - xmin; - if (display_buffer_float) { - int index = ((y - ymin) * width + (x - xmin)) * channels; + for (i = ymin; i < ymax; i++) { + int byte_offset = (linear_stride * i + xmin) * 4; + int display_offset = (display_stride * i + xmin) * 4; - copy_v4_v4(display_buffer_float + index, pixel); - } - else { - float pixel_straight[4]; - premul_to_straight_v4_v4(pixel_straight, pixel); - rgba_float_to_uchar(display_buffer + display_index, pixel_straight); + memcpy(display_buffer + display_offset, byte_buffer + byte_offset, 4 * sizeof(char) * width); } } } @@ -2426,14 +2464,24 @@ void IMB_partial_display_buffer_update(ImBuf *ibuf, const float *linear_buffer, BLI_unlock_thread(LOCK_COLORMANAGE); if (display_buffer) { - ColormanageProcessor *cm_processor; + ColormanageProcessor *cm_processor = NULL; + int skip_transform = 0; + + /* byte buffer is assumed to be in imbuf's rect space, so if byte buffer + * is known we could skip display->linear->display conversion in case + * display color space matches imbuf's rect space + */ + if (byte_buffer != NULL) + skip_transform = is_ibuf_rect_in_display_space(ibuf, view_settings, display_settings); - cm_processor = IMB_colormanagement_display_processor_new(view_settings, display_settings); + if (!skip_transform) + cm_processor = IMB_colormanagement_display_processor_new(view_settings, display_settings); partial_buffer_update_rect(ibuf, display_buffer, linear_buffer, byte_buffer, buffer_width, stride, - offset_x, offset_y, cm_processor, xmin, ymin, xmax, ymax); + offset_x, offset_y, cm_processor, xmin, ymin, xmax, ymax); - IMB_colormanagement_processor_free(cm_processor); + if (cm_processor) + IMB_colormanagement_processor_free(cm_processor); IMB_display_buffer_release(cache_handle); } -- cgit v1.2.3 From c6865e823c4b8f5fc1b5ebe0e7e40227f5eb890c Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 8 Feb 2013 09:05:45 +0000 Subject: Fix #34165: Disappearing active marker label in timeline window Simply clamp label position from bottom. --- source/blender/editors/animation/anim_markers.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source') diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index ccd8309f794..62725cb6c70 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -41,6 +41,7 @@ #include "RNA_enum_types.h" #include "BLI_blenlib.h" +#include "BLI_math_base.h" #include "BLI_utildefines.h" #include "BKE_context.h" @@ -401,17 +402,22 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag) /* and the marker name too, shifted slightly to the top-right */ if (marker->name && marker->name[0]) { float x, y; + + /* minimal y coordinate which wouldn't be occluded by scroll */ + int min_y = 17.0f * UI_DPI_FAC; if (marker->flag & SELECT) { UI_ThemeColor(TH_TEXT_HI); x = xpos * xscale + 4.0f * UI_DPI_FAC; y = (ypixels <= 39.0f * UI_DPI_FAC) ? (ypixels - 10.0f * UI_DPI_FAC) : 29.0f * UI_DPI_FAC; + y = max_ii(y, min_y); } else { UI_ThemeColor(TH_TEXT); if ((marker->frame <= cfra) && (marker->frame + 5 > cfra)) { x = xpos * xscale + 8.0f * UI_DPI_FAC; y = (ypixels <= 39.0f * UI_DPI_FAC) ? (ypixels - 10.0f * UI_DPI_FAC) : 29.0f * UI_DPI_FAC; + y = max_ii(y, min_y); } else { x = xpos * xscale + 8.0f * UI_DPI_FAC; -- cgit v1.2.3 From 1dfb6404b78396988fedf5ad2bd111c6af13cf12 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 8 Feb 2013 12:12:57 +0000 Subject: Release todo: added userpref for Mac users having "Natural Scroll" set. As per discussion and analysis of all trackpad usage, we now follow this convention: - Blender follows system setting for trackpad direction preference. - If you set your system to "natural" scroll, we need to invert a couple of cases in Blender we do "natural" already. Like: - view rotate (the inversed option just never feels ok) - scroll active items in list or pulldown menu (up/down is absolute) - ALT+scroll values in buttons (up/down is absolute) The new User Preference setting "Trackpad Natural" handles this. For 2.66 we only have trackpad handling for OS X... so this isn't affecting trackpad usage in Windows and Linux, which stick to be mapped to Scroll Wheel still. (Note: viewrotate now is "natural" always, changing how it worked in the past weeks). --- source/blender/editors/interface/interface_handlers.c | 8 +++++++- source/blender/editors/space_view3d/view3d_edit.c | 8 ++++++-- source/blender/makesdna/DNA_userdef_types.h | 3 ++- source/blender/makesrna/intern/rna_userdef.c | 6 +++++- 4 files changed, 20 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 648857170ed..edd5b901ca1 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -237,8 +237,14 @@ void ui_pan_to_scroll(const wmEvent *event, int *type, int *val) lastdy += dy; if (ABS(lastdy) > (int)UI_UNIT_Y) { + int dy = event->prevy - event->y; + + if (U.uiflag2 & USER_TRACKPAD_NATURAL) + dy = -dy; + *val = KM_PRESS; - if (event->prevy - event->y > 0) + + if (dy > 0) *type = WHEELUPMOUSE; else *type = WHEELDOWNMOUSE; diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 562d1ec4b64..5c2e75776e4 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -921,8 +921,12 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event) } if (event->type == MOUSEPAN) { - /* invert it, trackpad scroll then follows how you mapped it globally */ - viewrotate_apply(vod, 2 * event->x - event->prevx, 2 * event->y - event->prevy); + /* Rotate direction we keep always same */ + if (U.uiflag2 & USER_TRACKPAD_NATURAL) + viewrotate_apply(vod, 2 * event->x - event->prevx, 2 * event->y - event->prevy); + else + viewrotate_apply(vod, event->prevx, event->prevy); + ED_view3d_depth_tag_update(rv3d); viewops_data_free(C, op); diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 861d44b214e..2d8d808198d 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -568,7 +568,8 @@ typedef enum eUserpref_UI_Flag { /* uiflag2 */ typedef enum eUserpref_UI_Flag2 { USER_KEEP_SESSION = (1 << 0), - USER_REGION_OVERLAP = (1 << 1) + USER_REGION_OVERLAP = (1 << 1), + USER_TRACKPAD_NATURAL = (1 << 2) } eUserpref_UI_Flag2; /* Auto-Keying mode */ diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 0def5988315..2b2f1a2469b 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -3549,7 +3549,6 @@ static void rna_def_userdef_system(BlenderRNA *brna) "Draw tool/property regions over the main region, when using Triple Buffer"); RNA_def_property_update(prop, 0, "rna_userdef_dpi_update"); - #ifdef WITH_CYCLES prop = RNA_def_property(srna, "compute_device_type", PROP_ENUM, PROP_NONE); RNA_def_property_flag(prop, PROP_ENUM_NO_CONTEXT); @@ -3755,6 +3754,11 @@ static void rna_def_userdef_input(BlenderRNA *brna) RNA_def_property_range(prop, 0, 32); RNA_def_property_ui_text(prop, "Wheel Scroll Lines", "Number of lines scrolled at a time with the mouse wheel"); + prop = RNA_def_property(srna, "use_trackpad_natural", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "uiflag2", USER_TRACKPAD_NATURAL); + RNA_def_property_ui_text(prop, "Trackpad Natural", + "If your system uses 'natural' scrolling, this option keeps consistent trackpad usage throughout the UI"); + prop = RNA_def_property(srna, "active_keyconfig", PROP_STRING, PROP_DIRPATH); RNA_def_property_string_sdna(prop, NULL, "keyconfigstr"); RNA_def_property_ui_text(prop, "Key Config", "The name of the active key configuration"); -- cgit v1.2.3 From fdd18c7a07053f8bcb561703bd2467c28e02a2d7 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 12:23:36 +0000 Subject: fixed collada import for objects which have NO children --- source/blender/collada/DocumentImporter.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index fa181d4a6e9..da19fe11783 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -547,9 +547,11 @@ void DocumentImporter::write_node(COLLADAFW::Node *node, COLLADAFW::Node *parent } // if node has child nodes write them COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes(); - ob = *objects_done->begin(); - for (unsigned int i = 0; i < child_nodes.getCount(); i++) { - write_node(child_nodes[i], node, sce, ob, is_library_node); + if (objects_done->size() > 0) { + ob = *objects_done->begin(); + for (unsigned int i = 0; i < child_nodes.getCount(); i++) { + write_node(child_nodes[i], node, sce, ob, is_library_node); + } } } -- cgit v1.2.3 From 8b37f4724f6d3046103eee8740a286cacf61f8d0 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 12:31:47 +0000 Subject: fix: #34051 Collada export crashes --- source/blender/collada/ControllerExporter.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp index c8307589af4..57047346617 100644 --- a/source/blender/collada/ControllerExporter.cpp +++ b/source/blender/collada/ControllerExporter.cpp @@ -246,10 +246,13 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm) float sumw = 0.0f; for (j = 0; j < vert->totweight; j++) { - int joint_index = joint_index_by_def_index[vert->dw[j].def_nr]; - if (joint_index != -1 && vert->dw[j].weight > 0.0f) { - jw[joint_index] += vert->dw[j].weight; - sumw += vert->dw[j].weight; + int idx = vert->dw[j].def_nr; + if (idx >= 0) { + int joint_index = joint_index_by_def_index[idx]; + if (joint_index != -1 && vert->dw[j].weight > 0.0f) { + jw[joint_index] += vert->dw[j].weight; + sumw += vert->dw[j].weight; + } } } -- cgit v1.2.3 From 66e160d5033e4d4924fb7f7219d993a1defc8855 Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Fri, 8 Feb 2013 13:51:29 +0000 Subject: Fix Knife cut-through bug #34072. --- source/blender/editors/mesh/editmesh_knife.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source') diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c index 3bf68a6d42d..bc7fe783e78 100644 --- a/source/blender/editors/mesh/editmesh_knife.c +++ b/source/blender/editors/mesh/editmesh_knife.c @@ -645,6 +645,7 @@ static void knife_get_vert_faces(KnifeTool_OpData *kcd, KnifeVert *kfv, BMFace * { BMIter bmiter; BMFace *f; + Ref *r; if (kfv->isface && facef) { knife_append_list(kcd, lst, facef); @@ -654,6 +655,11 @@ static void knife_get_vert_faces(KnifeTool_OpData *kcd, KnifeVert *kfv, BMFace * knife_append_list(kcd, lst, f); } } + else { + for (r = kfv->faces.first; r; r = r->next) { + knife_append_list(kcd, lst, r->ref); + } + } } static void knife_get_edge_faces(KnifeTool_OpData *kcd, KnifeEdge *kfe, ListBase *lst) @@ -780,6 +786,7 @@ static void knife_cut_through(KnifeTool_OpData *kcd) kcd->totlinehit = 0; /* set up for next cut */ + kcd->curr.vert = lastv; kcd->prev = kcd->curr; } -- cgit v1.2.3 From e6cd9ea087d7bc5e027d67fc328014b604fbe25d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 8 Feb 2013 14:29:38 +0000 Subject: RNA ui API: fix long-standing annoying glitches when using 'text' property of UI functions: * No context-aware at all. * Always translated (when i18n was enabled). Now, it will try tu use RNA struct/property context if available, unless you specify a context within optional "text_ctxt" parameter. And you can prevent translation by setting 'translate' parameter to False (is True by default). Will clean up code in a later commit (remove PROP_STRING_PY_TRANSLATE flag and related code), and also fix uilist templates to translate no more materials/textures/etc. names! --- source/blender/makesrna/intern/rna_ui_api.c | 201 ++++++++++++++++++++-- source/blenderplayer/bad_level_call_stubs/stubs.c | 1 + 2 files changed, 185 insertions(+), 17 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 787a5d6487e..82776894450 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -32,12 +32,17 @@ #include #include +#include "BLI_utildefines.h" + +#include "BLF_translation.h" + #include "RNA_define.h" #include "RNA_enum_types.h" #include "DNA_screen_types.h" #include "UI_resources.h" +#include "UI_interface.h" #include "UI_interface_icons.h" #include "rna_internal.h" @@ -55,9 +60,33 @@ EnumPropertyItem icon_items[] = { #ifdef RNA_RUNTIME -static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *name, int icon, - int expand, int slider, int toggle, int icon_only, int event, int full_event, - int emboss, int index) +static const char *rna_translate_ui_text(const char *text, const char *text_ctxt, StructRNA *type, PropertyRNA *prop, + int translate) +{ + if (!text || !text[0] || !translate) { + return text; + } + + /* If a text_ctxt is specified, use it! */ + if (text_ctxt && text_ctxt[0]) { + return CTX_IFACE_(text_ctxt, text); + } + + /* Else, if an RNA type or property is specified, use its context. */ + if (prop) { + return CTX_IFACE_(RNA_property_translation_context(prop), text); + } + if (type) { + return CTX_IFACE_(RNA_struct_translation_context(type), text); + } + + /* Else, no context! */ + return IFACE_(text); +} + +static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *name, const char *text_ctxt, + int translate, int icon, int expand, int slider, int toggle, int icon_only, int event, + int full_event, int emboss, int index) { PropertyRNA *prop = RNA_struct_find_property(ptr, propname); int flag = 0; @@ -67,6 +96,9 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, return; } + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate); + flag |= (slider) ? UI_ITEM_R_SLIDER : 0; flag |= (expand) ? UI_ITEM_R_EXPAND : 0; flag |= (toggle) ? UI_ITEM_R_TOGGLE : 0; @@ -78,15 +110,100 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, uiItemFullR(layout, ptr, prop, index, 0, flag, name, icon); } -static PointerRNA rna_uiItemO(uiLayout *layout, const char *opname, const char *name, int icon, int emboss) +static void rna_uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, + const char *text_ctxt, int translate, int icon) +{ + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); + + if (!prop) { + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); + return; + } + + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate); + + /* XXX This will search property again :( */ + uiItemMenuEnumR(layout, ptr, propname, name, icon); +} + +static void rna_uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, + const char *name, const char *text_ctxt, int translate, int icon) +{ + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); + + if (!prop) { + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); + return; + } + + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate); + + /* XXX This will search property again :( */ + uiItemEnumR_string(layout, ptr, propname, value, name, icon); +} + +static void rna_uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, + struct PointerRNA *searchptr, const char *searchpropname, + const char *name, const char *text_ctxt, int translate, int icon) +{ + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); + + if (!prop) { + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); + return; + } + + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate); + + /* XXX This will search property again :( */ + uiItemPointerR(layout, ptr, propname, searchptr, searchpropname, name, icon); +} + +static PointerRNA rna_uiItemO(uiLayout *layout, const char *opname, const char *name, const char *text_ctxt, + int translate, int icon, int emboss) { + wmOperatorType *ot = WM_operatortype_find(opname, 0); /* print error next */ + + if (!ot || !ot->srna) { + RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname); + return PointerRNA_NULL; + } + + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, ot->srna, NULL, translate); + int flag = UI_ITEM_O_RETURN_PROPS; flag |= (emboss) ? 0 : UI_ITEM_R_NO_BG; - return uiItemFullO(layout, opname, name, icon, NULL, uiLayoutGetOperatorContext(layout), flag); + + return uiItemFullO_ptr(layout, ot, name, icon, NULL, uiLayoutGetOperatorContext(layout), flag); } -static void rna_uiItemL(uiLayout *layout, const char *name, int icon, int icon_value) +static void rna_uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, const char *name, + const char *text_ctxt, int translate, int icon) { + wmOperatorType *ot = WM_operatortype_find(opname, 0); /* print error next */ + + if (!ot || !ot->srna) { + RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname); + return; + } + + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, ot->srna, NULL, translate); + + /* XXX This will search operator again :( */ + uiItemMenuEnumO(layout, opname, propname, name, icon); +} + +static void rna_uiItemL(uiLayout *layout, const char *name, const char *text_ctxt, int translate, + int icon, int icon_value) +{ + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, NULL, NULL, translate); + if (icon_value && !icon) { icon = icon_value; } @@ -94,6 +211,49 @@ static void rna_uiItemL(uiLayout *layout, const char *name, int icon, int icon_v uiItemL(layout, name, icon); } +static void rna_uiItemM(uiLayout *layout, bContext *C, const char *menuname, const char *name, const char *text_ctxt, + int translate, int icon) +{ + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, NULL, NULL, translate); + + uiItemM(layout, C, menuname, name, icon); +} + +static void rna_uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *proptypename, + const char *name, const char *text_ctxt, int translate) +{ + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); + + if (!prop) { + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); + return; + } + + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate); + + /* XXX This will search property again :( */ + uiTemplateAnyID(layout, ptr, propname, proptypename, name); +} + +static void rna_uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *root_ptr, + const char *name, const char *text_ctxt, int translate) +{ + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); + + if (!prop) { + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); + return; + } + + /* Get translated name (label). */ + name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate); + + /* XXX This will search property again :( */ + uiTemplatePathBuilder(layout, ptr, propname, root_ptr, name); +} + static int rna_ui_get_rnaptr_icon(bContext *C, PointerRNA *ptr_icon) { return UI_rnaptr_icon_get(C, ptr_icon, RNA_struct_ui_icon(ptr_icon->type), FALSE); @@ -192,11 +352,18 @@ static int rna_ui_get_enum_icon(bContext *C, PointerRNA *ptr, const char *propna #else +static void api_ui_item_common_text(FunctionRNA *func) +{ + RNA_def_string(func, "text", "", 0, "", "Override automatic text of the item"); + RNA_def_string(func, "text_ctxt", "", 0, "", "Override automatic translation context of the given text"); + RNA_def_boolean(func, "translate", true, "", "Translate the given text, when UI translation is enabled"); +} + static void api_ui_item_common(FunctionRNA *func) { PropertyRNA *prop; - RNA_def_string_py_translate(func, "text", "", 0, "", "Override automatic text of the item"); + api_ui_item_common_text(func); prop = RNA_def_property(func, "icon", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, icon_items); @@ -333,17 +500,17 @@ void RNA_api_ui_layout(StructRNA *srna) func = RNA_def_function(srna, "props_enum", "uiItemsEnumR"); api_ui_item_rna_common(func); - func = RNA_def_function(srna, "prop_menu_enum", "uiItemMenuEnumR"); + func = RNA_def_function(srna, "prop_menu_enum", "rna_uiItemMenuEnumR"); api_ui_item_rna_common(func); api_ui_item_common(func); - func = RNA_def_function(srna, "prop_enum", "uiItemEnumR_string"); + func = RNA_def_function(srna, "prop_enum", "rna_uiItemEnumR_string"); api_ui_item_rna_common(func); parm = RNA_def_string(func, "value", "", 0, "", "Enum property value"); RNA_def_property_flag(parm, PROP_REQUIRED); api_ui_item_common(func); - func = RNA_def_function(srna, "prop_search", "uiItemPointerR"); + func = RNA_def_function(srna, "prop_search", "rna_uiItemPointerR"); api_ui_item_rna_common(func); parm = RNA_def_pointer(func, "search_data", "AnyType", "", "Data from which to take collection to search in"); RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL); @@ -366,7 +533,7 @@ void RNA_api_ui_layout(StructRNA *srna) parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator"); RNA_def_property_flag(parm, PROP_REQUIRED); - func = RNA_def_function(srna, "operator_menu_enum", "uiItemMenuEnumO"); + func = RNA_def_function(srna, "operator_menu_enum", "rna_uiItemMenuEnumO"); api_ui_item_op(func); /* cant use api_ui_item_op_common because property must come right after */ parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator"); RNA_def_property_flag(parm, PROP_REQUIRED); @@ -415,13 +582,13 @@ void RNA_api_ui_layout(StructRNA *srna) func = RNA_def_function(srna, "label", "rna_uiItemL"); RNA_def_function_ui_description(func, "Item. Display text and/or icon in the layout"); - api_ui_item_common(func); + api_ui_item_common(func); parm = RNA_def_property(func, "icon_value", PROP_INT, PROP_UNSIGNED); RNA_def_property_ui_text(parm, "Icon Value", "Override automatic icon of the item " "(use it e.g. with custom material icons returned by icon()...)"); - func = RNA_def_function(srna, "menu", "uiItemM"); + func = RNA_def_function(srna, "menu", "rna_uiItemM"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); parm = RNA_def_string(func, "menu", "", 0, "", "Identifier of the menu"); api_ui_item_common(func); @@ -458,7 +625,7 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_int(func, "rows", 0, 0, INT_MAX, "Number of thumbnail preview rows to display", "", 0, INT_MAX); RNA_def_int(func, "cols", 0, 0, INT_MAX, "Number of thumbnail preview columns to display", "", 0, INT_MAX); - func = RNA_def_function(srna, "template_any_ID", "uiTemplateAnyID"); + func = RNA_def_function(srna, "template_any_ID", "rna_uiTemplateAnyID"); parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property"); RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL); parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in data"); @@ -466,16 +633,16 @@ void RNA_api_ui_layout(StructRNA *srna) parm = RNA_def_string(func, "type_property", "", 0, "", "Identifier of property in data giving the type of the ID-blocks to use"); RNA_def_property_flag(parm, PROP_REQUIRED); - RNA_def_string_py_translate(func, "text", "", 0, "", "Custom label to display in UI"); + api_ui_item_common_text(func); - func = RNA_def_function(srna, "template_path_builder", "uiTemplatePathBuilder"); + func = RNA_def_function(srna, "template_path_builder", "rna_uiTemplatePathBuilder"); parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property"); RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL); parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in data"); RNA_def_property_flag(parm, PROP_REQUIRED); parm = RNA_def_pointer(func, "root", "ID", "", "ID-block from which path is evaluated from"); RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR); - RNA_def_string_py_translate(func, "text", "", 0, "", "Custom label to display in UI"); + api_ui_item_common_text(func); func = RNA_def_function(srna, "template_modifier", "uiTemplateModifier"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 3692f00badc..82749ec041a 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -383,6 +383,7 @@ void make_editNurb(struct Object *obedit) {} void uiItemR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, int flag, char *name, int icon) {} struct PointerRNA uiItemFullO(struct uiLayout *layout, char *idname, char *name, int icon, struct IDProperty *properties, int context, int flag) {struct PointerRNA a = {{0}}; return a;} +PointerRNA uiItemFullO_ptr(struct uiLayout *layout, struct wmOperatorType *ot, const char *name, int icon, struct IDProperty *properties, int context, int flag) {struct PointerRNA a = {{0}}; return a;} struct uiLayout *uiLayoutRow(struct uiLayout *layout, int align) {return (struct uiLayout *) NULL;} struct uiLayout *uiLayoutColumn(struct uiLayout *layout, int align) {return (struct uiLayout *) NULL;} struct uiLayout *uiLayoutColumnFlow(struct uiLayout *layout, int number, int align) {return (struct uiLayout *) NULL;} -- cgit v1.2.3 From 95b28a65f366c4a1f571f35dabd79edaa94cfe51 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 8 Feb 2013 15:16:57 +0000 Subject: Cleanup: happily remove no-more-used PY_TRANSLATE RNA prop flag, and related code (just realized that flag value was wrong, probably own typo in a previous commit :/ ). That "trick" was nice when introduced, but it became kind of a pita since we added translation contexts... --- source/blender/blenlib/BLI_utildefines.h | 4 ++-- source/blender/makesrna/RNA_define.h | 1 - source/blender/makesrna/RNA_types.h | 7 +------ source/blender/makesrna/intern/rna_define.c | 15 --------------- source/blender/python/intern/bpy_rna.c | 11 ----------- 5 files changed, 3 insertions(+), 35 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 983fc421d46..95ad786c7c2 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -46,8 +46,8 @@ typedef bool _BLI_Bool; # else /* using char here may cause nasty tricky bugs, e.g. - * bool do_translate = RNA_property_flag(prop) & PROP_STRING_PY_TRANSLATE; - * as PROP_STRING_PY_TRANSLATE is farther than 8th bit, do_translate would be always false! + * bool is_bit_flag = RNA_property_flag(prop) & PROP_ENUM_FLAG; + * as PROP_ENUM_FLAG is farther than 8th bit, do_translate would be always false! */ # define _BLI_Bool unsigned int # endif diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h index 0d6e66904e7..5ab37c6d97b 100644 --- a/source/blender/makesrna/RNA_define.h +++ b/source/blender/makesrna/RNA_define.h @@ -88,7 +88,6 @@ PropertyRNA *RNA_def_string(StructOrFunctionRNA *cont, const char *identifier, c PropertyRNA *RNA_def_string_file_path(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description); PropertyRNA *RNA_def_string_dir_path(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description); PropertyRNA *RNA_def_string_file_name(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description); -PropertyRNA *RNA_def_string_py_translate(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description); PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description); PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description); diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index 300134fc8b6..d3cf7dc8095 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -143,7 +143,7 @@ typedef enum PropertySubType { } PropertySubType; /* Make sure enums are updated with thses */ -/* HIGHEST FLAG IN USE: 1 << 29 */ +/* HIGHEST FLAG IN USE: 1 << 28 */ typedef enum PropertyFlag { /* editable means the property is editable in the user * interface, properties are editable by default except @@ -200,11 +200,6 @@ typedef enum PropertyFlag { */ PROP_ENUM_FLAG = (1 << 21), - /* A string which should be translated when converting from py string to RNA prop. - * Should only be used in some functions' properties (currently only "text" one of funcs in UI API). - */ - PROP_STRING_PY_TRANSLATE = (1 << 28), - /* need context for update function */ PROP_CONTEXT_UPDATE = (1 << 22), PROP_CONTEXT_PROPERTY_UPDATE = (1 << 22) | (1 << 27), diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c index 2719016856d..c32255ac645 100644 --- a/source/blender/makesrna/intern/rna_define.c +++ b/source/blender/makesrna/intern/rna_define.c @@ -2574,21 +2574,6 @@ PropertyRNA *RNA_def_string_file_name(StructOrFunctionRNA *cont_, const char *id return prop; } -PropertyRNA *RNA_def_string_py_translate(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, - int maxlen, const char *ui_name, const char *ui_description) -{ - ContainerRNA *cont = cont_; - PropertyRNA *prop; - - prop = RNA_def_property(cont, identifier, PROP_STRING, PROP_NONE); - RNA_def_property_flag(prop, PROP_STRING_PY_TRANSLATE); - if (maxlen != 0) RNA_def_property_string_maxlength(prop, maxlen); - if (default_value) RNA_def_property_string_default(prop, default_value); - RNA_def_property_ui_text(prop, ui_name, ui_description); - - return prop; -} - PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description) { diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 78d6be6b539..19ec35ae357 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -1624,10 +1624,6 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb } else { /* Unicode String */ -#ifdef WITH_INTERNATIONAL - bool do_translate = RNA_property_flag(prop) & PROP_STRING_PY_TRANSLATE; -#endif /* WITH_INTERNATIONAL */ - #ifdef USE_STRING_COERCE PyObject *value_coerce = NULL; if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) { @@ -1641,13 +1637,6 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb param = _PyUnicode_AsString(value); #endif /* USE_STRING_COERCE */ - /* Any half-brained compiler should be able to optimize this out when WITH_INTERNATIONAL is off */ -#ifdef WITH_INTERNATIONAL - if (do_translate) { - param = IFACE_(param); - } -#endif - if (param == NULL) { if (PyUnicode_Check(value)) { /* there was an error assigning a string type, -- cgit v1.2.3 From 32a6a3eb63b80e47fb083d49814090b89541e9ab Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 8 Feb 2013 15:56:14 +0000 Subject: Fix #33747: do better backwards compatibility for image transparency changes. The use alpha option moved from the texture datablock to the image, and now it will duplicate the image datablock in case you have one texture using alpha and the other not. --- source/blender/blenkernel/BKE_image.h | 2 +- source/blender/blenkernel/intern/image.c | 9 +++-- source/blender/blenkernel/intern/library.c | 2 +- source/blender/blenloader/intern/readfile.c | 53 +++++++++++++++++++++++++++-- source/blender/makesdna/DNA_image_types.h | 2 +- 5 files changed, 59 insertions(+), 9 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index f098defb907..d12b048bc96 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -205,7 +205,7 @@ void BKE_image_memorypack(struct Image *ima); void BKE_image_print_memlist(void); /* empty image block, of similar type and filename */ -struct Image *BKE_image_copy(struct Image *ima); +struct Image *BKE_image_copy(struct Main *bmain, struct Image *ima); /* merge source into dest, and free source */ void BKE_image_merge(struct Image *dest, struct Image *source); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 39d76eb36f1..018cd25187a 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -323,9 +323,9 @@ static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int frame) } /* empty image block, of similar type and filename */ -Image *BKE_image_copy(Image *ima) +Image *BKE_image_copy(Main *bmain, Image *ima) { - Image *nima = image_alloc(G.main, ima->id.name + 2, ima->source, ima->type); + Image *nima = image_alloc(bmain, ima->id.name + 2, ima->source, ima->type); BLI_strncpy(nima->name, ima->name, sizeof(ima->name)); @@ -343,6 +343,9 @@ Image *BKE_image_copy(Image *ima) BKE_color_managed_colorspace_settings_copy(&nima->colorspace_settings, &ima->colorspace_settings); + if (ima->packedfile) + nima->packedfile = dupPackedFile(ima->packedfile); + return nima; } @@ -433,7 +436,7 @@ void BKE_image_make_local(struct Image *ima) extern_local_image(ima); } else if (is_local && is_lib) { - Image *ima_new = BKE_image_copy(ima); + Image *ima_new = BKE_image_copy(bmain, ima); ima_new->id.us = 0; diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index cd40f752b03..0c5e2b89cf7 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -312,7 +312,7 @@ int id_copy(ID *id, ID **newid, int test) if (!test) *newid = (ID *)BKE_texture_copy((Tex *)id); return 1; case ID_IM: - if (!test) *newid = (ID *)BKE_image_copy((Image *)id); + if (!test) *newid = (ID *)BKE_image_copy(G.main, (Image *)id); return 1; case ID_LT: if (!test) *newid = (ID *)BKE_lattice_copy((Lattice *)id); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 8a695ab4edb..1d76bef8dc1 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8644,8 +8644,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if (main->versionfile < 265 || (main->versionfile == 265 && main->subversionfile < 5)) { Scene *scene; - Image *image; - Tex *tex; + Image *image, *nimage; + Tex *tex, *otex; for (scene = main->scene.first; scene; scene = scene->id.next) { Sequence *seq; @@ -8664,16 +8664,63 @@ static void do_versions(FileData *fd, Library *lib, Main *main) for (image = main->image.first; image; image = image->id.next) { if (image->flag & IMA_DO_PREMUL) image->alpha_mode = IMA_ALPHA_STRAIGHT; + + image->flag &= ~IMA_DONE_TAG; } + /* use alpha flag moved from texture to image datablock */ for (tex = main->tex.first; tex; tex = tex->id.next) { if (tex->type == TEX_IMAGE && (tex->imaflag & TEX_USEALPHA) == 0) { image = blo_do_versions_newlibadr(fd, tex->id.lib, tex->ima); - if (image) + /* skip if no image or already tested */ + if (!image || (image->flag & (IMA_DONE_TAG|IMA_IGNORE_ALPHA))) + continue; + + image->flag |= IMA_DONE_TAG; + + /* we might have some textures using alpha and others not, so we check if + * they exist and duplicate the image datablock if necessary */ + for (otex = main->tex.first; otex; otex = otex->id.next) + if (otex->type == TEX_IMAGE && (otex->imaflag & TEX_USEALPHA)) + if (image == blo_do_versions_newlibadr(fd, otex->id.lib, otex->ima)) + break; + + if (otex) { + /* copy image datablock */ + nimage = BKE_image_copy(main, image); + nimage->flag |= IMA_IGNORE_ALPHA|IMA_DONE_TAG; + nimage->id.us--; + + /* we need to do some trickery to make file loading think + * this new datablock is part of file we're loading */ + blo_do_versions_oldnewmap_insert(fd->libmap, nimage, nimage, 0); + nimage->id.lib = image->id.lib; + nimage->id.flag |= (image->id.flag & LIB_NEED_LINK); + + /* assign new image, and update the users counts accordingly */ + for (otex = main->tex.first; otex; otex = otex->id.next) { + if (otex->type == TEX_IMAGE && (otex->imaflag & TEX_USEALPHA) == 0) { + if (image == blo_do_versions_newlibadr(fd, otex->id.lib, otex->ima)) { + if (!(otex->id.flag & LIB_NEED_LINK)) { + image->id.us--; + nimage->id.us++; + } + otex->ima = nimage; + break; + } + } + } + } + else { + /* no other textures using alpha, just set the flag */ image->flag |= IMA_IGNORE_ALPHA; + } } } + + for (image = main->image.first; image; image = image->id.next) + image->flag &= ~IMA_DONE_TAG; } if (main->versionfile < 265 || (main->versionfile == 265 && main->subversionfile < 7)) { diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index 0f47ee224ae..682f54481fc 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -125,7 +125,7 @@ typedef struct Image { #define IMA_DO_PREMUL 4 /* deprecated, should not be used */ #define IMA_REFLECT 16 #define IMA_NOCOLLECT 32 -#define IMA_DEPRECATED 64 +#define IMA_DONE_TAG 64 #define IMA_OLD_PREMUL 128 /*#define IMA_CM_PREDIVIDE 256*/ /* deprecated, should not be used */ #define IMA_USED_FOR_RENDER 512 -- cgit v1.2.3 From e092115e790f939417870f54636ec28f4b0fa19a Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 8 Feb 2013 16:18:24 +0000 Subject: Fix build (some code before var declaration... thought my compiler checked that???). --- source/blender/makesrna/intern/rna_ui_api.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 82776894450..4070e6c0a9f 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -165,8 +165,10 @@ static void rna_uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const c static PointerRNA rna_uiItemO(uiLayout *layout, const char *opname, const char *name, const char *text_ctxt, int translate, int icon, int emboss) { - wmOperatorType *ot = WM_operatortype_find(opname, 0); /* print error next */ + wmOperatorType *ot; + int flag; + ot = WM_operatortype_find(opname, 0); /* print error next */ if (!ot || !ot->srna) { RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname); return PointerRNA_NULL; @@ -175,7 +177,7 @@ static PointerRNA rna_uiItemO(uiLayout *layout, const char *opname, const char * /* Get translated name (label). */ name = rna_translate_ui_text(name, text_ctxt, ot->srna, NULL, translate); - int flag = UI_ITEM_O_RETURN_PROPS; + flag = UI_ITEM_O_RETURN_PROPS; flag |= (emboss) ? 0 : UI_ITEM_R_NO_BG; return uiItemFullO_ptr(layout, ot, name, icon, NULL, uiLayoutGetOperatorContext(layout), flag); -- cgit v1.2.3 From ebf18c6df927c0075dcc9057cf1774309d56464e Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 8 Feb 2013 16:25:35 +0000 Subject: Corrections to alpha pipeline do_versions Basically they're aimed to solve issues when scene with sky was used for compositing. If compo used alpha output result of current trunk would be completely different form hwo it was before. Two heuristics here: - If there's no world or world color is black, it completely equals to straight alpha mode, no further magic is needed to preserve compatibility - If scene is used as Render Layer node and something is connected to Alpha output of this node, ensure alpha mode for this scene is set to Premultiplied. Basically it shall give better compatibility and make 4K mango project just happy! :) --- source/blender/blenloader/intern/readfile.c | 18 +++++++++++++++++ source/blender/render/intern/source/pipeline.c | 28 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) (limited to 'source') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 1d76bef8dc1..93bc0502b19 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8649,6 +8649,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) for (scene = main->scene.first; scene; scene = scene->id.next) { Sequence *seq; + bool set_premul = false; SEQ_BEGIN (scene->ed, seq) { @@ -8659,6 +8660,23 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if (scene->r.bake_samples == 0) scene->r.bake_samples = 256; + + if (scene->world) { + World *world = blo_do_versions_newlibadr(fd, scene->id.lib, scene->world); + + if (is_zero_v3(&world->horr)) { + if ((world->skytype & WO_SKYBLEND) == 0 || is_zero_v3(&world->zenr)) { + set_premul = true; + } + } + } + else + set_premul = true; + + if (set_premul) { + printf("2.66 versioning fix: replacing black sky with premultiplied alpha for scene %s\n", scene->id.name + 2); + scene->r.alphamode = R_ALPHAPREMUL; + } } for (image = main->image.first; image; image = image->id.next) { diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 2c90110b458..d2b47a7bf4d 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1355,6 +1355,19 @@ static int composite_needs_render(Scene *sce, int this_scene) return 0; } +static bool rlayer_node_uses_alpha(bNodeTree *ntree, bNode *node) +{ + bNodeSocket *sock; + + for (sock = node->outputs.first; sock; sock = sock->next) { + /* Weak! but how to make it better? */ + if (!strcmp(sock->name, "Alpha") && nodeCountSocketLinks(ntree, sock) > 0) + return true; + } + + return false; +} + static void tag_scenes_for_render(Render *re) { bNode *node; @@ -1372,6 +1385,21 @@ static void tag_scenes_for_render(Render *re) for (node = re->scene->nodetree->nodes.first; node; node = node->next) { if (node->type == CMP_NODE_R_LAYERS) { if (node->id) { + if (!MAIN_VERSION_ATLEAST(re->main, 265, 5)) { + if (rlayer_node_uses_alpha(re->scene->nodetree, node)) { + Scene *scene = (Scene*) node->id; + + if (scene->r.alphamode != R_ALPHAPREMUL) { + BKE_reportf(re->reports, RPT_WARNING, "Setting scene %s alpha mode to Premul\n", scene->id.name + 2); + + /* also print, so feedback is immediate */ + printf("2.66 versioning fix: setting scene %s alpha mode to Premul\n", scene->id.name + 2); + + scene->r.alphamode = R_ALPHAPREMUL; + } + } + } + if (node->id != (ID *)re->scene) node->id->flag |= LIB_DOIT; } -- cgit v1.2.3 From deeeaed3d858cf8be7d9fba294e96db3778aa587 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 19:52:02 +0000 Subject: [#33955] Collada Model Import Hangs Blender. Optimized Object import for better performance. Added logging messages --- source/blender/collada/DocumentImporter.cpp | 18 ++++++++++++++++-- source/blender/collada/collada_utils.cpp | 3 +++ 2 files changed, 19 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index da19fe11783..835812fddbb 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -76,6 +76,9 @@ extern "C" { #include "MEM_guardedalloc.h" +#include "WM_api.h" +#include "WM_types.h" + } #include "ExtraHandler.h" @@ -207,6 +210,12 @@ void DocumentImporter::finish() for (unsigned int i = 0; i < roots.getCount(); i++) { write_node(roots[i], NULL, sce, NULL, false); } + + Main *bmain = CTX_data_main(mContext); + DAG_scene_sort(bmain, sce); + DAG_ids_flush_update(bmain, 0); + WM_event_add_notifier(mContext, NC_OBJECT | ND_TRANSFORM, NULL); + } @@ -424,9 +433,16 @@ void DocumentImporter::write_node(COLLADAFW::Node *node, COLLADAFW::Node *parent Object *ob = NULL; bool is_joint = node->getType() == COLLADAFW::Node::JOINT; bool read_transform = true; + std::string id = node->getOriginalId(); + std::string name = node->getName(); std::vector *objects_done = new std::vector(); + fprintf(stderr, + "Writing node id='%s', name='%s'\n", + id.c_str(), + name.c_str()); + if (is_joint) { armature_importer.add_joint(node, parent_node == NULL || parent_node->getType() != COLLADAFW::Node::JOINT, par, sce); } @@ -449,8 +465,6 @@ void DocumentImporter::write_node(COLLADAFW::Node *node, COLLADAFW::Node *parent ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map, material_texture_mapping_map); if (ob == NULL) { - std::string id = node->getOriginalId(); - std::string name = node->getName(); fprintf(stderr, "...contains a reference to an unknown instance_mesh.\n", id.c_str(), diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index 58e6301a084..9fdca048177 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -116,9 +116,12 @@ int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space) ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA; par->recalc |= OB_RECALC_OB; + /** done once after import DAG_scene_sort(bmain, sce); DAG_ids_flush_update(bmain, 0); WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); + */ + return true; } -- cgit v1.2.3 From e3488af838e6c43e5e3d9635d7604ab04f5a9b27 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Sat, 9 Feb 2013 00:23:59 +0000 Subject: fixed: [#34080] import of COLLADA breaks on '#' in filepath --- source/blender/collada/DocumentImporter.cpp | 6 ++++-- source/blender/collada/collada_utils.cpp | 17 +++++++++++++++++ source/blender/collada/collada_utils.h | 3 +++ 3 files changed, 24 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 835812fddbb..a234d85bc6f 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -131,7 +131,8 @@ bool DocumentImporter::import() // deselect all to select new objects BKE_scene_base_deselect_all(CTX_data_scene(mContext)); - if (!root.loadDocument(mFilename)) { + const std::string encodedFilename = bc_url_encode(mFilename); + if (!root.loadDocument(encodedFilename)) { fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 1st pass\n"); return false; } @@ -146,7 +147,7 @@ bool DocumentImporter::import() COLLADASaxFWL::Loader loader2; COLLADAFW::Root root2(&loader2, this); - if (!root2.loadDocument(mFilename)) { + if (!root2.loadDocument(encodedFilename)) { fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 2nd pass\n"); return false; } @@ -1235,3 +1236,4 @@ bool DocumentImporter::is_armature(COLLADAFW::Node *node){ return false; } + diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index 9fdca048177..27af5c0aba2 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -286,3 +286,20 @@ int bc_get_active_UVLayer(Object *ob) Mesh *me = (Mesh *)ob->data; return CustomData_get_active_layer_index(&me->fdata, CD_MTFACE); } + +std::string bc_url_encode(std::string data) { + /* XXX We probably do not need to do a full encoding. + But in case that is necessary,then it can be added here. + */ + return bc_replace_string(data,"#", "%23"); +} + +std::string bc_replace_string(std::string data, const std::string& pattern, + const std::string& replacement) { + size_t pos = 0; + while((pos = data.find(pattern, pos)) != std::string::npos) { + data.replace(pos, pattern.length(), replacement); + pos += replacement.length(); + } + return data; +} \ No newline at end of file diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h index b8990c3fcdd..90282d9d28f 100644 --- a/source/blender/collada/collada_utils.h +++ b/source/blender/collada/collada_utils.h @@ -77,4 +77,7 @@ extern void bc_bubble_sort_by_Object_name(LinkNode *export_set); extern bool bc_is_root_bone(Bone *aBone, bool deform_bones_only); extern int bc_get_active_UVLayer(Object *ob); +extern std::string bc_replace_string(std::string data, const std::string& pattern, const std::string& replacement); +extern std::string bc_url_encode(std::string data); + #endif -- cgit v1.2.3 From 8eabdad3aa7a135e9817e1860dad94e6c86974cf Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Sat, 9 Feb 2013 06:32:17 +0000 Subject: BGE: Fix to make KX_CharacterWrapper.jumpCount work a bit smoother. Previously jumpCount was only getting reset to 0 if the character was on the ground while jump() was being called. This works alright internally for double jumping, but it made things awkward if a user wanted to check jumpCount before calling jump() (i.e., before jumpCount was updated). --- source/gameengine/Physics/Bullet/CcdPhysicsController.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 01c56b43f4f..0de21e33eff 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -78,6 +78,9 @@ BlenderBulletCharacterController::BlenderBulletCharacterController(btMotionState void BlenderBulletCharacterController::updateAction(btCollisionWorld *collisionWorld, btScalar dt) { + if (onGround()) + m_jumps = 0; + btKinematicCharacterController::updateAction(collisionWorld,dt); m_motionState->setWorldTransform(getGhostObject()->getWorldTransform()); } @@ -104,9 +107,6 @@ bool BlenderBulletCharacterController::canJump() const void BlenderBulletCharacterController::jump() { - if (onGround()) - m_jumps = 0; - if (!canJump()) return; -- cgit v1.2.3 From 2eab18dc324dea3d517937845534bc30992a733b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 07:14:42 +0000 Subject: code cleanup: use const for matrix functions vector args. --- source/blender/blenlib/BLI_math_matrix.h | 6 +++--- source/blender/blenlib/intern/math_matrix.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index c66536bc0e5..a5ab2373b89 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -90,12 +90,12 @@ void mul_m4_v3(float M[4][4], float r[3]); void mul_v3_m4v3(float r[3], float M[4][4], const float v[3]); void mul_mat3_m4_v3(float M[4][4], float r[3]); void mul_m4_v4(float M[4][4], float r[4]); -void mul_v4_m4v4(float r[4], float M[4][4], float v[4]); +void mul_v4_m4v4(float r[4], float M[4][4], const float v[4]); void mul_project_m4_v3(float M[4][4], float vec[3]); void mul_m3_v3(float M[3][3], float r[3]); -void mul_v3_m3v3(float r[3], float M[3][3], float a[3]); -void mul_v2_m3v3(float r[2], float M[3][3], float a[3]); +void mul_v3_m3v3(float r[3], float M[3][3], const float a[3]); +void mul_v2_m3v3(float r[2], float M[3][3], const float a[3]); void mul_transposed_m3_v3(float M[3][3], float r[3]); void mul_m3_v3_double(float M[3][3], double r[3]); diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index d31916c43c1..5c443b9b1f3 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -366,7 +366,7 @@ void mul_project_m4_v3(float mat[4][4], float vec[3]) vec[2] /= w; } -void mul_v4_m4v4(float r[4], float mat[4][4], float v[4]) +void mul_v4_m4v4(float r[4], float mat[4][4], const float v[4]) { float x, y, z; @@ -404,14 +404,14 @@ void mul_m4_v4d(float mat[4][4], double r[4]) mul_v4d_m4v4d(r, mat, r); } -void mul_v3_m3v3(float r[3], float M[3][3], float a[3]) +void mul_v3_m3v3(float r[3], float M[3][3], const float a[3]) { r[0] = M[0][0] * a[0] + M[1][0] * a[1] + M[2][0] * a[2]; r[1] = M[0][1] * a[0] + M[1][1] * a[1] + M[2][1] * a[2]; r[2] = M[0][2] * a[0] + M[1][2] * a[1] + M[2][2] * a[2]; } -void mul_v2_m3v3(float r[2], float M[3][3], float a[3]) +void mul_v2_m3v3(float r[2], float M[3][3], const float a[3]) { r[0] = M[0][0] * a[0] + M[1][0] * a[1] + M[2][0] * a[2]; r[1] = M[0][1] * a[0] + M[1][1] * a[1] + M[2][1] * a[2]; -- cgit v1.2.3 From d03befd0dbe97b8b72817137c1b76e6396262292 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 07:59:56 +0000 Subject: fix for is_quad_convex_v3(), getting the dominant axis wasn't accurate enough in some cases and would make beauty fill fail. now rotate the coords before calculation. --- source/blender/blenlib/BLI_math_geom.h | 1 + source/blender/blenlib/intern/math_geom.c | 64 +++++++++++++++++++++++------ source/blender/bmesh/intern/bmesh_polygon.c | 33 +-------------- 3 files changed, 55 insertions(+), 43 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index d475d476c6d..e07d76f12df 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -262,6 +262,7 @@ MINLINE void madd_sh_shfl(float r[9], const float sh[3], const float f); float form_factor_hemi_poly(float p[3], float n[3], float v1[3], float v2[3], float v3[3], float v4[3]); +bool axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3]); void axis_dominant_v3(int *r_axis_a, int *r_axis_b, const float axis[3]); float axis_dominant_v3_max(int *r_axis_a, int *r_axis_b, const float axis[3]) #ifdef __GNUC__ diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index e1dfe40cdf4..ac9534dac25 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -1966,7 +1966,48 @@ void plot_line_v2v2i(const int p1[2], const int p2[2], int (*callback)(int, int, } } -/****************************** Interpolation ********************************/ +/****************************** Axis Utils ********************************/ + +/** + * \brief Normal to x,y matrix + * + * Creates a 3x3 matrix from a normal. + * This matrix can be applied to vectors so their 'z' axis runs along \a normal. + * In practice it means you can use x,y as 2d coords. \see + * + * \param r_mat The matrix to return. + * \param normal A unit length vector. + */ +bool axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3]) +{ + float up[3] = {0.0f, 0.0f, 1.0f}; + float axis[3]; + float angle; + + /* double check they are normalized */ +#ifdef DEBUG + float test; + BLI_assert(fabsf((test = len_squared_v3(normal)) - 1.0f) < 0.0001f || fabsf(test) < 0.0001f); +#endif + + cross_v3_v3v3(axis, normal, up); + angle = saacos(dot_v3v3(normal, up)); + + if (angle >= FLT_EPSILON) { + if (len_squared_v3(axis) < FLT_EPSILON) { + axis[0] = 0.0f; + axis[1] = 1.0f; + axis[2] = 0.0f; + } + + axis_angle_to_mat3(r_mat, axis, angle); + return true; + } + else { + unit_m3(r_mat); + return false; + } +} /* get the 2 dominant axis values, 0==X, 1==Y, 2==Z */ void axis_dominant_v3(int *r_axis_a, int *r_axis_b, const float axis[3]) @@ -1992,6 +2033,9 @@ float axis_dominant_v3_max(int *r_axis_a, int *r_axis_b, const float axis[3]) else { *r_axis_a = 1; *r_axis_b = 2; return xn; } } + +/****************************** Interpolation ********************************/ + static float tri_signed_area(const float v1[3], const float v2[3], const float v3[3], const int i, const int j) { return 0.5f * ((v1[i] - v2[i]) * (v2[j] - v3[j]) + (v1[j] - v2[j]) * (v3[i] - v2[i])); @@ -3535,7 +3579,7 @@ float form_factor_hemi_poly(float p[3], float n[3], float v1[3], float v2[3], fl int is_quad_convex_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3]) { float nor[3], nor1[3], nor2[3], vec[4][2]; - int axis_a, axis_b; + float mat[3][3]; /* define projection, do both trias apart, quad is undefined! */ @@ -3552,18 +3596,14 @@ int is_quad_convex_v3(const float v1[3], const float v2[3], const float v3[3], c } add_v3_v3v3(nor, nor1, nor2); + normalize_v3(nor); - axis_dominant_v3(&axis_a, &axis_b, nor); - - vec[0][0] = v1[axis_a]; - vec[0][1] = v1[axis_b]; - vec[1][0] = v2[axis_a]; - vec[1][1] = v2[axis_b]; + axis_dominant_v3_to_m3(mat, nor); - vec[2][0] = v3[axis_a]; - vec[2][1] = v3[axis_b]; - vec[3][0] = v4[axis_a]; - vec[3][1] = v4[axis_b]; + mul_v2_m3v3(vec[0], mat, v1); + mul_v2_m3v3(vec[1], mat, v2); + mul_v2_m3v3(vec[2], mat, v3); + mul_v2_m3v3(vec[3], mat, v4); /* linetests, the 2 diagonals have to instersect to be convex */ return (isect_line_line_v2(vec[0], vec[2], vec[1], vec[3]) > 0) ? TRUE : FALSE; diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index 83fb15c432a..1aa4d7c5e00 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -297,35 +297,6 @@ static void scale_edge_v3f(float v1[3], float v2[3], const float fac) add_v3_v3v3(v2, v2, mid); } -/** - * \brief POLY NORMAL TO MATRIX - * - * Creates a 3x3 matrix from a normal. - */ -static bool poly_normal_to_xy_mat3(float r_mat[3][3], const float normal[3]) -{ - float up[3] = {0.0f, 0.0f, 1.0f}, axis[3]; - float angle; - - cross_v3_v3v3(axis, normal, up); - angle = saacos(dot_v3v3(normal, up)); - - if (angle >= FLT_EPSILON) { - if (len_squared_v3(axis) < FLT_EPSILON) { - axis[0] = 0.0f; - axis[1] = 1.0f; - axis[2] = 0.0f; - } - - axis_angle_to_mat3(r_mat, axis, angle); - return true; - } - else { - unit_m3(r_mat); - return false; - } -} - /** * \brief POLY ROTATE PLANE * @@ -336,7 +307,7 @@ void poly_rotate_plane(const float normal[3], float (*verts)[3], const int nvert { float mat[3][3]; - if (poly_normal_to_xy_mat3(mat, normal)) { + if (axis_dominant_v3_to_m3(mat, normal)) { int i; for (i = 0; i < nverts; i++) { mul_m3_v3(mat, verts[i]); @@ -828,7 +799,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, float *abscoss = BLI_array_alloca(abscoss, f_len_orig); float mat[3][3]; - poly_normal_to_xy_mat3(mat, f->no); + axis_dominant_v3_to_m3(mat, f->no); /* copy vertex coordinates to vertspace area */ i = 0; -- cgit v1.2.3 From 5e05d67436162ecd8172703a5840f79d08286f87 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 08:16:13 +0000 Subject: improve beauty-fill tool for non-flat triangles. Project the triangle pair into 2d coords before measuring. before/after - http://www.graphicall.org/ftp/ideasman42/beauty_fill_fix.png --- source/blender/bmesh/operators/bmo_triangulate.c | 50 ++++++++++++++++-------- 1 file changed, 33 insertions(+), 17 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/operators/bmo_triangulate.c b/source/blender/bmesh/operators/bmo_triangulate.c index 1007e0529bf..563fccf879d 100644 --- a/source/blender/bmesh/operators/bmo_triangulate.c +++ b/source/blender/bmesh/operators/bmo_triangulate.c @@ -75,7 +75,9 @@ void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op) stop = 1; BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { - BMVert *v1, *v2, *v3, *v4; + float v1_xy[2], v2_xy[2], v3_xy[2], v4_xy[2]; + float no[3]; + float axis_mat[3][3]; if (!BM_edge_is_manifold(e) || !BMO_elem_flag_test(bm, e, EDGE_MARK)) { continue; @@ -87,30 +89,44 @@ void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op) continue; } - v1 = e->l->prev->v; - v2 = e->l->v; - v3 = e->l->radial_next->prev->v; - v4 = e->l->next->v; - - if (is_quad_convex_v3(v1->co, v2->co, v3->co, v4->co)) { + { + float *v1, *v2, *v3, *v4; + float no_a[3], no_b[3]; + v1 = e->l->prev->v->co; + v2 = e->l->v->co; + v3 = e->l->radial_next->prev->v->co; + v4 = e->l->next->v->co; + + normal_tri_v3(no_a, v1, v2, v3); + normal_tri_v3(no_b, v1, v3, v4); + add_v3_v3v3(no, no_a, no_b); + normalize_v3(no); + axis_dominant_v3_to_m3(axis_mat, no); + mul_v2_m3v3(v1_xy, axis_mat, v1); + mul_v2_m3v3(v2_xy, axis_mat, v2); + mul_v2_m3v3(v3_xy, axis_mat, v3); + mul_v2_m3v3(v4_xy, axis_mat, v4); + } + + if (is_quad_convex_v2(v1_xy, v2_xy, v3_xy, v4_xy)) { float len1, len2, len3, len4, len5, len6, opp1, opp2, fac1, fac2; /* testing rule: * the area divided by the total edge lengths */ - len1 = len_v3v3(v1->co, v2->co); - len2 = len_v3v3(v2->co, v3->co); - len3 = len_v3v3(v3->co, v4->co); - len4 = len_v3v3(v4->co, v1->co); - len5 = len_v3v3(v1->co, v3->co); - len6 = len_v3v3(v2->co, v4->co); + len1 = len_v2v2(v1_xy, v2_xy); + len2 = len_v2v2(v2_xy, v3_xy); + len3 = len_v2v2(v3_xy, v4_xy); + len4 = len_v2v2(v4_xy, v1_xy); + len5 = len_v2v2(v1_xy, v3_xy); + len6 = len_v2v2(v2_xy, v4_xy); - opp1 = area_tri_v3(v1->co, v2->co, v3->co); - opp2 = area_tri_v3(v1->co, v3->co, v4->co); + opp1 = area_tri_v2(v1_xy, v2_xy, v3_xy); + opp2 = area_tri_v2(v1_xy, v3_xy, v4_xy); fac1 = opp1 / (len1 + len2 + len5) + opp2 / (len3 + len4 + len5); - opp1 = area_tri_v3(v2->co, v3->co, v4->co); - opp2 = area_tri_v3(v2->co, v4->co, v1->co); + opp1 = area_tri_v2(v2_xy, v3_xy, v4_xy); + opp2 = area_tri_v2(v2_xy, v4_xy, v1_xy); fac2 = opp1 / (len2 + len3 + len6) + opp2 / (len4 + len1 + len6); -- cgit v1.2.3 From 777fb934a7e1645a4df76f40b1d1f1f712c74c62 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 9 Feb 2013 10:04:23 +0000 Subject: rigidbody: Don't use icons for constraint type We don't have proper icons yet. --- source/blender/makesrna/intern/rna_rigidbody.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_rigidbody.c b/source/blender/makesrna/intern/rna_rigidbody.c index c8f6a44a96e..b737410bbab 100644 --- a/source/blender/makesrna/intern/rna_rigidbody.c +++ b/source/blender/makesrna/intern/rna_rigidbody.c @@ -64,13 +64,13 @@ EnumPropertyItem rigidbody_ob_shape_items[] = { /* collision shapes of constraints in rigid body sim */ EnumPropertyItem rigidbody_con_type_items[] = { - {RBC_TYPE_FIXED, "FIXED", ICON_FORCE_FORCE, "Fixed", "Glue rigid bodies together"}, - {RBC_TYPE_POINT, "POINT", ICON_FORCE_FORCE, "Point", "Constrain rigid bodies to move around common pivot point"}, - {RBC_TYPE_HINGE, "HINGE", ICON_FORCE_FORCE, "Hinge", "Restrict rigid body rotation to one axis"}, - {RBC_TYPE_SLIDER, "SLIDER", ICON_FORCE_FORCE, "Slider", "Restrict rigid body translation to one axis"}, - {RBC_TYPE_PISTON, "PISTON", ICON_FORCE_FORCE, "Piston", "Restrict rigid body translation and rotation to one axis"}, - {RBC_TYPE_6DOF, "GENERIC", ICON_FORCE_FORCE, "Generic", "Restrict translation and rotation to specified axes"}, - {RBC_TYPE_6DOF_SPRING, "GENERIC_SPRING", ICON_FORCE_FORCE, "Generic Spring", + {RBC_TYPE_FIXED, "FIXED", ICON_NONE, "Fixed", "Glue rigid bodies together"}, + {RBC_TYPE_POINT, "POINT", ICON_NONE, "Point", "Constrain rigid bodies to move around common pivot point"}, + {RBC_TYPE_HINGE, "HINGE", ICON_NONE, "Hinge", "Restrict rigid body rotation to one axis"}, + {RBC_TYPE_SLIDER, "SLIDER", ICON_NONE, "Slider", "Restrict rigid body translation to one axis"}, + {RBC_TYPE_PISTON, "PISTON", ICON_NONE, "Piston", "Restrict rigid body translation and rotation to one axis"}, + {RBC_TYPE_6DOF, "GENERIC", ICON_NONE, "Generic", "Restrict translation and rotation to specified axes"}, + {RBC_TYPE_6DOF_SPRING, "GENERIC_SPRING", ICON_NONE, "Generic Spring", "Restrict translation and rotation to specified axes with springs"}, {0, NULL, 0, NULL, NULL}}; -- cgit v1.2.3 From 6738c941ffc68f25f93eb219c4c3c3ddc3cf7c4c Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 9 Feb 2013 10:04:25 +0000 Subject: rigidbody: Relink constraints when duplicating objects This will preserve constraint <-> rigid body realationships so constraint setups aren't broken after duplication. Based on a patch by Brandon Hechinger (jaggz), thanks. --- source/blender/blenkernel/BKE_rigidbody.h | 1 + source/blender/blenkernel/intern/object.c | 3 +++ source/blender/blenkernel/intern/rigidbody.c | 10 ++++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h index 607c3026388..2b19f60b5e4 100644 --- a/source/blender/blenkernel/BKE_rigidbody.h +++ b/source/blender/blenkernel/BKE_rigidbody.h @@ -52,6 +52,7 @@ void BKE_rigidbody_free_constraint(struct Object *ob); struct RigidBodyOb *BKE_rigidbody_copy_object(struct Object *ob); struct RigidBodyCon *BKE_rigidbody_copy_constraint(struct Object *ob); +void BKE_rigidbody_relink_constraint(struct RigidBodyCon *rbc); /* -------------- */ /* Setup */ diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 2312d801e0d..87457621ced 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -3185,6 +3185,9 @@ void BKE_object_relink(Object *ob) if (ob->adt) BKE_relink_animdata(ob->adt); + + if (ob->rigidbody_constraint) + BKE_rigidbody_relink_constraint(ob->rigidbody_constraint); ID_NEW(ob->parent); diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 58afc658867..24355149926 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -203,8 +203,6 @@ RigidBodyCon *BKE_rigidbody_copy_constraint(Object *ob) /* just duplicate the whole struct first (to catch all the settings) */ rbcN = MEM_dupallocN(ob->rigidbody_constraint); - // RB_TODO be more clever about copying constrained objects - /* tag object as needing to be verified */ rbcN->flag |= RBC_FLAG_NEEDS_VALIDATE; @@ -216,6 +214,13 @@ RigidBodyCon *BKE_rigidbody_copy_constraint(Object *ob) return rbcN; } +/* preserve relationships between constraints and rigid bodies after duplication */ +void BKE_rigidbody_relink_constraint(RigidBodyCon *rbc) +{ + ID_NEW(rbc->ob1); + ID_NEW(rbc->ob2); +} + /* ************************************** */ /* Setup Utilities - Validate Sim Instances */ @@ -1291,6 +1296,7 @@ void BKE_rigidbody_free_object(Object *ob) {} void BKE_rigidbody_free_constraint(Object *ob) {} struct RigidBodyOb *BKE_rigidbody_copy_object(Object *ob) { return NULL; } struct RigidBodyCon *BKE_rigidbody_copy_constraint(Object *ob) { return NULL; } +void BKE_rigidbody_relink_constraint(RigidBodyCon *rbc) {} void BKE_rigidbody_validate_sim_shape(Object *ob, short rebuild) {} void BKE_rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, short rebuild) {} void BKE_rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, short rebuild) {} -- cgit v1.2.3 From 4479d1323656a6d4c9374520e055edf8c7b497f5 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 9 Feb 2013 10:04:27 +0000 Subject: rigidbody: Fix force field changes not invalidating cache --- source/blender/blenkernel/intern/depsgraph.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 78d7bfa5bc5..dab4235559a 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -424,7 +424,7 @@ static void dag_add_lamp_driver_relations(DagForest *dag, DagNode *node, Lamp *l dag_add_shader_nodetree_driver_relations(dag, node, la->nodetree); } -static void dag_add_collision_field_relation(DagForest *dag, Scene *scene, Object *ob, DagNode *node, int skip_forcefield) +static void dag_add_collision_field_relation(DagForest *dag, Scene *scene, Object *ob, DagNode *node, int skip_forcefield, bool no_collision) { Base *base; DagNode *node2; @@ -435,7 +435,7 @@ static void dag_add_collision_field_relation(DagForest *dag, Scene *scene, Objec if ((base->lay & ob->lay) && base->object->pd) { Object *ob1 = base->object; if ((ob1->pd->deflect || ob1->pd->forcefield) && (ob1 != ob)) { - if (skip_forcefield && ob1->pd->forcefield == skip_forcefield) + if ((skip_forcefield && ob1->pd->forcefield == skip_forcefield) || (no_collision && ob1->pd->forcefield == 0)) continue; node2 = dag_get_node(dag, ob1); dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Field Collision"); @@ -599,10 +599,13 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O modifiers_isModifierEnabled(ob, eModifierType_Cloth) || modifiers_isModifierEnabled(ob, eModifierType_DynamicPaint)) { - dag_add_collision_field_relation(dag, scene, ob, node, 0); /* TODO: use effectorweight->group */ + dag_add_collision_field_relation(dag, scene, ob, node, 0, false); /* TODO: use effectorweight->group */ } else if (modifiers_isModifierEnabled(ob, eModifierType_Smoke)) { - dag_add_collision_field_relation(dag, scene, ob, node, PFIELD_SMOKEFLOW); + dag_add_collision_field_relation(dag, scene, ob, node, PFIELD_SMOKEFLOW, false); + } + else if (ob->rigidbody_object) { + dag_add_collision_field_relation(dag, scene, ob, node, 0, true); } } -- cgit v1.2.3 From bd9a7ab7688edab142e4c503726f17131153e26a Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 9 Feb 2013 10:04:29 +0000 Subject: rigidbody: Add missing updates for rigidbody operators Fixes cache not being invalidated when using change collision shape and calculate mass operators. --- source/blender/editors/physics/rigidbody_object.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c index fa258c98567..9ce4656d4cd 100644 --- a/source/blender/editors/physics/rigidbody_object.c +++ b/source/blender/editors/physics/rigidbody_object.c @@ -338,12 +338,14 @@ static int rigidbody_obs_shape_change_exec(bContext *C, wmOperator *op) /* use RNA-system to change the property and perform all necessary changes */ RNA_pointer_create(&ob->id, &RNA_RigidBodyObject, ob->rigidbody_object, &ptr); RNA_enum_set(&ptr, "collision_shape", shape); + + DAG_id_tag_update(&ob->id, OB_RECALC_OB); } } CTX_DATA_END; /* send updates */ - WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); // XXX: wrong notifiers for now, but these also do the job... + WM_event_add_notifier(C, NC_OBJECT | ND_POINTCACHE, NULL); /* done */ return OPERATOR_FINISHED; @@ -584,12 +586,14 @@ static int rigidbody_obs_calc_mass_exec(bContext *C, wmOperator *op) /* use RNA-system to change the property and perform all necessary changes */ RNA_pointer_create(&ob->id, &RNA_RigidBodyObject, ob->rigidbody_object, &ptr); RNA_float_set(&ptr, "mass", mass); + + DAG_id_tag_update(&ob->id, OB_RECALC_OB); } } CTX_DATA_END; /* send updates */ - WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); // XXX: wrong notifiers for now, but these also do the job... + WM_event_add_notifier(C, NC_OBJECT | ND_POINTCACHE, NULL); /* done */ return OPERATOR_FINISHED; -- cgit v1.2.3 From 00212f2b1f24362837910ea578546b3d93eba4e5 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sat, 9 Feb 2013 12:30:42 +0000 Subject: Bug fix #34157 Tss tss! :) This bug (since Jan 26) made Material options get cleared on using GE once. --- source/gameengine/Converter/BL_BlenderDataConversion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 8b81abf1728..e5503dfd0a7 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -1982,7 +1982,7 @@ static KX_GameObject *gameobject_from_blenderobject( for (int i=0;itotcol;i++) { mat=mesh->mat[i]; if (!mat) break; - if ((mat->shade_flag &= MA_OBCOLOR)) { + if ((mat->shade_flag & MA_OBCOLOR)) { bUseObjectColor = true; break; } -- cgit v1.2.3 From fd145b4df19c70b3133c45b364c58a14d2cf818d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 13:58:37 +0000 Subject: omit warning about startup.blend being missing when loading with '--factory-startup' --- source/blender/windowmanager/intern/wm_files.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 2196ce7ba65..45cc48c254a 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -520,14 +520,15 @@ int wm_homefile_read(bContext *C, ReportList *UNUSED(reports), short from_memory /* put aside screens to match with persistent windows later */ wm_window_match_init(C, &wmbase); - if (!from_memory && BLI_exists(startstr)) { - success = (BKE_read_file(C, startstr, NULL) != BKE_READ_FILE_FAIL); - - } - - if (U.themes.first == NULL) { - printf("\nNote: No (valid) "STRINGIFY (BLENDER_STARTUP_FILE)" found, fall back to built-in default.\n\n"); - success = 0; + if (!from_memory) { + if (BLI_exists(startstr)) { + success = (BKE_read_file(C, startstr, NULL) != BKE_READ_FILE_FAIL); + } + + if (U.themes.first == NULL) { + printf("\nNote: No (valid) '%s' found, fall back to built-in default.\n\n", startstr); + success = 0; + } } if (success == 0) { -- cgit v1.2.3 From 555bcc3298a564cb678c9f31ba6bded86d58bab6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 15:49:20 +0000 Subject: add beauty option for triangle fill since you might want to use the initial scanfill result. --- source/blender/bmesh/intern/bmesh_opdefines.c | 3 ++- source/blender/bmesh/operators/bmo_triangulate.c | 15 +++++++++------ source/blender/editors/mesh/editmesh_tools.c | 9 +++++++-- 3 files changed, 18 insertions(+), 9 deletions(-) (limited to 'source') diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 75439638fe1..c5eeceb43a3 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -1455,7 +1455,8 @@ static BMOpDefine bmo_beautify_fill_def = { static BMOpDefine bmo_triangle_fill_def = { "triangle_fill", /* slots_in */ - {{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */ + {{"use_beauty", BMO_OP_SLOT_BOOL}, + {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */ {{'\0'}}, }, /* slots_out */ diff --git a/source/blender/bmesh/operators/bmo_triangulate.c b/source/blender/bmesh/operators/bmo_triangulate.c index 563fccf879d..3d78ff64876 100644 --- a/source/blender/bmesh/operators/bmo_triangulate.c +++ b/source/blender/bmesh/operators/bmo_triangulate.c @@ -149,9 +149,9 @@ void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op) void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op) { + const bool use_beauty = BMO_slot_bool_get(op->slots_in, "use_beauty"); BMOIter siter; BMEdge *e; - BMOperator bmop; ScanFillContext sf_ctx; /* ScanFillEdge *sf_edge; */ /* UNUSED */ ScanFillVert *sf_vert, *sf_vert_1, *sf_vert_2; @@ -203,11 +203,14 @@ void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op) BLI_scanfill_end(&sf_ctx); BLI_smallhash_release(&hash); - /* clean up fill */ - BMO_op_initf(bm, &bmop, op->flag, "beautify_fill faces=%ff edges=%Fe", ELE_NEW, EDGE_MARK); - BMO_op_exec(bm, &bmop); - BMO_slot_buffer_flag_enable(bm, bmop.slots_out, "geom.out", BM_FACE | BM_EDGE, ELE_NEW); - BMO_op_finish(bm, &bmop); + if (use_beauty) { + BMOperator bmop; + + BMO_op_initf(bm, &bmop, op->flag, "beautify_fill faces=%ff edges=%Fe", ELE_NEW, EDGE_MARK); + BMO_op_exec(bm, &bmop); + BMO_slot_buffer_flag_enable(bm, bmop.slots_out, "geom.out", BM_FACE | BM_EDGE, ELE_NEW); + BMO_op_finish(bm, &bmop); + } BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "geom.out", BM_EDGE | BM_FACE, ELE_NEW); } diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index cc09c85b32f..6d5c4910630 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3314,9 +3314,12 @@ static int edbm_fill_exec(bContext *C, wmOperator *op) { Object *obedit = CTX_data_edit_object(C); BMEditMesh *em = BMEdit_FromObject(obedit); + int use_beauty = RNA_boolean_get(op->ptr, "use_beauty"); BMOperator bmop; - if (!EDBM_op_init(em, &bmop, op, "triangle_fill edges=%he", BM_ELEM_SELECT)) { + if (!EDBM_op_init(em, &bmop, op, + "triangle_fill edges=%he use_beauty=%b", + BM_ELEM_SELECT, use_beauty)) { return OPERATOR_CANCELLED; } @@ -3348,6 +3351,8 @@ void MESH_OT_fill(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + RNA_def_boolean(ot->srna, "use_beauty", true, "Beauty", "Use best triangulation division"); } static int edbm_beautify_fill_exec(bContext *C, wmOperator *op) @@ -3420,7 +3425,7 @@ void MESH_OT_quads_convert_to_tris(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "use_beauty", 1, "Beauty", "Use best triangulation division (currently quads only)"); + RNA_def_boolean(ot->srna, "use_beauty", 1, "Beauty", "Use best triangulation division"); } static int edbm_tris_convert_to_quads_exec(bContext *C, wmOperator *op) -- cgit v1.2.3 From f34d1d55850cd82fbae843ffafa7115dab0e0eeb Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Sat, 9 Feb 2013 16:19:30 +0000 Subject: [#33437](partial fix) Collada: importing a scene changes units. Added an option to disable unit settings during import. --- source/blender/collada/CMakeLists.txt | 2 ++ source/blender/collada/DocumentImporter.cpp | 47 ++++++++++++++++++----------- source/blender/collada/DocumentImporter.h | 5 +-- source/blender/collada/ImportSettings.cpp | 27 +++++++++++++++++ source/blender/collada/ImportSettings.h | 39 ++++++++++++++++++++++++ source/blender/collada/collada.cpp | 13 ++++++-- source/blender/collada/collada.h | 5 ++- source/blender/editors/io/io_collada.c | 44 +++++++++++++++++++++++++-- 8 files changed, 157 insertions(+), 25 deletions(-) create mode 100644 source/blender/collada/ImportSettings.cpp create mode 100644 source/blender/collada/ImportSettings.h (limited to 'source') diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt index 7f389346a81..326ca2b9937 100644 --- a/source/blender/collada/CMakeLists.txt +++ b/source/blender/collada/CMakeLists.txt @@ -57,6 +57,7 @@ set(SRC EffectExporter.cpp ErrorHandler.cpp ExportSettings.cpp + ImportSettings.cpp ExtraHandler.cpp ExtraTags.cpp GeometryExporter.cpp @@ -84,6 +85,7 @@ set(SRC EffectExporter.h ErrorHandler.h ExportSettings.h + ImportSettings.h ExtraHandler.h ExtraTags.h GeometryExporter.h diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index a234d85bc6f..7437401ed09 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -99,9 +99,9 @@ extern "C" { // creates empties for each imported bone on layer 2, for debugging // #define ARMATURE_TEST -DocumentImporter::DocumentImporter(bContext *C, const char *filename) : +DocumentImporter::DocumentImporter(bContext *C, const ImportSettings *import_settings) : + import_settings(import_settings), mImportStage(General), - mFilename(filename), mContext(C), armature_importer(&unit_converter, &mesh_importer, &anim_importer, CTX_data_scene(C)), mesh_importer(&unit_converter, &armature_importer, CTX_data_scene(C)), @@ -131,6 +131,7 @@ bool DocumentImporter::import() // deselect all to select new objects BKE_scene_base_deselect_all(CTX_data_scene(mContext)); + std::string mFilename = std::string(this->import_settings->filepath); const std::string encodedFilename = bc_url_encode(mFilename); if (!root.loadDocument(encodedFilename)) { fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 1st pass\n"); @@ -188,30 +189,42 @@ void DocumentImporter::finish() Scene *sce = CTX_data_scene(mContext); // for scene unit settings: system, scale_length + RNA_id_pointer_create(&sce->id, &sceneptr); unit_settings = RNA_pointer_get(&sceneptr, "unit_settings"); system = RNA_struct_find_property(&unit_settings, "system"); scale = RNA_struct_find_property(&unit_settings, "scale_length"); - - switch (unit_converter.isMetricSystem()) { - case UnitConverter::Metric: - RNA_property_enum_set(&unit_settings, system, USER_UNIT_METRIC); - break; - case UnitConverter::Imperial: - RNA_property_enum_set(&unit_settings, system, USER_UNIT_IMPERIAL); - break; - default: - RNA_property_enum_set(&unit_settings, system, USER_UNIT_NONE); - break; + + if (this->import_settings->import_units) { + + switch (unit_converter.isMetricSystem()) { + case UnitConverter::Metric: + RNA_property_enum_set(&unit_settings, system, USER_UNIT_METRIC); + break; + case UnitConverter::Imperial: + RNA_property_enum_set(&unit_settings, system, USER_UNIT_IMPERIAL); + break; + default: + RNA_property_enum_set(&unit_settings, system, USER_UNIT_NONE); + break; + } + float unit_factor = unit_converter.getLinearMeter(); + RNA_property_float_set(&unit_settings, scale, unit_factor); + fprintf(stdout, "Collada: Adjusting Blender units to Importset units: %f.\n", unit_factor); + + } + else { + // TODO: add automatic scaling for the case when Blender units + // and import units are set to different values. } - RNA_property_float_set(&unit_settings, scale, unit_converter.getLinearMeter()); - - const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes(); + // Write nodes to scene + const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes(); for (unsigned int i = 0; i < roots.getCount(); i++) { write_node(roots[i], NULL, sce, NULL, false); } + // update scene Main *bmain = CTX_data_main(mContext); DAG_scene_sort(bmain, sce); DAG_ids_flush_update(bmain, 0); @@ -974,7 +987,7 @@ bool DocumentImporter::writeImage(const COLLADAFW::Image *image) // XXX maybe it is necessary to check if the path is absolute or relative const std::string& filepath = image->getImageURI().toNativePath(); - const char *filename = (const char *)mFilename.c_str(); + const char *filename = (const char *)filepath.c_str(); char dir[FILE_MAX]; char full_path[FILE_MAX]; diff --git a/source/blender/collada/DocumentImporter.h b/source/blender/collada/DocumentImporter.h index 7e3476fb7e0..76d16f38a0c 100644 --- a/source/blender/collada/DocumentImporter.h +++ b/source/blender/collada/DocumentImporter.h @@ -47,6 +47,7 @@ #include "ArmatureImporter.h" #include "ControllerExporter.h" #include "MeshImporter.h" +#include "ImportSettings.h" @@ -63,7 +64,7 @@ public: Controller, //!< Second pass to collect controller data }; /** Constructor */ - DocumentImporter(bContext *C, const char *filename); + DocumentImporter(bContext *C, const ImportSettings *import_settings); /** Destructor */ ~DocumentImporter(); @@ -137,10 +138,10 @@ public: private: + const ImportSettings *import_settings; /** Current import stage we're in. */ ImportStage mImportStage; - std::string mFilename; bContext *mContext; diff --git a/source/blender/collada/ImportSettings.cpp b/source/blender/collada/ImportSettings.cpp new file mode 100644 index 00000000000..74607787f25 --- /dev/null +++ b/source/blender/collada/ImportSettings.cpp @@ -0,0 +1,27 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Gaia Clary. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/collada/ExportSettings.cpp + * \ingroup collada + */ + +#include "ImportSettings.h" diff --git a/source/blender/collada/ImportSettings.h b/source/blender/collada/ImportSettings.h new file mode 100644 index 00000000000..3f3a9fb354e --- /dev/null +++ b/source/blender/collada/ImportSettings.h @@ -0,0 +1,39 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Gaia Clary + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file ExportSettings.h + * \ingroup collada + */ + +#ifndef __IMPORTSETTINGS_H__ +#define __IMPORTSETTINGS_H__ + +#include "collada.h" + +struct ImportSettings { +public: + bool import_units; + + char *filepath; +}; + +#endif diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp index ef34c55bbe6..1aff0f166ba 100644 --- a/source/blender/collada/collada.cpp +++ b/source/blender/collada/collada.cpp @@ -31,6 +31,7 @@ #include "DocumentExporter.h" #include "DocumentImporter.h" #include "ExportSettings.h" +#include "ImportSettings.h" extern "C" { @@ -42,9 +43,17 @@ extern "C" #include "BLI_path_util.h" #include "BLI_linklist.h" -int collada_import(bContext *C, const char *filepath) +int collada_import(bContext *C, + const char *filepath, + int import_units) { - DocumentImporter imp(C, filepath); + + ImportSettings import_settings; + import_settings.filepath = (char *)filepath; + + import_settings.import_units = import_units != 0; + + DocumentImporter imp(C, &import_settings); if (imp.import()) return 1; return 0; diff --git a/source/blender/collada/collada.h b/source/blender/collada/collada.h index a02e3e007ae..587dc37b7db 100644 --- a/source/blender/collada/collada.h +++ b/source/blender/collada/collada.h @@ -46,7 +46,10 @@ struct Scene; /* * both return 1 on success, 0 on error */ -int collada_import(bContext *C, const char *filepath); +int collada_import(bContext *C, + const char *filepath, + int import_units); + int collada_export(Scene *sce, const char *filepath, int apply_modifiers, diff --git a/source/blender/editors/io/io_collada.c b/source/blender/editors/io/io_collada.c index f53672b7092..0982b4f034e 100644 --- a/source/blender/editors/io/io_collada.c +++ b/source/blender/editors/io/io_collada.c @@ -308,18 +308,47 @@ void WM_OT_collada_export(wmOperatorType *ot) static int wm_collada_import_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; + int import_units; if (!RNA_struct_property_is_set(op->ptr, "filepath")) { BKE_report(op->reports, RPT_ERROR, "No filename given"); return OPERATOR_CANCELLED; } - RNA_string_get(op->ptr, "filepath", filename); - if (collada_import(C, filename)) return OPERATOR_FINISHED; + /* Options panel */ + import_units = RNA_boolean_get(op->ptr, "import_units"); + RNA_string_get(op->ptr, "filepath", filename); + if (collada_import( C, + filename, + import_units)) { + return OPERATOR_FINISHED; + } + else { BKE_report(op->reports, RPT_ERROR, "Errors found during parsing COLLADA document (see console for details)"); + return OPERATOR_CANCELLED; + } +} + +static void uiCollada_importSettings(uiLayout *layout, PointerRNA *imfptr) +{ + uiLayout *box, *row; + + /* Import Options: */ + box = uiLayoutBox(layout); + row = uiLayoutRow(box, FALSE); + uiItemL(row, IFACE_("Import Data Options:"), ICON_MESH_DATA); - return OPERATOR_FINISHED; + row = uiLayoutRow(box, FALSE); + uiItemR(row, imfptr, "import_units", 0, NULL, ICON_NONE); +} + +static void wm_collada_import_draw(bContext *UNUSED(C), wmOperator *op) +{ + PointerRNA ptr; + + RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr); + uiCollada_importSettings(op->layout, &ptr); } void WM_OT_collada_import(wmOperatorType *ot) @@ -332,7 +361,16 @@ void WM_OT_collada_import(wmOperatorType *ot) ot->exec = wm_collada_import_exec; ot->poll = WM_operator_winactive; + //ot->flag |= OPTYPE_PRESET; + + ot->ui = wm_collada_import_draw; + WM_operator_properties_filesel(ot, FOLDERFILE | COLLADAFILE, FILE_BLENDER, FILE_OPENFILE, WM_FILESEL_FILEPATH, FILE_DEFAULTDISPLAY); + + RNA_def_boolean(ot->srna, + "import_units", 0, "Import Units", + "If enabled use Units as defined in Collada Import, else keep Blender's current Units settings. "); + } #endif -- cgit v1.2.3 From d1136ba2efab8c4a1475b1778eb7b2bd9c8c8658 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sat, 9 Feb 2013 16:54:10 +0000 Subject: Bug fix #34174 Multilayer files saved from Maya (and I bet others) store the 'primary' layer without layer or pass name, just as R G B A. Allows viewers to show stuff too, I guess. Blender now reads this as well, just allowing an empty string for the layer and pass. --- source/blender/imbuf/intern/openexr/openexr_api.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source') diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index 18b08c9b59b..1b7aa1e7e63 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -882,6 +882,12 @@ static int imb_exr_split_channel_name(ExrChannel *echan, char *layname, char *pa const char *token; char tokenbuf[EXR_TOT_MAXNAME]; int len; + + /* some multilayers have the combined buffer with names A B G R saved */ + if (name[1] == 0) { + echan->chan_id = name[0]; + return 1; + } /* last token is single character channel identifier */ len = imb_exr_split_token(name, end, &token); -- cgit v1.2.3 From 1083a069004490b0ed8679679adb2a7ea881ba62 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 9 Feb 2013 18:17:20 +0000 Subject: Translation of 'text' parameter of UI functions: disables context search in RNA property (see comment in code for details). Also made some minor optimization. --- source/blender/makesrna/intern/rna_ui_api.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 4070e6c0a9f..2043832a3f8 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -63,25 +63,36 @@ EnumPropertyItem icon_items[] = { static const char *rna_translate_ui_text(const char *text, const char *text_ctxt, StructRNA *type, PropertyRNA *prop, int translate) { - if (!text || !text[0] || !translate) { + /* Also return text if UI labels translation is disabled. */ + if (!text || !text[0] || !translate || !BLF_translate_iface()) { return text; } /* If a text_ctxt is specified, use it! */ if (text_ctxt && text_ctxt[0]) { - return CTX_IFACE_(text_ctxt, text); + return BLF_pgettext(text_ctxt, text); } /* Else, if an RNA type or property is specified, use its context. */ +#if 0 + /* XXX Disabled for now. Unfortunately, their is absolutely no way from py code to get the RNA struct corresponding + * to the 'data' (in functions like prop() & co), as this is pure runtime data. Hence, messages extraction + * script can't determine the correct context it should use for such 'text' messages... + * So for now, one have to explicitly specify the 'text_ctxt' when using prop() etc. functions, + * if default context is not suitable. + */ if (prop) { - return CTX_IFACE_(RNA_property_translation_context(prop), text); + return BLF_pgettext(RNA_property_translation_context(prop), text); } +#else + (void)prop; +#endif if (type) { - return CTX_IFACE_(RNA_struct_translation_context(type), text); + return BLF_pgettext(RNA_struct_translation_context(type), text); } - /* Else, no context! */ - return IFACE_(text); + /* Else, default context! */ + return BLF_pgettext(BLF_I18NCONTEXT_DEFAULT, text); } static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *name, const char *text_ctxt, -- cgit v1.2.3 From 82c86af7f7b37e940748e99efe3b19fd5b92d6ca Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 9 Feb 2013 18:26:40 +0000 Subject: Bunch of fixes for py ui messages (all those using 'formating' were not translated previously, now they use bpy.app.translations.pgettext). Also pleas avoid complex py statements in 'text' values (like 'text="foo" if cond else "bar"'), thes make message extraction script fails! And another "final point in UI message" removal! --- source/blender/editors/io/io_collada.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/editors/io/io_collada.c b/source/blender/editors/io/io_collada.c index 0982b4f034e..2004b18adf6 100644 --- a/source/blender/editors/io/io_collada.c +++ b/source/blender/editors/io/io_collada.c @@ -368,9 +368,8 @@ void WM_OT_collada_import(wmOperatorType *ot) WM_operator_properties_filesel(ot, FOLDERFILE | COLLADAFILE, FILE_BLENDER, FILE_OPENFILE, WM_FILESEL_FILEPATH, FILE_DEFAULTDISPLAY); - RNA_def_boolean(ot->srna, - "import_units", 0, "Import Units", - "If enabled use Units as defined in Collada Import, else keep Blender's current Units settings. "); + RNA_def_boolean(ot->srna, "import_units", 0, "Import Units", + "If enabled use Units as defined in Collada Import, else keep Blender's current Units settings"); } #endif -- cgit v1.2.3 From d65135ed93df0f333989c91d7f2e78bc8c6fbd96 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 10 Feb 2013 08:21:39 +0000 Subject: correct arg order in header for isect_point_tri_v2(), Made for confusing calltips. --- source/blender/blenlib/BLI_math_geom.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index e07d76f12df..a822bdb9414 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -131,7 +131,7 @@ int isect_ray_tri_epsilon_v3(const float p1[3], const float d[3], /* point in polygon */ int isect_point_quad_v2(const float p[2], const float a[2], const float b[2], const float c[2], const float d[2]); -int isect_point_tri_v2(const float v1[2], const float v2[2], const float v3[2], const float pt[2]); +int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2]); int isect_point_tri_v2_cw(const float pt[2], const float v1[2], const float v2[2], const float v3[2]); int isect_point_tri_v2_int(const int x1, const int y1, const int x2, const int y2, const int a, const int b); int isect_point_tri_prism_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3]); -- cgit v1.2.3