From 69585591d6a1d1fdac1e6b6ce508ccd3d936e2ac Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 03:25:47 +0000 Subject: [PATCH 001/227] 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(-) 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 */ }; From e9a4dd202e9032435b102b800c5d12f4f689f4d0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 05:18:30 +0000 Subject: [PATCH 002/227] 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. --- .../blenlib/intern/math_vector_inline.c | 1 + source/blender/editors/transform/transform.c | 29 +++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) 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); } } From 0d0dc37aeefdada8a97d5434c064850ef79ff765 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 05:30:39 +0000 Subject: [PATCH 003/227] 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(-) 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); From 7834f72282c308dd4927dad97320bccf33115327 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 29 Jan 2013 08:01:50 +0000 Subject: [PATCH 004/227] 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(-) 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); From 340845289b6b77c8d1390f237c25ebe46d3b7f30 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 08:19:23 +0000 Subject: [PATCH 005/227] fix [#34024] delete - Edge loop crash --- source/blender/editors/transform/transform.c | 24 ++++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) 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 */ From 6d4a6b957c5fd23e3b1356c86e7f16ccd0708b12 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 29 Jan 2013 08:21:21 +0000 Subject: [PATCH 006/227] 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(-) 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); } } From 97a5cd92bc807a03c4983ec70b1b961491062b13 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 29 Jan 2013 08:34:26 +0000 Subject: [PATCH 007/227] =?UTF-8?q?Some=20optimization=20(their=20is=20muc?= =?UTF-8?q?h=20more=20possible=20here,=20but=20it=20will=20have=20to=20wai?= =?UTF-8?q?t=20for=20complete=20refactor=20I=E2=80=99m=20working=20on=20cu?= =?UTF-8?q?rrently).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- release/scripts/modules/bl_i18n_utils/utils.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/release/scripts/modules/bl_i18n_utils/utils.py b/release/scripts/modules/bl_i18n_utils/utils.py index 1c2e62b4c4e..d04e8bead7a 100644 --- a/release/scripts/modules/bl_i18n_utils/utils.py +++ b/release/scripts/modules/bl_i18n_utils/utils.py @@ -236,8 +236,9 @@ class I18nMessages: import difflib similar_pool = {} if use_similar > 0.0: - for key in self.msgs: - similar_pool.setdefault(key[1], set()).add(key) + for key, msg in self.msgs.items(): + if msg.msgstr: # No need to waste time with void translations! + similar_pool.setdefault(key[1], set()).add(key) msgs = self._new_messages() for (key, msg) in ref.msgs.items(): @@ -259,10 +260,11 @@ class I18nMessages: if skey: msgs[key].msgstr = self.msgs[skey].msgstr msgs[key].is_fuzzy = True - # Add back all "old" and already commented messages as commented ones, if required. + # Add back all "old" and already commented messages as commented ones, if required + # (and translation was not void!). if keep_old_commented: for key, msg in self.msgs.items(): - if key not in msgs: + if key not in msgs and msg.msgstr: msgs[key] = msg msgs[key].is_commented = True # And finalize the update! From 37489d71c7f0007ffc3aa252a4cc63d1aa903399 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 10:31:05 +0000 Subject: [PATCH 008/227] 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 +- .../blender/bmesh/operators/bmo_triangulate.c | 34 ++-------- .../blender/bmesh/tools/bmesh_triangulate.c | 66 +++++++++++++++++++ .../blender/bmesh/tools/bmesh_triangulate.h | 35 ++++++++++ .../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 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)) { + 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); - BLI_array_empty(projectverts); - BLI_array_empty(newfaces); + BM_mesh_triangulate(bm, use_beauty, true); - BLI_array_grow_items(projectverts, face->len * 3); - BLI_array_grow_items(newfaces, face->len); - - BM_face_triangulate(bm, face, projectverts, EDGE_NEW, FACE_NEW, newfaces, use_beauty); - - 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); From dc727f0256562cb8fc1074fda9b9b7f407496ab2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 10:43:15 +0000 Subject: [PATCH 009/227] 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(-) 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) From 1a750e00e72c06fc3acf883c436dc147d0626e52 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 29 Jan 2013 12:03:38 +0000 Subject: [PATCH 010/227] 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(-) 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", ""}, From 6d2f104884f706b0358a9f6393e32cdc0430adac Mon Sep 17 00:00:00 2001 From: Stuart Broadfoot Date: Tue, 29 Jan 2013 12:32:43 +0000 Subject: [PATCH 011/227] 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. --- intern/cycles/blender/blender_curves.cpp | 55 +++++++++++-------- intern/cycles/render/object.cpp | 12 +++- source/blender/makesrna/intern/rna_particle.c | 50 ++++++++++++++--- 3 files changed, 86 insertions(+), 31 deletions(-) diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index cf2c018f1a2..c37895cd196 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -37,9 +37,10 @@ void curveinterp_v3_v3v3v3v3(float3 *p, float3 *v1, float3 *v2, float3 *v3, floa void interp_weights(float t, float data[4], int type); float shaperadius(float shape, float root, float tip, float time); void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyloc, float *time, ParticleCurveData *CData, int interpolation); -bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, int uv_num); -bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, int vcol_num); -bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents); +void ToggleRender(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::Scene *scene); +bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int uv_num); +bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int vcol_num); +bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background); void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments, float3 RotCam); void ExportCurveTriangleRibbons(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments); void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int resolution, int segments); @@ -151,7 +152,7 @@ void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyl curveinterp_v3_v3v3v3v3(keyloc, &ckey_loc1, &ckey_loc2, &ckey_loc3, &ckey_loc4, t); } -bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents) +bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background) { int curvenum = 0; @@ -176,12 +177,10 @@ bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par int mi = clamp(b_psys.settings().material()-1, 0, mesh->used_shaders.size()-1); int shader = mesh->used_shaders[mi]; - int draw_step = b_psys.settings().draw_step(); + int draw_step = background ? b_psys.settings().render_step() : b_psys.settings().draw_step(); int ren_step = (int)pow((float)2.0f,(float)draw_step); - /*b_psys.settings().render_step(draw_step);*/ - int totparts = b_psys.particles.length(); - int totchild = b_psys.child_particles.length() * b_psys.settings().draw_percentage() / 100; + int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_psys.settings().draw_percentage() / 100.0f); int totcurves = totchild; if(use_parents || b_psys.settings().child_type() == 0) @@ -240,7 +239,7 @@ bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par } -bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, int uv_num) +bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int uv_num) { #if 0 int keyno = 0; @@ -269,13 +268,10 @@ bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Parti #if 0 int mi = clamp(b_psys.settings().material()-1, 0, mesh->used_shaders.size()-1); int shader = mesh->used_shaders[mi]; - int draw_step = b_psys.settings().draw_step(); - int ren_step = (int)pow((float)2.0f,(float)draw_step); - b_psys.settings().render_step(draw_step); #endif int totparts = b_psys.particles.length(); - int totchild = b_psys.child_particles.length() * b_psys.settings().draw_percentage() / 100; + int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_psys.settings().draw_percentage() / 100.0f); int totcurves = totchild; if (use_parents || b_psys.settings().child_type() == 0) @@ -314,7 +310,7 @@ bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Parti } -bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, int vcol_num) +bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int vcol_num) { #if 0 int keyno = 0; @@ -342,12 +338,9 @@ bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par #if 0 int mi = clamp(b_psys.settings().material()-1, 0, mesh->used_shaders.size()-1); int shader = mesh->used_shaders[mi]; - int draw_step = b_psys.settings().draw_step(); - int ren_step = (int)pow((float)2.0f,(float)draw_step); - b_psys.settings().render_step(draw_step); #endif int totparts = b_psys.particles.length(); - int totchild = b_psys.child_particles.length() * b_psys.settings().draw_percentage() / 100; + int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_psys.settings().draw_percentage() / 100.0f); int totcurves = totchild; if (use_parents || b_psys.settings().child_type() == 0) @@ -386,6 +379,18 @@ bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par } +void ToggleRender(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::Scene *scene) +{ + BL::Object::modifiers_iterator b_mod; + for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { + if ((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) { + BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr); + BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr); + b_psys.ToggleRender(*scene, *b_ob); + } + } +} + void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments, float3 RotCam) { int vertexno = mesh->verts.size(); @@ -945,7 +950,10 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool ParticleCurveData CData; - ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, use_parents); + if(!preview) + ToggleRender(mesh, &b_mesh, &b_ob, &b_scene); + + ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview); /* attach strands to mesh */ BL::Object b_CamOb = b_scene.camera(); @@ -959,7 +967,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool if(primitive == CURVE_TRIANGLES){ int vert_num = mesh->triangles.size() * 3; - ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, use_parents, 0); + ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, 0); if(triangle_method == CURVE_CAMERA_TRIANGLES) { ExportCurveTrianglePlanes(mesh, &CData, interpolation, use_smooth, segments, RotCam); ExportCurveTriangleUVs(mesh, &CData, interpolation, use_smooth, segments, vert_num, 1); @@ -1021,7 +1029,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool Attribute *attr_vcol = mesh->curve_attributes.add( ustring(l->name().c_str()), TypeDesc::TypeColor, ATTR_ELEMENT_CURVE); - ObtainCacheParticleVcol(mesh, &b_mesh, &b_ob, &CData, use_parents, vcol_num); + ObtainCacheParticleVcol(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, vcol_num); float3 *vcol = attr_vcol->data_float3(); @@ -1051,7 +1059,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool else attr = mesh->curve_attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CURVE); - ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, use_parents, uv_num); + ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, uv_num); float3 *uv = attr->data_float3(); @@ -1065,6 +1073,9 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool } + if(!preview) + ToggleRender(mesh, &b_mesh, &b_ob, &b_scene); + mesh->compute_bounds(); } diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index 8d8087266c1..b31650c160a 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -84,12 +84,20 @@ void Object::apply_transform() { if(!mesh || tfm == transform_identity()) return; - + + float3 c0 = transform_get_column(&tfm, 0); + float3 c1 = transform_get_column(&tfm, 1); + float3 c2 = transform_get_column(&tfm, 2); + float scalar = pow(fabsf(dot(cross(c0, c1), c2)), 1.0f/3.0f); + for(size_t i = 0; i < mesh->verts.size(); i++) mesh->verts[i] = transform_point(&tfm, mesh->verts[i]); - for(size_t i = 0; i < mesh->curve_keys.size(); i++) + for(size_t i = 0; i < mesh->curve_keys.size(); i++) { mesh->curve_keys[i].co = transform_point(&tfm, mesh->curve_keys[i].co); + /* scale for strand radius - only correct for uniform transforms*/ + mesh->curve_keys[i].radius *= scalar; + } /* store matrix to transform later. when accessing these as attributes we * do not want the transform to be applied for consistency between static 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"); From d18fca88b9b292631b02fe98055372d4746866c3 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 29 Jan 2013 14:52:26 +0000 Subject: [PATCH 012/227] 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(-) 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); } From 2b875a947ff831dd8f7d4b5bc2d5df10f614864d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 15:05:23 +0000 Subject: [PATCH 013/227] 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 | 197 +++++++----------- source/blender/bmesh/intern/bmesh_polygon.h | 2 +- .../blender/bmesh/tools/bmesh_triangulate.c | 15 +- 6 files changed, 84 insertions(+), 140 deletions(-) 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,6 +297,34 @@ 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 @@ -306,30 +334,14 @@ static void scale_edge_v3f(float v1[3], float v2[3], const float fac) */ void poly_rotate_plane(const float normal[3], float (*verts)[3], const int nverts) { - - float up[3] = {0.0f, 0.0f, 1.0f}, axis[3], q[4]; float mat[3][3]; - float angle; - int i; - cross_v3_v3v3(axis, normal, up); - - angle = saacos(dot_v3v3(normal, up)); - - if (angle < FLT_EPSILON) - return; - - if (len_squared_v3(axis) < FLT_EPSILON) { - axis[0] = 0.0f; - axis[1] = 1.0f; - axis[2] = 0.0f; + if (poly_normal_to_xy_mat3(mat, normal)) { + int i; + for (i = 0; i < nverts; i++) { + mul_m3_v3(mat, verts[i]); + } } - - axis_angle_to_quat(q, axis, angle); - quat_to_mat3(mat, q); - - 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); +/* 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; - } + 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); + 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 + if (use_tag) { + BM_elem_flag_enable(l_new->e, BM_ELEM_TAG); + BM_elem_flag_enable(f, BM_ELEM_TAG); + } + if (r_faces_new) { + r_faces_new[nf_i++] = f; } } BLI_assert(f->len == 3); - -#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 (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; - } - } -#endif - - /* NULL-terminate */ - if (newfaces) { - newfaces[nf_i] = NULL; - } } /** 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); } From d54b2e1e25c5a0bff29ca14a216696f90d4d5a49 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 29 Jan 2013 17:15:51 +0000 Subject: [PATCH 014/227] 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(-) 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); From 3eb800169fbaa07cb58a2905b152afe3f72d362a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 29 Jan 2013 17:30:26 +0000 Subject: [PATCH 015/227] Cycles: collapse preview render panel by default. It's a matter of personal preference, but it slows down 3D view rendering to have two renders going so I rather disable it by default. --- intern/cycles/blender/addon/ui.py | 42 ++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index d05ceb51148..a42b69dc5c6 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -522,6 +522,19 @@ def panel_node_draw(layout, id_data, output_type, input_name): return True +class CyclesLamp_PT_preview(CyclesButtonsPanel, Panel): + bl_label = "Preview" + bl_context = "data" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + return context.lamp and CyclesButtonsPanel.poll(context) + + def draw(self, context): + self.layout.template_preview(context.lamp) + + class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel): bl_label = "Lamp" bl_context = "data" @@ -606,6 +619,19 @@ class CyclesLamp_PT_spot(CyclesButtonsPanel, Panel): col.prop(lamp, "show_cone") +class CyclesWorld_PT_preview(CyclesButtonsPanel, Panel): + bl_label = "Preview" + bl_context = "world" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + return context.world and CyclesButtonsPanel.poll(context) + + def draw(self, context): + self.layout.template_preview(context.world) + + class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel): bl_label = "Surface" bl_context = "world" @@ -692,6 +718,19 @@ class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel): sub.prop(cworld, "samples") +class CyclesMaterial_PT_preview(CyclesButtonsPanel, Panel): + bl_label = "Preview" + bl_context = "material" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + return context.material and CyclesButtonsPanel.poll(context) + + def draw(self, context): + self.layout.template_preview(context.material) + + class CyclesMaterial_PT_surface(CyclesButtonsPanel, Panel): bl_label = "Surface" bl_context = "material" @@ -1175,9 +1214,6 @@ def get_panels(): types.PARTICLE_PT_force_fields, types.PARTICLE_PT_vertexgroups, types.PARTICLE_PT_custom_props, - types.MATERIAL_PT_preview, - types.DATA_PT_preview, - types.WORLD_PT_preview, ) From df53f46065b9c2750cc8e7e58bb7c37571f5e8fe Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 29 Jan 2013 17:30:30 +0000 Subject: [PATCH 016/227] Fix #34031: in the keymap editor, Timer and Text Input types did not show field to edit the operator name. --- .../startup/bl_ui/space_userpref_keymap.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_userpref_keymap.py b/release/scripts/startup/bl_ui/space_userpref_keymap.py index 81d67aa662c..82299bc951c 100644 --- a/release/scripts/startup/bl_ui/space_userpref_keymap.py +++ b/release/scripts/startup/bl_ui/space_userpref_keymap.py @@ -172,17 +172,17 @@ class InputKeyMapPanel: if kmi.show_expanded: box = col.box() + split = box.split(percentage=0.4) + sub = split.row() + + if km.is_modal: + sub.prop(kmi, "propvalue", text="") + else: + # One day... + #~ sub.prop_search(kmi, "idname", bpy.context.window_manager, "operators_all", text="") + sub.prop(kmi, "idname", text="") + if map_type not in {'TEXTINPUT', 'TIMER'}: - split = box.split(percentage=0.4) - sub = split.row() - - if km.is_modal: - sub.prop(kmi, "propvalue", text="") - else: - # One day... - #~ sub.prop_search(kmi, "idname", bpy.context.window_manager, "operators_all", text="") - sub.prop(kmi, "idname", text="") - sub = split.column() subrow = sub.row(align=True) From e9678e74b071b5edd1fac233ac6dac5df821242f Mon Sep 17 00:00:00 2001 From: Miika Hamalainen Date: Tue, 29 Jan 2013 19:27:05 +0000 Subject: [PATCH 017/227] 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(-) 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) { From f02f491ed04b3427840c375de3fd62c9de59cd84 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 20:49:40 +0000 Subject: [PATCH 018/227] 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 ++++++------------- .../blender/bmesh/tools/bmesh_triangulate.c | 8 ++++++-- 3 files changed, 12 insertions(+), 16 deletions(-) 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); + } } } } From 8e740e9797baaf9ca41ed38a47915b4b62c5004a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 29 Jan 2013 21:34:58 +0000 Subject: [PATCH 019/227] Fix #34016: add backwards compatibility for deprecated region.callback_add python function, this keep addons working. It's better to use the new function but might as well avoid breaking compatibility here. --- release/scripts/modules/bpy_types.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 9161cc20d2c..b0a4e05b107 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -737,3 +737,21 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta): self.path_menu(bpy.utils.preset_paths(self.preset_subdir), self.preset_operator, filter_ext=lambda ext: ext.lower() in {".py", ".xml"}) + +class Region(StructRNA): + __slots__ = () + + def callback_add(self, cb, args, draw_mode): + """ + Append a draw function to this region, + deprecated, instead use bpy.types.SpaceView3D.draw_handler_add + """ + for area in self.id_data.areas: + for region in area.regions: + if region == self: + spacetype = type(area.spaces[0]) + return spacetype.draw_handler_add(cb, args, self.type, + draw_mode) + + return None + From b4dc44eec75af6a0761e90e7bbebdeb461120b34 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Jan 2013 21:58:07 +0000 Subject: [PATCH 020/227] update themes. --- .../presets/interface_theme/back_to_black.xml | 38 ++++++++++++------- .../presets/interface_theme/blender_24x.xml | 38 ++++++++++++------- .../presets/interface_theme/elsyiun.xml | 38 ++++++++++++------- .../presets/interface_theme/hexagon.xml | 38 ++++++++++++------- .../interface_theme/ubuntu_ambiance.xml | 38 ++++++++++++------- 5 files changed, 125 insertions(+), 65 deletions(-) diff --git a/release/scripts/presets/interface_theme/back_to_black.xml b/release/scripts/presets/interface_theme/back_to_black.xml index 18a3e539738..3af07c0cb4e 100644 --- a/release/scripts/presets/interface_theme/back_to_black.xml +++ b/release/scripts/presets/interface_theme/back_to_black.xml @@ -1,7 +1,9 @@ - - + - + + + + + @@ -586,7 +593,10 @@ selected_text="#202020" cursor="#ff0000" syntax_builtin="#cf3d99" + syntax_symbols="#4c4c4c" syntax_special="#969629" + syntax_preprocessor="#32008c" + syntax_reserved="#8c3c00" syntax_comment="#249d60" syntax_string="#cc3535" syntax_numbers="#3c68ff"> @@ -651,6 +661,8 @@ operator_node="#0e3157" group_node="#091a07" frame_node="#9a9b9ba0" + matte_node="#977474" + distor_node="#749797" noodle_curving="5"> - - + - + + + + + @@ -586,7 +593,10 @@ selected_text="#c67777" cursor="#ff0000" syntax_builtin="#800050" + syntax_symbols="#4c4c4c" syntax_special="#5f5f00" + syntax_preprocessor="#32008c" + syntax_reserved="#8c3c00" syntax_comment="#006432" syntax_string="#640000" syntax_numbers="#0000c8"> @@ -651,6 +661,8 @@ operator_node="#6c696f" group_node="#69756e" frame_node="#9a9b9ba0" + matte_node="#977474" + distor_node="#749797" noodle_curving="5"> - - + - + + + + + @@ -586,7 +593,10 @@ selected_text="#4e4e8f" cursor="#8b8bff" syntax_builtin="#808bed" + syntax_symbols="#4c4c4c" syntax_special="#c080d0" + syntax_preprocessor="#409090" + syntax_reserved="#8c3c00" syntax_comment="#cd8b00" syntax_string="#ffcd8b" syntax_numbers="#f0ad6d"> @@ -651,6 +661,8 @@ operator_node="#2c6f6f" group_node="#1e7524" frame_node="#9a9b9ba0" + matte_node="#977474" + distor_node="#749797" noodle_curving="5"> - - + - + + + + + @@ -586,7 +593,10 @@ selected_text="#c67777" cursor="#ff0000" syntax_builtin="#800050" + syntax_symbols="#4c4c4c" syntax_special="#5f5f00" + syntax_preprocessor="#32008c" + syntax_reserved="#8c3c00" syntax_comment="#006432" syntax_string="#640000" syntax_numbers="#0000c8"> @@ -651,6 +661,8 @@ operator_node="#6c697e" group_node="#69756e" frame_node="#9a9b9ba0" + matte_node="#977474" + distor_node="#749797" noodle_curving="5"> - - + - + + + + + @@ -586,7 +593,10 @@ selected_text="#641f44" cursor="#f47421" syntax_builtin="#d6ff01" + syntax_symbols="#4c4c4c" syntax_special="#33a500" + syntax_preprocessor="#be00ff" + syntax_reserved="#8c3c00" syntax_comment="#249d60" syntax_string="#6e00ff" syntax_numbers="#972144"> @@ -651,6 +661,8 @@ operator_node="#000000" group_node="#19b6ee" frame_node="#9a9b9ba0" + matte_node="#977474" + distor_node="#749797" noodle_curving="5"> Date: Tue, 29 Jan 2013 23:33:58 +0000 Subject: [PATCH 021/227] 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 +- .../editors/interface/interface_handlers.c | 72 +++++++++++++------ 2 files changed, 52 insertions(+), 22 deletions(-) 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); } From 11cf747ba2d54999e8f5ebc56a2dcb58a6dde2cf Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 02:27:13 +0000 Subject: [PATCH 022/227] 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(-) 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); From 2f53741cfe66fca724712f46a1321999a32a92e7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 03:12:19 +0000 Subject: [PATCH 023/227] 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(+) 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 */ From 7b6a34a75682839fb45372a16efec1c1bb10146a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 04:12:32 +0000 Subject: [PATCH 024/227] patch [#34039] Fix Alt key glitch on Unity desktop by Shinsuke Irie (irie) with own minor changes. --- intern/ghost/intern/GHOST_SystemX11.cpp | 43 +++++++++++++++++++++++++ intern/ghost/intern/GHOST_WindowX11.cpp | 15 ++++----- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 28a228b2777..7df7bed1f33 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -72,6 +72,9 @@ /* for debugging - so we can breakpoint X11 errors */ // #define USE_X11_ERROR_HANDLERS +/* see [#34039] Fix Alt key glitch on Unity desktop */ +#define USE_UNITY_WORKAROUND + static GHOST_TKey convertXKey(KeySym key); /* these are for copy and select copy */ @@ -496,6 +499,46 @@ processEvents( processEvent(&xevent); anyProcessed = true; + + +#ifdef USE_UNITY_WORKAROUND + /* note: processEvent() can't include this code because + * KeymapNotify event have no valid window information. */ + + /* the X server generates KeymapNotify event immediately after + * every EnterNotify and FocusIn event. we handle this event + * to correct modifier states. */ + if ((xevent.type == FocusIn || xevent.type == EnterNotify)) { + /* use previous event's window, because KeymapNotify event + * has no window information. */ + GHOST_WindowX11 *window = findGhostWindow(xevent.xany.window); + if (window) { + XNextEvent(m_display, &xevent); + + if (xevent.type == KeymapNotify) { + /* XK_Hyper_L/R currently unused */ + const static KeySym modifiers[8] = {XK_Shift_L, XK_Shift_R, + XK_Control_L, XK_Control_R, + XK_Alt_L, XK_Alt_R, + XK_Super_L, XK_Super_R}; + + for (int i = 0; i < (sizeof(modifiers) / sizeof(*modifiers)); i++) { + KeyCode kc = XKeysymToKeycode(m_display, modifiers[i]); + if (((xevent.xkeymap.key_vector[kc >> 3] >> (kc & 7)) & 1) != 0) { + pushEvent(new GHOST_EventKey( + getMilliSeconds(), + GHOST_kEventKeyDown, + window, + convertXKey(modifiers[i]), + '\0', + NULL)); + } + } + } + } + } +#endif /* USE_UNITY_WORKAROUND */ + } if (generateWindowExposeEvents()) { diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 2e9ac94b9c7..f53b5d9dd77 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -266,15 +266,14 @@ GHOST_WindowX11( /* Specify which events we are interested in hearing. */ xattributes.event_mask = - ExposureMask | StructureNotifyMask | - KeyPressMask | KeyReleaseMask | - EnterWindowMask | LeaveWindowMask | - ButtonPressMask | ButtonReleaseMask | - PointerMotionMask | FocusChangeMask | PropertyChangeMask; + ExposureMask | StructureNotifyMask | + KeyPressMask | KeyReleaseMask | + EnterWindowMask | LeaveWindowMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | FocusChangeMask | + PropertyChangeMask | KeymapStateMask; /* create the window! */ - - ; if (parentWindow == 0) { m_window = XCreateWindow(m_display, RootWindow(m_display, m_visual->screen), @@ -508,7 +507,7 @@ bool GHOST_WindowX11::createX11_XIC() EnterWindowMask | LeaveWindowMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | FocusChangeMask | - PropertyChangeMask | fevent); + PropertyChangeMask | KeymapStateMask | fevent); return true; } #endif From 26ee2a1f79c3513ca9eaeb6a3a8d855c37088468 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 05:19:27 +0000 Subject: [PATCH 025/227] patch [#33886] Combine Dissolve Menu with Delete Menu --- release/scripts/startup/bl_ui/space_view3d.py | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index ac63dfa7e32..6a0cf44a784 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -1682,7 +1682,6 @@ class VIEW3D_MT_edit_mesh(Menu): layout.operator("view3d.edit_mesh_extrude_individual_move", text="Extrude Individual") layout.operator("mesh.duplicate_move") layout.menu("VIEW3D_MT_edit_mesh_delete") - layout.menu("VIEW3D_MT_edit_mesh_dissolve") layout.separator() @@ -1945,21 +1944,12 @@ class VIEW3D_MT_edit_mesh_delete(Menu): layout.separator() layout.operator("mesh.dissolve") - layout.operator("mesh.edge_collapse") - layout.operator("mesh.delete_edgeloop", text="Edge Loop") - - -class VIEW3D_MT_edit_mesh_dissolve(Menu): - bl_label = "Dissolve" - - def draw(self, context): - layout = self.layout - - layout.operator("mesh.dissolve") + layout.operator("mesh.dissolve_limited") layout.separator() - layout.operator("mesh.dissolve_limited") + layout.operator("mesh.edge_collapse") + layout.operator("mesh.delete_edgeloop", text="Edge Loop") class VIEW3D_MT_edit_mesh_showhide(ShowHideMenu, Menu): From 9191b783bb2bc1a2d4be2b2cd215735e68353a56 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Wed, 30 Jan 2013 05:55:17 +0000 Subject: [PATCH 026/227] 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 --- doc/python_api/rst/bge.types.rst | 6 ++ .../editors/space_logic/logic_window.c | 19 +++++++ source/blender/makesdna/DNA_actuator_types.h | 7 ++- source/blender/makesrna/intern/rna_actuator.c | 17 ++++++ .../Converter/KX_ConvertActuators.cpp | 3 + .../Ketsji/KX_BulletPhysicsController.cpp | 17 ++++++ .../Ketsji/KX_BulletPhysicsController.h | 3 + .../gameengine/Ketsji/KX_CharacterWrapper.cpp | 29 ++++++++++ .../gameengine/Ketsji/KX_CharacterWrapper.h | 2 + .../gameengine/Ketsji/KX_IPhysicsController.h | 3 + .../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 ++++++ .../Physics/common/PHY_ICharacter.h | 4 ++ 16 files changed, 222 insertions(+), 17 deletions(-) diff --git a/doc/python_api/rst/bge.types.rst b/doc/python_api/rst/bge.types.rst index 1e2632b9ada..0d1b69ffc7b 100644 --- a/doc/python_api/rst/bge.types.rst +++ b/doc/python_api/rst/bge.types.rst @@ -3761,6 +3761,12 @@ Types :type: int + .. attribute:: walkDirection + + The speed and direction the character is traveling in using world coordinates. This should be used instead of applyMovement() to properly move the character. + + :type: list [x, y, z] + .. method:: jump() The character jumps based on it's jump speed. 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 From 43af754e4f3f39dc6fe7444840531c4d3432427e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 07:33:26 +0000 Subject: [PATCH 027/227] cmake config files BOOL type was ignored by cmake. --- .../cmake/config/blender_headless.cmake | 22 ++--- build_files/cmake/config/blender_lite.cmake | 86 +++++++++---------- build_files/cmake/config/bpy_module.cmake | 32 +++---- 3 files changed, 70 insertions(+), 70 deletions(-) diff --git a/build_files/cmake/config/blender_headless.cmake b/build_files/cmake/config/blender_headless.cmake index c4d64125744..cfde86aac6d 100644 --- a/build_files/cmake/config/blender_headless.cmake +++ b/build_files/cmake/config/blender_headless.cmake @@ -5,19 +5,19 @@ # cmake -C../blender/build_files/cmake/config/blender_headless.cmake ../blender # -set(WITH_HEADLESS ON CACHE FORCE BOOL) -set(WITH_GAMEENGINE OFF CACHE FORCE BOOL) +set(WITH_HEADLESS ON CACHE BOOL "" FORCE) +set(WITH_GAMEENGINE OFF CACHE BOOL "" FORCE) # disable audio, its possible some devs may want this but for now disable # so the python module doesnt hold the audio device and loads quickly. -set(WITH_AUDASPACE OFF CACHE FORCE BOOL) -set(WITH_FFTW3 OFF CACHE FORCE BOOL) -set(WITH_JACK OFF CACHE FORCE BOOL) -set(WITH_SDL OFF CACHE FORCE BOOL) -set(WITH_OPENAL OFF CACHE FORCE BOOL) -set(WITH_CODEC_FFMPEG OFF CACHE FORCE BOOL) -set(WITH_CODEC_SNDFILE OFF CACHE FORCE BOOL) +set(WITH_AUDASPACE OFF CACHE BOOL "" FORCE) +set(WITH_FFTW3 OFF CACHE BOOL "" FORCE) +set(WITH_JACK OFF CACHE BOOL "" FORCE) +set(WITH_SDL OFF CACHE BOOL "" FORCE) +set(WITH_OPENAL OFF CACHE BOOL "" FORCE) +set(WITH_CODEC_FFMPEG OFF CACHE BOOL "" FORCE) +set(WITH_CODEC_SNDFILE OFF CACHE BOOL "" FORCE) # other features which are not especially useful as a python module -set(WITH_X11_XINPUT OFF CACHE FORCE BOOL) -set(WITH_INPUT_NDOF OFF CACHE FORCE BOOL) +set(WITH_X11_XINPUT OFF CACHE BOOL "" FORCE) +set(WITH_INPUT_NDOF OFF CACHE BOOL "" FORCE) diff --git a/build_files/cmake/config/blender_lite.cmake b/build_files/cmake/config/blender_lite.cmake index e74d1adcb1b..f7778ac214d 100644 --- a/build_files/cmake/config/blender_lite.cmake +++ b/build_files/cmake/config/blender_lite.cmake @@ -5,47 +5,47 @@ # cmake -C../blender/build_files/cmake/config/blender_lite.cmake ../blender # -set(WITH_INSTALL_PORTABLE ON CACHE FORCE BOOL) -set(WITH_SYSTEM_GLEW ON CACHE FORCE BOOL) +set(WITH_INSTALL_PORTABLE ON CACHE BOOL "" FORCE) +set(WITH_SYSTEM_GLEW ON CACHE BOOL "" FORCE) -set(WITH_BUILDINFO OFF CACHE FORCE BOOL) -set(WITH_BULLET OFF CACHE FORCE BOOL) -set(WITH_CODEC_AVI OFF CACHE FORCE BOOL) -set(WITH_CODEC_FFMPEG OFF CACHE FORCE BOOL) -set(WITH_CODEC_SNDFILE OFF CACHE FORCE BOOL) -set(WITH_CYCLES OFF CACHE FORCE BOOL) -set(WITH_FFTW3 OFF CACHE FORCE BOOL) -set(WITH_LIBMV OFF CACHE FORCE BOOL) -set(WITH_GAMEENGINE OFF CACHE FORCE BOOL) -set(WITH_COMPOSITOR OFF CACHE FORCE BOOL) -set(WITH_GHOST_XDND OFF CACHE FORCE BOOL) -set(WITH_IK_SOLVER OFF CACHE FORCE BOOL) -set(WITH_IK_ITASC OFF CACHE FORCE BOOL) -set(WITH_IMAGE_CINEON OFF CACHE FORCE BOOL) -set(WITH_IMAGE_DDS OFF CACHE FORCE BOOL) -set(WITH_IMAGE_FRAMESERVER OFF CACHE FORCE BOOL) -set(WITH_IMAGE_HDR OFF CACHE FORCE BOOL) -set(WITH_IMAGE_OPENEXR OFF CACHE FORCE BOOL) -set(WITH_IMAGE_OPENJPEG OFF CACHE FORCE BOOL) -set(WITH_IMAGE_REDCODE OFF CACHE FORCE BOOL) -set(WITH_IMAGE_TIFF OFF CACHE FORCE BOOL) -set(WITH_INPUT_NDOF OFF CACHE FORCE BOOL) -set(WITH_INTERNATIONAL OFF CACHE FORCE BOOL) -set(WITH_JACK OFF CACHE FORCE BOOL) -set(WITH_LZMA OFF CACHE FORCE BOOL) -set(WITH_LZO OFF CACHE FORCE BOOL) -set(WITH_MOD_BOOLEAN OFF CACHE FORCE BOOL) -set(WITH_MOD_FLUID OFF CACHE FORCE BOOL) -set(WITH_MOD_REMESH OFF CACHE FORCE BOOL) -set(WITH_MOD_SMOKE OFF CACHE FORCE BOOL) -set(WITH_MOD_OCEANSIM OFF CACHE FORCE BOOL) -set(WITH_AUDASPACE OFF CACHE FORCE BOOL) -set(WITH_OPENAL OFF CACHE FORCE BOOL) -set(WITH_OPENCOLLADA OFF CACHE FORCE BOOL) -set(WITH_OPENCOLORIO OFF CACHE FORCE BOOL) -set(WITH_OPENMP OFF CACHE FORCE BOOL) -set(WITH_PYTHON_INSTALL OFF CACHE FORCE BOOL) -set(WITH_RAYOPTIMIZATION OFF CACHE FORCE BOOL) -set(WITH_SDL OFF CACHE FORCE BOOL) -set(WITH_X11_XINPUT OFF CACHE FORCE BOOL) -set(WITH_X11_XF86VMODE OFF CACHE FORCE BOOL) +set(WITH_BUILDINFO OFF CACHE BOOL "" FORCE) +set(WITH_BULLET OFF CACHE BOOL "" FORCE) +set(WITH_CODEC_AVI OFF CACHE BOOL "" FORCE) +set(WITH_CODEC_FFMPEG OFF CACHE BOOL "" FORCE) +set(WITH_CODEC_SNDFILE OFF CACHE BOOL "" FORCE) +set(WITH_CYCLES OFF CACHE BOOL "" FORCE) +set(WITH_FFTW3 OFF CACHE BOOL "" FORCE) +set(WITH_LIBMV OFF CACHE BOOL "" FORCE) +set(WITH_GAMEENGINE OFF CACHE BOOL "" FORCE) +set(WITH_COMPOSITOR OFF CACHE BOOL "" FORCE) +set(WITH_GHOST_XDND OFF CACHE BOOL "" FORCE) +set(WITH_IK_SOLVER OFF CACHE BOOL "" FORCE) +set(WITH_IK_ITASC OFF CACHE BOOL "" FORCE) +set(WITH_IMAGE_CINEON OFF CACHE BOOL "" FORCE) +set(WITH_IMAGE_DDS OFF CACHE BOOL "" FORCE) +set(WITH_IMAGE_FRAMESERVER OFF CACHE BOOL "" FORCE) +set(WITH_IMAGE_HDR OFF CACHE BOOL "" FORCE) +set(WITH_IMAGE_OPENEXR OFF CACHE BOOL "" FORCE) +set(WITH_IMAGE_OPENJPEG OFF CACHE BOOL "" FORCE) +set(WITH_IMAGE_REDCODE OFF CACHE BOOL "" FORCE) +set(WITH_IMAGE_TIFF OFF CACHE BOOL "" FORCE) +set(WITH_INPUT_NDOF OFF CACHE BOOL "" FORCE) +set(WITH_INTERNATIONAL OFF CACHE BOOL "" FORCE) +set(WITH_JACK OFF CACHE BOOL "" FORCE) +set(WITH_LZMA OFF CACHE BOOL "" FORCE) +set(WITH_LZO OFF CACHE BOOL "" FORCE) +set(WITH_MOD_BOOLEAN OFF CACHE BOOL "" FORCE) +set(WITH_MOD_FLUID OFF CACHE BOOL "" FORCE) +set(WITH_MOD_REMESH OFF CACHE BOOL "" FORCE) +set(WITH_MOD_SMOKE OFF CACHE BOOL "" FORCE) +set(WITH_MOD_OCEANSIM OFF CACHE BOOL "" FORCE) +set(WITH_AUDASPACE OFF CACHE BOOL "" FORCE) +set(WITH_OPENAL OFF CACHE BOOL "" FORCE) +set(WITH_OPENCOLLADA OFF CACHE BOOL "" FORCE) +set(WITH_OPENCOLORIO OFF CACHE BOOL "" FORCE) +set(WITH_OPENMP OFF CACHE BOOL "" FORCE) +set(WITH_PYTHON_INSTALL OFF CACHE BOOL "" FORCE) +set(WITH_RAYOPTIMIZATION OFF CACHE BOOL "" FORCE) +set(WITH_SDL OFF CACHE BOOL "" FORCE) +set(WITH_X11_XINPUT OFF CACHE BOOL "" FORCE) +set(WITH_X11_XF86VMODE OFF CACHE BOOL "" FORCE) diff --git a/build_files/cmake/config/bpy_module.cmake b/build_files/cmake/config/bpy_module.cmake index 6279f06214f..b5b13b40987 100644 --- a/build_files/cmake/config/bpy_module.cmake +++ b/build_files/cmake/config/bpy_module.cmake @@ -4,30 +4,30 @@ # cmake -C../blender/build_files/cmake/config/bpy_module.cmake ../blender # -set(WITH_PYTHON_MODULE ON CACHE FORCE BOOL) +set(WITH_PYTHON_MODULE ON CACHE BOOL "" FORCE) # install into the systems python dir -set(WITH_INSTALL_PORTABLE OFF CACHE FORCE BOOL) +set(WITH_INSTALL_PORTABLE OFF CACHE BOOL "" FORCE) # no point int copying python into python -set(WITH_PYTHON_INSTALL OFF CACHE FORCE BOOL) +set(WITH_PYTHON_INSTALL OFF CACHE BOOL "" FORCE) # dont build the game engine -set(WITH_GAMEENGINE OFF CACHE FORCE BOOL) +set(WITH_GAMEENGINE OFF CACHE BOOL "" FORCE) # disable audio, its possible some devs may want this but for now disable # so the python module doesnt hold the audio device and loads quickly. -set(WITH_AUDASPACE OFF CACHE FORCE BOOL) -set(WITH_FFTW3 OFF CACHE FORCE BOOL) -set(WITH_JACK OFF CACHE FORCE BOOL) -set(WITH_SDL OFF CACHE FORCE BOOL) -set(WITH_OPENAL OFF CACHE FORCE BOOL) -set(WITH_CODEC_FFMPEG OFF CACHE FORCE BOOL) -set(WITH_CODEC_SNDFILE OFF CACHE FORCE BOOL) +set(WITH_AUDASPACE OFF CACHE BOOL "" FORCE) +set(WITH_FFTW3 OFF CACHE BOOL "" FORCE) +set(WITH_JACK OFF CACHE BOOL "" FORCE) +set(WITH_SDL OFF CACHE BOOL "" FORCE) +set(WITH_OPENAL OFF CACHE BOOL "" FORCE) +set(WITH_CODEC_FFMPEG OFF CACHE BOOL "" FORCE) +set(WITH_CODEC_SNDFILE OFF CACHE BOOL "" FORCE) # other features which are not especially useful as a python module -set(WITH_X11_XINPUT OFF CACHE FORCE BOOL) -set(WITH_INPUT_NDOF OFF CACHE FORCE BOOL) -set(WITH_OPENCOLLADA OFF CACHE FORCE BOOL) -set(WITH_INTERNATIONAL OFF CACHE FORCE BOOL) -set(WITH_BULLET OFF CACHE FORCE BOOL) +set(WITH_X11_XINPUT OFF CACHE BOOL "" FORCE) +set(WITH_INPUT_NDOF OFF CACHE BOOL "" FORCE) +set(WITH_OPENCOLLADA OFF CACHE BOOL "" FORCE) +set(WITH_INTERNATIONAL OFF CACHE BOOL "" FORCE) +set(WITH_BULLET OFF CACHE BOOL "" FORCE) From c8015a27888a4c87360b1af158fc9b70bd4112ae Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 11:06:02 +0000 Subject: [PATCH 028/227] 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. --- .../blender/editors/space_clip/clip_toolbar.c | 27 ++++++++---- .../editors/space_view3d/view3d_toolbar.c | 41 ++++++++++++------- source/blender/editors/util/undo.c | 1 + 3 files changed, 45 insertions(+), 24 deletions(-) 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); - block = uiLayoutGetBlock(pa->layout); + 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); + 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) - return; - - block = uiLayoutGetBlock(pa->layout); - - if (!WM_operator_check_ui_enabled(C, op->type->name)) - uiLayoutSetEnabled(pa->layout, FALSE); + ARegion *ar; + ARegion *ar1; - /* 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); + if (op == NULL) { + 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); + + 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); From 54223ed05b7e2840865b5e46ed6d43573ff2b4ae Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 12:22:02 +0000 Subject: [PATCH 029/227] 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 + .../editors/space_view3d/space_view3d.c | 2 +- .../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 + .../windowmanager/intern/wm_event_system.c | 57 ++++++++++++++----- 9 files changed, 65 insertions(+), 19 deletions(-) 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,6 +1443,19 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand if (ot->flag & OPTYPE_UNDO) wm->op_undo_depth--; + 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; + } + else if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) { + WM_operator_free(op); + 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); @@ -1428,18 +1467,6 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand CTX_wm_region_set(C, NULL); } - if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) - wm_operator_reports(C, op, retval, FALSE); - - if (retval & OPERATOR_FINISHED) { - wm_operator_finished(C, op, 0); - handler->op = NULL; - } - else if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) { - WM_operator_free(op); - handler->op = 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); From 452a52575cbc33551017d940ba86dda7a2c8c30b Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 30 Jan 2013 13:42:12 +0000 Subject: [PATCH 030/227] Cycles material preview: fix for generated/packed/movie files Issue was caused by cycles trying to find builtin images in a main database and in case of preview render images are not in database, they're just referenced by shader node tree. Now builtin images in cycles have got void* pointer to store data needed to load builtin images. In case ob blender session, this pointer will store pointer from PointerRNA for image datablock and used later to construct Image class based on this pointer. This also saves database lookup for final render which is nice :) Reviewed by Brecht. --- intern/cycles/blender/blender_session.cpp | 44 +++++++++++------------ intern/cycles/blender/blender_session.h | 8 ++--- intern/cycles/blender/blender_shader.cpp | 7 ++-- intern/cycles/render/image.cpp | 32 ++++++++--------- intern/cycles/render/image.h | 14 ++++---- intern/cycles/render/nodes.cpp | 16 ++++----- intern/cycles/render/nodes.h | 4 +-- 7 files changed, 61 insertions(+), 64 deletions(-) diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 650d3d387ee..c390c13a7c2 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -111,9 +111,9 @@ void BlenderSession::create_session() b_engine.use_highlight_tiles(session_params.progressive_refine == false); /* setup callbacks for builtin image support */ - scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3, _4, _5); - scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2); - scene->image_manager->builtin_image_float_pixels_cb = function_bind(&BlenderSession::builtin_image_float_pixels, this, _1, _2); + scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3, _4, _5, _6); + scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2, _3); + scene->image_manager->builtin_image_float_pixels_cb = function_bind(&BlenderSession::builtin_image_float_pixels, this, _1, _2, _3); } void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_) @@ -622,23 +622,19 @@ void BlenderSession::test_cancel() /* builtin image file name is actually an image datablock name with * absolute sequence frame number concatenated via '@' character * - * this function splits image id name and frame number from a - * builtin image name + * this function splits frame from builtin name */ -void BlenderSession::builtin_name_split(const string &builtin_name, string &name, int &frame) +int BlenderSession::builtin_image_frame(const string &builtin_name) { int last = builtin_name.find_last_of('@'); - name = builtin_name.substr(0, last); - frame = atoi(builtin_name.substr(last + 1, builtin_name.size() - last - 1).c_str()); + return atoi(builtin_name.substr(last + 1, builtin_name.size() - last - 1).c_str()); } -void BlenderSession::builtin_image_info(const string &builtin_name, bool &is_float, int &width, int &height, int &channels) +void BlenderSession::builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &channels) { - string name; - int frame; - builtin_name_split(builtin_name, name, frame); - - BL::Image b_image = b_data.images[name]; + PointerRNA ptr; + RNA_id_pointer_create((ID*)builtin_data, &ptr); + BL::Image b_image(ptr); if(b_image) { is_float = b_image.is_float(); @@ -654,13 +650,13 @@ void BlenderSession::builtin_image_info(const string &builtin_name, bool &is_flo } } -bool BlenderSession::builtin_image_pixels(const string &builtin_name, unsigned char *pixels) +bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels) { - string name; - int frame; - builtin_name_split(builtin_name, name, frame); + int frame = builtin_image_frame(builtin_name); - BL::Image b_image = b_data.images[name]; + PointerRNA ptr; + RNA_id_pointer_create((ID*)builtin_data, &ptr); + BL::Image b_image(ptr); if(b_image) { int width = b_image.size()[0]; @@ -696,13 +692,13 @@ bool BlenderSession::builtin_image_pixels(const string &builtin_name, unsigned c return false; } -bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, float *pixels) +bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void *builtin_data, float *pixels) { - string name; - int frame; - builtin_name_split(builtin_name, name, frame); + int frame = builtin_image_frame(builtin_name); - BL::Image b_image = b_data.images[name]; + PointerRNA ptr; + RNA_id_pointer_create((ID*)builtin_data, &ptr); + BL::Image b_image(ptr); if(b_image) { int width = b_image.size()[0]; diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h index 686ff3d1be9..0210df9c044 100644 --- a/intern/cycles/blender/blender_session.h +++ b/intern/cycles/blender/blender_session.h @@ -94,10 +94,10 @@ protected: void do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only); void do_write_update_render_tile(RenderTile& rtile, bool do_update_only); - void builtin_name_split(const string &builtin_name, string &name, int &frame); - void builtin_image_info(const string &builtin_name, bool &is_float, int &width, int &height, int &channels); - bool builtin_image_pixels(const string &builtin_name, unsigned char *pixels); - bool builtin_image_float_pixels(const string &builtin_name, float *pixels); + int builtin_image_frame(const string &builtin_name); + void builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &channels); + bool builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels); + bool builtin_image_float_pixels(const string &builtin_name, void *builtin_data, float *pixels); }; CCL_NAMESPACE_END diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index b1eaedba47a..0f7dc15db19 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -529,11 +529,11 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen int scene_frame = b_scene.frame_current(); int image_frame = image_user_frame_number(b_image_node.image_user(), scene_frame); image->filename = b_image.name() + "@" + string_printf("%d", image_frame); - image->is_builtin = true; + image->builtin_data = b_image.ptr.data; } else { image->filename = image_user_file_path(b_image_node.image_user(), b_image, b_scene.frame_current()); - image->is_builtin = false; + image->builtin_data = NULL; } image->animated = b_image_node.image_user().use_auto_refresh(); @@ -558,11 +558,12 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen int scene_frame = b_scene.frame_current(); int image_frame = image_user_frame_number(b_env_node.image_user(), scene_frame); env->filename = b_image.name() + "@" + string_printf("%d", image_frame); - env->is_builtin = true; + env->builtin_data = b_image.ptr.data; } else { env->filename = image_user_file_path(b_env_node.image_user(), b_image, b_scene.frame_current()); env->animated = b_env_node.image_user().use_auto_refresh(); + env->builtin_data = NULL; } } env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()]; diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index e6f8ab4a5d9..6bfaf48c0c9 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -85,14 +85,14 @@ bool ImageManager::set_animation_frame_update(int frame) return false; } -bool ImageManager::is_float_image(const string& filename, bool is_builtin) +bool ImageManager::is_float_image(const string& filename, void *builtin_data) { bool is_float = false; - if(is_builtin) { + if(builtin_data) { if(builtin_image_info_cb) { int width, height, channels; - builtin_image_info_cb(filename, is_float, width, height, channels); + builtin_image_info_cb(filename, builtin_data, is_float, width, height, channels); } return is_float; @@ -123,13 +123,13 @@ bool ImageManager::is_float_image(const string& filename, bool is_builtin) return is_float; } -int ImageManager::add_image(const string& filename, bool is_builtin, bool animated, bool& is_float) +int ImageManager::add_image(const string& filename, void *builtin_data, bool animated, bool& is_float) { Image *img; size_t slot; /* load image info and find out if we need a float texture */ - is_float = (pack_images)? false: is_float_image(filename, is_builtin); + is_float = (pack_images)? false: is_float_image(filename, builtin_data); if(is_float) { /* find existing image */ @@ -160,7 +160,7 @@ int ImageManager::add_image(const string& filename, bool is_builtin, bool animat /* add new image */ img = new Image(); img->filename = filename; - img->is_builtin = is_builtin; + img->builtin_data = builtin_data; img->need_load = true; img->animated = animated; img->users = 1; @@ -195,7 +195,7 @@ int ImageManager::add_image(const string& filename, bool is_builtin, bool animat /* add new image */ img = new Image(); img->filename = filename; - img->is_builtin = is_builtin; + img->builtin_data = builtin_data; img->need_load = true; img->animated = animated; img->users = 1; @@ -209,12 +209,12 @@ int ImageManager::add_image(const string& filename, bool is_builtin, bool animat return slot; } -void ImageManager::remove_image(const string& filename, bool is_builtin) +void ImageManager::remove_image(const string& filename, void *builtin_data) { size_t slot; for(slot = 0; slot < images.size(); slot++) { - if(images[slot] && images[slot]->filename == filename && images[slot]->is_builtin == is_builtin) { + if(images[slot] && images[slot]->filename == filename && images[slot]->builtin_data == builtin_data) { /* decrement user count */ images[slot]->users--; assert(images[slot]->users >= 0); @@ -232,7 +232,7 @@ void ImageManager::remove_image(const string& filename, bool is_builtin) if(slot == images.size()) { /* see if it's in a float texture slot */ for(slot = 0; slot < float_images.size(); slot++) { - if(float_images[slot] && float_images[slot]->filename == filename && float_images[slot]->is_builtin == is_builtin) { + if(float_images[slot] && float_images[slot]->filename == filename && float_images[slot]->builtin_data == builtin_data) { /* decrement user count */ float_images[slot]->users--; assert(float_images[slot]->users >= 0); @@ -257,7 +257,7 @@ bool ImageManager::file_load_image(Image *img, device_vector& tex_img) ImageInput *in = NULL; int width, height, components; - if(!img->is_builtin) { + if(!img->builtin_data) { /* load image from file through OIIO */ in = ImageInput::create(img->filename); @@ -281,7 +281,7 @@ bool ImageManager::file_load_image(Image *img, device_vector& tex_img) return false; bool is_float; - builtin_image_info_cb(img->filename, is_float, width, height, components); + builtin_image_info_cb(img->filename, img->builtin_data, is_float, width, height, components); } /* we only handle certain number of components */ @@ -309,7 +309,7 @@ bool ImageManager::file_load_image(Image *img, device_vector& tex_img) delete in; } else { - builtin_image_pixels_cb(img->filename, pixels); + builtin_image_pixels_cb(img->filename, img->builtin_data, pixels); } if(components == 3) { @@ -340,7 +340,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector& tex_ ImageInput *in = NULL; int width, height, components; - if(!img->is_builtin) { + if(!img->builtin_data) { /* load image from file through OIIO */ in = ImageInput::create(img->filename); @@ -365,7 +365,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector& tex_ return false; bool is_float; - builtin_image_info_cb(img->filename, is_float, width, height, components); + builtin_image_info_cb(img->filename, img->builtin_data, is_float, width, height, components); } if(!(components == 1 || components == 3 || components == 4)) { @@ -391,7 +391,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector& tex_ delete in; } else { - builtin_image_float_pixels_cb(img->filename, pixels); + builtin_image_float_pixels_cb(img->filename, img->builtin_data, pixels); } if(components == 3) { diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h index e39ac14b60f..464b87ff530 100644 --- a/intern/cycles/render/image.h +++ b/intern/cycles/render/image.h @@ -51,9 +51,9 @@ public: ImageManager(); ~ImageManager(); - int add_image(const string& filename, bool is_builtin, bool animated, bool& is_float); - void remove_image(const string& filename, bool is_builtin); - bool is_float_image(const string& filename, bool is_builtin); + int add_image(const string& filename, void *builtin_data, bool animated, bool& is_float); + void remove_image(const string& filename, void *builtin_data); + bool is_float_image(const string& filename, void *builtin_data); void device_update(Device *device, DeviceScene *dscene, Progress& progress); void device_free(Device *device, DeviceScene *dscene); @@ -65,9 +65,9 @@ public: bool need_update; - boost::function builtin_image_info_cb; - boost::function builtin_image_pixels_cb; - boost::function builtin_image_float_pixels_cb; + boost::function builtin_image_info_cb; + boost::function builtin_image_pixels_cb; + boost::function builtin_image_float_pixels_cb; private: int tex_num_images; int tex_num_float_images; @@ -77,7 +77,7 @@ private: struct Image { string filename; - bool is_builtin; + void *builtin_data; bool need_load; bool animated; diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 5444299b948..a0a933ef682 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -142,7 +142,7 @@ ImageTextureNode::ImageTextureNode() slot = -1; is_float = -1; filename = ""; - is_builtin = false; + builtin_data = NULL; color_space = ustring("Color"); projection = ustring("Flat"); projection_blend = 0.0f; @@ -156,7 +156,7 @@ ImageTextureNode::ImageTextureNode() ImageTextureNode::~ImageTextureNode() { if(image_manager) - image_manager->remove_image(filename, is_builtin); + image_manager->remove_image(filename, builtin_data); } ShaderNode *ImageTextureNode::clone() const @@ -177,7 +177,7 @@ void ImageTextureNode::compile(SVMCompiler& compiler) image_manager = compiler.image_manager; if(is_float == -1) { bool is_float_bool; - slot = image_manager->add_image(filename, is_builtin, animated, is_float_bool); + slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool); is_float = (int)is_float_bool; } @@ -238,7 +238,7 @@ void ImageTextureNode::compile(OSLCompiler& compiler) tex_mapping.compile(compiler); if(is_float == -1) - is_float = (int)image_manager->is_float_image(filename, false); + is_float = (int)image_manager->is_float_image(filename, NULL); compiler.parameter("filename", filename.c_str()); if(is_float || color_space != "Color") @@ -272,7 +272,7 @@ EnvironmentTextureNode::EnvironmentTextureNode() slot = -1; is_float = -1; filename = ""; - is_builtin = false; + builtin_data = NULL; color_space = ustring("Color"); projection = ustring("Equirectangular"); animated = false; @@ -285,7 +285,7 @@ EnvironmentTextureNode::EnvironmentTextureNode() EnvironmentTextureNode::~EnvironmentTextureNode() { if(image_manager) - image_manager->remove_image(filename, is_builtin); + image_manager->remove_image(filename, builtin_data); } ShaderNode *EnvironmentTextureNode::clone() const @@ -306,7 +306,7 @@ void EnvironmentTextureNode::compile(SVMCompiler& compiler) image_manager = compiler.image_manager; if(slot == -1) { bool is_float_bool; - slot = image_manager->add_image(filename, is_builtin, animated, is_float_bool); + slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool); is_float = (int)is_float_bool; } @@ -356,7 +356,7 @@ void EnvironmentTextureNode::compile(OSLCompiler& compiler) tex_mapping.compile(compiler); if(is_float == -1) - is_float = (int)image_manager->is_float_image(filename, false); + is_float = (int)image_manager->is_float_image(filename, NULL); compiler.parameter("filename", filename.c_str()); compiler.parameter("projection", projection); diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 8b2d6a0e5c8..66be919d098 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -70,7 +70,7 @@ public: int slot; int is_float; string filename; - bool is_builtin; + void *builtin_data; ustring color_space; ustring projection; float projection_blend; @@ -90,7 +90,7 @@ public: int slot; int is_float; string filename; - bool is_builtin; + void *builtin_data; ustring color_space; ustring projection; bool animated; From 743b4f213e3252d20f2a55c6f5cd5a9e4b0e22cb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 13:44:24 +0000 Subject: [PATCH 031/227] disable ubuntu unity workaround, causes issues with modifier keys held doun with multiple windows. no time to fix now so disabling. --- intern/ghost/intern/GHOST_SystemX11.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 7df7bed1f33..10c93db64d8 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -73,7 +73,7 @@ // #define USE_X11_ERROR_HANDLERS /* see [#34039] Fix Alt key glitch on Unity desktop */ -#define USE_UNITY_WORKAROUND +// #define USE_UNITY_WORKAROUND static GHOST_TKey convertXKey(KeySym key); From 343fb03677b0983e85aa1b4f82dcc02e755f5196 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 15:34:02 +0000 Subject: [PATCH 032/227] startup.blend edits - make timeline less tall. - make outliner more tall. - set node and image channel displayes to RGBA. --- release/datafiles/startup.blend | Bin 407724 -> 410988 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/release/datafiles/startup.blend b/release/datafiles/startup.blend index 599bfb50d6eeca22e442b9ff25d88b0451efd633..d19cd414eb457970567857e61332b9ec60243de2 100644 GIT binary patch literal 410988 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 Date: Wed, 30 Jan 2013 15:43:13 +0000 Subject: [PATCH 033/227] 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(-) 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(); + MemoryBuffer *tile = (MemoryBuffer *)this->m_inputProgram->initializeTileData(NULL); + int x, y, i; + int width = tile->getWidth(); + int height = tile->getHeight(); + float *buffer = tile->getBuffer(); - /* - 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"); + int half_window = this->m_iterations; + int window = half_window * 2 + 1; - 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; - } + 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); - for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { - int start = (i + 1) * window - 1; + int bwidth = rect->xmax - rect->xmin; + int bheight = rect->ymax - rect->ymin; - 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]); - } + // 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; - 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]); - } - } + // 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 (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; + 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]); } - 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]); - } - - 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 (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]); } } - - MEM_freeN(temp); - MEM_freeN(buf); - this->m_cached_buffer = rectf; } - unlockMutex(); - return this->m_cached_buffer; + + // 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; + + 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 + (rect->ymin-ymin)) + x] = max(temp[y], temp[y + window - 1]); + } + } + } + + 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(); + 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; - 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"); + int half_window = this->m_iterations; + int window = half_window * 2 + 1; - 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; - } + 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); - for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { - int start = (i + 1) * window - 1; + int bwidth = rect->xmax - rect->xmin; + int bheight = rect->ymax - rect->ymin; - 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]); - } + // 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; - 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]); - } - } + // 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 (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; + 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]); } - 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]); - } - - 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 (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]); } } - - MEM_freeN(temp); - MEM_freeN(buf); - this->m_cached_buffer = rectf; } - unlockMutex(); - return this->m_cached_buffer; + + // 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; + + 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 + (rect->ymin-ymin)) + x] = min(temp[y], temp[y + window - 1]); + } + } + } + + 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; } From dc0f4b56183cd81b6ba4653d281f6b8ec236a574 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 30 Jan 2013 15:57:15 +0000 Subject: [PATCH 034/227] Cycles: make multiple importance sampling for lamps an option per lamp now, disabled by default for backwards compatibility. http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Integrator --- intern/cycles/blender/addon/properties.py | 14 +++++--- intern/cycles/blender/addon/ui.py | 5 ++- intern/cycles/blender/blender_object.cpp | 1 + intern/cycles/kernel/kernel_emission.h | 4 +-- intern/cycles/kernel/kernel_light.h | 39 ++++------------------- intern/cycles/kernel/kernel_path.h | 4 +-- intern/cycles/kernel/kernel_types.h | 5 +-- intern/cycles/render/light.cpp | 28 ++++++++++++++-- intern/cycles/render/light.h | 1 + 9 files changed, 55 insertions(+), 46 deletions(-) diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 3661274ae43..5f585fcb99c 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -462,8 +462,8 @@ class CyclesMaterialSettings(bpy.types.PropertyGroup): type=cls, ) cls.sample_as_light = BoolProperty( - name="Sample as Lamp", - description="Use direct light sampling for this material, " + name="Multiple Importance Sample", + description="Use multiple importance sampling for this material, " "disabling may reduce overall noise for large " "objects that emit little light compared to other light sources", default=True, @@ -499,6 +499,12 @@ class CyclesLampSettings(bpy.types.PropertyGroup): min=1, max=10000, default=1, ) + cls.use_multiple_importance_sampling = BoolProperty( + name="Multiple Importance Sample", + description="Use multiple importance sampling for the lamp, " + "reduces noise for area lamps and sharp glossy materials", + default=False, + ) @classmethod def unregister(cls): @@ -514,8 +520,8 @@ class CyclesWorldSettings(bpy.types.PropertyGroup): type=cls, ) cls.sample_as_light = BoolProperty( - name="Sample as Lamp", - description="Use direct light sampling for the environment, " + name="Multiple Importance Sample", + description="Use multiple importance sampling for the environment, " "enabling for non-solid colors is recommended", default=False, ) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index a42b69dc5c6..ad9253fd68b 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -574,6 +574,8 @@ class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel): col = split.column() col.prop(clamp, "cast_shadow") + layout.prop(clamp, "use_multiple_importance_sampling") + if lamp.type == 'HEMI': layout.label(text="Not supported, interpreted as sun lamp.") @@ -807,9 +809,10 @@ class CyclesMaterial_PT_settings(CyclesButtonsPanel, Panel): col.prop(mat, "diffuse_color", text="Viewport Color") col = split.column() - col.prop(cmat, "sample_as_light") col.prop(mat, "pass_index") + layout.prop(cmat, "sample_as_light") + class CyclesTexture_PT_context(CyclesButtonsPanel, Panel): bl_label = "" diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index e9bcea70ab6..a9d37dbed99 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -156,6 +156,7 @@ void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSI /* shadow */ PointerRNA clamp = RNA_pointer_get(&b_lamp.ptr, "cycles"); light->cast_shadow = get_boolean(clamp, "cast_shadow"); + light->use_mis = get_boolean(clamp, "use_multiple_importance_sampling"); light->samples = get_int(clamp, "samples"); /* tag */ diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 54bc0717b60..e234d54e228 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -93,7 +93,7 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, } /* return lamp index for MIS */ - if(ls.use_mis) + if(ls.shader & SHADER_USE_MIS) *lamp = ls.lamp; else *lamp= ~0; @@ -114,7 +114,7 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, shader_bsdf_eval(kg, sd, ls.D, eval, &bsdf_pdf); - if(ls.use_mis) { + if(ls.shader & SHADER_USE_MIS) { /* multiple importance sampling */ float mis_weight = power_heuristic(ls.pdf, bsdf_pdf); light_eval *= mis_weight; diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index 6ba3e439329..8b32b7bd2e8 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -31,7 +31,6 @@ typedef struct LightSample { int prim; /* primitive id for triangle/curve ligths */ int shader; /* shader id */ int lamp; /* lamp id */ - int use_mis; /* for lamps with size zero */ LightType type; /* type of light */ } LightSample; @@ -218,11 +217,10 @@ __device void lamp_light_sample(KernelGlobals *kg, int lamp, LightType type = (LightType)__float_as_int(data0.x); ls->type = type; -#ifdef __LAMP_MIS__ - ls->use_mis = true; -#else - ls->use_mis = false; -#endif + ls->shader = __float_as_int(data1.x); + ls->object = ~0; + ls->prim = ~0; + ls->lamp = lamp; if(type == LIGHT_DISTANT) { /* distant light */ @@ -233,10 +231,6 @@ __device void lamp_light_sample(KernelGlobals *kg, int lamp, if(radius > 0.0f) D = distant_light_sample(D, radius, randu, randv); -#ifdef __LAMP_MIS__ - else - ls->use_mis = false; -#endif ls->P = D; ls->Ng = D; @@ -257,9 +251,6 @@ __device void lamp_light_sample(KernelGlobals *kg, int lamp, ls->D = -D; ls->t = FLT_MAX; ls->eval_fac = 1.0f; -#ifndef __LAMP_MIS__ - ls->use_mis = true; -#endif } #endif else { @@ -271,10 +262,6 @@ __device void lamp_light_sample(KernelGlobals *kg, int lamp, if(radius > 0.0f) /* sphere light */ ls->P += sphere_light_sample(P, ls->P, radius, randu, randv); -#ifdef __LAMP_MIS__ - else - ls->use_mis = false; -#endif ls->D = normalize_len(ls->P - P, &ls->t); ls->Ng = -ls->D; @@ -304,13 +291,6 @@ __device void lamp_light_sample(KernelGlobals *kg, int lamp, float invarea = data2.x; - if(invarea == 0.0f) { -#ifdef __LAMP_MIS__ - ls->use_mis = false; -#endif - invarea = 1.0f; - } - ls->eval_fac = 0.25f*invarea; ls->pdf = invarea; } @@ -318,11 +298,6 @@ __device void lamp_light_sample(KernelGlobals *kg, int lamp, ls->eval_fac *= kernel_data.integrator.inv_pdf_lights; ls->pdf *= lamp_light_pdf(kg, ls->Ng, -ls->D, ls->t); } - - ls->shader = __float_as_int(data1.x); - ls->object = ~0; - ls->prim = ~0; - ls->lamp = lamp; } __device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D, float t, LightSample *ls) @@ -336,7 +311,6 @@ __device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D, f ls->object = ~0; ls->prim = ~0; ls->lamp = lamp; - ls->use_mis = false; /* flag not used for eval */ if(type == LIGHT_DISTANT) { /* distant light */ @@ -475,7 +449,7 @@ __device void triangle_light_sample(KernelGlobals *kg, int prim, int object, ls->object = object; ls->prim = prim; ls->lamp = ~0; - ls->use_mis = true; + ls->shader |= SHADER_USE_MIS; ls->t = 0.0f; ls->type = LIGHT_AREA; ls->eval_fac = 1.0f; @@ -529,11 +503,10 @@ __device void curve_segment_light_sample(KernelGlobals *kg, int prim, int object ls->object = object; ls->prim = prim; ls->lamp = ~0; - ls->use_mis = true; ls->t = 0.0f; ls->type = LIGHT_STRAND; ls->eval_fac = 1.0f; - ls->shader = __float_as_int(v00.z); + ls->shader = __float_as_int(v00.z) | SHADER_USE_MIS; object_transform_light_sample(kg, ls, object, time); } diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 1a5df66e6c2..06276c8167a 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -254,7 +254,7 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample, bool hit = scene_intersect(kg, &ray, visibility, &isect); #ifdef __LAMP_MIS__ - if(kernel_data.integrator.pdf_lights > 0.0f && !(state.flag & PATH_RAY_CAMERA)) { + if(kernel_data.integrator.use_lamp_mis && !(state.flag & PATH_RAY_CAMERA)) { /* ray starting from previous non-transparent bounce */ Ray light_ray; @@ -501,7 +501,7 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray bool hit = scene_intersect(kg, &ray, visibility, &isect); #ifdef __LAMP_MIS__ - if(kernel_data.integrator.pdf_lights > 0.0f && !(state.flag & PATH_RAY_CAMERA)) { + if(kernel_data.integrator.use_lamp_mis && !(state.flag & PATH_RAY_CAMERA)) { /* ray starting from previous non-transparent bounce */ Ray light_ray; diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 1236f43e018..2ef3d71dd1d 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -288,8 +288,9 @@ typedef enum ShaderFlag { SHADER_SMOOTH_NORMAL = (1 << 31), SHADER_CAST_SHADOW = (1 << 30), SHADER_AREA_LIGHT = (1 << 29), + SHADER_USE_MIS = (1 << 28), - SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT) + SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT|SHADER_USE_MIS) } ShaderFlag; /* Light Type */ @@ -680,7 +681,7 @@ typedef struct KernelIntegrator { int transmission_samples; int ao_samples; int mesh_light_samples; - int pad1; + int use_lamp_mis; } KernelIntegrator; typedef struct KernelBVH { diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index 04fea1953e7..e7fb9514371 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -115,6 +115,8 @@ Light::Light() spot_smooth = 0.0f; cast_shadow = true; + use_mis = false; + shader = 0; samples = 1; } @@ -291,13 +293,19 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen /* point lights */ float lightarea = (totarea > 0.0f)? totarea/scene->lights.size(): 1.0f; + bool use_lamp_mis = false; for(int i = 0; i < scene->lights.size(); i++, offset++) { + Light *light = scene->lights[i]; + distribution[offset].x = totarea; distribution[offset].y = __int_as_float(~(int)i); distribution[offset].z = 1.0f; - distribution[offset].w = scene->lights[i]->size; + distribution[offset].w = light->size; totarea += lightarea; + + if(light->size > 0.0f && light->use_mis) + use_lamp_mis = true; } /* normalize cumulative distribution functions */ @@ -344,6 +352,8 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen kintegrator->inv_pdf_lights = 1.0f/kintegrator->pdf_lights; } + kintegrator->use_lamp_mis = use_lamp_mis; + /* CDF */ device->tex_alloc("__light_distribution", dscene->light_distribution); } @@ -355,6 +365,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen kintegrator->pdf_triangles = 0.0f; kintegrator->pdf_lights = 0.0f; kintegrator->inv_pdf_lights = 0.0f; + kintegrator->use_lamp_mis = false; } } @@ -484,6 +495,9 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce float radius = light->size; float invarea = (radius > 0.0f)? 1.0f/(M_PI_F*radius*radius): 1.0f; + if(light->use_mis && radius > 0.0f) + shader_id |= SHADER_USE_MIS; + light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), co.x, co.y, co.z); light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), radius, invarea, 0.0f); light_data[i*LIGHT_SIZE + 2] = make_float4(0.0f, 0.0f, 0.0f, 0.0f); @@ -498,6 +512,9 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce float area = M_PI_F*radius*radius; float invarea = (area > 0.0f)? 1.0f/area: 1.0f; + if(light->use_mis && area > 0.0f) + shader_id |= SHADER_USE_MIS; + light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), dir.x, dir.y, dir.z); light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), radius, cosangle, invarea); light_data[i*LIGHT_SIZE + 2] = make_float4(0.0f, 0.0f, 0.0f, 0.0f); @@ -505,6 +522,7 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce } else if(light->type == LIGHT_BACKGROUND) { shader_id &= ~SHADER_AREA_LIGHT; + shader_id |= SHADER_USE_MIS; light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), 0.0f, 0.0f, 0.0f); light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), 0.0f, 0.0f, 0.0f); @@ -515,7 +533,10 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce float3 axisu = light->axisu*(light->sizeu*light->size); float3 axisv = light->axisv*(light->sizev*light->size); float area = len(axisu)*len(axisv); - float invarea = (area > 0.0f)? 1.0f/area: 0.0f; + float invarea = (area > 0.0f)? 1.0f/area: 1.0f; + + if(light->use_mis && area > 0.0f) + shader_id |= SHADER_USE_MIS; light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), co.x, co.y, co.z); light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), axisu.x, axisu.y, axisu.z); @@ -530,6 +551,9 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce float spot_angle = cosf(light->spot_angle*0.5f); float spot_smooth = (1.0f - spot_angle)*light->spot_smooth; + if(light->use_mis && radius > 0.0f) + shader_id |= SHADER_USE_MIS; + light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), co.x, co.y, co.z); light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), radius, invarea, spot_angle); light_data[i*LIGHT_SIZE + 2] = make_float4(spot_smooth, dir.x, dir.y, dir.z); diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h index 3cedde2596e..acd1692a41f 100644 --- a/intern/cycles/render/light.h +++ b/intern/cycles/render/light.h @@ -52,6 +52,7 @@ public: float spot_smooth; bool cast_shadow; + bool use_mis; int shader; int samples; From f6f5d17a50e27090d248d480417b020e024c930b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 30 Jan 2013 17:04:51 +0000 Subject: [PATCH 035/227] Fix #33984: cycles shadow pass problem with CUDA. --- intern/cycles/blender/blender_python.cpp | 2 +- intern/cycles/kernel/kernel_emission.h | 11 ++++------- intern/cycles/kernel/kernel_path.h | 18 +++++++----------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 676fba76ddf..a10f3b63033 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -54,7 +54,7 @@ static PyObject *create_func(PyObject *self, PyObject *args) PyObject *pyengine, *pyuserpref, *pydata, *pyscene, *pyregion, *pyv3d, *pyrv3d; int preview_osl; - if(!PyArg_ParseTuple(args, "OOOOOOOp", &pyengine, &pyuserpref, &pydata, &pyscene, &pyregion, &pyv3d, &pyrv3d, &preview_osl)) + if(!PyArg_ParseTuple(args, "OOOOOOOi", &pyengine, &pyuserpref, &pydata, &pyscene, &pyregion, &pyv3d, &pyrv3d, &preview_osl)) return NULL; /* RNA */ diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index e234d54e228..4048bbd9dfc 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -76,7 +76,7 @@ __device float3 direct_emissive_eval(KernelGlobals *kg, float rando, __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, float randt, float rando, float randu, float randv, Ray *ray, BsdfEval *eval, - int *lamp) + bool *is_lamp) { LightSample ls; @@ -92,12 +92,6 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, light_sample(kg, randt, randu, randv, sd->time, sd->P, &ls); } - /* return lamp index for MIS */ - if(ls.shader & SHADER_USE_MIS) - *lamp = ls.lamp; - else - *lamp= ~0; - if(ls.pdf == 0.0f) return false; @@ -146,6 +140,9 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, ray->t = 0.0f; } + /* return if it's a lamp for shadow pass */ + *is_lamp = (ls.prim == ~0); + return true; } diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 06276c8167a..b029acfd2a5 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -399,19 +399,18 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample, Ray light_ray; BsdfEval L_light; - int lamp; + bool is_lamp; #ifdef __OBJECT_MOTION__ light_ray.time = sd.time; #endif - if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &lamp)) { + if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp)) { /* trace shadow ray */ float3 shadow; if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - bool is_lamp = (lamp != ~0); path_radiance_accum_light(&L, throughput, &L_light, shadow, state.bounce, is_lamp); } } @@ -612,20 +611,19 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray Ray light_ray; BsdfEval L_light; - int lamp; + bool is_lamp; #ifdef __OBJECT_MOTION__ light_ray.time = sd.time; #endif /* sample random light */ - if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &lamp)) { + if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp)) { /* trace shadow ray */ float3 shadow; if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - bool is_lamp = (lamp != ~0); path_radiance_accum_light(L, throughput, &L_light, shadow, state.bounce, is_lamp); } } @@ -819,7 +817,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam if(sd.flag & SD_BSDF_HAS_EVAL) { Ray light_ray; BsdfEval L_light; - int lamp; + bool is_lamp; #ifdef __OBJECT_MOTION__ light_ray.time = sd.time; @@ -837,13 +835,12 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam float light_u = path_rng(kg, rng, sample*num_samples + j, rng_offset + PRNG_LIGHT_U); float light_v = path_rng(kg, rng, sample*num_samples + j, rng_offset + PRNG_LIGHT_V); - if(direct_emission(kg, &sd, i, 0.0f, 0.0f, light_u, light_v, &light_ray, &L_light, &lamp)) { + if(direct_emission(kg, &sd, i, 0.0f, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp)) { /* trace shadow ray */ float3 shadow; if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - bool is_lamp = (lamp != ~0); path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow, state.bounce, is_lamp); } } @@ -867,13 +864,12 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam if(kernel_data.integrator.num_all_lights) light_t = 0.5f*light_t; - if(direct_emission(kg, &sd, -1, light_t, 0.0f, light_u, light_v, &light_ray, &L_light, &lamp)) { + if(direct_emission(kg, &sd, -1, light_t, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp)) { /* trace shadow ray */ float3 shadow; if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - bool is_lamp = (lamp != ~0); path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow, state.bounce, is_lamp); } } From 00025c74b49bb32b1803858b2d7731751a074514 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 21:17:09 +0000 Subject: [PATCH 036/227] 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(-) 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; From 4e7b18876c3e995f030f865072cdad0e0ca6ea94 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 30 Jan 2013 21:17:38 +0000 Subject: [PATCH 037/227] style cleanup --- source/blender/blenlib/BLI_mempool.h | 7 +++++ .../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(-) 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) { From b5c439db4748b334a81b12cd134261915e47b3ab Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 30 Jan 2013 21:58:47 +0000 Subject: [PATCH 038/227] Fix cycles windows link errors when building with OSL master branch. --- CMakeLists.txt | 7 ++++++- intern/cycles/CMakeLists.txt | 1 + intern/cycles/SConscript | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59dbeaed36b..e400380390f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1136,11 +1136,16 @@ elseif(WIN32) debug libboost_date_time-${BOOST_DEBUG_POSTFIX} debug libboost_filesystem-${BOOST_DEBUG_POSTFIX} debug libboost_regex-${BOOST_DEBUG_POSTFIX} debug libboost_system-${BOOST_DEBUG_POSTFIX} debug libboost_thread-${BOOST_DEBUG_POSTFIX}) + if(WITH_CYCLES_OSL) + set(BOOST_LIBRARIES ${BOOST_LIBRARIES} + optimized libboost_wave-${BOOST_POSTFIX} + debug libboost_wave-${BOOST_DEBUG_POSTFIX}) + endif() if(WITH_INTERNATIONAL) set(BOOST_LIBRARIES ${BOOST_LIBRARIES} optimized libboost_locale-${BOOST_POSTFIX} debug libboost_locale-${BOOST_DEBUG_POSTFIX}) - endif(WITH_INTERNATIONAL) + endif() set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB") endif() diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 048a2a50a7f..535239a9205 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -44,6 +44,7 @@ endif() if(WITH_CYCLES_OSL) add_definitions(-DWITH_OSL) + add_definitions(-DOSL_STATIC_LIBRARY) include_directories(${OSL_INCLUDES}) endif() diff --git a/intern/cycles/SConscript b/intern/cycles/SConscript index 44a17ac0cd6..19af7dede9f 100644 --- a/intern/cycles/SConscript +++ b/intern/cycles/SConscript @@ -51,6 +51,7 @@ defs.append('WITH_CUDA') if env['WITH_BF_CYCLES_OSL']: defs.append('WITH_OSL') + defs.append('OSL_STATIC_LIBRARY') incs.append(cycles['BF_OSL_INC']) incs.extend('. bvh render device kernel kernel/osl kernel/svm util subd'.split()) From b53c6c180ec96e320758f4a702eb0ab5725617b2 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Wed, 30 Jan 2013 22:21:55 +0000 Subject: [PATCH 039/227] Cycles: * One more fix for Boost Linker errors with new OSL master branch. --- build_files/scons/config/win64-vc-config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_files/scons/config/win64-vc-config.py b/build_files/scons/config/win64-vc-config.py index c0ea7972aeb..7597dd85beb 100644 --- a/build_files/scons/config/win64-vc-config.py +++ b/build_files/scons/config/win64-vc-config.py @@ -178,7 +178,7 @@ WITH_BF_STATICOCIO = True WITH_BF_BOOST = True BF_BOOST = '${LIBDIR}/boost' BF_BOOST_INC = '${BF_BOOST}/include' -BF_BOOST_LIB = 'libboost_date_time-vc90-mt-s-1_49 libboost_filesystem-vc90-mt-s-1_49 libboost_regex-vc90-mt-s-1_49 libboost_system-vc90-mt-s-1_49 libboost_thread-vc90-mt-s-1_49' +BF_BOOST_LIB = 'libboost_date_time-vc90-mt-s-1_49 libboost_filesystem-vc90-mt-s-1_49 libboost_regex-vc90-mt-s-1_49 libboost_system-vc90-mt-s-1_49 libboost_thread-vc90-mt-s-1_49 libboost_wave-vc90-mt-s-1_49' BF_BOOST_LIB_INTERNATIONAL = ' libboost_locale-vc90-mt-s-1_49' BF_BOOST_LIBPATH = '${BF_BOOST}/lib' From d7623c0e161297a66c44bf54e38a0db4c2d59942 Mon Sep 17 00:00:00 2001 From: Dan Eicher Date: Wed, 30 Jan 2013 23:54:49 +0000 Subject: [PATCH 040/227] 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(-) 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; } From 29456505f3749dd00fc53351faef0306836361f3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 05:37:52 +0000 Subject: [PATCH 041/227] 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. --- .../blender/windowmanager/intern/wm_window.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) 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; } From c2ee59b7771898677e348308d62fb27cbce28589 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 05:55:57 +0000 Subject: [PATCH 042/227] initializing maximized/fullscreen windows in x11 would start normal, then maximize - causing noticeable flicker. --- intern/ghost/intern/GHOST_WindowX11.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index f53b5d9dd77..934dec8e047 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -328,6 +328,26 @@ GHOST_WindowX11( GHOST_PRINT("Set drop target\n"); #endif + if (state == GHOST_kWindowStateMaximized || state == GHOST_kWindowStateFullScreen) { + Atom _NET_WM_STATE = XInternAtom(m_display, "_NET_WM_STATE", False); + Atom _NET_WM_STATE_MAXIMIZED_VERT = XInternAtom(m_display, "_NET_WM_STATE_MAXIMIZED_VERT", False); + Atom _NET_WM_STATE_MAXIMIZED_HORZ = XInternAtom(m_display, "_NET_WM_STATE_MAXIMIZED_HORZ", False); + Atom _NET_WM_STATE_FULLSCREEN = XInternAtom(m_display, "_NET_WM_STATE_FULLSCREEN", False); + Atom atoms[2]; + int count = 0; + + if (state == GHOST_kWindowStateMaximized) { + atoms[count++] = _NET_WM_STATE_MAXIMIZED_VERT; + atoms[count++] = _NET_WM_STATE_MAXIMIZED_HORZ; + } + else { + atoms[count++] = _NET_WM_STATE_FULLSCREEN; + } + + XChangeProperty(m_display, m_window, _NET_WM_STATE, XA_ATOM, 32, + PropModeReplace, (unsigned char *)atoms, count); + m_post_init = False; + } /* * One of the problem with WM-spec is that can't set a property * to a window that isn't mapped. That is why we can't "just @@ -339,7 +359,7 @@ GHOST_WindowX11( * So, m_post_init indicate that we need wait for the MapNotify * event and then set the Window state to the m_post_state. */ - if ((state != GHOST_kWindowStateNormal) && (state != GHOST_kWindowStateMinimized)) { + else if ((state != GHOST_kWindowStateNormal) && (state != GHOST_kWindowStateMinimized)) { m_post_init = True; m_post_state = state; } From acf04f003f9713f3a834b790a20ba19d2616bc6a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 06:38:35 +0000 Subject: [PATCH 043/227] 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(-) 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); From b77eccf80139ed8de65c205f6f723ae827e82c07 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 08:19:11 +0000 Subject: [PATCH 044/227] 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 ++++++++++++++ .../blender/editors/animation/fmodifier_ui.c | 83 +------------- source/blender/makesrna/intern/rna_fcurve.c | 107 ++++++++++++++++++ 4 files changed, 197 insertions(+), 82 deletions(-) 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); From baf29d883e4a22169890b1883e81090ec4c01277 Mon Sep 17 00:00:00 2001 From: Miika Hamalainen Date: Thu, 31 Jan 2013 08:55:00 +0000 Subject: [PATCH 045/227] Fix msvc compile --- source/blender/makesrna/intern/rna_fcurve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 */ From 4d2efa877e305fc29121030120b7c53ae57950c4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 09:53:34 +0000 Subject: [PATCH 046/227] 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(-) 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; } From 73f301c3a8a28dd25ea850a54d968fc6c4f2b83e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 10:42:26 +0000 Subject: [PATCH 047/227] 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(). --- intern/ghost/GHOST_C-api.h | 14 ++++++++++++++ intern/ghost/GHOST_ISystem.h | 6 ++++++ intern/ghost/intern/GHOST_C-api.cpp | 7 +++++++ intern/ghost/intern/GHOST_SystemCarbon.cpp | 5 +++++ intern/ghost/intern/GHOST_SystemCarbon.h | 6 ++++++ intern/ghost/intern/GHOST_SystemCocoa.h | 5 +++++ intern/ghost/intern/GHOST_SystemCocoa.mm | 5 +++++ intern/ghost/intern/GHOST_SystemWin32.cpp | 5 +++++ intern/ghost/intern/GHOST_SystemWin32.h | 8 +++++++- intern/ghost/intern/GHOST_SystemX11.cpp | 17 +++++++++++++++++ intern/ghost/intern/GHOST_SystemX11.h | 10 ++++++++++ source/blender/windowmanager/intern/wm_window.c | 13 ++++++++++++- source/blender/windowmanager/wm_window.h | 1 + 13 files changed, 100 insertions(+), 2 deletions(-) diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index ffdee6c1550..a92d0d33b65 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -148,6 +148,20 @@ extern void GHOST_GetMainDisplayDimensions(GHOST_SystemHandle systemhandle, GHOST_TUns32 *width, GHOST_TUns32 *height); +/** + * Returns the dimensions of all displays combine + * (the current workspace). + * No need to worrky about overlapping monitors. + * \param systemhandle The handle to the system + * \param width A pointer the width gets put in + * \param height A pointer the height gets put in + * \return void. + */ +extern void GHOST_GetAllDisplayDimensions(GHOST_SystemHandle systemhandle, + GHOST_TUns32 *width, + GHOST_TUns32 *height); + + /** * Create a new window. * The new window is added to the list of windows managed. diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h index 1b3509c1ac3..841293e09e4 100644 --- a/intern/ghost/GHOST_ISystem.h +++ b/intern/ghost/GHOST_ISystem.h @@ -226,6 +226,12 @@ public: */ virtual void getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const = 0; + /** + * Returns the combine dimensions of all monitors. + * \return The dimension of the workspace. + */ + virtual void getAllDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const = 0; + /** * Create a new window. * The new window is added to the list of windows managed. diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index be64acf8c94..7622a2a7330 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -123,7 +123,14 @@ void GHOST_GetMainDisplayDimensions(GHOST_SystemHandle systemhandle, system->getMainDisplayDimensions(*width, *height); } +void GHOST_GetAllDisplayDimensions(GHOST_SystemHandle systemhandle, + GHOST_TUns32 *width, + GHOST_TUns32 *height) +{ + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; + system->getAllDisplayDimensions(*width, *height); +} GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, const char *title, diff --git a/intern/ghost/intern/GHOST_SystemCarbon.cpp b/intern/ghost/intern/GHOST_SystemCarbon.cpp index f5784c7d451..bb6b1bfd4af 100644 --- a/intern/ghost/intern/GHOST_SystemCarbon.cpp +++ b/intern/ghost/intern/GHOST_SystemCarbon.cpp @@ -396,6 +396,11 @@ void GHOST_SystemCarbon::getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUn height = bnds.bottom - bnds.top; } +void GHOST_SystemCarbon::getAllDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const +{ + /* TODO */ + getMainDisplayDimensions(width, height); +} GHOST_IWindow *GHOST_SystemCarbon::createWindow( const STR_String& title, diff --git a/intern/ghost/intern/GHOST_SystemCarbon.h b/intern/ghost/intern/GHOST_SystemCarbon.h index 61e5a086a0f..b6821bc7419 100644 --- a/intern/ghost/intern/GHOST_SystemCarbon.h +++ b/intern/ghost/intern/GHOST_SystemCarbon.h @@ -91,6 +91,12 @@ public: * \return The dimension of the main display. */ virtual void getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const; + + /** + * Returns the combine dimensions of all monitors. + * \return The dimension of the workspace. + */ + virtual void getAllDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const; /** * Create a new window. diff --git a/intern/ghost/intern/GHOST_SystemCocoa.h b/intern/ghost/intern/GHOST_SystemCocoa.h index a1b372dac9a..257aeb52a37 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.h +++ b/intern/ghost/intern/GHOST_SystemCocoa.h @@ -89,6 +89,11 @@ public: */ virtual void getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const; + /** Returns the combine dimensions of all monitors. + * \return The dimension of the workspace. + */ + virtual void getAllDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const; + /** * Create a new window. * The new window is added to the list of windows managed. diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index 1665180b687..e4245aaf095 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -719,6 +719,11 @@ void GHOST_SystemCocoa::getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns [pool drain]; } +void GHOST_SystemCocoa::getAllDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const +{ + /* TODO! */ + getMainDisplayDimensions(width, height); +} GHOST_IWindow* GHOST_SystemCocoa::createWindow( const STR_String& title, diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 50d7b372dd6..138109ce48b 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -215,6 +215,11 @@ void GHOST_SystemWin32::getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns height = ::GetSystemMetrics(SM_CYSCREEN); } +void GHOST_SystemWin32::getAllDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const +{ + width = ::GetSystemMetrics(SM_XVIRTUALSCREEN); + height = ::GetSystemMetrics(SM_YVIRTUALSCREEN); +} GHOST_IWindow *GHOST_SystemWin32::createWindow( const STR_String& title, diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 6a756d35872..e47dbda2e92 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -100,7 +100,13 @@ public: * \return The dimension of the main display. */ virtual void getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const; - + + /** + * Returns the dimensions of all displays on this system. + * \return The dimension of the main display. + */ + virtual void getAllDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const; + /** * Create a new window. * The new window is added to the list of windows managed. diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 10c93db64d8..1e815870fc9 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -242,6 +242,23 @@ getMainDisplayDimensions( } } + +/** + * Returns the dimensions of the main display on this system. + * \return The dimension of the main display. + */ +void +GHOST_SystemX11:: +getAllDisplayDimensions( + GHOST_TUns32& width, + GHOST_TUns32& height) const +{ + if (m_display) { + width = DisplayWidth(m_display, DefaultScreen(m_display)); + height = DisplayHeight(m_display, DefaultScreen(m_display)); + } +} + /** * Create a new window. * The new window is added to the list of windows managed. diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h index a5d5d9b7a99..5fd494637f9 100644 --- a/intern/ghost/intern/GHOST_SystemX11.h +++ b/intern/ghost/intern/GHOST_SystemX11.h @@ -116,6 +116,16 @@ public: GHOST_TUns32& height ) const; + /** + * Returns the dimensions of all displays on this system. + * \return The dimension of the main display. + */ + void + getAllDisplayDimensions( + GHOST_TUns32& width, + GHOST_TUns32& height + ) const; + /** * Create a new window. * The new window is added to the list of windows managed. 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); From dbf54dacf7e3fabe6ccb0e36a1743c91ac445b28 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 11:05:09 +0000 Subject: [PATCH 048/227] 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. --- CMakeLists.txt | 6 +++ intern/ghost/CMakeLists.txt | 10 ++++ intern/ghost/intern/GHOST_SystemX11.cpp | 48 ++++++++++++++++++- source/blender/makesrna/intern/rna_fcurve.c | 1 - .../blender/windowmanager/intern/wm_window.c | 13 ++--- 5 files changed, 65 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e400380390f..fbacb37b24e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -166,6 +166,7 @@ unset(PLATFORM_DEFAULT) if(UNIX AND NOT APPLE) option(WITH_X11_XINPUT "Enable X11 Xinput (tablet support and unicode input)" ON) + option(WITH_X11_XINERAMA "Enable multi-monitor support" ON) option(WITH_X11_XF86VMODE "Enable X11 video mode switching" ON) option(WITH_SYSTEM_GLEW "Use GLEW OpenGL wrapper library provided by the operating system" ON) @@ -414,6 +415,7 @@ if(WITH_GHOST_SDL OR WITH_HEADLESS) set(WITH_GHOST_XDND OFF) set(WITH_X11_XF86VMODE OFF) set(WITH_X11_XINPUT OFF) + set(WITH_X11_XINERAMA OFF) endif() if(MINGW) @@ -800,6 +802,10 @@ if(UNIX AND NOT APPLE) set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinput_LIB}") endif() + if(WITH_X11_XINERAMA) + set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinerama_LIB}") + endif() + if(WITH_X11_XF86VMODE) # XXX, why dont cmake make this available? FIND_LIBRARY(X11_Xxf86vmode_LIB Xxf86vm ${X11_LIB_SEARCH_PATH}) diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt index ea09987c564..c6269d49b47 100644 --- a/intern/ghost/CMakeLists.txt +++ b/intern/ghost/CMakeLists.txt @@ -271,6 +271,16 @@ elseif(UNIX) if(WITH_X11_XINPUT) add_definitions(-DWITH_X11_XINPUT) + list(APPEND INC_SYS + ${X11_Xinput_INCLUDE_PATH} + ) + endif() + + if(WITH_X11_XINERAMA) + add_definitions(-DWITH_X11_XINERAMA) + list(APPEND INC_SYS + ${X11_Xinerama_INCLUDE_PATH} + ) endif() elseif(WIN32) diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 1e815870fc9..6902b2e8347 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -50,6 +50,10 @@ # include "GHOST_DropTargetX11.h" #endif +#ifdef WITH_X11_XINERAMA +# include "X11/extensions/Xinerama.h" +#endif + #include "GHOST_Debug.h" #include @@ -237,8 +241,48 @@ getMainDisplayDimensions( GHOST_TUns32& height) const { if (m_display) { - width = DisplayWidth(m_display, DefaultScreen(m_display)); - height = DisplayHeight(m_display, DefaultScreen(m_display)); + +#ifdef WITH_X11_XINERAMA + GHOST_TInt32 m_x = 1, m_y = 1; + getCursorPosition(m_x, m_y); + + /* NOTE, no way to select a primary monitor, uses the first */ + bool success = false; + int dummy1, dummy2; + if (XineramaQueryExtension(m_display, &dummy1, &dummy2)) { + if (XineramaIsActive(m_display)) { + int heads = 0; + XineramaScreenInfo *p = XineramaQueryScreens(m_display, &heads); + /* with a single head, all dimensions is fine */ + if (heads > 1) { + int i; + for (i = 0; i < heads; i++) { + if ((m_x >= p[i].x_org) && (m_x <= p[i].x_org + p[i].width) && + (m_y >= p[i].y_org) && (m_y <= p[i].y_org + p[i].height)) + { + width = p[i].width; + height = p[i].height; + break; + } + } + /* highly unlikely! */ + if (i == heads) { + width = p[0].width; + height = p[0].height; + } + success = true; + } + XFree(p); + } + } + + if (success) { + return; + } +#endif + + /* fallback to all */ + getAllDisplayDimensions(width, height); } } 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 } From e6613389e76eedc9712576cce887e9492cfa523f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 11:10:43 +0000 Subject: [PATCH 049/227] write all crashlogs into the temp directory (not next to blend files). --- source/creator/creator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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"); } From 9c99bcd3685cc49768502074b8a7ba9572d2dbc4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 11:17:08 +0000 Subject: [PATCH 050/227] 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(-) 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"); } From ad76a8a10c22e251c9d22dc20cdc9613e0c785e8 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 31 Jan 2013 12:24:12 +0000 Subject: [PATCH 051/227] Fix scons building under unix. Now we should really have only *one* '/usr/lib' lib search path, in last position! Previously we could have a bunch of those, even in first position, which would e.g. prevent linking against a custom boost in /opt/lib/boost if you had a system boost installed... --- build_files/scons/tools/Blender.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/build_files/scons/tools/Blender.py b/build_files/scons/tools/Blender.py index 94a9f1d9c24..3688a829a4d 100644 --- a/build_files/scons/tools/Blender.py +++ b/build_files/scons/tools/Blender.py @@ -29,6 +29,7 @@ from SCons.Script.SConscript import SConsEnvironment import SCons.Action import SCons.Util import SCons.Builder +import SCons.Subst import SCons.Tool import bcolors bc = bcolors.bcolors() @@ -234,10 +235,6 @@ def setup_staticlibs(lenv): if lenv['WITH_BF_STATICLLVM']: statlibs += Split(lenv['BF_LLVM_LIB_STATIC']) - # setting this last so any overriding of manually libs could be handled - if lenv['OURPLATFORM'] not in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross', 'win64-mingw'): - libincs.append('/usr/lib') - if lenv['WITH_BF_JEMALLOC']: libincs += Split(lenv['BF_JEMALLOC_LIBPATH']) if lenv['WITH_BF_STATICJEMALLOC']: @@ -249,6 +246,12 @@ def setup_staticlibs(lenv): if lenv['WITH_BF_STATIC3DMOUSE']: statlibs += Split(lenv['BF_3DMOUSE_LIB_STATIC']) + # setting this last so any overriding of manually libs could be handled + if lenv['OURPLATFORM'] not in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross', 'win64-mingw'): + # We must remove any previous items defining this path, for same reason stated above! + libincs = [e for e in libincs if SCons.Subst.scons_subst(e, lenv, gvars=lenv.Dictionary()) != "/usr/lib"] + libincs.append('/usr/lib') + return statlibs, libincs def setup_syslibs(lenv): From 7d3c6b27601e761b4aa4122a273bd9d308bff25d Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Thu, 31 Jan 2013 12:54:06 +0000 Subject: [PATCH 052/227] 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(-) 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); From 122a2084b5c056befb6627a1d12ee337f0fe07fe Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 Jan 2013 13:44:03 +0000 Subject: [PATCH 053/227] Attempt to fix cycles OSL link error on windows 64 bit. --- intern/cycles/kernel/osl/osl_services.cpp | 9 +++++++++ intern/cycles/kernel/osl/osl_services.h | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index 92a023bd765..4088904c338 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -328,6 +328,15 @@ bool OSLRenderServices::get_inverse_matrix(OSL::Matrix44 &result, ustring to) return false; } +bool OSLRenderServices::transform_points(OSL::ShaderGlobals *sg, ustring from, + ustring to, float time, + const OSL::Vec3 *Pin, OSL::Vec3 *Pout, + int npoints, + TypeDesc::VECSEMANTICS vectype) +{ + return false; +} + bool OSLRenderServices::get_array_attribute(void *renderstate, bool derivatives, ustring object, TypeDesc type, ustring name, int index, void *val) diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h index 50c50b9952c..5cd1056e352 100644 --- a/intern/cycles/kernel/osl/osl_services.h +++ b/intern/cycles/kernel/osl/osl_services.h @@ -59,6 +59,10 @@ public: bool get_matrix(OSL::Matrix44 &result, ustring from); bool get_inverse_matrix(OSL::Matrix44 &result, ustring from); + bool transform_points(OSL::ShaderGlobals *sg, ustring from, ustring to, + float time, const OSL::Vec3 *Pin, OSL::Vec3 *Pout, int npoints, + TypeDesc::VECSEMANTICS vectype); + bool get_array_attribute(void *renderstate, bool derivatives, ustring object, TypeDesc type, ustring name, int index, void *val); From ba7e37c2b6ea87c08dac697257360edcea2ae8f4 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 Jan 2013 13:44:13 +0000 Subject: [PATCH 054/227] 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(-) 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"); From 3a4c317b877c3c5c061808d2aa8a437fe30d5eee Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 31 Jan 2013 14:25:07 +0000 Subject: [PATCH 055/227] =?UTF-8?q?Fix=20UI=20translation=20partly=20missi?= =?UTF-8?q?ng=20in=20scons=20builds=20(reported=20by=20Leon=20Cheung=20and?= =?UTF-8?q?=20Gabriel=20Gazz=C3=A1n=20on=20ML,=20and=20lockal=20on=20IRC,?= =?UTF-8?q?=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(-) 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 From a5cef69a0dc0b86d13d2fd16695db77094804c96 Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Thu, 31 Jan 2013 15:08:37 +0000 Subject: [PATCH 056/227] 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 - --- .../compositor/nodes/COM_TranslateNode.cpp | 7 +- .../operations/COM_TranslateOperation.cpp | 118 ++++++++++++++++-- .../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 ++++ .../makesrna/intern/rna_nodetree_types.h | 2 +- .../nodes/node_composite_translate.c | 8 ++ 8 files changed, 167 insertions(+), 10 deletions(-) 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); } From 757546036c0c67e2c345547a68d95e17d7e1a0ac Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 Jan 2013 15:31:47 +0000 Subject: [PATCH 057/227] 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(+) 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"); From 7b6e78e48a63952a699b2af346d7ac6a131b15ad Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 Jan 2013 16:19:44 +0000 Subject: [PATCH 058/227] 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. --- .../editors/interface/interface_anim.c | 15 +++++++- .../editors/interface/interface_handlers.c | 38 ++++++++++--------- 2 files changed, 34 insertions(+), 19 deletions(-) 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"), From d319d68c6584d90acc65e62fd94d34772710ab3a Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Thu, 31 Jan 2013 17:38:09 +0000 Subject: [PATCH 059/227] OSL 1.3x / Windows 64: * Added missing define into SConscript file. This also makes r54232 obsolete, so removing this again. --- intern/cycles/kernel/osl/SConscript | 1 + intern/cycles/kernel/osl/osl_services.cpp | 9 --------- intern/cycles/kernel/osl/osl_services.h | 4 ---- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/intern/cycles/kernel/osl/SConscript b/intern/cycles/kernel/osl/SConscript index fe7fec463a7..09899567128 100644 --- a/intern/cycles/kernel/osl/SConscript +++ b/intern/cycles/kernel/osl/SConscript @@ -46,6 +46,7 @@ defs.append('WITH_OSL') if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'): cxxflags.append('-DBOOST_NO_RTTI -DBOOST_NO_TYPEID'.split()) incs.append(env['BF_PTHREADS_INC']) + defs.append('OSL_STATIC_LIBRARY') else: cxxflags.append('-fno-rtti -DBOOST_NO_RTTI -DBOOST_NO_TYPEID'.split()) diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index 4088904c338..92a023bd765 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -328,15 +328,6 @@ bool OSLRenderServices::get_inverse_matrix(OSL::Matrix44 &result, ustring to) return false; } -bool OSLRenderServices::transform_points(OSL::ShaderGlobals *sg, ustring from, - ustring to, float time, - const OSL::Vec3 *Pin, OSL::Vec3 *Pout, - int npoints, - TypeDesc::VECSEMANTICS vectype) -{ - return false; -} - bool OSLRenderServices::get_array_attribute(void *renderstate, bool derivatives, ustring object, TypeDesc type, ustring name, int index, void *val) diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h index 5cd1056e352..50c50b9952c 100644 --- a/intern/cycles/kernel/osl/osl_services.h +++ b/intern/cycles/kernel/osl/osl_services.h @@ -59,10 +59,6 @@ public: bool get_matrix(OSL::Matrix44 &result, ustring from); bool get_inverse_matrix(OSL::Matrix44 &result, ustring from); - bool transform_points(OSL::ShaderGlobals *sg, ustring from, ustring to, - float time, const OSL::Vec3 *Pin, OSL::Vec3 *Pout, int npoints, - TypeDesc::VECSEMANTICS vectype); - bool get_array_attribute(void *renderstate, bool derivatives, ustring object, TypeDesc type, ustring name, int index, void *val); From 64c6736ef2888eaf2f694536eaf4b10b99c2de54 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 20:41:47 +0000 Subject: [PATCH 060/227] disable xinerama and xinput if libraries are missing. --- CMakeLists.txt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fbacb37b24e..f5bca0a071f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -799,11 +799,19 @@ if(UNIX AND NOT APPLE) set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_X11_LIB}") if(WITH_X11_XINPUT) - set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinput_LIB}") + if(X11_Xinput_LIB) + set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinput_LIB}") + else() + set(WITH_X11_XINPUT OFF) + endif() endif() if(WITH_X11_XINERAMA) - set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinerama_LIB}") + if(X11_Xinerama_LIB) + set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinerama_LIB}") + else() + set(WITH_X11_XINERAMA OFF) + endif() endif() if(WITH_X11_XF86VMODE) @@ -2138,6 +2146,7 @@ if(FIRST_RUN) info_cfg_option(WITH_INSTALL_PORTABLE) info_cfg_option(WITH_X11_XF86VMODE) info_cfg_option(WITH_X11_XINPUT) + info_cfg_option(WITH_X11_XINERAMA) info_cfg_option(WITH_MEM_JEMALLOC) info_cfg_option(WITH_SYSTEM_GLEW) info_cfg_option(WITH_SYSTEM_OPENJPEG) From a9015e3f7da9c4885fe6d73841037fcce8cc48cd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 21:15:38 +0000 Subject: [PATCH 061/227] style cleanup --- .../operations/COM_TranslateOperation.cpp | 56 +++++++++++-------- .../editors/interface/interface_layout.c | 2 +- source/blender/makesdna/DNA_node_types.h | 2 +- 3 files changed, 35 insertions(+), 25 deletions(-) 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 { - // Negative offset: Append image data from the right - if (x < (this->getWidth() + this->m_relativeOffsetX)) + } + else { originalXPos = x - this->m_relativeOffsetX; - else + } + } + 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; @@ -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 { - // Negative offset: Append image data from the top - if (y < (this->getHeight() + this->m_relativeOffsetY)) + if (this->m_relativeOffsetY > 0) { + if (y < this->m_relativeOffsetY) { + originalYPos = this->getHeight() - this->m_relativeOffsetY + y; + } + else { originalYPos = y - this->m_relativeOffsetY; - else + } + } + 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; 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; From 2007d57fdc10fd26f063303634b6eb0768eab58e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 21:56:14 +0000 Subject: [PATCH 062/227] 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(-) 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; } } From c734808fb0422339341a3567bea90498b4046e9d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 22:18:37 +0000 Subject: [PATCH 063/227] 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 +- .../editors/transform/transform_input.c | 12 +++++++- 3 files changed, 26 insertions(+), 19 deletions(-) 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]; + const int start[2] = {co_orig[0], co_orig[1]}; + const int end[2] = {co_curr[0], co_curr[1]}; - 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_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; From a2543d417313814993f62574d0d0c19c9d411975 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Jan 2013 23:25:06 +0000 Subject: [PATCH 064/227] expose WITH_BOOST as a cmake option, this just disables boost deps since it was becoming annoying to remember all of them. --- CMakeLists.txt | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f5bca0a071f..ace3803e0d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,6 +269,9 @@ mark_as_advanced(WITH_CXX_GUARDEDALLOC) option(WITH_ASSERT_ABORT "Call abort() when raising an assertion through BLI_assert()" OFF) mark_as_advanced(WITH_ASSERT_ABORT) +option(WITH_BOOST "Enable features depending no boost" ON) + + if(APPLE) cmake_minimum_required(VERSION 2.8.8) cmake_policy(VERSION 2.8.8) @@ -396,9 +399,22 @@ if(WITH_CYCLES) set(WITH_OPENIMAGEIO ON) endif() -# auto enable boost for cycles, booleans, audaspace or i18n -if(WITH_CYCLES OR WITH_MOD_BOOLEAN OR WITH_AUDASPACE OR WITH_INTERNATIONAL) - set(WITH_BOOST ON) +# enable boost for cycles, booleans, audaspace or i18n +# otherwise if the user disabled +if(NOT WITH_BOOST) + # Explicitly disabled. so disable all deps. + set(WITH_CYCLES OFF) + set(WITH_MOD_BOOLEAN OFF) + set(WITH_AUDASPACE OFF) + set(WITH_INTERNATIONAL OFF) + + set(WITH_OPENAL OFF) # depends on AUDASPACE + set(WITH_GAMEENGINE OFF) # depends on AUDASPACE +elseif(WITH_CYCLES OR WITH_MOD_BOOLEAN OR WITH_AUDASPACE OR WITH_INTERNATIONAL) + # Keep enabled +else() + # Enabled but we don't need it + set(WITH_BOOST OFF) endif() # auto enable llvm for cycles_osl @@ -2184,12 +2200,10 @@ if(FIRST_RUN) info_cfg_option(WITH_MOD_FLUID) info_cfg_option(WITH_MOD_OCEANSIM) + # debug + message(STATUS "HAVE_STDBOOL_H = ${HAVE_STDBOOL_H}") + info_cfg_text("") message("${_config_msg}") endif() - -# debug -message( - STATUS "HAVE_STDBOOL_H = ${HAVE_STDBOOL_H}" -) From 63419193546b677103345a6543f8f99c4192293f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Feb 2013 01:01:20 +0000 Subject: [PATCH 065/227] code cleanup: make wmEvent's 'const' in interface code (reduces manual checking that they are not modified). --- intern/ghost/intern/GHOST_SystemNULL.h | 9 +- .../editors/interface/interface_handlers.c | 82 +++++++++---------- .../editors/interface/interface_intern.h | 8 +- .../editors/interface/interface_panel.c | 6 +- .../editors/interface/interface_regions.c | 4 +- source/blender/windowmanager/WM_api.h | 4 +- source/blender/windowmanager/WM_types.h | 2 +- 7 files changed, 54 insertions(+), 61 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemNULL.h b/intern/ghost/intern/GHOST_SystemNULL.h index 63e3b5bc828..cf43aa7549d 100644 --- a/intern/ghost/intern/GHOST_SystemNULL.h +++ b/intern/ghost/intern/GHOST_SystemNULL.h @@ -82,11 +82,4 @@ public: } }; -#endif - - - - - - - +#endif /* __GHOST_SYSTEMNULL_H__ */ 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 ****************** */ From a47bef36225b06fb2237bf2cd03332a1ee0337d5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Feb 2013 01:11:27 +0000 Subject: [PATCH 066/227] 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. --- .../editors/interface/interface_handlers.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) 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) From 7dc33e3ef8429d7d541e8c0291826a2d42c56566 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 1 Feb 2013 06:24:49 +0000 Subject: [PATCH 067/227] 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. --- intern/CMakeLists.txt | 8 ++++++++ intern/SConscript | 6 ++++++ {source/blender => intern}/opencl/CMakeLists.txt | 2 +- {source/blender => intern}/opencl/OCL_opencl.h | 0 {source/blender => intern}/opencl/SConscript | 2 +- {source/blender => intern}/opencl/intern/OCL_opencl.c | 0 {source/blender => intern}/opencl/intern/clew.c | 0 {source/blender => intern}/opencl/intern/clew.h | 0 {source/blender => intern}/rigidbody/CMakeLists.txt | 4 ++-- {source/blender => intern}/rigidbody/RBI_api.h | 0 {source/blender => intern}/rigidbody/SConscript | 4 ++-- {source/blender => intern}/rigidbody/rb_bullet_api.cpp | 0 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/blenderplayer/CMakeLists.txt | 2 +- source/creator/CMakeLists.txt | 4 ++-- 25 files changed, 33 insertions(+), 29 deletions(-) rename {source/blender => intern}/opencl/CMakeLists.txt (94%) rename {source/blender => intern}/opencl/OCL_opencl.h (100%) rename {source/blender => intern}/opencl/SConscript (90%) rename {source/blender => intern}/opencl/intern/OCL_opencl.c (100%) rename {source/blender => intern}/opencl/intern/clew.c (100%) rename {source/blender => intern}/opencl/intern/clew.h (100%) rename {source/blender => intern}/rigidbody/CMakeLists.txt (91%) rename {source/blender => intern}/rigidbody/RBI_api.h (100%) rename {source/blender => intern}/rigidbody/SConscript (93%) rename {source/blender => intern}/rigidbody/rb_bullet_api.cpp (100%) diff --git a/intern/CMakeLists.txt b/intern/CMakeLists.txt index be797c45ba1..bb8cd7aaf70 100644 --- a/intern/CMakeLists.txt +++ b/intern/CMakeLists.txt @@ -69,6 +69,14 @@ if(WITH_INTERNATIONAL) add_subdirectory(locale) endif() +if(WITH_BULLET) + add_subdirectory(rigidbody) +endif() + +if(WITH_COMPOSITOR) + add_subdirectory(opencl) +endif() + # only windows needs utf16 converter if(WIN32) add_subdirectory(utfconv) diff --git a/intern/SConscript b/intern/SConscript index a35c99bbbaa..828c1adc20d 100644 --- a/intern/SConscript +++ b/intern/SConscript @@ -59,6 +59,12 @@ if env['WITH_BF_BOOLEAN']: if env['WITH_BF_INTERNATIONAL']: SConscript(['locale/SConscript']) +if env['WITH_BF_BULLET']: + SConscript (['rigidbody/SConscript']) + +if env['WITH_BF_COMPOSITOR']: + SConscript (['opencl/SConscript']) + if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-mingw', 'linuxcross', 'win64-vc'): SConscript(['utfconv/SConscript']) diff --git a/source/blender/opencl/CMakeLists.txt b/intern/opencl/CMakeLists.txt similarity index 94% rename from source/blender/opencl/CMakeLists.txt rename to intern/opencl/CMakeLists.txt index b3c76db1bca..03855cfdf8b 100644 --- a/source/blender/opencl/CMakeLists.txt +++ b/intern/opencl/CMakeLists.txt @@ -39,4 +39,4 @@ set(SRC ) -blender_add_lib(bf_opencl "${SRC}" "${INC}" "${INC_SYS}") +blender_add_lib(bf_intern_opencl "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/opencl/OCL_opencl.h b/intern/opencl/OCL_opencl.h similarity index 100% rename from source/blender/opencl/OCL_opencl.h rename to intern/opencl/OCL_opencl.h diff --git a/source/blender/opencl/SConscript b/intern/opencl/SConscript similarity index 90% rename from source/blender/opencl/SConscript rename to intern/opencl/SConscript index 388789a5b50..41a6d720098 100644 --- a/source/blender/opencl/SConscript +++ b/intern/opencl/SConscript @@ -31,4 +31,4 @@ sources = env.Glob('intern/*.c') incs = '.' -env.BlenderLib ( 'bf_opencl', sources, Split(incs), libtype=['core','player'], priority = [192,192] ) +env.BlenderLib ( 'bf_intern_opencl', sources, Split(incs), libtype=['core','player'], priority = [192,192] ) diff --git a/source/blender/opencl/intern/OCL_opencl.c b/intern/opencl/intern/OCL_opencl.c similarity index 100% rename from source/blender/opencl/intern/OCL_opencl.c rename to intern/opencl/intern/OCL_opencl.c diff --git a/source/blender/opencl/intern/clew.c b/intern/opencl/intern/clew.c similarity index 100% rename from source/blender/opencl/intern/clew.c rename to intern/opencl/intern/clew.c diff --git a/source/blender/opencl/intern/clew.h b/intern/opencl/intern/clew.h similarity index 100% rename from source/blender/opencl/intern/clew.h rename to intern/opencl/intern/clew.h diff --git a/source/blender/rigidbody/CMakeLists.txt b/intern/rigidbody/CMakeLists.txt similarity index 91% rename from source/blender/rigidbody/CMakeLists.txt rename to intern/rigidbody/CMakeLists.txt index 903fbe66f01..a323e55e570 100644 --- a/source/blender/rigidbody/CMakeLists.txt +++ b/intern/rigidbody/CMakeLists.txt @@ -23,7 +23,7 @@ SET(INC . - ../../../extern/bullet2/src + ../../extern/bullet2/src ) set(SRC @@ -32,4 +32,4 @@ set(SRC RBI_api.h ) -blender_add_lib(bf_rigidbody "${SRC}" "${INC}" "${INC_SYS}") +blender_add_lib(bf_intern_rigidbody "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h similarity index 100% rename from source/blender/rigidbody/RBI_api.h rename to intern/rigidbody/RBI_api.h diff --git a/source/blender/rigidbody/SConscript b/intern/rigidbody/SConscript similarity index 93% rename from source/blender/rigidbody/SConscript rename to intern/rigidbody/SConscript index 14c80304983..977281f8eef 100644 --- a/source/blender/rigidbody/SConscript +++ b/intern/rigidbody/SConscript @@ -34,9 +34,9 @@ sources = env.Glob('*.cpp') incs = [ '.', - '../../../extern/bullet2/src', + '../../extern/bullet2/src', ] -env.BlenderLib('bf_rigidbody', sources=sources, +env.BlenderLib('bf_intern_rigidbody', sources=sources, includes=incs, defines=[], libtype=['core', 'player'], priority=[180, 30]) diff --git a/source/blender/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp similarity index 100% rename from source/blender/rigidbody/rb_bullet_api.cpp rename to intern/rigidbody/rb_bullet_api.cpp 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/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) From 2a71e4e4f0c703a613b74fb1d0710b341987e6e3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Feb 2013 08:24:18 +0000 Subject: [PATCH 068/227] make WITH_HEADLESS build again. --- intern/ghost/intern/GHOST_SystemNULL.h | 13 +++++++------ source/blender/editors/interface/interface_icons.c | 8 ++++++-- source/blender/python/intern/bpy_rna.c | 3 +++ source/creator/creator.c | 7 +++++-- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemNULL.h b/intern/ghost/intern/GHOST_SystemNULL.h index cf43aa7549d..7021dea36dd 100644 --- a/intern/ghost/intern/GHOST_SystemNULL.h +++ b/intern/ghost/intern/GHOST_SystemNULL.h @@ -38,7 +38,7 @@ class GHOST_WindowNULL; class GHOST_SystemNULL : public GHOST_System { public: - GHOST_SystemNULL( ) : GHOST_System() { /* nop */ } + GHOST_SystemNULL() : GHOST_System() { /* nop */ } ~GHOST_SystemNULL() { /* nop */ } bool processEvents(bool waitForEvent) { return false; } int toggleConsole(int action) { return 0; } @@ -46,11 +46,12 @@ public: GHOST_TSuccess getButtons(GHOST_Buttons& buttons) const { return GHOST_kSuccess; } GHOST_TUns8 *getClipboard(bool selection) const { return NULL; } void putClipboard(GHOST_TInt8 *buffer, bool selection) const { /* nop */ } - GHOST_TUns64 getMilliSeconds( ) const { return 0; } - GHOST_TUns8 getNumDisplays( ) const { return GHOST_TUns8(1); } - GHOST_TSuccess getCursorPosition( GHOST_TInt32& x, GHOST_TInt32& y ) const { return GHOST_kFailure; } - GHOST_TSuccess setCursorPosition( GHOST_TInt32 x, GHOST_TInt32 y ) { return GHOST_kFailure; } - void getMainDisplayDimensions( GHOST_TUns32& width, GHOST_TUns32& height ) const { /* nop */ } + GHOST_TUns64 getMilliSeconds() const { return 0; } + GHOST_TUns8 getNumDisplays() const { return GHOST_TUns8(1); } + GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const { return GHOST_kFailure; } + GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) { return GHOST_kFailure; } + void getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const { /* nop */ } + void getAllDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const { /* nop */ } GHOST_TSuccess init() { GHOST_TSuccess success = GHOST_System::init(); 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 */ From 496c3e4f8fc8c1e9319477f3f2f75f6474bb4b5f Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Feb 2013 15:17:39 +0000 Subject: [PATCH 069/227] 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 +++++++++++++++++++ .../blender/editors/object/object_transform.c | 14 +++++ 3 files changed, 82 insertions(+) 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)) { From 6baf63c83b2f138ba3d52d4123a6ee8cb9078cb5 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Feb 2013 15:17:51 +0000 Subject: [PATCH 070/227] 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(-) 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; } From 5a51800a413c3e287bfe42de0c123892b21658f9 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Fri, 1 Feb 2013 16:03:42 +0000 Subject: [PATCH 071/227] Compile fix Patch [#34075] by Davis Sorenson (dsavi), thanks. --- source/blender/editors/object/object_transform.c | 1 + 1 file changed, 1 insertion(+) 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" From 1a5d0edf436b3d323c7657d75983facad0205f79 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Feb 2013 18:00:30 +0000 Subject: [PATCH 072/227] Fix cycles computing UV map tangents when they weren't needed. --- intern/cycles/blender/blender_mesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index 1dd7800dfa4..cdbd2fa8f2f 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -313,7 +313,7 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector< std = (active_render)? ATTR_STD_UV_TANGENT: ATTR_STD_NONE; name = ustring((string(l->name().c_str()) + ".tangent").c_str()); - if(mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)) { + if(mesh->need_attribute(scene, name) || (active_render && mesh->need_attribute(scene, std))) { std = (active_render)? ATTR_STD_UV_TANGENT_SIGN: ATTR_STD_NONE; name = ustring((string(l->name().c_str()) + ".tangent_sign").c_str()); bool need_sign = (mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)); From 4838a2c75a77ede4e2a23b711012088beaa2626c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Feb 2013 18:00:41 +0000 Subject: [PATCH 073/227] 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(-) 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 { From 736d7810a0ba6dc4fa1439b8c45d4b6782a9aa31 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Feb 2013 18:54:24 +0000 Subject: [PATCH 074/227] Fix an issue with the new cycles lamp MIS option not working correct with multiple lamps. --- intern/cycles/kernel/kernel_light.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index 8b32b7bd2e8..10a32226f17 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -312,6 +312,9 @@ __device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D, f ls->prim = ~0; ls->lamp = lamp; + if(!(ls->shader & SHADER_USE_MIS)) + return false; + if(type == LIGHT_DISTANT) { /* distant light */ float radius = data1.y; From 6fca85780b966bf610d8e73dc65c538747cbd485 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 00:34:34 +0000 Subject: [PATCH 075/227] 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(-) 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); From 35e89d9cfc39a5874a5d17b5571a72ef84798f88 Mon Sep 17 00:00:00 2001 From: Stuart Broadfoot Date: Sat, 2 Feb 2013 01:49:57 +0000 Subject: [PATCH 076/227] Cycles Hair: Fixed hair shape and inclusion of multiple attributes for triangle primitives When using triangle primitives this fix enables 'closed tip'. UVs and vertex colours are added when using triangle primitives for hair. Two new preset modes have also been included to allow easy access to curves and triangle planes. --- intern/cycles/blender/addon/properties.py | 8 +- intern/cycles/blender/blender_curves.cpp | 230 +++++++++++++++------- intern/cycles/render/curves.h | 4 +- 3 files changed, 169 insertions(+), 73 deletions(-) diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 5f585fcb99c..65f245fba69 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -66,9 +66,11 @@ enum_panorama_types = ( enum_curve_presets = ( ('CUSTOM', "Custom", "Set general parameters"), - ('TANGENT_SHADING', "Tangent Normal", "Use planar geometry and tangent normals"), - ('TRUE_NORMAL', "True Normal", "Use true normals (good for thin strands)"), - ('ACCURATE_PRESET', "Accurate", "Use best settings (suitable for glass materials)"), + ('FAST_PLANES', "Fast Planes", "Use camera facing triangles (fast but memory intensive)"), + ('TANGENT_SHADING', "Tangent Normal", "Use planar line segments and tangent normals"), + ('TRUE_NORMAL', "True Normal", "Use true normals with line segments(good for thin strands)"), + ('ACCURATE_PRESET', "Accurate", "Use best line segment settings (suitable for glass materials)"), + ('SMOOTH_CURVES', "Smooth Curves", "Use smooth cardinal curves (slowest)"), ) enum_curve_primitives = ( diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index c37895cd196..05661d4bc38 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -41,11 +41,12 @@ void ToggleRender(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::Scene *sce bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int uv_num); bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int vcol_num); bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background); +void ExportCurveSegments(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments); void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments, float3 RotCam); void ExportCurveTriangleRibbons(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments); void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int resolution, int segments); -void ExportCurveSegments(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments); -void ExportCurveTriangleUVs(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments, int vert_offset, int resol); +void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *uvdata); +void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *fdata); ParticleCurveData::ParticleCurveData() { @@ -428,13 +429,13 @@ void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpo float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time); - if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)) - radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f); - - if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1) && (subv == segments)) + if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments)) radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f); - xbasis = normalize(cross(v1,RotCam - ickey_loc)); + if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)) + radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f); + + xbasis = normalize(cross(RotCam - ickey_loc,v1)); float3 ickey_loc_shfl = ickey_loc - radius * xbasis; float3 ickey_loc_shfr = ickey_loc + radius * xbasis; mesh->verts.push_back(ickey_loc_shfl); @@ -542,12 +543,12 @@ void ExportCurveTriangleRibbons(Mesh *mesh, ParticleCurveData *CData, int interp float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time); - if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)) - radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f); - - if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1) && (subv == segments)) + if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments)) radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f); + if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)) + radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f); + float3 ickey_loc_shfl = ickey_loc - radius * xbasis; float3 ickey_loc_shfr = ickey_loc + radius * xbasis; mesh->verts.push_back(ickey_loc_shfl); @@ -659,12 +660,12 @@ void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int inter float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time); - if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)) - radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f); - - if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1) && (subv == segments)) + if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments)) radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f); + if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)) + radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f); + float angle = 2 * M_PI_F / (float)resolution; for(int section = 0 ; section < resolution; section++) { float3 ickey_loc_shf = ickey_loc + radius * (cosf(angle * section) * xbasis + sinf(angle * section) * ybasis); @@ -764,17 +765,14 @@ static void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CDa } } -void ExportCurveTriangleUVs(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments, int vert_offset, int resol) +void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *uvdata) { + if(uvdata == NULL) + return; + float time = 0.0f; float prevtime = 0.0f; - Attribute *attr = mesh->attributes.find(ATTR_STD_UV); - if (attr == NULL) - return; - - float3 *uvdata = attr->data_float3(); - int vertexindex = vert_offset; for( int sys = 0; sys < CData->psys_firstcurve.size() ; sys++) { @@ -823,6 +821,58 @@ void ExportCurveTriangleUVs(Mesh *mesh, ParticleCurveData *CData, int interpolat } } + +void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *fdata) +{ + if(fdata == NULL) + return; + + float time = 0.0f; + float prevtime = 0.0f; + + int vertexindex = vert_offset; + + for( int sys = 0; sys < CData->psys_firstcurve.size() ; sys++) { + for( int curve = CData->psys_firstcurve[sys]; curve < CData->psys_firstcurve[sys] + CData->psys_curvenum[sys] ; curve++) { + + for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) { + + int subv = 1; + + if (curvekey == CData->curve_firstkey[curve]) + subv = 0; + + for (; subv <= segments; subv++) { + + float3 ickey_loc = make_float3(0.0f,0.0f,0.0f); + + InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation); + + if(subv!=0) { + for(int section = 0 ; section < resol; section++) { + fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]); + vertexindex++; + fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]); + vertexindex++; + fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]); + vertexindex++; + fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]); + vertexindex++; + fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]); + vertexindex++; + fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]); + vertexindex++; + } + } + + prevtime = time; + } + } + } + } + +} + /* Hair Curve Sync */ void BlenderSync::sync_curve_settings() @@ -868,6 +918,13 @@ void BlenderSync::sync_curve_settings() curve_system_manager->use_joined = false; switch(preset) { + case CURVE_FAST_PLANES: + /*camera facing planes*/ + curve_system_manager->primitive = CURVE_TRIANGLES; + curve_system_manager->triangle_method = CURVE_CAMERA_TRIANGLES; + curve_system_manager->use_smooth = true; + curve_system_manager->resolution = 1; + break; case CURVE_TANGENT_SHADING: /*tangent shading*/ curve_system_manager->line_method = CURVE_UNCORRECTED; @@ -895,6 +952,12 @@ void BlenderSync::sync_curve_settings() curve_system_manager->use_tangent_normal_geometry = false; curve_system_manager->use_tangent_normal_correction = false; break; + case CURVE_SMOOTH_CURVES: + /*Cardinal curves preset*/ + curve_system_manager->primitive = CURVE_SEGMENTS; + curve_system_manager->use_backfacing = true; + curve_system_manager->subdivisions = 4; + break; } } @@ -945,6 +1008,9 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool bool use_smooth = scene->curve_system_manager->use_smooth; bool use_parents = scene->curve_system_manager->use_parents; bool export_tgs = scene->curve_system_manager->use_joined; + size_t vert_num = mesh->verts.size(); + size_t tri_num = mesh->triangles.size(); + int used_res = 1; /* extract particle hair data - should be combined with connecting to mesh later*/ @@ -955,7 +1021,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview); - /* attach strands to mesh */ + /* obtain camera parameters */ BL::Object b_CamOb = b_scene.camera(); float3 RotCam = make_float3(0.0f, 0.0f, 0.0f); if(b_CamOb) { @@ -965,22 +1031,16 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool RotCam = transform_point(&itfm, make_float3(ctfm.x.w, ctfm.y.w, ctfm.z.w)); } + /* add hair geometry to mesh */ if(primitive == CURVE_TRIANGLES){ - int vert_num = mesh->triangles.size() * 3; - ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, 0); - if(triangle_method == CURVE_CAMERA_TRIANGLES) { + if(triangle_method == CURVE_CAMERA_TRIANGLES) ExportCurveTrianglePlanes(mesh, &CData, interpolation, use_smooth, segments, RotCam); - ExportCurveTriangleUVs(mesh, &CData, interpolation, use_smooth, segments, vert_num, 1); - } - else if(triangle_method == CURVE_RIBBON_TRIANGLES) { + else if(triangle_method == CURVE_RIBBON_TRIANGLES) ExportCurveTriangleRibbons(mesh, &CData, interpolation, use_smooth, segments); - ExportCurveTriangleUVs(mesh, &CData, interpolation, use_smooth, segments, vert_num, 1); - } else { ExportCurveTriangleGeometry(mesh, &CData, interpolation, use_smooth, resolution, segments); - ExportCurveTriangleUVs(mesh, &CData, interpolation, use_smooth, segments, vert_num, resolution); + used_res = resolution; } - } else { ExportCurveSegments(scene, mesh, &CData, interpolation, segments); @@ -998,14 +1058,24 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool data_tangent[ck] = tg; } } + } - /* generated coordinates from first key. we should ideally get this from - * blender to handle deforming objects */ - { - if(mesh->need_attribute(scene, ATTR_STD_GENERATED)) { - float3 loc, size; - mesh_texture_space(b_mesh, loc, size); + /* generated coordinates from first key. we should ideally get this from + * blender to handle deforming objects */ + { + if(mesh->need_attribute(scene, ATTR_STD_GENERATED)) { + float3 loc, size; + mesh_texture_space(b_mesh, loc, size); + + if(primitive == CURVE_TRIANGLES) { + Attribute *attr_generated = mesh->attributes.add(ATTR_STD_GENERATED); + float3 *generated = attr_generated->data_float3(); + + for(size_t i = vert_num; i < mesh->verts.size(); i++) + generated[i] = mesh->verts[i]*size - loc; + } + else { Attribute *attr_generated = mesh->curve_attributes.add(ATTR_STD_GENERATED); float3 *generated = attr_generated->data_float3(); size_t i = 0; @@ -1016,61 +1086,83 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool } } } + } - /* create vertex color attributes */ - { - BL::Mesh::tessface_vertex_colors_iterator l; - int vcol_num = 0; + /* create vertex color attributes */ + { + BL::Mesh::tessface_vertex_colors_iterator l; + int vcol_num = 0; - for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l, vcol_num++) { - if(!mesh->need_attribute(scene, ustring(l->name().c_str()))) - continue; + for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l, vcol_num++) { + if(!mesh->need_attribute(scene, ustring(l->name().c_str()))) + continue; + ObtainCacheParticleVcol(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, vcol_num); + + if(primitive == CURVE_TRIANGLES) { + + Attribute *attr_vcol = mesh->attributes.add( + ustring(l->name().c_str()), TypeDesc::TypeColor, ATTR_ELEMENT_CORNER); + + float3 *fdata = attr_vcol->data_float3(); + + ExportCurveTriangleVcol(mesh, &CData, interpolation, segments, tri_num * 3, used_res, fdata); + } + else { Attribute *attr_vcol = mesh->curve_attributes.add( ustring(l->name().c_str()), TypeDesc::TypeColor, ATTR_ELEMENT_CURVE); - ObtainCacheParticleVcol(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, vcol_num); + float3 *fdata = attr_vcol->data_float3(); - float3 *vcol = attr_vcol->data_float3(); - - if(vcol) { + if(fdata) { for(size_t curve = 0; curve < CData.curve_vcol.size() ;curve++) - vcol[curve] = color_srgb_to_scene_linear(CData.curve_vcol[curve]); + fdata[curve] = color_srgb_to_scene_linear(CData.curve_vcol[curve]); } } } + } - /* create uv map attributes */ - { - BL::Mesh::tessface_uv_textures_iterator l; - int uv_num = 0; + /* create UV attributes */ + { + BL::Mesh::tessface_uv_textures_iterator l; + int uv_num = 0; - for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l, uv_num++) { - bool active_render = l->active_render(); - AttributeStandard std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE; - ustring name = ustring(l->name().c_str()); + for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l, uv_num++) { + bool active_render = l->active_render(); + AttributeStandard std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE; + ustring name = ustring(l->name().c_str()); - /* UV map */ - if(mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)) { - Attribute *attr; + /* UV map */ + if(mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)) { + Attribute *attr_uv; + ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, uv_num); + + if(primitive == CURVE_TRIANGLES) { if(active_render) - attr = mesh->curve_attributes.add(std, name); + attr_uv = mesh->attributes.add(std, name); else - attr = mesh->curve_attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CURVE); + attr_uv = mesh->attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER); - ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, uv_num); + float3 *uv = attr_uv->data_float3(); - float3 *uv = attr->data_float3(); + ExportCurveTriangleUV(mesh, &CData, interpolation, segments, tri_num * 3, used_res, uv); + } + else { + if(active_render) + attr_uv = mesh->curve_attributes.add(std, name); + else + attr_uv = mesh->curve_attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CURVE); + + float3 *uv = attr_uv->data_float3(); if(uv) { - for(size_t curve = 0; curve < CData.curve_uv.size() ;curve++) + for(size_t curve = 0; curve < CData.curve_uv.size(); curve++) uv[curve] = CData.curve_uv[curve]; } - } + } } } - } if(!preview) diff --git a/intern/cycles/render/curves.h b/intern/cycles/render/curves.h index 3a12d33d0a7..3527998339c 100644 --- a/intern/cycles/render/curves.h +++ b/intern/cycles/render/curves.h @@ -33,9 +33,11 @@ void curvebounds(float *lower, float *upper, float3 *p, int dim); typedef enum curve_presets { CURVE_CUSTOM, + CURVE_FAST_PLANES, CURVE_TANGENT_SHADING, CURVE_TRUE_NORMAL, - CURVE_ACCURATE_PRESET + CURVE_ACCURATE_PRESET, + CURVE_SMOOTH_CURVES } curve_presets; typedef enum curve_primitives { From c93d6f460662c79f6e82be51d2064517d7c79769 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 04:13:38 +0000 Subject: [PATCH 077/227] 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(-) 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; + } } } } From 9da4cab9fdc63505b9f0e7f96214cc03ca9ad554 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 04:48:21 +0000 Subject: [PATCH 078/227] style cleanup: comment format --- .../BlenderRoutines/KX_BlenderCanvas.cpp | 10 +++---- .../BlenderRoutines/KX_BlenderCanvas.h | 5 ++-- .../KX_BlenderKeyboardDevice.cpp | 24 ++++++++-------- .../BlenderRoutines/KX_BlenderMouseDevice.cpp | 26 ++++++++--------- .../Converter/BL_BlenderDataConversion.cpp | 2 +- source/gameengine/Expressions/EmptyValue.cpp | 28 +++++++++---------- .../gameengine/Expressions/PyObjectPlus.cpp | 8 +++--- .../gameengine/GameLogic/SCA_IInputDevice.h | 25 +++++++++-------- .../gameengine/GameLogic/SCA_LogicManager.h | 8 +++--- .../GameLogic/SCA_RandomActuator.cpp | 20 ++++--------- .../gameengine/GamePlayer/ghost/GPG_ghost.cpp | 10 +++---- source/gameengine/Ketsji/KX_GameObject.h | 4 +-- .../NG_LoopBackNetworkDeviceInterface.h | 4 +-- .../Network/NG_NetworkDeviceInterface.h | 18 ++++++------ source/gameengine/Network/NG_NetworkMessage.h | 4 +-- .../Physics/Bullet/CcdPhysicsController.cpp | 10 +++---- .../Physics/Bullet/CcdPhysicsController.h | 8 +++--- .../Physics/common/PHY_IController.h | 8 +++--- .../Physics/common/PHY_IGraphicController.h | 10 +++---- .../Physics/common/PHY_IMotionState.h | 6 ++-- .../Physics/common/PHY_IPhysicsController.h | 14 +++++----- .../common/PHY_IPhysicsEnvironment.cpp | 7 +++-- .../Physics/common/PHY_IPhysicsEnvironment.h | 7 +++-- .../Rasterizer/RAS_IPolygonMaterial.h | 4 +-- .../RAS_OpenGLRasterizer.h | 5 ++-- .../gameengine/SceneGraph/SG_ParentRelation.h | 4 +-- .../gameengine/VideoTexture/VideoFFmpeg.cpp | 2 +- 27 files changed, 137 insertions(+), 144 deletions(-) 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) { From 518bfbb1c92e786c8f2cb651819d0302ec13e6ef Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 04:58:03 +0000 Subject: [PATCH 079/227] 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 +- .../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(-) 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; From ae4db7eb5929ae51f362faeb39fb04e4bf22005f Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sat, 2 Feb 2013 05:38:57 +0000 Subject: [PATCH 080/227] 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 --- .../editors/transform/transform_conversions.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) 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; From 58ba7f7cf468d3beeaf0814c65d429241bf0d70b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 06:06:34 +0000 Subject: [PATCH 081/227] 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(-) 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); } From 0dbb08d4eb31adf69b01624a271727900b4b35cc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 13:55:47 +0000 Subject: [PATCH 082/227] 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(-) 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; From b6c82b2e8402120ca564aecd2106f3dcdbfe05eb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Feb 2013 14:11:58 +0000 Subject: [PATCH 083/227] 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(-) 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(); From ad2b4c6e542d733fe3b771586d6fea6c12b6ed16 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sat, 2 Feb 2013 16:54:18 +0000 Subject: [PATCH 084/227] 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(+) 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); + } } } From f0d4b85feffb625efb406d3fba81b076a3a1fc4f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 02:54:24 +0000 Subject: [PATCH 085/227] 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(-) 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 */ From 1f21efdeac19d57b60554da920935a97d682b9b9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 06:09:29 +0000 Subject: [PATCH 086/227] 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(-) 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); } } From bb22b7c58083a45fca60f0c9e135a54714beed27 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 07:24:31 +0000 Subject: [PATCH 087/227] 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(+) 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. * From 415b425e6523a67c9c387cf0e29730bb882ef2b5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 07:26:58 +0000 Subject: [PATCH 088/227] 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(+) 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 } } From c6491074992e939d1c2838a133e340b12a230afe Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 08:07:14 +0000 Subject: [PATCH 089/227] 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(+) 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); } From 4e94fca8965a0012631b4fd92c96fce41fd1d3d9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 08:13:15 +0000 Subject: [PATCH 090/227] 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(-) 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); From 0510735f4eb342a12dcc316be639ee256766060b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 09:44:37 +0000 Subject: [PATCH 091/227] 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(-) 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); From 2cfe44cc94b42ed21dcb8c61d7b5c0f2cb9c9d68 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sun, 3 Feb 2013 10:26:51 +0000 Subject: [PATCH 092/227] 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(+) 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); From 89bda7899d09f0ece87e477eff1290bd134a57cb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 10:28:28 +0000 Subject: [PATCH 093/227] 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(-) 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 */ From 48e9c158db478bd14946f5ea6b7bf73a804fe7f8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 12:19:14 +0000 Subject: [PATCH 094/227] fix [#34093] Metastrips don't behave correctly with alt+leftarrow --- .../blender/editors/space_sequencer/sequencer_edit.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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); } From b31d9c6cd07b41bfe1ad3d22651266bb4726cd84 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 3 Feb 2013 13:10:56 +0000 Subject: [PATCH 095/227] Fix #34087: cycles shadow pass not properly normalized for non-progressive integrator with > 1 samples for a lamp. --- intern/cycles/kernel/kernel_path.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index b029acfd2a5..7609336ac59 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -841,7 +841,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow, state.bounce, is_lamp); + path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow*num_samples_inv, state.bounce, is_lamp); } } } @@ -870,7 +870,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow, state.bounce, is_lamp); + path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow*num_samples_inv, state.bounce, is_lamp); } } } From bc3cb6ff766eadeeb358dbf2fac5a76db58355db Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Feb 2013 15:03:55 +0000 Subject: [PATCH 096/227] 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(-) 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; } From abe41ba65f2b1117b0d1bf1730db3fef21ec1e27 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Sun, 3 Feb 2013 15:06:16 +0000 Subject: [PATCH 097/227] Fix for [#34022] Lines on renders using Blur node in flat mode --- .../compositor/operations/COM_GaussianAlphaXBlurOperation.cpp | 4 ++-- .../compositor/operations/COM_GaussianAlphaYBlurOperation.cpp | 4 ++-- .../compositor/operations/COM_GaussianXBlurOperation.cpp | 4 ++-- .../compositor/operations/COM_GaussianYBlurOperation.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) 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(); From b58b107db409c877b523f90ff8feb5c4db7688a8 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Sun, 3 Feb 2013 15:38:06 +0000 Subject: [PATCH 098/227] Fix for [#34089] Crash opening file containing translation node saved before rev54235 --- source/blender/blenloader/intern/readfile.c | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) 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! */ From 2950214527812503b009995c638d2be37efaa22f Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Sun, 3 Feb 2013 17:22:26 +0000 Subject: [PATCH 099/227] 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. --- .../compositor/nodes/COM_GroupNode.cpp | 4 ++-- .../compositor/nodes/COM_SocketProxyNode.cpp | 22 +++++++++++++++---- .../compositor/nodes/COM_SocketProxyNode.h | 4 +++- 3 files changed, 23 insertions(+), 7 deletions(-) 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; } From c584e01beeaa8c800f9b50bbe9d866037b42230b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 00:02:26 +0000 Subject: [PATCH 100/227] drawvolume was timing drawing unnecessarily, replace local defined timing functions with calls to TIMEIT_* macros from PIL_time.h and disable by default. --- .../blender/editors/space_view3d/drawvolume.c | 66 ++++--------------- 1 file changed, 14 insertions(+), 52 deletions(-) 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 - -#ifdef _WIN32 -#include -#include -#include -#include - -static LARGE_INTEGER liFrequency; -static LARGE_INTEGER liStartTime; -static LARGE_INTEGER liCurrentTime; - -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 -#endif - struct GPUTexture; +// #define DEBUG_DRAW_TIME + +#ifdef DEBUG_DRAW_TIME +# include "PIL_time.h" +#endif + 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); From 9d4be17de42deb3109febc8433bf2acea2196218 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 00:05:15 +0000 Subject: [PATCH 101/227] style cleanup --- intern/smoke/intern/FLUID_3D.cpp | 2 +- .../compositor/nodes/COM_GroupNode.cpp | 4 ++-- .../compositor/nodes/COM_SocketProxyNode.cpp | 22 +++++++++---------- .../COM_GaussianAlphaXBlurOperation.cpp | 4 ++-- .../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 +- .../gameengine/Ketsji/KX_ObjectActuator.cpp | 4 ++-- 10 files changed, 28 insertions(+), 28 deletions(-) diff --git a/intern/smoke/intern/FLUID_3D.cpp b/intern/smoke/intern/FLUID_3D.cpp index 4eb11a46f5b..a1d39286a90 100644 --- a/intern/smoke/intern/FLUID_3D.cpp +++ b/intern/smoke/intern/FLUID_3D.cpp @@ -1055,7 +1055,7 @@ void FLUID_3D::project() for (x = 1; x < _xRes - 1; x++, index++) { float vMask[3] = {1.0f, 1.0f, 1.0f}, vObst[3] = {0, 0, 0}; - float vR = 0.0f, vL = 0.0f, vT = 0.0f, vB = 0.0f, vD = 0.0f, vU = 0.0f; + // float vR = 0.0f, vL = 0.0f, vT = 0.0f, vB = 0.0f, vD = 0.0f, vU = 0.0f; // UNUSED float pC = _pressure[index]; // center float pR = _pressure[index + 1]; // right 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); From 69993c5d4089bb58758f9a190237dc4651d72d44 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 00:18:09 +0000 Subject: [PATCH 102/227] style cleanup: spaces -> tabs --- .../intern/GHOST_DisplayManagerCarbon.cpp | 11 ++++---- source/blender/blenkernel/intern/CCGSubSurf.c | 2 +- source/blender/blenkernel/intern/idprop.c | 1 - .../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 - .../editors/interface/interface_draw.c | 2 +- .../editors/interface/interface_panel.c | 2 +- .../blender/editors/physics/particle_edit.c | 2 +- source/blender/editors/sculpt_paint/sculpt.c | 1 - source/blender/editors/space_node/drawnode.c | 2 +- .../editors/uvedit/uvedit_parametrizer.c | 2 +- source/blender/imbuf/intern/thumbs.c | 2 +- .../nodes/node_composite_bokehimage.c | 2 +- .../composite/nodes/node_composite_gamma.c | 2 +- .../nodes/shader/nodes/node_shader_gamma.c | 2 +- .../render/intern/source/pixelblending.c | 2 +- .../render/intern/source/pixelshading.c | 2 +- source/blender/render/intern/source/strand.c | 4 +-- .../GamePlayer/common/GPC_RawImage.cpp | 1 - 30 files changed, 65 insertions(+), 72 deletions(-) diff --git a/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp b/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp index 3f7d2102dac..25e9123dae6 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp +++ b/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp @@ -150,7 +150,7 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(GHOST_TUns8 #endif // GHOST_DEBUG CGDisplayErr err = ::CGDisplaySwitchToMode(m_displayIDs[display], displayModeValues); - + return err == CGDisplayNoErr ? GHOST_kSuccess : GHOST_kFailure; } @@ -158,19 +158,18 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(GHOST_TUns8 long GHOST_DisplayManagerCarbon::getValue(CFDictionaryRef values, CFStringRef key) const { CFNumberRef numberValue = (CFNumberRef) CFDictionaryGetValue(values, key); - + if (!numberValue) { return -1; } - + long intValue; - + if (!CFNumberGetValue(numberValue, kCFNumberLongType, &intValue)) { return -1; } - + return intValue; } - 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 From 0515f933d93903446c3d0ee8903e48e53c081217 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 07:51:01 +0000 Subject: [PATCH 103/227] fix [#33831] "Alt" key is "Alt Window Deactivated" update to the ubuntu workaround from Shinsuke Irie. --- intern/ghost/intern/GHOST_SystemX11.cpp | 44 +++++++++++++++---------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 6902b2e8347..661f5e70dc6 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -77,7 +77,7 @@ // #define USE_X11_ERROR_HANDLERS /* see [#34039] Fix Alt key glitch on Unity desktop */ -// #define USE_UNITY_WORKAROUND +#define USE_UNITY_WORKAROUND static GHOST_TKey convertXKey(KeySym key); @@ -569,30 +569,38 @@ processEvents( /* the X server generates KeymapNotify event immediately after * every EnterNotify and FocusIn event. we handle this event * to correct modifier states. */ - if ((xevent.type == FocusIn || xevent.type == EnterNotify)) { + if (xevent.type == FocusIn) { /* use previous event's window, because KeymapNotify event * has no window information. */ GHOST_WindowX11 *window = findGhostWindow(xevent.xany.window); - if (window) { + if (window && XPending(m_display) >= 2) { XNextEvent(m_display, &xevent); if (xevent.type == KeymapNotify) { - /* XK_Hyper_L/R currently unused */ - const static KeySym modifiers[8] = {XK_Shift_L, XK_Shift_R, - XK_Control_L, XK_Control_R, - XK_Alt_L, XK_Alt_R, - XK_Super_L, XK_Super_R}; + XEvent xev_next; - for (int i = 0; i < (sizeof(modifiers) / sizeof(*modifiers)); i++) { - KeyCode kc = XKeysymToKeycode(m_display, modifiers[i]); - if (((xevent.xkeymap.key_vector[kc >> 3] >> (kc & 7)) & 1) != 0) { - pushEvent(new GHOST_EventKey( - getMilliSeconds(), - GHOST_kEventKeyDown, - window, - convertXKey(modifiers[i]), - '\0', - NULL)); + /* check if KeyPress or KeyRelease event was generated + * in order to confirm the window is active. */ + XPeekEvent(m_display, &xev_next); + + if (xev_next.type == KeyPress || xev_next.type == KeyRelease) { + /* XK_Hyper_L/R currently unused */ + const static KeySym modifiers[8] = {XK_Shift_L, XK_Shift_R, + XK_Control_L, XK_Control_R, + XK_Alt_L, XK_Alt_R, + XK_Super_L, XK_Super_R}; + + for (int i = 0; i < (sizeof(modifiers) / sizeof(*modifiers)); i++) { + KeyCode kc = XKeysymToKeycode(m_display, modifiers[i]); + if (((xevent.xkeymap.key_vector[kc >> 3] >> (kc & 7)) & 1) != 0) { + pushEvent(new GHOST_EventKey( + getMilliSeconds(), + GHOST_kEventKeyDown, + window, + convertXKey(modifiers[i]), + '\0', + NULL)); + } } } } From 452840559714feb293fdb2c3849a82ce265759cd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 10:14:31 +0000 Subject: [PATCH 104/227] 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(-) 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 */ }; From b2f6c49830ca4e306b92b7b26037217f286bb371 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 4 Feb 2013 11:06:47 +0000 Subject: [PATCH 105/227] Cycles preview scene: made render layer name match name used for BI preview This is needed because render result is being reused between different render previews and keeping names out of sync means once preview result was created for blender internal, it wouldn't be updated after switching to cycles. Same goes to switching from cycles to other renderers like lux and yaf. Simply updated cycles_preview.blend for now, could be solved from code side as well, but IMO better to collect such a limitations of preview blend files and solve them all together during "custom preview.blend for external engines" project. Reported by Jens in IRC. --- release/datafiles/preview_cycles.blend | Bin 1325868 -> 1326220 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/release/datafiles/preview_cycles.blend b/release/datafiles/preview_cycles.blend index 04055160f7e0eaff14ae04f8a67f96ad5c257a39..11bf8bbb7b88fc5acccea1cd5e1795b17810ce79 100644 GIT binary patch delta 143121 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 Tn5TYFmL~=d9&p4hho=4?=#V%g delta 141855 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

ck{NKlLf1N-^UuVBal84jL( zcSRG5k)Rj}ijklg35t=RXMcT502#^w8H&+_Vk9_l;yo1!ijklg35t=Rapn3i2V^Kl zf?^~nMuK7_IP`I4f?^~%^l^y}$WRW*P>d!NBSA3|6eB?~5)>oB*3uF8Ry1L2!pKmJ z1jR^Dj0D9

ck{NU$UWG87}jjyoz76eB?~5)>mrF%lGq1nvGmxd1X0BSSF~6eGd* zllce-(^!lI#Yj->6SVO!12Pn&3B^cIj0D9

fBe7@JVBZ9@J0lL4DhF*c!MY(mA@ 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 S?7;!NYrM~Z-lt4EDfxf#*1LlM From e3784a27d6372858411ce257df6bff8984509702 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Mon, 4 Feb 2013 11:23:40 +0000 Subject: [PATCH 106/227] Cycles / OSL: * Fix for r53689, there are two noise types, signed and unsigned. Caused Musgrave Texture to render differently compared to SVM backend. --- .../kernel/shaders/node_musgrave_texture.osl | 24 +++++++++---------- intern/cycles/kernel/shaders/node_texture.h | 14 ++++++++--- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/intern/cycles/kernel/shaders/node_musgrave_texture.osl b/intern/cycles/kernel/shaders/node_musgrave_texture.osl index 38232ea0aeb..8675c23d0d8 100644 --- a/intern/cycles/kernel/shaders/node_musgrave_texture.osl +++ b/intern/cycles/kernel/shaders/node_musgrave_texture.osl @@ -37,14 +37,14 @@ float noise_musgrave_fBm(point p, string basis, float H, float lacunarity, float int i; for (i = 0; i < (int)octaves; i++) { - value += safe_noise(p) * pwr; + value += safe_noise(p, 0) * pwr; pwr *= pwHL; p *= lacunarity; } rmd = octaves - floor(octaves); if (rmd != 0.0) - value += rmd * safe_noise(p) * pwr; + value += rmd * safe_noise(p, 0) * pwr; return value; } @@ -65,14 +65,14 @@ float noise_musgrave_multi_fractal(point p, string basis, float H, float lacunar int i; for (i = 0; i < (int)octaves; i++) { - value *= (pwr * safe_noise(p) + 1.0); + value *= (pwr * safe_noise(p, 0) + 1.0); pwr *= pwHL; p *= lacunarity; } rmd = octaves - floor(octaves); if (rmd != 0.0) - value *= (rmd * pwr * safe_noise(p) + 1.0); /* correct? */ + value *= (rmd * pwr * safe_noise(p, 0) + 1.0); /* correct? */ return value; } @@ -93,11 +93,11 @@ float noise_musgrave_hetero_terrain(point p, string basis, float H, float lacuna int i; /* first unscaled octave of function; later octaves are scaled */ - value = offset + safe_noise(p); + value = offset + safe_noise(p, 0); p *= lacunarity; for (i = 1; i < (int)octaves; i++) { - increment = (safe_noise(p) + offset) * pwr * value; + increment = (safe_noise(p, 0) + offset) * pwr * value; value += increment; pwr *= pwHL; p *= lacunarity; @@ -105,7 +105,7 @@ float noise_musgrave_hetero_terrain(point p, string basis, float H, float lacuna rmd = octaves - floor(octaves); if (rmd != 0.0) { - increment = (safe_noise(p) + offset) * pwr * value; + increment = (safe_noise(p, 0) + offset) * pwr * value; value += rmd * increment; } @@ -128,7 +128,7 @@ float noise_musgrave_hybrid_multi_fractal(point p, string basis, float H, float pwr = pwHL; int i; - result = safe_noise(p) + offset; + result = safe_noise(p, 0) + offset; weight = gain * result; p *= lacunarity; @@ -136,7 +136,7 @@ float noise_musgrave_hybrid_multi_fractal(point p, string basis, float H, if (weight > 1.0) weight = 1.0; - signal = (safe_noise(p) + offset) * pwr; + signal = (safe_noise(p, 0) + offset) * pwr; pwr *= pwHL; result += weight * signal; weight *= gain * signal; @@ -145,7 +145,7 @@ float noise_musgrave_hybrid_multi_fractal(point p, string basis, float H, rmd = octaves - floor(octaves); if (rmd != 0.0) - result += rmd * ((safe_noise(p) + offset) * pwr); + result += rmd * ((safe_noise(p, 0) + offset) * pwr); return result; } @@ -166,7 +166,7 @@ float noise_musgrave_ridged_multi_fractal(point p, string basis, float H, float pwr = pwHL; int i; - signal = offset - fabs(safe_noise(p)); + signal = offset - fabs(safe_noise(p, 0)); signal *= signal; result = signal; weight = 1.0; @@ -174,7 +174,7 @@ float noise_musgrave_ridged_multi_fractal(point p, string basis, float H, for (i = 1; i < (int)octaves; i++) { p *= lacunarity; weight = clamp(signal * gain, 0.0, 1.0); - signal = offset - fabs(safe_noise(p)); + signal = offset - fabs(safe_noise(p, 0)); signal *= signal; signal *= weight; result += signal * pwr; diff --git a/intern/cycles/kernel/shaders/node_texture.h b/intern/cycles/kernel/shaders/node_texture.h index 2de0fc0ea57..463c68a6c27 100644 --- a/intern/cycles/kernel/shaders/node_texture.h +++ b/intern/cycles/kernel/shaders/node_texture.h @@ -151,9 +151,17 @@ float voronoi_CrS(point p) { return 2.0 * voronoi_Cr(p) - 1.0; } /* Noise Bases */ -float safe_noise(point p) +float safe_noise(point p, int type) { - float f = noise(p); + float f = 0.0; + + /* Perlin noise in range -1..1 */ + if (type == 0) + f = noise("perlin", p); + + /* Perlin noise in range 0..1 */ + else + f = noise(p); /* can happen for big coordinates, things even out to 0.5 then anyway */ if(!isfinite(f)) @@ -167,7 +175,7 @@ float noise_basis(point p, string basis) float result = 0.0; if (basis == "Perlin") - result = safe_noise(p); /* returns perlin noise in range 0..1 */ + result = safe_noise(p, 1); if (basis == "Voronoi F1") result = voronoi_F1S(p); if (basis == "Voronoi F2") From 29a15f287f7f945e72967d1feef8584bef1c4141 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 11:28:31 +0000 Subject: [PATCH 107/227] 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(+) 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; } From df1fe576213e0a5245fd5c219af071f007a4b9b2 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 4 Feb 2013 12:14:59 +0000 Subject: [PATCH 108/227] 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(-) 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"); From 88aa33d3f426837db88c3d4bf880f9433058287e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 12:32:24 +0000 Subject: [PATCH 109/227] 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(+) 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; } From 932be982d61726b5619ad568009b5fb2421638d8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 13:17:34 +0000 Subject: [PATCH 110/227] fix [#34107] Grease pencil crash after box select --- .../editors/animation/keyframes_edit.c | 9 ++++- .../editors/space_action/action_select.c | 35 +++++++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) 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 */ From 42bbd7d62edd64d3622b2a8491d5d245162f3497 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 13:50:09 +0000 Subject: [PATCH 111/227] 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(+) 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); From 1c1fb24f312464c0642fbc86db223c4f7dbe4c54 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 15:48:29 +0000 Subject: [PATCH 112/227] 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(-) 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 */ From 52303db217e37a17313db9f38931c144bd7e8bbe Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 4 Feb 2013 16:12:27 +0000 Subject: [PATCH 113/227] Fix window fullscreen crash when building for Mac OS X 10.5. --- intern/ghost/intern/GHOST_WindowCocoa.mm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm index ccd6cd93d4c..8d5f8bf89d5 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.mm +++ b/intern/ghost/intern/GHOST_WindowCocoa.mm @@ -58,9 +58,7 @@ extern "C" { extern void wm_draw_update(bContext *C); };*/ @interface CocoaWindowDelegate : NSObject -#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 -#endif { GHOST_SystemCocoa *systemCocoa; GHOST_WindowCocoa *associatedWindow; @@ -998,9 +996,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) //Show the new window [tmpWindow makeKeyAndOrderFront:m_openGLView]; //Close and release old window - [m_window setDelegate:nil]; // To avoid the notification of "window closed" event [m_window close]; - [m_window release]; m_window = tmpWindow; #endif @@ -1057,9 +1053,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) //Show the new window [tmpWindow makeKeyAndOrderFront:nil]; //Close and release old window - [m_window setDelegate:nil]; // To avoid the notification of "window closed" event [m_window close]; - [m_window release]; m_window = tmpWindow; #endif From 7c9d99334705498932a272f68f74121953d4974a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 4 Feb 2013 16:12:37 +0000 Subject: [PATCH 114/227] Fix cycles intersection issue with overlapping faces on windows 32 bit and CPU without SSE3 support, due to 80 bit precision float register being used for one bounding box but not the one next to it. --- intern/cycles/CMakeLists.txt | 6 +- intern/cycles/SConscript | 25 +++++--- intern/cycles/device/device_cpu.cpp | 48 ++++++++++++--- intern/cycles/kernel/CMakeLists.txt | 6 +- intern/cycles/kernel/kernel.h | 13 +++- intern/cycles/kernel/kernel_bvh.h | 24 ++++---- .../{kernel_optimized.cpp => kernel_sse2.cpp} | 6 +- intern/cycles/kernel/kernel_sse3.cpp | 60 +++++++++++++++++++ intern/cycles/util/util_system.cpp | 15 ++++- intern/cycles/util/util_system.h | 3 +- 10 files changed, 166 insertions(+), 40 deletions(-) rename intern/cycles/kernel/{kernel_optimized.cpp => kernel_sse2.cpp} (79%) create mode 100644 intern/cycles/kernel/kernel_sse3.cpp diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 535239a9205..226218ae512 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -13,10 +13,12 @@ if(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) endif() if(WIN32 AND MSVC) - set(CYCLES_OPTIMIZED_KERNEL_FLAGS "/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc") + set(CYCLES_SSE2_KERNEL_FLAGS "/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc") + set(CYCLES_SSE3_KERNEL_FLAGS "/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast -D_CRT_SECURE_NO_WARNINGS /EHsc") elseif(CMAKE_COMPILER_IS_GNUCC) - set(CYCLES_OPTIMIZED_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mfpmath=sse") + set(CYCLES_SSE2_KERNEL_FLAGS "-ffast-math -msse -msse2 -mfpmath=sse") + set(CYCLES_SSE3_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mfpmath=sse") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math") endif() diff --git a/intern/cycles/SConscript b/intern/cycles/SConscript index 19af7dede9f..8a8ef9cce39 100644 --- a/intern/cycles/SConscript +++ b/intern/cycles/SConscript @@ -36,7 +36,8 @@ sources = cycles.Glob('bvh/*.cpp') + cycles.Glob('device/*.cpp') + cycles.Glob(' sources.remove(path.join('util', 'util_view.cpp')) sources.remove(path.join('render', 'film_response.cpp')) -sources.remove(path.join('kernel', 'kernel_optimized.cpp')) +sources.remove(path.join('kernel', 'kernel_sse2.cpp')) +sources.remove(path.join('kernel', 'kernel_sse3.cpp')) incs = [] defs = [] @@ -73,21 +74,29 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc', ' # optimized kernel if env['WITH_BF_RAYOPTIMIZATION']: - optim_cxxflags = Split(env['CXXFLAGS']) + sse2_cxxflags = Split(env['CXXFLAGS']) + sse3_cxxflags = Split(env['CXXFLAGS']) if env['OURPLATFORM'] == 'win32-vc': - optim_cxxflags.append('/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc'.split()) + sse2_cxxflags.append('/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc'.split()) + sse3_cxxflags.append('/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc'.split()) elif env['OURPLATFORM'] == 'win64-vc': - optim_cxxflags.append('-D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc'.split()) + sse2_cxxflags.append('-D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc'.split()) + sse3_cxxflags.append('-D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc'.split()) else: - optim_cxxflags.append('-ffast-math -msse -msse2 -msse3 -mfpmath=sse'.split()) + sse2_cxxflags.append('-ffast-math -msse -msse2 -mfpmath=sse'.split()) + sse3_cxxflags.append('-ffast-math -msse -msse2 -msse3 -mfpmath=sse'.split()) defs.append('WITH_OPTIMIZED_KERNEL') optim_defs = defs[:] - optim_sources = [path.join('kernel', 'kernel_optimized.cpp')] - cycles_optim = cycles.Clone() - cycles_optim.BlenderLib('bf_intern_cycles_optimized', optim_sources, incs, optim_defs, libtype=['intern'], priority=[10], cxx_compileflags=optim_cxxflags) + cycles_sse3 = cycles.Clone() + sse3_sources = [path.join('kernel', 'kernel_sse3.cpp')] + cycles_sse3.BlenderLib('bf_intern_cycles_sse3', sse3_sources, incs, optim_defs, libtype=['intern'], priority=[10], cxx_compileflags=sse3_cxxflags) + + cycles_sse2 = cycles.Clone() + sse2_sources = [path.join('kernel', 'kernel_sse2.cpp')] + cycles_sse2.BlenderLib('bf_intern_cycles_sse2', sse2_sources, incs, optim_defs, libtype=['intern'], priority=[10], cxx_compileflags=sse2_cxxflags) cycles.BlenderLib('bf_intern_cycles', sources, incs, defs, libtype=['intern'], priority=[0], cxx_compileflags=cxxflags) diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp index a1d7706a34e..1915245bb55 100644 --- a/intern/cycles/device/device_cpu.cpp +++ b/intern/cycles/device/device_cpu.cpp @@ -58,7 +58,8 @@ public: #endif /* do now to avoid thread issues */ - system_cpu_support_optimized(); + system_cpu_support_sse2(); + system_cpu_support_sse3(); } ~CPUDevice() @@ -170,7 +171,7 @@ public: int end_sample = tile.start_sample + tile.num_samples; #ifdef WITH_OPTIMIZED_KERNEL - if(system_cpu_support_optimized()) { + if(system_cpu_support_sse2()) { for(int sample = start_sample; sample < end_sample; sample++) { if (task.get_cancel() || task_pool.cancelled()) { if(task.need_finish_queue == false) @@ -179,7 +180,26 @@ public: for(int y = tile.y; y < tile.y + tile.h; y++) { for(int x = tile.x; x < tile.x + tile.w; x++) { - kernel_cpu_optimized_path_trace(&kg, render_buffer, rng_state, + kernel_cpu_sse2_path_trace(&kg, render_buffer, rng_state, + sample, x, y, tile.offset, tile.stride); + } + } + + tile.sample = sample + 1; + + task.update_progress(tile); + } + } + else if(system_cpu_support_sse3()) { + for(int sample = start_sample; sample < end_sample; sample++) { + if (task.get_cancel() || task_pool.cancelled()) { + if(task.need_finish_queue == false) + break; + } + + for(int y = tile.y; y < tile.y + tile.h; y++) { + for(int x = tile.x; x < tile.x + tile.w; x++) { + kernel_cpu_sse3_path_trace(&kg, render_buffer, rng_state, sample, x, y, tile.offset, tile.stride); } } @@ -227,10 +247,16 @@ public: void thread_tonemap(DeviceTask& task) { #ifdef WITH_OPTIMIZED_KERNEL - if(system_cpu_support_optimized()) { + if(system_cpu_support_sse2()) { for(int y = task.y; y < task.y + task.h; y++) for(int x = task.x; x < task.x + task.w; x++) - kernel_cpu_optimized_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer, + kernel_cpu_sse2_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer, + task.sample, task.resolution, x, y, task.offset, task.stride); + } + else if(system_cpu_support_sse3()) { + for(int y = task.y; y < task.y + task.h; y++) + for(int x = task.x; x < task.x + task.w; x++) + kernel_cpu_sse3_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer, task.sample, task.resolution, x, y, task.offset, task.stride); } else @@ -252,9 +278,17 @@ public: #endif #ifdef WITH_OPTIMIZED_KERNEL - if(system_cpu_support_optimized()) { + if(system_cpu_support_sse2()) { for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) { - kernel_cpu_optimized_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x); + kernel_cpu_sse2_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x); + + if(task_pool.cancelled()) + break; + } + } + else if(system_cpu_support_sse3()) { + for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) { + kernel_cpu_sse3_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x); if(task_pool.cancelled()) break; diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 6d5b9a063a0..e83756b7c8a 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -12,7 +12,8 @@ set(INC_SYS set(SRC kernel.cpp - kernel_optimized.cpp + kernel_sse2.cpp + kernel_sse3.cpp kernel.cl kernel.cu ) @@ -149,7 +150,8 @@ include_directories(SYSTEM ${INC_SYS}) add_library(cycles_kernel ${SRC} ${SRC_HEADERS} ${SRC_CLOSURE_HEADERS} ${SRC_SVM_HEADERS}) if(WITH_CYCLES_OPTIMIZED_KERNEL) - set_source_files_properties(kernel_optimized.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_OPTIMIZED_KERNEL_FLAGS}") + set_source_files_properties(kernel_sse2.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_SSE2_KERNEL_FLAGS}") + set_source_files_properties(kernel_sse3.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_SSE3_KERNEL_FLAGS}") endif() if(WITH_CYCLES_CUDA) diff --git a/intern/cycles/kernel/kernel.h b/intern/cycles/kernel/kernel.h index 26c0bcd6d1a..20ea5a61906 100644 --- a/intern/cycles/kernel/kernel.h +++ b/intern/cycles/kernel/kernel.h @@ -44,11 +44,18 @@ void kernel_cpu_shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int i); #ifdef WITH_OPTIMIZED_KERNEL -void kernel_cpu_optimized_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, +void kernel_cpu_sse2_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride); -void kernel_cpu_optimized_tonemap(KernelGlobals *kg, uchar4 *rgba, float *buffer, +void kernel_cpu_sse2_tonemap(KernelGlobals *kg, uchar4 *rgba, float *buffer, int sample, int resolution, int x, int y, int offset, int stride); -void kernel_cpu_optimized_shader(KernelGlobals *kg, uint4 *input, float4 *output, +void kernel_cpu_sse2_shader(KernelGlobals *kg, uint4 *input, float4 *output, + int type, int i); + +void kernel_cpu_sse3_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, + int sample, int x, int y, int offset, int stride); +void kernel_cpu_sse3_tonemap(KernelGlobals *kg, uchar4 *rgba, float *buffer, + int sample, int resolution, int x, int y, int offset, int stride); +void kernel_cpu_sse3_shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int i); #endif diff --git a/intern/cycles/kernel/kernel_bvh.h b/intern/cycles/kernel/kernel_bvh.h index 1a85b5bbefd..2b9ebf35d0c 100644 --- a/intern/cycles/kernel/kernel_bvh.h +++ b/intern/cycles/kernel/kernel_bvh.h @@ -126,21 +126,21 @@ __device_inline void bvh_node_intersect(KernelGlobals *kg, /* intersect ray against child nodes */ float3 ood = P * idir; - float c0lox = n0xy.x * idir.x - ood.x; - float c0hix = n0xy.y * idir.x - ood.x; - float c0loy = n0xy.z * idir.y - ood.y; - float c0hiy = n0xy.w * idir.y - ood.y; - float c0loz = nz.x * idir.z - ood.z; - float c0hiz = nz.y * idir.z - ood.z; + NO_EXTENDED_PRECISION float c0lox = n0xy.x * idir.x - ood.x; + NO_EXTENDED_PRECISION float c0hix = n0xy.y * idir.x - ood.x; + NO_EXTENDED_PRECISION float c0loy = n0xy.z * idir.y - ood.y; + NO_EXTENDED_PRECISION float c0hiy = n0xy.w * idir.y - ood.y; + NO_EXTENDED_PRECISION float c0loz = nz.x * idir.z - ood.z; + NO_EXTENDED_PRECISION float c0hiz = nz.y * idir.z - ood.z; NO_EXTENDED_PRECISION float c0min = max4(min(c0lox, c0hix), min(c0loy, c0hiy), min(c0loz, c0hiz), 0.0f); NO_EXTENDED_PRECISION float c0max = min4(max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz), t); - float c1loz = nz.z * idir.z - ood.z; - float c1hiz = nz.w * idir.z - ood.z; - float c1lox = n1xy.x * idir.x - ood.x; - float c1hix = n1xy.y * idir.x - ood.x; - float c1loy = n1xy.z * idir.y - ood.y; - float c1hiy = n1xy.w * idir.y - ood.y; + NO_EXTENDED_PRECISION float c1loz = nz.z * idir.z - ood.z; + NO_EXTENDED_PRECISION float c1hiz = nz.w * idir.z - ood.z; + NO_EXTENDED_PRECISION float c1lox = n1xy.x * idir.x - ood.x; + NO_EXTENDED_PRECISION float c1hix = n1xy.y * idir.x - ood.x; + NO_EXTENDED_PRECISION float c1loy = n1xy.z * idir.y - ood.y; + NO_EXTENDED_PRECISION float c1hiy = n1xy.w * idir.y - ood.y; NO_EXTENDED_PRECISION float c1min = max4(min(c1lox, c1hix), min(c1loy, c1hiy), min(c1loz, c1hiz), 0.0f); NO_EXTENDED_PRECISION float c1max = min4(max(c1lox, c1hix), max(c1loy, c1hiy), max(c1loz, c1hiz), t); diff --git a/intern/cycles/kernel/kernel_optimized.cpp b/intern/cycles/kernel/kernel_sse2.cpp similarity index 79% rename from intern/cycles/kernel/kernel_optimized.cpp rename to intern/cycles/kernel/kernel_sse2.cpp index 0b662095133..7947107a43c 100644 --- a/intern/cycles/kernel/kernel_optimized.cpp +++ b/intern/cycles/kernel/kernel_sse2.cpp @@ -35,21 +35,21 @@ CCL_NAMESPACE_BEGIN /* Path Tracing */ -void kernel_cpu_optimized_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride) +void kernel_cpu_sse2_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride) { kernel_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride); } /* Tonemapping */ -void kernel_cpu_optimized_tonemap(KernelGlobals *kg, uchar4 *rgba, float *buffer, int sample, int resolution, int x, int y, int offset, int stride) +void kernel_cpu_sse2_tonemap(KernelGlobals *kg, uchar4 *rgba, float *buffer, int sample, int resolution, int x, int y, int offset, int stride) { kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y, offset, stride); } /* Shader Evaluate */ -void kernel_cpu_optimized_shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int i) +void kernel_cpu_sse2_shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int i) { kernel_shader_evaluate(kg, input, output, (ShaderEvalType)type, i); } diff --git a/intern/cycles/kernel/kernel_sse3.cpp b/intern/cycles/kernel/kernel_sse3.cpp new file mode 100644 index 00000000000..9a8b389cf68 --- /dev/null +++ b/intern/cycles/kernel/kernel_sse3.cpp @@ -0,0 +1,60 @@ +/* + * 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. + */ + +/* Optimized CPU kernel entry points. This file is compiled with SSE3 + * optimization flags and nearly all functions inlined, while kernel.cpp + * is compiled without for other CPU's. */ + +#ifdef WITH_OPTIMIZED_KERNEL + +#include "kernel.h" +#include "kernel_compat_cpu.h" +#include "kernel_math.h" +#include "kernel_types.h" +#include "kernel_globals.h" +#include "kernel_film.h" +#include "kernel_path.h" +#include "kernel_displace.h" + +CCL_NAMESPACE_BEGIN + +/* Path Tracing */ + +void kernel_cpu_sse3_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride) +{ + kernel_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride); +} + +/* Tonemapping */ + +void kernel_cpu_sse3_tonemap(KernelGlobals *kg, uchar4 *rgba, float *buffer, int sample, int resolution, int x, int y, int offset, int stride) +{ + kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y, offset, stride); +} + +/* Shader Evaluate */ + +void kernel_cpu_sse3_shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int i) +{ + kernel_shader_evaluate(kg, input, output, (ShaderEvalType)type, i); +} + +CCL_NAMESPACE_END + +#endif + diff --git a/intern/cycles/util/util_system.cpp b/intern/cycles/util/util_system.cpp index 2d9f0fffae6..4fda090e09e 100644 --- a/intern/cycles/util/util_system.cpp +++ b/intern/cycles/util/util_system.cpp @@ -136,7 +136,7 @@ struct CPUCapabilities { bool fma4; }; -bool system_cpu_support_optimized() +static CPUCapabilities& system_cpu_capabilities() { static CPUCapabilities caps; static bool caps_init = false; @@ -182,7 +182,18 @@ bool system_cpu_support_optimized() caps_init = true; } - /* optimization flags use these */ + return caps; +} + +bool system_cpu_support_sse2() +{ + CPUCapabilities& caps = system_cpu_capabilities(); + return caps.sse && caps.sse2; +} + +bool system_cpu_support_sse3() +{ + CPUCapabilities& caps = system_cpu_capabilities(); return caps.sse && caps.sse2 && caps.sse3; } diff --git a/intern/cycles/util/util_system.h b/intern/cycles/util/util_system.h index f25e009a250..257112883d1 100644 --- a/intern/cycles/util/util_system.h +++ b/intern/cycles/util/util_system.h @@ -26,7 +26,8 @@ CCL_NAMESPACE_BEGIN int system_cpu_thread_count(); string system_cpu_brand_string(); int system_cpu_bits(); -bool system_cpu_support_optimized(); +bool system_cpu_support_sse2(); +bool system_cpu_support_sse3(); CCL_NAMESPACE_END From 03687b7c66d7064870bbe8d01f889c85de1fad7d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 4 Feb 2013 16:12:42 +0000 Subject: [PATCH 115/227] 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. --- .../blender/compositor/nodes/COM_TranslateNode.cpp | 12 ++++++++++-- .../compositor/operations/COM_TranslateOperation.cpp | 9 +++++++++ .../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(-) 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); From 9d713688bacfb9832cd7951eccaa05b5b977ff9a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2013 16:20:39 +0000 Subject: [PATCH 116/227] code cleanup: warnings --- intern/cycles/blender/blender_curves.cpp | 4 ++-- source/blender/blenkernel/intern/customdata.c | 3 +++ source/blender/bmesh/tools/bmesh_bevel.c | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index 05661d4bc38..8fb4813fab7 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -828,7 +828,7 @@ void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpola return; float time = 0.0f; - float prevtime = 0.0f; +// float prevtime = 0.0f; // UNUSED int vertexindex = vert_offset; @@ -865,7 +865,7 @@ void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpola } } - prevtime = time; + // prevtime = time; // UNUSED } } } 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); From a6f5a729fcd4e2686f955c8029818f0e92f8c8a2 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Mon, 4 Feb 2013 16:50:20 +0000 Subject: [PATCH 117/227] 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(-) 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 From fd2934b73a644ae92dd9596b81c1a80ea6126060 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Mon, 4 Feb 2013 17:01:42 +0000 Subject: [PATCH 118/227] Fix for [#34110] Displacement modifier + Procedural texture + Cycles -> 'NoneType' object has no attribute 'texture_mapping' * Issue was caused by a remaining part from the "OUTPUT_TEXTURE" node UI code, from the original Cycles branch. --- intern/cycles/blender/addon/ui.py | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index ad9253fd68b..5e5f9b03e2c 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -850,24 +850,8 @@ class CyclesTexture_PT_context(CyclesButtonsPanel, Panel): split = layout.split(percentage=0.2) split.label(text="Type:") split.prop(tex, "type", text="") - - -class CyclesTexture_PT_nodes(CyclesButtonsPanel, Panel): - bl_label = "Nodes" - bl_context = "texture" - - @classmethod - def poll(cls, context): - tex = context.texture - return (tex and tex.use_nodes) and CyclesButtonsPanel.poll(context) - - def draw(self, context): - layout = self.layout - - tex = context.texture - panel_node_draw(layout, tex, 'OUTPUT_TEXTURE', 'Color') - - + + class CyclesTexture_PT_node(CyclesButtonsPanel, Panel): bl_label = "Node" bl_context = "texture" @@ -893,12 +877,11 @@ class CyclesTexture_PT_mapping(CyclesButtonsPanel, Panel): def poll(cls, context): tex = context.texture node = context.texture_node - return (node or (tex and tex.use_nodes)) and CyclesButtonsPanel.poll(context) + return node and CyclesButtonsPanel.poll(context) def draw(self, context): layout = self.layout - - # tex = context.texture + node = context.texture_node mapping = node.texture_mapping From ea723386c31e4c691e6a64f6c69a83b30f8c3010 Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Mon, 4 Feb 2013 17:38:37 +0000 Subject: [PATCH 119/227] 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(-) 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); From 13499c6240e9c4d69dc26a45a3b6bcbf11e8b414 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Mon, 4 Feb 2013 18:50:09 +0000 Subject: [PATCH 120/227] Cycles UI Code: * Some more variable cleanup for old texture output. --- intern/cycles/blender/addon/ui.py | 7 ++----- intern/cycles/kernel/kernel_sse2.cpp | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 5e5f9b03e2c..840fc216c49 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -875,7 +875,6 @@ class CyclesTexture_PT_mapping(CyclesButtonsPanel, Panel): @classmethod def poll(cls, context): - tex = context.texture node = context.texture_node return node and CyclesButtonsPanel.poll(context) @@ -907,15 +906,13 @@ class CyclesTexture_PT_colors(CyclesButtonsPanel, Panel): @classmethod def poll(cls, context): - # tex = context.texture # node = context.texture_node return False - #return (node or (tex and tex.use_nodes)) and CyclesButtonsPanel.poll(context) + #return node and CyclesButtonsPanel.poll(context) def draw(self, context): layout = self.layout - - # tex = context.texture + node = context.texture_node mapping = node.color_mapping diff --git a/intern/cycles/kernel/kernel_sse2.cpp b/intern/cycles/kernel/kernel_sse2.cpp index 7947107a43c..e9d482ae5cf 100644 --- a/intern/cycles/kernel/kernel_sse2.cpp +++ b/intern/cycles/kernel/kernel_sse2.cpp @@ -16,7 +16,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* Optimized CPU kernel entry points. This file is compiled with SSE3 +/* Optimized CPU kernel entry points. This file is compiled with SSE2 * optimization flags and nearly all functions inlined, while kernel.cpp * is compiled without for other CPU's. */ From 55ff9ecdd95ab16b9fc636162e14de8949041e27 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 4 Feb 2013 19:12:17 +0000 Subject: [PATCH 121/227] 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(-) 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} }; From ae27a548f87e938facffc02f015e4a11d45f24cd Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Mon, 4 Feb 2013 23:50:31 +0000 Subject: [PATCH 122/227] 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(-) 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; From 9d8ec8b30f5d07155912b76127e44df5da8c27b6 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Mon, 4 Feb 2013 23:50:34 +0000 Subject: [PATCH 123/227] 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. --- .../blender/makesrna/intern/rna_rigidbody.c | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) 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); From ace88b6962427944bd6851c1174f020ef769a4b7 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Mon, 4 Feb 2013 23:50:36 +0000 Subject: [PATCH 124/227] 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(+) 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); + } } /* --------------------- */ From e9ef8d6effa0fa0d8b7d9a7764643d714c0ab2bd Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Mon, 4 Feb 2013 23:50:38 +0000 Subject: [PATCH 125/227] 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(-) 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) } From 936a38c607de098e3b09c5c00337130ebdd47b44 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 02:28:49 +0000 Subject: [PATCH 126/227] 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(-) 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; From a8601a5702b5b510af46459ed7a36f65a3e4755d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 04:41:11 +0000 Subject: [PATCH 127/227] 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) --- .../blender/python/intern/bpy_intern_string.c | 3 + .../blender/python/intern/bpy_intern_string.h | 1 + .../blender/python/intern/bpy_operator_wrap.c | 76 +++++++++++++++---- 3 files changed, 66 insertions(+), 14 deletions(-) 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) From ec97183876faa5b18debc75fb64b024da41f9012 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 05:09:19 +0000 Subject: [PATCH 128/227] add python api docstring for 'bpy.types.Operator.bl_property' --- doc/python_api/sphinx_doc_gen.py | 13 +++++ doc/python_api/sphinx_doc_gen_monkeypatch.py | 47 +++++++++++++++++++ .../blender/python/intern/bpy_operator_wrap.c | 2 +- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 doc/python_api/sphinx_doc_gen_monkeypatch.py diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 7457ae02d6c..d36f25553ea 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -696,6 +696,8 @@ def pyprop2sphinx(ident, fw, identifier, py_prop): write_indented_lines(ident + " ", fw, py_prop.__doc__) if py_prop.fset is None: fw(ident + " (readonly)\n\n") + else: + fw("\n") def pymodule2sphinx(basepath, module_name, module, title): @@ -1814,8 +1816,19 @@ def refactor_sphinx_log(sphinx_logfile): refactored_logfile.write("%-12s %s\n %s\n" % log) +def monkey_patch(): + filepath = os.path.join(SCRIPT_DIR, "sphinx_doc_gen_monkeypatch.py") + global_namespace = {"__file__": filepath, "__name__": "__main__"} + file = open(filepath, 'rb') + exec(compile(file.read(), filepath, 'exec'), global_namespace) + file.close() + + def main(): + # first monkey patch to load in fake members + monkey_patch() + # eventually, create the dirs for dir_path in [ARGS.output_dir, SPHINX_IN]: if not os.path.exists(dir_path): diff --git a/doc/python_api/sphinx_doc_gen_monkeypatch.py b/doc/python_api/sphinx_doc_gen_monkeypatch.py new file mode 100644 index 00000000000..1167ece05b7 --- /dev/null +++ b/doc/python_api/sphinx_doc_gen_monkeypatch.py @@ -0,0 +1,47 @@ + # ***** 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): Campbell Barton + # + # #**** END GPL LICENSE BLOCK #**** + +# + +bpy_types_Operator_bl_property__doc__ = ( +""" +The name of a property to use as this operators primary property. +Currently this is only used to select the default property when +expanding an operator into a menu. +:type: string +""") + + +def main(): + import bpy + from bpy.types import Operator + + def dummy_func(test): + pass + + kw_dummy = dict(fget=dummy_func, fset=dummy_func, fdel=dummy_func) + + # bpy registration handles this, + # but its only checked for and not existing in the base class. + Operator.bl_property = property(doc=bpy_types_Operator_bl_property__doc__, **kw_dummy) + + +if __name__ == "__main__": + main() 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; From 2c0a3cf42ee3800b783d1c82a82658984161aa64 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 05:39:18 +0000 Subject: [PATCH 129/227] 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. --- .../editors/interface/interface_layout.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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); From 791e38afd2637134f4fea1ad8a8cfb48317bbc86 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 08:16:04 +0000 Subject: [PATCH 130/227] 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(-) 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"); From 9ddf928dbd732a9394a17c65ac95ecee30f3efcd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 09:42:40 +0000 Subject: [PATCH 131/227] 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(-) 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) { From e7cead09944a97854309c5eea56fb4fadb92fb3d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 11:30:50 +0000 Subject: [PATCH 132/227] 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. --- .../blender/bmesh/operators/bmo_triangulate.c | 3 +- .../blender/bmesh/tools/bmesh_triangulate.c | 40 ++++++++++++++++--- .../blender/bmesh/tools/bmesh_triangulate.h | 3 +- source/blender/editors/sculpt_paint/sculpt.c | 2 +- .../modifiers/intern/MOD_triangulate.c | 2 +- 5 files changed, 40 insertions(+), 10 deletions(-) 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); From fdfa5910b50e9e3af5fdd1a24d1affdfbdafc523 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 12:46:15 +0000 Subject: [PATCH 133/227] 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! --- intern/cycles/blender/blender_mesh.cpp | 4 +- intern/cycles/blender/blender_util.h | 4 +- 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 +- .../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 +- .../editors/physics/rigidbody_constraint.c | 3 +- .../editors/physics/rigidbody_object.c | 3 +- .../blender/editors/render/render_shading.c | 9 +- .../blender/editors/sculpt_paint/paint_ops.c | 5 +- .../editors/space_action/action_edit.c | 5 +- source/blender/editors/space_clip/clip_ops.c | 3 +- .../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 +- .../blender/editors/space_node/node_group.c | 2 +- .../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 ++++++++++++++---- .../blender/makesrna/intern/rna_object_api.c | 191 +-------- .../modifiers/intern/MOD_boolean_util.c | 3 +- 70 files changed, 498 insertions(+), 423 deletions(-) diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index cdbd2fa8f2f..c61a7fafb57 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -435,7 +435,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri mesh_synced.insert(mesh); /* create derived mesh */ - BL::Mesh b_mesh = object_to_mesh(b_ob, b_scene, true, !preview); + BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview); PointerRNA cmesh = RNA_pointer_get(&b_ob_data.ptr, "cycles"); vector oldtriangle = mesh->triangles; @@ -507,7 +507,7 @@ void BlenderSync::sync_mesh_motion(BL::Object b_ob, Mesh *mesh, int motion) return; /* get derived mesh */ - BL::Mesh b_mesh = object_to_mesh(b_ob, b_scene, true, !preview); + BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview); if(b_mesh) { BL::Mesh::vertices_iterator v; diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h index f134416f2d0..0947b5a2e9d 100644 --- a/intern/cycles/blender/blender_util.h +++ b/intern/cycles/blender/blender_util.h @@ -39,9 +39,9 @@ float *BKE_image_get_float_pixels_for_frame(void *image, int frame); CCL_NAMESPACE_BEGIN -static inline BL::Mesh object_to_mesh(BL::Object self, BL::Scene scene, bool apply_modifiers, bool render) +static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL::Scene scene, bool apply_modifiers, bool render) { - return self.to_mesh(scene, apply_modifiers, (render)? 2: 1); + return data.meshes.new_from_object(scene, object, apply_modifiers, (render)? 2: 1); } static inline void colorramp_to_array(BL::ColorRamp ramp, float4 *data, int size) 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 *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; From 9d02ac41dca23f3862d84ad64fabdc57a22d4d81 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 13:04:01 +0000 Subject: [PATCH 134/227] 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(-) 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; From 48cfe610db32778d5e1bb4451592236f13e3d5e7 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 13:10:26 +0000 Subject: [PATCH 135/227] Tracking settings for new clip didn't match default reset --- source/blender/blenkernel/intern/tracking.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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; From dad053a1524dd4e697a3db3651503edff710510c Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 5 Feb 2013 13:16:21 +0000 Subject: [PATCH 136/227] * One more fix for Collada. --- source/blender/collada/collada_utils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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; From dd83387e0be79bd104b780515b6b34a12850b0ae Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 5 Feb 2013 13:31:59 +0000 Subject: [PATCH 137/227] 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(-) 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 From 7ecc9cfdf4a74c7264da7e812736c0f520d02d50 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Feb 2013 13:33:24 +0000 Subject: [PATCH 138/227] Fix non-progressive lamps with multiple samples not giving correct intensity after recent fix. --- intern/cycles/kernel/kernel_accumulate.h | 8 ++++---- intern/cycles/kernel/kernel_path.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h index 86177301357..1cf230634fc 100644 --- a/intern/cycles/kernel/kernel_accumulate.h +++ b/intern/cycles/kernel/kernel_accumulate.h @@ -220,7 +220,7 @@ __device_inline void path_radiance_accum_ao(PathRadiance *L, float3 throughput, #endif } -__device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughput, BsdfEval *bsdf_eval, float3 shadow, int bounce, bool is_lamp) +__device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughput, BsdfEval *bsdf_eval, float3 shadow, float shadow_fac, int bounce, bool is_lamp) { #ifdef __PASSES__ if(L->use_light_pass) { @@ -233,9 +233,9 @@ __device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughpu if(is_lamp) { float3 sum = throughput*(bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission); - L->shadow.x += shadow.x; - L->shadow.y += shadow.y; - L->shadow.z += shadow.z; + L->shadow.x += shadow.x*shadow_fac; + L->shadow.y += shadow.y*shadow_fac; + L->shadow.z += shadow.z*shadow_fac; L->shadow.w += average(sum); } } diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 7609336ac59..9b13f4d2a42 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -411,7 +411,7 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample, if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - path_radiance_accum_light(&L, throughput, &L_light, shadow, state.bounce, is_lamp); + path_radiance_accum_light(&L, throughput, &L_light, shadow, 1.0f, state.bounce, is_lamp); } } } @@ -624,7 +624,7 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - path_radiance_accum_light(L, throughput, &L_light, shadow, state.bounce, is_lamp); + path_radiance_accum_light(L, throughput, &L_light, shadow, 1.0f, state.bounce, is_lamp); } } } @@ -841,7 +841,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow*num_samples_inv, state.bounce, is_lamp); + path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow, num_samples_inv, state.bounce, is_lamp); } } } @@ -870,7 +870,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam if(!shadow_blocked(kg, &state, &light_ray, &shadow)) { /* accumulate */ - path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow*num_samples_inv, state.bounce, is_lamp); + path_radiance_accum_light(&L, throughput*num_samples_inv, &L_light, shadow, num_samples_inv, state.bounce, is_lamp); } } } From 1ca0d66bd20739132fb43fb07f80edac347ce745 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Feb 2013 13:33:54 +0000 Subject: [PATCH 139/227] Fix particle child render resolution access not working outside of the render thread, and rename ToggleRender to set_resolution to follow RNA conventions. --- intern/cycles/blender/blender_curves.cpp | 9 +++--- source/blender/blenkernel/intern/particle.c | 6 ++-- source/blender/makesrna/intern/rna_particle.c | 31 ++++++++++++------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index 8fb4813fab7..5b8d495084d 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -37,7 +37,6 @@ void curveinterp_v3_v3v3v3v3(float3 *p, float3 *v1, float3 *v2, float3 *v3, floa void interp_weights(float t, float data[4], int type); float shaperadius(float shape, float root, float tip, float time); void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyloc, float *time, ParticleCurveData *CData, int interpolation); -void ToggleRender(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::Scene *scene); bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int uv_num); bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int vcol_num); bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background); @@ -380,14 +379,14 @@ bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par } -void ToggleRender(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::Scene *scene) +static void set_resolution(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::Scene *scene, bool render) { BL::Object::modifiers_iterator b_mod; for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { if ((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) { BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr); BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr); - b_psys.ToggleRender(*scene, *b_ob); + b_psys.set_resolution(*scene, *b_ob, (render)? 2: 1); } } } @@ -1017,7 +1016,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool ParticleCurveData CData; if(!preview) - ToggleRender(mesh, &b_mesh, &b_ob, &b_scene); + set_resolution(mesh, &b_mesh, &b_ob, &b_scene, true); ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview); @@ -1166,7 +1165,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool } if(!preview) - ToggleRender(mesh, &b_mesh, &b_ob, &b_scene); + set_resolution(mesh, &b_mesh, &b_ob, &b_scene, false); mesh->compute_bounds(); } 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"); From fa671fd0d54afa92f0e220aee5ba6ba86aef050e Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 14:16:19 +0000 Subject: [PATCH 140/227] Fix #34041: rendered view + border Issue was caused by rare cases when camera move happens just after last sample was finished, this would lead to missing delay reset because render cycle will go to pause_cond.wait(). No reset will happen at this point because of some kind of optimization which checks whether camera is tagged for update and wouldn't do reset in this case. Talked to Brecht and seems this optimization is not actually needed and removing it will solve issue with frozen preview. --- intern/cycles/blender/blender_session.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index c390c13a7c2..951f7022a10 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -493,11 +493,10 @@ bool BlenderSession::draw(int w, int h) } else { /* update camera from 3d view */ - bool need_update = scene->camera->need_update; sync->sync_view(b_v3d, b_rv3d, w, h); - if(scene->camera->need_update && !need_update) + if(scene->camera->need_update) reset = true; session->scene->mutex.unlock(); From 4c3d5a4294756944eba2ab536751e38eecc2bd8d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 14:25:22 +0000 Subject: [PATCH 141/227] 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 ++++++-- .../blender/makesrna/intern/rna_sculpt_paint.c | 3 +++ 6 files changed, 34 insertions(+), 5 deletions(-) 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 From 25cbd13d22218e307ca09e343b3f7e6e9f21a095 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 14:27:24 +0000 Subject: [PATCH 142/227] Workaround for deadlock in face/hole merge function in carve which could happen in cases of degenerated faces. --- extern/carve/lib/intersect_face_division.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extern/carve/lib/intersect_face_division.cpp b/extern/carve/lib/intersect_face_division.cpp index c74b52dd557..c5d5d8c5152 100644 --- a/extern/carve/lib/intersect_face_division.cpp +++ b/extern/carve/lib/intersect_face_division.cpp @@ -719,6 +719,10 @@ namespace { unassigned--; } } + + if (!removed.size()) + throw carve::exception("Failed to merge holes"); + for (std::set::iterator f = removed.begin(); f != removed.end(); ++f) { for (unsigned i = 0; i < containing_faces.size(); ++i) { containing_faces[i].erase(std::remove(containing_faces[i].begin(), From ef457d599467ac9211bb9e3dc218e5c40f5a6a9a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 14:33:55 +0000 Subject: [PATCH 143/227] 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(-) 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); } From adf9dffa30fe9767fc38cef60866372253d9b76b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Feb 2013 14:38:19 +0000 Subject: [PATCH 144/227] 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(-) 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"); From 2fc46efbd688f336fcdea571cf892fcc21f23608 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 5 Feb 2013 15:01:08 +0000 Subject: [PATCH 145/227] 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(-) 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 From 0983e9c745785f3f2c7773d8750a134d7addaccb Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 15:22:30 +0000 Subject: [PATCH 146/227] Add missing Custom Properties panels when Cycles render is active --- intern/cycles/blender/addon/ui.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 840fc216c49..09c94cac270 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -1133,12 +1133,14 @@ def get_panels(): types.RENDER_PT_stamp, types.SCENE_PT_scene, types.SCENE_PT_color_management, + types.SCENE_PT_custom_props, types.SCENE_PT_audio, types.SCENE_PT_unit, types.SCENE_PT_keying_sets, types.SCENE_PT_keying_set_paths, types.SCENE_PT_physics, types.WORLD_PT_context_world, + types.WORLD_PT_custom_props, types.DATA_PT_context_mesh, types.DATA_PT_context_camera, types.DATA_PT_context_lamp, @@ -1161,6 +1163,11 @@ def get_panels(): types.DATA_PT_custom_props_camera, types.DATA_PT_custom_props_lamp, types.DATA_PT_custom_props_speaker, + types.DATA_PT_custom_props_arm, + types.DATA_PT_custom_props_curve, + types.DATA_PT_custom_props_lattice, + types.DATA_PT_custom_props_metaball, + types.TEXTURE_PT_custom_props, types.TEXTURE_PT_clouds, types.TEXTURE_PT_wood, types.TEXTURE_PT_marble, @@ -1180,6 +1187,7 @@ def get_panels(): types.TEXTURE_PT_influence, types.TEXTURE_PT_colors, types.PARTICLE_PT_context_particles, + types.PARTICLE_PT_custom_props, types.PARTICLE_PT_emission, types.PARTICLE_PT_hair_dynamics, types.PARTICLE_PT_cache, @@ -1197,6 +1205,9 @@ def get_panels(): types.PARTICLE_PT_force_fields, types.PARTICLE_PT_vertexgroups, types.PARTICLE_PT_custom_props, + types.MATERIAL_PT_custom_props, + types.BONE_PT_custom_props, + types.OBJECT_PT_custom_props, ) From 87a0f09a225771c41f861d9de235d94299314be9 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 15:30:00 +0000 Subject: [PATCH 147/227] Didn't notice this panel was already enabled for Cycles --- intern/cycles/blender/addon/ui.py | 1 - 1 file changed, 1 deletion(-) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 09c94cac270..542262000b6 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -1204,7 +1204,6 @@ def get_panels(): types.PARTICLE_PT_field_weights, types.PARTICLE_PT_force_fields, types.PARTICLE_PT_vertexgroups, - types.PARTICLE_PT_custom_props, types.MATERIAL_PT_custom_props, types.BONE_PT_custom_props, types.OBJECT_PT_custom_props, From 9157f8f83384925aee196048a643eeb2cb22be26 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 5 Feb 2013 15:52:40 +0000 Subject: [PATCH 148/227] Apparently my system here considers fullscreen window as maximized which makes it impossible to toggle from fullscreen to windowed mode when startup.blend is saved in fullscreen mode. Reshuffled checks a bit, which is actually makes sense, will investigate which change caused regression since 2.65a tomorrow. --- intern/ghost/intern/GHOST_WindowX11.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 934dec8e047..7ef3a739b7e 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -935,12 +935,12 @@ GHOST_TWindowState GHOST_WindowX11::getState() const */ if ((state == IconicState) || (state == WithdrawnState)) state_ret = GHOST_kWindowStateMinimized; - else if (netwmIsMaximized() == True) - state_ret = GHOST_kWindowStateMaximized; else if (netwmIsFullScreen() == True) state_ret = GHOST_kWindowStateFullScreen; else if (motifIsFullScreen() == True) state_ret = GHOST_kWindowStateFullScreen; + else if (netwmIsMaximized() == True) + state_ret = GHOST_kWindowStateMaximized; return (state_ret); } From c8e0f993cdc04a5b05c3fb0e7bb5ee13e5fd13c3 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Feb 2013 15:58:15 +0000 Subject: [PATCH 149/227] Fix cycles missing AA/alpha settings for OpenGL render, these are now in the film panel. --- intern/cycles/blender/addon/ui.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 542262000b6..0debb549b30 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -168,6 +168,19 @@ class CyclesRender_PT_film(CyclesButtonsPanel, Panel): if cscene.filter_type != 'BOX': sub.prop(cscene, "filter_width", text="Width") + layout.separator() + + rd = scene.render + col = layout.column() + + split = col.split(percentage=0.40) + split.prop(rd, "use_antialiasing", "OpenGL AA") + row = split.row() + row.active = rd.use_antialiasing + row.prop(rd, "antialiasing_samples", expand=True) + + col.prop(rd, "alpha_mode", text="OpenGL Alpha") + class CyclesRender_PT_performance(CyclesButtonsPanel, Panel): bl_label = "Performance" From 134c656878f63e597b250fa2a89eaf9196120d57 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 5 Feb 2013 16:16:07 +0000 Subject: [PATCH 150/227] 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. --- SConstruct | 8 ++++++ release/datafiles/matcaps/license.txt | 2 +- release/datafiles/matcaps/mc01.jpg | Bin 21395 -> 20830 bytes release/datafiles/matcaps/mc02.jpg | Bin 40254 -> 23428 bytes release/datafiles/matcaps/mc03.jpg | Bin 49292 -> 17550 bytes release/datafiles/matcaps/mc04.jpg | Bin 46330 -> 29197 bytes release/datafiles/matcaps/mc05.jpg | Bin 20830 -> 25454 bytes release/datafiles/matcaps/mc06.jpg | Bin 59262 -> 19864 bytes release/datafiles/matcaps/mc07.jpg | Bin 26688 -> 59262 bytes release/datafiles/matcaps/mc08.jpg | Bin 44762 -> 24133 bytes release/datafiles/matcaps/mc09.jpg | Bin 55815 -> 31101 bytes release/datafiles/matcaps/mc10.jpg | Bin 24133 -> 28973 bytes release/datafiles/matcaps/mc11.jpg | Bin 31101 -> 21395 bytes release/datafiles/matcaps/mc12.jpg | Bin 52893 -> 23797 bytes release/datafiles/matcaps/mc13.jpg | Bin 29197 -> 45661 bytes release/datafiles/matcaps/mc14.jpg | Bin 25454 -> 44762 bytes release/datafiles/matcaps/mc15.jpg | Bin 33401 -> 27456 bytes release/datafiles/matcaps/mc16.jpg | Bin 27456 -> 33401 bytes release/datafiles/matcaps/mc17.jpg | Bin 0 -> 49292 bytes release/datafiles/matcaps/mc18.jpg | Bin 0 -> 40254 bytes release/datafiles/matcaps/mc19.jpg | Bin 0 -> 46330 bytes release/datafiles/matcaps/mc20.jpg | Bin 0 -> 52893 bytes release/datafiles/matcaps/mc21.jpg | Bin 0 -> 28717 bytes release/datafiles/matcaps/mc22.jpg | Bin 0 -> 33801 bytes release/datafiles/matcaps/mc23.jpg | Bin 0 -> 26688 bytes release/datafiles/matcaps/mc24.jpg | Bin 0 -> 14149 bytes .../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 ++++++ .../editors/interface/interface_icons.c | 12 +++++++-- .../editors/interface/interface_templates.c | 7 ++--- source/blender/makesrna/intern/rna_space.c | 8 ++++++ 33 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 release/datafiles/matcaps/mc17.jpg create mode 100644 release/datafiles/matcaps/mc18.jpg create mode 100644 release/datafiles/matcaps/mc19.jpg create mode 100644 release/datafiles/matcaps/mc20.jpg create mode 100644 release/datafiles/matcaps/mc21.jpg create mode 100644 release/datafiles/matcaps/mc22.jpg create mode 100644 release/datafiles/matcaps/mc23.jpg create mode 100644 release/datafiles/matcaps/mc24.jpg diff --git a/SConstruct b/SConstruct index eb22af1455b..acf948fe970 100644 --- a/SConstruct +++ b/SConstruct @@ -591,6 +591,14 @@ data_to_c_simple("release/datafiles/matcaps/mc13.jpg") data_to_c_simple("release/datafiles/matcaps/mc14.jpg") data_to_c_simple("release/datafiles/matcaps/mc15.jpg") data_to_c_simple("release/datafiles/matcaps/mc16.jpg") +data_to_c_simple("release/datafiles/matcaps/mc17.jpg") +data_to_c_simple("release/datafiles/matcaps/mc18.jpg") +data_to_c_simple("release/datafiles/matcaps/mc19.jpg") +data_to_c_simple("release/datafiles/matcaps/mc20.jpg") +data_to_c_simple("release/datafiles/matcaps/mc21.jpg") +data_to_c_simple("release/datafiles/matcaps/mc22.jpg") +data_to_c_simple("release/datafiles/matcaps/mc23.jpg") +data_to_c_simple("release/datafiles/matcaps/mc24.jpg") ##### END DATAFILES ########## diff --git a/release/datafiles/matcaps/license.txt b/release/datafiles/matcaps/license.txt index fb9186d7acc..2670a62e311 100644 --- a/release/datafiles/matcaps/license.txt +++ b/release/datafiles/matcaps/license.txt @@ -1,3 +1,3 @@ These matcap images are licensed as GNU GPL 2 or later, like the rest of Blender's code. -Thanks to Kent Trammell and Aidy Burrows and John Herreno for making the pictures. +Thanks to Kent Trammell, Aidy Burrows, John Herreno , Terry Wallwork for making the pictures. diff --git a/release/datafiles/matcaps/mc01.jpg b/release/datafiles/matcaps/mc01.jpg index 053550f082cd3e7622fdad199aa62285024b5710..8c7aef287eee7554e297476609c4362371e480f5 100644 GIT binary patch literal 20830 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 literal 21395 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 z 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 literal 40254 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 FtR6K3AHrn(?i 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 diff --git a/release/datafiles/matcaps/mc03.jpg b/release/datafiles/matcaps/mc03.jpg index 14f15f704601bfb83d3b9af1803b24c94dcc0017..64d992fb61ab97f85f7b85e5c97f1d9767fa2982 100644 GIT binary patch literal 17550 zcmb8VbwE^28#lbb0!uGTEw!+)^b$*hc;(b5w`~LY2hr?m!%HLcwbIqLdXX(!x1a7Qvqz@q@BZC-%AIP6ohz^8; zoSbxl0tFW(jFJ)xrKF{%rh?Ja($mw?($O(6BH#>+%#3t&aCSH|3o9EN8$A;TlARTa zU}a+^2_d5ZJWxs+N=h15208}T|KH`$0E8Jv4k3q7kTFBZnaL=a$^HyMxFFzvlC}S* zkW-LBDXBpllGO13G(pJ7DWHE=AoLVu5OO#L90DQx4sQP|49;Ak=VK)5&+o)p30Rvb za$b7da19 z*hQIzhB+=@vMM*EdompoD>j)@@nkPV^j|7a|L@ai^}^0!aYF-FiKm%7c^9NlhCWlq zN-rr1jq>5{AFKLHMin1-@<3Hlf$BX!Q)@HF#NZfkzTp~G9FhuX;G`9;p`+nBif{_# zQ~b-q_1Atf}OLq9a+PC}@CI$-99|m>Q)3dE@ z8U;L&?ju|!7vup{anls^6qGVnrW^{Ca4QcFyl##}(w8F{68$vk&YGP7HRW_ckZ!WY3KPKX*TOC`A#H~xFWxL$-_2oq~S*_Th@R9@?SSP$3V_K?g z-p3+B}rE!q3gUDa6-(9n>w`{YX zC}_6Ju$!xDw;E~FZ%i)|x4rSE1g%=28;`)GVaM~BePD*=rsWtzBX8hEny%o)dPGDQ zy?U%kPsng+lW~({J&<6$Fj=2oh$=-jv0?G{?tn0-K?d}wb7fINPW?SBIQDsc5+mU8NT6RjqOiHJ zqu!X!n5|`0dp?ZU$2OD=IiSnvxTRvQbM4-kZa}$du0pAba3?7eNzjNE7^9`jhR4TH zjn%97A{&4JF>mog$C||nwvKw*LeWA=XXe?kiWK(+ULk$f(kCI$ILCsYi9NZL3;fB) znA-}mhyZkof(3#F9Q2jjqhFn}@R{H4_-ck#Ki%YQY$pyv)2_Zy)V9g-K?SwlWdrw> zuu&uJDa@tv!ja(euyLNnFS!_uVX43cWxN%@s(^$PVgmPAI{&pzpzHL*qUHr-JHH~^ zdiB#c>`*K9v<1!Vsw@qvEgh#A=WeQsPjBSiyi~BM{6zemwsI~HPKmXQ8D0r)~S-FfU3Ng$Z$`uHi zDisBhY3`t#HdJFp6Mk=W;lu3W={DPDw)tw~YU6s#dMi=u^7;bDB57Wl*)U!aUHj@T zmNfXy@V7TZBv?U6B1{mvr!5I-LmR=eRx0O=g%GJGcSfuMG9tTv8pQ!%cw zI`6qa%PMYvZ$?CW+NntgkEqj4BR3K7puwau+vf_HJLILcZUJ*T((+Ts#XO~@Ohex} zwgDNm%f>)JJxPXdj%~Bf0v#LH8S5yHs}hs-N@KBw58;Cm5(sD-b|V-Kq9n*Exj6)KE8Cc6E+u*e-D_w^)I%BU=m}weY8o6#gX@r%7 zQ3|>!b;$emq)nsALUW;GwTYOWn1yYlsCwZUgJ#yk*2t>Yw2aD|5Ts~Lx|_Z*4a~?x zD@`C|tlZSFz_ijIj0oKt&Ik8A!alv6WSdPA?>YoA*JaSm zEWJ!$CJnq)Aq{~!(O#-ts9^J1-wPHq{&38FUmnUhpkwL`_K4Q#YG* zt7qSo8N7xgP47rItx{UkYoIf&tHEMK@}NTmAyiPqJen{XXc8r9H(M{BgatjRSRksd zyrVsOx}kmMnLct(9|9I#de|UZ7h{@>7AjRP$(6Ot1K?pyM27@(3JpJf*luw!zGGQ$ zJz-PO*x1aduDt!4Eo^tf96yr!JzfCbGc#NJ2pQ$6=G?Bao)f7|IB>ZdDEH`Eo>t+}pM@VGBzbzabyXQ+Y* z0{?|JpPJCKes>C*7pR+= zJm(e|8XI|5QK#FJIqm2086aDt9HZ2ev9e0e_# zVD3~s5JwU4Y{g}D*|FXZ^{m+@$1__&K|y(t+l=AdHQx#08xRjFq*!``uyM_RwLX4m zh~O|lLt3Fskc9GbzcmO@UICQXTQ}Kq-B8alSLvER7}Q^!)8Tdm*(6z*R!$m|OYM?KO}SZ@+sleYzV=lHP2iji^yniJzb6`DA&l_tMIeC`3k3 zf<=fjlf8&_%urjeC@2BXB2utnJ&fjg(EJ4?Q)m8Zv_4#H@fJ^bTfme zO(yP6*GQS8e*je+lr0%aKEjE_f-G2kXqdn(0;UZy58~suTT_4+!rj>zvfy1`*w}27 zWv)DEKR-wx5I{lJ5C^a(OV$V3a|7PEZa9fqL|nHfWLS`Asb%Pd&un?F>4Km2gq_%j zu*jKFu2MyirYpwvSW=vU%kayL_3O#9orYVXbrGZ$K-cT-bML`b}kVr&+a432;Nhax-s4ex=YzDM_I(gl^_yc7}xQ z3FFS3U5kOd-~7TV;DgA}QwVak_FhwAxICh@Jx_vy3-7pV9N0>(Mm*llDcUM2=v{fXB~I+Kte3D zqAJ_oQ054B6##A|d5If7JssPO!Jt*n<)=sK z2xVvkEfn-|gOoUSI|QqtUb%p=AXY|&EDl%>bkS2l`c)vNrnJgir`=eu9w(|TSx1%pt4K3J>m3WEP7!$_vmyiI- z^HroDKo3N@A;D%a&aEckzKtPLo4TIzP8=^2NS}#$;`XzejEI=;L047}q2+4H_n0o;|a074*(zo7j z>$%`-X34^Vu^$r>1lturJuN?{HBF&44WR&gW(*uc0U-yQebTlXr~`$JnH-Mbr;vf- zw9vAaECOKv3O((Q0~oL7M9cns2g2SbqEdfh1FWzst0~p_x3o z_aHU=LF|*!!OC-*^rM^WsqJVOp2dvaGtD9#uwT#eiqODvU0)0TEjKkdbekkL z=s(_B7R%(TLf7`AujG6jq%PZw4vWiG01`=Zn{JT)DAC-IkGQHj^^`jCmxeUOKGLn- z$d4pI;Y7RY0K7tYMQ*RPxVUfk7m6Boh+2U^6MAk$Kk=l z=VAC+V9Ni9K$Zpk5ozDq$uZsc9M|0J9UbTboa{u<4>V!GU696@llB(i(d?-XsWNA2Lp7_^<4Q8gC#qxwmpK+YxF=C50PpJR2L8ev@iT7*T+GgHlk7mI4wrPY3uChl1d03Hvgb_4fbtVVdKw!+ zAMO8vxbl4kz)7Od)0r4Lf+vqDhYZ}91D#;5xdD1hQPFDzcL12w)gL}2#lVmCgQWWU zI!Q^%wrUXlz!dzL1J8+kl+KvHe-ufEfro>j@A^k7)ztJvUhdcypiZ|wBniw3GzBP6Woi(+2$F4* zlG1i!#x}WQjRFPtAKH^dpekRMjNnRtxgR9eNmhrRb!oOPs24LP-9iDosplMWw5LIC z{OcxA)ZNv6U$X7yzXUJDj1?7eIsTEJbD+}!$p(O<8boZAR8y37v2DHR($Z+-GO450 zQgS}RoY{%@r6%ilOje442A3R*7F1=)NQB1T?=k!=d(kt!clBRq0h@I7N5H~ayqrov z2Lyz=tT?+AJiOIJs+5iDPsMZSeGk0<;aEtqx7+0 z=yr8KEWUH#dI^A#dCuY{y{W0AYx<9-u$ZZ+NKekPcZ4A{?5u0T*LpFNm*4J#I^@zT ze|r$xXI&;2KOH`lzLV+cDH}7B0eUL`@MXcHve}=NB}*ft+rw#TsTL*=r9OT3vo3D? z9O(j3@|3;WYF|=W+(|m22x%*g`TPIWi^a&-OWoXwbpG4&2cnNP zH8rhYkT!OHN$Lidp3sM4VW1xr70-UxNFtV$l$ta0)wSFoF<``Rly$_^Y7u0%sj`e(rK>~~Z7Z+j1 z*6;p{5&hBJZ$J1u{<8j8c@jOO8%k&LYnMHiFf{QW^TL0svvLGpy`Us^sIZ>s`9HT> z&#{Quqyy}5?%4mS1Wz`^eN^nG4zYvXKrr_|4UK}iV-Y#h`wjPao`C9;$Ol8} zcl0a4+^IL0RLYP0p*Htx7ZL2G%A>Kpa0i73@xi7@7?~6$E$n3UaE?Ar(7c(q)Gos`0sebBf z=HkzmOTk=AZI^s#+HPHn4MM(J7>bo)t1_~V9G1uwzB-aqe~_J#yr`SkfadSU1NWT5lbmB^?isi%vJWj(wDTc6M0 z3tnS?o7C`PG?nvCa5nC%ua(>wy+gj*V?`-t$g_L`!+BgPgM)J4e6bgWxw)lGe60|R zN>$U-0%tt$HD{A1bG0@***jwWg-vFmZ6?-*;+H21C9LNgMF8w#a0nR%1sOH;sd#wnjv4mfl9&toVP!?OB9Zc-bH*z@1|CJ;mc(wu^mrJy^F$Y zf@Z!L#aP7B-=fl-mb?C?rc;!FX5{pF1fdER#tAEl)xZA(c^h+4W%b$h)uDLSQZJn) z$P>9G$W(_XB0R?TSGTgyLhLuH$H*WU0VV)Xp+AfRa)U;2m^=@oe)#!FlV6%v-F)wS z-~ucHaKfZo-!F9{b+V}^G9Q_*bbI#KFHwbo160rQ;RZYi2#D|Bpnv1wljpKCO;umbN{EXMz7A!(_M|{ z1b6~W0E&l~`oul;g^b|RhD!2`Fc<>y^&dzeUu@MJ(?JL{Zsw(*{e#`FlD$lG!%;NJA}w(c07?C2Mck26Cgrk#xat&&S+fSh)W&q zhY3RA1b8+%JVmfiF7pr~LW2{=4CR>tc?4p9d~?OKp7)<8WC;8O{sbOaNWt#ZVJf|c z={Ob;g;I=!XQz zk%y=oShvtHeO_|-H?5Gx_DlfN37JfZ5zL4#G&%R^%h#N}ZG9d_YG8hj8-K?Wf|y}A z3v%%epv4ITaznhK5se`CtmdmRU#2(1$v|-`UKy8(=H=HD>kB`{$6rOvGlvpMUJSTT zJJ!ipY7&?;)gY+`HgDsh;RVJ)7vAcS!Hj51(P}g)6n)57x5MB3`W*o$;FXo(Imt*5 z{(Y&5pqPYjcz7PXlpt(G*d2_2((`Ii0Xa&}!^2A*XT=MR&dD$P9>pYv#IvZWF`{x( z)#!L%o%zYUn?g-ZWYy5Z?Q*z?P)|*f%e*EGL_h^cGR674O_}0#J$gg-%`>G7BKRCKfXmuVspF9WxsBkB_4W1Z{2Fc*$w`Ud z_jD2y)U%P?ct{mAs%>DiS%=BvTL1_rgW{{K~t)6o@^aA3kTMoRp zKZKJj3-KUQJp{npSv1V1c(6!)as*5d<*(N`;+`@QuNoa@vl?ixizZv1Y}aLm&~M0c z;vyTcV3qb>!>$KSH8y{>m|I=%=i%YwWu~uAw(_q|My7Pd1w2F^&{`LH59~Ik)V!-X zxE?2%L|>b5B8Ly`{MDGux>o~sxkqbLs;rBwC*{;+OLw1K8rE>qRpW&vTY=L7sZ6tE zR9Qgx>RdoiEpoWX8+*4?c76TR>-McnYsD1(^lho$q(cNXq-XLfAOqJ-*&rZv@CLLK z-o*wg0qUGPDxt^%oTz*9X_5;Jw+90rDrI%QEDPvZ#d!nL;*3FTeW|g{L$R+BJLVz9 ztulk6$;f16IFPKk8p!=uFu0#k7ddnT%8yfWM8u3O2Z3WiHFp3&peL() zH9DSz!<0insdq_7k%Nht`B-=KHx*;+WMHVwkm4%C?Y(Z`)rntn0X<1YFM*BV5;Ms= zRLF^=MNyC-mDwe^6ZzNokyZc4MJ~W05@mfc_4xabYj^3ZQ-CKPEbdPfQHn1E9-+He zrMdmP_s(HErW}BQ#UdZ0DjzY>SC5@Ij4XS+3D6;XP493H3;HrcgI}`pW%vzXJ&KBdFrb~0)FmUUBLMAi$&N`} z1~99WV_VC$HBIe3tmJSHxODJ?sc}bckx_fKPKYGajY}_aJErOeJ}>I}*@|+yz#Uy@=)0`{y`(2`oQ- zgw=p=V-Oer$0frhqeBe8a%N+nb%2eb@L)eRsTcZ4y>T4^HnY_ev7M-w4$t3@9A8yq zBb`yKMZ~>=zrvyDJ-J4URl+q&e;XtVp^bHRrlAmAtLN8C5p~knlj}jvGCZ(ETE}tZ zVe?wdIrFR7tKr0YG*k5&*2Wk%fDQMekNbJMIV z8m|#qr(F5=51Wy-}5F5y^rgXk1 zy5p(WVJ}ElPQFF~$8Hb^oRrg?liJX1x+{8|W8NDn zzB)U!_~eQIT?EM>0S&`~ThC%xm-&leW*?vYa;j>ZCDpTZgjRn#d@Zo788|E?v~6;G zTE-958>$atBm$=hlJ{qgGzaj-=eMNdG)VL?i0E1Is{vjR`BmWxB=_Ui`p{>fUU!%G z+)>as6FgL9(!cvT+WAhQwO$iH!d-udYLe-T@v_E?&%Zi;f2F(leWFs5A7Nfo!guvo z*`*IXFI~R$O^+?st!CR*n97{d+Mt{$X979P@0?^SXJ? zo!@204XY6vxJTbcGOYRGJW58h+rsFlu~F_y$3K4x|E~M_^O{H%BL2Q>PiiamQQ*(n z=g(tf&mE=Ae)7db=$6w_EpKpvpFe9tPQCo4;eBv$?byQ;!ct262U6g!DgACaNAjn6 zn}YwV!ACC7jQh^sc<|_1F(pts|i>(REZ zVE;}}%$LS_3a^|zUESFM?caH=!H=&oX`QZ?YwQ$!#o|U>46N-v9C}nFptwv+@7^Vv z-}t4<`4S>Q$5}otE}*wq74d>mPgg#bqqS4P+^%LCTeK=9(9_i|tmv%8s1)m@%9#S zo5hjwCzN6<$gcU%GB~Ev%lbUiWBFQF_pxI}H@O7mNu5BvN%8om*iSI#?OJ_l#%Y-0q2gMFS$W9QnKJ*H0c*JOv>!_w_A|D z*Ihzso5!=3Oa9NfRmxU)ykYA5yjrn)_u~F(@XF`GN5IZpz1Et ztjqVSoC#R@1IgPOlN%SlM!C3R5$#{~!nrPw+&$U5*QGdMoCpl5faee1l} zZR{qXbMt^S#X&ISh(s>9aG8IRk$*>mW71n|B7`IdL#MOCu9rpuK^W51!Q-<^mRP}r z7H5b_fKJ*U6|oOO;V}13W{>(oD4+*TM7`>Ifj+#LjGRzI?%jNGG(Wi!KZJ%q&PX_P zq55N1$5|RdIq}ah7$D|{K%fW+xwiGhyECt1zUUAAsDsl$@(jVO3?&o~Ol+AZNw%>{=OkSk*0_m&)*)DtmA`beInn5Nr{-k;y|*y!Z#wW~BV| zH3KDYd;D6K5Nk~Q%ig97k3X;OCqIp0Irk_&-JNqOS``L#5!SC^veV>5M&E99HzyN9an0~@)-CB|#Zb^ZD( z@#i~VF5zbk+!hGpFvkGyhN{6k)D&$Zr}3-=sqP18GAO@xTi1FRd3Daq%z06TG_Jn; zdQb^@nt-@Ousza-$-tKhSc0YuJZOkvZ5j4v><>hRPVh2Zn+9fhycC{T1~5W{??A!J zDuBU%2TI_}P=FB*t)*>c=^lK75a}=pen^HQP$nL@{nS1hicVE!*3%p~wIy=IOA{@V zjNttPIaS4SpuMMiKV5{?N)Mi@$Hr=_lk(yB1l=}f+X=ubpq;urO4 zX2*c{owy9b=FbsopZ$xt$VTNF$>^Xs~Z+|*aqiheE6TY7q| zPU_|xo##?(1gApa#5kxZE%H4@(k1LSw%l{6Kefi)!~yZCy>0*5`d z$C>d-eGi2aoy~8gEr`o|P6a_G(#84iA+4f*;YHI0g$pbRR%^6ZsGvNa&+IjVf}&@x zQ^k4fv5^(V-?4ahN>CUHtEL;VccO5!T!Wu+nXOoRW;v+O|KK|~a_u>u zgm_AZ%*JCO*EdrN8`vlrUrQzv*RW?YT%Uea=p^coeoTPLQ^Mr$W?yGsmwU}q;-(6j zNZf}h8|?k;Poc_0vr*1y$Kx5l>y?*2cdB^Gz-$#!mx+7{B$6_&Vwv*|a%uEeduz5toAu(n<=*qh?dEccY^A;qp_K@^V zy#e=indMsjpCa0>Zm+V*V!pJZSP~Qit1DE@bye+8-!(lNitO)KnhjlQA8<>QSdn>V zxi;!7qK&6zRbA?P8f`Ks@4GhW?4ymRr$f1|BR|LgpoXrkePaldn-T?;Oz>caTmD;v z^wOd(Sf39pzpndQPOCVfg5E#8_AYJi=8ZwC%UJFBSpF}4ZXI%OlsB{I_jub_67_k? zWPZR4=y)hnxvktsEku%*EB$9W+-qt2MDL1f=f=Mo>7U3jmJ&=%tkp+M)?Q|L;}lBU zcRZJ^rgnFGA934vIr%Z$^)XQ`AA2N^+v***yX$Mp%JMl>}0__v0yYHCL&b3cuv@vd}on%p{juSpwodjXm5-e@&2Q`k2I&Fb@@h zxV5yC79;iecKq2gP)3A9ucJ)T1m5y9*0qj~QAiXX~3_m@QPnkr+p!AYF{ z+GO^FfKl+SZ$?=d!HAe#)3!9oK6qiCErUi^G-u~bE%!jbNcef z0nhA;%n1aqIfDnt z`Gzo+e;`D9?H_SWR--(As+Tu`glstcH(Ks^4NqQELWF{E)Y1^l$uxL_WiYFP<6`js z9~9CV>)(TVGG;U!r|oVP%%2-CQ{CRLHM6(A`@d6G_{DM3O8kFcl_OT~v&!aOEl2Lm zzZ$Fg`J8VxQ6b}lUkpaIcxLhX+OLnqmk(kCVZU|ijNM~&{g|VtWK&*n{Xa5D@^n8$ z{eiG6Z9~-ukEsvGF3+tX(lB|uxzyxVtk=ucnQZ2$15kCyH}bn!g3)^3?anTB6F_MC zE3S9=Eb0$r;7nLho__V3efEVztYbQ>ZK_nwb#mH)ZK?Wj`yWhA+hFf~cUS%Zb9Sxd z`~kN3BP~;F3n6E>XtZ}1;d}*VpnElNQqX(nENfA!o-;$Zs&0alda%BK0lgghfa^O? zawRoxlulnP>%6qzj5_mCFa4FUvu3ez-Ri%)C+l9S(D_DaxON+i4k_sTf#_L*#f4Q~ zojP&ay~xRaW8^^-;zQG?5v>}5vc9B8&cqi%vXk#L(-**(dZ!f_fdfYVQNP&55UT{@4az&QdmU8z7KO1xNqpoSB}9vD zBXYfd<~ozUvh4t*vKb?xhr+vWJ}ZX)5S^)`VV76TL?z0qt*D@PYan*plf`mD9>50# zQpp-AzQEi=*9pHX247udE1HkV7)9L7%R%;{XP`X1@F%{f@3GIDq<_Ec94h;RUd3|K zyILf%&t%{FE%P{<0wbI&rz>#h59D!Xi2k*e*s5;z`s|M8djK) zJG>bph;3Va&^BMnU%G$HJ38_aaHG$VtF{{hr1`m&K z!Oy*C6$y9whjCK5iWwP4M{PN=A_l85z2w%I8iw#1c7}+fGzx$gEpI1aB%FMxT2Fntu%0wosx+}UHnyzM_sm7hoes$koBM}@z*?05*e56p^&wUZb zd;O}|-6!T*go1Bresh)=U!Om6Wo!Su>H6i~dbp|~jRRTem%_W{#WQ@!7n_IUp>)-( zl0N6|!)??lD>ti)+>ssG)W4{uQ})VIv2n-wxsg+0EX)YEf-~YD!@mPRX*f&D z*xc9cSXcqCFb@3>hsRfGazD- zzk~J(w+!s(owGyD*V6jAgYm|FoymR?wAV&@-bY?V&fhR#@b-_Ide`#7Bh_dqJ@P$* z4g)2B@FYR>Y1Qk5{_S#gYOVW~8QalrJE|J$!ROX}1Q!*Gv%JspS0i?{OIn~7w2oeQ zv1dK~pBWx162wAge};4P-?$eoA!r~|Gw(LDi>A$nIohiUy)^ncEKM0Hx`5clErt~k zcSGU4&{*o(2jdjp?2jHNW#&OnpGv!#$D=vIq@Z0uS znj?5nw`scg+CVK z?&~x$fPi5g`8~q>Iz3>I2|L8Gme}yKs68^j#ls;{1y-~VG!$*fQgj#+Tw=<_%;8ni zkgLEFDP&mBOG%qulf~o2J_K(!_U*9^PtOPnIP#(yobI7u*6OIuJ74X%q8I_!_J1xl zPArFqHeGnhKH53jDLsR*XHP1!Kho&eLkt%;VX@+meYp#4RW7+>n=V^GZ&&>@?x0!I zZj#fkxn?^0Niee3=fFVW+${Bn)qNgThimZDMTF8m;;`RvhKG?n|Mhs`Ar6oH+F?0~ z>2CG>`}et^tkd@4lC&5MMrbMxK2%IieqYqS#9xX1VG-9@TP#JHWtNv$-Va1&?N5xe zRw4d*##0coV@sNN}O_5{-KkJfY!F6&&LfU+qST(qTg?cpls#9HX8_KFDrK)Q+%a zA5-eX>ldQkjPcg&&|yg~RJPu=nJa`cF}>UFtzlc|eVFCV=kpApGnC9ti0k8vH!XP6 zje^8JvfjVR@L=Ea1;@5tYGnqpB8pj|jopIW{?3hDO1Nvg(^!H|uFzeCV6I{yIgLlU z5Kb&Z|E`a*vTA0jZU(owa{4+qSH`*2Nc@Fdd0$zJ_N_VUTJH~rA$D1{x)-xC63aD( zI+#3+m0+`wn5Fz^eA{?k-;SuH=|YBF|CIxQ;npg+7s3>wU4@J;k!_nQ8~8Sd%sv-Ag&`tCuNXt%gkZ5|ArZ0x&M zA=IvSal$phR`~Hi*)k>zzkj4i+ijY(uHP-_oR$Eq>X08i-NJ~UE|M@lkVbw{(dHml zC63V~zogX`f7*0EzfbA;+7ElhjxHvc?byn`Uy2!rsPEU*Ag%fBA{sYS2??7T=dvb5 z_YuZg_?e(dXq8QY(r*qrHH63jf7vyJmocK$pKqX}Wkiyp(9GXus7UPgekBv~i!ci6 z48Bc@F5|+6DGlc2dwh6)H7Gcxpq+DMoQjYIl@jMvbvRFNBdRAq62ZY+xvAG9W71&d zugk5*@yKZ8v_gk_u)YvWxG=ZFl!Nd2B8{9&P6BAN@}y-YC(Y-lQy1J8gA^C#0%_^) zj1PGP8<6c@kUy<{SsuYs!?p}{V7!gfnbH4X=5TepZK@q7D^|lxvt=e|TW5}*qLI3p z)X*h-Tu5iGtMbN3Kz{uDQ%~bi|ClF%w6#?)%5UfL!e;LpG1&*|Ro!?i=c#KZhu@xS zALafKr3kVgnd$MC1f(RJn7EFe@Rk0CF+{tVMBaJ}L0pMCctz~4(1EB0?DC4Ov;@0r zyJW`oN}lBQs*pghV@Aha;sWx6^7VwL%jjph^-MK83~%Xjs@GZK(-{N|P^0k&vIMp9 znh5UCLKMr+nP%ZEGV+ai|45ahn>rZvFpZwP-6j*>@Mb>eun`Y{C;dVh0j2HNM7NX z+Z4?4M)a~ZSyPNoGcUaLb70oidZQG3vEH2>0r$?m*FOrmGKr~F&wi33&Lup_&FAkv zij45Y?}m6U+`Bxw^m%B!ZAE8=ClYnqpi6lLwQ1PV9=^21$0E)< z;2-gpgP9Z6uE`g>mi576xTte0_>QM*M@2SoPL#&Xu99SR&M(h6V)aIF@|XDTQ)jsh zP$Si!snzc(@p+E60C!XdY&&W&g%mqPI>jm2vmEFfWv#6A{EA8*6hv9x|iE}!ZLuu^HZY|35 z{1Hnkxq=2s6~pK=UdLI-*{3{Rl~wbitCwE5B$qMzxMPngOUr2H^V#`4`vwOTJ$`c8 z&nqzdRtPQA?mH>CMa3V)=xEK*pXbsqZm-UB5AbNgS>&o#%kmg+AfF&hQrZpY!f`)G zN|X*%LKNyW0$r$2A035#+(l0m*=me-x(#L>sAqZFsHEDhrG91y(a;cEbmxeg8uUQf-lfFJ1Fj^VUkr@X#~u~QW_4|=X0qjm;6`0_XF-GwxbtB&tr zQUh_t)4kI9OYWn28dMHdAHQoZStV%bvv}2D^rnabzc|9uTkW*E)eA5?thrkIY1Zur z`>Y;uxtFy*3kk5|T8p&J^9Rz~Me9UZCDxo$WEX9!zwwPVJ-8K{`v=m0*-vOUU4a7M z|KPl(~xm1W=&%m8B-`)I7xF#c)p^DfbEM3*#@K9o_Y*%E&MSr{0!-ya| z`JL?&|Cv^q%@B-3GmTkdaDs*XI}ri%@np%I@U>i;JofAhbjC08g|;5()QIPQ5;-(o z@!oslEXe;d%%iI1L73)c9G3z$UAcWsvJ;hyL@9-kTA9dJ2p4yV!3TH7kX+_Mq68){ z_r^*io##t*THc_!G79BE{Xmw*AaB-pKf?FAc!3K?64)R?t?Wj1mV%H$oZdxFqlT_z zPRWG8(P3g?`BS|j)7P8vh;bPscmJq?Ak)?W7bFey$WQ@uzd6m`n7r?P#@$ZKRDp8) zMZTM-1IH$Ze8zl}CDB{%ckO?|UX_;@T%Gv?DV4|!F^7HZ98#0aiHJN#)cFb9dmWnE zTI+mhjoT6&l-21Mwx%zgv7$69zp62beKhzylqX2d-l%v+uOhL7GW%RGGrDD&qvN?* zbgsx&(ZtfX-E);Qt*Hgmk}4YcA0>jXch)$uvVW$rbRIc^>j|=ms0xdQSnBu=U)70A z8XLq;PJhzGXnr?J3@k6$vTs^mPUd{T+DpMJ+5Xx;>bscx$dH1;a&m~xUiOOS`()V= zrUR21y1v2>*IHO^CT$6%y9$U($E$G#QgM2h`3J7iqxNmKTHceZiiPOvU}%;Fu0Epk zd^M7oQsb56(_obe(u}69421nnVW%}cQ#08-tYK8~+x0p*K0#ZVaqfNl2TW`1rgg8O zck5$ehxT2i_II8R14HhK3O06l=}~VfREDVjkoutGVKBoeW+r(w~6Nx;q!W(;>Lvn6H3jQ14O@~@*l{|n^qTYJ%p5h z;|d#;=v#`~o%KTz7HA5_y%9eLRn|ty z8%zZDHPQXYX)#<@3Vrvg+2TcVqsa~>pGcW69b^5tGuHg>cro?uB%$>8(H<>gWYDZY zvfxb#(iUu;)vx0~{#r`4;vdLZg$?|O0~-DY4VUz!O*+N0bzB3WtQLIx;ZWqP(6YJS z(j3*e|HVU_>(4WETz@EEI#4OdE>OLw|Ja_eH?MC|Lz9)c@6`UdeLbmFWbdrNaJ;BM zQ2Kzo5QE~ymnf)mr}J7_-tkrH!mTa5xl!YmvCzIm04m{7H=1~$5=g}}CbGGI%HL1b za_cOeu8HpR+>MU{H7fiUN8}%de`mj47 zPn2vessQWjZyv;p~c4^uPKL|qL=-dty8o+bY?9xBX7fib{X;d zpIvOLkn&kk`?ILA!~~JGMbsncXNw8W;o>|OqbRXu#bv<;t;;k%ZY5T%Ns4$in12+l zS~<3AQo9JLF=*3Cq1Kl){yd;V%An9>9CEve{dR%7*mo(aTkGvNChh&GRJnM%ljR?T z;x@7(Sf5T^xt?hv#z|h&4sA8s+TJ!b85dpFRN-^4n)W_aWH<%0dgFy*!A9vNUq5iC z(PyJEXQ44-ELm;jG=X@h-xebD@5q1T`NZzE)caTtd-$f3)}Hc0wawH z$a$i?ZWc@hEJy` zS%tSU@B#q9l7DMyXOHj<0Br4CoHXQKQ|svJQKOCk2mm^O0&oMs2NP!pWldQv0G1gnEWj-+Ai&PU0dM|)rT=T;zoh=};BVjlQ{r6xAAJTQ8v1wM zzw7=x&psOfgf8K2^X=bxACm!~E(icf=Kh^W_X7ZM0|B5G`XBZX{T(kBE-nrtoSg3N z?i`k8CLDho^k3=!Q{Z2c|7Y+Y_v83`zkjtI^&7KKA6#u*sQ)&qiM@@zs}r@e!v_;H zYWDv+i2vIa|3j_+(1T6G?30<3nH~IA+VD|kX=e`aZaY&;7fX9PYD>HSQxE?)tNn)# zf8jsJH5?H9d<32wa{$kv&jG~4ApnU06F@Y`fR}*&)o*XnwSm7+9++zTpW_~m;pP80 z|8FORX!ySf&X(rXf3u}Ew5Uy7o!tIn_%reMgbZK+xWIFO6rcoX0VaSQ-~j{yQQ#FI z11JKjfEJ(&7y%}L1z-y}0q%eg;12`?Ux9BxJdgrp0zZL5pbYp0)B(*v2ha=r2L1q( zz&x-5Yy$hh32+76!zVIS5H^SaL<*t;(Suk)JRl*E1V{$-7Nh~v1-%EEgX}=AARkZw z=qo4|lmf~E6@n^34WJIt0B9663t9#3g3ds92#5$+2+t8H5Eu|R5rhz=5R?$K5DXE_ z5gZY`5CRdR5RwqG5lRqh5jqflBTOQ!AnYStA_9n*h(w4qi0p_$h|-9vhh5S5E~Ku5XTW$5DyS;AbU>eni2Ra*l0uHc zfg+iri{gNii1HPs73FuzR?1x}0xAhAORDcwZB%>Igw#^hHq=Sf-P9*EH#%SBoYS|Qp`wBKnvX;0{==#=Sv=!)s)=+Wtg=q>0I>HFxf85kMB z3?U443_FY@j0%iijKz!#OxR44OpZ+1OcTr~%tFl8%<0U3SP)qFSu9vmS)i;4tOBf- ztm&+yY{+cFY<6tfY}4#m>{9G*?8WS>97G&%IlgezaU5~daq4l#aQ1ONa`AK7aQ)<( z=f>w&%`3|b;jQOABQp3h?_^SBmSkVbn#&f;p2+dbdCRrSBg-qv$H-4BP$-xv6e^r3 z3M%?4b}L~iX)2{Ct-WP=>-4r!89`Z5IZk;&g?Q8HGa4dL5hf~K_=eO<) zT}$11Jybnyy*#~3eHs0D{Y?XYgJ6RxLqRxE>@IR2+;G z>=Zm5A{vqziWF)YIugbkmK^pNZW=!LmFsK5S6GBe#9$nQ#uUWj#d^iA$0^6vey9E({{14}IDR03FCjA#BhfW+CFyNaeKKA0w`5p~MapFA z>(ufz^0ctD>vYrfv5Z$4WtkM2Uo-E1SpJyFlFO>iX2?#+LCJB;+4`ydvoBXDw=nNT z-q*Z`e7pRW0*!+1LczkqBJ!f>VuWJX;@uL1l0T(yO6$wm%d*Oe%D+|s6|NO~mG3L3 zekuLxtP-j!tER6`t0AZfuLae5)}GW^)UDL(){izQHgqRG5%(}cS2#}_oT|?=+wKZnQ4RR zl^N5SomrdN(>b@f`}xlc$P3|%&lVGw$d|I0nU~8~1XfyB->eR;X|Bz$o2>6|IB&o< z1GliZ61J(f3wL;Sns;S)|Lp1SZSFhl-yZ}Y;vJ?PF&$MOzd9Z|(K*>Xbvk`Ii#R7e z&%fZi=)6?BT)MKoy1x#;A-yTM6}s)a1K(}myTednNe|2qjgLx?3s1IBPfx2rgp7yf zCjd}Z23X*101ZF};RA?p1p3P+Kri6@;Geug5k&SctN~*BpE3vl5MuccBJr1d!1?_@ z5`4|_4=(c0Z^R#pj;OQS`{GF_=Loy*^aCJG;7jdi(kZ2FJ!HCa0!nX6IJd);Bh{ zws&^-PS4ISF0Za{Ztwou1@E7Kn)NTs{)=6BaJvxTeSn1e*Der(`(MNHkdSG(QShbI zQ9n2myyWpmd;U5mtFi-~mRIA1@T1cx1`!?KD*fqS)Ba)E|C?c7{#%y)%dmgjH3wiJ zg5aHphzCdlbH?QJkK9rBKAi3st~n1w0-TFbwBZ% zS;0~MX?}FLcFxgZ!ChS(6sFr(!s8`DW)wqQ$y<$#fwfgPOjRN0-*TC*b>Y-2=w8VAW^Q zgV8s-J#CxcV8wlHt9J8lwC6dGL=W{xk|Gj+<;t|Z&V6Lucb^q3_nmPIMSx@AH{JZ~ zPLR_uYZj=rP?(z@Z;%R#28oY6?%}{mYbx9WpDaI zRqe?Z5Ig|S$Fl;TwS`*)8}1*$rDg2b;|!JJgi$We#DRdTKCnt zycY{ILvHhU&X`W5o2&nHiG0%rW#12~GhUM5$x3_$EfY1!P_W?i3>0-9Uyi==P`E$ds z=oh_TzC!CiCo5m!vHCe3lYe&~>#+fVU_92(+oN>Ja5h@Wc<@xiS`9F2WwEA3cy)0^Rum5h*P5*w=`nIMX$dA#?eJ4?vD{ z43W5C{3n5OhbdDHg+gNA8}(fzzm!=+GGWNYHH-3{pqjEzg&x%D-oa<^mq?N|AgVi=CY+{*XW_(nGNEZMCr(-(3H#uRpA z%5^V%&jhoAs$fMCOLP-#I$>+|5l=w%PjI%C@e47tlHoS>Ci)gBV9NStP?J}oR9A0F zaq(?M@%B04H2GZi&2D+z6Y%-{S<*xDBPua*cT;FRk5FGjvGx-{Ko|2lLAh%=ZThW` z>gw#)Vwpv)jbp#g7hIS-VWGWb7rPOmp{4@SuP4BZEWvooYROUAM=Nu%Q&(KUmj3#? z7~z`RG{2~~vcU48pdbfrI8z)aEy3p^RJypimMPT$KlT&b>M@U|jwPC3b=8LBDpUA; zc>W86AOr8C9-}AVi?bhe3G*iP9_(QVW4UX1Au}+EkqDOIVvbkBmpD$UEQevV84z@w z;0Q3mSoJ&xJ>rMacDFo}?wo#alBl|spS85f`U!{fExwjqMcp4OSiWId+99x6Ycp(i zy%)RDUlYN-QHDwWv?`0KR-m6OQlL}x3Um@=oRk;e@AiQ_0Z6qc9JLXTSaG^12fqne zFs*aM=Aj`i15M*k!BYd-3Vt1{2`RMKNPQGs>b#s(Nm-=|Iy%(qBO*sVtP21YhtHrx-} zS-Xi=>54svz9ys*k2=5idntk;xk?jF9)7OSth49$5rPraY`Qoz@u2c)klVZ<8n06X zBy}n#d}yTm1fYMVjFk5==(~yJ4@eTRuH0)o`QD`f&wnetO}NR}Qw9kgqatj(j^r$a z)(dg;6~kvoP5VQ6A5Htr)pAA&CMOSu=o^KN>zqC3Bl4I7uRa*v)%JZ`Jk?3u+!IiB z3;qu2RHE6Fhgm!Uf$>j3v&CK7eF&X5Ws#4P6{JbtN6B`lW;3Ascwf;+W4-uAZeZbp z0sK0#H!0KN#Ao@@1bTOzn?`C&tPl;$ke>2A%Lhe!H&(gI{hS`6fE&3@CAhN6`Pq-} zHn7*ODbVw%h~*)nqnFIrm~xc|COvNNor-TY6MLqlZ@_2eq!R3L_kHJinS_I?SP&6o z^+dWC1A8_e!oId9)T9^HCs&&b9#;b$2Wy$mpzIBWR zxy1Fycbe)UAAJL78(kZCuLoe3`Fh`;05U(?r+p$O^l@V*)duiC#w`GE*X!nZ8QU-g7&A=jb zTj8OG@j7~2NA_BLS7OH3q8f2;T=x2EDE|h!EqB$OdH(0o^-JB`zD>zez3Q+d65Crx6aWtT4GhCC1V&MKq+rgu@Qxn7z65(EQI{YE@~*_G+?Zw7NE zlxIgg>^l>Qd*pG4y##|=NtBp01}FEHF`fYP)Kc5T1GnWSDla)QbqM7X5adPobyYH$ z>#z=Qe=ZhB!n9hxU2i_CV-RU;Pq4}u$%I!5Sg>jo-GD_9uF~vRv|1$KzrGxH}_am#f%S-OZ zJ)HdIxMM@}5I#D~SD#elN-PQP0g6UiE?Gq5wg%0i& z)rd-;?cJvoopLQEdO?nvYZLiz?XojB|Mx>JqNCxYR9J{@@gfujMO$2M#oV$!B&qb}bn1xhL8UC&Wl- zOG=HfFs-v_e|6D_@Z}iJPwb2{nr-0yb0CJ%O5T85WH8%XCZXnZ1X)xm@ykwS?08V> z7PNIW9kZMg-a5K%PHMlzXr6)uKLJ*vR6%ZsPXJn52;c1`1BsyfW?3Gz0Ckfp-a$g* zA*)⋘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

l|vM0 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 %>f_hF% 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 delta 42746 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 atIyP)C?xB?!Jp9G{Uyrh;(OxO@c#j;)H;R$ delta 17046 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 diff --git a/release/datafiles/matcaps/mc06.jpg b/release/datafiles/matcaps/mc06.jpg index 372caf7e87ca91c6ad44ba97e38b08b4ec24bb08..657883d0866bb86a32cc7d99357c6c3f685ca7c8 100644 GIT binary patch delta 16273 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 U`7#gGRxG+yc;p8Q{(beo02zpvIsgCw delta 55980 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

    5YLcz=7$G8Kz5v{C)k6 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 literal 26688 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 Z)>K~wJga)g{&lSS$GPhNxWax9{ts%OgJJ*x diff --git a/release/datafiles/matcaps/mc08.jpg b/release/datafiles/matcaps/mc08.jpg index ba868d2f95abd9404d4d55f95c2d7f1ceb41f1c8..50eec402812879ecffb714f78af37b7a97088462 100644 GIT binary patch literal 24133 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 literal 44762 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
    b_nm=PeL>5FLJtj%%tXr1q&aOCbyhI2w< zk*8$6yBBhmKgpE##W{>lTIa3u#fpvdJ$2U=cz7=x9XgB)Ai*e@NiiaAAUcq@oHN#9_{dEc^L`yE+H{BT0#FnR~xtKyOxh=Q*x&;8ku2j8BpYvA%vN?&-1WFF{ako z(&s}^joXJMa5G)ngL^U^&nZKRER$CnRCl^H>zs*Cu^*Zh;@*la(Mu*!qFQF6JQBgnLom7m@x|s6*3m@DBqz1vLP?Mv*2a{YyMmsRpo96$9$G>S{#74ebMvIh}C$sYVH%L|YX z=%e&5SRR#?q?$3%-Dk8Ebd#j`Gi&i+-d#8<$x~Af^Jw&5#n^o8^g7`ThdZeV%YMHq zzB^A_o28m!ro>Tn$1omV>L6@vFD!OM&B!aXFZTv9iZJ^OD_OrkZLcdf zL0vVfIC}*sNXMB!@gq5Apm?`wutlTkD@ph~9E;nz`_lws`>c%1xaz8*vV`E7xe`;> zW){xVZxnBFN;GR{lmt3W^6|vzD0V5&zvz#ATEOIyHifsP^N%ZCLysztLCOo_R*tR=MH*uIa%(-9*f@=Hb%L}*6PNwRxSB>=%c z;8@H^HlU2~FgH^#o$O@CI2gJk-j!7Y`@hSyjZ64vbX=skPDVIuSdj38!tc_-(QW~i zYO9~nk73^#-+-2>4Q%VcHGr=^e0JeIBXfg+)Rxwwd91e6=@oEVSZw>N$F2sjl#Uyz zDTJFaBkaU!JGb0L?kjHVy9izya-dMm6lL<`DaChv1P4CvMU~|kBpjUo68*h;m~T@D zVN5O%7+k_9P5pFZ<%7%T*MG}0mL!YjZhi?UO%v|j@7}!h9mlWs0}r0E?37RtnFe+Y z(ElNajgAgjIouijutsG@%O#14I71lth?Aq{!JRfuS$kAO11|7OpL_-#E_PYuN$F!2 zrJwdD=KHZ7m^3Sc>?Sl2tF}4(y>DBpUwFDme5bpI1#<;VXtk}1bBvO!Ev2Tc(~FZ< zLuT%NzjG#Hy?m5EcUB{diPGSw6DPX@AaHWuWUJrHevxrV*mFHI>r?BaC2=FB{5gTEyii*EfQNn31q`Q4Xqbnw9%6Q#Z zl`O(ArK%`oc?qwkUh^^Og8yG2MR`}$E)RH-%TBOR^|33dSSArRC;hbV; zLeTOHV`o>u&t16FTe02SoEt2ASAbB>?k4=<<4;n$(NMk)Il0S$*K@Mp>@5tcMl(#5 zldkCBE7xlL#MOUZL~J=7PS$<=x;R z0jXIZq`zj;uB=QrU6pjo^0AE%y35`3()UJ48kl3=sPVF29-nzKw`h?_y&*AROM+#c z<`8`p6{wY3+goC8TQR%cGJpB~-b(hZ?E^EXUl(aj1QcX1O8Rq)1hd>gF}pE$t^k;S zqc(iN0@8f!+8#75-nI#Nb}B8Tk(V^^KHPykF*3Ewd;i&S=cc>jd6BeOU1Q&OQpC4+ zV&PN7cGfqkE6Ce%@6lArA}v)pJEhIxup0o_g@OZwBT6o`p8PModObOZ95Y)9^;S%9 z1ZH+jy;S6#2iIGz+Qj-QV(_G!L*!44eJjMZDlp!(7~X3{Y|DMjq|JIntGDk&uq&@((Rjbb(bNJy@f0_EQJTnM zRc%}V^NeboU=r2Q^a>8;3qG9?7=R~MO+0@|!Ok2{`q}EIe4c!N{tpi?PmY3lgub?K zG%x^#u1WBH&Tg8<(06zFuS*GiKdJ+bjDMfomYNM{Z03D$D(qzUc2bW%(`Cn73cHx~ zAS~1gDLUZLpRgSq1o5*?I^6PM&_?i!MY6x{*qLIU9fqz-LJl^b2RgE;y<}i7Gv6Oi zp74FajW|MU@Qdm=+&){j4h$hYOZ7P@POFUmspT&T?8(aaobRRUpNEw%<|1)HN$rvFwij)|+bkIc?9G=qy)VsE z?#4aHYUB!8OB*jy&iDAih%NOLg15LpAWXd8+W~0{8Y{UT(GD`OIHUAYEq4ZarHBb3 zrY%+c%X=j+)^Be|IXn=M!#sB^V1B^pJ04$o+}(~Rx?$pU2RXDC7dMF-4@u34ZHR@q zWaf6g-{i-d3o$N(jjIsR>_qKg`oq$@BTr@Oup7n+h}1568J{I4M~TQRKBlqM5)^go zrt!Gf*?@Ta)Oz-wf8BT|GV`g+u+N2~l=5R0kC6haZ$V4QN*u{~iuXNRX9uHv5r!ot zgDxlMj-e&&Q*Blz#h@!h%b+`i+2RVg^P4!_V><7tOT<#Y`}@VrU2mIhtm*kg+N$?>Wj6o% z!W#}GnYa8V-43A;i+%2rwtlcd6{P3$ZBpsKfrr{2VmF9DIDUQz+XISPKmnQOZ^# zPp*CDg6`M8E?2Q(oGR0pm-oTqy#HeDocH#hkOyBo%W{1}qwbG~-M+w#=0@Nt&ROJn-4t@QFdKvkt zfd#(f`e#uFV~c$$-!B)`t^niti|x#%sK6(1EIQavgnuat7dKXc@{ue=y`3LCm}IT^ za5tPr{}C?aeIGb48WD2@-6`DU0L7Ucq_00tRV|3@P$JXR$@z9}Zghd5UOVKC$#;|b z1HlEwhReR;LN)-)W#JXSKg3%hDoCTABRnuGCCoXZeis`lD>+?d?XJu(RklUaO;?jPIh+^nTDZNS@m=4Seo2NR+!A%MYf!QI`vZZwDAwp zm9py$Zuc%9h-<7ayHiU-;--_t$CapmM^Mid%$mfdDUP0w+!^#6iB*}UjFz_AE!_Wg z-Z39{{*{-0>%)rwz=DBoP4{+OD#A9}B-uCfMd+GQgD~#f3oDm^hJ#`$!3Wf_2soN~ zGH*>fZL-WD4+GBA-k;8VaYr{k_lwNb_G@!!{$fR7l}bf@hXj@dN0vrN@`J5_Wd=i!JQ0|j^xgDv2% z79X@}<#LmpAJueIW3(Gg(yb2x{qbzo4pr`p}rze>UES2AX|p zc0v=B&wcOgAATIbd=Rt^9$k#@iUh+^aS@ojE5HmTc#I2{#3z5ZK<&YghyBx;vIB1} z4adA1d+>-7r)?dyt7xqT8m&3IB>MwNpT-_}1!N^FNhq(q^lx*HeTM?-0Xq|_H#EzQcHhy*5(!QUdnMWc7RF^z)V6) zGqwGWRxAEu1(JGLp6H2xl#!9S)VGt8%dGrcsplrWZ=#7KQ7Lq(qZwMSg+N<-I3wGU zo@q5Le~Co`e!N(9aG}aebg*V}D=nY2RGu`ehI%=B&vH#_LdyoP? zc|iQu*C!l$WkE!(gbnCL*Wl&_mS#E$^~*4+0VZ}=rOh={Z+_JWTY1e&-2)aO5GbC&Fnj?=qyk4~7rIW7xLr_I-UKQ)Lm8?@?7`LVc3W1-9@ABg;kBT&X8$uoz; zo4avH8Sq?9;Ctqq!Nwyl0^1qS(`%F%vdHPxTJa6BFBeZ@egv1?8T4>)!fg;{&rdSz zTt8j`WO>JyiziOmbK~xDoY|4*_Gxw6N1s_)T6U9H9M$^NO>qt(jfh#!Iu0%-dy;UQ zdkY&{tA1JMy_&1ZCVKSTOfiF>X?%j`l9V0c*V|g|eV&~1@#sd7wK|nLTtwBScu%dB zlE(Tw^&3d7I5zC>(oTpUTY6VDcbShIM@^t1`&RHDX^MeHAC|w3J3Z%*OHyo41!t6E)Gr%yASg_E$*LhFMXbGp5H!VFuwIk zV9@{^1?%&;wR0l8AFIvElGnVXGi6K=k@}7~EMnKt22YIj0IIlsa!@+i)r z<^ypzB-RZ+XdsoxvAh)39;M^(_`}1fL}XGcj(Xht-Mt4GeFGZ#aPcL*yQwdGA1*XD zr|8z#q78Mld!_ol3k0{+^=f-$QFngUeG*+_Q|QLboa20K+18UY1yiEGk%^a?-%D*7 zkk3*P2Yqs@ues=@xPl`V^G&+-qng}BJ0%3(ySN~SVJH-4WVet`R6+_|vvC>NlV@t` ztfRjhmnv;{ei{F85f-tvL=POE!Y>08IrFDV>k7-9u!TksZqswUmR`!C^OEG3JM><5 z=Z){|0?ny81$aUYP?027 zhWlKdYyf{A_C{0taEO;FMCz|J(lOXEE7s>QPpMebMVP@&UZZbB+A=)Qo~hjg1&Z5z zJF%PX8<`inX3|;xv0J`Lul@La37@HpOa~iFyd+lq%f}ZfZbkHe`>5rlsgZ$q95uiC zB|-9N4b^wFh-42ojz?|vI_#p%r1Hg;t7?7)M+=`0(|-U8X(z<)rj)zv4qg7z1W7M$tl`v=|*EDQ^C5-+G*uduMiBVz5kPKeUV%VDH zgcDV#R6e0i{J46l&1A2X&-ihvc_-NPEHzWAnt`XNC06|pub);!zn>TyO}mSzqs_}s z7E?bzgTPMr71bF?yrSy#sRy3CELMG8n1#PIUQV^m?j|{f#PS>YN^zjDhdD2cUE954 z;^KiLoV&2GEwXVy>5{g;-NT(6K+75w`EG?oX`77+&>)lNt^iJWkd~x)hHGH;AobeF znn`8lRwv`0f8j;t7Sm(uef^48$Zs<`vh&O1m8m)Lt&(zyrE)VmEeu4MvJ(3#2mDP; z8S`RpSGkwW3jw8QMb_ZtUnASymIF&B0tp!{_OMc&D-z)#~V{)84$Kl?? z7a412KX$d-0(YYSTmcT>Onyz1O){DKMs1j>x`DeU8F5P$%ROeW5YVU{*Ja6>u*gW) zhSl!g`900GKpJ?nflu~kA?LDG!njfwnklNh2eOgc)+An6ozT0g=1Q5BOviKgfxd;C z;t@WjdDh(B5yP!poiBSIubxX|DiqV8bqgJ9`%DX!UdDR`|6ia82Pa@=a|v&d+C;q?+`?{O3HAk)Krh zz+&X<3GER=+xlo$$^N0y@`4c6v4a-3L*ECe@wb{p!VbmK_#E zZ}Ev$F2)5+UNm;pL|cUOKcu4T&hH!tQiO^$k${r~q zj4p+p7}C9~h@pYKV|b7DGkRe|@%g4eD#9wteE--$C$BdG{^UiGL{Iz^;Rp*03oFSk z-!UJPO@;th^oY1v997NjD}em>g1(D2i^QVzYuNzPjZ*HDsouXqtI8ItRw&X-`aa!; zIHzJlAEp6wMDn`ZkICRJV7t$Dww4Ru`oc|qKs@84HMQ33Wfy!n%A-%Gv8D^+2OC(? zGn<{KXnea*8WET({Cq+$2>nwwRTXLU2O3kaJ% zrA{roqQ#PNL1FA*+Su?W>pm;efkG6prc6ywMyl_}rA`f$Jhl-a`@%x2PDlNfovWba zqqB=lKkXYRwCKHk_*YhBw%wrKMePD?Ic8#)1w%{DlOnd!E0gjE6#~vbg+H-BfmV}a za@^ z8kQu*Q|}R6Ix+5Qy?Dcbk?L-NRPud#mD44C$Il2KMU6Vdo*KGq2d@)%s>Q*NKA_k7 z7(25J`7-Y-4&*#TV!TWOHPGRImV#Rtcb}4^bnI^)%?CY7 z5e(^C(nzfP^hUJ1=%(J(t2F^3B9rp9wdsoDZKQ%#Fbav75VH4e>7hRzk1yE*dKf)& zJWRAo(Rw^@XXr~B<#lHpQt2j2UrtUsCS zT5=c=H(mpk(d_{}J3!BsT*&M8T>Mtl8ET;aZSQr$tB77Q6^zQabJ@QF#>?bJgg!d; zurfKqBEreE^lMym7(Z`^GJkB zTs|RS$1y5T=_h&x5Zi^UAX&*eSQ_6i6)-j5>5aGu(R^(?c`iTkwNEHqx@?S@Dc~&{ zW9Ga2qV?7#-=Iser(}Dp7rhFjwO!2td%j#vnbH?l%dTPak(l9c;zgFSk7)5x6aKGE znF-BJhm+-H8lErIM?t)i`%lK?C!TlX!fcZ3#nAVxm*Oc6h>6C_Nt}TF=?HnxZzYp{ zcW#4eFfAr(2q`~rHQWGp!xrQSzS^iQ6(Y|cJqn;JylnU&+p1=r>&jdasxgcaj~UX{ z-D0kAVXn+*!3~#vgL=vIr2ToH7xxD((Q4?kC)HT=yIt7q3x|Dfb*UR|Of{B6aa@C5k$(jXpwpE1L# zeno1YQo%*p-)(Z1T$ObhEB8Cz_LpWf;tbTX_SEEYWz?6qsXnrSA$EO2iP_95u**RC z@x;4Qs|0E;u=C5x6!`s~IW6M9@&hO0VtcD19nlgIzLz+?ZNkHJhKbN4>&`*F>muqo zT`U+77KrCZSp7cdRkv=%PXJCw{(3yedhroCk*l|!1hOC)9>diX`=;2XeX3H4w$Y77 zsTLySMuP^CdcB&`3kma1HZSih>%^MaF)kq+mHB3!#r}3AYqofyaj_*nJ5=~{n=bgo zAZnE29?e#d)1}8-Hfx+e=Z1F9qwSRpL1DD+#>o&nzS%=ul(=-5FIELKfOEtvPd>L6 z=$$7|+DLwv66=?K0G^BgEf9g>y3JH`aK6sN(ew;w zJq9=q^PRFo_T^mk@q8FbQ+cI0Ag_K!FsH12Ga5<2<0R)MWaf(X(qDLK@pm17_gHN0C358aecnk53*rzLKc?`CMNvLD^#eH@6 zbxkYoLm7LcHTL3PD;RvFbhs-@=Z(9j{`b+P#&@?9sZ_=JP)FcV!zX`@6Y!H*glLAB zsq6D<*9?-MP=ANYBpcLh1suw}&Nf!gMy1vFZ>6lQ!6G7JkYlMVtMf5i+Kp=8nQNDk zN$Ev&vD;kR%+hD0JHPgX-%#YaT0MvTRODDjkt33mY?$=Z+Jb5|pOtDXv!e6-#)=%j z&OAb;S&dAW$G*%fGxxLGDI#_^s96p^FEr+1M=)%iGcO0k=h*wa#kEhoPYK@LYC^gU zHYyP!0^4s)gezxzN__S;^7_SROh<2p~n#p;bsQ`)29zsF;; zwSH(f_JgkbUIV9nt58R`p>Pw;kjoa)!2oZZw}7P0O&y5q!4Bf=uNEpA8q3` zu||bZhOdg49G}ai004hE?sug}vcZXoP3_u%I4Wl3$pMr_uZu`h9#i6RYBTxCN~#Px z`#b~y_z_4BQ8b6tQtb^P=A+QTAT=zUtrqxh{THz+VLr$cO#a+e|`m|z>bvM zuYf4m9AEh^O^P$G);_pXZED9!`qHs4E`Py{zpoL2`C2+n?a8xIyYGD}Z_rWigjFTk zm1+Cx9i~)QIm%A;;@6|0nm-yb!2=G*FFNngG|}wRZhgtO>-+wxOG~)swbSeF)^o=L znHSaj87}89o76ALWeF~l%8VUf+rO)2v8`#jWQz^kWq2$9x5OsUPW~Q3;&hy$U;4Zb z*Ja(iK{&aqISaLa5dNoj)jfp_f8H+cAbXCl_?Ugc_4r8>=UUZY;_zRWW88-iiLL;2 zIQXxo$x6?yekUk}tDYDxy!PZY@6h4eAfmirv9sqB)V!{r8CO+KzA!h$%EfORGZl8; zu>y19^rBIJ8j_INx68P1?_@&q{?anSYwf(S zqBDG@`WBS%zUqlok?4Jr_h`s)zKJLwQ$s8)%J^@1?LKw<6#hP0A1YQp?L<7uN7(vC z?flVSxx9=bFHuzV6r@@!wKC50z6cc>HyXx+t1ui^Hf1(-A+0RBt+ zL_WvPWZ<)N9!G@5?)e`)lDt{>td%Zp%t0Z%mfuaCy-N6Lb>iONciS8h00Q^rt;ZbY z4oQ;SNWP7VJBX2`?Bt-}6V8R*#6rRUsD#GG+p(3}LGYU?A<<8{y&dnPqt4gk(oT0| zLHwiKXy}o<^w@76XB}midKx5f`@FDmG*~uTblovDM^$vqZStArSnTLZgXaS0C@wxJ zyh@G=V5*z=JhxR9p8yLjbFPn;w3uIl*6*9pMV+&++Aemg{^Hm)Q|os$HW0{?+&z|a zol|shLw0`P`ihBI%}97y|A~C^kd|{alA3l}v7cyTuCP}`s-I{H=MOc7AV0hLX#MS( zD3is7%|zhQMllmC{iwhCNAm=yr}|Vs@uE>TrH<0G-^J|7nLT4}il=7!sot-uI2`?* z)Ou60WhqCM|IK_{tg1`npW26NQ(P#P-Xu0sz%PL5PxL3WcG;6r5jB&Q0JHXLZR5~h zwddww{ui&dXLj?M#w=6X(XZ9n%j7W|IL;=22Bb#- zS~B`tK8!o^RQ4Rvu}UnZ@~5M1zlAvV743;OTXYn_;g)bzd6%k~XskTBgQy?_sqe5; zMVP215+1RbW$&&cI)HGj?u$mGjc4|&VVHldy9och0wmOXXc@YnF(r{gy*t?@*r5n` zzr#JZXHoSrsAWBYN3}LZjS=bWq!frXk4;aZQ9P}s>6+ZcSSj|mF^}k0=M;uwp>GR5 zxp?a3FZ@9OUtrzq_5}}2BUF4go=vm7mm4p;v;$Sh!bG%o;K{*TE-JZ}3|zvYoW?&88kl162caUex}E ze#4-GENDh7(+ic`c$er9HBQd$lwKkUAFT>pWo$v22k3H;c=dp9n z>-~H^U(e_BZ5;{Y+OU2TKWG&-T<_+wsWm`sm+^Ronb2z-eFs$(j(t%mqJyRTOEp&!Uqr1O`+RTjce4TG zT+7N{#IQ>L?+ec#2t1e-nh-!;1|D(K7X|%F0TKhnN4g>(j#RM-`Z3U zcuqO^&$^oF=JbgxxQo+S`A*Y$rHtLWy0E+zUALybv&yuNT$d4yI zt^D>zPuEVMg_R*EamW1BzGBy!l9SbU?tEH~+%Mri7Hp*x;oQuS%p>!?=bPS}|3Klp z#e8x)7jNm9LpD$uF(iX3I6~#Ag%!JiF z_|@~+>zTg#NZ7#m#DIYo*;W$)2qaqTbUsgzf<1}J_VF!K|6`5UEa_zoSE-hLW}0p zD>@sez?W#;IawOIj&rW`7)$f%Zu+Zb9iU2;xx~3anZ@yYA*nlns!1g0*J2v;byZ(` z+~_{2HtX55gof=3Vkh5uxx6*S%r&vFr^p1)WkXo8XieUwnD;^}PR&1zQp5YIf6Ag1k* zUW$vr$1Ix)CfYL{*WK${td`vI-xw~@6W{ykovav#^-ebEnDHjkmr7?CBt*{rp7Bws zQyvCog}+!K*>)Z8miqKs$VstjkX*q{9fA8_*j~$2PnV^DmG7?Xo&;9NJ=4Xr^c|lx zR=Tv+W0p7|rCjW2zQ~sTo;l7?DTJV|ZkzrP4EQC<&t*z&H3QRU_=VefF|L{mpxHxy zDt%P{H~@6sjI#L2zzF`ATaaf$06SzKH?#9!BHCHNc@tn^VTEaof@HqgN6?*SocAbZ zu8u>}OM&T%>iOtzx(h@FM+JcZ+S=3Jo`<*V(LP=%Qn_FQW7MFQaFr}aA}8`1qcVWa zRZ`w*n>BKGDj5_qPp>^~QoaUaojT>;8IPP=@L$eEH)?bq-?=B?)Z4=bZr?8cY0c4$ z3qE=}utPafB`q2%N98$SmzQ;#uO)uehViml#^TNjQa7nGN--);T%b)6;Y5JshhTzD z;JUiM`-K!>Oc-xN>0}8hFX@SLsP;K#3PU3D_Xii&b^TS}!=WS>R;l%nc4T}JNgoc} z7q2A;S(%HcTBQj?L#`k0hEcX%3O;GejEJwNQ?}V$^|b;%16XB^{7oa>Vz3F<{wMOw-G!rG+;lKN{5gCP6Lgz`wp_hfZ$ zlIPBb#SQRVrVcHo7b%dtc zY8lgyj53-_dS&9T+<%wU0D=H&8xe~odJqY6e&9OO`g9_j!47@&o%kL+p~3Znq3las zB%{NjX|u~|7!mWDPbq#93P-8XoJ2pc`WTD?3!?RG0|AUC7me566W65*Z&!rzd?4au zhHLMw%PaJU6m84iyZXVmJ`L(G`m%>gIqRk9S7AB6d6^j+MdBjypMD#GAnECo|yyf<0^9^+$xOeN5`N|B{O zNxYNGK&LFH*VA|pDmrfCEaW10yP}{eB2M9|2viFeeBQ#{CbOlm1NOC zpQ)eOQTu|$+A;SB0>?pv-pJmDRr7!G9j8lS_6OqR1M@%kyPhjp{S@vG2UW(Q9Lul1 zMqOLOt9d&zVWT#_pzg9Q+6EkmkoxP;Ys(nPxdt1Wt;V;sb+6Y)1MMTb&b9@Q(mR>F zly*p#&3DDrj9A&sxYnk}bE^%+IX(QTc*#SP8umo*c>(9G$_IDo=eL{h&g%L*ClQNi zYtPaUcI$!>xRV)CulX86&dic zx$ha2XQvVEK$i8O)vptoFgXhxr{46;fl)`Je2zrq4&hsIWa`W$c#(+%ois60`Rkc{ za!W{Z-X}r(_7(HWMag;?uaA1qJaO}5KlPHhX)Fm|l>qp3ha+yGSBq7HlC7fXtf>#y zUkG$`sUTTViZv*a<^>P2z=h!b^84Vx7su+w+=7}GL*%87*@G|?WjH0pbgEp$sQfn9 zdcO_hrgySoKuIykD+g~7mO5#j^F|Kjbxz^*#;1E`mrca;LEGAl4ehN# z+gVvnw7?K$uOY)nRv92K#P+VR>bGKRnBbL3xE37s<>L(OsGGI116U`b- zS(A~!I+aqWE{xzJ`ajV5N+>->M8($D(ieAMRf?S8*|k}^-R#8zR(1f6TE2*J{^HXO z($s_%^DtD6l5+}@`dNc%$0970PM)e$RqCNJ)0O^hye4R2SCtw^8gsL6uXjiZW=v2A zKz7-cYnPJ4_A7UaDPh`fp>V+WI?()o=t5Q!NR3m~=c+oRv9SaV4(0=91 ziP}b5v*u$$7NOgDuBD;-kSX)gh-jG%Yypra!$nK8^&Oo816!c^^t`H+?U1NsVv+G_ z@Tj}cRZb>`_hi*_rs6(+aV;*2-|w9J?^T@C`5ODmS!JU8g{7NS~5%y`CLLZ*jd#|X~ zM=quosEg%Xth7}h9VtvHp?;!_iqH12*+-1${x#CDvfs~*cT2e$li z{|%MtMqka)J0tT)QQ~7AWd1kW)sfO`^H@`+^yNw8Wa}%^MwDkc*f;7;5zx4ri<2HG zqHM<17Ah{-WK*w}LIVq>0UUipR)AM%DGl%>@`_&h`2x>E&RsFjAuRRi!?lolGqt|g zj8l(_n6@nI*mIh%@}XK?FM zJrIen6RVnpBauk6y)6GgK|CS#@#wgu5?p+R$?nwYv%AR3MP}ji2y4v@B#)$9V!%Hyq;Ma4k$>=kg1W7v_UV_Ril;GFg&WsMzPR zJL=L)K(3D|B@MyWBN6&xU|X74B)eG|U#sz}{kp3ekAHc2*9W#e=~RH%(3aiDH@3N5 zLhn{$R9$B8xS%+NQcZsEF)s<%YZ}u9j#o0p$KVD|`Jok8{(-)YoUlDViP^nh>-xEF z^<7iIqceO9;orOdf%t5{wGC|I)Ni5fODRrm*1((0Vmb|cT23m~79oc(RQEC}%UYz_ z)_c4ZIH%MRI_=Wb9j(m0ETp*nbgA$5kZ~lRvGBQS? zDc;AQ{Yx8sj=PSqW82ab$;t(^RiaD>88HIe))wM2A!9h zng&mzPEiEc{?B$0H!`n;7t248P%Ugq_qX*q5f)zch|vOj1kiza*z;wx^J&xgxo!WYUy1!(9S!n4cVGM&Kx`l{#94= z$tvp&ebO60PtBZa8=SFMiGtktU2dE)#c%Nb7aR@GZ*Wwas%B+_Z+&%o{&>*hxT{bR zMJTXp4r61iki*jmfmD1K{D4?zm!O_1F1SGEk2h|z8|dXGJ#Ww5E2%Jfuha{Z)&J|B z@MdtW#d~=}O;E#U@^lN1^xG?~>8t&;TOyR*($jHUUtiOJ7hu87p0UA<^7tBa{BP_y z10p|^Vx{zYACq_Qe$jxiFjLgV@>AXE4&(XphPUT_mywxs;z5jB=#Aw(fj2~JcKVGTaVcU&VBd-8M2KEaVU^p%ccc+P^Y^b0 zpJc*E#KMbbJBh^=rG8f%l&$sIe*{=vefCMkD5!XH0lObF9Ls7#Qy`zoyWbd}j~Fhm zNxdnU=t(S6-UQb@+}L(lU}XjF1(i{yMXi)T66b}!2KYIhV-ap0=It#Kl&>||#N!uM znGD&P*eui$qU>__xFpMs?AXij2wu7=3=LNySjOXO91f}DN%Kc7Y{05BOFzvk&iNsF ze$Wdsv2qFsjJ+6?!;!;J$RNoseqv^{jy%vs6}i3#*qPf(HAxfYnzl;-kocLD?jhjA zQkCIVhS)rO|g6}FL>(5qZ8@88G?VQm9oG{{W}<91{;rswai+~yynTh_ za81&b4rG4qe6F9KoZH1}DMARlwTx6+LU{nH_I%oi%v8)ne{NbYC)Iy@k>Ply5Zl83 z+y0l^lQ#9@s=&$1Nb~Rf^-hWQEyJEKL7-tZYSZ9w`{9LCzum==px91s=tOzo^|d#J z7up$PW2_$MCvHtHs_uDP=>0Sdb1sTbfS*s=Mn$*huKoj6?Y)=Th_+Nrpu4bVscuxE zPBPo#hCUdTk>*sxcTe;J16GMI-NX1^-8o==FL4Im{n}TL%PWk@w9`MiG`?fKyQU zZz7L_BI05EIb9S&W!gsKRa(X$t^OCzVn1Wwbc`y0Wqld?6Wo4pjj;K#xrfWmYXCa| zEHcVtP)2cjj}-_st3C+(c(i}QI;+j-Hzy4ra~6{YmpI3?0njY1TTcIPu<0-T1J>qP(~^1ay~3O`S!qYle-_Y4x9p}hKY z__3tW`vciiJ(_S;6&jV_Vk|XI-m?~BA7BlDxSau~=N#DD9Xk2Ybh-#ExCuu9%y(+^ z>VlVr9hD9l(R2*DefIN3ImP`_qh1AOt3)5T>WwPt7h8$IRNTNd4g^-%C_{9Ha zb}ZO#PsbU0Cf&GxkQp_TnbUohmn2K4=dYKKh&^1*1BSFhj|wT=0$!yzk%DCfBN zLG1;^eEC^H$>|`ax1=JQyB~>+%4D=tYAnkem>G3uR7j5qfrQ~_P=s&s@3h@2ac4pg zHY{vJH@lGoRXrENwTZF~&=<{&nAy_nj=O(Q=TpVay;7it&+zgUE(ZC}Wjv>o;s#v8 z5RJ!O4F$-CcxBmZl^(hwm6*JC`XK83_JH$~P`S1D6!w~kq|SHPlf&Q9uM&TUg2z9+H_`$vBDXjO}Go9|4;iSTr@!+t+#xj zMmz=`E?R)j)P6~1TK1+BoV7rYR9n^ zpuWE%!q{-HpcR6pQwi&il$RISGJYO?Mq7ErA#LVVrt6L{AU!!x`h?I+_V5ZUBQUq@2?^)@=$u8cL&nE7| zuuG9}y$4QxG;YD6S08-mc*ftlV;knULHp%f;nGbe@X^!-VcgI{kyq4y3En_bofF0HHbR#r7!zG#)kpXT zGIi_{8tLR~gqJSX<|i`n9S=A8%dSxcchKZQ)gr2;nQ`y+o(m&T z%pVn4FPxbT|hKu-UQ@Qs_oHk>B{uyC!NS1yc9phyY6%K}=5!TmI z<^0h!cv-~{;YAJa6H%C}zwskfLe2Hfy7$PB^FtFEKXt7ga7(RVatq}^m$U@tKpydL zRZ3T<1#$@&*;>xM+cyyA=bvw&yxXb28vTbsmO`kVjoFLo(tFNjCurk&viWWP=pHhE z&?|twW2t3>+#v!#@znwWqln4yjijoF%ZegEG4(p=3Qe-S9^c`af;m|c--^SICQC^7sgj>OsarVVrjf2_<|LL%9s3VTAGa&g zTo$ZedsSUr;A_2v0Qz#7`_(S-eu|01n=Od19`h>4se|T)s-)qT!=0tngz|5nPJ808 zvl#)a53*xYPhQ_xdmGYVYrC^9YGCLirO#~K+v7dpXwy5Wzs|D1aT;u<<%V8K>jMk( z%}|GHJcQ4p;}rG>RTbO41^RY)z?dS=EdTY~>N6N}q00w1<0b;4o{Ukv;$;9B*o?Cq z94LH&;09o3S(F+{MS&_*aK5Dhm(UP`_4yYs!5$ygdd?~EkC*8li!?yU+#B@K5uGNC zygekKw1Fe!z%zwmx@SNlJqzh-gs1BHF*10|WcpC4)d zlwl>|Tds5Oad1G1N0;_(J2ghSor!z+3^MetAc_!ifPLb>-63d4ZNHV@d@{0Qt24M<(?LuMLA*NQexd+KLJZm!@-5#|Ly4`L+u`skz2pbX zj8V8zu?3&T-khEw2zQB$otqoW;q^vJoX85C$5}$G@>vi_G zMrxtX#(;~3PNZ@RdRyAU-)FIj$XW10#k-N>M~3~qE0yBrd(FrfM4jNQw3oanrG1)8 za@n^E?_!0Qz5HU|6O7*ang0V?G~!5)U_#7&elFsf?hFrKvyRU4PG|}CufRUZ^0wYd zKow{>ZD~2?KW<9%Ruu<8dz63(%iixs_gl{wE^d!a{0RV^Wumq|%$U-@&4!tn)6N|^F&*vb<$wM^djOJgvLw!U}f92O{@kjiJr@i4(&x8IHb zK(T6%b7%AHHe!jVO3z_gEF{%(1fLRpmku_1ifO0T+1olHpIPqz4i^6MtidHwVm;?H z^>3!}>9RkKm(7+$s}wj8_7a!5aF-)B`Kq0!ejw+{Pu*xW{s7Vhzk$c=(J$?O{OtIi zF^5-r4T-F}i1!N-yQSBimw0OG(iCWGC$6iV_NMnfG5l$9*gy5t+<5zCw z$AnQ>SteL+Z-g4OP@d|F=3^j#(Io>pbJo;apo7T2jcQ ze=is=J(oG!qv^QXfqTdkU~^9U!wo3okwu*J4;ttxcRQfU(mc&~+HXQ)>p57`ozf@H<0@}f({Ad3DiLU-aZWR$( z7VzyH89$3U@w?X*9`=-B6-+-I3o3wwuET+5wBTm`BWUyno-Ta+JJ)|@kgZ(hnfe2w zG8Tjd<|mPQg@3Sp=tuEh%$+@)0v)GC|JWKSyNlC{YduH22cqcuZ6quz)% zb@r&eNQy{Uc^cEv+o_TP2;3rFq?i%tP3FIP4~J7PlKKX<8OO6^G9Zwh2!NeAb`^Tr z{LUV?OJO`k7`;kV!iCHRFPzq0tiG&blkqzyojn=Q{}$(a6=C48oUxnFdsQW18?<7) zH6G9h$7x}6U#uB^JElb7ktPj3$>&}gw28sghps(@AfMxplc@+_c&3@A}FW+U|i5u~FX@y1q4>Lkefb zB;W3YTNtDAUNJgbCqLO5+Xrq{|L}HMkRAjD%X0KD4~}`>D$(3cjXDZf==$!%4_a9tb6vJyjpN;KQ-g*9}ZYcBex3EnT z?+WS1W+0V!rDSvPgZPW>zJ7tdk4t_}{rwg1+#Zx9<&-71Em65PmY*f5cv)4T6dT;d z$)jPRujQdtP%{?&Rg5}ku4@<6-N8yuN=iyq_eVW8ms4Iwd%8NLfs6M9FMLPC+T&J0h?5{)U2go zF0LK)>DucV-`I(7PrGRff=4LAV4LR&#?QMrMC6CH{9$8A?q4}cgOm4d=pVvDpl*si zV}wlw`%gI)et7&}Sb*&8pjY>0EmiWwe1Y=-m-YJXPtrvDQ{@}=l}!v>Fe(OqIQDGX zH{FgctOYan2TBnFB1rC9r+*5o!y=Ck*ZNr}na0bfxZEy3YZC2IT&niOWuMw;o*ta0 zYIpRvq(s~AuoKelc6R@#=wL5ZNefJ4x2tuA4Jw*Wr*(NB3oMMAPBBS5@KUix#j_cT zel1LJAEMDFd;`~SdP(IeZ!45$#&&wJLAjL41z!9YlMW~~i#?+)H)OP;9CX$?HQ^@y$E@tt+i-8X|)7yzY+jwb+eN4-s{Pi4b zkushQ+1vc6vqOQT9J*l~_uqg6`dts~Y-0~w`#)eF_&wX7Esb#$2`Fl8uH9_FX9xpG z`q{)YF%3sRhsXA%Jnrk=$pyX`Uck!f`ex`h1jZ;lY1;put|lCg9J@PRBybVCVH}Kg z*G)Um(%0G7xi&GqDQo#sPF`?bkjyPBJMk@p$4U@KO(-x+YRGPac&{2XEUP~@lEZo_ zDcW6jZS4}F7Q@whT-I|XPv*b|JA>I@x!fmeV^x`tKB{<_1o3MMw&zU!jT;+jHU^bxF#F2YK zrOl8{MBFMm$SmfKSzejA6YDQcmJRxtKZ2+#L4r6KHH1>4Mlk7zCQrTw?^9cax)UWY zUS|pmg%vxbK}GkgCQ$^WPQg#a3}1E-z%Ekb{u|Wkqb=h&w8tJkvrX2rMjxG^pif&` z)~wlaQGJEAO?*)m(uTc@()h07)K#EZZX@Q0O!SGujk_{R-rJe6i}VBFfg811{A&G7 zP#}9|)Qz0oaxox3^Qp;u7QCCd<7e1QEkLkiuXPhh^4R)n;3>yz0XW#R2X1{_M+#nvh4QfU+ff0urEJ>h zWcDIi;x)&^7OS$SQ_6qTCCz&a}2$QdbvMzaV$Uf!9h}#mkuJg3KOa zt->}7cgnu(unWdVa>)FCfgD?Z2ZTJ*>WefGyh^kk|FAR^JMk*n-eXwBMv^{ZRb*Y> zB4pObEEO79q4Y4N1RM@V0Vh`(SC_DA%lur|qU`EqkpgAwDa~2ex}xTBF4z`bG>y${7 zkDtrioRRC^atspGm{tOc$JEN-wR2=&J3@Mcn_p$jKak!0Wv&fcJUnZWjq?jD<&((# z;rUa)Jwmj{PZEZ2pf;dM#}E%j4=}8O18;k4z`OdXzYJOVdEf&jt;Q zNy6iW4e4%l3v{^lpbl`=jz;A(jFXu=VB|v#*kHU>q2~8r&F=%vGtX0FMGVMz$>His z`AbA)Y7zZd)NJ)KtA5~V`trfJ-hMC3^iHr{X1?8z1fS`|^bY8BtE2U&UncxMVEwT& zpZ~O}2#$R(1t1#^_OWcHZLPVH>>mVBp5=0)0IT&XSZDmT6MZzh*+9dlV1aav_?wpt zntb~$NL`saG1u~e{)yXqy>CGEOWSR1mtsd?AG<13uv2xJ!Ow>q{adzXB^BRk};bQ_!N=jj^o^#EPzz&$$0kiptiMhL%HJ&L{eA)L9ld>`zo5gSI^n_(?@CCcl+%9 zhNS!P~fZN)Td)VUaa@CP5TV)&~Pk zZ9#S7guvDet15|Xs3Wv4#X#cQt(G)}NZ2uO|3&qbS%1G3+cL;Ph4FujOcr@<`NhS| zrwMp!=tk-=dgGNiPD7U+p-fE+6by~2I)tdawlQAoM$y(vx!YB*4I6Zo zLlJOxK5QXI+6MwYkG)_E_CRO$Gbj1wye}5>UtH9~812cUNk$KajZ=MB78X;eAYUH5 zL=dq&T?80HlKKvjL#~O^cDM!S%(rdB`iOxmI+$ZXY8%jbtkO;`cpPv~G)jlYyJh%T zLNqcIAV?GOY`;jfVn^?7a?YCexFjd#r;2gkKafJP1GZi=sgFee3hj^Dc5tVRKB4TA zM(TtHOw_Xy^|ffl6sYn#zm25ECtl{_jQUL;i2YoR$5Pc>x;4iRMhQhL1*buA&Jo!0 zq;ycwO5f54DWvnCyEl4n_0olvgO@%eg>w(GK`<%fDP$~hx0vGLBT0N>)KvO*39*8m zm@#o|TA44GY5x@$KhG_$eZuw+R9aAD64NI%=Tc}LF|kDB4J>}xjpI{;0X5JvDSxKB z9x-V$Gb|w(q{d~9bV?$$+Z+@pKdBN}ipJi*nCB+KO57jpZp&#wb|>Alnh*I&Lo^S4$Z3-Y$ED=)_F1ULj}0w~LG zR@o{3HS+hI1TS8h+ACL*>jk6va1*d|txO>`=&(AU`LF&%jh)6Az`bmlRfF_$5$p+yWC5b`IKO-)zqM!5yx=1;in?r}a#NiMgQG|?AN!5bNPKo7Fwr0mWzN@( zxv!@Ab;mU$vB1;?XO3p$o|~bRt&#STqd!~`&*eM>?eVQHJ~Jqb#}2^{37j8ya~@Ug zSg^vS56r~dw}g(q8Zs9u30&0wF~4HX`_4xiH~uxsJ1L>KFxiTGu=cO0ue=x=j8~yN z%SFW?EBWk;$zEojoddJ{E7wkMMvr6f>iQ>35V;J=g%@Ti35oTMYom~ zp{mh97wo{fGSR^E^7iM1f{?8vvz0K1&yF9GqMb8hazOxTnk$QFN4oHJU$5yhAz+Vv z<$xnp*)Q>sA?!+*@2^q9*}P*&lz95Yd>DHRhb1vmG4%Bg^w)kY>KDgW54JewPJNp8 zHvgV9P^F2F&!6xf1eC_Ejxe!D5DSoAA$4$rxbCi>zc^NZo}i3}*B~vr5)!k)SMG`% zWI`gfNdlOt>A1=QYfo-a)Z|ir3b(CjB3HC6kTF5f-Tl3*BGTf1EBogv(=~yJB%*$5 zDv}utx_Hrd9o1X@_#-`?XpAGAHdqd{DkoAX0T9Y5KWW8M$Vb-6-Zru-d5Wn5L|Q%# zT@hdIeFs^vb1-ZDF?miw7|#L}E8U*9UlK)7ri-iw2RA;rInE{Ovq~s30F9ExzFjF~ zefD(YOkJgw8(M1)MDQ$dw0RNqBw3Br1V|5(U)Try+E1|6X?py4JM!8BN6-9D=7xvE zl{>ybQ?_=Bu(=r^8K?InnHR~IjUeq*bakjGKT>xr?PXv*-%W;)+dWW&uQTgZ>o}(S ztLjfi=X1yAF4pj;;ip4i3%%OZ5ytIO>4#=@o0s^Eg&X*(n6cDAH5+DPg=pfwnBy!& zl5UQU{GY(V#3P-Kw)R0{{vU&^tm~TxjP91o-?n0iCFek#8|cTc)P86>5e3g&#T1r) z@1T?%Bj!0@T3B`gJV#CQ6^m2GA=3v79N3-v zl?LSs{fUxM&E@K1O-EhA^}tAQc#2%$EtrHDUBHdrzsoC4pgzR-$k9~G)xKW{$^Wzx zDWdl>QU^1FkKy90ySU2PX4HPah^yeewZp}TL9N~53k#9|6UeXVG~dXFwp;Tl#$g@= zPVZg?M$0e~bh=K{szQ2sqFmjDMXXU7$1tD;ida=us}UzE3m&XtI~S3^V}&~U2Ek#e z7n;EL=zvvnW?Yh2usP+5ikr#pZEyUmq^e8O&=PtVb3oEhi7FCGs7wmJF2X3`pk7U`C z<R?8hb&Mt%JB> z9Jg_W4h3f}{cBbuMDmjWA7y9$A8713TlSL39ma$(Hu`R*Zc0T$LeH=__GUBqmA^d} zgGhRo_O@$d-AEIz)x=rg#UOx2j6eW2Ct+JuWm!t)>Gru5Ow@7aPioq2`x~1qn6MT5 z#s$FEcI#;4y#mwLj5E-QTbcKz3WGpe!nwSnw+^KR1_KyLjJd#v7;K9y`AgP;URtAR zr{ct))t=1fb^Q)c>#BmXsU8vr!kN9zH24F8=g!YWi@tUNIWI5$V6>TAb?p_W$yAYm zE2_F9t!QrMpXWc3u>+3Qg(k_Ww)*pf5#_AY9fZqa<7KZ)`RDM8RQNg7a^HrB%0Xsa zaIm#`>;P2l`b@<2-zIsk^ugG{qaXOhj z;plk{fXhBMV=4FrRBhnbSA7EbTQA+e1u^lv=K3=CL82xY`BQ!H1L&i0IUEDY(?%qv zJC*4S4?0qDtZyPRAJ+g|$;?9r(x-IbHTYVVTP*Vd5IzZ|8%4@rP2a+xO%&f{qwiEM zYcluD>kBg=Jd>olF4n74jU8u z$lZQDp9(z`dOZyotEFGzxQ2AC6+G`U#o+&+uw6N^U#Y zc&a0;AmTlA_@k=!rC9P>;+jB`q4XAsv7t^dnSui{YHtcGI15*}^2izv84HJ<)e!8s z18rO&mqV*M*8YY9J`IPzlAZ9sRH8%fOL2nnH{IOrz<}da`#KZQN}0IL zT%Lr`AWNCU=YF}|=n=%f2)U-b_dAv4TpkmasQY}b{fSA_jUGAS2Ns!`(irIj)4)j> zPpFo$kyr%5I1d@D+? zB1GR2F>dTlw+HM7fl#Ubo-oJi5 zs;LIwUhd!uW!4cv%;2Mj*uKC%l-g18Un;39gBMGR_uwcB%)FsY>P!SXX=s3KB(T`=|1TVuXJu|iK6WZ zVcD<6H-8OkDXh*GTqv(x$Q&+saf$8aM%nQ=W=mpaHI#^|spwZ(S6vlk)f_8+$#wD(U|~`~t1%12^sa zfO1G}b=OsWwX-#bTKp;c|pYHvRb|dUgmAC+?cWlQb4|=7ZB9%OEOM z(X8K(n6qEH-K)Xd0&MyrXBq$1sh3ys6xEZPY^Ov(LbgV!4Z}J3Cu9K!#Gnh0=1uAC z$zHy2FW0+5yov!Uz*;<^=iJ-HumW`Nv=Xcw`jPWD8o5!Km;*vvP(^^~5K#UIXB`)7J&qR3S}zM)WsFM8uuoNKtP_8T!&t8-3zbt}H6?x)?z-3Uc`d`+udl3F zfe8a-JhVwfLY;{*v)OZp543_al6fk#dTIkyZsc%1iQyA7CE}}-B|cOKNU@E@y~HL1 z|Noek!ykj3sBu4-0W6tm4*&UXSnlaEGE9!bGVk1Ye*w*qIazhSk-G=B`!P$1f(qa) zf2GDv#s|sX%j`M3brXDHbj!pqYeQ&;T*4{(7`?uNHs{>3{Yvh#x!(HuQd&H7f^sDB z&53pevieVg?b%27kyg;Iu=@vDr&m<@Y!vJ5>s6f%4p@NamiR6#^?OhojpO_C*q1uO zf_R<6G?ltP#tDKZ2H5WLz|88>!}bIF${qN?P3%^o;dAGA-$EIVE*O zp`M6Lava+;bR32k@vqi}*8D2h)^jUwbUT-{{*4N*6 zWoXiM*QeX&@(#zhmo^w3 zw>26sie%Z>erd?Z8?d*!&b0CLk+IVNB7SzgDx3}0?<4tD^bOjoU{aqvMA`e;-1eV@ zk(SC-`MbtwuB1e;GP%|9`NgP+$kwCbd!iZF?{J0dfc92_T@(MFh$>Q{a0UnskRbfn zPHHXz##=Xx%YRu> zt;^3Q!2Tu#PL9{+46zCzA0hJ}f z)RD=7k5~@yVR7oXeIh4Q0uUxH%)MgNpX$aJD*5#BO}HX{uI_As4~!qj@m1sQMOF*v z>599TfzHA^B7}TX)-4$5BeM@6g*&yTuE2{{286 zd$L52l`NxV4~!Uc-aLdcX(Hl}D;T?^;%sZZ^#44fc4suu8sf(;^kZfXhToez4K66~ zejdF@XXN!Ja_3LAycBIxX7645nd<_093&rBzY(O7$WME_xcMb^IWJ}AbErZb4)+Jt zmETORD+ovRyn3&urEn5hZ1aG~h@Ta)l1D!Z==ai6E!P}qj0^(I!BKzpG&cy1p@*A~ zG@Sa*e?LQ8-Z0c9=iP7{eqmrg4{`dC{D7zw%QTwV19IGvfZvt(32@HT!g?}g#!l`u z;BM$^euHMJAIp51-01s_4I2q(MUI&1hZ&FH4uNB!4XN;Ve!mkNJ#-X^3M+;+=Z@0% zH+1pg{H|$Gi|(W#z)mLeaE&-*@`_=DwpXGKEf!NJC+rO9t-F3O;O_UIJ{n`YwbVB*#q|ykF z*#L&PA9WgYC00U;vZ9J>D$1p3K6=a5kt#|XM^6gxwUT6(W@Tc0wHj)!8Np&#p z71E+v$Xb)K^UAYtW{Sl>n)!qLZ~d2uI;1VM*9M^D*G}5ffEmd@5K4{>k(hJJt+3Cz zVsn4%B2py_{&hM6!u&j82yg{$u{I08l`YGf&fA&kwdEfCF&W0lxLKUb?_zYq{v%`b zu;O}Bi1Enc#PQn;*ttyW09kIJz-0hio)T``*ZhCITQLkui8in{+gC1=vXyFke-hm$ zmUNaFBYT(i$jIX!VooaT#epRF6uf3DnGw2T-pMD`xG5aB>gO&75XKRE)H9F%d<)A- zIvCY^{>t|SC0F#ZbDpY^%%$fZ?qosg1cr^i)bOiu=P6{J`?z(bH|+AUM*Ws&jN3+S zQ%LW9sJStoI58B}$+`U5?;voyJlwkn3G~91Y~~q!tS*thg}e8kYjRbQF<^lFmCXtW zpT9-Mpw9nruMTGogv0fWKHEx?z!gYf!)nf-`60VG_O`?fhE5RPD{$?r!))QU_IWMO z0+0DSU6=L$ucd2`XZruY#3w0{qKvr|B~tE}u@TBG_iMQqxt7c3I=4_rY~~(obH85_ zLhg}~`#qZLFj^8bm$`g@?;elepL;)Ed+)tH_ByZU?VO`?d=l}&d0x9isbj?t%F**- zfXH@N&<1JkZ4G(1;PXMS@AJt#1Z1VJh2;?o@=5!23$t8jNManevGz}j>^zza<_O$e$)g3Yd zG)|^oth|9J4XLq<8*u4wjL2X*fSALaeE3BSq67>dk_+t`?YgR&l*$mI-=(yTid6#?IcovauS@^cQ59 z__wahKg`A(itEj@&%=of$|%--iq5R`jVuSl#GmrkCTn6KI$}^)!3Xhkw?u@cWNY2m zM2t^MScLEK{vVaBC~bh4%d#xCC1l7j3@XmB3LC)m3NB|AiyFX^7 zxZ_yXVPdF5Qx&`(>)n0ow})b&b;QDaVRNPp}+QcGl!U0Mf1nU>q^xRQcWUM~C&bbQ#cDAmSqN>T)<|AtAE zh!e)p{wym@+SHrpa_QoV&%cKaIx(uYP7ocC#=$tOYrw(eah$kqV*cgFF{IscV{Po! zk{h;x9p%Pwtx>G6F#s%&KZCY5Mkar#_!2ZNa?P;0JOp|8oD5^Rafz8mhqNeR5xfDd2VcT)57WBSX(tvyJ$3OgS@#0neE7}!>`ty&d)YNuh+{Hk`>2bkSQ%El^uf)xA(W`*+I(Uk!ObUqaQl)zodKmSWH=Re<{-lP9~rbNU$ujuB}OH z!9xwRYpW=d^RhcK;f#+`v0-E+m1O{iJhea_@>4;C4$ z+E*|cE#H6HGhK?6A(;cb5BvxETM}4VeF#h`3C5;x-ysC1`QRa70JXNDD@;GfK8vE= zA)TVA`VWCThKT8Eu53A--ZWLOSK-`ROWG>zj3mff{k>=Wy<}S16+*pHrtIcyPGk4b zm+lt>zA1-C77)0M7DqMsS=~MJs>hD6WVg(3*^$?T5=gk)3JH2l&du_T<~MRR;^Cvd*d z%U}lim+NB10XaP*m^jPz>_2!toCZjT*>{`?eOj-spo|k!c#&u2=%XVt!O-6mhsyom+iL~ zk}qld{L3h^<8;PEDN^;M57jc%T;rN}3e$&yH<{sa_fdpn%(85Os} z&_aL1i(BP0(10=tpVn2L$LWh?x%d`_AVMV+ZOCDZG-JJKBn-HIwhodQd7{oeI|m#e zXg#-!pu>M+I+c)fM8uFvyd5sT@KJz50`t#k!iG^Iy9ylXg3V#tq!m{wHwYmuy{r^W zm<6STlFw}pd3>*KFfyCUi*pr>`*#-6Ei#>E5_b0s5ziU_UiTfejr3WNW)AZ>$K?g~ z2c~%&Smsy4Zxz2dkP%N&UTxrqp&UZ6@^z%DrKPYw3NV?9^wmt#hIz3;1_Zr6hr4vElwbgC5L}~5c z?ImY@I+B!rg-kXQ8T5RN_&u<9cLJb0?qjxbB$b+ujjSQFni*}50m6dAp>#5!#X7mP zAP5ceuA0`Zg`3KVVE^&=&Y$u}i2n%}J2-)g<@U>blx^rcFSz_nEs5d)o3n3S?M|_i z4!-&9PxnsujscHb$P+{>2GVo$>FuL)p{5Ic5uHEBmJd^d(>OCWbk~li^Fm|A6af)v zy z9E)rhSj7$PUE_)0xqhsRZ(-Tb5J7hbRtXN$O+jHB@&gri5It-vhVJxtzh{d6C)*oV zFxr3ds|4l?xcm$wv!G$xyv?sOIy;8i;hu~5872}HnB7Nrg$rXZJXtt7tF6S@1nn`( zg`(lwzUbOe>1Dys_u2oPBV%dw$&s?6U%2Ew=- z^zy%)$`k0-{CL4M4oDd^m>f5G1(R;nlC?xvSJ<`06x?}0h$2KM49y>2ujNNPj_#{` zGWx#F)M&}v)ij3;*~C+6CGe&SM;F^$V_nfh96sV7I>=-pX<$(I1BZG7<2Q5c7IWWF z(5e5e?Y9~hv%U$Ogt0Qca4%Ux>1lnqvy#eL-w}Vc4;EQarjP!+fb?+PGn41Nvy0Id zy%G_Dlp&>Z#9#KUma|$c4%Ba!?*W6C=?&wVI!BAN27H&mOxY$d*4iKoWvxQzJa^~f1lt8LIB;XQ`l+#3j-{9C`Y?!M z+;|i98;nPO?3)H0W|Tyv0ZbcxYx@eW4n|IRM>hf;OEaAdHB==NLY2o^+lFdz$V7Gz zGr%=h`p?Mvb@gyEdstal)uJLUqEM@^76u_xOo5D4gGEXBOqQ+)2^w&t@NRF96?6sY zZvMKFof>6iNW1uBR<3u>PzQWv*j^0!$!NM>&q*SwY zJXo5ZV9|S{D?(Kq^1jaT5wi-=?7vanc~z%(Iq!2EDzn_Dh!k_^3jlY%e*Kx}ks<<0 z%hf;cEiyTw(k$l~LHx?pL5I&^658;?FWW?teuKvc>4OLyEnKisX$we18;AufEA+{< zq>n?$fRfY-f7ASd{xkaQhN?xMj@7GgCRTjXU%Gr#Vt~NFIFS{eTN=!Xdl*#QgO6L7 z4U{b0fQPSg&^4JpbVsl(Ei7z27NI=C2qdf;F+Q9s9e+Nz2UNl0!WC0`vM2`WHg2Cj zissN%$;T`n=xA8yPS>Cr0(*LBr*`j>!_g7@_7T+ecNw3C=9uD&q? z$kv$mfU=s^Kzpsx=1rFFx$Do`e9u;TM)(Ak5I zf8F!SGxrlq{?V~VF_u9~{oz*{wDE&IVj9vBah12%`3M+NqyhIRh%<*9*&|Hkf*{am zl@%%|?Nv0{M21GaFM!=Gc`+{~-p3Pnxk*Whr{u?#J_`t~oCBC=v^S9I_8peL`++m^ zv33gH+UO3GFm=Py`W{^E#C$H(dl@pUHwYL}itsSy6i6R8`$nRzv%SWEs5LPXCEd5U zSNdW-;oP3%s+Ky5@@Vxqhs|kXA_mss1yaS;ZL>O!gBJlwv)tZ!uHH!*A41^9DRQEw zXl*rkt4C~G69*U|y+Nj|go6o% z?aNZIqehgS)GQAS7yU@U2V`-A6br$iY>4V?;T>7O= zdtd$L7EUdnV1U|G{qT$PsaB)I+l9-^e+w~>Y3@f^}rWn~HdQsrSepB<{pZ_1FTvTP@`thKVIK12VQnw}OVHI}eV z#CTUSt%_1_Q^h&tj!yl80aVHfjdgww#6qpVB!T=Kbie8y&PYrwgQB~Z71zI8Ao~xK zf@4yGOZ3~VjpRmsRzxL?kQ(zvxzvl-5qhK*`IfuO%?oEeKhrZ}i{0*3X2U- zu0IT`Jc6E%DnwlI^AF-t4>=R*?=?7JaI%Ce3lZ$93>9(SujDu%^!0xXoyxns88KwH zdpQthzo&DL16juM0K^)~GSdxF#$Pz*m`D`0u}QUi6Q)eHPMT-APY_f*R3p!}`JCX| z-907WBA?y%|2(m1LjHNRkH0~3KNa7fTm53JMI$4w`7ycuU;V39d>{Hd;7R|Mwz)SE zPVmwW-Tmfjo6{w=c!JDIztcIYJ-=7bctbw`MkzHUM?+QK)oR(TIA3WbH}ID$Y%oVN z1n!b6J?9vlnEiHXW!E^P42egJuE+6JPJ+%)?K>_wJ58`z`mYFy0n~TBpI;*FG|y7T z$EyKTvD&I7CJY*J%5@m~`}b2j4V}f6lHW>#dPB{xE}vs|Edte=U=$l#A4Melx#1wXf!AHxZWdsl{_5cdn5-u%a zfxF=IRqKigoJo-KogR}RL&I}rW8D{=qw)63Mf>szY=^1G9ovma3-<{HU%ck0y&-n@3A8I1-RO44rx%&ppI$(+FKI|6YhT%m>InH*#z9 zE{PlL^hVepEa&(Sdm*uG7E|xmdZau=(JaL#{~$r``^&52y`o%Sn=_)Lch@SFpR*%z z2PFd`uShv`bKCWV^TProf$Uhu4Sl~^i10?%r@wE{&HDC8X<9xr4G z5Hhy7WAa>i7|3IIu=8HWZfR&TAMvza;!*P!K$&FMejpZyIc{-w+)nKst+JbK>V#qGu8qng@lCMpzuwo;w_AE(amD@H`x3DD*X zEcemk0`JpG@)(iq>gyiHhxW+xg9DUe^}dwob;NJ?21O0-KBeWd;n0uO_6ELq&hT3{ z2bKd{Pj5~{@B1?K?W;z8M8HGK0f#{ixo5x31LEh>Pj7_kM1KwVZ}q9jj_db00b4p= zeajwHL22OK%fCBS0LbX9;JSXWf6blpKS~TSP9~cr^-090{NT8+a=yfMzgn9^-NY(_ za|cxADiPXry-@zs)*3(&U_I{Av7JPy0#H(3oVk5?;lC4u>%JBPr@P|{Zfjx>K0fD) z@u+Z-i_vhmL#KXnB_NH|7HDPP1_fMOf!yw=HWmo#Y6vQ>FK z^=M2`%yXzf*1|zCT2*euqxN4(hnjC(aro$3XwxK_`ulLbZdJ zDy{i8&o4jnEDx9i#|5*{(Z)gYwBp~ZN0yzW`gcatvv&-hvxwWU`l2cYLg>}hwKgT0 zc)x4ap309rw!k$Xo&7{)Fug*1@|Ue9z5Gn^H&&BdA}Y}nF9o|d{CW7^@+(huE9S;% zBM&kbMK=@nlGTes^|Rf1bgCQAhcV|j9L>Rer`ihsE+po)eb$b*aCSVOq|O{-VOBL> z*C6%nd71BCD$QYv>?`us9Eu7WHlhNiW}J!Lu1dYkU`}HjkAAiJ;iZK_ShZ%g$#|4n zZdLC@)8fQeC0Kl*ak8rMIVBPF#>SKVfEjz~t#6(>3@kAE_EZVc>lvbsL*D|y6LN=V z-^72ZQK=6i45W6`3LU66;#7CnMQS3Uq2X}3#IC0^GqGFhj~o0yy&m}i<^-@{cs(BB z#fGg4qfgCEXuEoAVxCYnJDI_}2I-}l)5bAJb0JPx#HRT@$65Ew@nF0;1^RI<*X_hu#s#~HX zmK8Odp$xk8{jx+5CE=1Xed4n>uZv#|LwM-+rbQ9@&Z~2sv`SD;7k`I8!8&rW*DD&; zmIg!#MK1lEKsGhxAsXid#b%A9LjxQf3e|5s%?{uY`U}*CM|oXBijYjh^;*9g`{8QJ ztrE`oFOM0gK_!67`-`M7Wx>-{P1gtRTsT-0QMGZ)KTo%GF>f%_mfPQ-9J zzzC!{phH$Xsp>H!@H26-<_ zcRIo$g9alHm?`-Gel)xdT&=cTWQ7lbMoxY@BU5&m4 z0lJ@dziwOy1a0LnK6li3@`|TVWI8QW^I&Em9e34daNnL(BKU`X;(42D5n7{C76SfH z&C_lsTykVX^=7E;yDqoAz5iU>o_;0AQRmvfws@ONR>^zz-IHgveo_E&aWY?P4qkPA z|9)=hN#;rlCF^PCbg@Q)TeU0+A<;a~2#%zW&SwC?7--kilxzietw?}Mi_GF*_5X4&daC!k@Jwe05vcn7YRXCi zEayXuUy@BhK*6efE#64U%1C+zel?NMs<`4}`vphp|6aZ~xSm3^a8huGl5`*!ZW)>BIP?FiN!^zlmu$UuC#mi^_d5RU z{}|k1HcRH)KZ&xxcy*vZn?py?kADECTww8dWpHE$|Db3V2lD;RyMyjcrh#wi7yg!$ z+S0Z!7}(%B>{(-2-e2(*(H@=HJ=Mlq<^BkY^fKm3@#Mt1(x=xXW1&wXmiR3sL*)bS z77m07DD-IO@}Jv-T8%oew7;|ospZCZ-~Vg{VXzZA8Hk;1&OIhHmYAif$$3k_B&^4E zBWwiiD-QydpjRS?^_;#tKf6h=4=ax!fd;eZyMsR`7u58}SZNXYVCR62$S!YhmTXNA zUz@MZ*DtOaas4+9emlHpJSvX-3Ap3vElWLq!~aP;^wfN%)i(5%Bj9T);~v@(um~_c zD_@ieM?JQ>R-?75BND{{xH*Jau%@^%T8Tm}3x3$H>>w;|#j^Wo88Jb}*RGp1Xx<`4 zE!<{C^p;)GP}l~nzA8O48x(~3nrRgCBK5k|9$zedZ0)Xz%Y#u)Oecv6Rc{y)k-g=_ zGM+WvsLzfdESazAv&X(t=C$p?6gb;H_;C@%%FKSSUlz#uQS?H>{;-)fRkK-WM|R;b zLcA2g$+QB@pdy5W#$;R)7D;Mmy=CJzi-;cB9nRCV|F8Ik(?5XP{{T-hoGGWC8bk;PK_pJvT&u# zieC@rVIK4)0Y){cZ-SyzPhhaJT?`58qcWlTWG<4xvsT!<@#aQxaxl*x3wU((MW>*G z$8>7&&sQ7`>IQB;z9^%OCr$j9^5G51I_t6kwyeemNRQxXjy8X2EL=+rf)QY<@tVKJ zTRW%DxgidZh?JCJz0`-eS2ViWXY84f)A|(5y^^Ci$dSj?~Zl1oZL|b0${uiY1dHIr%`YwaVq9NxaofJfuz;+Xc*aygpQxa-F1mM^RlA$ zv_kOx{}|@g#tY#+9%U~3C+=)tTW@Q~P3ED|-P7d>_`32t?UZMI*$Xrvs&JAQ#cx?4 z*fsh9Z18BnZ|S)H{|3(>TA2Cjc)>Oh+`Ui!bp66w9zL_Wj)_7 z^ewpxL^-&KR&yCrX#q8I>*4nm6$d3`mN!=XJ$^o$jJ951gI2rPQ{M>ql&MCv3Pb=9 zwfB5ni7PC}Lik_AL?|sB5Ey9mf~_lpw#-|WbX<425F9fZs^eQaUWoa!;9U^f!xnf? zKH{6)kb#9P-da-unFWdc-G9qT8yn`4i=RgWpJ@9nL}mdS=FT?rN4yvZGdLT8(3T33 z{e0lP-C%#<059&^f3es6Y3kEzo_Egal|Ry3S#;SY@6E)#gWUXR>y)D#w2umgUHypD z{=aHaD?*HqGT?=5=_S^jU-rTMA-vyWEj-QLUM7AGoL_nor5(|2iB&)4iq^C@{S-YeOe-5th^}L!PDh_2j4%BC{s@C=Dw+Qq zI4sItT;J6D*TC;WD#InUD;pN~tiXOfMpR%3Npbt?TneqkITO6kOdGntjPjE#t26%) zZjt~-siqnF-;DEu#crU7s=s$eE;<$4r&&H{rZLlcx<;q~} zE7|Cd@*O(9d0jcH;s=`{154qf_jPU{s!fK;E1i;?(Kp|c!C~UZ9h(eS5+XawcF0~b zNZPIZ%y~JGmfPnf9`L05mGd(M;gt9@Ua~`+QaNp@R5Aaaj$nCnPv4a!7w37Eh z%&*jVKliN%vRR;t7o{YDoM03PQHyrkz-HU)MO+`s$V!mc;&bL$X+?R>JnCRlrq4}}~z z0PI1HRR1k$0`B8Nf^8Iq(kC_5TIGgd?g*~ZYi$3Jqn%=Lk%s_f44@OPa-0w zO877o`siNn*5MfN43Z}~rhFK4)e*6aL%09E&c-7(;V_TbS+^sDdr!+Ak`P<}o*{p) z9jO`k%MDnf%)uT+Hvju(0l$=elr1KkvI=2rpXcWw*_SRZ{4{$qwx_*J(WxeZK~Gi9 z@usR9^o#XNT9lD2qq+%s5Rhb*nxi6hQD^z83$Xd5!Sme zRS17QEH~~JY#Z?HR29fzX#C~Wk3{NJ)%v{DL@4Cm$(hqXgJ_3amij06p%Y5=e{0L+ zONS4Vj@tWAS?QvJarvo{E!%x(akHNqmAu*j>SwjXrFFsj*!W%B3r(B;|1k-+$FflM z!<(w6HBK5YaXWCjU%Ae2Kks-5__cf#9Lj)BtxuYCna^6%9L7{jlK;mLl2ousTKBlx zN+1dg<67`NEs76Ls*fd08SY8C)QTRsyopic?mh7=84p)lw{8@ip%3Bj{f}Yk+68;Z3hY+n81!$aQ#{}KVxW&SyB_03ZQgmKUq=-Tad^^ItJ&j-MHQUkn{ zF_kgJ88KsOcX7sr8EE7KSaFNZkZAb;C!!@PT5QW3Z^W4^^k! zEjnd0y&HpOU$)JC(I28BCu#t#1ddCnFTu9We96Q>FC#A+TZVAESAi9%EYxOnclqI3 zsS_u^`UmynTHBubqelnGUa9y$kBW96gC`z}4YQGhTV$w1 z4cSpU?Rlq|T|l7wZC+g>F4%%w>yb1AM^9t><>QEv-Dlq=RVRgheI|uR2;eJ2H_Lt>`yHtEW;ye^@b2`TKKO?qB4Z;{R<~`nbUmOgs|U=}Exm2H@!3+FHuyt=hriQmz>C ze1^0hCU+0mo`_!tuG!V5?nUd!(E&AQw`>e?+@QCD8USDpW%l2)9IrRmzYMx&mudPL e6#@~+L#m(3=w8{dqUco89Ol>@z!t&(&HNwpfk1}< diff --git a/release/datafiles/matcaps/mc09.jpg b/release/datafiles/matcaps/mc09.jpg index ed6a6bfeff85864e6f536452e996638f602023fb..e05d441aaf94b489efdeef6ced43e249b3c17f30 100644 GIT binary patch literal 31101 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 diff --git a/release/datafiles/matcaps/mc10.jpg b/release/datafiles/matcaps/mc10.jpg index 50eec402812879ecffb714f78af37b7a97088462..ab82f17bb934f415516d79711abdd50c12310aa9 100644 GIT binary patch delta 25938 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 Lm4t=<{rSHDISy2E delta 21313 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 I{_FF90UeKjEC2ui diff --git a/release/datafiles/matcaps/mc11.jpg b/release/datafiles/matcaps/mc11.jpg index e05d441aaf94b489efdeef6ced43e249b3c17f30..053550f082cd3e7622fdad199aa62285024b5710 100644 GIT binary patch delta 20607 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%0A4<_^2b{6H|QA5S*p3eio&9vZs;wa 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 literal 52893 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 D0WRB& diff --git a/release/datafiles/matcaps/mc13.jpg b/release/datafiles/matcaps/mc13.jpg index 42be580ee93030fa413808cb2a0dd6fb35da7319..7fb8fa58e8f16ba7ba43facecf0f18ccfd732225 100644 GIT binary patch delta 42226 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 Ib^Z?iKP>V@p!{%@Mr9JP%tehy2L<5 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�aG8Oz)mOOGRu)`AST=zkGS6s4p6r=$}p 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 Xlt=f=hUJAOW9Q;dOhJ(0|8M$#*V83{ delta 21706 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 delta 29716 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 diff --git a/release/datafiles/matcaps/mc17.jpg b/release/datafiles/matcaps/mc17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14f15f704601bfb83d3b9af1803b24c94dcc0017 GIT binary patch literal 49292 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⋘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

    l|vM0 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 FtR6K3AHrn(?i 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 literal 0 HcmV?d00001 diff --git a/release/datafiles/matcaps/mc19.jpg b/release/datafiles/matcaps/mc19.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56d2efb173488e845fa709e3478a701f3a5647b0 GIT binary patch literal 46330 zcmbSx1z1$k+U|y-ySpTnQex;3kp>ZvZfTJ277&mYB&3y;90dlXrArzHX@-;@(h&x@ z<2m=9bMAefTmNF%ysY)DJ>R>&wfA~g-2J>;1IW~s)sz7Y3=BXO{R7;s6B(%~Dq23* z)mB#1R6-X30FkPulbbsx834Gt`FQE7JYh33HetgZ126%600$5P0Baj>4=p|A7XUh` zDJimfqmBOJf2T_rfW8v|Obe(!XJh+!{{IsqxAE}u0RW8WXloH$J8v5_euKuZ{CzzB z<|ELU>ZQwHjEVIZd!ZdfW4gcC;h&iQA2$EQkN;v@S2tU<&0n8AY+Y^t;$Ad<>*s5S z#vn~Jj`4G{^GD+uH0FHe>*|EYNHnH$wX^mH04$=v`95|wj%fS{jfuQo=qjSI3;^H} zIs6BH`5)NFE&%N(04Tb91bR6+IQp>Nw|T%OBq=GurfTQ^%Ff3};JLMpi?x?6o1(j` zhqYTE0Q{5l-&z30-?n8#H?o+Jq?nk1upqkm|CRoah5xepKZC!q{ins5&Oc&?LG$C^ zdH=5a?>zS+0Fbyqx6QkM=e^7ZfTm~wpj-HN9_L2@AbkS>jpP5phvsj8arE)=kb3yg z-``)*$<9XbZ-f3T{a+3KW%<7c|M7i-f4}cvZO8W1&fePhl@HtBMzwK&f5}>p%S9*R`{^^Rjb8f0Y5cmpQpPpu_EE>*V9)?#AZi_P>kpf3ezs z`0yA0vtOeDWyvi-Whn@djZ*=j!yf<^B_RMZD?pcE{3~vn_y)k=C(n>|=b!x^jnU=* zxc*NU%oOy$nBGnfY=5&AbziXA_w1F3ZF<=4M0FHnw;05>tAwUEW10(?NfD9l9C z1*SQs1Ewct5at`qWXunkMVQr?jhJ1SBbc+8Ync0(7a#yc2%-Vq0||g6K#Cx3kO{~h zoI6OGwII1|t zILhw8la*78Gla8>bAbz=OM=UhD~oG@>o+$Kw;^{d zcN6z79y%U1o*d8^8n|8!~>TH`41*|F?qqfj=Z_N<9wKWVth_~ z`FxZ7*!+_GZu~|3a{@#H3IcutRRVB98bM9LNWmt-qlcUiO&+E`9C\>j^PqmoC9 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 z�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 literal 0 HcmV?d00001 diff --git a/release/datafiles/matcaps/mc20.jpg b/release/datafiles/matcaps/mc20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..002a0910dd9aeb15acbcd423024cbd1d03627e28 GIT binary patch literal 52893 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 D0WRB& literal 0 HcmV?d00001 diff --git a/release/datafiles/matcaps/mc21.jpg b/release/datafiles/matcaps/mc21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb2fea573b80d3569c243a621813622009cbf9f7 GIT binary patch literal 28717 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 literal 0 HcmV?d00001 diff --git a/release/datafiles/matcaps/mc22.jpg b/release/datafiles/matcaps/mc22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2fc71b98c5a5138c05302f5ece6e2ba182b0971a GIT binary patch literal 33801 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 literal 0 HcmV?d00001 diff --git a/release/datafiles/matcaps/mc23.jpg b/release/datafiles/matcaps/mc23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3793c0fcaa573b72626fcb3bed982be23dfeabd1 GIT binary patch literal 26688 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 Z)>K~wJga)g{&lSS$GPhNxWax9{ts%OgJJ*x literal 0 HcmV?d00001 diff --git a/release/datafiles/matcaps/mc24.jpg b/release/datafiles/matcaps/mc24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a9618d8fe16a590ee66930ea7d5c5738aafd744 GIT binary patch literal 14149 zcmeIYcU)81)<1kwNJs$bAT=NeXec9sG$km~R0LFtw1@!#LzCVlpcDlW5fw!RK?D&c zB27?xT6^vCU2E;NfweI} zV2`PVDFA^$0CVsUSflbfSQs1Qtq)k4TI@3c9{>Qa`95zyf2aTe`1%D09x&S_=Wy6j z4%r4k0Th4$wg7+|At=D|py?q1EEXolazP*yhyJZB^#R~70YJB!xwV|!Z|#4J5+no! z1_J=Z8sy&U?h!-)>3ER#2@4M3w9`OZ&~GYLHbN+hzCf+_JMR_sJBNLNcVuWqECpgH%K!;TEy4GEeHVMyqxx6 z4}up+{{+&!frkzlgYdV6{W%c&4H$!*co)0H## z2=nm>4py^vBM{vJ-Q|q^eFNP5A^_lLojJV#AXw%_{x*5;oF0J@9d*j)In?dUZCs7e5U^+Uh4Dc%AA{&)bW zZ2z4;Vx0Nn6&xI(ub~kZ7N+j)K~U!m=&$838GhybbK-aJQ|G+z*Rhk^?QzU4#3xve zGpGcAAODa*xu5_yf`^>izfa;H?)W>gekX_O0gq!IfgXO~tL(s8=I!SRn%mFaJJ{Rb zPtM!#&n*0d-F_znhx~b7gM@HC8xX;(0|M02k%~V9wd#6UeW2+lR6PI4jQ{ zGxhVl2Wjy6_s@U%fTn@}LW8_LA6x($;0Hti2|yN508{`q zKoigb3;-j*1lR*u0f&IYfGa=%yZ~Py5C{XJfjA%$NC7SYmw_xG2gnDCfD+&lPz5{% z>VRh870?0n0>i)Oyxy z_d*XrU7()O6VOO#JoG&DDl`vzA6f~mgT8|HLdT%9&_x&k;BCV0o|-SPiTN)(snj&B4CG5pZF+99#`<05^x*!U^yb@EG_xcozIFyb|6B z?}m@VX>c|dAD1*2mP?<@g3E!+lPioXk?RUq0apcA6IU*v(BNLI=koS=kWEXN0$>8SU#&BzLn{qpH z`*EM*zQTQvyOz6)dy1Qh57%Sr?x+Y<8Y&-EgK9@jqL^qwv@&`J`Vjg!Iu3mm zU4m{xzeRuL;o;f9qsL>zGQ$Q=|DjZX|q)@LwQ^Y7*Dn=_7D-LZ$ZPeZ9wJ~#J%f@9TWhHy1B&8~) zY323G7Rr&z#maA0_*8HzCsguOdNv_8>24x!y1A)iGjy}|X0OfHH@9P<*lk#E>`iQ^ zDwnFBs-J3}YQGw<+D^4lwPLk#busmQ>ZjDJ)IVt`YB*}7YqV&vf71TR=coLihPMc9 z*|X);mYOYJG&gG!G_Py+Y~|Z(x|Ou`@m9JPR?9;xTWdgDSld!NNxNQqb(_w%z-=Yl zW^@#Fj_BOb>DLv}wbnhS+p5Q!j2X%q9x=RSIEItQx#99~R3il=ccTKMshyj49^ZL?=cipi?F!sgv1{2_ z-}t2Q^WCuBX1kMjx0wi;*qUUSjF@gP^)xLurI~4)MVUP}=Q7`Go^IZ6A!9+XD6*jK z(b;oyPvc(Ry$APZ?WOM9yf1KHjV07_k7b7C+x;8&`|Yo?0<0{oGOXTND_ftieqw{L zv9`Hx^Wngj1JMUs4hkQ{AG~*P>Cmo2X@`bwRcu3S>+SgMob8J2mhE@jU$h@{&~P~E z@anMSVei9_9g&W9js=d3P9{#5ohF^NofDn=T$EkHU0%3Ky85_2!}H_a@MTB1j@Tc$ zcZB6;<(B8Rc+}$PjiWSzF(H#M>u%(J$$iFShsQ;asbf2iT|74Jxx+KVbH)qjb;WDW z+t@qHn||EpyKC*();YxI}(5BKj3zy>4+jGfRwarp!- zaBpBi5G2SY=y9+J2&P_#sDvbhjE5SAUJqr2*@cyb3x@lJzmC`(aW-Nq(lqi;6g-L$ zRUa)M9Tz=*a_7n17)Z>~n0k@|DV{VLYZiMq4jo5~dvofiQx{JyoVGt*6E71V8$Xd? zmQb9yE-^5%Kgl2|=M4Oe_nEe{ThCrQ%T9Jrewp%9%9Rw>Il{S@sasO7rmmeocD^lb zTUz!7#09?#ed)OLyB7s7MqZrAu*|5uBzGzK(!yo@pnkiK#D#_~<~n_byP*(EtLIVm|Sx4dr+GJFE9p*Vh=-R6J3C zQutK<>Gfx#&(dnqwehuUlt{|r^ML1bb)Iz-_4xYX28V{8Mw`aAroBzA&8E!_EjwE% ztvgzuzR-VB{ZjX3)vIl>I zuc-&A!xMyw+4n*3S(EV}_&!{j!b}xSYfe9%F`eo7==5=NHei-HmpCstf8&$Nr}EE6 zpI_4)Xp{6n`r4OsUnRa4E@&;(FIq2-Ecq@mmy;P1jJw}-zqPE`uS_w+SV-2@)lI84 z?7i%_Yrbo1YvVwyNx1hh0I;+KHiKw@8-PP3K}_&7mN0}!{YslcQ~=obb|?TOd4C5F z9K5j~tegV+Dc|wO&)=|HkpJNZd2T^};f4aYV879vZfnDUF#zQh$oEeu6b3`UVPHXW zalsMXNN#RUMWOk4P$*tBH#ZMI4=>+3u%LJZ1o_tqa%j$vaJqxN5O6qR9f}*p;rM4| z?KvRG4F&xt7-Rzg6@vVH-E(h7%&1ap}3-3cE_{L=SY*6t^A?JcUAwiLaNC+^D3i zvT3uH_BI_|J$>WdCZ=ZQ7JCjJvbD1Zp&r5A^xV=ql)}~nG|{7hooF#dt?`X?j%wdE`+JI=`XSAJRqQvth5%j|1T-E@ z5WoR!(sW)jpz{CMe=r93jlDwxhL2Qb5vI>r0`_^&Fbz2^w>bom* zK`Zv1hT^NIab9U6rfI%ouVy{maz^FxQ$`r^PJFSe*cx!kiWS&*%R*bMynAcv%lTIF ztzZm8A+-90-~Li+>w{4l!L3G^_)GQ+mbce{Iw=;8FWtqeDacYieDmW6IgB9kY236& z4J!d4>5AAdkk){8AvDib-YWcs`@RG=_vrYy`=@5Iu~`y9FFf7=Bm*t`Pa~8y0Pfc> zSA{gAyW8`hKYx{+^YkFtmcy9Lt5eJhay%a1)@%B{139TCx|EcRJJLR+P)~pImZ7;a zdB}5F#p#=U+lT_gg3e!`sUcQ9?&A6)MH3#d9R_8 z3!jG7c-FfZy6hzg<5huIWNjHqrt(_hJJ;7!=u%UM47>|VZ8agrAlkB~ifF~_>b(?* zS?m|Qyq-l|@nY;{3P!JE9CU+pvor{#ld}9n>PLA8S;ScbK4r^pH9ILDEYbYZ5!Dk3 zxA^OF5->EgR=d4Uqh}nyxy8Cy#fPo*Plv_g#&R%aQ*raumW25by`I43%~H6VC%a96 zi1s8yA=Y-#NUf+XOHIJ^XlkhlKgrGblt}0vh%sWak zvBbw$kK9jBd=q_*PF&i+kfA%)kA0LCFMU{>p*$}}=kj5TKv;xMe8n1o!Hs3OYIKBP zpB)^(+0h%!KI}XE88U;X(CLS+5tK1!J51M%Y6(zay3l|FMxA-;l&L?G;|27=I z49gFFA1*Jeq12uq>O!e2ht}t*TWGHkm{?Msel&@mdEikW>mc#OEr$Dr$;n+3EnTsO z5Sm7Vzc_0*J)|UcJXLbpy832)(fJKV?ayL5W8SO*G>bRJ)=cCXLsb_kuXUKYO+Duy zYcr8Fv!z1}d)nUmZFX7f;s{E&g@EOYyLn0%-<;ICcQ@`3mrVy6pyLuo%a$87;osu}#*O3>2bByS8u@k4ImDy0#FR!@Bm(^wM!h;&A?TMjJ2))X!%}^vgSKtqp-_mUEoL%tDX(@R18q1%~q&~Qk zmgn8Ssi6Gyym;c)Qt|Cy@jZoePngmSkhV*mEu!x) z{GjK&$#slcLC~DDvp`t zcZ45B9eU^d=w`m>1?O5^r(J~@ zuV|UpwDz;*%&1FQ8%kSSdE{H*l5DFrz=wYj(}XLdG!@tTD&;f?zijTCJTwp64l}|C zcK(B9Vc(4@!_Cc5DQTlp3-iKerPmgEuUSqucUOQ@-PM-XGCuNzZb1EzG46usA{G}{ z_pWPd>#%ZU*N_M~gJDLi*=)#w)5iM;!cTn^jjDdhH>gnH1?w{eqIqbA&)ZK)dL~BW z2)x3I*rjW`QriaJXSmY;fp~wly6sQ1NDT3DtMeqdHjbBZs#)SgxYJzMWvTSiI>a+7 zxMwM?0p4kY-AyDQM(3lxQYk^x`@vQzgVaJ|N%)6aPx4&ZQuAtNF#nM7n9OR~P-C`S zMM8F0!0Aw8${09< zNTlmD)dW^Pi;kPW==CktO71KE5x`{)JclK>buJX|5N-&Kbcx@@_2B6)-A+>gI9h)9 z@9z44mk+|tn=g35Oq(&f25_mZruneKXnnI(|M>Drm&hibxA|MXZa8m2rMMGy9J=l= zQus!^!)W+)Stux()pQG*tn#1g#}gy52JML>h+g)FXxGlCTW&kP3JVGgEUFOKg@45l zYRnbU%*+`Znb>JbzB`xfR#JwsBf8F8^`t*gI8Y*|jI@+U3851j#iVW}O_qKYK6TQB zWPC5zdULD@FQ5YP`Y*XV-!hhp84CH)zN?oPR}r6HVpC1juFbtIIqbY{3%kbs>Z4#`Ya#*?Nwo3=R`bV3fdoRnRpQ8XEBgL zWR^<}pT`K4} zGk_QE_zyg!f96qQ8!29xgdzVX%3x+=wg{!lA}h-5%U*SJAL*mdD$`@#H%GvabRcQB z=~3hCJGAbJ(KFGTii~J`y+fyS6E!tYxO#9Y|SG>ku+t1-}HFUVd)1miJU?7pHuzIFecqgrJNtV`}^M1X5$%8Azb0zB> zj!~|W2JFXuD8eK^3a_Jfbyi!~xaakA=Qh0|5h5+)9X%88`^a0T??mUt4MStK{#(=R z7jK>Md1-`UiEQ#8h-#7~T{u=-QR)4FR;_1~#n#b&qj^%QsV4DSkd%pb`MeZ%ohctF za;PHSF(;9HU&)$o#iIZl-9R~SHCzm8#7ps`h&ZZMC$@bWFHAZIUH>80P~(4xn5EvR z$3637u8+(`Vw7TWB+^(~4qC!zaSb?QUs+t9F8VY+=rg`{kygbLo_H?Ez_3wY$4^Xh zPd$s@HzgCe6(8L3s}J*cw%H%y!N*}}4!8u~zDQ&v7Hd0%N~Rj=Es;kf8BT08{}?yx z1h^Q!(T%>uXAJH-W_*Mj_S;1Wn?hZ0wC;Hj>^ z2E34=sav5(KSHPvjM+2um)^q2Vhq~fOo2uC}2!m1M0H~un#Zfj}X5N{t-J+Lf3$? z)S-od@Y$v;z2VwJyn5vNJ*$qK7#pKthxpQaUww-$O9SY889g1yMH3S_J?oR+UjIbC zALQK?kiTM${0fHMxYGM?gOgvlv-urep716{$o^wLOZ0TpmRWq&hMCS6Ii*ITmt+$u zoBk*kxg2+dB1}%ijpfPmR)=wyxu`lb>3H$}+bl)8bgjs0?o({ZZnl#XzIm{nxhob| z^Ga{`ie>rp_uKc3UM<$1!l0tf#FN(m&m8n@I__%KHo?ld#cw8&JATL?{k=={SG1_( z7aK%I&=y^ku+IC{Hp=uOPZ?83QNP9bsc14NhbD@0VnH zD>Dw# z6O!4@3)dMHI6jAu0uRFr6I{$cr{nAPCl$5d4zIH6na}qssJ!WJcd)hY4auEUD&BP0 z5F67lvcAW#g99oY{4@vkY?1+{(0|75|Eo}cf%X5T5AVDqTWxED{ZRaCAr*Pgqftlf z=`WZe(FZcA{`39Rl#0h&4-YwO{q!|GL6@9$od=(`biq%)#;*9Iy;_S6qahp@T;k>(wzh&H^^ljwaz_HWTknvCz~Gw73H5nOAVaq6< zonCD7V|8k$&sihEumwvr6V#7F5A7e%&J4S0*y#88Pz+C0KS#f&&!B#dl(ZOmy6YW- zcC~lIHCObWzi5iM{O8+4u-<1A5eV}cc&Oi4%_o&DGRg65Im$46R6Fe|3pR~ik+I{A zyL2kwT@YW7Z19)<_}%mI8d2^nxx?{%?BAxIi;W=9Wr88mci&y61-{6xC63EoNfm-iyRvG)r!ZN}S23ssFkZ{F zW%+d(qGDdIu%CrRiPq*Vy}sh*#M@@Jo;*RMTAdFeoyife$Pu2^Iq>f7ySHVZLfatQ zt&zx{_ltjJU~)H^p=>pOFo;H+SS2S^Jn6&pe!O_*twHo%i)P|ivHOGX+TDuk!h97> zw(pma*w4Ko7FR2Su`TOk>3H6A*q1T%cDG_`&wBw=;vR|=Wh@I{DVlShEjh%}r2FL+ zlO1mD^~~DuZu4Bae=b)3l0YE$SO@g~dNl3)O79I$XG=Zp)%akp=1bKyp9=tB+Ii-- ziZ=kgU!n>R@3T-~RAD?bzCzSD@*CRusb-L5Ha9gEx0N!MH(FuY-i%LMb`|T?IQ(?$ zotFfo)GyUY3G!>lvWT!9?7|)IUZ<*lsrEdkrLRESKetgKF zK0tgTIu%>=wlz18@$dN_+8RnRTFo_t3^?EEv7que*s71I>$tCbOrF?Zdv*01c)CzT zSrEo(Au)2t!i$3Pml|rzG9}ehV6(rj+;Y$e+2!q(R`^3YLU9RlZ#V%kX)O03;h$+0|q_3-c~1Dl{0(Xamu51g!KV%YtLn^teK)egsnX|dO5+lt%0Zt;?MpUi$} z$QSKF%WTHS*O1OW-FkQUZGI=>qISUHb$W1nT1&@=+PACeoLHwAyKN1;n2dV*_zA7? z5hUn%+n%`WTh_>>ohIS9=ae)yk}*ZQ*U%^{(KCN1%b_l7ID91a{7%u&f9lr%19vJM z*J8zag9Po~8qg@K)H9!#rSc*fe8v2EgbIu>q0x*-MN2aF-VMLrIF$PAk+GoHgeT<2 zL@XCcc@3yU&IeI*h7_p1V>&@Q$IonZBl_GAP0vQ%UaDSwxcz&4`^knc-{adR75A#a z_;xy8a8d7vJU+-m%iIieU-;-4f0L6MVRw%o-tsVVNcD9Rp(KJzDY6<2TWY59&-08) z*;i7k9@3%B@TH69FuxXEaB4r}86R!@EDq)YdJCS7yEuN{UvtW6;QTJwkp<9EeS1n` zCtM&>a4$ZUlj9JnYH&3Ga~vozBbu_OKi1*mo$N(?c9A+qmqx9VJm{egkrHVp_neG-#Z{_i8kswc!mr_;> zwtr9cER{a^r~{^YlIE6<8iT2x6Rrp8!ql*oTIKMMpIzy855n%gvy%6*ke3gPM1LLn zgJ1i5XY#M;GVh2Gx05n&^1nE>rCtv95g;zKEZKqQOiDNi`TFj7SE%W^R? zz%wf;M!ljhddvNhndP5!Lj+$M=`N9nGzKYbbjw}uHQ)&7F*T(e3<``Zv=FxvK6~OWtqSmruZgyl)4VA*PJwW`^X2V{mHKS2MWOh=wLN(X zrgblV_!I%Abzd1&T4+1|v&iJ1T6#KAztaSW^lw-LQbr6J-c)mK4Rm;tb@!dKr@77_ z6=92hzk`5&MO{T6DDPq`Ii}iMjXRFV&}1tZxnLZ^6N4i8j>e6O-j|akC9C>qCvfbe3R%=eO-8Sz+5u)}9!wCe( zp$v}@zshWtr#(IsxQ~8{s@yCu7*jQm0yPu?or!U8HJ@5}FD_HyB2{>F2A?|ufHUzl zyFFXCDn)ivMYposOXr8qF~N{!OVKGqX+{O@Yg1^EdJ^@)hHp-v<{lr+>3cE&M)`q; zAkH0wkh)tuS_h!~yZC;e&@?xfF&6>KZN2@~GsEJL(U; z0d96;%jbn#{3FCwC-Aa`V-#~1ylmlKevyluVW<`}Oo7#k3^?-{H;L&icfLQFJ!1VP zryh*cCgZE@Tl~*f+4F=^Q{EW18M6yUcHPD#M4v61%>wU#Y-}sK>jK{YQ0;1U$S}f` z;laeg{aTIwMeH+;@tb$M7TC6aQlAB9zu!U72g zo~2RdXPCRgUA6Z5ON=_-I~Viq6-l2_3+9^~!6>Zg>4_^TP_w%a3JTBpdAeGjgn?$P za}Q}%Ywg>vEZQ(}&kziDf#~LJIff3oSZBrcv> z6&(`xCVG{c!@we2)Q+PRy03KaYYTm(u>p*BfNtw{8)jror>sh9*Hm*@-^&I}bs*(s zZ73bnL^%_Kt&Rw37d^iGdJTv=*&xlXm=dw(I$QFoL@Ib$c;88v7xxzaEwuHwH?aTj J_QR|V{y%-qsR#f7 literal 0 HcmV?d00001 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} }; From 7ef9e25384aaeff39810faa7d50d797bc47b6814 Mon Sep 17 00:00:00 2001 From: Jens Verwiebe Date: Tue, 5 Feb 2013 18:24:26 +0000 Subject: [PATCH 151/227] OSX/cmake: Fix ypthn version for module compile --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ace3803e0d8..e948d0e76a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1481,11 +1481,11 @@ elseif(APPLE) # module must be compiled against Python framework # normally cached but not since we include them with blender - set(PYTHON_VERSION 3.2) + set(PYTHON_VERSION 3.3) set(PYTHON_INCLUDE_DIR "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/include/python${PYTHON_VERSION}m") set(PYTHON_BINARY "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/bin/python${PYTHON_VERSION}") #set(PYTHON_LIBRARY python${PYTHON_VERSION}) - set(PYTHON_LIBPATH "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config-3.2m") + set(PYTHON_LIBPATH "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config-3.3m") #set(PYTHON_LINKFLAGS "-u _PyMac_Error -framework Python") # won't build with this enabled endif() From 98ecb723793eb2fabbda54cb1e2a6653b9ab360c Mon Sep 17 00:00:00 2001 From: Jens Verwiebe Date: Tue, 5 Feb 2013 19:49:53 +0000 Subject: [PATCH 152/227] OSX/cmake/scons: python version foolproof --- CMakeLists.txt | 2 +- build_files/scons/config/darwin-config.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e948d0e76a8..eea86a38521 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1485,7 +1485,7 @@ elseif(APPLE) set(PYTHON_INCLUDE_DIR "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/include/python${PYTHON_VERSION}m") set(PYTHON_BINARY "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/bin/python${PYTHON_VERSION}") #set(PYTHON_LIBRARY python${PYTHON_VERSION}) - set(PYTHON_LIBPATH "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config-3.3m") + set(PYTHON_LIBPATH "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}m") #set(PYTHON_LINKFLAGS "-u _PyMac_Error -framework Python") # won't build with this enabled endif() diff --git a/build_files/scons/config/darwin-config.py b/build_files/scons/config/darwin-config.py index 207ddd3579b..5c0e13a9443 100644 --- a/build_files/scons/config/darwin-config.py +++ b/build_files/scons/config/darwin-config.py @@ -137,7 +137,7 @@ else: BF_PYTHON_INC = '${BF_PYTHON}${BF_PYTHON_VERSION}/include/python${BF_PYTHON_VERSION}m' BF_PYTHON_BINARY = '${BF_PYTHON}${BF_PYTHON_VERSION}/bin/python${BF_PYTHON_VERSION}' #BF_PYTHON_LIB = '' - BF_PYTHON_LIBPATH = '${BF_PYTHON}${BF_PYTHON_VERSION}/lib/python${BF_PYTHON_VERSION}/config-3.2m' + BF_PYTHON_LIBPATH = '${BF_PYTHON}${BF_PYTHON_VERSION}/lib/python${BF_PYTHON_VERSION}/config-${BF_PYTHON_VERSION}m' WITH_BF_OPENAL = True #different lib must be used following version of gcc From 6afecfe579b1e6caa13427dfa2c4291590d9901d Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Tue, 5 Feb 2013 21:51:15 +0000 Subject: [PATCH 153/227] rigidbody: Don't use units for spring stiffness --- source/blender/makesrna/intern/rna_rigidbody.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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); From aa02ca126b327c701d5f019d61f00398bcd6c932 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Tue, 5 Feb 2013 21:51:17 +0000 Subject: [PATCH 154/227] rigidbody: Invert spring damping range Before 1 was no damping, which is inconsistent with the rest of the simulation. --- intern/rigidbody/rb_bullet_api.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp index c4a4532bad1..4a3367ad768 100644 --- a/intern/rigidbody/rb_bullet_api.cpp +++ b/intern/rigidbody/rb_bullet_api.cpp @@ -915,7 +915,8 @@ void RB_constraint_set_damping_6dof_spring(rbConstraint *con, float axis, float { btGeneric6DofSpringConstraint *constraint = reinterpret_cast(con); - constraint->setDamping(axis, damping); + // invert damping range so that 0 = no damping + constraint->setDamping(axis, 1.0f - damping); } void RB_constraint_set_spring_6dof_spring(rbConstraint *con, float axis, int enable) From 83b8cbeab1584581b0601941e2b0581a209bb88b Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Tue, 5 Feb 2013 21:51:18 +0000 Subject: [PATCH 155/227] rigidbody: Code cleanup Stupid oversight, don't use floats for indices. --- intern/rigidbody/RBI_api.h | 8 ++++---- intern/rigidbody/rb_bullet_api.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h index ee5006f2838..9dde2cc3049 100644 --- a/intern/rigidbody/RBI_api.h +++ b/intern/rigidbody/RBI_api.h @@ -284,12 +284,12 @@ extern void RB_constraint_set_enabled(rbConstraint *con, int enabled); 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); +extern void RB_constraint_set_limits_6dof(rbConstraint *con, int 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_stiffness_6dof_spring(rbConstraint *con, int axis, float stiffness); +extern void RB_constraint_set_damping_6dof_spring(rbConstraint *con, int axis, float damping); +extern void RB_constraint_set_spring_6dof_spring(rbConstraint *con, int 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 diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp index 4a3367ad768..58345d4e08c 100644 --- a/intern/rigidbody/rb_bullet_api.cpp +++ b/intern/rigidbody/rb_bullet_api.cpp @@ -897,21 +897,21 @@ void RB_constraint_set_limits_piston(rbConstraint *con, float lin_lower, float l constraint->setUpperAngLimit(ang_upper); } -void RB_constraint_set_limits_6dof(rbConstraint *con, float axis, float lower, float upper) +void RB_constraint_set_limits_6dof(rbConstraint *con, int 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) +void RB_constraint_set_stiffness_6dof_spring(rbConstraint *con, int 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) +void RB_constraint_set_damping_6dof_spring(rbConstraint *con, int axis, float damping) { btGeneric6DofSpringConstraint *constraint = reinterpret_cast(con); @@ -919,7 +919,7 @@ void RB_constraint_set_damping_6dof_spring(rbConstraint *con, float axis, float constraint->setDamping(axis, 1.0f - damping); } -void RB_constraint_set_spring_6dof_spring(rbConstraint *con, float axis, int enable) +void RB_constraint_set_spring_6dof_spring(rbConstraint *con, int axis, int enable) { btGeneric6DofSpringConstraint *constraint = reinterpret_cast(con); From b64858cade5b604b88df23d47b2c25f6e992da47 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Tue, 5 Feb 2013 21:51:20 +0000 Subject: [PATCH 156/227] rigidbody: Use ARROWS empty draw type when creating constraints Since we don't have constraint visualization yet, it's useful to see where the individual axes point. --- release/scripts/startup/bl_operators/rigidbody.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_operators/rigidbody.py b/release/scripts/startup/bl_operators/rigidbody.py index 94465fa6561..161349152d5 100644 --- a/release/scripts/startup/bl_operators/rigidbody.py +++ b/release/scripts/startup/bl_operators/rigidbody.py @@ -234,7 +234,9 @@ class ConnectRigidBodies(Operator): loc = (obj_act.location + obj.location) / 2.0 bpy.ops.object.add(type='EMPTY', view_align=False, enter_editmode=False, location=loc) bpy.ops.rigidbody.constraint_add() - con = context.active_object.rigid_body_constraint + con_obj = context.active_object + con_obj.empty_draw_type = 'ARROWS' + con = con_obj.rigid_body_constraint con.type = self.con_type con.object1 = obj_act con.object2 = obj From f40dc450543bd3a812332a6d45bcf0b0a63a8f62 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 00:48:17 +0000 Subject: [PATCH 157/227] 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(-) 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; From 2c1219dc179567bb3fe6454584196fd1d8646225 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 01:28:56 +0000 Subject: [PATCH 158/227] enable xinerama for scons. --- build_files/scons/config/freebsd7-config.py | 4 ++-- build_files/scons/config/freebsd8-config.py | 4 ++-- build_files/scons/config/freebsd9-config.py | 4 ++-- build_files/scons/config/linux-config.py | 4 ++-- intern/ghost/SConscript | 1 + 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/build_files/scons/config/freebsd7-config.py b/build_files/scons/config/freebsd7-config.py index 02c9093567a..f02ba686b43 100644 --- a/build_files/scons/config/freebsd7-config.py +++ b/build_files/scons/config/freebsd7-config.py @@ -139,9 +139,9 @@ BF_REDCODE_LIBPATH='${BF_REDCODE}/lib' WITH_BF_STATICOPENGL = False BF_OPENGL = '/usr/local' BF_OPENGL_INC = '${BF_OPENGL}/include' -BF_OPENGL_LIB = 'GL GLU X11 Xi' +BF_OPENGL_LIB = 'GL GLU X11 Xi Xinerama' BF_OPENGL_LIBPATH = '/usr/X11R6/lib' -BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a' +BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libXinerama.a' WITH_BF_COLLADA = False BF_COLLADA = '#source/blender/collada' diff --git a/build_files/scons/config/freebsd8-config.py b/build_files/scons/config/freebsd8-config.py index 5d3308c50d4..e7727848f19 100644 --- a/build_files/scons/config/freebsd8-config.py +++ b/build_files/scons/config/freebsd8-config.py @@ -139,9 +139,9 @@ BF_REDCODE_LIBPATH='${BF_REDCODE}/lib' WITH_BF_STATICOPENGL = False BF_OPENGL = '/usr/local' BF_OPENGL_INC = '${BF_OPENGL}/include' -BF_OPENGL_LIB = 'GL GLU X11 Xi' +BF_OPENGL_LIB = 'GL GLU X11 Xi Xinerama' BF_OPENGL_LIBPATH = '/usr/X11R6/lib' -BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a' +BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libXinerama.a' WITH_BF_COLLADA = False BF_COLLADA = '#source/blender/collada' diff --git a/build_files/scons/config/freebsd9-config.py b/build_files/scons/config/freebsd9-config.py index 98c2c8fa500..c3f90d463b8 100644 --- a/build_files/scons/config/freebsd9-config.py +++ b/build_files/scons/config/freebsd9-config.py @@ -139,9 +139,9 @@ BF_REDCODE_LIBPATH='${BF_REDCODE}/lib' WITH_BF_STATICOPENGL = False BF_OPENGL = '/usr/local' BF_OPENGL_INC = '${BF_OPENGL}/include' -BF_OPENGL_LIB = 'GL GLU X11 Xi' +BF_OPENGL_LIB = 'GL GLU X11 Xi Xinerama' BF_OPENGL_LIBPATH = '/usr/X11R6/lib' -BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a' +BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libXinerama.a' WITH_BF_COLLADA = False BF_COLLADA = '#source/blender/collada' diff --git a/build_files/scons/config/linux-config.py b/build_files/scons/config/linux-config.py index 068273e35ef..701b4b26e1c 100644 --- a/build_files/scons/config/linux-config.py +++ b/build_files/scons/config/linux-config.py @@ -151,9 +151,9 @@ BF_REDCODE_LIBPATH='${BF_REDCODE}/lib' WITH_BF_STATICOPENGL = False BF_OPENGL = '/usr' BF_OPENGL_INC = '${BF_OPENGL}/include' -BF_OPENGL_LIB = 'GL GLU X11 Xi' +BF_OPENGL_LIB = 'GL GLU X11 Xi Xinerama' BF_OPENGL_LIBPATH = '/usr/X11R6/lib' -BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a' +BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libXinerama.a' WITH_BF_COLLADA = False BF_COLLADA = '#source/blender/collada' diff --git a/intern/ghost/SConscript b/intern/ghost/SConscript index 7e142c4aeab..8b5b1a82cff 100644 --- a/intern/ghost/SConscript +++ b/intern/ghost/SConscript @@ -67,6 +67,7 @@ elif window_system in ('linux', 'openbsd3', 'sunos5', 'freebsd7', 'freebsd8', 'f ## just dont use the PREFIX. # defs += ['PREFIX=\\"/usr/local/\\"'] # XXX, make an option defs += ['WITH_X11_XINPUT'] # XXX, make an option + defs += ['WITH_X11_XINERAMA'] # freebsd doesn't seem to support XDND protocol if env['WITH_GHOST_XDND'] and window_system not in ('freebsd7', 'freebsd8', 'freebsd9'): From 6ff014a7fe2621da897c7511fe100ea5ff2af2a9 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Wed, 6 Feb 2013 01:36:23 +0000 Subject: [PATCH 159/227] 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. --- .../blender/editors/armature/editarmature.c | 101 +++++++++++------- 1 file changed, 63 insertions(+), 38 deletions(-) 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); From 441c7fb79a83b7d6f9e86cd2a3b0c8eaeec6d07c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 02:48:03 +0000 Subject: [PATCH 160/227] fix for crashes running some operators in background mode and some divide by zero errors. --- source/blender/blenkernel/intern/curve.c | 4 ++- .../blender/editors/armature/editarmature.c | 4 ++- source/blender/editors/mesh/editmesh_tools.c | 8 +++-- source/blender/editors/object/object_add.c | 9 ++++-- .../blender/editors/object/object_transform.c | 8 +++-- source/blender/editors/space_info/info_ops.c | 6 ++-- source/blender/editors/transform/transform.c | 30 +++++++++++++------ .../blender/render/intern/source/rayshade.c | 8 +++-- 8 files changed, 52 insertions(+), 25 deletions(-) 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); From a78cf854b4c811d5df24d10cf3b9a0d9d6679ca0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 04:16:28 +0000 Subject: [PATCH 161/227] add missing bullet header to cmake, quiet reports from 'make test_cmake' --- .../cmake/cmake_consistency_check_config.py | 21 +++++++++++++++++++ extern/bullet2/CMakeLists.txt | 5 +++-- intern/cycles/device/CMakeLists.txt | 4 +++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/build_files/cmake/cmake_consistency_check_config.py b/build_files/cmake/cmake_consistency_check_config.py index 6b82e224a32..55bad251a53 100644 --- a/build_files/cmake/cmake_consistency_check_config.py +++ b/build_files/cmake/cmake_consistency_check_config.py @@ -29,6 +29,22 @@ IGNORE = ( "extern/recastnavigation/Recast/Source/RecastTimer.cpp", "intern/audaspace/SRC/AUD_SRCResampleFactory.cpp", "intern/audaspace/SRC/AUD_SRCResampleReader.cpp", + "intern/cycles/render/film_response.cpp", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_2_2.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_2_3.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_2_4.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_2_d.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_3_3.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_3_4.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_3_9.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_3_d.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_4_3.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_4_4.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_2_4_d.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_4_4_2.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_4_4_3.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_4_4_4.cc", + "extern/libmv/third_party/ceres/internal/ceres/generated/schur_eliminator_4_4_d.cc", "extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h", "extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h", @@ -47,6 +63,11 @@ IGNORE = ( "extern/recastnavigation/Recast/Include/RecastTimer.h", "intern/audaspace/SRC/AUD_SRCResampleFactory.h", "intern/audaspace/SRC/AUD_SRCResampleReader.h", + "intern/cycles/render/film_response.h", + "extern/carve/include/carve/config.h", + "extern/carve/include/carve/external/boost/random.hpp", + "extern/carve/patches/files/config.h", + "extern/carve/patches/files/random.hpp", ) UTF8_CHECK = True diff --git a/extern/bullet2/CMakeLists.txt b/extern/bullet2/CMakeLists.txt index c57474f99f2..3d757947980 100644 --- a/extern/bullet2/CMakeLists.txt +++ b/extern/bullet2/CMakeLists.txt @@ -242,14 +242,15 @@ set(SRC src/BulletCollision/CollisionShapes/btUniformScalingShape.h src/BulletCollision/Gimpact/btBoxCollision.h src/BulletCollision/Gimpact/btClipPolygon.h + src/BulletCollision/Gimpact/btCompoundFromGimpact.h src/BulletCollision/Gimpact/btContactProcessing.h - src/BulletCollision/Gimpact/btGenericPoolAllocator.h - src/BulletCollision/Gimpact/btGeometryOperations.h src/BulletCollision/Gimpact/btGImpactBvh.h src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h src/BulletCollision/Gimpact/btGImpactMassUtil.h src/BulletCollision/Gimpact/btGImpactQuantizedBvh.h src/BulletCollision/Gimpact/btGImpactShape.h + src/BulletCollision/Gimpact/btGenericPoolAllocator.h + src/BulletCollision/Gimpact/btGeometryOperations.h src/BulletCollision/Gimpact/btQuantization.h src/BulletCollision/Gimpact/btTriangleShapeEx.h src/BulletCollision/Gimpact/gim_array.h diff --git a/intern/cycles/device/CMakeLists.txt b/intern/cycles/device/CMakeLists.txt index 661d43ab036..fe2368b7ea8 100644 --- a/intern/cycles/device/CMakeLists.txt +++ b/intern/cycles/device/CMakeLists.txt @@ -23,7 +23,9 @@ set(SRC ) if(WITH_NETWORK) - list(APPEND SRC device_network.cpp) + list(APPEND SRC + device_network.cpp + ) endif() set(SRC_HEADERS From 23bf087338204b45e5b72c1269bd013a88cf3f9d Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Wed, 6 Feb 2013 08:40:12 +0000 Subject: [PATCH 162/227] 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 + .../compositor/nodes/COM_TranslateNode.cpp | 13 +- .../operations/COM_TranslateOperation.cpp | 105 ---------------- .../operations/COM_TranslateOperation.h | 5 - .../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 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} }; From 2ea0826e7f8d1677e696df9097cb2322025a3b9a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 11:24:13 +0000 Subject: [PATCH 163/227] 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(-) 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) From f0ce8a563d71a659c6ed0398b8bf3c51a8109cd0 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 6 Feb 2013 12:16:53 +0000 Subject: [PATCH 164/227] 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(-) 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 */ { From c80db5878b799890895fca7d595c830dd63603eb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 13:07:45 +0000 Subject: [PATCH 165/227] 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(-) 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) { From 12ef1b63e255b7387f7432d3266c33adcca5258c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 13:14:11 +0000 Subject: [PATCH 166/227] 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(-) 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(); From 8b1fb0fd2aac4a393cca8bb4e9fa21dc5f53cced Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 6 Feb 2013 13:59:54 +0000 Subject: [PATCH 167/227] 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. --- .../blender/editors/space_node/node_group.c | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) 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 */ From 296444e1dc28db95642ab5a804b9b0df606a4725 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 14:02:19 +0000 Subject: [PATCH 168/227] style cleanup: some warnigs & spelling. --- intern/cycles/render/session.cpp | 2 +- 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 +- 16 files changed, 20 insertions(+), 17 deletions(-) diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index e49a4a3ed34..d87f84511b5 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -552,7 +552,7 @@ void Session::run_cpu() } else if(need_tonemap) { /* tonemap only if we do not reset, we don't we don't - * wan't to show the result of an incomplete sample*/ + * want to show the result of an incomplete sample*/ tonemap(); } 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 From c30fb009ccf23cd9dc78d342ebddc2286594c88a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Feb 2013 15:57:12 +0000 Subject: [PATCH 169/227] 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(-) 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); From a85355fdb9c8f6eefde27d7bc258efccd7bd79eb Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Feb 2013 20:49:33 +0000 Subject: [PATCH 170/227] 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(-) 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); } From d686b1c20f1f5bb3cc587399b0a8dc073bf3b218 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Feb 2013 21:32:34 +0000 Subject: [PATCH 171/227] Fix small memory leak in cycles tile render, a few bytes for each tile. Reported by "aquo" on IRC. --- intern/cycles/render/session.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index d87f84511b5..94cb69102d2 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -381,7 +381,7 @@ bool Session::acquire_tile(Device *tile_device, RenderTile& rtile) buffer_params.get_offset_stride(rtile.offset, rtile.stride); - RenderBuffers *tilebuffers = new RenderBuffers(tile_device); + RenderBuffers *tilebuffers; /* allocate buffers */ if(params.progressive_refine) { From 8011cbc751cc8eb3e3355f1037a8609909a53ee9 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Wed, 6 Feb 2013 23:19:14 +0000 Subject: [PATCH 172/227] CUDA / sm_20: * Enable Lamp MIS again, it works on a GTX 570 (which is sm_20) with latest SVN. Tested by vitos1k in IRC:. Feedback from GTX 580 users would be appreciated on this. --- intern/cycles/kernel/kernel_types.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 2ef3d71dd1d..52bdddc72fb 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -44,7 +44,6 @@ CCL_NAMESPACE_BEGIN #define __KERNEL_SHADING__ #define __KERNEL_ADV_SHADING__ #define __NON_PROGRESSIVE__ -#define __LAMP_MIS__ #define __HAIR__ #ifdef WITH_OSL #define __OSL__ @@ -56,9 +55,6 @@ CCL_NAMESPACE_BEGIN #if __CUDA_ARCH__ >= 200 #define __KERNEL_ADV_SHADING__ #endif -#if __CUDA_ARCH__ >= 210 -#define __LAMP_MIS__ -#endif #endif #ifdef __KERNEL_OPENCL__ @@ -116,6 +112,7 @@ CCL_NAMESPACE_BEGIN #define __TRANSPARENT_SHADOWS__ #define __PASSES__ #define __BACKGROUND_MIS__ +#define __LAMP_MIS__ #define __AO__ #define __ANISOTROPIC__ #define __CAMERA_MOTION__ From 808c2d840e296ffb26750185b27a2eb94b9eee48 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 00:46:53 +0000 Subject: [PATCH 173/227] 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(-) 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) From 07a3ebbd38650223f2a3ea06cf5ff778bdb5662a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 02:03:31 +0000 Subject: [PATCH 174/227] 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 ++++++++------- .../blender/editors/interface/interface_regions.c | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) 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) { From 0152d11e0116251b3ac91cec85141988bae938ec Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 02:50:35 +0000 Subject: [PATCH 175/227] when using blender as a python module, force factory-startup --- source/creator/creator.c | 1 + 1 file changed, 1 insertion(+) 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 From 4b8fe80e6e5c62247f38dbfcf93c46246e719652 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 04:02:24 +0000 Subject: [PATCH 176/227] code cleanup: use exist_ok keyword arg to os.makedirs() rather then checking if the dir exists first. --- release/scripts/modules/bpy_extras/io_utils.py | 5 +---- release/scripts/startup/bl_operators/wm.py | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/release/scripts/modules/bpy_extras/io_utils.py b/release/scripts/modules/bpy_extras/io_utils.py index 21bad5ec1e4..dfb6c46ef87 100644 --- a/release/scripts/modules/bpy_extras/io_utils.py +++ b/release/scripts/modules/bpy_extras/io_utils.py @@ -436,10 +436,7 @@ def path_reference_copy(copy_set, report=print): pass else: dir_to = os.path.dirname(file_dst) - - if not os.path.isdir(dir_to): - os.makedirs(dir_to) - + os.makedirs(dir_to, exist_ok=True) shutil.copy(file_src, file_dst) diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 902cfdd418b..6ac61a9f5e7 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1740,8 +1740,7 @@ class WM_OT_addon_install(Operator): return {'CANCELLED'} # create dir is if missing. - if not os.path.exists(path_addons): - os.makedirs(path_addons) + os.makedirs(path_addons, exist_ok=True) # Check if we are installing from a target path, # doing so causes 2+ addons of same name or when the same from/to From 8d47c2a2086251cc329f7d11ca4b102022e225da Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 04:04:12 +0000 Subject: [PATCH 177/227] 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(-) 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) From d648e036199ebb95fdc88945fe15144db302c121 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 7 Feb 2013 07:24:02 +0000 Subject: [PATCH 178/227] 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(-) 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) From 67da51fe768d3a336fe3ac90b813f548f566f390 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 7 Feb 2013 07:24:22 +0000 Subject: [PATCH 179/227] 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(-) 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()); From 76b7afd909fc0b01214c37f4b3407309f60ccfba Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 14:10:01 +0000 Subject: [PATCH 180/227] removing xinerama on X11 dependency, this wasn't working very usefully. --- CMakeLists.txt | 11 ----- build_files/scons/config/freebsd7-config.py | 4 +- build_files/scons/config/freebsd8-config.py | 4 +- build_files/scons/config/freebsd9-config.py | 4 +- build_files/scons/config/linux-config.py | 4 +- intern/ghost/CMakeLists.txt | 7 --- intern/ghost/SConscript | 1 - intern/ghost/intern/GHOST_SystemX11.cpp | 48 ++------------------- 8 files changed, 11 insertions(+), 72 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eea86a38521..d208d730e1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -166,7 +166,6 @@ unset(PLATFORM_DEFAULT) if(UNIX AND NOT APPLE) option(WITH_X11_XINPUT "Enable X11 Xinput (tablet support and unicode input)" ON) - option(WITH_X11_XINERAMA "Enable multi-monitor support" ON) option(WITH_X11_XF86VMODE "Enable X11 video mode switching" ON) option(WITH_SYSTEM_GLEW "Use GLEW OpenGL wrapper library provided by the operating system" ON) @@ -431,7 +430,6 @@ if(WITH_GHOST_SDL OR WITH_HEADLESS) set(WITH_GHOST_XDND OFF) set(WITH_X11_XF86VMODE OFF) set(WITH_X11_XINPUT OFF) - set(WITH_X11_XINERAMA OFF) endif() if(MINGW) @@ -822,14 +820,6 @@ if(UNIX AND NOT APPLE) endif() endif() - if(WITH_X11_XINERAMA) - if(X11_Xinerama_LIB) - set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinerama_LIB}") - else() - set(WITH_X11_XINERAMA OFF) - endif() - endif() - if(WITH_X11_XF86VMODE) # XXX, why dont cmake make this available? FIND_LIBRARY(X11_Xxf86vmode_LIB Xxf86vm ${X11_LIB_SEARCH_PATH}) @@ -2162,7 +2152,6 @@ if(FIRST_RUN) info_cfg_option(WITH_INSTALL_PORTABLE) info_cfg_option(WITH_X11_XF86VMODE) info_cfg_option(WITH_X11_XINPUT) - info_cfg_option(WITH_X11_XINERAMA) info_cfg_option(WITH_MEM_JEMALLOC) info_cfg_option(WITH_SYSTEM_GLEW) info_cfg_option(WITH_SYSTEM_OPENJPEG) diff --git a/build_files/scons/config/freebsd7-config.py b/build_files/scons/config/freebsd7-config.py index f02ba686b43..02c9093567a 100644 --- a/build_files/scons/config/freebsd7-config.py +++ b/build_files/scons/config/freebsd7-config.py @@ -139,9 +139,9 @@ BF_REDCODE_LIBPATH='${BF_REDCODE}/lib' WITH_BF_STATICOPENGL = False BF_OPENGL = '/usr/local' BF_OPENGL_INC = '${BF_OPENGL}/include' -BF_OPENGL_LIB = 'GL GLU X11 Xi Xinerama' +BF_OPENGL_LIB = 'GL GLU X11 Xi' BF_OPENGL_LIBPATH = '/usr/X11R6/lib' -BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libXinerama.a' +BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a' WITH_BF_COLLADA = False BF_COLLADA = '#source/blender/collada' diff --git a/build_files/scons/config/freebsd8-config.py b/build_files/scons/config/freebsd8-config.py index e7727848f19..5d3308c50d4 100644 --- a/build_files/scons/config/freebsd8-config.py +++ b/build_files/scons/config/freebsd8-config.py @@ -139,9 +139,9 @@ BF_REDCODE_LIBPATH='${BF_REDCODE}/lib' WITH_BF_STATICOPENGL = False BF_OPENGL = '/usr/local' BF_OPENGL_INC = '${BF_OPENGL}/include' -BF_OPENGL_LIB = 'GL GLU X11 Xi Xinerama' +BF_OPENGL_LIB = 'GL GLU X11 Xi' BF_OPENGL_LIBPATH = '/usr/X11R6/lib' -BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libXinerama.a' +BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a' WITH_BF_COLLADA = False BF_COLLADA = '#source/blender/collada' diff --git a/build_files/scons/config/freebsd9-config.py b/build_files/scons/config/freebsd9-config.py index c3f90d463b8..98c2c8fa500 100644 --- a/build_files/scons/config/freebsd9-config.py +++ b/build_files/scons/config/freebsd9-config.py @@ -139,9 +139,9 @@ BF_REDCODE_LIBPATH='${BF_REDCODE}/lib' WITH_BF_STATICOPENGL = False BF_OPENGL = '/usr/local' BF_OPENGL_INC = '${BF_OPENGL}/include' -BF_OPENGL_LIB = 'GL GLU X11 Xi Xinerama' +BF_OPENGL_LIB = 'GL GLU X11 Xi' BF_OPENGL_LIBPATH = '/usr/X11R6/lib' -BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libXinerama.a' +BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a' WITH_BF_COLLADA = False BF_COLLADA = '#source/blender/collada' diff --git a/build_files/scons/config/linux-config.py b/build_files/scons/config/linux-config.py index 701b4b26e1c..068273e35ef 100644 --- a/build_files/scons/config/linux-config.py +++ b/build_files/scons/config/linux-config.py @@ -151,9 +151,9 @@ BF_REDCODE_LIBPATH='${BF_REDCODE}/lib' WITH_BF_STATICOPENGL = False BF_OPENGL = '/usr' BF_OPENGL_INC = '${BF_OPENGL}/include' -BF_OPENGL_LIB = 'GL GLU X11 Xi Xinerama' +BF_OPENGL_LIB = 'GL GLU X11 Xi' BF_OPENGL_LIBPATH = '/usr/X11R6/lib' -BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libXinerama.a' +BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a' WITH_BF_COLLADA = False BF_COLLADA = '#source/blender/collada' diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt index c6269d49b47..12dd4c0d3eb 100644 --- a/intern/ghost/CMakeLists.txt +++ b/intern/ghost/CMakeLists.txt @@ -276,13 +276,6 @@ elseif(UNIX) ) endif() - if(WITH_X11_XINERAMA) - add_definitions(-DWITH_X11_XINERAMA) - list(APPEND INC_SYS - ${X11_Xinerama_INCLUDE_PATH} - ) - endif() - elseif(WIN32) ## Warnings as errors, this is too strict! #if(MSVC) diff --git a/intern/ghost/SConscript b/intern/ghost/SConscript index 8b5b1a82cff..7e142c4aeab 100644 --- a/intern/ghost/SConscript +++ b/intern/ghost/SConscript @@ -67,7 +67,6 @@ elif window_system in ('linux', 'openbsd3', 'sunos5', 'freebsd7', 'freebsd8', 'f ## just dont use the PREFIX. # defs += ['PREFIX=\\"/usr/local/\\"'] # XXX, make an option defs += ['WITH_X11_XINPUT'] # XXX, make an option - defs += ['WITH_X11_XINERAMA'] # freebsd doesn't seem to support XDND protocol if env['WITH_GHOST_XDND'] and window_system not in ('freebsd7', 'freebsd8', 'freebsd9'): diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 661f5e70dc6..7ba8889fd1e 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -50,10 +50,6 @@ # include "GHOST_DropTargetX11.h" #endif -#ifdef WITH_X11_XINERAMA -# include "X11/extensions/Xinerama.h" -#endif - #include "GHOST_Debug.h" #include @@ -241,47 +237,9 @@ getMainDisplayDimensions( GHOST_TUns32& height) const { if (m_display) { - -#ifdef WITH_X11_XINERAMA - GHOST_TInt32 m_x = 1, m_y = 1; - getCursorPosition(m_x, m_y); - - /* NOTE, no way to select a primary monitor, uses the first */ - bool success = false; - int dummy1, dummy2; - if (XineramaQueryExtension(m_display, &dummy1, &dummy2)) { - if (XineramaIsActive(m_display)) { - int heads = 0; - XineramaScreenInfo *p = XineramaQueryScreens(m_display, &heads); - /* with a single head, all dimensions is fine */ - if (heads > 1) { - int i; - for (i = 0; i < heads; i++) { - if ((m_x >= p[i].x_org) && (m_x <= p[i].x_org + p[i].width) && - (m_y >= p[i].y_org) && (m_y <= p[i].y_org + p[i].height)) - { - width = p[i].width; - height = p[i].height; - break; - } - } - /* highly unlikely! */ - if (i == heads) { - width = p[0].width; - height = p[0].height; - } - success = true; - } - XFree(p); - } - } - - if (success) { - return; - } -#endif - - /* fallback to all */ + /* note, for this to work as documented, + * we would need to use Xinerama check r54370 for code that did thia, + * we've since removed since its not worth the extra dep - campbell */ getAllDisplayDimensions(width, height); } } From 95bca1c6bc379c073c0d933d72aeff7bcfdd2563 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 7 Feb 2013 14:15:30 +0000 Subject: [PATCH 181/227] 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(-) 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) From 3a31e1ef27d48ed2841ae863754bf17d954ece35 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2013 14:41:08 +0000 Subject: [PATCH 182/227] 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. --- .../blender/windowmanager/intern/wm_window.c | 20 ++++++++++++++++++- source/blender/windowmanager/wm_window.h | 6 ++++++ 2 files changed, 25 insertions(+), 1 deletion(-) 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__ */ From 7cb62127b36d82182642043c57ced97d7f804a69 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 7 Feb 2013 15:36:59 +0000 Subject: [PATCH 183/227] 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 +- .../render/intern/source/imagetexture.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) 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; From faaee15407767812d0fc40adb5256e9d2919c35d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 7 Feb 2013 21:29:31 +0000 Subject: [PATCH 184/227] 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(-) 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; } From dbcf735636ad777db721532e30ea7a5050a17b86 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 00:27:35 +0000 Subject: [PATCH 185/227] fix warning message when imported Collada nodes have < 3 edges. --- source/blender/collada/MeshImporter.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) 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; } From 286d67b7145801fac588894b60a84ca0672ab2a9 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 00:28:58 +0000 Subject: [PATCH 186/227] 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(-) 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); } From cef952a750d86fe823bc0805032637f7a07394f5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 8 Feb 2013 04:43:36 +0000 Subject: [PATCH 187/227] 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(-) 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) { From 52df65b137ebcebb2b693a905cb4ee49a6d8fbcb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 8 Feb 2013 08:02:05 +0000 Subject: [PATCH 188/227] building ghost-sdl works again. --- intern/ghost/intern/GHOST_SystemSDL.cpp | 14 ++++++++++++++ intern/ghost/intern/GHOST_SystemSDL.h | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/intern/ghost/intern/GHOST_SystemSDL.cpp b/intern/ghost/intern/GHOST_SystemSDL.cpp index fdc4f33b784..da1836d88a0 100644 --- a/intern/ghost/intern/GHOST_SystemSDL.cpp +++ b/intern/ghost/intern/GHOST_SystemSDL.cpp @@ -114,6 +114,20 @@ GHOST_SystemSDL::init() { return GHOST_kFailure; } +/** + * Returns the dimensions of the main display on this system. + * \return The dimension of the main display. + */ +void +GHOST_SystemSDL::getAllDisplayDimensions(GHOST_TUns32& width, + GHOST_TUns32& height) const +{ + SDL_DisplayMode mode; + SDL_GetDesktopDisplayMode(0, &mode); /* note, always 0 display */ + width = mode.w; + height = mode.h; +} + void GHOST_SystemSDL::getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const diff --git a/intern/ghost/intern/GHOST_SystemSDL.h b/intern/ghost/intern/GHOST_SystemSDL.h index 43c9129fdd8..776dc2f66a5 100644 --- a/intern/ghost/intern/GHOST_SystemSDL.h +++ b/intern/ghost/intern/GHOST_SystemSDL.h @@ -87,6 +87,10 @@ public: setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y); + void + getAllDisplayDimensions(GHOST_TUns32& width, + GHOST_TUns32& height) const; + void getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const; From bc5df753aaaf116520d15df0aa53a054e6b1606a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 8 Feb 2013 08:18:44 +0000 Subject: [PATCH 189/227] 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 | 122 ++++++++++++------ 1 file changed, 85 insertions(+), 37 deletions(-) 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 (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 (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 (!is_data) { + IMB_colormanagement_processor_apply_v4_predivide(cm_processor, pixel); + } - if (display_buffer_float) { - int index = ((y - ymin) * width + (x - xmin)) * channels; + if (display_buffer_float) { + int index = ((y - ymin) * width + (x - xmin)) * channels; - copy_v4_v4(display_buffer_float + index, pixel); + 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 { - 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; + + for (i = ymin; i < ymax; i++) { + int byte_offset = (linear_stride * i + xmin) * 4; + int display_offset = (display_stride * i + xmin) * 4; + + 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; - cm_processor = IMB_colormanagement_display_processor_new(view_settings, display_settings); + /* 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); + + 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); } From c6865e823c4b8f5fc1b5ebe0e7e40227f5eb890c Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 8 Feb 2013 09:05:45 +0000 Subject: [PATCH 190/227] 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(+) 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; From 560c022af95bb6cad80739d12c861c4b9e8924d6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 8 Feb 2013 10:15:44 +0000 Subject: [PATCH 191/227] patch [#34163] "Zoom" in Python console startup message from Shinsuke Irie (irie) --- release/scripts/modules/console_python.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/scripts/modules/console_python.py b/release/scripts/modules/console_python.py index 60dfa2b6344..55ff84fea96 100644 --- a/release/scripts/modules/console_python.py +++ b/release/scripts/modules/console_python.py @@ -334,8 +334,8 @@ def banner(context): add_scrollback("Cursor: Left/Right Home/End", 'OUTPUT') add_scrollback("Remove: Backspace/Delete", 'OUTPUT') add_scrollback("Execute: Enter", 'OUTPUT') - add_scrollback("Autocomplete: Ctrl+Space", 'OUTPUT') - add_scrollback("Ctrl +/- Wheel: Zoom", 'OUTPUT') + add_scrollback("Autocomplete: Ctrl-Space", 'OUTPUT') + add_scrollback("Zoom: Ctrl +/-, Ctrl-Wheel", 'OUTPUT') add_scrollback("Builtin Modules: bpy, bpy.data, bpy.ops, " "bpy.props, bpy.types, bpy.context, bpy.utils, " "bgl, blf, mathutils", From 08326778c5c24bf9d0592264dabfea094057b471 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 8 Feb 2013 11:23:22 +0000 Subject: [PATCH 192/227] use sys.platform for checking the OS. --- release/scripts/startup/bl_ui/space_userpref.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index dad729077e0..2a2db40310c 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -19,7 +19,6 @@ # import bpy from bpy.types import Header, Menu, Panel -import os def ui_style_items(col, context): @@ -183,6 +182,7 @@ class USERPREF_PT_interface(Panel): return (userpref.active_section == 'INTERFACE') def draw(self, context): + import sys layout = self.layout userpref = context.user_preferences @@ -268,7 +268,7 @@ class USERPREF_PT_interface(Panel): col.prop(view, "show_splash") - if os.name == "nt": + if sys.platform[:3] == "win": col.prop(view, "use_quit_dialog") @@ -1077,6 +1077,8 @@ class USERPREF_PT_addons(Panel): @staticmethod def is_user_addon(mod, user_addon_paths): + import os + if not user_addon_paths: for path in (bpy.utils.script_path_user(), bpy.utils.script_path_pref()): @@ -1099,6 +1101,7 @@ class USERPREF_PT_addons(Panel): box.label(l) def draw(self, context): + import os import addon_utils layout = self.layout From 1dfb6404b78396988fedf5ad2bd111c6af13cf12 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 8 Feb 2013 12:12:57 +0000 Subject: [PATCH 193/227] 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). --- release/datafiles/matcaps/license.txt | 2 +- release/scripts/startup/bl_ui/space_userpref.py | 7 +++++++ 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 +++++- 6 files changed, 28 insertions(+), 6 deletions(-) diff --git a/release/datafiles/matcaps/license.txt b/release/datafiles/matcaps/license.txt index 2670a62e311..358c8dcd832 100644 --- a/release/datafiles/matcaps/license.txt +++ b/release/datafiles/matcaps/license.txt @@ -1,3 +1,3 @@ These matcap images are licensed as GNU GPL 2 or later, like the rest of Blender's code. -Thanks to Kent Trammell, Aidy Burrows, John Herreno , Terry Wallwork for making the pictures. +Thanks to Kent Trammell, Aidy Burrows, John Herreno , Terry Wallwork and David Silverman for making the pictures. diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 2a2db40310c..32eb1a593eb 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -963,6 +963,8 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel): return (userpref.active_section == 'INPUT') def draw_input_prefs(self, inputs, layout): + import sys + # General settings row = layout.row() col = row.column() @@ -1015,6 +1017,11 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel): sub.prop(inputs, "invert_zoom_wheel", text="Invert Wheel Zoom Direction") #sub.prop(view, "wheel_scroll_lines", text="Scroll Lines") + if sys.platform == "darwin": + sub = col.column() + sub.label(text="Trackpad:") + sub.prop(inputs, "use_trackpad_natural") + col.separator() sub = col.column() sub.label(text="NDOF Device:") 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"); From fdd18c7a07053f8bcb561703bd2467c28e02a2d7 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 12:23:36 +0000 Subject: [PATCH 194/227] fixed collada import for objects which have NO children --- source/blender/collada/DocumentImporter.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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); + } } } From 8b37f4724f6d3046103eee8740a286cacf61f8d0 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 12:31:47 +0000 Subject: [PATCH 195/227] fix: #34051 Collada export crashes --- source/blender/collada/ControllerExporter.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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; + } } } From a3bd7de8a33a0dcd0fbbfdb41c9a7f84a142335c Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 8 Feb 2013 13:15:30 +0000 Subject: [PATCH 196/227] Added warning below MultiSample User Preference option for Linux systems. (All 8 reports in tracker for selection failures were linux...) --- release/scripts/startup/bl_ui/space_userpref.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 32eb1a593eb..b4b6554d4fa 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -403,6 +403,7 @@ class USERPREF_PT_system(Panel): return (userpref.active_section == 'SYSTEM') def draw(self, context): + import sys layout = self.layout userpref = context.user_preferences @@ -466,6 +467,9 @@ class USERPREF_PT_system(Panel): col.label(text="Window Draw Method:") col.prop(system, "window_draw_method", text="") col.prop(system, "multi_sample", text="") + if sys.platform == "linux" and system.multi_sample != 'NONE': + col.label(text="Might fail for Mesh editing selection!") + col.separator() col.prop(system, "use_region_overlap") col.label(text="Text Draw Options:") col.prop(system, "use_text_antialiasing") From 66e160d5033e4d4924fb7f7219d993a1defc8855 Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Fri, 8 Feb 2013 13:51:29 +0000 Subject: [PATCH 197/227] Fix Knife cut-through bug #34072. --- source/blender/editors/mesh/editmesh_knife.c | 7 +++++++ 1 file changed, 7 insertions(+) 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; } From e6cd9ea087d7bc5e027d67fc328014b604fbe25d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 8 Feb 2013 14:29:38 +0000 Subject: [PATCH 198/227] 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 | 205 ++++++++++++++++-- .../bad_level_call_stubs/stubs.c | 1 + 2 files changed, 187 insertions(+), 19 deletions(-) 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) { - 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); + 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_uiItemL(uiLayout *layout, const char *name, int icon, int icon_value) +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_ptr(layout, ot, name, icon, NULL, uiLayoutGetOperatorContext(layout), flag); +} + +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;} From 95b28a65f366c4a1f571f35dabd79edaa94cfe51 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 8 Feb 2013 15:16:57 +0000 Subject: [PATCH 199/227] 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(-) 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, From 32a6a3eb63b80e47fb083d49814090b89541e9ab Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 8 Feb 2013 15:56:14 +0000 Subject: [PATCH 200/227] 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(-) 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 From 23aa0c90678061a98dbc800780ca0490c57d5d31 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 8 Feb 2013 16:01:21 +0000 Subject: [PATCH 201/227] Fix uilists showing data names translated (reported on bf-translations ML by Satoshi Yamasaki aka yamyam, thanks!). --- doc/python_api/examples/bpy.types.UIList.py | 11 ++++++----- .../scripts/startup/bl_ui/properties_data_mesh.py | 14 +++++++------- .../startup/bl_ui/properties_mask_common.py | 4 ++-- .../scripts/startup/bl_ui/properties_material.py | 10 ++++++---- .../bl_ui/properties_physics_dynamicpaint.py | 2 +- release/scripts/startup/bl_ui/properties_render.py | 10 ++-------- release/scripts/startup/bl_ui/properties_scene.py | 4 ++-- .../scripts/startup/bl_ui/properties_texture.py | 4 ++-- release/scripts/startup/bl_ui/space_clip.py | 6 ++---- release/scripts/templates_py/ui_list.py | 11 ++++++----- 10 files changed, 36 insertions(+), 40 deletions(-) diff --git a/doc/python_api/examples/bpy.types.UIList.py b/doc/python_api/examples/bpy.types.UIList.py index a37bbff726a..0f4ae0703cc 100644 --- a/doc/python_api/examples/bpy.types.UIList.py +++ b/doc/python_api/examples/bpy.types.UIList.py @@ -31,7 +31,8 @@ class MATERIAL_UL_matslots_example(bpy.types.UIList): # You should always start your row layout by a label (icon + text), this will also make the row easily # selectable in the list! # We use icon_value of label, as our given icon is an integer value, not an enum ID. - layout.label(ma.name if ma else "", icon_value=icon) + # Note "data" names should never be translated! + layout.label(text=ma.name if ma else "", translate=False, icon_value=icon) # And now we can add other UI stuff... # Here, we add nodes info if this material uses (old!) shading nodes. if ma and not context.scene.render.use_shading_nodes: @@ -39,15 +40,15 @@ class MATERIAL_UL_matslots_example(bpy.types.UIList): if manode: # The static method UILayout.icon returns the integer value of the icon ID "computed" for the given # RNA object. - layout.label("Node %s" % manode.name, icon_value=layout.icon(manode)) + layout.label(text="Node %s" % manode.name, translate=False, icon_value=layout.icon(manode)) elif ma.use_nodes: - layout.label("Node ") + layout.label(text="Node ", translate=False) else: - layout.label("") + layout.label(text="") # 'GRID' layout type should be as compact as possible (typically a single icon!). elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) # And now we can use this list everywhere in Blender. Here is a small example panel. diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index dcef5aaa096..86a48999663 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -60,12 +60,12 @@ class MESH_UL_vgroups(UIList): # assert(isinstance(item, bpy.types.VertexGroup) vgroup = item if self.layout_type in {'DEFAULT', 'COMPACT'}: - layout.label(vgroup.name, icon_value=icon) + layout.label(text=vgroup.name, translate=False, icon_value=icon) icon = 'LOCKED' if vgroup.lock_weight else 'UNLOCKED' layout.prop(vgroup, "lock_weight", text="", icon=icon, emboss=False) elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) class MESH_UL_shape_keys(UIList): @@ -76,30 +76,30 @@ class MESH_UL_shape_keys(UIList): key_block = item if self.layout_type in {'DEFAULT', 'COMPACT'}: split = layout.split(0.66, False) - split.label(item.name, icon_value=icon) + split.label(text=item.name, translate=False, icon_value=icon) row = split.row(True) if key_block.mute or (obj.mode == 'EDIT' and not (obj.use_shape_key_edit_mode and obj.type == 'MESH')): row.active = False if not item.relative_key or index > 0: row.prop(key_block, "value", text="", emboss=False) else: - row.label("") + row.label(text="") row.prop(key_block, "mute", text="", emboss=False) elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) class MESH_UL_uvmaps_vcols(UIList): def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): # assert(isinstance(item, (bpy.types.MeshTexturePolyLayer, bpy.types.MeshLoopColorLayer)) if self.layout_type in {'DEFAULT', 'COMPACT'}: - layout.label(item.name, icon_value=icon) + layout.label(text=item.name, translate=False, icon_value=icon) icon = 'RESTRICT_RENDER_OFF' if item.active_render else 'RESTRICT_RENDER_ON' layout.prop(item, "active_render", text="", icon=icon, emboss=False) elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) class MeshButtonsPanel(): diff --git a/release/scripts/startup/bl_ui/properties_mask_common.py b/release/scripts/startup/bl_ui/properties_mask_common.py index 3bdb6f32076..4ceaffbaf8d 100644 --- a/release/scripts/startup/bl_ui/properties_mask_common.py +++ b/release/scripts/startup/bl_ui/properties_mask_common.py @@ -32,7 +32,7 @@ class MASK_UL_layers(UIList): mask = item if self.layout_type in {'DEFAULT', 'COMPACT'}: split = layout.split() - split.label(mask.name, icon_value=icon) + split.label(text=mask.name, translate=False, icon_value=icon) row = split.row(align=True) row.prop(mask, "alpha", text="", emboss=False) row.prop(mask, "hide", text="", emboss=False) @@ -40,7 +40,7 @@ class MASK_UL_layers(UIList): row.prop(mask, "hide_render", text="", emboss=False) elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) class MASK_PT_mask: diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 7e18cf89080..3a3cd88953c 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -76,16 +76,18 @@ class MATERIAL_UL_matslots(UIList): slot = item ma = slot.material if self.layout_type in {'DEFAULT', 'COMPACT'}: - layout.label(ma.name if ma else "", icon_value=icon) + layout.label(text=ma.name if ma else "", translate=False, icon_value=icon) if ma and not context.scene.render.use_shading_nodes: manode = ma.active_node_material if manode: - layout.label("Node %s" % manode.name, icon_value=layout.icon(manode)) + layout.label(text="Node %s" % manode.name, translate=False, icon_value=layout.icon(manode)) elif ma.use_nodes: - layout.label("Node ") + layout.label(text="Node ", translate=False) + else: + layout.label(text="") elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) class MaterialButtonsPanel(): diff --git a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py index efc675ffe83..7ee63ee7a2f 100644 --- a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py +++ b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py @@ -33,7 +33,7 @@ class PHYSICS_UL_dynapaint_surfaces(UIList): if self.layout_type in {'DEFAULT', 'COMPACT'}: row = layout.row(align=True) row.label(text="", icon_value=icon) - row.label(text=surf.name, icon_value=sticon) + row.label(text=surf.name, translate=False, icon_value=sticon) row = layout.row(align=True) if surf.use_color_preview: row.prop(surf, "show_preview", text="", emboss=False, diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 29e32401d2b..1cd58328332 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -48,17 +48,11 @@ class RENDER_UL_renderlayers(UIList): # assert(isinstance(item, bpy.types.SceneRenderLayer) layer = item if self.layout_type in {'DEFAULT', 'COMPACT'}: - layout.label(layer.name, icon_value=icon) + layout.label(text=layer.name, translate=False, icon_value=icon) layout.prop(layer, "use", text="", index=index) elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) - -# else if (RNA_struct_is_a(itemptr->type, &RNA_SceneRenderLayer)) { -# uiItemL(sub, name, icon); -# uiBlockSetEmboss(block, UI_EMBOSS); -# uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "use", 0, 0, 0, 0, 0, NULL); -# } + layout.label(text="", icon_value=icon) class RenderButtonsPanel(): diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py index e0f4fd1f75b..b9b57923420 100644 --- a/release/scripts/startup/bl_ui/properties_scene.py +++ b/release/scripts/startup/bl_ui/properties_scene.py @@ -32,10 +32,10 @@ class SCENE_UL_keying_set_paths(UIList): kspath = item icon = layout.enum_item_icon(kspath, "id_type", kspath.id_type) if self.layout_type in {'DEFAULT', 'COMPACT'}: - layout.label(kspath.data_path, icon_value=icon) + layout.label(text=kspath.data_path, translate=False, icon_value=icon) elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) class SceneButtonsPanel(): diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py index 9e8fd0470cf..dd30627abff 100644 --- a/release/scripts/startup/bl_ui/properties_texture.py +++ b/release/scripts/startup/bl_ui/properties_texture.py @@ -63,12 +63,12 @@ class TEXTURE_UL_texslots(UIList): slot = item tex = slot.texture if slot else None if self.layout_type in {'DEFAULT', 'COMPACT'}: - layout.label(tex.name if tex else "", icon_value=icon) + layout.label(text=tex.name if tex else "", translate=False, icon_value=icon) if tex and isinstance(item, bpy.types.MaterialTextureSlot): layout.prop(ma, "use_textures", text="", index=index) elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) from bl_ui.properties_material import active_node_mat diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index db71bbe2390..ba38e776ddc 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -28,12 +28,10 @@ class CLIP_UL_tracking_objects(UIList): # assert(isinstance(item, bpy.types.MovieTrackingObject) tobj = item if self.layout_type in {'DEFAULT', 'COMPACT'}: - layout.label(tobj.name, icon='CAMERA_DATA' - if tobj.is_camera else 'OBJECT_DATA') + layout.label(text=tobj.name, translate=False, icon='CAMERA_DATA' if tobj.is_camera else 'OBJECT_DATA') elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon='CAMERA_DATA' - if tobj.is_camera else 'OBJECT_DATA') + layout.label(text="", icon='CAMERA_DATA' if tobj.is_camera else 'OBJECT_DATA') class CLIP_HT_header(Header): diff --git a/release/scripts/templates_py/ui_list.py b/release/scripts/templates_py/ui_list.py index 18861f7d801..f71b342c854 100644 --- a/release/scripts/templates_py/ui_list.py +++ b/release/scripts/templates_py/ui_list.py @@ -20,7 +20,8 @@ class MATERIAL_UL_matslots_example(bpy.types.UIList): # You should always start your row layout by a label (icon + text), this will also make the row easily # selectable in the list! # We use icon_value of label, as our given icon is an integer value, not an enum ID. - layout.label(ma.name if ma else "", icon_value=icon) + # Note "data" names should never be translated! + layout.label(text=ma.name if ma else "", translate=False, icon_value=icon) # And now we can add other UI stuff... # Here, we add nodes info if this material uses (old!) shading nodes. if ma and not context.scene.render.use_shading_nodes: @@ -28,15 +29,15 @@ class MATERIAL_UL_matslots_example(bpy.types.UIList): if manode: # The static method UILayout.icon returns the integer value of the icon ID "computed" for the given # RNA object. - layout.label("Node %s" % manode.name, icon_value=layout.icon(manode)) + layout.label(text="Node %s" % manode.name, translate=False, icon_value=layout.icon(manode)) elif ma.use_nodes: - layout.label("Node ") + layout.label(text="Node ", translate=False) else: - layout.label("") + layout.label(text="") # 'GRID' layout type should be as compact as possible (typically a single icon!). elif self.layout_type in {'GRID'}: layout.alignment = 'CENTER' - layout.label("", icon_value=icon) + layout.label(text="", icon_value=icon) # And now we can use this list everywhere in Blender. Here is a small example panel. From e092115e790f939417870f54636ec28f4b0fa19a Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 8 Feb 2013 16:18:24 +0000 Subject: [PATCH 202/227] 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(-) 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); From ebf18c6df927c0075dcc9057cf1774309d56464e Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 8 Feb 2013 16:25:35 +0000 Subject: [PATCH 203/227] 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 ++++++++++++ .../blender/render/intern/source/pipeline.c | 28 +++++++++++++++++++ 2 files changed, 46 insertions(+) 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; } From d26c06312138d9032f8534282af5ba2a1cad0089 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 8 Feb 2013 16:41:02 +0000 Subject: [PATCH 204/227] disable translations for some python buttons. --- release/scripts/modules/bpy_types.py | 4 +++- release/scripts/modules/rna_prop_ui.py | 4 ++-- release/scripts/startup/bl_ui/space_console.py | 4 +++- release/scripts/startup/bl_ui/space_userpref.py | 8 ++++---- release/scripts/startup/bl_ui/space_view3d_toolbar.py | 8 ++++---- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index b0a4e05b107..4398b1721f7 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -718,7 +718,9 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta): files.sort() for f, filepath in files: - props = layout.operator(operator, text=bpy.path.display_name(f)) + props = layout.operator(operator, + text=bpy.path.display_name(f), + translate=False) for attr, value in props_default.items(): setattr(props, attr, value) diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py index 12438795539..5e8bccb815e 100644 --- a/release/scripts/modules/rna_prop_ui.py +++ b/release/scripts/modules/rna_prop_ui.py @@ -135,11 +135,11 @@ def draw(layout, context, context_member, property_type, use_edit=True): else: row = box.row() - row.label(text=key) + row.label(text=key, translate=False) # explicit exception for arrays if to_dict or to_list: - row.label(text=val_draw) + row.label(text=val_draw, translate=False) else: if key in rna_properties: row.prop(rna_item, key, text="") diff --git a/release/scripts/startup/bl_ui/space_console.py b/release/scripts/startup/bl_ui/space_console.py index 23d16c14f2d..70e0fb4fcf2 100644 --- a/release/scripts/startup/bl_ui/space_console.py +++ b/release/scripts/startup/bl_ui/space_console.py @@ -80,7 +80,9 @@ class CONSOLE_MT_language(Menu): languages.sort() for language in languages: - layout.operator("console.language", text=language[0].upper() + language[1:]).language = language + layout.operator("console.language", + text=language.title(), + translate=False).language = language def add_scrollback(text, text_type): diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index b4b6554d4fa..4ebd38ca0b2 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -1217,15 +1217,15 @@ class USERPREF_PT_addons(Panel): if mod: split = colsub.row().split(percentage=0.15) split.label(text="File:") - split.label(text=mod.__file__) + split.label(text=mod.__file__, translate=False) if info["author"]: split = colsub.row().split(percentage=0.15) split.label(text="Author:") - split.label(text=info["author"]) + split.label(text=info["author"], translate=False) if info["version"]: split = colsub.row().split(percentage=0.15) split.label(text="Version:") - split.label(text='.'.join(str(x) for x in info["version"])) + split.label(text='.'.join(str(x) for x in info["version"]), translate=False) if info["warning"]: split = colsub.row().split(percentage=0.15) split.label(text="Warning:") @@ -1282,7 +1282,7 @@ class USERPREF_PT_addons(Panel): colsub = box.column() row = colsub.row() - row.label(text=module_name, icon='ERROR') + row.label(text=module_name, translate=False, icon='ERROR') if is_enabled: row.operator("wm.addon_disable", icon='CHECKBOX_HLT', text="", emboss=False).module = module_name diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 0faac7cce3f..2fb420dabea 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -1142,14 +1142,14 @@ class VIEW3D_PT_tools_projectpaint(View3DPanel, Panel): row = split.row() row.active = (ipaint.use_stencil_layer) stencil_text = mesh.uv_texture_stencil.name if mesh.uv_texture_stencil else "" - row.menu("VIEW3D_MT_tools_projectpaint_stencil", text=stencil_text) + row.menu("VIEW3D_MT_tools_projectpaint_stencil", text=stencil_text, translate=False) row.prop(ipaint, "invert_stencil", text="", icon='IMAGE_ALPHA') col = layout.column() col.active = (settings.brush.image_tool == 'CLONE') col.prop(ipaint, "use_clone_layer", text="Clone from UV map") clone_text = mesh.uv_texture_clone.name if mesh.uv_texture_clone else "" - col.menu("VIEW3D_MT_tools_projectpaint_clone", text=clone_text) + col.menu("VIEW3D_MT_tools_projectpaint_clone", text=clone_text, translate=False) layout.prop(ipaint, "seam_bleed") @@ -1188,7 +1188,7 @@ class VIEW3D_MT_tools_projectpaint_clone(Menu): layout = self.layout for i, tex in enumerate(context.active_object.data.uv_textures): - props = layout.operator("wm.context_set_int", text=tex.name) + props = layout.operator("wm.context_set_int", text=tex.name, translate=False) props.data_path = "active_object.data.uv_texture_clone_index" props.value = i @@ -1199,7 +1199,7 @@ class VIEW3D_MT_tools_projectpaint_stencil(Menu): def draw(self, context): layout = self.layout for i, tex in enumerate(context.active_object.data.uv_textures): - props = layout.operator("wm.context_set_int", text=tex.name) + props = layout.operator("wm.context_set_int", text=tex.name, translate=False) props.data_path = "active_object.data.uv_texture_stencil_index" props.value = i From deeeaed3d858cf8be7d9fba294e96db3778aa587 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Fri, 8 Feb 2013 19:52:02 +0000 Subject: [PATCH 205/227] [#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(-) 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; } From e3488af838e6c43e5e3d9635d7604ab04f5a9b27 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Sat, 9 Feb 2013 00:23:59 +0000 Subject: [PATCH 206/227] 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(-) 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 From 8eabdad3aa7a135e9817e1860dad94e6c86974cf Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Sat, 9 Feb 2013 06:32:17 +0000 Subject: [PATCH 207/227] 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(-) 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; From 2eab18dc324dea3d517937845534bc30992a733b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 07:14:42 +0000 Subject: [PATCH 208/227] 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(-) 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]; From d03befd0dbe97b8b72817137c1b76e6396262292 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 07:59:56 +0000 Subject: [PATCH 209/227] 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(-) 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); + axis_dominant_v3_to_m3(mat, 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]; - - 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; From 5e05d67436162ecd8172703a5840f79d08286f87 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 08:16:13 +0000 Subject: [PATCH 210/227] 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 --- .../blender/bmesh/operators/bmo_triangulate.c | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) 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); From 777fb934a7e1645a4df76f40b1d1f1f712c74c62 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 9 Feb 2013 10:04:23 +0000 Subject: [PATCH 211/227] 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(-) 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}}; From 6738c941ffc68f25f93eb219c4c3c3ddc3cf7c4c Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 9 Feb 2013 10:04:25 +0000 Subject: [PATCH 212/227] 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(-) 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) {} From 4479d1323656a6d4c9374520e055edf8c7b497f5 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 9 Feb 2013 10:04:27 +0000 Subject: [PATCH 213/227] rigidbody: Fix force field changes not invalidating cache --- source/blender/blenkernel/intern/depsgraph.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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); } } From bd9a7ab7688edab142e4c503726f17131153e26a Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 9 Feb 2013 10:04:29 +0000 Subject: [PATCH 214/227] 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(-) 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; From 00212f2b1f24362837910ea578546b3d93eba4e5 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sat, 9 Feb 2013 12:30:42 +0000 Subject: [PATCH 215/227] 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(-) 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; } From fd145b4df19c70b3133c45b364c58a14d2cf818d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 13:58:37 +0000 Subject: [PATCH 216/227] 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(-) 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) { From 555bcc3298a564cb678c9f31ba6bded86d58bab6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 9 Feb 2013 15:49:20 +0000 Subject: [PATCH 217/227] 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(-) 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) From f34d1d55850cd82fbae843ffafa7115dab0e0eeb Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Sat, 9 Feb 2013 16:19:30 +0000 Subject: [PATCH 218/227] [#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 | 49 +++++++++++++-------- 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, 158 insertions(+), 26 deletions(-) create mode 100644 source/blender/collada/ImportSettings.cpp create mode 100644 source/blender/collada/ImportSettings.h 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; - } - RNA_property_float_set(&unit_settings, scale, unit_converter.getLinearMeter()); - - const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes(); + 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. + } + + // 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; } + /* Options panel */ + import_units = RNA_boolean_get(op->ptr, "import_units"); + RNA_string_get(op->ptr, "filepath", filename); - if (collada_import(C, filename)) return OPERATOR_FINISHED; - + 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; + } +} - return OPERATOR_FINISHED; +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); + + 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 From d1136ba2efab8c4a1475b1778eb7b2bd9c8c8658 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sat, 9 Feb 2013 16:54:10 +0000 Subject: [PATCH 219/227] 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(+) 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); From 1083a069004490b0ed8679679adb2a7ea881ba62 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 9 Feb 2013 18:17:20 +0000 Subject: [PATCH 220/227] 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(-) 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, From 82c86af7f7b37e940748e99efe3b19fd5b92d6ca Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 9 Feb 2013 18:26:40 +0000 Subject: [PATCH 221/227] 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! --- .../startup/bl_ui/properties_data_modifier.py | 3 ++- .../startup/bl_ui/properties_material.py | 5 +++-- .../startup/bl_ui/properties_particle.py | 3 ++- .../startup/bl_ui/properties_physics_fluid.py | 4 +++- release/scripts/startup/bl_ui/space_clip.py | 13 ++++++------ release/scripts/startup/bl_ui/space_image.py | 4 +++- .../scripts/startup/bl_ui/space_sequencer.py | 20 ++++++++++++------- release/scripts/startup/bl_ui/space_text.py | 13 ++++++------ .../scripts/startup/bl_ui/space_userpref.py | 3 ++- .../startup/bl_ui/space_userpref_keymap.py | 3 ++- source/blender/editors/io/io_collada.c | 5 ++--- 11 files changed, 45 insertions(+), 31 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 99f82b1e8a3..679b33292e5 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -265,7 +265,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.prop(md, "angle_limit") layout.prop(md, "use_dissolve_boundaries") - layout.label(text="Face Count" + ": %d" % md.face_count) + pgettext = bpy.app.translations.pgettext + layout.label(text=pgettext("Face Count: %d") % md.face_count, translate=False) def DISPLACE(self, layout, ob, md): has_texture = (md.texture is not None) diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 3a3cd88953c..9b7cfe89a08 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -80,9 +80,10 @@ class MATERIAL_UL_matslots(UIList): if ma and not context.scene.render.use_shading_nodes: manode = ma.active_node_material if manode: - layout.label(text="Node %s" % manode.name, translate=False, icon_value=layout.icon(manode)) + pgettext = bpy.app.translations.pgettext + layout.label(text=pgettext("Node %s") % manode.name, translate=False, icon_value=layout.icon(manode)) elif ma.use_nodes: - layout.label(text="Node ", translate=False) + layout.label(text="Node ") else: layout.label(text="") elif self.layout_type in {'GRID'}: diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index 90dcf594137..aef860e774b 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -148,7 +148,8 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel): #row.label(text="Render") if part.is_fluid: - layout.label(text="%d fluid particles for this frame" % part.count) + pgettext = bpy.app.translations.pgettext + layout.label(text=pgettext("%d fluid particles for this frame") % part.count, translate=False) return row = col.row() diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index 08278c02693..c03b5323105 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -64,7 +64,9 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel): if fluid.type == 'DOMAIN': # odd formatting here so translation script can extract string - layout.operator("fluid.bake", text="Bake (Req. Memory:" + " %s)" % fluid.memory_estimate, icon='MOD_FLUIDSIM') + pgettext = bpy.app.translations.pgettext + layout.operator("fluid.bake", text=pgettext("Bake (Req. Memory: %s)") % fluid.memory_estimate, + translate=False, icon='MOD_FLUIDSIM') split = layout.split() col = split.column() diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index ba38e776ddc..303f47b295d 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -313,9 +313,11 @@ class CLIP_PT_tools_solve(CLIP_PT_tracking_panel, Panel): col = layout.column(align=True) - col.operator("clip.solve_camera", - text="Camera Motion" if tracking_object.is_camera - else "Object Motion") + # Note: avoid complex code in "text" values, they can't be handled right by i18n messages extractor script! + if tracking_object.is_camera: + col.operator("clip.solve_camera", text="Camera Motion") + else: + col.operator("clip.solve_camera", text="Object Motion") col.operator("clip.clear_solution") col = layout.column() @@ -907,10 +909,9 @@ class CLIP_MT_view(Menu): ratios = ((1, 8), (1, 4), (1, 2), (1, 1), (2, 1), (4, 1), (8, 1)) + text = bpy.app.translations.pgettext("Zoom %d:%d") for a, b in ratios: - text = "Zoom %d:%d" % (a, b) - layout.operator("clip.view_zoom_ratio", - text=text).ratio = a / b + layout.operator("clip.view_zoom_ratio", text=text % (a, b), translate=False).ratio = a / b else: if sc.view == 'GRAPH': layout.operator_context = 'INVOKE_REGION_PREVIEW' diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py index 179c41ace08..6d08663006f 100644 --- a/release/scripts/startup/bl_ui/space_image.py +++ b/release/scripts/startup/bl_ui/space_image.py @@ -70,8 +70,10 @@ class IMAGE_MT_view(Menu): ratios = ((1, 8), (1, 4), (1, 2), (1, 1), (2, 1), (4, 1), (8, 1)) + pgettext = bpy.app.translations.pgettext for a, b in ratios: - layout.operator("image.view_zoom_ratio", text="Zoom" + " %d:%d" % (a, b)).ratio = a / b + layout.operator("image.view_zoom_ratio", text=pgettext("Zoom %d:%d") % (a, b), + translate=False).ratio = a / b layout.separator() diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 64ad5656bcd..b8f44a621a9 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -420,15 +420,19 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel, Panel): sub.prop(strip, "frame_start") sub.prop(strip, "frame_final_duration") + pgettext = bpy.app.translations.pgettext col = layout.column(align=True) row = col.row() - row.label(text="Final Length" + ": %s" % bpy.utils.smpte_from_frame(strip.frame_final_duration)) + row.label(text=pgettext("Final Length: %s") % bpy.utils.smpte_from_frame(strip.frame_final_duration), + translate=False) row = col.row() row.active = (frame_current >= strip.frame_start and frame_current <= strip.frame_start + strip.frame_duration) - row.label(text="Playhead" + ": %d" % (frame_current - strip.frame_start)) + row.label(text=pgettext("Playhead: %d") % (frame_current - strip.frame_start), translate=False) - col.label(text="Frame Offset" + " %d:%d" % (strip.frame_offset_start, strip.frame_offset_end)) - col.label(text="Frame Still" + " %d:%d" % (strip.frame_still_start, strip.frame_still_end)) + col.label(text=pgettext("Frame Offset %d:%d") % (strip.frame_offset_start, strip.frame_offset_end), + translate=False) + col.label(text=pgettext("Frame Still %d:%d") % (strip.frame_still_start, strip.frame_still_end), + translate=False) elem = False @@ -438,7 +442,7 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel, Panel): elem = strip.elements[0] if elem and elem.orig_width > 0 and elem.orig_height > 0: - col.label(text="Original Dimension" + ": %dx%d" % (elem.orig_width, elem.orig_height)) + col.label(text=pgettext("Original Dimension: %dx%d") % (elem.orig_width, elem.orig_height), translate=False) else: col.label(text="Original Dimension: None") @@ -715,7 +719,8 @@ class SEQUENCER_PT_scene(SequencerButtonsPanel, Panel): if scene: sta = scene.frame_start end = scene.frame_end - layout.label(text="Original frame range" + ": %d-%d (%d)" % (sta, end, end - sta + 1)) + pgettext = bpy.app.translations.pgettext + layout.label(text=pgettext("Original frame range: %d-%d (%d)") % (sta, end, end - sta + 1), translate=False) class SEQUENCER_PT_mask(SequencerButtonsPanel, Panel): @@ -744,7 +749,8 @@ class SEQUENCER_PT_mask(SequencerButtonsPanel, Panel): if mask: sta = mask.frame_start end = mask.frame_end - layout.label(text="Original frame range" + ": %d-%d (%d)" % (sta, end, end - sta + 1)) + pgettext = bpy.app.translations.pgettext + layout.label(text=pgettext("Original frame range: %d-%d (%d)") % (sta, end, end - sta + 1), translate=False) class SEQUENCER_PT_filter(SequencerButtonsPanel, Panel): diff --git a/release/scripts/startup/bl_ui/space_text.py b/release/scripts/startup/bl_ui/space_text.py index 65ec945c7da..d976475c29e 100644 --- a/release/scripts/startup/bl_ui/space_text.py +++ b/release/scripts/startup/bl_ui/space_text.py @@ -71,16 +71,15 @@ class TEXT_HT_header(Header): row = layout.row() if text.filepath: + pgettext = bpy.app.translations.pgettext if text.is_dirty: - row.label(text="File" + ": *%r " % - text.filepath + "(unsaved)") + row.label(text=pgettext("File: *%r (unsaved)") % text.filepath, translate=False) else: - row.label(text="File" + ": %r" % - text.filepath) + row.label(text=pgettext("File: %r") % text.filepath, translate=False) + elif text.library: + row.label(text="Text: External") else: - row.label(text="Text: External" - if text.library - else "Text: Internal") + row.label(text="Text: Internal") class TEXT_PT_properties(Panel): diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 4ebd38ca0b2..5bb83e7f429 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -778,9 +778,10 @@ class USERPREF_PT_theme(Panel): layout.separator() elif theme.theme_area == 'BONE_COLOR_SETS': col = split.column() + pgettext = bpy.app.translations.pgettext for i, ui in enumerate(theme.bone_color_sets): - col.label(text="Color Set" + " %d:" % (i + 1)) # i starts from 0 + col.label(text=pgettext("Color Set %d:") % (i + 1), translate=False) # i starts from 0 row = col.row() diff --git a/release/scripts/startup/bl_ui/space_userpref_keymap.py b/release/scripts/startup/bl_ui/space_userpref_keymap.py index 82299bc951c..db78adcb576 100644 --- a/release/scripts/startup/bl_ui/space_userpref_keymap.py +++ b/release/scripts/startup/bl_ui/space_userpref_keymap.py @@ -97,7 +97,8 @@ class InputKeyMapPanel: subcol = self.indented_layout(col, level + 1) subrow = subcol.row() subrow.prop(km, "show_expanded_items", text="", emboss=False) - subrow.label(text="%s " % km.name + "(Global)") + pgettext = bpy.app.translations.pgettext + subrow.label(text=pgettext("%s (Global)") % km.name, translate=False) else: km.show_expanded_items = True 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 From e14b21dd6d0303f4645e3b0c9389252f82c43eae Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 9 Feb 2013 18:32:00 +0000 Subject: [PATCH 222/227] Updated py ui message extraction, to find out contexts as much as possible... --- .../modules/bl_i18n_utils/bl_process_msg.py | 135 +++++++++++++----- 1 file changed, 99 insertions(+), 36 deletions(-) diff --git a/release/scripts/modules/bl_i18n_utils/bl_process_msg.py b/release/scripts/modules/bl_i18n_utils/bl_process_msg.py index 5d2f90f0da7..6307ca21a26 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_process_msg.py +++ b/release/scripts/modules/bl_i18n_utils/bl_process_msg.py @@ -358,15 +358,68 @@ def dump_py_messages_from_files(messages, check_ctxt, files): """ import ast + bpy_struct = bpy.types.ID.__base__ + + # Helper function + def extract_strings(node): + """ + Recursively get strings, needed in case we have "Blah" + "Blah", passed as an argument in that case it won't + evaluate to a string. However, break on some kind of stopper nodes, like e.g. Subscript. + """ + if type(node) == ast.Str: + eval_str = ast.literal_eval(node) + if eval_str: + return eval_str, (node,) + return None, () + + eval_str = [] + nodes = [] + for nd in ast.iter_child_nodes(node): + if type(nd) not in stopper_nodes: + estr, nds = extract_strings(nd) + eval_str.append(estr) + nodes += nds + if eval_str: + return "".join(s for s in eval_str if s is not None), tuple(n for n in nodes if n is not None) + return None, () + + def _ctxt_to_ctxt(node): + return extract_strings(node)[0] + + def _op_to_ctxt(node): + opname, _ = extract_strings(node) + if not opname: + return "" + op = bpy.ops + for n in opname.split('.'): + op = getattr(op, n) + try: + return op.get_rna().bl_rna.translation_context + except Exception as e: + print("ERROR: ", str(e)) + # ------------------------------------------------------------------------- # Gather function names + # so far only 'text' keywords, but we may want others translated later + translate_kw = ("text", ) + # key: func_id # val: [(arg_kw, arg_pos), (arg_kw, arg_pos), ...] func_translate_args = {} - # so far only 'text' keywords, but we may want others translated later - translate_kw = ("text", ) + # as we only have one translate keyword, no need for complex context extraction setup for now... + # And it's already enough complex like that! + # Note: order is important, first one wins! + context_kw = ((("text_ctxt",), _ctxt_to_ctxt), + (("operator",), _op_to_ctxt), + ) + context_kw_set = set() + for c, _ in context_kw: + context_kw_set |= set(c) + + # Like func_translate_args. + func_context_args = {} # Break recursive nodes look up on some kind of nodes. # E.g. we don’t want to get strings inside subscripts (blah["foo"])! @@ -376,9 +429,11 @@ def dump_py_messages_from_files(messages, check_ctxt, files): for func_id, func in bpy.types.UILayout.bl_rna.functions.items(): # check it has one or more arguments as defined in translate_kw for (arg_pos, (arg_kw, arg)) in enumerate(func.parameters.items()): - if ((arg_kw in translate_kw) and (arg.is_output is False) and (arg.type == 'STRING')): + if ((arg_kw in translate_kw) and (not arg.is_output) and (arg.type == 'STRING')): func_translate_args.setdefault(func_id, []).append((arg_kw, arg_pos)) - # print(func_translate_args) + elif ((arg_kw in context_kw_set) and (not arg.is_output) and (arg.type == 'STRING')): + func_context_args.setdefault(func_id, []).append((arg_kw, arg_pos)) + #print(func_context_args) check_ctxt_py = None if check_ctxt: @@ -387,32 +442,6 @@ def dump_py_messages_from_files(messages, check_ctxt, files): "not_capitalized": check_ctxt["not_capitalized"], "end_point": check_ctxt["end_point"]} - # Helper function - def extract_strings(fp_rel, node): - """ - Recursively get strings, needed in case we have "Blah" + "Blah", passed as an argument in that case it won't - evaluate to a string. However, break on some kind of stopper nodes, like e.g. Subscript. - """ - if type(node) == ast.Str: - eval_str = ast.literal_eval(node) - if eval_str: - # Parse optional context included in string! - # XXX Not yet! - #if bpy.app.i18n.context_sep in eval_str: - #key = eval_str.split(bpy.app.i18n.context_sep, 1) - if 0: - pass - else: - key = (CONTEXT_DEFAULT, eval_str) - msgsrc = "{}:{}".format(fp_rel, node.lineno) - check(check_ctxt_py, messages, key, msgsrc) - messages.setdefault(key, []).append(msgsrc) - return - - for nd in ast.iter_child_nodes(node): - if type(nd) not in stopper_nodes: - extract_strings(fp_rel, nd) - for fp in files: with open(fp, 'r', encoding="utf8") as filedata: root_node = ast.parse(filedata.read(), fp, 'exec') @@ -432,16 +461,50 @@ def dump_py_messages_from_files(messages, check_ctxt, files): if not hasattr(node.func, "attr"): continue - translate_args = func_translate_args.get(node.func.attr, ()) - - # do nothing if not found - for arg_kw, arg_pos in translate_args: + # First try to get i18n context. + context_args = func_context_args.get(node.func.attr, ()) + context = "" + context_elements = {} + for arg_kw, arg_pos in context_args: if arg_pos < len(node.args): - extract_strings(fp_rel, node.args[arg_pos]) + context_elements[arg_kw] = node.args[arg_pos] else: for kw in node.keywords: if kw.arg == arg_kw: - extract_strings(fp_rel, kw.value) + context_elements[arg_kw] = kw.value + break + #print(context_elements) + for kws, proc in context_kw: + if set(kws) <= context_elements.keys(): + args = tuple(context_elements[k] for k in kws) + #print("running ", proc, " with ", args) + ctxt = proc(*args) + if ctxt: + context = ctxt + break + + translate_args = func_translate_args.get(node.func.attr, ()) + #print(translate_args) + # do nothing if not found + for arg_kw, arg_pos in translate_args: + estr, nds = None, () + if arg_pos < len(node.args): + estr, nds = extract_strings(node.args[arg_pos]) + #print(estr, nds) + else: + for kw in node.keywords: + if kw.arg == arg_kw: + estr, nds = extract_strings(kw.value) + break + #print(estr, nds) + if estr: + key = (context, estr) + if nds: + msgsrc = ["{}:{}".format(fp_rel, sorted({nd.lineno for nd in nds})[0])] + else: + msgsrc = ["{}:???".format(fp_rel)] + check(check_ctxt_py, messages, key, msgsrc) + messages.setdefault(key, []).extend(msgsrc) def dump_py_messages(messages, check_ctxt, addons): From a4a1c667257e493bdeb5354f87083291af122a68 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 9 Feb 2013 18:47:40 +0000 Subject: [PATCH 223/227] Better to return default op context when we can't find a given operator (e.g. console toggling under linux does not exists). --- release/scripts/modules/bl_i18n_utils/bl_process_msg.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/release/scripts/modules/bl_i18n_utils/bl_process_msg.py b/release/scripts/modules/bl_i18n_utils/bl_process_msg.py index 6307ca21a26..bd5dd091527 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_process_msg.py +++ b/release/scripts/modules/bl_i18n_utils/bl_process_msg.py @@ -396,7 +396,10 @@ def dump_py_messages_from_files(messages, check_ctxt, files): try: return op.get_rna().bl_rna.translation_context except Exception as e: + default_op_context = bpy.app.translations.contexts.operator_default print("ERROR: ", str(e)) + print(" Assuming default operator context '{}'".format(default_op_context)) + return default_op_context # ------------------------------------------------------------------------- # Gather function names From 372cf9330955c7d7b16529ffc7d39265ada47474 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Sun, 10 Feb 2013 06:13:26 +0000 Subject: [PATCH 224/227] BGE: Splitting up the bge.types docs so they are not all on the same page. This should make them much easier to browse. --- doc/python_api/rst/bge.types.rst | 5385 +---------------- .../bge_types/bge.types.BL_ActionActuator.rst | 78 + .../bge.types.BL_ArmatureActuator.rst | 61 + .../bge_types/bge.types.BL_ArmatureBone.rst | 105 + .../bge.types.BL_ArmatureChannel.rst | 278 + .../bge.types.BL_ArmatureConstraint.rst | 129 + .../bge_types/bge.types.BL_ArmatureObject.rst | 34 + .../rst/bge_types/bge.types.BL_Shader.rst | 220 + .../bge.types.BL_ShapeActionActuator.rst | 72 + .../rst/bge_types/bge.types.CListValue.rst | 72 + .../rst/bge_types/bge.types.CPropValue.rst | 11 + .../rst/bge_types/bge.types.CValue.rst | 17 + .../bge_types/bge.types.KX_ArmatureSensor.rst | 36 + .../bge.types.KX_BlenderMaterial.rst | 77 + .../rst/bge_types/bge.types.KX_Camera.rst | 284 + .../bge_types/bge.types.KX_CameraActuator.rst | 47 + .../bge.types.KX_CharacterWrapper.rst | 45 + .../bge.types.KX_ConstraintActuator.rst | 78 + .../bge.types.KX_ConstraintWrapper.rst | 18 + .../rst/bge_types/bge.types.KX_FontObject.rst | 12 + .../bge_types/bge.types.KX_GameActuator.rst | 23 + .../rst/bge_types/bge.types.KX_GameObject.rst | 839 +++ .../bge_types/bge.types.KX_IpoActuator.rst | 65 + .../bge_types/bge.types.KX_LibLoadStatus.rst | 45 + .../bge_types/bge.types.KX_LightObject.rst | 90 + .../rst/bge_types/bge.types.KX_MeshProxy.rst | 134 + .../bge.types.KX_MouseFocusSensor.rst | 66 + .../bge_types/bge.types.KX_NavMeshObject.rst | 47 + .../rst/bge_types/bge.types.KX_NearSensor.rst | 23 + .../bge.types.KX_NetworkMessageActuator.rst | 35 + .../bge.types.KX_NetworkMessageSensor.rst | 38 + .../bge_types/bge.types.KX_ObjectActuator.rst | 129 + .../bge_types/bge.types.KX_ParentActuator.rst | 38 + .../rst/bge_types/bge.types.KX_PolyProxy.rst | 139 + .../bge.types.KX_PolygonMaterial.rst | 250 + .../bge_types/bge.types.KX_RadarSensor.rst | 44 + .../rst/bge_types/bge.types.KX_RaySensor.rst | 72 + .../bge.types.KX_SCA_AddObjectActuator.rst | 55 + .../bge.types.KX_SCA_DynamicActuator.rst | 29 + .../bge.types.KX_SCA_EndObjectActuator.rst | 13 + .../bge.types.KX_SCA_ReplaceMeshActuator.rst | 89 + .../rst/bge_types/bge.types.KX_Scene.rst | 172 + .../bge_types/bge.types.KX_SceneActuator.rst | 49 + .../bge_types/bge.types.KX_SoundActuator.rst | 115 + .../bge_types/bge.types.KX_StateActuator.rst | 29 + .../bge.types.KX_SteeringActuator.rst | 71 + .../bge_types/bge.types.KX_TouchSensor.rst | 41 + .../bge.types.KX_TrackToActuator.rst | 39 + .../bge_types/bge.types.KX_VehicleWrapper.rst | 161 + .../bge_types/bge.types.KX_VertexProxy.rst | 209 + .../bge.types.KX_VisibilityActuator.rst | 29 + .../rst/bge_types/bge.types.PyObjectPlus.rst | 21 + .../bge.types.SCA_2DFilterActuator.rst | 49 + .../bge_types/bge.types.SCA_ANDController.rst | 13 + .../bge.types.SCA_ActuatorSensor.rst | 19 + .../bge_types/bge.types.SCA_AlwaysSensor.rst | 11 + .../bge_types/bge.types.SCA_DelaySensor.rst | 39 + .../rst/bge_types/bge.types.SCA_IActuator.rst | 11 + .../bge_types/bge.types.SCA_IController.rst | 55 + .../bge_types/bge.types.SCA_ILogicBrick.rst | 29 + .../rst/bge_types/bge.types.SCA_IObject.rst | 11 + .../rst/bge_types/bge.types.SCA_ISensor.rst | 95 + .../bge.types.SCA_JoystickSensor.rst | 133 + .../bge.types.SCA_KeyboardSensor.rst | 64 + .../bge_types/bge.types.SCA_MouseSensor.rst | 39 + .../bge.types.SCA_NANDController.rst | 13 + .../bge_types/bge.types.SCA_NORController.rst | 13 + .../bge_types/bge.types.SCA_ORController.rst | 13 + .../bge.types.SCA_PropertyActuator.rst | 29 + .../bge.types.SCA_PropertySensor.rst | 41 + .../bge.types.SCA_PythonController.rst | 48 + .../bge.types.SCA_PythonJoystick.rst | 75 + .../bge.types.SCA_PythonKeyboard.rst | 37 + .../bge_types/bge.types.SCA_PythonMouse.rst | 35 + .../bge.types.SCA_RandomActuator.rst | 127 + .../bge_types/bge.types.SCA_RandomSensor.rst | 23 + .../bge.types.SCA_XNORController.rst | 13 + .../bge_types/bge.types.SCA_XORController.rst | 13 + doc/python_api/sphinx_doc_gen.py | 9 +- 79 files changed, 5932 insertions(+), 5383 deletions(-) create mode 100644 doc/python_api/rst/bge_types/bge.types.BL_ActionActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.BL_ArmatureActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.BL_ArmatureBone.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.BL_ArmatureChannel.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.BL_ArmatureConstraint.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.BL_ArmatureObject.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.BL_Shader.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.BL_ShapeActionActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.CListValue.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.CPropValue.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.CValue.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_ArmatureSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_BlenderMaterial.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_Camera.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_CameraActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_CharacterWrapper.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_ConstraintActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_ConstraintWrapper.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_FontObject.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_GameActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_IpoActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_LibLoadStatus.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_LightObject.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_MeshProxy.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_MouseFocusSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_NavMeshObject.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_NearSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_NetworkMessageActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_NetworkMessageSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_ObjectActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_ParentActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_PolyProxy.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_PolygonMaterial.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_RadarSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_RaySensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_SCA_AddObjectActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_SCA_DynamicActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_SCA_EndObjectActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_SCA_ReplaceMeshActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_Scene.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_SceneActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_SoundActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_StateActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_SteeringActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_TouchSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_TrackToActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_VehicleWrapper.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_VertexProxy.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.KX_VisibilityActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.PyObjectPlus.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_2DFilterActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_ANDController.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_ActuatorSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_AlwaysSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_DelaySensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_IActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_IController.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_ILogicBrick.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_IObject.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_ISensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_JoystickSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_KeyboardSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_MouseSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_NANDController.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_NORController.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_ORController.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_PropertyActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_PropertySensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_PythonController.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_PythonJoystick.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_PythonKeyboard.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_PythonMouse.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_RandomActuator.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_RandomSensor.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_XNORController.rst create mode 100644 doc/python_api/rst/bge_types/bge.types.SCA_XORController.rst diff --git a/doc/python_api/rst/bge.types.rst b/doc/python_api/rst/bge.types.rst index 0d1b69ffc7b..f24cc3f998c 100644 --- a/doc/python_api/rst/bge.types.rst +++ b/doc/python_api/rst/bge.types.rst @@ -31,5387 +31,8 @@ a :class:`SCA_PythonController` logic brick. Types ***** -.. class:: PyObjectPlus +.. toctree:: + :glob: - PyObjectPlus base class of most other types in the Game Engine. + bge.types.* - .. attribute:: invalid - - Test if the object has been freed by the game engine and is no longer valid. - - Normally this is not a problem but when storing game engine data in the GameLogic module, - KX_Scenes or other KX_GameObjects its possible to hold a reference to invalid data. - Calling an attribute or method on an invalid object will raise a SystemError. - - The invalid attribute allows testing for this case without exception handling. - - :type: boolean - -.. class:: CValue(PyObjectPlus) - - This class is a basis for other classes. - - .. attribute:: name - - The name of this CValue derived object (read-only). - - :type: string - -.. class:: CPropValue(CValue) - - This class has no python functions - -.. class:: SCA_ILogicBrick(CValue) - - Base class for all logic bricks. - - .. attribute:: executePriority - - This determines the order controllers are evaluated, and actuators are activated (lower priority is executed first). - - :type: executePriority: int - - .. attribute:: owner - - The game object this logic brick is attached to (read-only). - - :type: :class:`KX_GameObject` or None in exceptional cases. - - .. attribute:: name - - The name of this logic brick (read-only). - - :type: string - -.. class:: SCA_PythonKeyboard(PyObjectPlus) - - The current keyboard. - - .. attribute:: events - - A dictionary containing the status of each keyboard event or key. (read-only). - - :type: dictionary {:ref:`keycode`::ref:`status`, ...} - - .. attribute:: active_events - - A dictionary containing the status of only the active keyboard events or keys. (read-only). - - :type: dictionary {:ref:`keycode`::ref:`status`, ...} - - - .. function:: getClipboard() - - Gets the clipboard text. - - :rtype: string - - .. function:: setClipboard(text) - - Sets the clipboard text. - - :arg text: New clipboard text - :type text: string - -.. class:: SCA_PythonMouse(PyObjectPlus) - - The current mouse. - - .. attribute:: events - - a dictionary containing the status of each mouse event. (read-only). - - :type: dictionary {:ref:`keycode`::ref:`status`, ...} - - .. attribute:: active_events - - a dictionary containing the status of only the active mouse events. (read-only). - - :type: dictionary {:ref:`keycode`::ref:`status`, ...} - - .. attribute:: position - - The normalized x and y position of the mouse cursor. - - :type: list [x, y] - - .. attribute:: visible - - The visibility of the mouse cursor. - - :type: boolean - -.. class:: SCA_PythonJoystick(PyObjectPlus) - - A Python interface to a joystick. - - .. attribute:: name - - The name assigned to the joystick by the operating system. (read-only) - - :type: string - - .. attribute:: activeButtons - - A list of active button values. (read-only) - - :type: list - - .. attribute:: axisValues - - The state of the joysticks axis as a list of values :data:`numAxis` long. (read-only). - - :type: list of ints. - - Each specifying the value of an axis between -1.0 and 1.0 depending on how far the axis is pushed, 0 for nothing. - The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. - - * left:[-1.0, 0.0, ...] - * right:[1.0, 0.0, ...] - * up:[0.0, -1.0, ...] - * down:[0.0, 1.0, ...] - - .. attribute:: hatValues - - The state of the joysticks hats as a list of values :data:`numHats` long. (read-only). - - :type: list of ints - - Each specifying the direction of the hat from 1 to 12, 0 when inactive. - - Hat directions are as follows... - - * 0:None - * 1:Up - * 2:Right - * 4:Down - * 8:Left - * 3:Up - Right - * 6:Down - Right - * 12:Down - Left - * 9:Up - Left - - .. attribute:: numAxis - - The number of axes for the joystick at this index. (read-only). - - :type: integer - - .. attribute:: numButtons - - The number of buttons for the joystick at this index. (read-only). - - :type: integer - - .. attribute:: numHats - - The number of hats for the joystick at this index. (read-only). - - :type: integer - -.. class:: SCA_IObject(CValue) - - This class has no python functions - -.. class:: SCA_ISensor(SCA_ILogicBrick) - - Base class for all sensor logic bricks. - - .. attribute:: usePosPulseMode - - Flag to turn positive pulse mode on and off. - - :type: boolean - - .. attribute:: useNegPulseMode - - Flag to turn negative pulse mode on and off. - - :type: boolean - - .. attribute:: frequency - - The frequency for pulse mode sensors. - - :type: integer - - .. attribute:: level - - level Option whether to detect level or edge transition when entering a state. - It makes a difference only in case of logic state transition (state actuator). - A level detector will immediately generate a pulse, negative or positive - depending on the sensor condition, as soon as the state is activated. - A edge detector will wait for a state change before generating a pulse. - note: mutually exclusive with :data:`tap`, enabling will disable :data:`tap`. - - :type: boolean - - .. attribute:: tap - - When enabled only sensors that are just activated will send a positive event, - after this they will be detected as negative by the controllers. - This will make a key thats held act as if its only tapped for an instant. - note: mutually exclusive with :data:`level`, enabling will disable :data:`level`. - - :type: boolean - - .. attribute:: invert - - Flag to set if this sensor activates on positive or negative events. - - :type: boolean - - .. attribute:: triggered - - True if this sensor brick is in a positive state. (read-only). - - :type: boolean - - .. attribute:: positive - - True if this sensor brick is in a positive state. (read-only). - - :type: boolean - - .. attribute:: pos_ticks - - The number of ticks since the last positive pulse (read-only). - - :type: int - - .. attribute:: neg_ticks - - The number of ticks since the last negative pulse (read-only). - - :type: int - - .. attribute:: status - - The status of the sensor (read-only): can be one of :ref:`these constants`. - - :type: int - - .. note:: - - This convenient attribute combines the values of triggered and positive attributes. - - .. method:: reset() - - Reset sensor internal state, effect depends on the type of sensor and settings. - - The sensor is put in its initial state as if it was just activated. - -.. class:: SCA_IController(SCA_ILogicBrick) - - Base class for all controller logic bricks. - - .. attribute:: state - - The controllers state bitmask. This can be used with the GameObject's state to test if the controller is active. - - :type: int bitmask - - .. attribute:: sensors - - A list of sensors linked to this controller. - - :type: sequence supporting index/string lookups and iteration. - - .. note:: - - The sensors are not necessarily owned by the same object. - - .. note:: - - When objects are instanced in dupligroups links may be lost from objects outside the dupligroup. - - .. attribute:: actuators - - A list of actuators linked to this controller. - - :type: sequence supporting index/string lookups and iteration. - - .. note:: - - The sensors are not necessarily owned by the same object. - - .. note:: - - When objects are instanced in dupligroups links may be lost from objects outside the dupligroup. - - .. attribute:: useHighPriority - - When set the controller executes always before all other controllers that dont have this set. - - :type: boolen - - .. note:: - - Order of execution between high priority controllers is not guaranteed. - -.. class:: SCA_IActuator(SCA_ILogicBrick) - - Base class for all actuator logic bricks. - -.. class:: BL_ActionActuator(SCA_IActuator) - - Action Actuators apply an action to an actor. - - .. attribute:: action - - The name of the action to set as the current action. - - :type: string - - .. attribute:: frameStart - - Specifies the starting frame of the animation. - - :type: float - - .. attribute:: frameEnd - - Specifies the ending frame of the animation. - - :type: float - - .. attribute:: blendIn - - Specifies the number of frames of animation to generate when making transitions between actions. - - :type: float - - .. attribute:: priority - - Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers. - - :type: integer - - .. attribute:: frame - - Sets the current frame for the animation. - - :type: float - - .. attribute:: propName - - Sets the property to be used in FromProp playback mode. - - :type: string - - .. attribute:: blendTime - - Sets the internal frame timer. This property must be in the range from 0.0 to blendIn. - - :type: float - - .. attribute:: mode - - The operation mode of the actuator. Can be one of :ref:`these constants`. - - :type: integer - - .. attribute:: useContinue - - The actions continue option, True or False. When True, the action will always play from where last left off, - otherwise negative events to this actuator will reset it to its start frame. - - :type: boolean - - .. attribute:: framePropName - - The name of the property that is set to the current frame number. - - :type: string - -.. class:: BL_Shader(PyObjectPlus) - - BL_Shader GLSL shaders. - - TODO - Description - - .. method:: setUniformfv(name, fList) - - Set a uniform with a list of float values - - :arg name: the uniform name - :type name: string - :arg fList: a list (2, 3 or 4 elements) of float values - :type fList: list[float] - - .. method:: delSource() - - Clear the shader. Use this method before the source is changed with :data:`setSource`. - - .. method:: getFragmentProg() - - Returns the fragment program. - - :return: The fragment program. - :rtype: string - - .. method:: getVertexProg() - - Get the vertex program. - - :return: The vertex program. - :rtype: string - - .. method:: isValid() - - Check if the shader is valid. - - :return: True if the shader is valid - :rtype: boolean - - .. method:: setAttrib(enum) - - Set attribute location. (The parameter is ignored a.t.m. and the value of "tangent" is always used.) - - :arg enum: attribute location value - :type enum: integer - - .. method:: setNumberOfPasses( max_pass ) - - Set the maximum number of passes. Not used a.t.m. - - :arg max_pass: the maximum number of passes - :type max_pass: integer - - .. method:: setSampler(name, index) - - Set uniform texture sample index. - - :arg name: Uniform name - :type name: string - :arg index: Texture sample index. - :type index: integer - - .. method:: setSource(vertexProgram, fragmentProgram) - - Set the vertex and fragment programs - - :arg vertexProgram: Vertex program - :type vertexProgram: string - :arg fragmentProgram: Fragment program - :type fragmentProgram: string - - .. method:: setUniform1f(name, fx) - - Set a uniform with 1 float value. - - :arg name: the uniform name - :type name: string - :arg fx: Uniform value - :type fx: float - - .. method:: setUniform1i(name, ix) - - Set a uniform with an integer value. - - :arg name: the uniform name - :type name: string - :arg ix: the uniform value - :type ix: integer - - .. method:: setUniform2f(name, fx, fy) - - Set a uniform with 2 float values - - :arg name: the uniform name - :type name: string - :arg fx: first float value - :type fx: float - - :arg fy: second float value - :type fy: float - - .. method:: setUniform2i(name, ix, iy) - - Set a uniform with 2 integer values - - :arg name: the uniform name - :type name: string - :arg ix: first integer value - :type ix: integer - :arg iy: second integer value - :type iy: integer - - .. method:: setUniform3f(name, fx, fy, fz) - - Set a uniform with 3 float values. - - :arg name: the uniform name - :type name: string - :arg fx: first float value - :type fx: float - :arg fy: second float value - :type fy: float - :arg fz: third float value - :type fz: float - - .. method:: setUniform3i(name, ix, iy, iz) - - Set a uniform with 3 integer values - - :arg name: the uniform name - :type name: string - :arg ix: first integer value - :type ix: integer - :arg iy: second integer value - :type iy: integer - :arg iz: third integer value - :type iz: integer - - .. method:: setUniform4f(name, fx, fy, fz, fw) - - Set a uniform with 4 float values. - - :arg name: the uniform name - :type name: string - :arg fx: first float value - :type fx: float - :arg fy: second float value - :type fy: float - :arg fz: third float value - :type fz: float - :arg fw: fourth float value - :type fw: float - - .. method:: setUniform4i(name, ix, iy, iz, iw) - - Set a uniform with 4 integer values - - :arg name: the uniform name - :type name: string - :arg ix: first integer value - :type ix: integer - :arg iy: second integer value - :type iy: integer - :arg iz: third integer value - :type iz: integer - :arg iw: fourth integer value - :type iw: integer - - .. method:: setUniformDef(name, type) - - Define a new uniform - - :arg name: the uniform name - :type name: string - :arg type: uniform type - :type type: UNI_NONE, UNI_INT, UNI_FLOAT, UNI_INT2, UNI_FLOAT2, UNI_INT3, UNI_FLOAT3, UNI_INT4, UNI_FLOAT4, UNI_MAT3, UNI_MAT4, UNI_MAX - - .. method:: setUniformMatrix3(name, mat, transpose) - - Set a uniform with a 3x3 matrix value - - :arg name: the uniform name - :type name: string - :arg mat: A 3x3 matrix [[f, f, f], [f, f, f], [f, f, f]] - :type mat: 3x3 matrix - :arg transpose: set to True to transpose the matrix - :type transpose: boolean - - .. method:: setUniformMatrix4(name, mat, transpose) - - Set a uniform with a 4x4 matrix value - - :arg name: the uniform name - :type name: string - :arg mat: A 4x4 matrix [[f, f, f, f], [f, f, f, f], [f, f, f, f], [f, f, f, f]] - :type mat: 4x4 matrix - :arg transpose: set to True to transpose the matrix - :type transpose: boolean - - .. method:: setUniformiv(name, iList) - - Set a uniform with a list of integer values - - :arg name: the uniform name - :type name: string - :arg iList: a list (2, 3 or 4 elements) of integer values - :type iList: list[integer] - - .. method:: validate() - - Validate the shader object. - -.. class:: BL_ShapeActionActuator(SCA_IActuator) - - ShapeAction Actuators apply an shape action to an mesh object. - - .. attribute:: action - - The name of the action to set as the current shape action. - - :type: string - - .. attribute:: frameStart - - Specifies the starting frame of the shape animation. - - :type: float - - .. attribute:: frameEnd - - Specifies the ending frame of the shape animation. - - :type: float - - .. attribute:: blendIn - - Specifies the number of frames of animation to generate when making transitions between actions. - - :type: float - - .. attribute:: priority - - Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers. - - :type: integer - - .. attribute:: frame - - Sets the current frame for the animation. - - :type: float - - .. attribute:: propName - - Sets the property to be used in FromProp playback mode. - - :type: string - - .. attribute:: blendTime - - Sets the internal frame timer. This property must be in the range from 0.0 to blendin. - - :type: float - - .. attribute:: mode - - The operation mode of the actuator. Can be one of :ref:`these constants`. - - :type: integer - - .. attribute:: framePropName - - The name of the property that is set to the current frame number. - - :type: string - - -.. class:: KX_SteeringActuator(SCA_IActuator) - - Steering Actuator for navigation. - - .. attribute:: behavior - - The steering behavior to use. - - :type: one of :ref:`these constants ` - - .. attribute:: velocity - - Velocity magnitude - - :type: float - - .. attribute:: acceleration - - Max acceleration - - :type: float - - .. attribute:: turnspeed - - Max turn speed - - :type: float - - .. attribute:: distance - - Relax distance - - :type: float - - .. attribute:: target - - Target object - - :type: :class:`KX_GameObject` - - .. attribute:: navmesh - - Navigation mesh - - :type: :class:`KX_GameObject` - - .. attribute:: selfterminated - - Terminate when target is reached - - :type: boolean - - .. attribute:: enableVisualization - - Enable debug visualization - - :type: boolean - - .. attribute:: pathUpdatePeriod - - Path update period - - :type: int - -.. class:: CListValue(CPropValue) - - This is a list like object used in the game engine internally that behaves similar to a python list in most ways. - - As well as the normal index lookup (``val= clist[i]``), CListValue supports string lookups (``val= scene.objects["Cube"]``) - - Other operations such as ``len(clist)``, ``list(clist)``, ``clist[0:10]`` are also supported. - - .. method:: append(val) - - Add an item to the list (like pythons append) - - .. warning:: - - Appending values to the list can cause crashes when the list is used internally by the game engine. - - .. method:: count(val) - - Count the number of instances of a value in the list. - - :return: number of instances - :rtype: integer - - .. method:: index(val) - - Return the index of a value in the list. - - :return: The index of the value in the list. - :rtype: integer - - .. method:: reverse() - - Reverse the order of the list. - - .. method:: get(key, default=None) - - Return the value matching key, or the default value if its not found. - - :return: The key value or a default. - - .. method:: from_id(id) - - This is a funtion especially for the game engine to return a value with a spesific id. - - Since object names are not always unique, the id of an object can be used to get an object from the CValueList. - - Example: - - .. code-block:: python - - myObID=id(gameObject) - ob= scene.objects.from_id(myObID) - - Where ``myObID`` is an int or long from the id function. - - This has the advantage that you can store the id in places you could not store a gameObject. - - .. warning:: - - The id is derived from a memory location and will be different each time the game engine starts. - - .. warning:: - - The id can't be stored as an integer in game object properties, as those only have a limited range that the id may not be contained in. Instead an id can be stored as a string game property and converted back to an integer for use in from_id lookups. - -.. class:: KX_BlenderMaterial(PyObjectPlus) - - KX_BlenderMaterial - - .. attribute:: shader - - The materials shader. - - :type: :class:`BL_Shader` - - .. attribute:: blending - - Ints used for pixel blending, (src, dst), matching the setBlending method. - - :type: (integer, integer) - - .. attribute:: material_index - - The material's index. - - :type: integer - - .. method:: getShader() - - Returns the material's shader. - - :return: the material's shader - :rtype: :class:`BL_Shader` - - .. method:: setBlending(src, dest) - - Set the pixel color arithmetic functions. - - :arg src: Specifies how the red, green, blue, and alpha source blending factors are computed. - :type src: Value in... - - * GL_ZERO, - * GL_ONE, - * GL_SRC_COLOR, - * GL_ONE_MINUS_SRC_COLOR, - * GL_DST_COLOR, - * GL_ONE_MINUS_DST_COLOR, - * GL_SRC_ALPHA, - * GL_ONE_MINUS_SRC_ALPHA, - * GL_DST_ALPHA, - * GL_ONE_MINUS_DST_ALPHA, - * GL_SRC_ALPHA_SATURATE - - :arg dest: Specifies how the red, green, blue, and alpha destination blending factors are computed. - :type dest: Value in... - - * GL_ZERO - * GL_ONE - * GL_SRC_COLOR - * GL_ONE_MINUS_SRC_COLOR - * GL_DST_COLOR - * GL_ONE_MINUS_DST_COLOR - * GL_SRC_ALPHA - * GL_ONE_MINUS_SRC_ALPHA - * GL_DST_ALPHA - * GL_ONE_MINUS_DST_ALPHA - * GL_SRC_ALPHA_SATURATE - - .. method:: getMaterialIndex() - - Returns the material's index. - - :return: the material's index - :rtype: integer - -.. class:: KX_CameraActuator(SCA_IActuator) - - Applies changes to a camera. - - .. attribute:: damping - - strength of of the camera following movement. - - :type: float - - .. attribute:: axis - - The camera axis (0, 1, 2) for positive ``XYZ``, (3, 4, 5) for negative ``XYZ``. - - :type: int - - .. attribute:: min - - minimum distance to the target object maintained by the actuator. - - :type: float - - .. attribute:: max - - maximum distance to stay from the target object. - - :type: float - - .. attribute:: height - - height to stay above the target object. - - :type: float - - .. attribute:: object - - the object this actuator tracks. - - :type: :class:`KX_GameObject` or None - -.. class:: KX_ConstraintActuator(SCA_IActuator) - - A constraint actuator limits the position, rotation, distance or orientation of an object. - - .. attribute:: damp - - Time constant of the constraint expressed in frame (not use by Force field constraint). - - :type: integer - - .. attribute:: rotDamp - - Time constant for the rotation expressed in frame (only for the distance constraint), 0 = use damp for rotation as well. - - :type: integer - - .. attribute:: direction - - The reference direction in world coordinate for the orientation constraint. - - :type: 3-tuple of float: (x, y, z) - - .. attribute:: option - - Binary combination of :ref:`these constants ` - - :type: integer - - .. attribute:: time - - activation time of the actuator. The actuator disables itself after this many frame. If set to 0, the actuator is not limited in time. - - :type: integer - - .. attribute:: propName - - the name of the property or material for the ray detection of the distance constraint. - - :type: string - - .. attribute:: min - - The lower bound of the constraint. For the rotation and orientation constraint, it represents radiant. - - :type: float - - .. attribute:: distance - - the target distance of the distance constraint. - - :type: float - - .. attribute:: max - - the upper bound of the constraint. For rotation and orientation constraints, it represents radiant. - - :type: float - - .. attribute:: rayLength - - the length of the ray of the distance constraint. - - :type: float - - .. attribute:: limit - - type of constraint. Use one of the :ref:`these constants ` - - :type: integer. - - -.. class:: KX_ConstraintWrapper(PyObjectPlus) - - KX_ConstraintWrapper - - .. method:: getConstraintId(val) - - Returns the contraint's ID - - :return: the constraint's ID - :rtype: integer - -.. class:: KX_GameActuator(SCA_IActuator) - - The game actuator loads a new .blend file, restarts the current .blend file or quits the game. - - .. attribute:: fileName - - the new .blend file to load. - - :type: string - - .. attribute:: mode - - The mode of this actuator. Can be on of :ref:`these constants ` - - :type: Int - -.. class:: KX_GameObject(SCA_IObject) - - All game objects are derived from this class. - - Properties assigned to game objects are accessible as attributes of this class. - - .. note:: - - Calling ANY method or attribute on an object that has been removed from a scene will raise a SystemError, - if an object may have been removed since last accessing it use the :data:`invalid` attribute to check. - - KX_GameObject can be subclassed to extend functionality. For example: - - .. code-block:: python - - import bge - - class CustomGameObject(bge.types.KX_GameObject): - RATE = 0.05 - - def __init__(self, old_owner): - # "old_owner" can just be ignored. At this point, "self" is - # already the object in the scene, and "old_owner" has been - # destroyed. - - # New attributes can be defined - but we could also use a game - # property, like "self['rate']". - self.rate = CustomGameObject.RATE - - def update(self): - self.worldPosition.z += self.rate - - # switch direction - if self.worldPosition.z > 1.0: - self.rate = -CustomGameObject.RATE - elif self.worldPosition.z < 0.0: - self.rate = CustomGameObject.RATE - - # Called first - def mutate(cont): - old_object = cont.owner - mutated_object = CustomGameObject(cont.owner) - - # After calling the constructor above, references to the old object - # should not be used. - assert(old_object is not mutated_object) - assert(old_object.invalid) - assert(mutated_object is cont.owner) - - # Called later - note we are now working with the mutated object. - def update(cont): - cont.owner.update() - - When subclassing objects other than empties and meshes, the specific type - should be used - e.g. inherit from :class:`BL_ArmatureObject` when the object - to mutate is an armature. - - .. attribute:: name - - The object's name. (read-only). - - :type: string - - .. attribute:: mass - - The object's mass - - :type: float - - .. note:: - - The object must have a physics controller for the mass to be applied, otherwise the mass value will be returned as 0.0. - - .. attribute:: linVelocityMin - - Enforces the object keeps moving at a minimum velocity. - - :type: float - - .. note:: - - Applies to dynamic and rigid body objects only. - - .. note:: - - A value of 0.0 disables this option. - - .. note:: - - While objects are stationary the minimum velocity will not be applied. - - .. attribute:: linVelocityMax - - Clamp the maximum linear velocity to prevent objects moving beyond a set speed. - - :type: float - - .. note:: - - Applies to dynamic and rigid body objects only. - - .. note:: - - A value of 0.0 disables this option (rather then setting it stationary). - - .. attribute:: localInertia - - the object's inertia vector in local coordinates. Read only. - - :type: list [ix, iy, iz] - - .. attribute:: parent - - The object's parent object. (read-only). - - :type: :class:`KX_GameObject` or None - - .. attribute:: groupMembers - - Returns the list of group members if the object is a group object, otherwise None is returned. - - :type: :class:`CListValue` of :class:`KX_GameObject` or None - - .. attribute:: groupObject - - Returns the group object that the object belongs to or None if the object is not part of a group. - - :type: :class:`KX_GameObject` or None - - .. attribute:: scene - - The object's scene. (read-only). - - :type: :class:`KX_Scene` or None - - .. attribute:: visible - - visibility flag. - - :type: boolean - - .. note:: - - Game logic will still run for invisible objects. - - .. attribute:: color - - The object color of the object. [r, g, b, a] - - :type: :class:`mathutils.Vector` - - .. attribute:: occlusion - - occlusion capability flag. - - :type: boolean - - .. attribute:: position - - The object's position. [x, y, z] On write: local position, on read: world position - - .. deprecated:: use :data:`localPosition` and :data:`worldPosition`. - - :type: :class:`mathutils.Vector` - - .. attribute:: orientation - - The object's orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector. On write: local orientation, on read: world orientation - - .. deprecated:: use :data:`localOrientation` and :data:`worldOrientation`. - - :type: :class:`mathutils.Matrix` - - .. attribute:: scaling - - The object's scaling factor. [sx, sy, sz] On write: local scaling, on read: world scaling - - .. deprecated:: use :data:`localScale` and :data:`worldScale`. - - :type: :class:`mathutils.Vector` - - .. attribute:: localOrientation - - The object's local orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector. - - :type: :class:`mathutils.Matrix` - - .. attribute:: worldOrientation - - The object's world orientation. 3x3 Matrix. - - :type: :class:`mathutils.Matrix` - - .. attribute:: localScale - - The object's local scaling factor. [sx, sy, sz] - - :type: :class:`mathutils.Vector` - - .. attribute:: worldScale - - The object's world scaling factor. [sx, sy, sz] - - :type: :class:`mathutils.Vector` - - .. attribute:: localPosition - - The object's local position. [x, y, z] - - :type: :class:`mathutils.Vector` - - .. attribute:: worldPosition - - The object's world position. [x, y, z] - - :type: :class:`mathutils.Vector` - - .. attribute:: localTransform - - The object's local space transform matrix. 4x4 Matrix. - - :type: :class:`mathutils.Matrix` - - .. attribute:: worldTransform - - The object's world space transform matrix. 4x4 Matrix. - - :type: :class:`mathutils.Matrix` - - .. attribute:: localLinearVelocity - - The object's local linear velocity. [x, y, z] - - :type: :class:`mathutils.Vector` - - .. attribute:: worldLinearVelocity - - The object's world linear velocity. [x, y, z] - - :type: :class:`mathutils.Vector` - - .. attribute:: localAngularVelocity - - The object's local angular velocity. [x, y, z] - - :type: :class:`mathutils.Vector` - - .. attribute:: worldAngularVelocity - - The object's world angular velocity. [x, y, z] - - :type: :class:`mathutils.Vector` - - .. attribute:: timeOffset - - adjust the slowparent delay at runtime. - - :type: float - - .. attribute:: state - - the game object's state bitmask, using the first 30 bits, one bit must always be set. - - :type: int - - .. attribute:: meshes - - a list meshes for this object. - - :type: list of :class:`KX_MeshProxy` - - .. note:: - - Most objects use only 1 mesh. - - .. note:: - - Changes to this list will not update the KX_GameObject. - - .. attribute:: sensors - - a sequence of :class:`SCA_ISensor` objects with string/index lookups and iterator support. - - :type: list - - .. note:: - - This attribute is experemental and may be removed (but probably wont be). - - .. note:: - - Changes to this list will not update the KX_GameObject. - - .. attribute:: controllers - - a sequence of :class:`SCA_IController` objects with string/index lookups and iterator support. - - :type: list of :class:`SCA_ISensor` - - .. note:: - - This attribute is experemental and may be removed (but probably wont be). - - .. note:: - - Changes to this list will not update the KX_GameObject. - - .. attribute:: actuators - - a list of :class:`SCA_IActuator` with string/index lookups and iterator support. - - :type: list - - .. note:: - - This attribute is experemental and may be removed (but probably wont be). - - .. note:: - - Changes to this list will not update the KX_GameObject. - - .. attribute:: attrDict - - get the objects internal python attribute dictionary for direct (faster) access. - - :type: dict - - .. attribute:: children - - direct children of this object, (read-only). - - :type: :class:`CListValue` of :class:`KX_GameObject`'s - - .. attribute:: childrenRecursive - - all children of this object including childrens children, (read-only). - - :type: :class:`CListValue` of :class:`KX_GameObject`'s - - .. attribute:: life - - The number of seconds until the object ends, assumes 50fps. - (when added with an add object actuator), (read-only). - - :type: float - - .. method:: endObject() - - Delete this object, can be used in place of the EndObject Actuator. - - The actual removal of the object from the scene is delayed. - - .. method:: replaceMesh(mesh, useDisplayMesh=True, usePhysicsMesh=False) - - Replace the mesh of this object with a new mesh. This works the same was as the actuator. - - :arg mesh: mesh to replace or the meshes name. - :type mesh: :class:`MeshProxy` or string - :arg useDisplayMesh: when enabled the display mesh will be replaced (optional argument). - :type useDisplayMesh: boolean - :arg usePhysicsMesh: when enabled the physics mesh will be replaced (optional argument). - :type usePhysicsMesh: boolean - - .. method:: setVisible(visible, recursive) - - Sets the game object's visible flag. - - :arg visible: the visible state to set. - :type visible: boolean - :arg recursive: optional argument to set all childrens visibility flag too. - :type recursive: boolean - - .. method:: setOcclusion(occlusion, recursive) - - Sets the game object's occlusion capability. - - :arg occlusion: the state to set the occlusion to. - :type occlusion: boolean - :arg recursive: optional argument to set all childrens occlusion flag too. - :type recursive: boolean - - .. method:: alignAxisToVect(vect, axis=2, factor=1.0) - - Aligns any of the game object's axis along the given vector. - - - :arg vect: a vector to align the axis. - :type vect: 3D vector - :arg axis: The axis you want to align - - * 0: X axis - * 1: Y axis - * 2: Z axis - - :type axis: integer - :arg factor: Only rotate a feaction of the distance to the target vector (0.0 - 1.0) - :type factor: float - - .. method:: getAxisVect(vect) - - Returns the axis vector rotates by the objects worldspace orientation. - This is the equivalent of multiplying the vector by the orientation matrix. - - :arg vect: a vector to align the axis. - :type vect: 3D Vector - :return: The vector in relation to the objects rotation. - :rtype: 3d vector. - - .. method:: applyMovement(movement, local=False) - - Sets the game object's movement. - - :arg movement: movement vector. - :type movement: 3D Vector - :arg local: - * False: you get the "global" movement ie: relative to world orientation. - * True: you get the "local" movement ie: relative to object orientation. - :arg local: boolean - - .. method:: applyRotation(rotation, local=False) - - Sets the game object's rotation. - - :arg rotation: rotation vector. - :type rotation: 3D Vector - :arg local: - * False: you get the "global" rotation ie: relative to world orientation. - * True: you get the "local" rotation ie: relative to object orientation. - :arg local: boolean - - .. method:: applyForce(force, local=False) - - Sets the game object's force. - - This requires a dynamic object. - - :arg force: force vector. - :type force: 3D Vector - :arg local: - * False: you get the "global" force ie: relative to world orientation. - * True: you get the "local" force ie: relative to object orientation. - :type local: boolean - - .. method:: applyTorque(torque, local=False) - - Sets the game object's torque. - - This requires a dynamic object. - - :arg torque: torque vector. - :type torque: 3D Vector - :arg local: - * False: you get the "global" torque ie: relative to world orientation. - * True: you get the "local" torque ie: relative to object orientation. - :type local: boolean - - .. method:: getLinearVelocity(local=False) - - Gets the game object's linear velocity. - - This method returns the game object's velocity through it's centre of mass, ie no angular velocity component. - - :arg local: - * False: you get the "global" velocity ie: relative to world orientation. - * True: you get the "local" velocity ie: relative to object orientation. - :type local: boolean - :return: the object's linear velocity. - :rtype: list [vx, vy, vz] - - .. method:: setLinearVelocity(velocity, local=False) - - Sets the game object's linear velocity. - - This method sets game object's velocity through it's centre of mass, - ie no angular velocity component. - - This requires a dynamic object. - - :arg velocity: linear velocity vector. - :type velocity: 3D Vector - :arg local: - * False: you get the "global" velocity ie: relative to world orientation. - * True: you get the "local" velocity ie: relative to object orientation. - :type local: boolean - - .. method:: getAngularVelocity(local=False) - - Gets the game object's angular velocity. - - :arg local: - * False: you get the "global" velocity ie: relative to world orientation. - * True: you get the "local" velocity ie: relative to object orientation. - :type local: boolean - :return: the object's angular velocity. - :rtype: list [vx, vy, vz] - - .. method:: setAngularVelocity(velocity, local=False) - - Sets the game object's angular velocity. - - This requires a dynamic object. - - :arg velocity: angular velocity vector. - :type velocity: boolean - :arg local: - * False: you get the "global" velocity ie: relative to world orientation. - * True: you get the "local" velocity ie: relative to object orientation. - - .. method:: getVelocity(point=(0, 0, 0)) - - Gets the game object's velocity at the specified point. - - Gets the game object's velocity at the specified point, including angular - components. - - :arg point: optional point to return the velocity for, in local coordinates. - :type point: 3D Vector - :return: the velocity at the specified point. - :rtype: list [vx, vy, vz] - - .. method:: getReactionForce() - - Gets the game object's reaction force. - - The reaction force is the force applied to this object over the last simulation timestep. - This also includes impulses, eg from collisions. - - :return: the reaction force of this object. - :rtype: list [fx, fy, fz] - - .. note:: - - This is not implimented at the moment. - - .. method:: applyImpulse(point, impulse) - - Applies an impulse to the game object. - - This will apply the specified impulse to the game object at the specified point. - If point != position, applyImpulse will also change the object's angular momentum. - Otherwise, only linear momentum will change. - - :arg point: the point to apply the impulse to (in world coordinates) - :type point: the point to apply the impulse to (in world coordinates) - - .. method:: suspendDynamics() - - Suspends physics for this object. - - .. method:: restoreDynamics() - - Resumes physics for this object. - - .. note:: - - The objects linear velocity will be applied from when the dynamics were suspended. - - .. method:: enableRigidBody() - - Enables rigid body physics for this object. - - Rigid body physics allows the object to roll on collisions. - - .. method:: disableRigidBody() - - Disables rigid body physics for this object. - - .. method:: setParent(parent, compound=True, ghost=True) - - Sets this object's parent. - Control the shape status with the optional compound and ghost parameters: - - In that case you can control if it should be ghost or not: - - :arg parent: new parent object. - :type parent: :class:`KX_GameObject` - :arg compound: whether the shape should be added to the parent compound shape. - - * True: the object shape should be added to the parent compound shape. - * False: the object should keep its individual shape. - - :type compound: boolean - :arg ghost: whether the object should be ghost while parented. - - * True: if the object should be made ghost while parented. - * False: if the object should be solid while parented. - - :type ghost: boolean - - .. note:: - - If the object type is sensor, it stays ghost regardless of ghost parameter - - .. method:: removeParent() - - Removes this objects parent. - - .. method:: getPhysicsId() - - Returns the user data object associated with this game object's physics controller. - - .. method:: getPropertyNames() - - Gets a list of all property names. - - :return: All property names for this object. - :rtype: list - - .. method:: getDistanceTo(other) - - :arg other: a point or another :class:`KX_GameObject` to measure the distance to. - :type other: :class:`KX_GameObject` or list [x, y, z] - :return: distance to another object or point. - :rtype: float - - .. method:: getVectTo(other) - - Returns the vector and the distance to another object or point. - The vector is normalized unless the distance is 0, in which a zero length vector is returned. - - :arg other: a point or another :class:`KX_GameObject` to get the vector and distance to. - :type other: :class:`KX_GameObject` or list [x, y, z] - :return: (distance, globalVector(3), localVector(3)) - :rtype: 3-tuple (float, 3-tuple (x, y, z), 3-tuple (x, y, z)) - - .. method:: rayCastTo(other, dist, prop) - - Look towards another point/object and find first object hit within dist that matches prop. - - The ray is always casted from the center of the object, ignoring the object itself. - The ray is casted towards the center of another object or an explicit [x, y, z] point. - Use rayCast() if you need to retrieve the hit point - - :arg other: [x, y, z] or object towards which the ray is casted - :type other: :class:`KX_GameObject` or 3-tuple - :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other - :type dist: float - :arg prop: property name that object must have; can be omitted => detect any object - :type prop: string - :return: the first object hit or None if no object or object does not match prop - :rtype: :class:`KX_GameObject` - - .. method:: rayCast(objto, objfrom, dist, prop, face, xray, poly) - - Look from a point/object to another point/object and find first object hit within dist that matches prop. - if poly is 0, returns a 3-tuple with object reference, hit point and hit normal or (None, None, None) if no hit. - if poly is 1, returns a 4-tuple with in addition a :class:`KX_PolyProxy` as 4th element. - if poly is 2, returns a 5-tuple with in addition a 2D vector with the UV mapping of the hit point as 5th element. - - .. code-block:: python - - # shoot along the axis gun-gunAim (gunAim should be collision-free) - obj, point, normal = gun.rayCast(gunAim, None, 50) - if obj: - # do something - pass - - The face paremeter determines the orientation of the normal. - - * 0 => hit normal is always oriented towards the ray origin (as if you casted the ray from outside) - * 1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect) - - The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray. - The prop and xray parameters interact as follow. - - * prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray. - * prop off, xray on : idem. - * prop on, xray off: return closest hit if it matches prop, no hit otherwise. - * prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray. - - The :class:`KX_PolyProxy` 4th element of the return tuple when poly=1 allows to retrieve information on the polygon hit by the ray. - If there is no hit or the hit object is not a static mesh, None is returned as 4th element. - - The ray ignores collision-free objects and faces that dont have the collision flag enabled, you can however use ghost objects. - - :arg objto: [x, y, z] or object to which the ray is casted - :type objto: :class:`KX_GameObject` or 3-tuple - :arg objfrom: [x, y, z] or object from which the ray is casted; None or omitted => use self object center - :type objfrom: :class:`KX_GameObject` or 3-tuple or None - :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to to - :type dist: float - :arg prop: property name that object must have; can be omitted or "" => detect any object - :type prop: string - :arg face: normal option: 1=>return face normal; 0 or omitted => normal is oriented towards origin - :type face: integer - :arg xray: X-ray option: 1=>skip objects that don't match prop; 0 or omitted => stop on first object - :type xray: integer - :arg poly: polygon option: 0, 1 or 2 to return a 3-, 4- or 5-tuple with information on the face hit. - - * 0 or omitted: return value is a 3-tuple (object, hitpoint, hitnormal) or (None, None, None) if no hit - * 1: return value is a 4-tuple and the 4th element is a :class:`KX_PolyProxy` or None if no hit or the object doesn't use a mesh collision shape. - * 2: return value is a 5-tuple and the 5th element is a 2-tuple (u, v) with the UV mapping of the hit point or None if no hit, or the object doesn't use a mesh collision shape, or doesn't have a UV mapping. - - :type poly: integer - :return: (object, hitpoint, hitnormal) or (object, hitpoint, hitnormal, polygon) or (object, hitpoint, hitnormal, polygon, hituv). - - * object, hitpoint and hitnormal are None if no hit. - * polygon is valid only if the object is valid and is a static object, a dynamic object using mesh collision shape or a soft body object, otherwise it is None - * hituv is valid only if polygon is valid and the object has a UV mapping, otherwise it is None - - :rtype: - - * 3-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz)) - * or 4-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`) - * or 5-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`, 2-tuple (u, v)) - - .. note:: - - The ray ignores the object on which the method is called. It is casted from/to object center or explicit [x, y, z] points. - - .. method:: setCollisionMargin(margin) - - Set the objects collision margin. - - :arg margin: the collision margin distance in blender units. - :type margin: float - - .. note:: - - If this object has no physics controller (a physics ID of zero), this function will raise RuntimeError. - - .. method:: sendMessage(subject, body="", to="") - - Sends a message. - - :arg subject: The subject of the message - :type subject: string - :arg body: The body of the message (optional) - :type body: string - :arg to: The name of the object to send the message to (optional) - :type to: string - - .. method:: reinstancePhysicsMesh(gameObject, meshObject) - - Updates the physics system with the changed mesh. - - If no arguments are given the physics mesh will be re-created from the first mesh assigned to the game object. - - :arg gameObject: optional argument, set the physics shape from this gameObjets mesh. - :type gameObject: string, :class:`KX_GameObject` or None - :arg meshObject: optional argument, set the physics shape from this mesh. - :type meshObject: string, :class:`MeshProxy` or None - - :return: True if reinstance succeeded, False if it failed. - :rtype: boolean - - .. note:: - - If this object has instances the other instances will be updated too. - - .. note:: - - The gameObject argument has an advantage that it can convert from a mesh with modifiers applied (such as subsurf). - - .. warning:: - - Only triangle mesh type objects are supported currently (not convex hull) - - .. warning:: - - If the object is a part of a combound object it will fail (parent or child) - - .. warning:: - - Rebuilding the physics mesh can be slow, running many times per second will give a performance hit. - - .. method:: get(key, default=None) - - Return the value matching key, or the default value if its not found. - :return: The key value or a default. - - .. method:: playAction(name, start_frame, end_frame, layer=0, priority=0, blendin=0, play_mode=ACT_MODE_PLAY, layer_weight=0.0, ipo_flags=0, speed=1.0) - - Plays an action. - - :arg name: the name of the action - :type name: string - :arg start: the start frame of the action - :type start: float - :arg end: the end frame of the action - :type end: float - :arg layer: the layer the action will play in (actions in different layers are added/blended together) - :type layer: integer - :arg priority: only play this action if there isn't an action currently playing in this layer with a higher (lower number) priority - :type priority: integer - :arg blendin: the amount of blending between this animation and the previous one on this layer - :type blendin: float - :arg play_mode: the play mode - :type play_mode: one of :ref:`these constants ` - :arg layer_weight: how much of the previous layer to use for blending (0 = add) - :type layer_weight: float - :arg ipo_flags: flags for the old IPO behaviors (force, etc) - :type ipo_flags: int bitfield - :arg speed: the playback speed of the action as a factor (1.0 = normal speed, 2.0 = 2x speed, etc) - :type speed: float - - .. method:: stopAction(layer=0) - - Stop playing the action on the given layer. - - :arg layer: The layer to stop playing. - :type layer: integer - - .. method:: getActionFrame(layer=0) - - Gets the current frame of the action playing in the supplied layer. - - :arg layer: The layer that you want to get the frame from. - :type layer: integer - - :return: The current frame of the action - :rtype: float - - .. method:: setActionFrame(frame, layer=0) - - Set the current frame of the action playing in the supplied layer. - - :arg layer: The layer where you want to set the frame - :type layer: integer - :arg frame: The frame to set the action to - :type frame: float - - .. method:: isPlayingAction(layer=0) - - Checks to see if there is an action playing in the given layer. - - :arg layer: The layer to check for a playing action. - :type layer: integer - - :return: Whether or not the action is playing - :rtype: boolean - -.. class:: KX_IpoActuator(SCA_IActuator) - - IPO actuator activates an animation. - - .. attribute:: frameStart - - Start frame. - - :type: float - - .. attribute:: frameEnd - - End frame. - - :type: float - - .. attribute:: propName - - Use this property to define the Ipo position. - - :type: string - - .. attribute:: framePropName - - Assign this property this action current frame number. - - :type: string - - .. attribute:: mode - - Play mode for the ipo. Can be on of :ref:`these constants ` - - :type: integer - - .. attribute:: useIpoAsForce - - Apply Ipo as a global or local force depending on the local option (dynamic objects only). - - :type: boolean - - .. attribute:: useIpoAdd - - Ipo is added to the current loc/rot/scale in global or local coordinate according to Local flag. - - :type: boolean - - .. attribute:: useIpoLocal - - Let the ipo acts in local coordinates, used in Force and Add mode. - - :type: boolean - - .. attribute:: useChildren - - Update IPO on all children Objects as well. - - :type: boolean - -.. class:: KX_LibLoadStatus(PyObjectPlus) - - An object providing information about a LibLoad() operation. - - .. code-block:: python - - # Print a message when an async LibLoad is done - import bge - - def finished_cb(status): - print("Library (%s) loaded in %.2fms." % (status.libraryName, status.timeTaken)) - - bge.logic.LibLoad('myblend.blend', 'Scene', async=True).onFinish = finished_cb - - .. attribute:: onFinish - - A callback that gets called when the lib load is done. - - :type: callable - - .. attribute:: progress - - The current progress of the lib load as a normalized value from 0.0 to 1.0. - - :type: float - - .. attribute:: libraryName - - The name of the library being loaded (the first argument to LibLoad). - - :type: string - - .. attribute:: timeTaken - - The amount of time, in seconds, the lib load took (0 until the operation is complete). - - :type: float - -.. class:: KX_LightObject(KX_GameObject) - - A Light object. - - .. code-block:: python - - # Turn on a red alert light. - import bge - - co = bge.logic.getCurrentController() - light = co.owner - - light.energy = 1.0 - light.color = [1.0, 0.0, 0.0] - - .. data:: SPOT - - A spot light source. See attribute :data:`type` - - .. data:: SUN - - A point light source with no attenuation. See attribute :data:`type` - - .. data:: NORMAL - - A point light source. See attribute :data:`type` - - .. attribute:: type - - The type of light - must be SPOT, SUN or NORMAL - - .. attribute:: layer - - The layer mask that this light affects object on. - - :type: bitfield - - .. attribute:: energy - - The brightness of this light. - - :type: float - - .. attribute:: distance - - The maximum distance this light can illuminate. (SPOT and NORMAL lights only). - - :type: float - - .. attribute:: color - - The color of this light. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0]. - - :type: list [r, g, b] - - .. attribute:: lin_attenuation - - The linear component of this light's attenuation. (SPOT and NORMAL lights only). - - :type: float - - .. attribute:: quad_attenuation - - The quadratic component of this light's attenuation (SPOT and NORMAL lights only). - - :type: float - - .. attribute:: spotsize - - The cone angle of the spot light, in degrees (SPOT lights only). - - :type: float in [0 - 180]. - - .. attribute:: spotblend - - Specifies the intensity distribution of the spot light (SPOT lights only). - - :type: float in [0 - 1] - - .. note:: - - Higher values result in a more focused light source. - -.. class:: KX_MeshProxy(SCA_IObject) - - A mesh object. - - You can only change the vertex properties of a mesh object, not the mesh topology. - - To use mesh objects effectively, you should know a bit about how the game engine handles them. - - #. Mesh Objects are converted from Blender at scene load. - #. The Converter groups polygons by Material. This means they can be sent to the renderer efficiently. A material holds: - - #. The texture. - #. The Blender material. - #. The Tile properties - #. The face properties - (From the "Texture Face" panel) - #. Transparency & z sorting - #. Light layer - #. Polygon shape (triangle/quad) - #. Game Object - - #. Vertices will be split by face if necessary. Vertices can only be shared between faces if: - - #. They are at the same position - #. UV coordinates are the same - #. Their normals are the same (both polygons are "Set Smooth") - #. They are the same color, for example: a cube has 24 vertices: 6 faces with 4 vertices per face. - - The correct method of iterating over every :class:`KX_VertexProxy` in a game object - - .. code-block:: python - - from bge import logic - - cont = logic.getCurrentController() - object = cont.owner - - for mesh in object.meshes: - for m_index in range(len(mesh.materials)): - for v_index in range(mesh.getVertexArrayLength(m_index)): - vertex = mesh.getVertex(m_index, v_index) - # Do something with vertex here... - # ... eg: color the vertex red. - vertex.color = [1.0, 0.0, 0.0, 1.0] - - .. attribute:: materials - - :type: list of :class:`KX_BlenderMaterial` or :class:`KX_PolygonMaterial` types - - .. attribute:: numPolygons - - :type: integer - - .. attribute:: numMaterials - - :type: integer - - .. method:: getMaterialName(matid) - - Gets the name of the specified material. - - :arg matid: the specified material. - :type matid: integer - :return: the attached material name. - :rtype: string - - .. method:: getTextureName(matid) - - Gets the name of the specified material's texture. - - :arg matid: the specified material - :type matid: integer - :return: the attached material's texture name. - :rtype: string - - .. method:: getVertexArrayLength(matid) - - Gets the length of the vertex array associated with the specified material. - - There is one vertex array for each material. - - :arg matid: the specified material - :type matid: integer - :return: the number of verticies in the vertex array. - :rtype: integer - - .. method:: getVertex(matid, index) - - Gets the specified vertex from the mesh object. - - :arg matid: the specified material - :type matid: integer - :arg index: the index into the vertex array. - :type index: integer - :return: a vertex object. - :rtype: :class:`KX_VertexProxy` - - .. method:: getPolygon(index) - - Gets the specified polygon from the mesh. - - :arg index: polygon number - :type index: integer - :return: a polygon object. - :rtype: :class:`PolyProxy` - - .. method:: transform(matid, matrix) - - Transforms the vertices of a mesh. - - :arg matid: material index, -1 transforms all. - :type matid: integer - :arg matrix: transformation matrix. - :type matrix: 4x4 matrix [[float]] - - .. method:: transformUV(matid, matrix, uv_index=-1, uv_index_from=-1) - - Transforms the vertices UV's of a mesh. - - :arg matid: material index, -1 transforms all. - :type matid: integer - :arg matrix: transformation matrix. - :type matrix: 4x4 matrix [[float]] - :arg uv_index: optional uv index, -1 for all, otherwise 0 or 1. - :type uv_index: integer - :arg uv_index_from: optional uv index to copy from, -1 to transform the current uv. - :type uv_index_from: integer - -.. class:: SCA_MouseSensor(SCA_ISensor) - - Mouse Sensor logic brick. - - .. attribute:: position - - current [x, y] coordinates of the mouse, in frame coordinates (pixels). - - :type: [integer, interger] - - .. attribute:: mode - - sensor mode. - - :type: integer - - * KX_MOUSESENSORMODE_LEFTBUTTON(1) - * KX_MOUSESENSORMODE_MIDDLEBUTTON(2) - * KX_MOUSESENSORMODE_RIGHTBUTTON(3) - * KX_MOUSESENSORMODE_WHEELUP(4) - * KX_MOUSESENSORMODE_WHEELDOWN(5) - * KX_MOUSESENSORMODE_MOVEMENT(6) - - .. method:: getButtonStatus(button) - - Get the mouse button status. - - :arg button: The code that represents the key you want to get the state of, use one of :ref:`these constants` - :type button: int - :return: The state of the given key, can be one of :ref:`these constants` - :rtype: int - -.. class:: KX_MouseFocusSensor(SCA_MouseSensor) - - The mouse focus sensor detects when the mouse is over the current game object. - - The mouse focus sensor works by transforming the mouse coordinates from 2d device - space to 3d space then raycasting away from the camera. - - .. attribute:: raySource - - The worldspace source of the ray (the view position). - - :type: list (vector of 3 floats) - - .. attribute:: rayTarget - - The worldspace target of the ray. - - :type: list (vector of 3 floats) - - .. attribute:: rayDirection - - The :data:`rayTarget` - :class:`raySource` normalized. - - :type: list (normalized vector of 3 floats) - - .. attribute:: hitObject - - the last object the mouse was over. - - :type: :class:`KX_GameObject` or None - - .. attribute:: hitPosition - - The worldspace position of the ray intersecton. - - :type: list (vector of 3 floats) - - .. attribute:: hitNormal - - the worldspace normal from the face at point of intersection. - - :type: list (normalized vector of 3 floats) - - .. attribute:: hitUV - - the UV coordinates at the point of intersection. - - :type: list (vector of 2 floats) - - If the object has no UV mapping, it returns [0, 0]. - - The UV coordinates are not normalized, they can be < 0 or > 1 depending on the UV mapping. - - .. attribute:: usePulseFocus - - When enabled, moving the mouse over a different object generates a pulse. (only used when the 'Mouse Over Any' sensor option is set). - - :type: boolean - -.. class:: KX_TouchSensor(SCA_ISensor) - - Touch sensor detects collisions between objects. - - .. attribute:: propName - - The property or material to collide with. - - :type: string - - .. attribute:: useMaterial - - Determines if the sensor is looking for a property or material. KX_True = Find material; KX_False = Find property. - - :type: boolean - - .. attribute:: usePulseCollision - - When enabled, changes to the set of colliding objects generate a pulse. - - :type: boolean - - .. attribute:: hitObject - - The last collided object. (read-only). - - :type: :class:`KX_GameObject` or None - - .. attribute:: hitObjectList - - A list of colliding objects. (read-only). - - :type: :class:`CListValue` of :class:`KX_GameObject` - -.. class:: KX_NearSensor(KX_TouchSensor) - - A near sensor is a specialised form of touch sensor. - - .. attribute:: distance - - The near sensor activates when an object is within this distance. - - :type: float - - .. attribute:: resetDistance - - The near sensor deactivates when the object exceeds this distance. - - :type: float - -.. class:: KX_NetworkMessageActuator(SCA_IActuator) - - Message Actuator - - .. attribute:: propName - - Messages will only be sent to objects with the given property name. - - :type: string - - .. attribute:: subject - - The subject field of the message. - - :type: string - - .. attribute:: body - - The body of the message. - - :type: string - - .. attribute:: usePropBody - - Send a property instead of a regular body message. - - :type: boolean - -.. class:: KX_NetworkMessageSensor(SCA_ISensor) - - The Message Sensor logic brick. - - Currently only loopback (local) networks are supported. - - .. attribute:: subject - - The subject the sensor is looking for. - - :type: string - - .. attribute:: frameMessageCount - - The number of messages received since the last frame. (read-only). - - :type: integer - - .. attribute:: subjects - - The list of message subjects received. (read-only). - - :type: list of strings - - .. attribute:: bodies - - The list of message bodies received. (read-only). - - :type: list of strings - - -.. class:: KX_FontObject(KX_GameObject) - - TODO. - - -.. class:: KX_NavMeshObject(KX_GameObject) - - Python interface for using and controlling navigation meshes. - - .. method:: findPath(start, goal) - - Finds the path from start to goal points. - - :arg start: the start point - :arg start: 3D Vector - :arg goal: the goal point - :arg start: 3D Vector - :return: a path as a list of points - :rtype: list of points - - .. method:: raycast(start, goal) - - Raycast from start to goal points. - - :arg start: the start point - :arg start: 3D Vector - :arg goal: the goal point - :arg start: 3D Vector - :return: the hit factor - :rtype: float - - .. method:: draw(mode) - - Draws a debug mesh for the navigation mesh. - - :arg mode: the drawing mode (one of :ref:`these constants `) - :arg mode: integer - :return: None - - .. method:: rebuild() - - Rebuild the navigation mesh. - - :return: None - -.. class:: KX_ObjectActuator(SCA_IActuator) - - The object actuator ("Motion Actuator") applies force, torque, displacement, angular displacement, - velocity, or angular velocity to an object. - Servo control allows to regulate force to achieve a certain speed target. - - .. attribute:: force - - The force applied by the actuator. - - :type: list [x, y, z] - - .. attribute:: useLocalForce - - A flag specifying if the force is local. - - :type: boolean - - .. attribute:: torque - - The torque applied by the actuator. - - :type: list [x, y, z] - - .. attribute:: useLocalTorque - - A flag specifying if the torque is local. - - :type: boolean - - .. attribute:: dLoc - - The displacement vector applied by the actuator. - - :type: list [x, y, z] - - .. attribute:: useLocalDLoc - - A flag specifying if the dLoc is local. - - :type: boolean - - .. attribute:: dRot - - The angular displacement vector applied by the actuator - - :type: list [x, y, z] - - .. note:: - - Since the displacement is applied every frame, you must adjust the displacement based on the frame rate, or you game experience will depend on the player's computer speed. - - .. attribute:: useLocalDRot - - A flag specifying if the dRot is local. - - :type: boolean - - .. attribute:: linV - - The linear velocity applied by the actuator. - - :type: list [x, y, z] - - .. attribute:: useLocalLinV - - A flag specifying if the linear velocity is local. - - :type: boolean - - .. note:: - - This is the target speed for servo controllers. - - .. attribute:: angV - - The angular velocity applied by the actuator. - - :type: list [x, y, z] - - .. attribute:: useLocalAngV - - A flag specifying if the angular velocity is local. - - :type: boolean - - .. attribute:: damping - - The damping parameter of the servo controller. - - :type: short - - .. attribute:: forceLimitX - - The min/max force limit along the X axis and activates or deactivates the limits in the servo controller. - - :type: list [min(float), max(float), bool] - - .. attribute:: forceLimitY - - The min/max force limit along the Y axis and activates or deactivates the limits in the servo controller. - - :type: list [min(float), max(float), bool] - - .. attribute:: forceLimitZ - - The min/max force limit along the Z axis and activates or deactivates the limits in the servo controller. - - :type: list [min(float), max(float), bool] - - .. attribute:: pid - - The PID coefficients of the servo controller. - - :type: list of floats [proportional, integral, derivate] - - .. attribute:: reference - - The object that is used as reference to compute the velocity for the servo controller. - - :type: :class:`KX_GameObject` or None - -.. class:: KX_ParentActuator(SCA_IActuator) - - The parent actuator can set or remove an objects parent object. - - .. attribute:: object - - the object this actuator sets the parent too. - - :type: :class:`KX_GameObject` or None - - .. attribute:: mode - - The mode of this actuator. - - :type: integer from 0 to 1. - - .. attribute:: compound - - Whether the object shape should be added to the parent compound shape when parenting. - - Effective only if the parent is already a compound shape. - - :type: boolean - - .. attribute:: ghost - - Whether the object should be made ghost when parenting - Effective only if the shape is not added to the parent compound shape. - - :type: boolean - -.. class:: KX_PolyProxy(SCA_IObject) - - A polygon holds the index of the vertex forming the poylgon. - - Note: - The polygon attributes are read-only, you need to retrieve the vertex proxy if you want - to change the vertex settings. - - .. attribute:: material_name - - The name of polygon material, empty if no material. - - :type: string - - .. attribute:: material - - The material of the polygon. - - :type: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial` - - .. attribute:: texture_name - - The texture name of the polygon. - - :type: string - - .. attribute:: material_id - - The material index of the polygon, use this to retrieve vertex proxy from mesh proxy. - - :type: integer - - .. attribute:: v1 - - vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. - - :type: integer - - .. attribute:: v2 - - vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. - - :type: integer - - .. attribute:: v3 - - vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. - - :type: integer - - .. attribute:: v4 - - Vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex - Use this to retrieve vertex proxy from mesh proxy. - - :type: integer - - .. attribute:: visible - - visible state of the polygon: 1=visible, 0=invisible. - - :type: integer - - .. attribute:: collide - - collide state of the polygon: 1=receives collision, 0=collision free. - - :type: integer - - .. method:: getMaterialName() - - Returns the polygon material name with MA prefix - - :return: material name - :rtype: string - - .. method:: getMaterial() - - :return: The polygon material - :rtype: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial` - - .. method:: getTextureName() - - :return: The texture name - :rtype: string - - .. method:: getMaterialIndex() - - Returns the material bucket index of the polygon. - This index and the ones returned by getVertexIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`. - - :return: the material index in the mesh - :rtype: integer - - .. method:: getNumVertex() - - Returns the number of vertex of the polygon. - - :return: number of vertex, 3 or 4. - :rtype: integer - - .. method:: isVisible() - - Returns whether the polygon is visible or not - - :return: 0=invisible, 1=visible - :rtype: boolean - - .. method:: isCollider() - - Returns whether the polygon is receives collision or not - - :return: 0=collision free, 1=receives collision - :rtype: integer - - .. method:: getVertexIndex(vertex) - - Returns the mesh vertex index of a polygon vertex - This index and the one returned by getMaterialIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`. - - :arg vertex: index of the vertex in the polygon: 0->3 - :arg vertex: integer - :return: mesh vertex index - :rtype: integer - - .. method:: getMesh() - - Returns a mesh proxy - - :return: mesh proxy - :rtype: :class:`MeshProxy` - -.. class:: KX_PolygonMaterial(PyObjectPlus) - - This is the interface to materials in the game engine. - - Materials define the render state to be applied to mesh objects. - - .. warning:: - - Some of the methods/variables are CObjects. If you mix these up, you will crash blender. - - .. code-block:: python - - from bge import logic - - vertex_shader = """ - - void main(void) - { - // original vertex position, no changes - gl_Position = ftransform(); - // coordinate of the 1st texture channel - gl_TexCoord[0] = gl_MultiTexCoord0; - // coordinate of the 2nd texture channel - gl_TexCoord[1] = gl_MultiTexCoord1; - } - """ - - fragment_shader =""" - - uniform sampler2D color_0; - uniform sampler2D color_1; - uniform float factor; - - void main(void) - { - vec4 color_0 = texture2D(color_0, gl_TexCoord[0].st); - vec4 color_1 = texture2D(color_1, gl_TexCoord[1].st); - gl_FragColor = mix(color_0, color_1, factor); - } - """ - - object = logic.getCurrentController().owner - object = cont.owner - for mesh in object.meshes: - for material in mesh.materials: - shader = material.getShader() - if shader != None: - if not shader.isValid(): - shader.setSource(vertex_shader, fragment_shader, True) - - # get the first texture channel of the material - shader.setSampler('color_0', 0) - # get the second texture channel of the material - shader.setSampler('color_1', 1) - # pass another uniform to the shader - shader.setUniform1f('factor', 0.3) - - - .. attribute:: texture - - Texture name. - - :type: string (read-only) - - .. attribute:: gl_texture - - OpenGL texture handle (eg for glBindTexture(GL_TEXTURE_2D, gl_texture). - - :type: integer (read-only) - - .. attribute:: material - - Material name. - - :type: string (read-only) - - .. attribute:: tface - - Texture face properties. - - :type: CObject (read-only) - - .. attribute:: tile - - Texture is tiling. - - :type: boolean - - .. attribute:: tilexrep - - Number of tile repetitions in x direction. - - :type: integer - - .. attribute:: tileyrep - - Number of tile repetitions in y direction. - - :type: integer - - .. attribute:: drawingmode - - Drawing mode for the material. - - 2 (drawingmode & 4) Textured - - 4 (drawingmode & 16) Light - - 14 (drawingmode & 16384) 3d Polygon Text. - - :type: bitfield - - .. attribute:: transparent - - This material is transparent. All meshes with this - material will be rendered after non transparent meshes from back - to front. - - :type: boolean - - .. attribute:: zsort - - Transparent polygons in meshes with this material will be sorted back to - front before rendering. - Non-Transparent polygons will be sorted front to back before rendering. - - :type: boolean - - .. attribute:: diffuse - - The diffuse color of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0]. - - :type: list [r, g, b] - - .. attribute:: specular - - The specular color of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0]. - - :type: list [r, g, b] - - .. attribute:: shininess - - The shininess (specular exponent) of the material. 0.0 <= shininess <= 128.0. - - :type: float - - .. attribute:: specularity - - The amount of specular of the material. 0.0 <= specularity <= 1.0. - - :type: float - - .. method:: updateTexture(tface, rasty) - - Updates a realtime animation. - - :arg tface: Texture face (eg mat.tface) - :type tface: CObject - :arg rasty: Rasterizer - :type rasty: CObject - - .. method:: setTexture(tface) - - Sets texture render state. - - :arg tface: Texture face - :type tface: CObject - - .. code-block:: python - - mat.setTexture(mat.tface) - - .. method:: activate(rasty, cachingInfo) - - Sets material parameters for this object for rendering. - - Material Parameters set: - - #. Texture - #. Backface culling - #. Line drawing - #. Specular Colour - #. Shininess - #. Diffuse Colour - #. Polygon Offset. - - :arg rasty: Rasterizer instance. - :type rasty: CObject - :arg cachingInfo: Material cache instance. - :type cachingInfo: CObject - - .. method:: setCustomMaterial(material) - - Sets the material state setup object. - - Using this method, you can extend or completely replace the gameengine material - to do your own advanced multipass effects. - - Use this method to register your material class. Instead of the normal material, - your class's activate method will be called just before rendering the mesh. - This should setup the texture, material, and any other state you would like. - It should return True to render the mesh, or False if you are finished. You should - clean up any state Blender does not set before returning False. - - Activate Method Definition: - - .. code-block:: python - - def activate(self, rasty, cachingInfo, material): - - :arg material: The material object. - :type material: instance - - .. code-block:: python - - class PyMaterial: - def __init__(self): - self.pass_no = -1 - - def activate(self, rasty, cachingInfo, material): - # Activate the material here. - # - # The activate method will be called until it returns False. - # Every time the activate method returns True the mesh will - # be rendered. - # - # rasty is a CObject for passing to material.updateTexture() - # and material.activate() - # cachingInfo is a CObject for passing to material.activate() - # material is the KX_PolygonMaterial instance this material - # was added to - - # default material properties: - self.pass_no += 1 - if self.pass_no == 0: - material.activate(rasty, cachingInfo) - # Return True to do this pass - return True - - # clean up and return False to finish. - self.pass_no = -1 - return False - - # Create a new Python Material and pass it to the renderer. - mat.setCustomMaterial(PyMaterial()) - -.. class:: KX_RadarSensor(KX_NearSensor) - - Radar sensor is a near sensor with a conical sensor object. - - .. attribute:: coneOrigin - - The origin of the cone with which to test. The origin is in the middle of the cone. (read-only). - - :type: list of floats [x, y, z] - - .. attribute:: coneTarget - - The center of the bottom face of the cone with which to test. (read-only). - - :type: list of floats [x, y, z] - - .. attribute:: distance - - The height of the cone with which to test. - - :type: float - - .. attribute:: angle - - The angle of the cone (in degrees) with which to test. - - :type: float - - .. attribute:: axis - - The axis on which the radar cone is cast. - - :type: integer from 0 to 5 - - KX_RADAR_AXIS_POS_X, KX_RADAR_AXIS_POS_Y, KX_RADAR_AXIS_POS_Z, - KX_RADAR_AXIS_NEG_X, KX_RADAR_AXIS_NEG_Y, KX_RADAR_AXIS_NEG_Z - -.. class:: KX_RaySensor(SCA_ISensor) - - A ray sensor detects the first object in a given direction. - - .. attribute:: propName - - The property the ray is looking for. - - :type: string - - .. attribute:: range - - The distance of the ray. - - :type: float - - .. attribute:: useMaterial - - Whether or not to look for a material (false = property). - - :type: boolean - - .. attribute:: useXRay - - Whether or not to use XRay. - - :type: boolean - - .. attribute:: hitObject - - The game object that was hit by the ray. (read-only). - - :type: :class:`KX_GameObject` - - .. attribute:: hitPosition - - The position (in worldcoordinates) where the object was hit by the ray. (read-only). - - :type: list [x, y, z] - - .. attribute:: hitNormal - - The normal (in worldcoordinates) of the object at the location where the object was hit by the ray. (read-only). - - :type: list [x, y, z] - - .. attribute:: rayDirection - - The direction from the ray (in worldcoordinates). (read-only). - - :type: list [x, y, z] - - .. attribute:: axis - - The axis the ray is pointing on. - - :type: integer from 0 to 5 - - * KX_RAY_AXIS_POS_X - * KX_RAY_AXIS_POS_Y - * KX_RAY_AXIS_POS_Z - * KX_RAY_AXIS_NEG_X - * KX_RAY_AXIS_NEG_Y - * KX_RAY_AXIS_NEG_Z - -.. class:: KX_SCA_AddObjectActuator(SCA_IActuator) - - Edit Object Actuator (in Add Object Mode) - - .. warning:: - - An Add Object actuator will be ignored if at game start, the linked object doesn't exist (or is empty) or the linked object is in an active layer. - - .. code-block:: none - - Error: GameObject 'Name' has a AddObjectActuator 'ActuatorName' without object (in 'nonactive' layer) - - .. attribute:: object - - the object this actuator adds. - - :type: :class:`KX_GameObject` or None - - .. attribute:: objectLastCreated - - the last added object from this actuator (read-only). - - :type: :class:`KX_GameObject` or None - - .. attribute:: time - - the lifetime of added objects, in frames. Set to 0 to disable automatic deletion. - - :type: integer - - .. attribute:: linearVelocity - - the initial linear velocity of added objects. - - :type: list [vx, vy, vz] - - .. attribute:: angularVelocity - - the initial angular velocity of added objects. - - :type: list [vx, vy, vz] - - .. method:: instantAddObject() - - adds the object without needing to calling SCA_PythonController.activate() - - .. note:: Use objectLastCreated to get the newly created object. - -.. class:: KX_SCA_DynamicActuator(SCA_IActuator) - - Dynamic Actuator. - - .. attribute:: mode - - :type: integer - - the type of operation of the actuator, 0-4 - - * KX_DYN_RESTORE_DYNAMICS(0) - * KX_DYN_DISABLE_DYNAMICS(1) - * KX_DYN_ENABLE_RIGID_BODY(2) - * KX_DYN_DISABLE_RIGID_BODY(3) - * KX_DYN_SET_MASS(4) - - .. attribute:: mass - - the mass value for the KX_DYN_SET_MASS operation. - - :type: float - -.. class:: KX_SCA_EndObjectActuator(SCA_IActuator) - - Edit Object Actuator (in End Object mode) - - This actuator has no python methods. - -.. class:: KX_SCA_ReplaceMeshActuator(SCA_IActuator) - - Edit Object actuator, in Replace Mesh mode. - - .. warning:: - - Replace mesh actuators will be ignored if at game start, the named mesh doesn't exist. - - This will generate a warning in the console - - .. code-block:: none - - Error: GameObject 'Name' ReplaceMeshActuator 'ActuatorName' without object - - .. code-block:: python - - # Level-of-detail - # Switch a game object's mesh based on its depth in the camera view. - # +----------+ +-----------+ +-------------------------------------+ - # | Always +-----+ Python +-----+ Edit Object (Replace Mesh) LOD.Mesh | - # +----------+ +-----------+ +-------------------------------------+ - from bge import logic - - # List detail meshes here - # Mesh (name, near, far) - # Meshes overlap so that they don't 'pop' when on the edge of the distance. - meshes = ((".Hi", 0.0, -20.0), - (".Med", -15.0, -50.0), - (".Lo", -40.0, -100.0) - ) - - cont = logic.getCurrentController() - object = cont.owner - actuator = cont.actuators["LOD." + obj.name] - camera = logic.getCurrentScene().active_camera - - def Depth(pos, plane): - return pos[0]*plane[0] + pos[1]*plane[1] + pos[2]*plane[2] + plane[3] - - # Depth is negative and decreasing further from the camera - depth = Depth(object.position, camera.world_to_camera[2]) - - newmesh = None - curmesh = None - # Find the lowest detail mesh for depth - for mesh in meshes: - if depth < mesh[1] and depth > mesh[2]: - newmesh = mesh - if "ME" + object.name + mesh[0] == actuator.getMesh(): - curmesh = mesh - - if newmesh != None and "ME" + object.name + newmesh[0] != actuator.mesh: - # The mesh is a different mesh - switch it. - # Check the current mesh is not a better fit. - if curmesh == None or curmesh[1] < depth or curmesh[2] > depth: - actuator.mesh = object.name + newmesh[0] - cont.activate(actuator) - - .. attribute:: mesh - - :class:`MeshProxy` or the name of the mesh that will replace the current one. - - Set to None to disable actuator. - - :type: :class:`MeshProxy` or None if no mesh is set - - .. attribute:: useDisplayMesh - - when true the displayed mesh is replaced. - - :type: boolean - - .. attribute:: usePhysicsMesh - - when true the physics mesh is replaced. - - :type: boolean - - .. method:: instantReplaceMesh() - - Immediately replace mesh without delay. - -.. class:: KX_Scene(PyObjectPlus) - - An active scene that gives access to objects, cameras, lights and scene attributes. - - The activity culling stuff is supposed to disable logic bricks when their owner gets too far - from the active camera. It was taken from some code lurking at the back of KX_Scene - who knows - what it does! - - .. code-block:: python - - from bge import logic - - # get the scene - scene = logic.getCurrentScene() - - # print all the objects in the scene - for object in scene.objects: - print(object.name) - - # get an object named 'Cube' - object = scene.objects["Cube"] - - # get the first object in the scene. - object = scene.objects[0] - - .. code-block:: python - - # Get the depth of an object in the camera view. - from bge import logic - - object = logic.getCurrentController().owner - cam = logic.getCurrentScene().active_camera - - # Depth is negative and decreasing further from the camera - depth = object.position[0]*cam.world_to_camera[2][0] + object.position[1]*cam.world_to_camera[2][1] + object.position[2]*cam.world_to_camera[2][2] + cam.world_to_camera[2][3] - - @bug: All attributes are read only at the moment. - - .. attribute:: name - - The scene's name, (read-only). - - :type: string - - .. attribute:: objects - - A list of objects in the scene, (read-only). - - :type: :class:`CListValue` of :class:`KX_GameObject` - - .. attribute:: objectsInactive - - A list of objects on background layers (used for the addObject actuator), (read-only). - - :type: :class:`CListValue` of :class:`KX_GameObject` - - .. attribute:: lights - - A list of lights in the scene, (read-only). - - :type: :class:`CListValue` of :class:`KX_LightObject` - - .. attribute:: cameras - - A list of cameras in the scene, (read-only). - - :type: :class:`CListValue` of :class:`KX_Camera` - - .. attribute:: active_camera - - The current active camera. - - :type: :class:`KX_Camera` - - .. note:: - - This can be set directly from python to avoid using the :class:`KX_SceneActuator`. - - .. attribute:: suspended - - True if the scene is suspended, (read-only). - - :type: boolean - - .. attribute:: activity_culling - - True if the scene is activity culling. - - :type: boolean - - .. attribute:: activity_culling_radius - - The distance outside which to do activity culling. Measured in manhattan distance. - - :type: float - - .. attribute:: dbvt_culling - - True when Dynamic Bounding box Volume Tree is set (read-only). - - :type: boolean - - .. attribute:: pre_draw - - A list of callables to be run before the render step. - - :type: list - - .. attribute:: post_draw - - A list of callables to be run after the render step. - - :type: list - - .. attribute:: gravity - - The scene gravity using the world x, y and z axis. - - :type: list [fx, fy, fz] - - .. method:: addObject(object, other, time=0) - - Adds an object to the scene like the Add Object Actuator would. - - :arg object: The object to add - :type object: :class:`KX_GameObject` or string - :arg other: The object's center to use when adding the object - :type other: :class:`KX_GameObject` or string - :arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever. - :type time: integer - :return: The newly added object. - :rtype: :class:`KX_GameObject` - - .. method:: end() - - Removes the scene from the game. - - .. method:: restart() - - Restarts the scene. - - .. method:: replace(scene) - - Replaces this scene with another one. - - :arg scene: The name of the scene to replace this scene with. - :type scene: string - - .. method:: suspend() - - Suspends this scene. - - .. method:: resume() - - Resume this scene. - - .. method:: get(key, default=None) - - Return the value matching key, or the default value if its not found. - :return: The key value or a default. - - .. method:: drawObstacleSimulation() - - Draw debug visualization of obstacle simulation. - -.. class:: KX_SceneActuator(SCA_IActuator) - - Scene Actuator logic brick. - - .. warning:: - - Scene actuators that use a scene name will be ignored if at game start, the named scene doesn't exist or is empty - - This will generate a warning in the console: - - .. code-block:: none - - Error: GameObject 'Name' has a SceneActuator 'ActuatorName' (SetScene) without scene - - .. attribute:: scene - - the name of the scene to change to/overlay/underlay/remove/suspend/resume. - - :type: string - - .. attribute:: camera - - the camera to change to. - - :type: :class:`KX_Camera` on read, string or :class:`KX_Camera` on write - - .. note:: - - When setting the attribute, you can use either a :class:`KX_Camera` or the name of the camera. - - .. attribute:: useRestart - - Set flag to True to restart the sene. - - :type: boolean - - .. attribute:: mode - - The mode of the actuator. - - :type: integer from 0 to 5. - -.. class:: KX_SoundActuator(SCA_IActuator) - - Sound Actuator. - - The :data:`startSound`, :data:`pauseSound` and :data:`stopSound` do not require the actuator to be activated - they act instantly provided that the actuator has been activated once at least. - - .. attribute:: volume - - The volume (gain) of the sound. - - :type: float - - .. attribute:: time - - The current position in the audio stream (in seconds). - - :type: float - - .. attribute:: pitch - - The pitch of the sound. - - :type: float - - .. attribute:: mode - - The operation mode of the actuator. Can be one of :ref:`these constants` - - :type: integer - - .. attribute:: sound - - The sound the actuator should play. - - :type: Audaspace factory - - .. attribute:: is3D - - Whether or not the actuator should be using 3D sound. (read-only) - - :type: boolean - - .. attribute:: volume_maximum - - The maximum gain of the sound, no matter how near it is. - - :type: float - - .. attribute:: volume_minimum - - The minimum gain of the sound, no matter how far it is away. - - :type: float - - .. attribute:: distance_reference - - The distance where the sound has a gain of 1.0. - - :type: float - - .. attribute:: distance_maximum - - The maximum distance at which you can hear the sound. - - :type: float - - .. attribute:: attenuation - - The influence factor on volume depending on distance. - - :type: float - - .. attribute:: cone_angle_inner - - The angle of the inner cone. - - :type: float - - .. attribute:: cone_angle_outer - - The angle of the outer cone. - - :type: float - - .. attribute:: cone_volume_outer - - The gain outside the outer cone (the gain in the outer cone will be interpolated between this value and the normal gain in the inner cone). - - :type: float - - .. method:: startSound() - - Starts the sound. - - :return: None - - .. method:: pauseSound() - - Pauses the sound. - - :return: None - - .. method:: stopSound() - - Stops the sound. - - :return: None - -.. class:: KX_StateActuator(SCA_IActuator) - - State actuator changes the state mask of parent object. - - .. attribute:: operation - - Type of bit operation to be applied on object state mask. - - You can use one of :ref:`these constants ` - - :type: integer - - .. attribute:: mask - - Value that defines the bits that will be modified by the operation. - - The bits that are 1 in the mask will be updated in the object state. - - The bits that are 0 are will be left unmodified expect for the Copy operation which copies the mask to the object state. - - :type: integer - -.. class:: KX_TrackToActuator(SCA_IActuator) - - Edit Object actuator in Track To mode. - - .. warning:: - - Track To Actuators will be ignored if at game start, the object to track to is invalid. - - This will generate a warning in the console: - - .. code-block:: none - - GameObject 'Name' no object in EditObjectActuator 'ActuatorName' - - .. attribute:: object - - the object this actuator tracks. - - :type: :class:`KX_GameObject` or None - - .. attribute:: time - - the time in frames with which to delay the tracking motion. - - :type: integer - - .. attribute:: use3D - - the tracking motion to use 3D. - - :type: boolean - -.. class:: KX_VehicleWrapper(PyObjectPlus) - - KX_VehicleWrapper - - TODO - description - - .. method:: addWheel(wheel, attachPos, attachDir, axleDir, suspensionRestLength, wheelRadius, hasSteering) - - Add a wheel to the vehicle - - :arg wheel: The object to use as a wheel. - :type wheel: :class:`KX_GameObject` or a KX_GameObject name - :arg attachPos: The position that this wheel will attach to. - :type attachPos: vector of 3 floats - :arg attachDir: The direction this wheel points. - :type attachDir: vector of 3 floats - :arg axleDir: The direction of this wheels axle. - :type axleDir: vector of 3 floats - :arg suspensionRestLength: TODO - Description - :type suspensionRestLength: float - :arg wheelRadius: The size of the wheel. - :type wheelRadius: float - - .. method:: applyBraking(force, wheelIndex) - - Apply a braking force to the specified wheel - - :arg force: the brake force - :type force: float - - :arg wheelIndex: index of the wheel where the force needs to be applied - :type wheelIndex: integer - - .. method:: applyEngineForce(force, wheelIndex) - - Apply an engine force to the specified wheel - - :arg force: the engine force - :type force: float - - :arg wheelIndex: index of the wheel where the force needs to be applied - :type wheelIndex: integer - - .. method:: getConstraintId() - - Get the constraint ID - - :return: the constraint id - :rtype: integer - - .. method:: getConstraintType() - - Returns the constraint type. - - :return: constraint type - :rtype: integer - - .. method:: getNumWheels() - - Returns the number of wheels. - - :return: the number of wheels for this vehicle - :rtype: integer - - .. method:: getWheelOrientationQuaternion(wheelIndex) - - Returns the wheel orientation as a quaternion. - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - - :return: TODO Description - :rtype: TODO - type should be quat as per method name but from the code it looks like a matrix - - .. method:: getWheelPosition(wheelIndex) - - Returns the position of the specified wheel - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - :return: position vector - :rtype: list[x, y, z] - - .. method:: getWheelRotation(wheelIndex) - - Returns the rotation of the specified wheel - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - - :return: the wheel rotation - :rtype: float - - .. method:: setRollInfluence(rollInfluece, wheelIndex) - - Set the specified wheel's roll influence. - The higher the roll influence the more the vehicle will tend to roll over in corners. - - :arg rollInfluece: the wheel roll influence - :type rollInfluece: float - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - - .. method:: setSteeringValue(steering, wheelIndex) - - Set the specified wheel's steering - - :arg steering: the wheel steering - :type steering: float - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - - .. method:: setSuspensionCompression(compression, wheelIndex) - - Set the specified wheel's compression - - :arg compression: the wheel compression - :type compression: float - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - - .. method:: setSuspensionDamping(damping, wheelIndex) - - Set the specified wheel's damping - - :arg damping: the wheel damping - :type damping: float - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - - .. method:: setSuspensionStiffness(stiffness, wheelIndex) - - Set the specified wheel's stiffness - - :arg stiffness: the wheel stiffness - :type stiffness: float - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - - .. method:: setTyreFriction(friction, wheelIndex) - - Set the specified wheel's tyre friction - - :arg friction: the tyre friction - :type friction: float - - :arg wheelIndex: the wheel index - :type wheelIndex: integer - -.. class:: KX_CharacterWrapper(PyObjectPlus) - - A wrapper to expose character physics options. - - .. attribute:: onGround - - Whether or not the character is on the ground. (read-only) - - :type: boolean - - .. attribute:: gravity - - The gravity value used for the character. - - :type: float - - .. attribute:: maxJumps - - The maximum number of jumps a character can perform before having to touch the ground. By default this is set to 1. 2 allows for a double jump, etc. - - :type: int - - .. attribute:: jumpCount - - The current jump count. This can be used to have different logic for a single jump versus a double jump. For example, a different animation for the second jump. - - :type: int - - .. attribute:: walkDirection - - The speed and direction the character is traveling in using world coordinates. This should be used instead of applyMovement() to properly move the character. - - :type: list [x, y, z] - - .. method:: jump() - - The character jumps based on it's jump speed. - -.. class:: KX_VertexProxy(SCA_IObject) - - A vertex holds position, UV, color and normal information. - - Note: - The physics simulation is NOT currently updated - physics will not respond - to changes in the vertex position. - - .. attribute:: XYZ - - The position of the vertex. - - :type: list [x, y, z] - - .. attribute:: UV - - The texture coordinates of the vertex. - - :type: list [u, v] - - .. attribute:: normal - - The normal of the vertex. - - :type: list [nx, ny, nz] - - .. attribute:: color - - The color of the vertex. - - :type: list [r, g, b, a] - - Black = [0.0, 0.0, 0.0, 1.0], White = [1.0, 1.0, 1.0, 1.0] - - .. attribute:: x - - The x coordinate of the vertex. - - :type: float - - .. attribute:: y - - The y coordinate of the vertex. - - :type: float - - .. attribute:: z - - The z coordinate of the vertex. - - :type: float - - .. attribute:: u - - The u texture coordinate of the vertex. - - :type: float - - .. attribute:: v - - The v texture coordinate of the vertex. - - :type: float - - .. attribute:: u2 - - The second u texture coordinate of the vertex. - - :type: float - - .. attribute:: v2 - - The second v texture coordinate of the vertex. - - :type: float - - .. attribute:: r - - The red component of the vertex color. 0.0 <= r <= 1.0. - - :type: float - - .. attribute:: g - - The green component of the vertex color. 0.0 <= g <= 1.0. - - :type: float - - .. attribute:: b - - The blue component of the vertex color. 0.0 <= b <= 1.0. - - :type: float - - .. attribute:: a - - The alpha component of the vertex color. 0.0 <= a <= 1.0. - - :type: float - - .. method:: getXYZ() - - Gets the position of this vertex. - - :return: this vertexes position in local coordinates. - :rtype: list [x, y, z] - - .. method:: setXYZ(pos) - - Sets the position of this vertex. - - :type: list [x, y, z] - - :arg pos: the new position for this vertex in local coordinates. - - .. method:: getUV() - - Gets the UV (texture) coordinates of this vertex. - - :return: this vertexes UV (texture) coordinates. - :rtype: list [u, v] - - .. method:: setUV(uv) - - Sets the UV (texture) coordinates of this vertex. - - :type: list [u, v] - - .. method:: getUV2() - - Gets the 2nd UV (texture) coordinates of this vertex. - - :return: this vertexes UV (texture) coordinates. - :rtype: list [u, v] - - .. method:: setUV2(uv, unit) - - Sets the 2nd UV (texture) coordinates of this vertex. - - :type: list [u, v] - - :arg unit: optional argument, FLAT==1, SECOND_UV==2, defaults to SECOND_UV - :arg unit: integer - - .. method:: getRGBA() - - Gets the color of this vertex. - - The color is represented as four bytes packed into an integer value. The color is - packed as RGBA. - - Since Python offers no way to get each byte without shifting, you must use the struct module to - access color in an machine independent way. - - Because of this, it is suggested you use the r, g, b and a attributes or the color attribute instead. - - .. code-block:: python - - import struct; - col = struct.unpack('4B', struct.pack('I', v.getRGBA())) - # col = (r, g, b, a) - # black = ( 0, 0, 0, 255) - # white = (255, 255, 255, 255) - - :return: packed color. 4 byte integer with one byte per color channel in RGBA format. - :rtype: integer - - .. method:: setRGBA(col) - - Sets the color of this vertex. - - See getRGBA() for the format of col, and its relevant problems. Use the r, g, b and a attributes - or the color attribute instead. - - setRGBA() also accepts a four component list as argument col. The list represents the color as [r, g, b, a] - with black = [0.0, 0.0, 0.0, 1.0] and white = [1.0, 1.0, 1.0, 1.0] - - .. code-block:: python - - v.setRGBA(0xff0000ff) # Red - v.setRGBA(0xff00ff00) # Green on little endian, transparent purple on big endian - v.setRGBA([1.0, 0.0, 0.0, 1.0]) # Red - v.setRGBA([0.0, 1.0, 0.0, 1.0]) # Green on all platforms. - - :arg col: the new color of this vertex in packed RGBA format. - :type col: integer or list [r, g, b, a] - - .. method:: getNormal() - - Gets the normal vector of this vertex. - - :return: normalized normal vector. - :rtype: list [nx, ny, nz] - - .. method:: setNormal(normal) - - Sets the normal vector of this vertex. - - :type: sequence of floats [r, g, b] - - :arg normal: the new normal of this vertex. - -.. class:: KX_VisibilityActuator(SCA_IActuator) - - Visibility Actuator. - - .. attribute:: visibility - - whether the actuator makes its parent object visible or invisible. - - :type: boolean - - .. attribute:: useOcclusion - - whether the actuator makes its parent object an occluder or not. - - :type: boolean - - .. attribute:: useRecursion - - whether the visibility/occlusion should be propagated to all children of the object. - - :type: boolean - -.. class:: SCA_2DFilterActuator(SCA_IActuator) - - Create, enable and disable 2D filters - - The following properties don't have an immediate effect. - You must active the actuator to get the result. - The actuator is not persistent: it automatically stops itself after setting up the filter - but the filter remains active. To stop a filter you must activate the actuator with 'type' - set to :data:`~bge.logic.RAS_2DFILTER_DISABLED` or :data:`~bge.logic.RAS_2DFILTER_NOFILTER`. - - .. attribute:: shaderText - - shader source code for custom shader. - - :type: string - - .. attribute:: disableMotionBlur - - action on motion blur: 0=enable, 1=disable. - - :type: integer - - .. attribute:: mode - - Type of 2D filter, use one of :ref:`these constants ` - - :type: integer - - .. attribute:: passNumber - - order number of filter in the stack of 2D filters. Filters are executed in increasing order of passNb. - - Only be one filter can be defined per passNb. - - :type: integer (0-100) - - .. attribute:: value - - argument for motion blur filter. - - :type: float (0.0-100.0) - -.. class:: SCA_ANDController(SCA_IController) - - An AND controller activates only when all linked sensors are activated. - - There are no special python methods for this controller. - -.. class:: SCA_ActuatorSensor(SCA_ISensor) - - Actuator sensor detect change in actuator state of the parent object. - It generates a positive pulse if the corresponding actuator is activated - and a negative pulse if the actuator is deactivated. - - .. attribute:: actuator - - the name of the actuator that the sensor is monitoring. - - :type: string - -.. class:: SCA_AlwaysSensor(SCA_ISensor) - - This sensor is always activated. - -.. class:: SCA_DelaySensor(SCA_ISensor) - - The Delay sensor generates positive and negative triggers at precise time, - expressed in number of frames. The delay parameter defines the length of the initial OFF period. A positive trigger is generated at the end of this period. - - The duration parameter defines the length of the ON period following the OFF period. - There is a negative trigger at the end of the ON period. If duration is 0, the sensor stays ON and there is no negative trigger. - - The sensor runs the OFF-ON cycle once unless the repeat option is set: the OFF-ON cycle repeats indefinately (or the OFF cycle if duration is 0). - - Use :class:`SCA_ISensor.reset` at any time to restart sensor. - - .. attribute:: delay - - length of the initial OFF period as number of frame, 0 for immediate trigger. - - :type: integer. - - .. attribute:: duration - - length of the ON period in number of frame after the initial OFF period. - - If duration is greater than 0, a negative trigger is sent at the end of the ON pulse. - - :type: integer - - .. attribute:: repeat - - 1 if the OFF-ON cycle should be repeated indefinately, 0 if it should run once. - - :type: integer - -.. class:: SCA_JoystickSensor(SCA_ISensor) - - This sensor detects player joystick events. - - .. attribute:: axisValues - - The state of the joysticks axis as a list of values :data:`numAxis` long. (read-only). - - :type: list of ints. - - Each specifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing. - The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. - - * left:[-32767, 0, ...] - * right:[32767, 0, ...] - * up:[0, -32767, ...] - * down:[0, 32767, ...] - - .. attribute:: axisSingle - - like :data:`axisValues` but returns a single axis value that is set by the sensor. (read-only). - - :type: integer - - .. note:: - - Only use this for "Single Axis" type sensors otherwise it will raise an error. - - .. attribute:: hatValues - - The state of the joysticks hats as a list of values :data:`numHats` long. (read-only). - - :type: list of ints - - Each specifying the direction of the hat from 1 to 12, 0 when inactive. - - Hat directions are as follows... - - * 0:None - * 1:Up - * 2:Right - * 4:Down - * 8:Left - * 3:Up - Right - * 6:Down - Right - * 12:Down - Left - * 9:Up - Left - - .. attribute:: hatSingle - - Like :data:`hatValues` but returns a single hat direction value that is set by the sensor. (read-only). - - :type: integer - - .. attribute:: numAxis - - The number of axes for the joystick at this index. (read-only). - - :type: integer - - .. attribute:: numButtons - - The number of buttons for the joystick at this index. (read-only). - - :type: integer - - .. attribute:: numHats - - The number of hats for the joystick at this index. (read-only). - - :type: integer - - .. attribute:: connected - - True if a joystick is connected at this joysticks index. (read-only). - - :type: boolean - - .. attribute:: index - - The joystick index to use (from 0 to 7). The first joystick is always 0. - - :type: integer - - .. attribute:: threshold - - Axis threshold. Joystick axis motion below this threshold wont trigger an event. Use values between (0 and 32767), lower values are more sensitive. - - :type: integer - - .. attribute:: button - - The button index the sensor reacts to (first button = 0). When the "All Events" toggle is set, this option has no effect. - - :type: integer - - .. attribute:: axis - - The axis this sensor reacts to, as a list of two values [axisIndex, axisDirection] - - * axisIndex: the axis index to use when detecting axis movement, 1=primary directional control, 2=secondary directional control. - * axisDirection: 0=right, 1=up, 2=left, 3=down. - - :type: [integer, integer] - - .. attribute:: hat - - The hat the sensor reacts to, as a list of two values: [hatIndex, hatDirection] - - * hatIndex: the hat index to use when detecting hat movement, 1=primary hat, 2=secondary hat (4 max). - * hatDirection: 1-12. - - :type: [integer, integer] - - .. method:: getButtonActiveList() - - :return: A list containing the indicies of the currently pressed buttons. - :rtype: list - - .. method:: getButtonStatus(buttonIndex) - - :arg buttonIndex: the button index, 0=first button - :type buttonIndex: integer - :return: The current pressed state of the specified button. - :rtype: boolean - -.. class:: SCA_KeyboardSensor(SCA_ISensor) - - A keyboard sensor detects player key presses. - - See module :mod:`bge.events` for keycode values. - - .. attribute:: key - - The key code this sensor is looking for. - - :type: keycode from :mod:`bge.events` module - - .. attribute:: hold1 - - The key code for the first modifier this sensor is looking for. - - :type: keycode from :mod:`bge.events` module - - .. attribute:: hold2 - - The key code for the second modifier this sensor is looking for. - - :type: keycode from :mod:`bge.events` module - - .. attribute:: toggleProperty - - The name of the property that indicates whether or not to log keystrokes as a string. - - :type: string - - .. attribute:: targetProperty - - The name of the property that receives keystrokes in case in case a string is logged. - - :type: string - - .. attribute:: useAllKeys - - Flag to determine whether or not to accept all keys. - - :type: boolean - - .. attribute:: events - - a list of pressed keys that have either been pressed, or just released, or are active this frame. (read-only). - - :type: list [[:ref:`keycode`, :ref:`status`], ...] - - .. method:: getKeyStatus(keycode) - - Get the status of a key. - - :arg keycode: The code that represents the key you want to get the state of, use one of :ref:`these constants` - :type keycode: integer - :return: The state of the given key, can be one of :ref:`these constants` - :rtype: int - -.. class:: SCA_NANDController(SCA_IController) - - An NAND controller activates when all linked sensors are not active. - - There are no special python methods for this controller. - -.. class:: SCA_NORController(SCA_IController) - - An NOR controller activates only when all linked sensors are de-activated. - - There are no special python methods for this controller. - -.. class:: SCA_ORController(SCA_IController) - - An OR controller activates when any connected sensor activates. - - There are no special python methods for this controller. - -.. class:: SCA_PropertyActuator(SCA_IActuator) - - Property Actuator - - .. attribute:: propName - - the property on which to operate. - - :type: string - - .. attribute:: value - - the value with which the actuator operates. - - :type: string - - .. attribute:: mode - - TODO - add constants to game logic dict!. - - :type: integer - -.. class:: SCA_PropertySensor(SCA_ISensor) - - Activates when the game object property matches. - - .. attribute:: mode - - Type of check on the property. Can be one of :ref:`these constants ` - - :type: integer. - - .. attribute:: propName - - the property the sensor operates. - - :type: string - - .. attribute:: value - - the value with which the sensor compares to the value of the property. - - :type: string - - .. attribute:: min - - the minimum value of the range used to evaluate the property when in interval mode. - - :type: string - - .. attribute:: max - - the maximum value of the range used to evaluate the property when in interval mode. - - :type: string - -.. class:: SCA_PythonController(SCA_IController) - - A Python controller uses a Python script to activate it's actuators, - based on it's sensors. - - .. attribute:: script - - The value of this variable depends on the execution methid. - - * When 'Script' execution mode is set this value contains the entire python script as a single string (not the script name as you might expect) which can be modified to run different scripts. - * When 'Module' execution mode is set this value will contain a single line string - module name and function "module.func" or "package.modile.func" where the module names are python textblocks or external scripts. - - :type: string - - .. note:: - - Once this is set the script name given for warnings will remain unchanged. - - .. attribute:: mode - - the execution mode for this controller (read-only). - - * Script: 0, Execite the :data:`script` as a python code. - * Module: 1, Execite the :data:`script` as a module and function. - - :type: integer - - .. method:: activate(actuator) - - Activates an actuator attached to this controller. - - :arg actuator: The actuator to operate on. - :type actuator: actuator or the actuator name as a string - - .. method:: deactivate(actuator) - - Deactivates an actuator attached to this controller. - - :arg actuator: The actuator to operate on. - :type actuator: actuator or the actuator name as a string - -.. class:: SCA_RandomActuator(SCA_IActuator) - - Random Actuator - - .. attribute:: seed - - Seed of the random number generator. - - :type: integer. - - Equal seeds produce equal series. If the seed is 0, the generator will produce the same value on every call. - - .. attribute:: para1 - - the first parameter of the active distribution. - - :type: float, read-only. - - Refer to the documentation of the generator types for the meaning of this value. - - .. attribute:: para2 - - the second parameter of the active distribution. - - :type: float, read-only - - Refer to the documentation of the generator types for the meaning of this value. - - .. attribute:: distribution - - Distribution type. (read-only). Can be one of :ref:`these constants ` - - :type: integer - - .. attribute:: propName - - the name of the property to set with the random value. - - :type: string - - If the generator and property types do not match, the assignment is ignored. - - .. method:: setBoolConst(value) - - Sets this generator to produce a constant boolean value. - - :arg value: The value to return. - :type value: boolean - - .. method:: setBoolUniform() - - Sets this generator to produce a uniform boolean distribution. - - The generator will generate True or False with 50% chance. - - .. method:: setBoolBernouilli(value) - - Sets this generator to produce a Bernouilli distribution. - - :arg value: Specifies the proportion of False values to produce. - - * 0.0: Always generate True - * 1.0: Always generate False - :type value: float - - .. method:: setIntConst(value) - - Sets this generator to always produce the given value. - - :arg value: the value this generator produces. - :type value: integer - - .. method:: setIntUniform(lower_bound, upper_bound) - - Sets this generator to produce a random value between the given lower and - upper bounds (inclusive). - - :type lower_bound: integer - :type upper_bound: integer - - .. method:: setIntPoisson(value) - - Generate a Poisson-distributed number. - - This performs a series of Bernouilli tests with parameter value. - It returns the number of tries needed to achieve succes. - - :type value: float - - .. method:: setFloatConst(value) - - Always generate the given value. - - :type value: float - - .. method:: setFloatUniform(lower_bound, upper_bound) - - Generates a random float between lower_bound and upper_bound with a - uniform distribution. - - :type lower_bound: float - :type upper_bound: float - - .. method:: setFloatNormal(mean, standard_deviation) - - Generates a random float from the given normal distribution. - - :arg mean: The mean (average) value of the generated numbers - :type mean: float - :arg standard_deviation: The standard deviation of the generated numbers. - :type standard_deviation: float - - .. method:: setFloatNegativeExponential(half_life) - - Generate negative-exponentially distributed numbers. - - The half-life 'time' is characterized by half_life. - - :type half_life: float - -.. class:: SCA_RandomSensor(SCA_ISensor) - - This sensor activates randomly. - - .. attribute:: lastDraw - - The seed of the random number generator. - - :type: integer - - .. attribute:: seed - - The seed of the random number generator. - - :type: integer - -.. class:: SCA_XNORController(SCA_IController) - - An XNOR controller activates when all linked sensors are the same (activated or inative). - - There are no special python methods for this controller. - -.. class:: SCA_XORController(SCA_IController) - - An XOR controller activates when there is the input is mixed, but not when all are on or off. - - There are no special python methods for this controller. - -.. class:: KX_Camera(KX_GameObject) - - A Camera object. - - .. data:: INSIDE - - See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` - - .. data:: INTERSECT - - See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` - - .. data:: OUTSIDE - - See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` - - .. attribute:: lens - - The camera's lens value. - - :type: float - - .. attribute:: ortho_scale - - The camera's view scale when in orthographic mode. - - :type: float - - .. attribute:: near - - The camera's near clip distance. - - :type: float - - .. attribute:: far - - The camera's far clip distance. - - :type: float - - .. attribute:: perspective - - True if this camera has a perspective transform, False for an orthographic projection. - - :type: boolean - - .. attribute:: frustum_culling - - True if this camera is frustum culling. - - :type: boolean - - .. attribute:: projection_matrix - - This camera's 4x4 projection matrix. - - .. note:: - - This is the identity matrix prior to rendering the first frame (any Python done on frame 1). - - :type: 4x4 Matrix [[float]] - - .. attribute:: modelview_matrix - - This camera's 4x4 model view matrix. (read-only). - - :type: 4x4 Matrix [[float]] - - .. note:: - - This matrix is regenerated every frame from the camera's position and orientation. Also, this is the identity matrix prior to rendering the first frame (any Python done on frame 1). - - .. attribute:: camera_to_world - - This camera's camera to world transform. (read-only). - - :type: 4x4 Matrix [[float]] - - .. note:: - - This matrix is regenerated every frame from the camera's position and orientation. - - .. attribute:: world_to_camera - - This camera's world to camera transform. (read-only). - - :type: 4x4 Matrix [[float]] - - .. note:: - - Regenerated every frame from the camera's position and orientation. - - .. note:: - - This is camera_to_world inverted. - - .. attribute:: useViewport - - True when the camera is used as a viewport, set True to enable a viewport for this camera. - - :type: boolean - - .. method:: sphereInsideFrustum(centre, radius) - - Tests the given sphere against the view frustum. - - :arg centre: The centre of the sphere (in world coordinates.) - :type centre: list [x, y, z] - :arg radius: the radius of the sphere - :type radius: float - :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT` - :rtype: integer - - .. note:: - - When the camera is first initialized the result will be invalid because the projection matrix has not been set. - - .. code-block:: python - - from bge import logic - cont = logic.getCurrentController() - cam = cont.owner - - # A sphere of radius 4.0 located at [x, y, z] = [1.0, 1.0, 1.0] - if (cam.sphereInsideFrustum([1.0, 1.0, 1.0], 4) != cam.OUTSIDE): - # Sphere is inside frustum ! - # Do something useful ! - else: - # Sphere is outside frustum - - .. method:: boxInsideFrustum(box) - - Tests the given box against the view frustum. - - :arg box: Eight (8) corner points of the box (in world coordinates.) - :type box: list of lists - :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT` - - .. note:: - - When the camera is first initialized the result will be invalid because the projection matrix has not been set. - - .. code-block:: python - - from bge import logic - cont = logic.getCurrentController() - cam = cont.owner - - # Box to test... - box = [] - box.append([-1.0, -1.0, -1.0]) - box.append([-1.0, -1.0, 1.0]) - box.append([-1.0, 1.0, -1.0]) - box.append([-1.0, 1.0, 1.0]) - box.append([ 1.0, -1.0, -1.0]) - box.append([ 1.0, -1.0, 1.0]) - box.append([ 1.0, 1.0, -1.0]) - box.append([ 1.0, 1.0, 1.0]) - - if (cam.boxInsideFrustum(box) != cam.OUTSIDE): - # Box is inside/intersects frustum ! - # Do something useful ! - else: - # Box is outside the frustum ! - - .. method:: pointInsideFrustum(point) - - Tests the given point against the view frustum. - - :arg point: The point to test (in world coordinates.) - :type point: 3D Vector - :return: True if the given point is inside this camera's viewing frustum. - :rtype: boolean - - .. note:: - - When the camera is first initialized the result will be invalid because the projection matrix has not been set. - - .. code-block:: python - - from bge import logic - cont = logic.getCurrentController() - cam = cont.owner - - # Test point [0.0, 0.0, 0.0] - if (cam.pointInsideFrustum([0.0, 0.0, 0.0])): - # Point is inside frustum ! - # Do something useful ! - else: - # Box is outside the frustum ! - - .. method:: getCameraToWorld() - - Returns the camera-to-world transform. - - :return: the camera-to-world transform matrix. - :rtype: matrix (4x4 list) - - .. method:: getWorldToCamera() - - Returns the world-to-camera transform. - - This returns the inverse matrix of getCameraToWorld(). - - :return: the world-to-camera transform matrix. - :rtype: matrix (4x4 list) - - .. method:: setOnTop() - - Set this cameras viewport ontop of all other viewport. - - .. method:: setViewport(left, bottom, right, top) - - Sets the region of this viewport on the screen in pixels. - - Use :data:`bge.render.getWindowHeight` and :data:`bge.render.getWindowWidth` to calculate values relative to the entire display. - - :arg left: left pixel coordinate of this viewport - :type left: integer - :arg bottom: bottom pixel coordinate of this viewport - :type bottom: integer - :arg right: right pixel coordinate of this viewport - :type right: integer - :arg top: top pixel coordinate of this viewport - :type top: integer - - .. method:: getScreenPosition(object) - - Gets the position of an object projected on screen space. - - .. code-block:: python - - # For an object in the middle of the screen, coord = [0.5, 0.5] - coord = camera.getScreenPosition(object) - - :arg object: object name or list [x, y, z] - :type object: :class:`KX_GameObject` or 3D Vector - :return: the object's position in screen coordinates. - :rtype: list [x, y] - - .. method:: getScreenVect(x, y) - - Gets the vector from the camera position in the screen coordinate direction. - - :arg x: X Axis - :type x: float - :arg y: Y Axis - :type y: float - :rtype: 3D Vector - :return: The vector from screen coordinate. - - .. code-block:: python - - # Gets the vector of the camera front direction: - m_vect = camera.getScreenVect(0.5, 0.5) - - .. method:: getScreenRay(x, y, dist=inf, property=None) - - Look towards a screen coordinate (x, y) and find first object hit within dist that matches prop. - The ray is similar to KX_GameObject->rayCastTo. - - :arg x: X Axis - :type x: float - :arg y: Y Axis - :type y: float - :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other - :type dist: float - :arg property: property name that object must have; can be omitted => detect any object - :type property: string - :rtype: :class:`KX_GameObject` - :return: the first object hit or None if no object or object does not match prop - - .. code-block:: python - - # Gets an object with a property "wall" in front of the camera within a distance of 100: - target = camera.getScreenRay(0.5, 0.5, 100, "wall") - -.. class:: BL_ArmatureObject(KX_GameObject) - - An armature object. - - .. attribute:: constraints - - The list of armature constraint defined on this armature. - Elements of the list can be accessed by index or string. - The key format for string access is ':'. - - :type: list of :class:`BL_ArmatureConstraint` - - .. attribute:: channels - - The list of armature channels. - Elements of the list can be accessed by index or name the bone. - - :type: list of :class:`BL_ArmatureChannel` - - .. method:: update() - - Ensures that the armature will be updated on next graphic frame. - - This action is unecessary if a KX_ArmatureActuator with mode run is active - or if an action is playing. Use this function in other cases. It must be called - on each frame to ensure that the armature is updated continously. - -.. class:: BL_ArmatureActuator(SCA_IActuator) - - Armature Actuators change constraint condition on armatures. - - .. attribute:: type - - The type of action that the actuator executes when it is active. - - Can be one of :ref:`these constants ` - - :type: integer - - .. attribute:: constraint - - The constraint object this actuator is controlling. - - :type: :class:`BL_ArmatureConstraint` - - .. attribute:: target - - The object that this actuator will set as primary target to the constraint it controls. - - :type: :class:`KX_GameObject` - - .. attribute:: subtarget - - The object that this actuator will set as secondary target to the constraint it controls. - - :type: :class:`KX_GameObject`. - - .. note:: - - Currently, the only secondary target is the pole target for IK constraint. - - .. attribute:: weight - - The weight this actuator will set on the constraint it controls. - - :type: float. - - .. note:: - - Currently only the IK constraint has a weight. It must be a value between 0 and 1. - - .. note:: - - A weight of 0 disables a constraint while still updating constraint runtime values (see :class:`BL_ArmatureConstraint`) - - .. attribute:: influence - - The influence this actuator will set on the constraint it controls. - - :type: float. - -.. class:: KX_ArmatureSensor(SCA_ISensor) - - Armature sensor detect conditions on armatures. - - .. attribute:: type - - The type of measurement that the sensor make when it is active. - - Can be one of :ref:`these constants ` - - :type: integer. - - .. attribute:: constraint - - The constraint object this sensor is watching. - - :type: :class:`BL_ArmatureConstraint` - - .. attribute:: value - - The threshold used in the comparison with the constraint error - The linear error is only updated on CopyPose/Distance IK constraint with iTaSC solver - The rotation error is only updated on CopyPose+rotation IK constraint with iTaSC solver - The linear error on CopyPose is always >= 0: it is the norm of the distance between the target and the bone - The rotation error on CopyPose is always >= 0: it is the norm of the equivalent rotation vector between the bone and the target orientations - The linear error on Distance can be positive if the distance between the bone and the target is greater than the desired distance, and negative if the distance is smaller. - - :type: float - -.. class:: BL_ArmatureConstraint(PyObjectPlus) - - Proxy to Armature Constraint. Allows to change constraint on the fly. - Obtained through :class:`BL_ArmatureObject`.constraints. - - .. note:: - - Not all armature constraints are supported in the GE. - - - .. attribute:: type - - Type of constraint, (read-only). - - Use one of :ref:`these constants`. - - :type: integer, one of CONSTRAINT_TYPE_* constants - - .. attribute:: name - - Name of constraint constructed as :. constraints list. - - :type: string - - This name is also the key subscript on :class:`BL_ArmatureObject`. - - .. attribute:: enforce - - fraction of constraint effect that is enforced. Between 0 and 1. - - :type: float - - .. attribute:: headtail - - Position of target between head and tail of the target bone: 0=head, 1=tail. - - :type: float. - - .. note:: - - Only used if the target is a bone (i.e target object is an armature. - - .. attribute:: lin_error - - runtime linear error (in Blender units) on constraint at the current frame. - - This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver. - - :type: float - - .. attribute:: rot_error - - Runtime rotation error (in radiant) on constraint at the current frame. - - :type: float. - - This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver. - - It is only set if the constraint has a rotation part, for example, a CopyPose+Rotation IK constraint. - - .. attribute:: target - - Primary target object for the constraint. The position of this object in the GE will be used as target for the constraint. - - :type: :class:`KX_GameObject`. - - .. attribute:: subtarget - - Secondary target object for the constraint. The position of this object in the GE will be used as secondary target for the constraint. - - :type: :class:`KX_GameObject`. - - Currently this is only used for pole target on IK constraint. - - .. attribute:: active - - True if the constraint is active. - - :type: boolean - - .. note:: - - An inactive constraint does not update lin_error and rot_error. - - .. attribute:: ik_weight - - Weight of the IK constraint between 0 and 1. - - Only defined for IK constraint. - - :type: float - - .. attribute:: ik_type - - Type of IK constraint, (read-only). - - Use one of :ref:`these constants`. - - :type: integer. - - .. attribute:: ik_flag - - Combination of IK constraint option flags, read-only. - - Use one of :ref:`these constants`. - - :type: integer - - .. attribute:: ik_dist - - Distance the constraint is trying to maintain with target, only used when ik_type=CONSTRAINT_IK_DISTANCE. - - :type: float - - .. attribute:: ik_mode - - Use one of :ref:`these constants`. - - Additional mode for IK constraint. Currently only used for Distance constraint: - - :type: integer - -.. class:: BL_ArmatureChannel(PyObjectPlus) - - Proxy to armature pose channel. Allows to read and set armature pose. - The attributes are identical to RNA attributes, but mostly in read-only mode. - - .. attribute:: name - - channel name (=bone name), read-only. - - :type: string - - .. attribute:: bone - - return the bone object corresponding to this pose channel, read-only. - - :type: :class:`BL_ArmatureBone` - - .. attribute:: parent - - return the parent channel object, None if root channel, read-only. - - :type: :class:`BL_ArmatureChannel` - - .. attribute:: has_ik - - true if the bone is part of an active IK chain, read-only. - This flag is not set when an IK constraint is defined but not enabled (miss target information for example). - - :type: boolean - - .. attribute:: ik_dof_x - - true if the bone is free to rotation in the X axis, read-only. - - :type: boolean - - .. attribute:: ik_dof_y - - true if the bone is free to rotation in the Y axis, read-only. - - :type: boolean - - .. attribute:: ik_dof_z - - true if the bone is free to rotation in the Z axis, read-only. - - :type: boolean - - .. attribute:: ik_limit_x - - true if a limit is imposed on X rotation, read-only. - - :type: boolean - - .. attribute:: ik_limit_y - - true if a limit is imposed on Y rotation, read-only. - - :type: boolean - - .. attribute:: ik_limit_z - - true if a limit is imposed on Z rotation, read-only. - - :type: boolean - - .. attribute:: ik_rot_control - - true if channel rotation should applied as IK constraint, read-only. - - :type: boolean - - .. attribute:: ik_lin_control - - true if channel size should applied as IK constraint, read-only. - - :type: boolean - - .. attribute:: location - - displacement of the bone head in armature local space, read-write. - - :type: vector [X, Y, Z]. - - .. note:: - - You can only move a bone if it is unconnected to its parent. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. - - .. note:: - - Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`). - - .. attribute:: scale - - scale of the bone relative to its parent, read-write. - - :type: vector [sizeX, sizeY, sizeZ]. - - .. note:: - - An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. - - .. note:: - - Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) - - .. attribute:: rotation_quaternion - - rotation of the bone relative to its parent expressed as a quaternion, read-write. - - :type: vector [qr, qi, qj, qk]. - - .. note:: - - This field is only used if rotation_mode is 0. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. - - .. note:: - - Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) - - .. attribute:: rotation_euler - - rotation of the bone relative to its parent expressed as a set of euler angles, read-write. - - :type: vector [X, Y, Z]. - - .. note:: - - This field is only used if rotation_mode is > 0. You must always pass the angles in [X, Y, Z] order; the order of applying the angles to the bone depends on rotation_mode. An action playing on the armature may change this field. An IK chain does not update this value, see joint_rotation. - - .. note:: - - Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) - - .. attribute:: rotation_mode - - Method of updating the bone rotation, read-write. - - :type: integer (one of :ref:`these constants `) - - .. attribute:: channel_matrix - - pose matrix in bone space (deformation of the bone due to action, constraint, etc), Read-only. - This field is updated after the graphic render, it represents the current pose. - - :type: matrix [4][4] - - .. attribute:: pose_matrix - - pose matrix in armature space, read-only, - This field is updated after the graphic render, it represents the current pose. - - :type: matrix [4][4] - - .. attribute:: pose_head - - position of bone head in armature space, read-only. - - :type: vector [x, y, z] - - .. attribute:: pose_tail - - position of bone tail in armature space, read-only. - - :type: vector [x, y, z] - - .. attribute:: ik_min_x - - minimum value of X rotation in degree (<= 0) when X rotation is limited (see ik_limit_x), read-only. - - :type: float - - .. attribute:: ik_max_x - - maximum value of X rotation in degree (>= 0) when X rotation is limited (see ik_limit_x), read-only. - - :type: float - - .. attribute:: ik_min_y - - minimum value of Y rotation in degree (<= 0) when Y rotation is limited (see ik_limit_y), read-only. - - :type: float - - .. attribute:: ik_max_y - - maximum value of Y rotation in degree (>= 0) when Y rotation is limited (see ik_limit_y), read-only. - - :type: float - - .. attribute:: ik_min_z - - minimum value of Z rotation in degree (<= 0) when Z rotation is limited (see ik_limit_z), read-only. - - :type: float - - .. attribute:: ik_max_z - - maximum value of Z rotation in degree (>= 0) when Z rotation is limited (see ik_limit_z), read-only. - - :type: float - - .. attribute:: ik_stiffness_x - - bone rotation stiffness in X axis, read-only. - - :type: float between 0 and 1 - - .. attribute:: ik_stiffness_y - - bone rotation stiffness in Y axis, read-only. - - :type: float between 0 and 1 - - .. attribute:: ik_stiffness_z - - bone rotation stiffness in Z axis, read-only. - - :type: float between 0 and 1 - - .. attribute:: ik_stretch - - ratio of scale change that is allowed, 0=bone can't change size, read-only. - - :type: float - - .. attribute:: ik_rot_weight - - weight of rotation constraint when ik_rot_control is set, read-write. - - :type: float between 0 and 1 - - .. attribute:: ik_lin_weight - - weight of size constraint when ik_lin_control is set, read-write. - - :type: float between 0 and 1 - - .. attribute:: joint_rotation - - Control bone rotation in term of joint angle (for robotic applications), read-write. - - When writing to this attribute, you pass a [x, y, z] vector and an appropriate set of euler angles or quaternion is calculated according to the rotation_mode. - - When you read this attribute, the current pose matrix is converted into a [x, y, z] vector representing the joint angles. - - The value and the meaning of the x, y, z depends on the ik_dof_x/ik_dof_y/ik_dof_z attributes: - - * 1DoF joint X, Y or Z: the corresponding x, y, or z value is used an a joint angle in radiant - * 2DoF joint X+Y or Z+Y: treated as 2 successive 1DoF joints: first X or Z, then Y. The x or z value is used as a joint angle in radiant along the X or Z axis, followed by a rotation along the new Y axis of y radiants. - * 2DoF joint X+Z: treated as a 2DoF joint with rotation axis on the X/Z plane. The x and z values are used as the coordinates of the rotation vector in the X/Z plane. - * 3DoF joint X+Y+Z: treated as a revolute joint. The [x, y, z] vector represents the equivalent rotation vector to bring the joint from the rest pose to the new pose. - - :type: vector [x, y, z] - - .. note:: - - The bone must be part of an IK chain if you want to set the ik_dof_x/ik_dof_y/ik_dof_z attributes via the UI, but this will interfere with this attribute since the IK solver will overwrite the pose. You can stay in control of the armature if you create an IK constraint but do not finalize it (e.g. don't set a target) the IK solver will not run but the IK panel will show up on the UI for each bone in the chain. - - .. note:: - - [0, 0, 0] always corresponds to the rest pose. - - .. note:: - - You must request the armature pose to update and wait for the next graphic frame to see the effect of setting this attribute (see :data:`BL_ArmatureObject.update`). - - .. note:: - - You can read the result of the calculation in rotation or euler_rotation attributes after setting this attribute. - -.. class:: BL_ArmatureBone(PyObjectPlus) - - Proxy to Blender bone structure. All fields are read-only and comply to RNA names. - All space attribute correspond to the rest pose. - - .. attribute:: name - - bone name. - - :type: string - - .. attribute:: connected - - true when the bone head is struck to the parent's tail. - - :type: boolean - - .. attribute:: hinge - - true when bone doesn't inherit rotation or scale from parent bone. - - :type: boolean - - .. attribute:: inherit_scale - - true when bone inherits scaling from parent bone. - - :type: boolean - - .. attribute:: bbone_segments - - number of B-bone segments. - - :type: integer - - .. attribute:: roll - - bone rotation around head-tail axis. - - :type: float - - .. attribute:: head - - location of head end of the bone in parent bone space. - - :type: vector [x, y, z] - - .. attribute:: tail - - location of head end of the bone in parent bone space. - - :type: vector [x, y, z] - - .. attribute:: length - - bone length. - - :type: float - - .. attribute:: arm_head - - location of head end of the bone in armature space. - - :type: vector [x, y, z] - - .. attribute:: arm_tail - - location of tail end of the bone in armature space. - - :type: vector [x, y, z] - - .. attribute:: arm_mat - - matrix of the bone head in armature space. - - :type: matrix [4][4] - - .. note:: - - This matrix has no scale part. - - .. attribute:: bone_mat - - rotation matrix of the bone in parent bone space. - - :type: matrix [3][3] - - .. attribute:: parent - - parent bone, or None for root bone. - - :type: :class:`BL_ArmatureBone` - - .. attribute:: children - - list of bone's children. - - :type: list of :class:`BL_ArmatureBone` diff --git a/doc/python_api/rst/bge_types/bge.types.BL_ActionActuator.rst b/doc/python_api/rst/bge_types/bge.types.BL_ActionActuator.rst new file mode 100644 index 00000000000..9b95a5ba611 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.BL_ActionActuator.rst @@ -0,0 +1,78 @@ +BL_ActionActuator(SCA_IActuator) +================================ + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: BL_ActionActuator(SCA_IActuator) + + Action Actuators apply an action to an actor. + + .. attribute:: action + + The name of the action to set as the current action. + + :type: string + + .. attribute:: frameStart + + Specifies the starting frame of the animation. + + :type: float + + .. attribute:: frameEnd + + Specifies the ending frame of the animation. + + :type: float + + .. attribute:: blendIn + + Specifies the number of frames of animation to generate when making transitions between actions. + + :type: float + + .. attribute:: priority + + Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers. + + :type: integer + + .. attribute:: frame + + Sets the current frame for the animation. + + :type: float + + .. attribute:: propName + + Sets the property to be used in FromProp playback mode. + + :type: string + + .. attribute:: blendTime + + Sets the internal frame timer. This property must be in the range from 0.0 to blendIn. + + :type: float + + .. attribute:: mode + + The operation mode of the actuator. Can be one of :ref:`these constants`. + + :type: integer + + .. attribute:: useContinue + + The actions continue option, True or False. When True, the action will always play from where last left off, + otherwise negative events to this actuator will reset it to its start frame. + + :type: boolean + + .. attribute:: framePropName + + The name of the property that is set to the current frame number. + + :type: string + diff --git a/doc/python_api/rst/bge_types/bge.types.BL_ArmatureActuator.rst b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureActuator.rst new file mode 100644 index 00000000000..579186ac1d6 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureActuator.rst @@ -0,0 +1,61 @@ +BL_ArmatureActuator(SCA_IActuator) +================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: BL_ArmatureActuator(SCA_IActuator) + + Armature Actuators change constraint condition on armatures. + + .. attribute:: type + + The type of action that the actuator executes when it is active. + + Can be one of :ref:`these constants ` + + :type: integer + + .. attribute:: constraint + + The constraint object this actuator is controlling. + + :type: :class:`BL_ArmatureConstraint` + + .. attribute:: target + + The object that this actuator will set as primary target to the constraint it controls. + + :type: :class:`KX_GameObject` + + .. attribute:: subtarget + + The object that this actuator will set as secondary target to the constraint it controls. + + :type: :class:`KX_GameObject`. + + .. note:: + + Currently, the only secondary target is the pole target for IK constraint. + + .. attribute:: weight + + The weight this actuator will set on the constraint it controls. + + :type: float. + + .. note:: + + Currently only the IK constraint has a weight. It must be a value between 0 and 1. + + .. note:: + + A weight of 0 disables a constraint while still updating constraint runtime values (see :class:`BL_ArmatureConstraint`) + + .. attribute:: influence + + The influence this actuator will set on the constraint it controls. + + :type: float. + diff --git a/doc/python_api/rst/bge_types/bge.types.BL_ArmatureBone.rst b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureBone.rst new file mode 100644 index 00000000000..14a9ebe9ef3 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureBone.rst @@ -0,0 +1,105 @@ +BL_ArmatureBone(PyObjectPlus) +============================= + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: BL_ArmatureBone(PyObjectPlus) + + Proxy to Blender bone structure. All fields are read-only and comply to RNA names. + All space attribute correspond to the rest pose. + + .. attribute:: name + + bone name. + + :type: string + + .. attribute:: connected + + true when the bone head is struck to the parent's tail. + + :type: boolean + + .. attribute:: hinge + + true when bone doesn't inherit rotation or scale from parent bone. + + :type: boolean + + .. attribute:: inherit_scale + + true when bone inherits scaling from parent bone. + + :type: boolean + + .. attribute:: bbone_segments + + number of B-bone segments. + + :type: integer + + .. attribute:: roll + + bone rotation around head-tail axis. + + :type: float + + .. attribute:: head + + location of head end of the bone in parent bone space. + + :type: vector [x, y, z] + + .. attribute:: tail + + location of head end of the bone in parent bone space. + + :type: vector [x, y, z] + + .. attribute:: length + + bone length. + + :type: float + + .. attribute:: arm_head + + location of head end of the bone in armature space. + + :type: vector [x, y, z] + + .. attribute:: arm_tail + + location of tail end of the bone in armature space. + + :type: vector [x, y, z] + + .. attribute:: arm_mat + + matrix of the bone head in armature space. + + :type: matrix [4][4] + + .. note:: + + This matrix has no scale part. + + .. attribute:: bone_mat + + rotation matrix of the bone in parent bone space. + + :type: matrix [3][3] + + .. attribute:: parent + + parent bone, or None for root bone. + + :type: :class:`BL_ArmatureBone` + + .. attribute:: children + + list of bone's children. + + :type: list of :class:`BL_ArmatureBone` diff --git a/doc/python_api/rst/bge_types/bge.types.BL_ArmatureChannel.rst b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureChannel.rst new file mode 100644 index 00000000000..07220534b28 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureChannel.rst @@ -0,0 +1,278 @@ +BL_ArmatureChannel(PyObjectPlus) +================================ + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: BL_ArmatureChannel(PyObjectPlus) + + Proxy to armature pose channel. Allows to read and set armature pose. + The attributes are identical to RNA attributes, but mostly in read-only mode. + + .. attribute:: name + + channel name (=bone name), read-only. + + :type: string + + .. attribute:: bone + + return the bone object corresponding to this pose channel, read-only. + + :type: :class:`BL_ArmatureBone` + + .. attribute:: parent + + return the parent channel object, None if root channel, read-only. + + :type: :class:`BL_ArmatureChannel` + + .. attribute:: has_ik + + true if the bone is part of an active IK chain, read-only. + This flag is not set when an IK constraint is defined but not enabled (miss target information for example). + + :type: boolean + + .. attribute:: ik_dof_x + + true if the bone is free to rotation in the X axis, read-only. + + :type: boolean + + .. attribute:: ik_dof_y + + true if the bone is free to rotation in the Y axis, read-only. + + :type: boolean + + .. attribute:: ik_dof_z + + true if the bone is free to rotation in the Z axis, read-only. + + :type: boolean + + .. attribute:: ik_limit_x + + true if a limit is imposed on X rotation, read-only. + + :type: boolean + + .. attribute:: ik_limit_y + + true if a limit is imposed on Y rotation, read-only. + + :type: boolean + + .. attribute:: ik_limit_z + + true if a limit is imposed on Z rotation, read-only. + + :type: boolean + + .. attribute:: ik_rot_control + + true if channel rotation should applied as IK constraint, read-only. + + :type: boolean + + .. attribute:: ik_lin_control + + true if channel size should applied as IK constraint, read-only. + + :type: boolean + + .. attribute:: location + + displacement of the bone head in armature local space, read-write. + + :type: vector [X, Y, Z]. + + .. note:: + + You can only move a bone if it is unconnected to its parent. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. + + .. note:: + + Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`). + + .. attribute:: scale + + scale of the bone relative to its parent, read-write. + + :type: vector [sizeX, sizeY, sizeZ]. + + .. note:: + + An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. + + .. note:: + + Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) + + .. attribute:: rotation_quaternion + + rotation of the bone relative to its parent expressed as a quaternion, read-write. + + :type: vector [qr, qi, qj, qk]. + + .. note:: + + This field is only used if rotation_mode is 0. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. + + .. note:: + + Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) + + .. attribute:: rotation_euler + + rotation of the bone relative to its parent expressed as a set of euler angles, read-write. + + :type: vector [X, Y, Z]. + + .. note:: + + This field is only used if rotation_mode is > 0. You must always pass the angles in [X, Y, Z] order; the order of applying the angles to the bone depends on rotation_mode. An action playing on the armature may change this field. An IK chain does not update this value, see joint_rotation. + + .. note:: + + Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) + + .. attribute:: rotation_mode + + Method of updating the bone rotation, read-write. + + :type: integer (one of :ref:`these constants `) + + .. attribute:: channel_matrix + + pose matrix in bone space (deformation of the bone due to action, constraint, etc), Read-only. + This field is updated after the graphic render, it represents the current pose. + + :type: matrix [4][4] + + .. attribute:: pose_matrix + + pose matrix in armature space, read-only, + This field is updated after the graphic render, it represents the current pose. + + :type: matrix [4][4] + + .. attribute:: pose_head + + position of bone head in armature space, read-only. + + :type: vector [x, y, z] + + .. attribute:: pose_tail + + position of bone tail in armature space, read-only. + + :type: vector [x, y, z] + + .. attribute:: ik_min_x + + minimum value of X rotation in degree (<= 0) when X rotation is limited (see ik_limit_x), read-only. + + :type: float + + .. attribute:: ik_max_x + + maximum value of X rotation in degree (>= 0) when X rotation is limited (see ik_limit_x), read-only. + + :type: float + + .. attribute:: ik_min_y + + minimum value of Y rotation in degree (<= 0) when Y rotation is limited (see ik_limit_y), read-only. + + :type: float + + .. attribute:: ik_max_y + + maximum value of Y rotation in degree (>= 0) when Y rotation is limited (see ik_limit_y), read-only. + + :type: float + + .. attribute:: ik_min_z + + minimum value of Z rotation in degree (<= 0) when Z rotation is limited (see ik_limit_z), read-only. + + :type: float + + .. attribute:: ik_max_z + + maximum value of Z rotation in degree (>= 0) when Z rotation is limited (see ik_limit_z), read-only. + + :type: float + + .. attribute:: ik_stiffness_x + + bone rotation stiffness in X axis, read-only. + + :type: float between 0 and 1 + + .. attribute:: ik_stiffness_y + + bone rotation stiffness in Y axis, read-only. + + :type: float between 0 and 1 + + .. attribute:: ik_stiffness_z + + bone rotation stiffness in Z axis, read-only. + + :type: float between 0 and 1 + + .. attribute:: ik_stretch + + ratio of scale change that is allowed, 0=bone can't change size, read-only. + + :type: float + + .. attribute:: ik_rot_weight + + weight of rotation constraint when ik_rot_control is set, read-write. + + :type: float between 0 and 1 + + .. attribute:: ik_lin_weight + + weight of size constraint when ik_lin_control is set, read-write. + + :type: float between 0 and 1 + + .. attribute:: joint_rotation + + Control bone rotation in term of joint angle (for robotic applications), read-write. + + When writing to this attribute, you pass a [x, y, z] vector and an appropriate set of euler angles or quaternion is calculated according to the rotation_mode. + + When you read this attribute, the current pose matrix is converted into a [x, y, z] vector representing the joint angles. + + The value and the meaning of the x, y, z depends on the ik_dof_x/ik_dof_y/ik_dof_z attributes: + + * 1DoF joint X, Y or Z: the corresponding x, y, or z value is used an a joint angle in radiant + * 2DoF joint X+Y or Z+Y: treated as 2 successive 1DoF joints: first X or Z, then Y. The x or z value is used as a joint angle in radiant along the X or Z axis, followed by a rotation along the new Y axis of y radiants. + * 2DoF joint X+Z: treated as a 2DoF joint with rotation axis on the X/Z plane. The x and z values are used as the coordinates of the rotation vector in the X/Z plane. + * 3DoF joint X+Y+Z: treated as a revolute joint. The [x, y, z] vector represents the equivalent rotation vector to bring the joint from the rest pose to the new pose. + + :type: vector [x, y, z] + + .. note:: + + The bone must be part of an IK chain if you want to set the ik_dof_x/ik_dof_y/ik_dof_z attributes via the UI, but this will interfere with this attribute since the IK solver will overwrite the pose. You can stay in control of the armature if you create an IK constraint but do not finalize it (e.g. don't set a target) the IK solver will not run but the IK panel will show up on the UI for each bone in the chain. + + .. note:: + + [0, 0, 0] always corresponds to the rest pose. + + .. note:: + + You must request the armature pose to update and wait for the next graphic frame to see the effect of setting this attribute (see :data:`BL_ArmatureObject.update`). + + .. note:: + + You can read the result of the calculation in rotation or euler_rotation attributes after setting this attribute. + diff --git a/doc/python_api/rst/bge_types/bge.types.BL_ArmatureConstraint.rst b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureConstraint.rst new file mode 100644 index 00000000000..1a4370945c1 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureConstraint.rst @@ -0,0 +1,129 @@ +BL_ArmatureConstraint(PyObjectPlus) +=================================== + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: BL_ArmatureConstraint(PyObjectPlus) + + Proxy to Armature Constraint. Allows to change constraint on the fly. + Obtained through :class:`BL_ArmatureObject`.constraints. + + .. note:: + + Not all armature constraints are supported in the GE. + + + .. attribute:: type + + Type of constraint, (read-only). + + Use one of :ref:`these constants`. + + :type: integer, one of CONSTRAINT_TYPE_* constants + + .. attribute:: name + + Name of constraint constructed as :. constraints list. + + :type: string + + This name is also the key subscript on :class:`BL_ArmatureObject`. + + .. attribute:: enforce + + fraction of constraint effect that is enforced. Between 0 and 1. + + :type: float + + .. attribute:: headtail + + Position of target between head and tail of the target bone: 0=head, 1=tail. + + :type: float. + + .. note:: + + Only used if the target is a bone (i.e target object is an armature. + + .. attribute:: lin_error + + runtime linear error (in Blender units) on constraint at the current frame. + + This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver. + + :type: float + + .. attribute:: rot_error + + Runtime rotation error (in radiant) on constraint at the current frame. + + :type: float. + + This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver. + + It is only set if the constraint has a rotation part, for example, a CopyPose+Rotation IK constraint. + + .. attribute:: target + + Primary target object for the constraint. The position of this object in the GE will be used as target for the constraint. + + :type: :class:`KX_GameObject`. + + .. attribute:: subtarget + + Secondary target object for the constraint. The position of this object in the GE will be used as secondary target for the constraint. + + :type: :class:`KX_GameObject`. + + Currently this is only used for pole target on IK constraint. + + .. attribute:: active + + True if the constraint is active. + + :type: boolean + + .. note:: + + An inactive constraint does not update lin_error and rot_error. + + .. attribute:: ik_weight + + Weight of the IK constraint between 0 and 1. + + Only defined for IK constraint. + + :type: float + + .. attribute:: ik_type + + Type of IK constraint, (read-only). + + Use one of :ref:`these constants`. + + :type: integer. + + .. attribute:: ik_flag + + Combination of IK constraint option flags, read-only. + + Use one of :ref:`these constants`. + + :type: integer + + .. attribute:: ik_dist + + Distance the constraint is trying to maintain with target, only used when ik_type=CONSTRAINT_IK_DISTANCE. + + :type: float + + .. attribute:: ik_mode + + Use one of :ref:`these constants`. + + Additional mode for IK constraint. Currently only used for Distance constraint: + + :type: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.BL_ArmatureObject.rst b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureObject.rst new file mode 100644 index 00000000000..8389affe8a9 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.BL_ArmatureObject.rst @@ -0,0 +1,34 @@ +BL_ArmatureObject(KX_GameObject) +================================ + +.. module:: bge.types + +base class --- :class:`KX_GameObject` + +.. class:: BL_ArmatureObject(KX_GameObject) + + An armature object. + + .. attribute:: constraints + + The list of armature constraint defined on this armature. + Elements of the list can be accessed by index or string. + The key format for string access is ':'. + + :type: list of :class:`BL_ArmatureConstraint` + + .. attribute:: channels + + The list of armature channels. + Elements of the list can be accessed by index or name the bone. + + :type: list of :class:`BL_ArmatureChannel` + + .. method:: update() + + Ensures that the armature will be updated on next graphic frame. + + This action is unecessary if a KX_ArmatureActuator with mode run is active + or if an action is playing. Use this function in other cases. It must be called + on each frame to ensure that the armature is updated continously. + diff --git a/doc/python_api/rst/bge_types/bge.types.BL_Shader.rst b/doc/python_api/rst/bge_types/bge.types.BL_Shader.rst new file mode 100644 index 00000000000..f4f5c0d62ba --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.BL_Shader.rst @@ -0,0 +1,220 @@ +BL_Shader(PyObjectPlus) +======================= + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: BL_Shader(PyObjectPlus) + + BL_Shader GLSL shaders. + + TODO - Description + + .. method:: setUniformfv(name, fList) + + Set a uniform with a list of float values + + :arg name: the uniform name + :type name: string + :arg fList: a list (2, 3 or 4 elements) of float values + :type fList: list[float] + + .. method:: delSource() + + Clear the shader. Use this method before the source is changed with :data:`setSource`. + + .. method:: getFragmentProg() + + Returns the fragment program. + + :return: The fragment program. + :rtype: string + + .. method:: getVertexProg() + + Get the vertex program. + + :return: The vertex program. + :rtype: string + + .. method:: isValid() + + Check if the shader is valid. + + :return: True if the shader is valid + :rtype: boolean + + .. method:: setAttrib(enum) + + Set attribute location. (The parameter is ignored a.t.m. and the value of "tangent" is always used.) + + :arg enum: attribute location value + :type enum: integer + + .. method:: setNumberOfPasses( max_pass ) + + Set the maximum number of passes. Not used a.t.m. + + :arg max_pass: the maximum number of passes + :type max_pass: integer + + .. method:: setSampler(name, index) + + Set uniform texture sample index. + + :arg name: Uniform name + :type name: string + :arg index: Texture sample index. + :type index: integer + + .. method:: setSource(vertexProgram, fragmentProgram) + + Set the vertex and fragment programs + + :arg vertexProgram: Vertex program + :type vertexProgram: string + :arg fragmentProgram: Fragment program + :type fragmentProgram: string + + .. method:: setUniform1f(name, fx) + + Set a uniform with 1 float value. + + :arg name: the uniform name + :type name: string + :arg fx: Uniform value + :type fx: float + + .. method:: setUniform1i(name, ix) + + Set a uniform with an integer value. + + :arg name: the uniform name + :type name: string + :arg ix: the uniform value + :type ix: integer + + .. method:: setUniform2f(name, fx, fy) + + Set a uniform with 2 float values + + :arg name: the uniform name + :type name: string + :arg fx: first float value + :type fx: float + + :arg fy: second float value + :type fy: float + + .. method:: setUniform2i(name, ix, iy) + + Set a uniform with 2 integer values + + :arg name: the uniform name + :type name: string + :arg ix: first integer value + :type ix: integer + :arg iy: second integer value + :type iy: integer + + .. method:: setUniform3f(name, fx, fy, fz) + + Set a uniform with 3 float values. + + :arg name: the uniform name + :type name: string + :arg fx: first float value + :type fx: float + :arg fy: second float value + :type fy: float + :arg fz: third float value + :type fz: float + + .. method:: setUniform3i(name, ix, iy, iz) + + Set a uniform with 3 integer values + + :arg name: the uniform name + :type name: string + :arg ix: first integer value + :type ix: integer + :arg iy: second integer value + :type iy: integer + :arg iz: third integer value + :type iz: integer + + .. method:: setUniform4f(name, fx, fy, fz, fw) + + Set a uniform with 4 float values. + + :arg name: the uniform name + :type name: string + :arg fx: first float value + :type fx: float + :arg fy: second float value + :type fy: float + :arg fz: third float value + :type fz: float + :arg fw: fourth float value + :type fw: float + + .. method:: setUniform4i(name, ix, iy, iz, iw) + + Set a uniform with 4 integer values + + :arg name: the uniform name + :type name: string + :arg ix: first integer value + :type ix: integer + :arg iy: second integer value + :type iy: integer + :arg iz: third integer value + :type iz: integer + :arg iw: fourth integer value + :type iw: integer + + .. method:: setUniformDef(name, type) + + Define a new uniform + + :arg name: the uniform name + :type name: string + :arg type: uniform type + :type type: UNI_NONE, UNI_INT, UNI_FLOAT, UNI_INT2, UNI_FLOAT2, UNI_INT3, UNI_FLOAT3, UNI_INT4, UNI_FLOAT4, UNI_MAT3, UNI_MAT4, UNI_MAX + + .. method:: setUniformMatrix3(name, mat, transpose) + + Set a uniform with a 3x3 matrix value + + :arg name: the uniform name + :type name: string + :arg mat: A 3x3 matrix [[f, f, f], [f, f, f], [f, f, f]] + :type mat: 3x3 matrix + :arg transpose: set to True to transpose the matrix + :type transpose: boolean + + .. method:: setUniformMatrix4(name, mat, transpose) + + Set a uniform with a 4x4 matrix value + + :arg name: the uniform name + :type name: string + :arg mat: A 4x4 matrix [[f, f, f, f], [f, f, f, f], [f, f, f, f], [f, f, f, f]] + :type mat: 4x4 matrix + :arg transpose: set to True to transpose the matrix + :type transpose: boolean + + .. method:: setUniformiv(name, iList) + + Set a uniform with a list of integer values + + :arg name: the uniform name + :type name: string + :arg iList: a list (2, 3 or 4 elements) of integer values + :type iList: list[integer] + + .. method:: validate() + + Validate the shader object. + diff --git a/doc/python_api/rst/bge_types/bge.types.BL_ShapeActionActuator.rst b/doc/python_api/rst/bge_types/bge.types.BL_ShapeActionActuator.rst new file mode 100644 index 00000000000..d08a761ed95 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.BL_ShapeActionActuator.rst @@ -0,0 +1,72 @@ +BL_ShapeActionActuator(SCA_IActuator) +===================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: BL_ShapeActionActuator(SCA_IActuator) + + ShapeAction Actuators apply an shape action to an mesh object. + + .. attribute:: action + + The name of the action to set as the current shape action. + + :type: string + + .. attribute:: frameStart + + Specifies the starting frame of the shape animation. + + :type: float + + .. attribute:: frameEnd + + Specifies the ending frame of the shape animation. + + :type: float + + .. attribute:: blendIn + + Specifies the number of frames of animation to generate when making transitions between actions. + + :type: float + + .. attribute:: priority + + Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers. + + :type: integer + + .. attribute:: frame + + Sets the current frame for the animation. + + :type: float + + .. attribute:: propName + + Sets the property to be used in FromProp playback mode. + + :type: string + + .. attribute:: blendTime + + Sets the internal frame timer. This property must be in the range from 0.0 to blendin. + + :type: float + + .. attribute:: mode + + The operation mode of the actuator. Can be one of :ref:`these constants`. + + :type: integer + + .. attribute:: framePropName + + The name of the property that is set to the current frame number. + + :type: string + + diff --git a/doc/python_api/rst/bge_types/bge.types.CListValue.rst b/doc/python_api/rst/bge_types/bge.types.CListValue.rst new file mode 100644 index 00000000000..ca4cdc44bf5 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.CListValue.rst @@ -0,0 +1,72 @@ +CListValue(CPropValue) +====================== + +.. module:: bge.types + +base class --- :class:`CPropValue` + +.. class:: CListValue(CPropValue) + + This is a list like object used in the game engine internally that behaves similar to a python list in most ways. + + As well as the normal index lookup (``val= clist[i]``), CListValue supports string lookups (``val= scene.objects["Cube"]``) + + Other operations such as ``len(clist)``, ``list(clist)``, ``clist[0:10]`` are also supported. + + .. method:: append(val) + + Add an item to the list (like pythons append) + + .. warning:: + + Appending values to the list can cause crashes when the list is used internally by the game engine. + + .. method:: count(val) + + Count the number of instances of a value in the list. + + :return: number of instances + :rtype: integer + + .. method:: index(val) + + Return the index of a value in the list. + + :return: The index of the value in the list. + :rtype: integer + + .. method:: reverse() + + Reverse the order of the list. + + .. method:: get(key, default=None) + + Return the value matching key, or the default value if its not found. + + :return: The key value or a default. + + .. method:: from_id(id) + + This is a funtion especially for the game engine to return a value with a spesific id. + + Since object names are not always unique, the id of an object can be used to get an object from the CValueList. + + Example: + + .. code-block:: python + + myObID=id(gameObject) + ob= scene.objects.from_id(myObID) + + Where ``myObID`` is an int or long from the id function. + + This has the advantage that you can store the id in places you could not store a gameObject. + + .. warning:: + + The id is derived from a memory location and will be different each time the game engine starts. + + .. warning:: + + The id can't be stored as an integer in game object properties, as those only have a limited range that the id may not be contained in. Instead an id can be stored as a string game property and converted back to an integer for use in from_id lookups. + diff --git a/doc/python_api/rst/bge_types/bge.types.CPropValue.rst b/doc/python_api/rst/bge_types/bge.types.CPropValue.rst new file mode 100644 index 00000000000..7be28c1e006 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.CPropValue.rst @@ -0,0 +1,11 @@ +CPropValue(CValue) +================== + +.. module:: bge.types + +base class --- :class:`CValue` + +.. class:: CPropValue(CValue) + + This class has no python functions + diff --git a/doc/python_api/rst/bge_types/bge.types.CValue.rst b/doc/python_api/rst/bge_types/bge.types.CValue.rst new file mode 100644 index 00000000000..52906de5576 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.CValue.rst @@ -0,0 +1,17 @@ +CValue(PyObjectPlus) +==================== + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: CValue(PyObjectPlus) + + This class is a basis for other classes. + + .. attribute:: name + + The name of this CValue derived object (read-only). + + :type: string + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_ArmatureSensor.rst b/doc/python_api/rst/bge_types/bge.types.KX_ArmatureSensor.rst new file mode 100644 index 00000000000..a7123eb5c9d --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_ArmatureSensor.rst @@ -0,0 +1,36 @@ +KX_ArmatureSensor(SCA_ISensor) +============================== + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: KX_ArmatureSensor(SCA_ISensor) + + Armature sensor detect conditions on armatures. + + .. attribute:: type + + The type of measurement that the sensor make when it is active. + + Can be one of :ref:`these constants ` + + :type: integer. + + .. attribute:: constraint + + The constraint object this sensor is watching. + + :type: :class:`BL_ArmatureConstraint` + + .. attribute:: value + + The threshold used in the comparison with the constraint error + The linear error is only updated on CopyPose/Distance IK constraint with iTaSC solver + The rotation error is only updated on CopyPose+rotation IK constraint with iTaSC solver + The linear error on CopyPose is always >= 0: it is the norm of the distance between the target and the bone + The rotation error on CopyPose is always >= 0: it is the norm of the equivalent rotation vector between the bone and the target orientations + The linear error on Distance can be positive if the distance between the bone and the target is greater than the desired distance, and negative if the distance is smaller. + + :type: float + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_BlenderMaterial.rst b/doc/python_api/rst/bge_types/bge.types.KX_BlenderMaterial.rst new file mode 100644 index 00000000000..0dfc7a10d13 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_BlenderMaterial.rst @@ -0,0 +1,77 @@ +KX_BlenderMaterial(PyObjectPlus) +================================ + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: KX_BlenderMaterial(PyObjectPlus) + + KX_BlenderMaterial + + .. attribute:: shader + + The materials shader. + + :type: :class:`BL_Shader` + + .. attribute:: blending + + Ints used for pixel blending, (src, dst), matching the setBlending method. + + :type: (integer, integer) + + .. attribute:: material_index + + The material's index. + + :type: integer + + .. method:: getShader() + + Returns the material's shader. + + :return: the material's shader + :rtype: :class:`BL_Shader` + + .. method:: setBlending(src, dest) + + Set the pixel color arithmetic functions. + + :arg src: Specifies how the red, green, blue, and alpha source blending factors are computed. + :type src: Value in... + + * GL_ZERO, + * GL_ONE, + * GL_SRC_COLOR, + * GL_ONE_MINUS_SRC_COLOR, + * GL_DST_COLOR, + * GL_ONE_MINUS_DST_COLOR, + * GL_SRC_ALPHA, + * GL_ONE_MINUS_SRC_ALPHA, + * GL_DST_ALPHA, + * GL_ONE_MINUS_DST_ALPHA, + * GL_SRC_ALPHA_SATURATE + + :arg dest: Specifies how the red, green, blue, and alpha destination blending factors are computed. + :type dest: Value in... + + * GL_ZERO + * GL_ONE + * GL_SRC_COLOR + * GL_ONE_MINUS_SRC_COLOR + * GL_DST_COLOR + * GL_ONE_MINUS_DST_COLOR + * GL_SRC_ALPHA + * GL_ONE_MINUS_SRC_ALPHA + * GL_DST_ALPHA + * GL_ONE_MINUS_DST_ALPHA + * GL_SRC_ALPHA_SATURATE + + .. method:: getMaterialIndex() + + Returns the material's index. + + :return: the material's index + :rtype: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_Camera.rst b/doc/python_api/rst/bge_types/bge.types.KX_Camera.rst new file mode 100644 index 00000000000..baf60ec0c97 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_Camera.rst @@ -0,0 +1,284 @@ +KX_Camera(KX_GameObject) +======================== + +.. module:: bge.types + +base class --- :class:`KX_GameObject` + +.. class:: KX_Camera(KX_GameObject) + + A Camera object. + + .. data:: INSIDE + + See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` + + .. data:: INTERSECT + + See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` + + .. data:: OUTSIDE + + See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` + + .. attribute:: lens + + The camera's lens value. + + :type: float + + .. attribute:: ortho_scale + + The camera's view scale when in orthographic mode. + + :type: float + + .. attribute:: near + + The camera's near clip distance. + + :type: float + + .. attribute:: far + + The camera's far clip distance. + + :type: float + + .. attribute:: perspective + + True if this camera has a perspective transform, False for an orthographic projection. + + :type: boolean + + .. attribute:: frustum_culling + + True if this camera is frustum culling. + + :type: boolean + + .. attribute:: projection_matrix + + This camera's 4x4 projection matrix. + + .. note:: + + This is the identity matrix prior to rendering the first frame (any Python done on frame 1). + + :type: 4x4 Matrix [[float]] + + .. attribute:: modelview_matrix + + This camera's 4x4 model view matrix. (read-only). + + :type: 4x4 Matrix [[float]] + + .. note:: + + This matrix is regenerated every frame from the camera's position and orientation. Also, this is the identity matrix prior to rendering the first frame (any Python done on frame 1). + + .. attribute:: camera_to_world + + This camera's camera to world transform. (read-only). + + :type: 4x4 Matrix [[float]] + + .. note:: + + This matrix is regenerated every frame from the camera's position and orientation. + + .. attribute:: world_to_camera + + This camera's world to camera transform. (read-only). + + :type: 4x4 Matrix [[float]] + + .. note:: + + Regenerated every frame from the camera's position and orientation. + + .. note:: + + This is camera_to_world inverted. + + .. attribute:: useViewport + + True when the camera is used as a viewport, set True to enable a viewport for this camera. + + :type: boolean + + .. method:: sphereInsideFrustum(centre, radius) + + Tests the given sphere against the view frustum. + + :arg centre: The centre of the sphere (in world coordinates.) + :type centre: list [x, y, z] + :arg radius: the radius of the sphere + :type radius: float + :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT` + :rtype: integer + + .. note:: + + When the camera is first initialized the result will be invalid because the projection matrix has not been set. + + .. code-block:: python + + from bge import logic + cont = logic.getCurrentController() + cam = cont.owner + + # A sphere of radius 4.0 located at [x, y, z] = [1.0, 1.0, 1.0] + if (cam.sphereInsideFrustum([1.0, 1.0, 1.0], 4) != cam.OUTSIDE): + # Sphere is inside frustum ! + # Do something useful ! + else: + # Sphere is outside frustum + + .. method:: boxInsideFrustum(box) + + Tests the given box against the view frustum. + + :arg box: Eight (8) corner points of the box (in world coordinates.) + :type box: list of lists + :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT` + + .. note:: + + When the camera is first initialized the result will be invalid because the projection matrix has not been set. + + .. code-block:: python + + from bge import logic + cont = logic.getCurrentController() + cam = cont.owner + + # Box to test... + box = [] + box.append([-1.0, -1.0, -1.0]) + box.append([-1.0, -1.0, 1.0]) + box.append([-1.0, 1.0, -1.0]) + box.append([-1.0, 1.0, 1.0]) + box.append([ 1.0, -1.0, -1.0]) + box.append([ 1.0, -1.0, 1.0]) + box.append([ 1.0, 1.0, -1.0]) + box.append([ 1.0, 1.0, 1.0]) + + if (cam.boxInsideFrustum(box) != cam.OUTSIDE): + # Box is inside/intersects frustum ! + # Do something useful ! + else: + # Box is outside the frustum ! + + .. method:: pointInsideFrustum(point) + + Tests the given point against the view frustum. + + :arg point: The point to test (in world coordinates.) + :type point: 3D Vector + :return: True if the given point is inside this camera's viewing frustum. + :rtype: boolean + + .. note:: + + When the camera is first initialized the result will be invalid because the projection matrix has not been set. + + .. code-block:: python + + from bge import logic + cont = logic.getCurrentController() + cam = cont.owner + + # Test point [0.0, 0.0, 0.0] + if (cam.pointInsideFrustum([0.0, 0.0, 0.0])): + # Point is inside frustum ! + # Do something useful ! + else: + # Box is outside the frustum ! + + .. method:: getCameraToWorld() + + Returns the camera-to-world transform. + + :return: the camera-to-world transform matrix. + :rtype: matrix (4x4 list) + + .. method:: getWorldToCamera() + + Returns the world-to-camera transform. + + This returns the inverse matrix of getCameraToWorld(). + + :return: the world-to-camera transform matrix. + :rtype: matrix (4x4 list) + + .. method:: setOnTop() + + Set this cameras viewport ontop of all other viewport. + + .. method:: setViewport(left, bottom, right, top) + + Sets the region of this viewport on the screen in pixels. + + Use :data:`bge.render.getWindowHeight` and :data:`bge.render.getWindowWidth` to calculate values relative to the entire display. + + :arg left: left pixel coordinate of this viewport + :type left: integer + :arg bottom: bottom pixel coordinate of this viewport + :type bottom: integer + :arg right: right pixel coordinate of this viewport + :type right: integer + :arg top: top pixel coordinate of this viewport + :type top: integer + + .. method:: getScreenPosition(object) + + Gets the position of an object projected on screen space. + + .. code-block:: python + + # For an object in the middle of the screen, coord = [0.5, 0.5] + coord = camera.getScreenPosition(object) + + :arg object: object name or list [x, y, z] + :type object: :class:`KX_GameObject` or 3D Vector + :return: the object's position in screen coordinates. + :rtype: list [x, y] + + .. method:: getScreenVect(x, y) + + Gets the vector from the camera position in the screen coordinate direction. + + :arg x: X Axis + :type x: float + :arg y: Y Axis + :type y: float + :rtype: 3D Vector + :return: The vector from screen coordinate. + + .. code-block:: python + + # Gets the vector of the camera front direction: + m_vect = camera.getScreenVect(0.5, 0.5) + + .. method:: getScreenRay(x, y, dist=inf, property=None) + + Look towards a screen coordinate (x, y) and find first object hit within dist that matches prop. + The ray is similar to KX_GameObject->rayCastTo. + + :arg x: X Axis + :type x: float + :arg y: Y Axis + :type y: float + :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other + :type dist: float + :arg property: property name that object must have; can be omitted => detect any object + :type property: string + :rtype: :class:`KX_GameObject` + :return: the first object hit or None if no object or object does not match prop + + .. code-block:: python + + # Gets an object with a property "wall" in front of the camera within a distance of 100: + target = camera.getScreenRay(0.5, 0.5, 100, "wall") + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_CameraActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_CameraActuator.rst new file mode 100644 index 00000000000..bc5efed4b08 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_CameraActuator.rst @@ -0,0 +1,47 @@ +KX_CameraActuator(SCA_IActuator) +================================ + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_CameraActuator(SCA_IActuator) + + Applies changes to a camera. + + .. attribute:: damping + + strength of of the camera following movement. + + :type: float + + .. attribute:: axis + + The camera axis (0, 1, 2) for positive ``XYZ``, (3, 4, 5) for negative ``XYZ``. + + :type: int + + .. attribute:: min + + minimum distance to the target object maintained by the actuator. + + :type: float + + .. attribute:: max + + maximum distance to stay from the target object. + + :type: float + + .. attribute:: height + + height to stay above the target object. + + :type: float + + .. attribute:: object + + the object this actuator tracks. + + :type: :class:`KX_GameObject` or None + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_CharacterWrapper.rst b/doc/python_api/rst/bge_types/bge.types.KX_CharacterWrapper.rst new file mode 100644 index 00000000000..32e5c3eaad8 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_CharacterWrapper.rst @@ -0,0 +1,45 @@ +KX_CharacterWrapper(PyObjectPlus) +================================= + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: KX_CharacterWrapper(PyObjectPlus) + + A wrapper to expose character physics options. + + .. attribute:: onGround + + Whether or not the character is on the ground. (read-only) + + :type: boolean + + .. attribute:: gravity + + The gravity value used for the character. + + :type: float + + .. attribute:: maxJumps + + The maximum number of jumps a character can perform before having to touch the ground. By default this is set to 1. 2 allows for a double jump, etc. + + :type: int + + .. attribute:: jumpCount + + The current jump count. This can be used to have different logic for a single jump versus a double jump. For example, a different animation for the second jump. + + :type: int + + .. attribute:: walkDirection + + The speed and direction the character is traveling in using world coordinates. This should be used instead of applyMovement() to properly move the character. + + :type: list [x, y, z] + + .. method:: jump() + + The character jumps based on it's jump speed. + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_ConstraintActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_ConstraintActuator.rst new file mode 100644 index 00000000000..498990449fe --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_ConstraintActuator.rst @@ -0,0 +1,78 @@ +KX_ConstraintActuator(SCA_IActuator) +==================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_ConstraintActuator(SCA_IActuator) + + A constraint actuator limits the position, rotation, distance or orientation of an object. + + .. attribute:: damp + + Time constant of the constraint expressed in frame (not use by Force field constraint). + + :type: integer + + .. attribute:: rotDamp + + Time constant for the rotation expressed in frame (only for the distance constraint), 0 = use damp for rotation as well. + + :type: integer + + .. attribute:: direction + + The reference direction in world coordinate for the orientation constraint. + + :type: 3-tuple of float: (x, y, z) + + .. attribute:: option + + Binary combination of :ref:`these constants ` + + :type: integer + + .. attribute:: time + + activation time of the actuator. The actuator disables itself after this many frame. If set to 0, the actuator is not limited in time. + + :type: integer + + .. attribute:: propName + + the name of the property or material for the ray detection of the distance constraint. + + :type: string + + .. attribute:: min + + The lower bound of the constraint. For the rotation and orientation constraint, it represents radiant. + + :type: float + + .. attribute:: distance + + the target distance of the distance constraint. + + :type: float + + .. attribute:: max + + the upper bound of the constraint. For rotation and orientation constraints, it represents radiant. + + :type: float + + .. attribute:: rayLength + + the length of the ray of the distance constraint. + + :type: float + + .. attribute:: limit + + type of constraint. Use one of the :ref:`these constants ` + + :type: integer. + + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_ConstraintWrapper.rst b/doc/python_api/rst/bge_types/bge.types.KX_ConstraintWrapper.rst new file mode 100644 index 00000000000..c26675147ac --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_ConstraintWrapper.rst @@ -0,0 +1,18 @@ +KX_ConstraintWrapper(PyObjectPlus) +================================== + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: KX_ConstraintWrapper(PyObjectPlus) + + KX_ConstraintWrapper + + .. method:: getConstraintId(val) + + Returns the contraint's ID + + :return: the constraint's ID + :rtype: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_FontObject.rst b/doc/python_api/rst/bge_types/bge.types.KX_FontObject.rst new file mode 100644 index 00000000000..1961f5e3e92 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_FontObject.rst @@ -0,0 +1,12 @@ +KX_FontObject(KX_GameObject) +============================ + +.. module:: bge.types + +base class --- :class:`KX_GameObject` + +.. class:: KX_FontObject(KX_GameObject) + + TODO. + + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_GameActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_GameActuator.rst new file mode 100644 index 00000000000..54702c5318d --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_GameActuator.rst @@ -0,0 +1,23 @@ +KX_GameActuator(SCA_IActuator) +============================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_GameActuator(SCA_IActuator) + + The game actuator loads a new .blend file, restarts the current .blend file or quits the game. + + .. attribute:: fileName + + the new .blend file to load. + + :type: string + + .. attribute:: mode + + The mode of this actuator. Can be on of :ref:`these constants ` + + :type: Int + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst b/doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst new file mode 100644 index 00000000000..a9c91735f91 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst @@ -0,0 +1,839 @@ +KX_GameObject(SCA_IObject) +========================== + +.. module:: bge.types + +base class --- :class:`SCA_IObject` + +.. class:: KX_GameObject(SCA_IObject) + + All game objects are derived from this class. + + Properties assigned to game objects are accessible as attributes of this class. + + .. note:: + + Calling ANY method or attribute on an object that has been removed from a scene will raise a SystemError, + if an object may have been removed since last accessing it use the :data:`invalid` attribute to check. + + KX_GameObject can be subclassed to extend functionality. For example: + + .. code-block:: python + + import bge + + class CustomGameObject(bge.types.KX_GameObject): + RATE = 0.05 + + def __init__(self, old_owner): + # "old_owner" can just be ignored. At this point, "self" is + # already the object in the scene, and "old_owner" has been + # destroyed. + + # New attributes can be defined - but we could also use a game + # property, like "self['rate']". + self.rate = CustomGameObject.RATE + + def update(self): + self.worldPosition.z += self.rate + + # switch direction + if self.worldPosition.z > 1.0: + self.rate = -CustomGameObject.RATE + elif self.worldPosition.z < 0.0: + self.rate = CustomGameObject.RATE + + # Called first + def mutate(cont): + old_object = cont.owner + mutated_object = CustomGameObject(cont.owner) + + # After calling the constructor above, references to the old object + # should not be used. + assert(old_object is not mutated_object) + assert(old_object.invalid) + assert(mutated_object is cont.owner) + + # Called later - note we are now working with the mutated object. + def update(cont): + cont.owner.update() + + When subclassing objects other than empties and meshes, the specific type + should be used - e.g. inherit from :class:`BL_ArmatureObject` when the object + to mutate is an armature. + + .. attribute:: name + + The object's name. (read-only). + + :type: string + + .. attribute:: mass + + The object's mass + + :type: float + + .. note:: + + The object must have a physics controller for the mass to be applied, otherwise the mass value will be returned as 0.0. + + .. attribute:: linVelocityMin + + Enforces the object keeps moving at a minimum velocity. + + :type: float + + .. note:: + + Applies to dynamic and rigid body objects only. + + .. note:: + + A value of 0.0 disables this option. + + .. note:: + + While objects are stationary the minimum velocity will not be applied. + + .. attribute:: linVelocityMax + + Clamp the maximum linear velocity to prevent objects moving beyond a set speed. + + :type: float + + .. note:: + + Applies to dynamic and rigid body objects only. + + .. note:: + + A value of 0.0 disables this option (rather then setting it stationary). + + .. attribute:: localInertia + + the object's inertia vector in local coordinates. Read only. + + :type: list [ix, iy, iz] + + .. attribute:: parent + + The object's parent object. (read-only). + + :type: :class:`KX_GameObject` or None + + .. attribute:: groupMembers + + Returns the list of group members if the object is a group object, otherwise None is returned. + + :type: :class:`CListValue` of :class:`KX_GameObject` or None + + .. attribute:: groupObject + + Returns the group object that the object belongs to or None if the object is not part of a group. + + :type: :class:`KX_GameObject` or None + + .. attribute:: scene + + The object's scene. (read-only). + + :type: :class:`KX_Scene` or None + + .. attribute:: visible + + visibility flag. + + :type: boolean + + .. note:: + + Game logic will still run for invisible objects. + + .. attribute:: color + + The object color of the object. [r, g, b, a] + + :type: :class:`mathutils.Vector` + + .. attribute:: occlusion + + occlusion capability flag. + + :type: boolean + + .. attribute:: position + + The object's position. [x, y, z] On write: local position, on read: world position + + .. deprecated:: use :data:`localPosition` and :data:`worldPosition`. + + :type: :class:`mathutils.Vector` + + .. attribute:: orientation + + The object's orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector. On write: local orientation, on read: world orientation + + .. deprecated:: use :data:`localOrientation` and :data:`worldOrientation`. + + :type: :class:`mathutils.Matrix` + + .. attribute:: scaling + + The object's scaling factor. [sx, sy, sz] On write: local scaling, on read: world scaling + + .. deprecated:: use :data:`localScale` and :data:`worldScale`. + + :type: :class:`mathutils.Vector` + + .. attribute:: localOrientation + + The object's local orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector. + + :type: :class:`mathutils.Matrix` + + .. attribute:: worldOrientation + + The object's world orientation. 3x3 Matrix. + + :type: :class:`mathutils.Matrix` + + .. attribute:: localScale + + The object's local scaling factor. [sx, sy, sz] + + :type: :class:`mathutils.Vector` + + .. attribute:: worldScale + + The object's world scaling factor. [sx, sy, sz] + + :type: :class:`mathutils.Vector` + + .. attribute:: localPosition + + The object's local position. [x, y, z] + + :type: :class:`mathutils.Vector` + + .. attribute:: worldPosition + + The object's world position. [x, y, z] + + :type: :class:`mathutils.Vector` + + .. attribute:: localTransform + + The object's local space transform matrix. 4x4 Matrix. + + :type: :class:`mathutils.Matrix` + + .. attribute:: worldTransform + + The object's world space transform matrix. 4x4 Matrix. + + :type: :class:`mathutils.Matrix` + + .. attribute:: localLinearVelocity + + The object's local linear velocity. [x, y, z] + + :type: :class:`mathutils.Vector` + + .. attribute:: worldLinearVelocity + + The object's world linear velocity. [x, y, z] + + :type: :class:`mathutils.Vector` + + .. attribute:: localAngularVelocity + + The object's local angular velocity. [x, y, z] + + :type: :class:`mathutils.Vector` + + .. attribute:: worldAngularVelocity + + The object's world angular velocity. [x, y, z] + + :type: :class:`mathutils.Vector` + + .. attribute:: timeOffset + + adjust the slowparent delay at runtime. + + :type: float + + .. attribute:: state + + the game object's state bitmask, using the first 30 bits, one bit must always be set. + + :type: int + + .. attribute:: meshes + + a list meshes for this object. + + :type: list of :class:`KX_MeshProxy` + + .. note:: + + Most objects use only 1 mesh. + + .. note:: + + Changes to this list will not update the KX_GameObject. + + .. attribute:: sensors + + a sequence of :class:`SCA_ISensor` objects with string/index lookups and iterator support. + + :type: list + + .. note:: + + This attribute is experemental and may be removed (but probably wont be). + + .. note:: + + Changes to this list will not update the KX_GameObject. + + .. attribute:: controllers + + a sequence of :class:`SCA_IController` objects with string/index lookups and iterator support. + + :type: list of :class:`SCA_ISensor` + + .. note:: + + This attribute is experemental and may be removed (but probably wont be). + + .. note:: + + Changes to this list will not update the KX_GameObject. + + .. attribute:: actuators + + a list of :class:`SCA_IActuator` with string/index lookups and iterator support. + + :type: list + + .. note:: + + This attribute is experemental and may be removed (but probably wont be). + + .. note:: + + Changes to this list will not update the KX_GameObject. + + .. attribute:: attrDict + + get the objects internal python attribute dictionary for direct (faster) access. + + :type: dict + + .. attribute:: children + + direct children of this object, (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject`'s + + .. attribute:: childrenRecursive + + all children of this object including childrens children, (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject`'s + + .. attribute:: life + + The number of seconds until the object ends, assumes 50fps. + (when added with an add object actuator), (read-only). + + :type: float + + .. method:: endObject() + + Delete this object, can be used in place of the EndObject Actuator. + + The actual removal of the object from the scene is delayed. + + .. method:: replaceMesh(mesh, useDisplayMesh=True, usePhysicsMesh=False) + + Replace the mesh of this object with a new mesh. This works the same was as the actuator. + + :arg mesh: mesh to replace or the meshes name. + :type mesh: :class:`MeshProxy` or string + :arg useDisplayMesh: when enabled the display mesh will be replaced (optional argument). + :type useDisplayMesh: boolean + :arg usePhysicsMesh: when enabled the physics mesh will be replaced (optional argument). + :type usePhysicsMesh: boolean + + .. method:: setVisible(visible, recursive) + + Sets the game object's visible flag. + + :arg visible: the visible state to set. + :type visible: boolean + :arg recursive: optional argument to set all childrens visibility flag too. + :type recursive: boolean + + .. method:: setOcclusion(occlusion, recursive) + + Sets the game object's occlusion capability. + + :arg occlusion: the state to set the occlusion to. + :type occlusion: boolean + :arg recursive: optional argument to set all childrens occlusion flag too. + :type recursive: boolean + + .. method:: alignAxisToVect(vect, axis=2, factor=1.0) + + Aligns any of the game object's axis along the given vector. + + + :arg vect: a vector to align the axis. + :type vect: 3D vector + :arg axis: The axis you want to align + + * 0: X axis + * 1: Y axis + * 2: Z axis + + :type axis: integer + :arg factor: Only rotate a feaction of the distance to the target vector (0.0 - 1.0) + :type factor: float + + .. method:: getAxisVect(vect) + + Returns the axis vector rotates by the objects worldspace orientation. + This is the equivalent of multiplying the vector by the orientation matrix. + + :arg vect: a vector to align the axis. + :type vect: 3D Vector + :return: The vector in relation to the objects rotation. + :rtype: 3d vector. + + .. method:: applyMovement(movement, local=False) + + Sets the game object's movement. + + :arg movement: movement vector. + :type movement: 3D Vector + :arg local: + * False: you get the "global" movement ie: relative to world orientation. + * True: you get the "local" movement ie: relative to object orientation. + :arg local: boolean + + .. method:: applyRotation(rotation, local=False) + + Sets the game object's rotation. + + :arg rotation: rotation vector. + :type rotation: 3D Vector + :arg local: + * False: you get the "global" rotation ie: relative to world orientation. + * True: you get the "local" rotation ie: relative to object orientation. + :arg local: boolean + + .. method:: applyForce(force, local=False) + + Sets the game object's force. + + This requires a dynamic object. + + :arg force: force vector. + :type force: 3D Vector + :arg local: + * False: you get the "global" force ie: relative to world orientation. + * True: you get the "local" force ie: relative to object orientation. + :type local: boolean + + .. method:: applyTorque(torque, local=False) + + Sets the game object's torque. + + This requires a dynamic object. + + :arg torque: torque vector. + :type torque: 3D Vector + :arg local: + * False: you get the "global" torque ie: relative to world orientation. + * True: you get the "local" torque ie: relative to object orientation. + :type local: boolean + + .. method:: getLinearVelocity(local=False) + + Gets the game object's linear velocity. + + This method returns the game object's velocity through it's centre of mass, ie no angular velocity component. + + :arg local: + * False: you get the "global" velocity ie: relative to world orientation. + * True: you get the "local" velocity ie: relative to object orientation. + :type local: boolean + :return: the object's linear velocity. + :rtype: list [vx, vy, vz] + + .. method:: setLinearVelocity(velocity, local=False) + + Sets the game object's linear velocity. + + This method sets game object's velocity through it's centre of mass, + ie no angular velocity component. + + This requires a dynamic object. + + :arg velocity: linear velocity vector. + :type velocity: 3D Vector + :arg local: + * False: you get the "global" velocity ie: relative to world orientation. + * True: you get the "local" velocity ie: relative to object orientation. + :type local: boolean + + .. method:: getAngularVelocity(local=False) + + Gets the game object's angular velocity. + + :arg local: + * False: you get the "global" velocity ie: relative to world orientation. + * True: you get the "local" velocity ie: relative to object orientation. + :type local: boolean + :return: the object's angular velocity. + :rtype: list [vx, vy, vz] + + .. method:: setAngularVelocity(velocity, local=False) + + Sets the game object's angular velocity. + + This requires a dynamic object. + + :arg velocity: angular velocity vector. + :type velocity: boolean + :arg local: + * False: you get the "global" velocity ie: relative to world orientation. + * True: you get the "local" velocity ie: relative to object orientation. + + .. method:: getVelocity(point=(0, 0, 0)) + + Gets the game object's velocity at the specified point. + + Gets the game object's velocity at the specified point, including angular + components. + + :arg point: optional point to return the velocity for, in local coordinates. + :type point: 3D Vector + :return: the velocity at the specified point. + :rtype: list [vx, vy, vz] + + .. method:: getReactionForce() + + Gets the game object's reaction force. + + The reaction force is the force applied to this object over the last simulation timestep. + This also includes impulses, eg from collisions. + + :return: the reaction force of this object. + :rtype: list [fx, fy, fz] + + .. note:: + + This is not implimented at the moment. + + .. method:: applyImpulse(point, impulse) + + Applies an impulse to the game object. + + This will apply the specified impulse to the game object at the specified point. + If point != position, applyImpulse will also change the object's angular momentum. + Otherwise, only linear momentum will change. + + :arg point: the point to apply the impulse to (in world coordinates) + :type point: the point to apply the impulse to (in world coordinates) + + .. method:: suspendDynamics() + + Suspends physics for this object. + + .. method:: restoreDynamics() + + Resumes physics for this object. + + .. note:: + + The objects linear velocity will be applied from when the dynamics were suspended. + + .. method:: enableRigidBody() + + Enables rigid body physics for this object. + + Rigid body physics allows the object to roll on collisions. + + .. method:: disableRigidBody() + + Disables rigid body physics for this object. + + .. method:: setParent(parent, compound=True, ghost=True) + + Sets this object's parent. + Control the shape status with the optional compound and ghost parameters: + + In that case you can control if it should be ghost or not: + + :arg parent: new parent object. + :type parent: :class:`KX_GameObject` + :arg compound: whether the shape should be added to the parent compound shape. + + * True: the object shape should be added to the parent compound shape. + * False: the object should keep its individual shape. + + :type compound: boolean + :arg ghost: whether the object should be ghost while parented. + + * True: if the object should be made ghost while parented. + * False: if the object should be solid while parented. + + :type ghost: boolean + + .. note:: + + If the object type is sensor, it stays ghost regardless of ghost parameter + + .. method:: removeParent() + + Removes this objects parent. + + .. method:: getPhysicsId() + + Returns the user data object associated with this game object's physics controller. + + .. method:: getPropertyNames() + + Gets a list of all property names. + + :return: All property names for this object. + :rtype: list + + .. method:: getDistanceTo(other) + + :arg other: a point or another :class:`KX_GameObject` to measure the distance to. + :type other: :class:`KX_GameObject` or list [x, y, z] + :return: distance to another object or point. + :rtype: float + + .. method:: getVectTo(other) + + Returns the vector and the distance to another object or point. + The vector is normalized unless the distance is 0, in which a zero length vector is returned. + + :arg other: a point or another :class:`KX_GameObject` to get the vector and distance to. + :type other: :class:`KX_GameObject` or list [x, y, z] + :return: (distance, globalVector(3), localVector(3)) + :rtype: 3-tuple (float, 3-tuple (x, y, z), 3-tuple (x, y, z)) + + .. method:: rayCastTo(other, dist, prop) + + Look towards another point/object and find first object hit within dist that matches prop. + + The ray is always casted from the center of the object, ignoring the object itself. + The ray is casted towards the center of another object or an explicit [x, y, z] point. + Use rayCast() if you need to retrieve the hit point + + :arg other: [x, y, z] or object towards which the ray is casted + :type other: :class:`KX_GameObject` or 3-tuple + :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other + :type dist: float + :arg prop: property name that object must have; can be omitted => detect any object + :type prop: string + :return: the first object hit or None if no object or object does not match prop + :rtype: :class:`KX_GameObject` + + .. method:: rayCast(objto, objfrom, dist, prop, face, xray, poly) + + Look from a point/object to another point/object and find first object hit within dist that matches prop. + if poly is 0, returns a 3-tuple with object reference, hit point and hit normal or (None, None, None) if no hit. + if poly is 1, returns a 4-tuple with in addition a :class:`KX_PolyProxy` as 4th element. + if poly is 2, returns a 5-tuple with in addition a 2D vector with the UV mapping of the hit point as 5th element. + + .. code-block:: python + + # shoot along the axis gun-gunAim (gunAim should be collision-free) + obj, point, normal = gun.rayCast(gunAim, None, 50) + if obj: + # do something + pass + + The face paremeter determines the orientation of the normal. + + * 0 => hit normal is always oriented towards the ray origin (as if you casted the ray from outside) + * 1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect) + + The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray. + The prop and xray parameters interact as follow. + + * prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray. + * prop off, xray on : idem. + * prop on, xray off: return closest hit if it matches prop, no hit otherwise. + * prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray. + + The :class:`KX_PolyProxy` 4th element of the return tuple when poly=1 allows to retrieve information on the polygon hit by the ray. + If there is no hit or the hit object is not a static mesh, None is returned as 4th element. + + The ray ignores collision-free objects and faces that dont have the collision flag enabled, you can however use ghost objects. + + :arg objto: [x, y, z] or object to which the ray is casted + :type objto: :class:`KX_GameObject` or 3-tuple + :arg objfrom: [x, y, z] or object from which the ray is casted; None or omitted => use self object center + :type objfrom: :class:`KX_GameObject` or 3-tuple or None + :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to to + :type dist: float + :arg prop: property name that object must have; can be omitted or "" => detect any object + :type prop: string + :arg face: normal option: 1=>return face normal; 0 or omitted => normal is oriented towards origin + :type face: integer + :arg xray: X-ray option: 1=>skip objects that don't match prop; 0 or omitted => stop on first object + :type xray: integer + :arg poly: polygon option: 0, 1 or 2 to return a 3-, 4- or 5-tuple with information on the face hit. + + * 0 or omitted: return value is a 3-tuple (object, hitpoint, hitnormal) or (None, None, None) if no hit + * 1: return value is a 4-tuple and the 4th element is a :class:`KX_PolyProxy` or None if no hit or the object doesn't use a mesh collision shape. + * 2: return value is a 5-tuple and the 5th element is a 2-tuple (u, v) with the UV mapping of the hit point or None if no hit, or the object doesn't use a mesh collision shape, or doesn't have a UV mapping. + + :type poly: integer + :return: (object, hitpoint, hitnormal) or (object, hitpoint, hitnormal, polygon) or (object, hitpoint, hitnormal, polygon, hituv). + + * object, hitpoint and hitnormal are None if no hit. + * polygon is valid only if the object is valid and is a static object, a dynamic object using mesh collision shape or a soft body object, otherwise it is None + * hituv is valid only if polygon is valid and the object has a UV mapping, otherwise it is None + + :rtype: + + * 3-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz)) + * or 4-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`) + * or 5-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`, 2-tuple (u, v)) + + .. note:: + + The ray ignores the object on which the method is called. It is casted from/to object center or explicit [x, y, z] points. + + .. method:: setCollisionMargin(margin) + + Set the objects collision margin. + + :arg margin: the collision margin distance in blender units. + :type margin: float + + .. note:: + + If this object has no physics controller (a physics ID of zero), this function will raise RuntimeError. + + .. method:: sendMessage(subject, body="", to="") + + Sends a message. + + :arg subject: The subject of the message + :type subject: string + :arg body: The body of the message (optional) + :type body: string + :arg to: The name of the object to send the message to (optional) + :type to: string + + .. method:: reinstancePhysicsMesh(gameObject, meshObject) + + Updates the physics system with the changed mesh. + + If no arguments are given the physics mesh will be re-created from the first mesh assigned to the game object. + + :arg gameObject: optional argument, set the physics shape from this gameObjets mesh. + :type gameObject: string, :class:`KX_GameObject` or None + :arg meshObject: optional argument, set the physics shape from this mesh. + :type meshObject: string, :class:`MeshProxy` or None + + :return: True if reinstance succeeded, False if it failed. + :rtype: boolean + + .. note:: + + If this object has instances the other instances will be updated too. + + .. note:: + + The gameObject argument has an advantage that it can convert from a mesh with modifiers applied (such as subsurf). + + .. warning:: + + Only triangle mesh type objects are supported currently (not convex hull) + + .. warning:: + + If the object is a part of a combound object it will fail (parent or child) + + .. warning:: + + Rebuilding the physics mesh can be slow, running many times per second will give a performance hit. + + .. method:: get(key, default=None) + + Return the value matching key, or the default value if its not found. + :return: The key value or a default. + + .. method:: playAction(name, start_frame, end_frame, layer=0, priority=0, blendin=0, play_mode=ACT_MODE_PLAY, layer_weight=0.0, ipo_flags=0, speed=1.0) + + Plays an action. + + :arg name: the name of the action + :type name: string + :arg start: the start frame of the action + :type start: float + :arg end: the end frame of the action + :type end: float + :arg layer: the layer the action will play in (actions in different layers are added/blended together) + :type layer: integer + :arg priority: only play this action if there isn't an action currently playing in this layer with a higher (lower number) priority + :type priority: integer + :arg blendin: the amount of blending between this animation and the previous one on this layer + :type blendin: float + :arg play_mode: the play mode + :type play_mode: one of :ref:`these constants ` + :arg layer_weight: how much of the previous layer to use for blending (0 = add) + :type layer_weight: float + :arg ipo_flags: flags for the old IPO behaviors (force, etc) + :type ipo_flags: int bitfield + :arg speed: the playback speed of the action as a factor (1.0 = normal speed, 2.0 = 2x speed, etc) + :type speed: float + + .. method:: stopAction(layer=0) + + Stop playing the action on the given layer. + + :arg layer: The layer to stop playing. + :type layer: integer + + .. method:: getActionFrame(layer=0) + + Gets the current frame of the action playing in the supplied layer. + + :arg layer: The layer that you want to get the frame from. + :type layer: integer + + :return: The current frame of the action + :rtype: float + + .. method:: setActionFrame(frame, layer=0) + + Set the current frame of the action playing in the supplied layer. + + :arg layer: The layer where you want to set the frame + :type layer: integer + :arg frame: The frame to set the action to + :type frame: float + + .. method:: isPlayingAction(layer=0) + + Checks to see if there is an action playing in the given layer. + + :arg layer: The layer to check for a playing action. + :type layer: integer + + :return: Whether or not the action is playing + :rtype: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_IpoActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_IpoActuator.rst new file mode 100644 index 00000000000..2cae4fb3b1a --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_IpoActuator.rst @@ -0,0 +1,65 @@ +KX_IpoActuator(SCA_IActuator) +============================= + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_IpoActuator(SCA_IActuator) + + IPO actuator activates an animation. + + .. attribute:: frameStart + + Start frame. + + :type: float + + .. attribute:: frameEnd + + End frame. + + :type: float + + .. attribute:: propName + + Use this property to define the Ipo position. + + :type: string + + .. attribute:: framePropName + + Assign this property this action current frame number. + + :type: string + + .. attribute:: mode + + Play mode for the ipo. Can be on of :ref:`these constants ` + + :type: integer + + .. attribute:: useIpoAsForce + + Apply Ipo as a global or local force depending on the local option (dynamic objects only). + + :type: boolean + + .. attribute:: useIpoAdd + + Ipo is added to the current loc/rot/scale in global or local coordinate according to Local flag. + + :type: boolean + + .. attribute:: useIpoLocal + + Let the ipo acts in local coordinates, used in Force and Add mode. + + :type: boolean + + .. attribute:: useChildren + + Update IPO on all children Objects as well. + + :type: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_LibLoadStatus.rst b/doc/python_api/rst/bge_types/bge.types.KX_LibLoadStatus.rst new file mode 100644 index 00000000000..a5b7aaf5dee --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_LibLoadStatus.rst @@ -0,0 +1,45 @@ +KX_LibLoadStatus(PyObjectPlus) +============================== + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: KX_LibLoadStatus(PyObjectPlus) + + An object providing information about a LibLoad() operation. + + .. code-block:: python + + # Print a message when an async LibLoad is done + import bge + + def finished_cb(status): + print("Library (%s) loaded in %.2fms." % (status.libraryName, status.timeTaken)) + + bge.logic.LibLoad('myblend.blend', 'Scene', async=True).onFinish = finished_cb + + .. attribute:: onFinish + + A callback that gets called when the lib load is done. + + :type: callable + + .. attribute:: progress + + The current progress of the lib load as a normalized value from 0.0 to 1.0. + + :type: float + + .. attribute:: libraryName + + The name of the library being loaded (the first argument to LibLoad). + + :type: string + + .. attribute:: timeTaken + + The amount of time, in seconds, the lib load took (0 until the operation is complete). + + :type: float + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_LightObject.rst b/doc/python_api/rst/bge_types/bge.types.KX_LightObject.rst new file mode 100644 index 00000000000..2b2bdf76b4f --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_LightObject.rst @@ -0,0 +1,90 @@ +KX_LightObject(KX_GameObject) +============================= + +.. module:: bge.types + +base class --- :class:`KX_GameObject` + +.. class:: KX_LightObject(KX_GameObject) + + A Light object. + + .. code-block:: python + + # Turn on a red alert light. + import bge + + co = bge.logic.getCurrentController() + light = co.owner + + light.energy = 1.0 + light.color = [1.0, 0.0, 0.0] + + .. data:: SPOT + + A spot light source. See attribute :data:`type` + + .. data:: SUN + + A point light source with no attenuation. See attribute :data:`type` + + .. data:: NORMAL + + A point light source. See attribute :data:`type` + + .. attribute:: type + + The type of light - must be SPOT, SUN or NORMAL + + .. attribute:: layer + + The layer mask that this light affects object on. + + :type: bitfield + + .. attribute:: energy + + The brightness of this light. + + :type: float + + .. attribute:: distance + + The maximum distance this light can illuminate. (SPOT and NORMAL lights only). + + :type: float + + .. attribute:: color + + The color of this light. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0]. + + :type: list [r, g, b] + + .. attribute:: lin_attenuation + + The linear component of this light's attenuation. (SPOT and NORMAL lights only). + + :type: float + + .. attribute:: quad_attenuation + + The quadratic component of this light's attenuation (SPOT and NORMAL lights only). + + :type: float + + .. attribute:: spotsize + + The cone angle of the spot light, in degrees (SPOT lights only). + + :type: float in [0 - 180]. + + .. attribute:: spotblend + + Specifies the intensity distribution of the spot light (SPOT lights only). + + :type: float in [0 - 1] + + .. note:: + + Higher values result in a more focused light source. + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_MeshProxy.rst b/doc/python_api/rst/bge_types/bge.types.KX_MeshProxy.rst new file mode 100644 index 00000000000..2ec8b8ece5c --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_MeshProxy.rst @@ -0,0 +1,134 @@ +KX_MeshProxy(SCA_IObject) +========================= + +.. module:: bge.types + +base class --- :class:`SCA_IObject` + +.. class:: KX_MeshProxy(SCA_IObject) + + A mesh object. + + You can only change the vertex properties of a mesh object, not the mesh topology. + + To use mesh objects effectively, you should know a bit about how the game engine handles them. + + #. Mesh Objects are converted from Blender at scene load. + #. The Converter groups polygons by Material. This means they can be sent to the renderer efficiently. A material holds: + + #. The texture. + #. The Blender material. + #. The Tile properties + #. The face properties - (From the "Texture Face" panel) + #. Transparency & z sorting + #. Light layer + #. Polygon shape (triangle/quad) + #. Game Object + + #. Vertices will be split by face if necessary. Vertices can only be shared between faces if: + + #. They are at the same position + #. UV coordinates are the same + #. Their normals are the same (both polygons are "Set Smooth") + #. They are the same color, for example: a cube has 24 vertices: 6 faces with 4 vertices per face. + + The correct method of iterating over every :class:`KX_VertexProxy` in a game object + + .. code-block:: python + + from bge import logic + + cont = logic.getCurrentController() + object = cont.owner + + for mesh in object.meshes: + for m_index in range(len(mesh.materials)): + for v_index in range(mesh.getVertexArrayLength(m_index)): + vertex = mesh.getVertex(m_index, v_index) + # Do something with vertex here... + # ... eg: color the vertex red. + vertex.color = [1.0, 0.0, 0.0, 1.0] + + .. attribute:: materials + + :type: list of :class:`KX_BlenderMaterial` or :class:`KX_PolygonMaterial` types + + .. attribute:: numPolygons + + :type: integer + + .. attribute:: numMaterials + + :type: integer + + .. method:: getMaterialName(matid) + + Gets the name of the specified material. + + :arg matid: the specified material. + :type matid: integer + :return: the attached material name. + :rtype: string + + .. method:: getTextureName(matid) + + Gets the name of the specified material's texture. + + :arg matid: the specified material + :type matid: integer + :return: the attached material's texture name. + :rtype: string + + .. method:: getVertexArrayLength(matid) + + Gets the length of the vertex array associated with the specified material. + + There is one vertex array for each material. + + :arg matid: the specified material + :type matid: integer + :return: the number of verticies in the vertex array. + :rtype: integer + + .. method:: getVertex(matid, index) + + Gets the specified vertex from the mesh object. + + :arg matid: the specified material + :type matid: integer + :arg index: the index into the vertex array. + :type index: integer + :return: a vertex object. + :rtype: :class:`KX_VertexProxy` + + .. method:: getPolygon(index) + + Gets the specified polygon from the mesh. + + :arg index: polygon number + :type index: integer + :return: a polygon object. + :rtype: :class:`PolyProxy` + + .. method:: transform(matid, matrix) + + Transforms the vertices of a mesh. + + :arg matid: material index, -1 transforms all. + :type matid: integer + :arg matrix: transformation matrix. + :type matrix: 4x4 matrix [[float]] + + .. method:: transformUV(matid, matrix, uv_index=-1, uv_index_from=-1) + + Transforms the vertices UV's of a mesh. + + :arg matid: material index, -1 transforms all. + :type matid: integer + :arg matrix: transformation matrix. + :type matrix: 4x4 matrix [[float]] + :arg uv_index: optional uv index, -1 for all, otherwise 0 or 1. + :type uv_index: integer + :arg uv_index_from: optional uv index to copy from, -1 to transform the current uv. + :type uv_index_from: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_MouseFocusSensor.rst b/doc/python_api/rst/bge_types/bge.types.KX_MouseFocusSensor.rst new file mode 100644 index 00000000000..dda73eadb52 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_MouseFocusSensor.rst @@ -0,0 +1,66 @@ +KX_MouseFocusSensor(SCA_MouseSensor) +==================================== + +.. module:: bge.types + +base class --- :class:`SCA_MouseSensor` + +.. class:: KX_MouseFocusSensor(SCA_MouseSensor) + + The mouse focus sensor detects when the mouse is over the current game object. + + The mouse focus sensor works by transforming the mouse coordinates from 2d device + space to 3d space then raycasting away from the camera. + + .. attribute:: raySource + + The worldspace source of the ray (the view position). + + :type: list (vector of 3 floats) + + .. attribute:: rayTarget + + The worldspace target of the ray. + + :type: list (vector of 3 floats) + + .. attribute:: rayDirection + + The :data:`rayTarget` - :class:`raySource` normalized. + + :type: list (normalized vector of 3 floats) + + .. attribute:: hitObject + + the last object the mouse was over. + + :type: :class:`KX_GameObject` or None + + .. attribute:: hitPosition + + The worldspace position of the ray intersecton. + + :type: list (vector of 3 floats) + + .. attribute:: hitNormal + + the worldspace normal from the face at point of intersection. + + :type: list (normalized vector of 3 floats) + + .. attribute:: hitUV + + the UV coordinates at the point of intersection. + + :type: list (vector of 2 floats) + + If the object has no UV mapping, it returns [0, 0]. + + The UV coordinates are not normalized, they can be < 0 or > 1 depending on the UV mapping. + + .. attribute:: usePulseFocus + + When enabled, moving the mouse over a different object generates a pulse. (only used when the 'Mouse Over Any' sensor option is set). + + :type: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_NavMeshObject.rst b/doc/python_api/rst/bge_types/bge.types.KX_NavMeshObject.rst new file mode 100644 index 00000000000..5c73d0aa1d3 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_NavMeshObject.rst @@ -0,0 +1,47 @@ +KX_NavMeshObject(KX_GameObject) +=============================== + +.. module:: bge.types + +base class --- :class:`KX_GameObject` + +.. class:: KX_NavMeshObject(KX_GameObject) + + Python interface for using and controlling navigation meshes. + + .. method:: findPath(start, goal) + + Finds the path from start to goal points. + + :arg start: the start point + :arg start: 3D Vector + :arg goal: the goal point + :arg start: 3D Vector + :return: a path as a list of points + :rtype: list of points + + .. method:: raycast(start, goal) + + Raycast from start to goal points. + + :arg start: the start point + :arg start: 3D Vector + :arg goal: the goal point + :arg start: 3D Vector + :return: the hit factor + :rtype: float + + .. method:: draw(mode) + + Draws a debug mesh for the navigation mesh. + + :arg mode: the drawing mode (one of :ref:`these constants `) + :arg mode: integer + :return: None + + .. method:: rebuild() + + Rebuild the navigation mesh. + + :return: None + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_NearSensor.rst b/doc/python_api/rst/bge_types/bge.types.KX_NearSensor.rst new file mode 100644 index 00000000000..995e645b979 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_NearSensor.rst @@ -0,0 +1,23 @@ +KX_NearSensor(KX_TouchSensor) +============================= + +.. module:: bge.types + +base class --- :class:`KX_TouchSensor` + +.. class:: KX_NearSensor(KX_TouchSensor) + + A near sensor is a specialised form of touch sensor. + + .. attribute:: distance + + The near sensor activates when an object is within this distance. + + :type: float + + .. attribute:: resetDistance + + The near sensor deactivates when the object exceeds this distance. + + :type: float + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_NetworkMessageActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_NetworkMessageActuator.rst new file mode 100644 index 00000000000..b8dcd01fe43 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_NetworkMessageActuator.rst @@ -0,0 +1,35 @@ +KX_NetworkMessageActuator(SCA_IActuator) +======================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_NetworkMessageActuator(SCA_IActuator) + + Message Actuator + + .. attribute:: propName + + Messages will only be sent to objects with the given property name. + + :type: string + + .. attribute:: subject + + The subject field of the message. + + :type: string + + .. attribute:: body + + The body of the message. + + :type: string + + .. attribute:: usePropBody + + Send a property instead of a regular body message. + + :type: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_NetworkMessageSensor.rst b/doc/python_api/rst/bge_types/bge.types.KX_NetworkMessageSensor.rst new file mode 100644 index 00000000000..a6b1082a4fe --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_NetworkMessageSensor.rst @@ -0,0 +1,38 @@ +KX_NetworkMessageSensor(SCA_ISensor) +==================================== + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: KX_NetworkMessageSensor(SCA_ISensor) + + The Message Sensor logic brick. + + Currently only loopback (local) networks are supported. + + .. attribute:: subject + + The subject the sensor is looking for. + + :type: string + + .. attribute:: frameMessageCount + + The number of messages received since the last frame. (read-only). + + :type: integer + + .. attribute:: subjects + + The list of message subjects received. (read-only). + + :type: list of strings + + .. attribute:: bodies + + The list of message bodies received. (read-only). + + :type: list of strings + + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_ObjectActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_ObjectActuator.rst new file mode 100644 index 00000000000..f10f101a4cc --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_ObjectActuator.rst @@ -0,0 +1,129 @@ +KX_ObjectActuator(SCA_IActuator) +================================ + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_ObjectActuator(SCA_IActuator) + + The object actuator ("Motion Actuator") applies force, torque, displacement, angular displacement, + velocity, or angular velocity to an object. + Servo control allows to regulate force to achieve a certain speed target. + + .. attribute:: force + + The force applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalForce + + A flag specifying if the force is local. + + :type: boolean + + .. attribute:: torque + + The torque applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalTorque + + A flag specifying if the torque is local. + + :type: boolean + + .. attribute:: dLoc + + The displacement vector applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalDLoc + + A flag specifying if the dLoc is local. + + :type: boolean + + .. attribute:: dRot + + The angular displacement vector applied by the actuator + + :type: list [x, y, z] + + .. note:: + + Since the displacement is applied every frame, you must adjust the displacement based on the frame rate, or you game experience will depend on the player's computer speed. + + .. attribute:: useLocalDRot + + A flag specifying if the dRot is local. + + :type: boolean + + .. attribute:: linV + + The linear velocity applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalLinV + + A flag specifying if the linear velocity is local. + + :type: boolean + + .. note:: + + This is the target speed for servo controllers. + + .. attribute:: angV + + The angular velocity applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalAngV + + A flag specifying if the angular velocity is local. + + :type: boolean + + .. attribute:: damping + + The damping parameter of the servo controller. + + :type: short + + .. attribute:: forceLimitX + + The min/max force limit along the X axis and activates or deactivates the limits in the servo controller. + + :type: list [min(float), max(float), bool] + + .. attribute:: forceLimitY + + The min/max force limit along the Y axis and activates or deactivates the limits in the servo controller. + + :type: list [min(float), max(float), bool] + + .. attribute:: forceLimitZ + + The min/max force limit along the Z axis and activates or deactivates the limits in the servo controller. + + :type: list [min(float), max(float), bool] + + .. attribute:: pid + + The PID coefficients of the servo controller. + + :type: list of floats [proportional, integral, derivate] + + .. attribute:: reference + + The object that is used as reference to compute the velocity for the servo controller. + + :type: :class:`KX_GameObject` or None + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_ParentActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_ParentActuator.rst new file mode 100644 index 00000000000..77dcb907d6a --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_ParentActuator.rst @@ -0,0 +1,38 @@ +KX_ParentActuator(SCA_IActuator) +================================ + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_ParentActuator(SCA_IActuator) + + The parent actuator can set or remove an objects parent object. + + .. attribute:: object + + the object this actuator sets the parent too. + + :type: :class:`KX_GameObject` or None + + .. attribute:: mode + + The mode of this actuator. + + :type: integer from 0 to 1. + + .. attribute:: compound + + Whether the object shape should be added to the parent compound shape when parenting. + + Effective only if the parent is already a compound shape. + + :type: boolean + + .. attribute:: ghost + + Whether the object should be made ghost when parenting + Effective only if the shape is not added to the parent compound shape. + + :type: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_PolyProxy.rst b/doc/python_api/rst/bge_types/bge.types.KX_PolyProxy.rst new file mode 100644 index 00000000000..534f6deedc0 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_PolyProxy.rst @@ -0,0 +1,139 @@ +KX_PolyProxy(SCA_IObject) +========================= + +.. module:: bge.types + +base class --- :class:`SCA_IObject` + +.. class:: KX_PolyProxy(SCA_IObject) + + A polygon holds the index of the vertex forming the poylgon. + + Note: + The polygon attributes are read-only, you need to retrieve the vertex proxy if you want + to change the vertex settings. + + .. attribute:: material_name + + The name of polygon material, empty if no material. + + :type: string + + .. attribute:: material + + The material of the polygon. + + :type: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial` + + .. attribute:: texture_name + + The texture name of the polygon. + + :type: string + + .. attribute:: material_id + + The material index of the polygon, use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: v1 + + vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: v2 + + vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: v3 + + vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: v4 + + Vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex + Use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: visible + + visible state of the polygon: 1=visible, 0=invisible. + + :type: integer + + .. attribute:: collide + + collide state of the polygon: 1=receives collision, 0=collision free. + + :type: integer + + .. method:: getMaterialName() + + Returns the polygon material name with MA prefix + + :return: material name + :rtype: string + + .. method:: getMaterial() + + :return: The polygon material + :rtype: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial` + + .. method:: getTextureName() + + :return: The texture name + :rtype: string + + .. method:: getMaterialIndex() + + Returns the material bucket index of the polygon. + This index and the ones returned by getVertexIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`. + + :return: the material index in the mesh + :rtype: integer + + .. method:: getNumVertex() + + Returns the number of vertex of the polygon. + + :return: number of vertex, 3 or 4. + :rtype: integer + + .. method:: isVisible() + + Returns whether the polygon is visible or not + + :return: 0=invisible, 1=visible + :rtype: boolean + + .. method:: isCollider() + + Returns whether the polygon is receives collision or not + + :return: 0=collision free, 1=receives collision + :rtype: integer + + .. method:: getVertexIndex(vertex) + + Returns the mesh vertex index of a polygon vertex + This index and the one returned by getMaterialIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`. + + :arg vertex: index of the vertex in the polygon: 0->3 + :arg vertex: integer + :return: mesh vertex index + :rtype: integer + + .. method:: getMesh() + + Returns a mesh proxy + + :return: mesh proxy + :rtype: :class:`MeshProxy` + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_PolygonMaterial.rst b/doc/python_api/rst/bge_types/bge.types.KX_PolygonMaterial.rst new file mode 100644 index 00000000000..3421e194d77 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_PolygonMaterial.rst @@ -0,0 +1,250 @@ +KX_PolygonMaterial(PyObjectPlus) +================================ + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: KX_PolygonMaterial(PyObjectPlus) + + This is the interface to materials in the game engine. + + Materials define the render state to be applied to mesh objects. + + .. warning:: + + Some of the methods/variables are CObjects. If you mix these up, you will crash blender. + + .. code-block:: python + + from bge import logic + + vertex_shader = """ + + void main(void) + { + // original vertex position, no changes + gl_Position = ftransform(); + // coordinate of the 1st texture channel + gl_TexCoord[0] = gl_MultiTexCoord0; + // coordinate of the 2nd texture channel + gl_TexCoord[1] = gl_MultiTexCoord1; + } + """ + + fragment_shader =""" + + uniform sampler2D color_0; + uniform sampler2D color_1; + uniform float factor; + + void main(void) + { + vec4 color_0 = texture2D(color_0, gl_TexCoord[0].st); + vec4 color_1 = texture2D(color_1, gl_TexCoord[1].st); + gl_FragColor = mix(color_0, color_1, factor); + } + """ + + object = logic.getCurrentController().owner + object = cont.owner + for mesh in object.meshes: + for material in mesh.materials: + shader = material.getShader() + if shader != None: + if not shader.isValid(): + shader.setSource(vertex_shader, fragment_shader, True) + + # get the first texture channel of the material + shader.setSampler('color_0', 0) + # get the second texture channel of the material + shader.setSampler('color_1', 1) + # pass another uniform to the shader + shader.setUniform1f('factor', 0.3) + + + .. attribute:: texture + + Texture name. + + :type: string (read-only) + + .. attribute:: gl_texture + + OpenGL texture handle (eg for glBindTexture(GL_TEXTURE_2D, gl_texture). + + :type: integer (read-only) + + .. attribute:: material + + Material name. + + :type: string (read-only) + + .. attribute:: tface + + Texture face properties. + + :type: CObject (read-only) + + .. attribute:: tile + + Texture is tiling. + + :type: boolean + + .. attribute:: tilexrep + + Number of tile repetitions in x direction. + + :type: integer + + .. attribute:: tileyrep + + Number of tile repetitions in y direction. + + :type: integer + + .. attribute:: drawingmode + + Drawing mode for the material. + - 2 (drawingmode & 4) Textured + - 4 (drawingmode & 16) Light + - 14 (drawingmode & 16384) 3d Polygon Text. + + :type: bitfield + + .. attribute:: transparent + + This material is transparent. All meshes with this + material will be rendered after non transparent meshes from back + to front. + + :type: boolean + + .. attribute:: zsort + + Transparent polygons in meshes with this material will be sorted back to + front before rendering. + Non-Transparent polygons will be sorted front to back before rendering. + + :type: boolean + + .. attribute:: diffuse + + The diffuse color of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0]. + + :type: list [r, g, b] + + .. attribute:: specular + + The specular color of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0]. + + :type: list [r, g, b] + + .. attribute:: shininess + + The shininess (specular exponent) of the material. 0.0 <= shininess <= 128.0. + + :type: float + + .. attribute:: specularity + + The amount of specular of the material. 0.0 <= specularity <= 1.0. + + :type: float + + .. method:: updateTexture(tface, rasty) + + Updates a realtime animation. + + :arg tface: Texture face (eg mat.tface) + :type tface: CObject + :arg rasty: Rasterizer + :type rasty: CObject + + .. method:: setTexture(tface) + + Sets texture render state. + + :arg tface: Texture face + :type tface: CObject + + .. code-block:: python + + mat.setTexture(mat.tface) + + .. method:: activate(rasty, cachingInfo) + + Sets material parameters for this object for rendering. + + Material Parameters set: + + #. Texture + #. Backface culling + #. Line drawing + #. Specular Colour + #. Shininess + #. Diffuse Colour + #. Polygon Offset. + + :arg rasty: Rasterizer instance. + :type rasty: CObject + :arg cachingInfo: Material cache instance. + :type cachingInfo: CObject + + .. method:: setCustomMaterial(material) + + Sets the material state setup object. + + Using this method, you can extend or completely replace the gameengine material + to do your own advanced multipass effects. + + Use this method to register your material class. Instead of the normal material, + your class's activate method will be called just before rendering the mesh. + This should setup the texture, material, and any other state you would like. + It should return True to render the mesh, or False if you are finished. You should + clean up any state Blender does not set before returning False. + + Activate Method Definition: + + .. code-block:: python + + def activate(self, rasty, cachingInfo, material): + + :arg material: The material object. + :type material: instance + + .. code-block:: python + + class PyMaterial: + def __init__(self): + self.pass_no = -1 + + def activate(self, rasty, cachingInfo, material): + # Activate the material here. + # + # The activate method will be called until it returns False. + # Every time the activate method returns True the mesh will + # be rendered. + # + # rasty is a CObject for passing to material.updateTexture() + # and material.activate() + # cachingInfo is a CObject for passing to material.activate() + # material is the KX_PolygonMaterial instance this material + # was added to + + # default material properties: + self.pass_no += 1 + if self.pass_no == 0: + material.activate(rasty, cachingInfo) + # Return True to do this pass + return True + + # clean up and return False to finish. + self.pass_no = -1 + return False + + # Create a new Python Material and pass it to the renderer. + mat.setCustomMaterial(PyMaterial()) + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_RadarSensor.rst b/doc/python_api/rst/bge_types/bge.types.KX_RadarSensor.rst new file mode 100644 index 00000000000..4274c1142f4 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_RadarSensor.rst @@ -0,0 +1,44 @@ +KX_RadarSensor(KX_NearSensor) +============================= + +.. module:: bge.types + +base class --- :class:`KX_NearSensor` + +.. class:: KX_RadarSensor(KX_NearSensor) + + Radar sensor is a near sensor with a conical sensor object. + + .. attribute:: coneOrigin + + The origin of the cone with which to test. The origin is in the middle of the cone. (read-only). + + :type: list of floats [x, y, z] + + .. attribute:: coneTarget + + The center of the bottom face of the cone with which to test. (read-only). + + :type: list of floats [x, y, z] + + .. attribute:: distance + + The height of the cone with which to test. + + :type: float + + .. attribute:: angle + + The angle of the cone (in degrees) with which to test. + + :type: float + + .. attribute:: axis + + The axis on which the radar cone is cast. + + :type: integer from 0 to 5 + + KX_RADAR_AXIS_POS_X, KX_RADAR_AXIS_POS_Y, KX_RADAR_AXIS_POS_Z, + KX_RADAR_AXIS_NEG_X, KX_RADAR_AXIS_NEG_Y, KX_RADAR_AXIS_NEG_Z + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_RaySensor.rst b/doc/python_api/rst/bge_types/bge.types.KX_RaySensor.rst new file mode 100644 index 00000000000..2ff989729f5 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_RaySensor.rst @@ -0,0 +1,72 @@ +KX_RaySensor(SCA_ISensor) +========================= + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: KX_RaySensor(SCA_ISensor) + + A ray sensor detects the first object in a given direction. + + .. attribute:: propName + + The property the ray is looking for. + + :type: string + + .. attribute:: range + + The distance of the ray. + + :type: float + + .. attribute:: useMaterial + + Whether or not to look for a material (false = property). + + :type: boolean + + .. attribute:: useXRay + + Whether or not to use XRay. + + :type: boolean + + .. attribute:: hitObject + + The game object that was hit by the ray. (read-only). + + :type: :class:`KX_GameObject` + + .. attribute:: hitPosition + + The position (in worldcoordinates) where the object was hit by the ray. (read-only). + + :type: list [x, y, z] + + .. attribute:: hitNormal + + The normal (in worldcoordinates) of the object at the location where the object was hit by the ray. (read-only). + + :type: list [x, y, z] + + .. attribute:: rayDirection + + The direction from the ray (in worldcoordinates). (read-only). + + :type: list [x, y, z] + + .. attribute:: axis + + The axis the ray is pointing on. + + :type: integer from 0 to 5 + + * KX_RAY_AXIS_POS_X + * KX_RAY_AXIS_POS_Y + * KX_RAY_AXIS_POS_Z + * KX_RAY_AXIS_NEG_X + * KX_RAY_AXIS_NEG_Y + * KX_RAY_AXIS_NEG_Z + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_SCA_AddObjectActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_SCA_AddObjectActuator.rst new file mode 100644 index 00000000000..fecc863909d --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_SCA_AddObjectActuator.rst @@ -0,0 +1,55 @@ +KX_SCA_AddObjectActuator(SCA_IActuator) +======================================= + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_SCA_AddObjectActuator(SCA_IActuator) + + Edit Object Actuator (in Add Object Mode) + + .. warning:: + + An Add Object actuator will be ignored if at game start, the linked object doesn't exist (or is empty) or the linked object is in an active layer. + + .. code-block:: none + + Error: GameObject 'Name' has a AddObjectActuator 'ActuatorName' without object (in 'nonactive' layer) + + .. attribute:: object + + the object this actuator adds. + + :type: :class:`KX_GameObject` or None + + .. attribute:: objectLastCreated + + the last added object from this actuator (read-only). + + :type: :class:`KX_GameObject` or None + + .. attribute:: time + + the lifetime of added objects, in frames. Set to 0 to disable automatic deletion. + + :type: integer + + .. attribute:: linearVelocity + + the initial linear velocity of added objects. + + :type: list [vx, vy, vz] + + .. attribute:: angularVelocity + + the initial angular velocity of added objects. + + :type: list [vx, vy, vz] + + .. method:: instantAddObject() + + adds the object without needing to calling SCA_PythonController.activate() + + .. note:: Use objectLastCreated to get the newly created object. + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_SCA_DynamicActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_SCA_DynamicActuator.rst new file mode 100644 index 00000000000..055c4098253 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_SCA_DynamicActuator.rst @@ -0,0 +1,29 @@ +KX_SCA_DynamicActuator(SCA_IActuator) +===================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_SCA_DynamicActuator(SCA_IActuator) + + Dynamic Actuator. + + .. attribute:: mode + + :type: integer + + the type of operation of the actuator, 0-4 + + * KX_DYN_RESTORE_DYNAMICS(0) + * KX_DYN_DISABLE_DYNAMICS(1) + * KX_DYN_ENABLE_RIGID_BODY(2) + * KX_DYN_DISABLE_RIGID_BODY(3) + * KX_DYN_SET_MASS(4) + + .. attribute:: mass + + the mass value for the KX_DYN_SET_MASS operation. + + :type: float + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_SCA_EndObjectActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_SCA_EndObjectActuator.rst new file mode 100644 index 00000000000..8d9221febb0 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_SCA_EndObjectActuator.rst @@ -0,0 +1,13 @@ +KX_SCA_EndObjectActuator(SCA_IActuator) +======================================= + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_SCA_EndObjectActuator(SCA_IActuator) + + Edit Object Actuator (in End Object mode) + + This actuator has no python methods. + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_SCA_ReplaceMeshActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_SCA_ReplaceMeshActuator.rst new file mode 100644 index 00000000000..137c63ea829 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_SCA_ReplaceMeshActuator.rst @@ -0,0 +1,89 @@ +KX_SCA_ReplaceMeshActuator(SCA_IActuator) +========================================= + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_SCA_ReplaceMeshActuator(SCA_IActuator) + + Edit Object actuator, in Replace Mesh mode. + + .. warning:: + + Replace mesh actuators will be ignored if at game start, the named mesh doesn't exist. + + This will generate a warning in the console + + .. code-block:: none + + Error: GameObject 'Name' ReplaceMeshActuator 'ActuatorName' without object + + .. code-block:: python + + # Level-of-detail + # Switch a game object's mesh based on its depth in the camera view. + # +----------+ +-----------+ +-------------------------------------+ + # | Always +-----+ Python +-----+ Edit Object (Replace Mesh) LOD.Mesh | + # +----------+ +-----------+ +-------------------------------------+ + from bge import logic + + # List detail meshes here + # Mesh (name, near, far) + # Meshes overlap so that they don't 'pop' when on the edge of the distance. + meshes = ((".Hi", 0.0, -20.0), + (".Med", -15.0, -50.0), + (".Lo", -40.0, -100.0) + ) + + cont = logic.getCurrentController() + object = cont.owner + actuator = cont.actuators["LOD." + obj.name] + camera = logic.getCurrentScene().active_camera + + def Depth(pos, plane): + return pos[0]*plane[0] + pos[1]*plane[1] + pos[2]*plane[2] + plane[3] + + # Depth is negative and decreasing further from the camera + depth = Depth(object.position, camera.world_to_camera[2]) + + newmesh = None + curmesh = None + # Find the lowest detail mesh for depth + for mesh in meshes: + if depth < mesh[1] and depth > mesh[2]: + newmesh = mesh + if "ME" + object.name + mesh[0] == actuator.getMesh(): + curmesh = mesh + + if newmesh != None and "ME" + object.name + newmesh[0] != actuator.mesh: + # The mesh is a different mesh - switch it. + # Check the current mesh is not a better fit. + if curmesh == None or curmesh[1] < depth or curmesh[2] > depth: + actuator.mesh = object.name + newmesh[0] + cont.activate(actuator) + + .. attribute:: mesh + + :class:`MeshProxy` or the name of the mesh that will replace the current one. + + Set to None to disable actuator. + + :type: :class:`MeshProxy` or None if no mesh is set + + .. attribute:: useDisplayMesh + + when true the displayed mesh is replaced. + + :type: boolean + + .. attribute:: usePhysicsMesh + + when true the physics mesh is replaced. + + :type: boolean + + .. method:: instantReplaceMesh() + + Immediately replace mesh without delay. + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_Scene.rst b/doc/python_api/rst/bge_types/bge.types.KX_Scene.rst new file mode 100644 index 00000000000..75630ae4d26 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_Scene.rst @@ -0,0 +1,172 @@ +KX_Scene(PyObjectPlus) +====================== + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: KX_Scene(PyObjectPlus) + + An active scene that gives access to objects, cameras, lights and scene attributes. + + The activity culling stuff is supposed to disable logic bricks when their owner gets too far + from the active camera. It was taken from some code lurking at the back of KX_Scene - who knows + what it does! + + .. code-block:: python + + from bge import logic + + # get the scene + scene = logic.getCurrentScene() + + # print all the objects in the scene + for object in scene.objects: + print(object.name) + + # get an object named 'Cube' + object = scene.objects["Cube"] + + # get the first object in the scene. + object = scene.objects[0] + + .. code-block:: python + + # Get the depth of an object in the camera view. + from bge import logic + + object = logic.getCurrentController().owner + cam = logic.getCurrentScene().active_camera + + # Depth is negative and decreasing further from the camera + depth = object.position[0]*cam.world_to_camera[2][0] + object.position[1]*cam.world_to_camera[2][1] + object.position[2]*cam.world_to_camera[2][2] + cam.world_to_camera[2][3] + + @bug: All attributes are read only at the moment. + + .. attribute:: name + + The scene's name, (read-only). + + :type: string + + .. attribute:: objects + + A list of objects in the scene, (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject` + + .. attribute:: objectsInactive + + A list of objects on background layers (used for the addObject actuator), (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject` + + .. attribute:: lights + + A list of lights in the scene, (read-only). + + :type: :class:`CListValue` of :class:`KX_LightObject` + + .. attribute:: cameras + + A list of cameras in the scene, (read-only). + + :type: :class:`CListValue` of :class:`KX_Camera` + + .. attribute:: active_camera + + The current active camera. + + :type: :class:`KX_Camera` + + .. note:: + + This can be set directly from python to avoid using the :class:`KX_SceneActuator`. + + .. attribute:: suspended + + True if the scene is suspended, (read-only). + + :type: boolean + + .. attribute:: activity_culling + + True if the scene is activity culling. + + :type: boolean + + .. attribute:: activity_culling_radius + + The distance outside which to do activity culling. Measured in manhattan distance. + + :type: float + + .. attribute:: dbvt_culling + + True when Dynamic Bounding box Volume Tree is set (read-only). + + :type: boolean + + .. attribute:: pre_draw + + A list of callables to be run before the render step. + + :type: list + + .. attribute:: post_draw + + A list of callables to be run after the render step. + + :type: list + + .. attribute:: gravity + + The scene gravity using the world x, y and z axis. + + :type: list [fx, fy, fz] + + .. method:: addObject(object, other, time=0) + + Adds an object to the scene like the Add Object Actuator would. + + :arg object: The object to add + :type object: :class:`KX_GameObject` or string + :arg other: The object's center to use when adding the object + :type other: :class:`KX_GameObject` or string + :arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever. + :type time: integer + :return: The newly added object. + :rtype: :class:`KX_GameObject` + + .. method:: end() + + Removes the scene from the game. + + .. method:: restart() + + Restarts the scene. + + .. method:: replace(scene) + + Replaces this scene with another one. + + :arg scene: The name of the scene to replace this scene with. + :type scene: string + + .. method:: suspend() + + Suspends this scene. + + .. method:: resume() + + Resume this scene. + + .. method:: get(key, default=None) + + Return the value matching key, or the default value if its not found. + :return: The key value or a default. + + .. method:: drawObstacleSimulation() + + Draw debug visualization of obstacle simulation. + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_SceneActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_SceneActuator.rst new file mode 100644 index 00000000000..9d073ff5b19 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_SceneActuator.rst @@ -0,0 +1,49 @@ +KX_SceneActuator(SCA_IActuator) +=============================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_SceneActuator(SCA_IActuator) + + Scene Actuator logic brick. + + .. warning:: + + Scene actuators that use a scene name will be ignored if at game start, the named scene doesn't exist or is empty + + This will generate a warning in the console: + + .. code-block:: none + + Error: GameObject 'Name' has a SceneActuator 'ActuatorName' (SetScene) without scene + + .. attribute:: scene + + the name of the scene to change to/overlay/underlay/remove/suspend/resume. + + :type: string + + .. attribute:: camera + + the camera to change to. + + :type: :class:`KX_Camera` on read, string or :class:`KX_Camera` on write + + .. note:: + + When setting the attribute, you can use either a :class:`KX_Camera` or the name of the camera. + + .. attribute:: useRestart + + Set flag to True to restart the sene. + + :type: boolean + + .. attribute:: mode + + The mode of the actuator. + + :type: integer from 0 to 5. + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_SoundActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_SoundActuator.rst new file mode 100644 index 00000000000..aa85bd663b8 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_SoundActuator.rst @@ -0,0 +1,115 @@ +KX_SoundActuator(SCA_IActuator) +=============================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_SoundActuator(SCA_IActuator) + + Sound Actuator. + + The :data:`startSound`, :data:`pauseSound` and :data:`stopSound` do not require the actuator to be activated - they act instantly provided that the actuator has been activated once at least. + + .. attribute:: volume + + The volume (gain) of the sound. + + :type: float + + .. attribute:: time + + The current position in the audio stream (in seconds). + + :type: float + + .. attribute:: pitch + + The pitch of the sound. + + :type: float + + .. attribute:: mode + + The operation mode of the actuator. Can be one of :ref:`these constants` + + :type: integer + + .. attribute:: sound + + The sound the actuator should play. + + :type: Audaspace factory + + .. attribute:: is3D + + Whether or not the actuator should be using 3D sound. (read-only) + + :type: boolean + + .. attribute:: volume_maximum + + The maximum gain of the sound, no matter how near it is. + + :type: float + + .. attribute:: volume_minimum + + The minimum gain of the sound, no matter how far it is away. + + :type: float + + .. attribute:: distance_reference + + The distance where the sound has a gain of 1.0. + + :type: float + + .. attribute:: distance_maximum + + The maximum distance at which you can hear the sound. + + :type: float + + .. attribute:: attenuation + + The influence factor on volume depending on distance. + + :type: float + + .. attribute:: cone_angle_inner + + The angle of the inner cone. + + :type: float + + .. attribute:: cone_angle_outer + + The angle of the outer cone. + + :type: float + + .. attribute:: cone_volume_outer + + The gain outside the outer cone (the gain in the outer cone will be interpolated between this value and the normal gain in the inner cone). + + :type: float + + .. method:: startSound() + + Starts the sound. + + :return: None + + .. method:: pauseSound() + + Pauses the sound. + + :return: None + + .. method:: stopSound() + + Stops the sound. + + :return: None + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_StateActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_StateActuator.rst new file mode 100644 index 00000000000..c9d08457cc6 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_StateActuator.rst @@ -0,0 +1,29 @@ +KX_StateActuator(SCA_IActuator) +=============================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_StateActuator(SCA_IActuator) + + State actuator changes the state mask of parent object. + + .. attribute:: operation + + Type of bit operation to be applied on object state mask. + + You can use one of :ref:`these constants ` + + :type: integer + + .. attribute:: mask + + Value that defines the bits that will be modified by the operation. + + The bits that are 1 in the mask will be updated in the object state. + + The bits that are 0 are will be left unmodified expect for the Copy operation which copies the mask to the object state. + + :type: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_SteeringActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_SteeringActuator.rst new file mode 100644 index 00000000000..f0ce248f069 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_SteeringActuator.rst @@ -0,0 +1,71 @@ +KX_SteeringActuator(SCA_IActuator) +================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_SteeringActuator(SCA_IActuator) + + Steering Actuator for navigation. + + .. attribute:: behavior + + The steering behavior to use. + + :type: one of :ref:`these constants ` + + .. attribute:: velocity + + Velocity magnitude + + :type: float + + .. attribute:: acceleration + + Max acceleration + + :type: float + + .. attribute:: turnspeed + + Max turn speed + + :type: float + + .. attribute:: distance + + Relax distance + + :type: float + + .. attribute:: target + + Target object + + :type: :class:`KX_GameObject` + + .. attribute:: navmesh + + Navigation mesh + + :type: :class:`KX_GameObject` + + .. attribute:: selfterminated + + Terminate when target is reached + + :type: boolean + + .. attribute:: enableVisualization + + Enable debug visualization + + :type: boolean + + .. attribute:: pathUpdatePeriod + + Path update period + + :type: int + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_TouchSensor.rst b/doc/python_api/rst/bge_types/bge.types.KX_TouchSensor.rst new file mode 100644 index 00000000000..fd8f319f6f3 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_TouchSensor.rst @@ -0,0 +1,41 @@ +KX_TouchSensor(SCA_ISensor) +=========================== + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: KX_TouchSensor(SCA_ISensor) + + Touch sensor detects collisions between objects. + + .. attribute:: propName + + The property or material to collide with. + + :type: string + + .. attribute:: useMaterial + + Determines if the sensor is looking for a property or material. KX_True = Find material; KX_False = Find property. + + :type: boolean + + .. attribute:: usePulseCollision + + When enabled, changes to the set of colliding objects generate a pulse. + + :type: boolean + + .. attribute:: hitObject + + The last collided object. (read-only). + + :type: :class:`KX_GameObject` or None + + .. attribute:: hitObjectList + + A list of colliding objects. (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject` + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_TrackToActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_TrackToActuator.rst new file mode 100644 index 00000000000..070243c6a05 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_TrackToActuator.rst @@ -0,0 +1,39 @@ +KX_TrackToActuator(SCA_IActuator) +================================= + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_TrackToActuator(SCA_IActuator) + + Edit Object actuator in Track To mode. + + .. warning:: + + Track To Actuators will be ignored if at game start, the object to track to is invalid. + + This will generate a warning in the console: + + .. code-block:: none + + GameObject 'Name' no object in EditObjectActuator 'ActuatorName' + + .. attribute:: object + + the object this actuator tracks. + + :type: :class:`KX_GameObject` or None + + .. attribute:: time + + the time in frames with which to delay the tracking motion. + + :type: integer + + .. attribute:: use3D + + the tracking motion to use 3D. + + :type: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_VehicleWrapper.rst b/doc/python_api/rst/bge_types/bge.types.KX_VehicleWrapper.rst new file mode 100644 index 00000000000..9340d33f8a9 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_VehicleWrapper.rst @@ -0,0 +1,161 @@ +KX_VehicleWrapper(PyObjectPlus) +=============================== + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: KX_VehicleWrapper(PyObjectPlus) + + KX_VehicleWrapper + + TODO - description + + .. method:: addWheel(wheel, attachPos, attachDir, axleDir, suspensionRestLength, wheelRadius, hasSteering) + + Add a wheel to the vehicle + + :arg wheel: The object to use as a wheel. + :type wheel: :class:`KX_GameObject` or a KX_GameObject name + :arg attachPos: The position that this wheel will attach to. + :type attachPos: vector of 3 floats + :arg attachDir: The direction this wheel points. + :type attachDir: vector of 3 floats + :arg axleDir: The direction of this wheels axle. + :type axleDir: vector of 3 floats + :arg suspensionRestLength: TODO - Description + :type suspensionRestLength: float + :arg wheelRadius: The size of the wheel. + :type wheelRadius: float + + .. method:: applyBraking(force, wheelIndex) + + Apply a braking force to the specified wheel + + :arg force: the brake force + :type force: float + + :arg wheelIndex: index of the wheel where the force needs to be applied + :type wheelIndex: integer + + .. method:: applyEngineForce(force, wheelIndex) + + Apply an engine force to the specified wheel + + :arg force: the engine force + :type force: float + + :arg wheelIndex: index of the wheel where the force needs to be applied + :type wheelIndex: integer + + .. method:: getConstraintId() + + Get the constraint ID + + :return: the constraint id + :rtype: integer + + .. method:: getConstraintType() + + Returns the constraint type. + + :return: constraint type + :rtype: integer + + .. method:: getNumWheels() + + Returns the number of wheels. + + :return: the number of wheels for this vehicle + :rtype: integer + + .. method:: getWheelOrientationQuaternion(wheelIndex) + + Returns the wheel orientation as a quaternion. + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + :return: TODO Description + :rtype: TODO - type should be quat as per method name but from the code it looks like a matrix + + .. method:: getWheelPosition(wheelIndex) + + Returns the position of the specified wheel + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + :return: position vector + :rtype: list[x, y, z] + + .. method:: getWheelRotation(wheelIndex) + + Returns the rotation of the specified wheel + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + :return: the wheel rotation + :rtype: float + + .. method:: setRollInfluence(rollInfluece, wheelIndex) + + Set the specified wheel's roll influence. + The higher the roll influence the more the vehicle will tend to roll over in corners. + + :arg rollInfluece: the wheel roll influence + :type rollInfluece: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setSteeringValue(steering, wheelIndex) + + Set the specified wheel's steering + + :arg steering: the wheel steering + :type steering: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setSuspensionCompression(compression, wheelIndex) + + Set the specified wheel's compression + + :arg compression: the wheel compression + :type compression: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setSuspensionDamping(damping, wheelIndex) + + Set the specified wheel's damping + + :arg damping: the wheel damping + :type damping: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setSuspensionStiffness(stiffness, wheelIndex) + + Set the specified wheel's stiffness + + :arg stiffness: the wheel stiffness + :type stiffness: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setTyreFriction(friction, wheelIndex) + + Set the specified wheel's tyre friction + + :arg friction: the tyre friction + :type friction: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_VertexProxy.rst b/doc/python_api/rst/bge_types/bge.types.KX_VertexProxy.rst new file mode 100644 index 00000000000..9c0d1169d49 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_VertexProxy.rst @@ -0,0 +1,209 @@ +KX_VertexProxy(SCA_IObject) +=========================== + +.. module:: bge.types + +base class --- :class:`SCA_IObject` + +.. class:: KX_VertexProxy(SCA_IObject) + + A vertex holds position, UV, color and normal information. + + Note: + The physics simulation is NOT currently updated - physics will not respond + to changes in the vertex position. + + .. attribute:: XYZ + + The position of the vertex. + + :type: list [x, y, z] + + .. attribute:: UV + + The texture coordinates of the vertex. + + :type: list [u, v] + + .. attribute:: normal + + The normal of the vertex. + + :type: list [nx, ny, nz] + + .. attribute:: color + + The color of the vertex. + + :type: list [r, g, b, a] + + Black = [0.0, 0.0, 0.0, 1.0], White = [1.0, 1.0, 1.0, 1.0] + + .. attribute:: x + + The x coordinate of the vertex. + + :type: float + + .. attribute:: y + + The y coordinate of the vertex. + + :type: float + + .. attribute:: z + + The z coordinate of the vertex. + + :type: float + + .. attribute:: u + + The u texture coordinate of the vertex. + + :type: float + + .. attribute:: v + + The v texture coordinate of the vertex. + + :type: float + + .. attribute:: u2 + + The second u texture coordinate of the vertex. + + :type: float + + .. attribute:: v2 + + The second v texture coordinate of the vertex. + + :type: float + + .. attribute:: r + + The red component of the vertex color. 0.0 <= r <= 1.0. + + :type: float + + .. attribute:: g + + The green component of the vertex color. 0.0 <= g <= 1.0. + + :type: float + + .. attribute:: b + + The blue component of the vertex color. 0.0 <= b <= 1.0. + + :type: float + + .. attribute:: a + + The alpha component of the vertex color. 0.0 <= a <= 1.0. + + :type: float + + .. method:: getXYZ() + + Gets the position of this vertex. + + :return: this vertexes position in local coordinates. + :rtype: list [x, y, z] + + .. method:: setXYZ(pos) + + Sets the position of this vertex. + + :type: list [x, y, z] + + :arg pos: the new position for this vertex in local coordinates. + + .. method:: getUV() + + Gets the UV (texture) coordinates of this vertex. + + :return: this vertexes UV (texture) coordinates. + :rtype: list [u, v] + + .. method:: setUV(uv) + + Sets the UV (texture) coordinates of this vertex. + + :type: list [u, v] + + .. method:: getUV2() + + Gets the 2nd UV (texture) coordinates of this vertex. + + :return: this vertexes UV (texture) coordinates. + :rtype: list [u, v] + + .. method:: setUV2(uv, unit) + + Sets the 2nd UV (texture) coordinates of this vertex. + + :type: list [u, v] + + :arg unit: optional argument, FLAT==1, SECOND_UV==2, defaults to SECOND_UV + :arg unit: integer + + .. method:: getRGBA() + + Gets the color of this vertex. + + The color is represented as four bytes packed into an integer value. The color is + packed as RGBA. + + Since Python offers no way to get each byte without shifting, you must use the struct module to + access color in an machine independent way. + + Because of this, it is suggested you use the r, g, b and a attributes or the color attribute instead. + + .. code-block:: python + + import struct; + col = struct.unpack('4B', struct.pack('I', v.getRGBA())) + # col = (r, g, b, a) + # black = ( 0, 0, 0, 255) + # white = (255, 255, 255, 255) + + :return: packed color. 4 byte integer with one byte per color channel in RGBA format. + :rtype: integer + + .. method:: setRGBA(col) + + Sets the color of this vertex. + + See getRGBA() for the format of col, and its relevant problems. Use the r, g, b and a attributes + or the color attribute instead. + + setRGBA() also accepts a four component list as argument col. The list represents the color as [r, g, b, a] + with black = [0.0, 0.0, 0.0, 1.0] and white = [1.0, 1.0, 1.0, 1.0] + + .. code-block:: python + + v.setRGBA(0xff0000ff) # Red + v.setRGBA(0xff00ff00) # Green on little endian, transparent purple on big endian + v.setRGBA([1.0, 0.0, 0.0, 1.0]) # Red + v.setRGBA([0.0, 1.0, 0.0, 1.0]) # Green on all platforms. + + :arg col: the new color of this vertex in packed RGBA format. + :type col: integer or list [r, g, b, a] + + .. method:: getNormal() + + Gets the normal vector of this vertex. + + :return: normalized normal vector. + :rtype: list [nx, ny, nz] + + .. method:: setNormal(normal) + + Sets the normal vector of this vertex. + + :type: sequence of floats [r, g, b] + + :arg normal: the new normal of this vertex. + diff --git a/doc/python_api/rst/bge_types/bge.types.KX_VisibilityActuator.rst b/doc/python_api/rst/bge_types/bge.types.KX_VisibilityActuator.rst new file mode 100644 index 00000000000..4beb6539e0e --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.KX_VisibilityActuator.rst @@ -0,0 +1,29 @@ +KX_VisibilityActuator(SCA_IActuator) +==================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: KX_VisibilityActuator(SCA_IActuator) + + Visibility Actuator. + + .. attribute:: visibility + + whether the actuator makes its parent object visible or invisible. + + :type: boolean + + .. attribute:: useOcclusion + + whether the actuator makes its parent object an occluder or not. + + :type: boolean + + .. attribute:: useRecursion + + whether the visibility/occlusion should be propagated to all children of the object. + + :type: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.PyObjectPlus.rst b/doc/python_api/rst/bge_types/bge.types.PyObjectPlus.rst new file mode 100644 index 00000000000..e035f457a96 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.PyObjectPlus.rst @@ -0,0 +1,21 @@ +PyObjectPlus +============ + +.. module:: bge.types + +.. class:: PyObjectPlus + + PyObjectPlus base class of most other types in the Game Engine. + + .. attribute:: invalid + + Test if the object has been freed by the game engine and is no longer valid. + + Normally this is not a problem but when storing game engine data in the GameLogic module, + KX_Scenes or other KX_GameObjects its possible to hold a reference to invalid data. + Calling an attribute or method on an invalid object will raise a SystemError. + + The invalid attribute allows testing for this case without exception handling. + + :type: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_2DFilterActuator.rst b/doc/python_api/rst/bge_types/bge.types.SCA_2DFilterActuator.rst new file mode 100644 index 00000000000..291ee8426cf --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_2DFilterActuator.rst @@ -0,0 +1,49 @@ +SCA_2DFilterActuator(SCA_IActuator) +=================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: SCA_2DFilterActuator(SCA_IActuator) + + Create, enable and disable 2D filters + + The following properties don't have an immediate effect. + You must active the actuator to get the result. + The actuator is not persistent: it automatically stops itself after setting up the filter + but the filter remains active. To stop a filter you must activate the actuator with 'type' + set to :data:`~bge.logic.RAS_2DFILTER_DISABLED` or :data:`~bge.logic.RAS_2DFILTER_NOFILTER`. + + .. attribute:: shaderText + + shader source code for custom shader. + + :type: string + + .. attribute:: disableMotionBlur + + action on motion blur: 0=enable, 1=disable. + + :type: integer + + .. attribute:: mode + + Type of 2D filter, use one of :ref:`these constants ` + + :type: integer + + .. attribute:: passNumber + + order number of filter in the stack of 2D filters. Filters are executed in increasing order of passNb. + + Only be one filter can be defined per passNb. + + :type: integer (0-100) + + .. attribute:: value + + argument for motion blur filter. + + :type: float (0.0-100.0) + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_ANDController.rst b/doc/python_api/rst/bge_types/bge.types.SCA_ANDController.rst new file mode 100644 index 00000000000..0942f715231 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_ANDController.rst @@ -0,0 +1,13 @@ +SCA_ANDController(SCA_IController) +================================== + +.. module:: bge.types + +base class --- :class:`SCA_IController` + +.. class:: SCA_ANDController(SCA_IController) + + An AND controller activates only when all linked sensors are activated. + + There are no special python methods for this controller. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_ActuatorSensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_ActuatorSensor.rst new file mode 100644 index 00000000000..54916389298 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_ActuatorSensor.rst @@ -0,0 +1,19 @@ +SCA_ActuatorSensor(SCA_ISensor) +=============================== + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: SCA_ActuatorSensor(SCA_ISensor) + + Actuator sensor detect change in actuator state of the parent object. + It generates a positive pulse if the corresponding actuator is activated + and a negative pulse if the actuator is deactivated. + + .. attribute:: actuator + + the name of the actuator that the sensor is monitoring. + + :type: string + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_AlwaysSensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_AlwaysSensor.rst new file mode 100644 index 00000000000..a217b114d62 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_AlwaysSensor.rst @@ -0,0 +1,11 @@ +SCA_AlwaysSensor(SCA_ISensor) +============================= + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: SCA_AlwaysSensor(SCA_ISensor) + + This sensor is always activated. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_DelaySensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_DelaySensor.rst new file mode 100644 index 00000000000..ce2b8e52eec --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_DelaySensor.rst @@ -0,0 +1,39 @@ +SCA_DelaySensor(SCA_ISensor) +============================ + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: SCA_DelaySensor(SCA_ISensor) + + The Delay sensor generates positive and negative triggers at precise time, + expressed in number of frames. The delay parameter defines the length of the initial OFF period. A positive trigger is generated at the end of this period. + + The duration parameter defines the length of the ON period following the OFF period. + There is a negative trigger at the end of the ON period. If duration is 0, the sensor stays ON and there is no negative trigger. + + The sensor runs the OFF-ON cycle once unless the repeat option is set: the OFF-ON cycle repeats indefinately (or the OFF cycle if duration is 0). + + Use :class:`SCA_ISensor.reset` at any time to restart sensor. + + .. attribute:: delay + + length of the initial OFF period as number of frame, 0 for immediate trigger. + + :type: integer. + + .. attribute:: duration + + length of the ON period in number of frame after the initial OFF period. + + If duration is greater than 0, a negative trigger is sent at the end of the ON pulse. + + :type: integer + + .. attribute:: repeat + + 1 if the OFF-ON cycle should be repeated indefinately, 0 if it should run once. + + :type: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_IActuator.rst b/doc/python_api/rst/bge_types/bge.types.SCA_IActuator.rst new file mode 100644 index 00000000000..1432d5166ef --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_IActuator.rst @@ -0,0 +1,11 @@ +SCA_IActuator(SCA_ILogicBrick) +============================== + +.. module:: bge.types + +base class --- :class:`SCA_ILogicBrick` + +.. class:: SCA_IActuator(SCA_ILogicBrick) + + Base class for all actuator logic bricks. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_IController.rst b/doc/python_api/rst/bge_types/bge.types.SCA_IController.rst new file mode 100644 index 00000000000..5eb225ed329 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_IController.rst @@ -0,0 +1,55 @@ +SCA_IController(SCA_ILogicBrick) +================================ + +.. module:: bge.types + +base class --- :class:`SCA_ILogicBrick` + +.. class:: SCA_IController(SCA_ILogicBrick) + + Base class for all controller logic bricks. + + .. attribute:: state + + The controllers state bitmask. This can be used with the GameObject's state to test if the controller is active. + + :type: int bitmask + + .. attribute:: sensors + + A list of sensors linked to this controller. + + :type: sequence supporting index/string lookups and iteration. + + .. note:: + + The sensors are not necessarily owned by the same object. + + .. note:: + + When objects are instanced in dupligroups links may be lost from objects outside the dupligroup. + + .. attribute:: actuators + + A list of actuators linked to this controller. + + :type: sequence supporting index/string lookups and iteration. + + .. note:: + + The sensors are not necessarily owned by the same object. + + .. note:: + + When objects are instanced in dupligroups links may be lost from objects outside the dupligroup. + + .. attribute:: useHighPriority + + When set the controller executes always before all other controllers that dont have this set. + + :type: boolen + + .. note:: + + Order of execution between high priority controllers is not guaranteed. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_ILogicBrick.rst b/doc/python_api/rst/bge_types/bge.types.SCA_ILogicBrick.rst new file mode 100644 index 00000000000..5ed44c4bb38 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_ILogicBrick.rst @@ -0,0 +1,29 @@ +SCA_ILogicBrick(CValue) +======================= + +.. module:: bge.types + +base class --- :class:`CValue` + +.. class:: SCA_ILogicBrick(CValue) + + Base class for all logic bricks. + + .. attribute:: executePriority + + This determines the order controllers are evaluated, and actuators are activated (lower priority is executed first). + + :type: executePriority: int + + .. attribute:: owner + + The game object this logic brick is attached to (read-only). + + :type: :class:`KX_GameObject` or None in exceptional cases. + + .. attribute:: name + + The name of this logic brick (read-only). + + :type: string + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_IObject.rst b/doc/python_api/rst/bge_types/bge.types.SCA_IObject.rst new file mode 100644 index 00000000000..22065944542 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_IObject.rst @@ -0,0 +1,11 @@ +SCA_IObject(CValue) +=================== + +.. module:: bge.types + +base class --- :class:`CValue` + +.. class:: SCA_IObject(CValue) + + This class has no python functions + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_ISensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_ISensor.rst new file mode 100644 index 00000000000..9efd2e2d63a --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_ISensor.rst @@ -0,0 +1,95 @@ +SCA_ISensor(SCA_ILogicBrick) +============================ + +.. module:: bge.types + +base class --- :class:`SCA_ILogicBrick` + +.. class:: SCA_ISensor(SCA_ILogicBrick) + + Base class for all sensor logic bricks. + + .. attribute:: usePosPulseMode + + Flag to turn positive pulse mode on and off. + + :type: boolean + + .. attribute:: useNegPulseMode + + Flag to turn negative pulse mode on and off. + + :type: boolean + + .. attribute:: frequency + + The frequency for pulse mode sensors. + + :type: integer + + .. attribute:: level + + level Option whether to detect level or edge transition when entering a state. + It makes a difference only in case of logic state transition (state actuator). + A level detector will immediately generate a pulse, negative or positive + depending on the sensor condition, as soon as the state is activated. + A edge detector will wait for a state change before generating a pulse. + note: mutually exclusive with :data:`tap`, enabling will disable :data:`tap`. + + :type: boolean + + .. attribute:: tap + + When enabled only sensors that are just activated will send a positive event, + after this they will be detected as negative by the controllers. + This will make a key thats held act as if its only tapped for an instant. + note: mutually exclusive with :data:`level`, enabling will disable :data:`level`. + + :type: boolean + + .. attribute:: invert + + Flag to set if this sensor activates on positive or negative events. + + :type: boolean + + .. attribute:: triggered + + True if this sensor brick is in a positive state. (read-only). + + :type: boolean + + .. attribute:: positive + + True if this sensor brick is in a positive state. (read-only). + + :type: boolean + + .. attribute:: pos_ticks + + The number of ticks since the last positive pulse (read-only). + + :type: int + + .. attribute:: neg_ticks + + The number of ticks since the last negative pulse (read-only). + + :type: int + + .. attribute:: status + + The status of the sensor (read-only): can be one of :ref:`these constants`. + + :type: int + + .. note:: + + This convenient attribute combines the values of triggered and positive attributes. + + .. method:: reset() + + Reset sensor internal state, effect depends on the type of sensor and settings. + + The sensor is put in its initial state as if it was just activated. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_JoystickSensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_JoystickSensor.rst new file mode 100644 index 00000000000..5b6628f60be --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_JoystickSensor.rst @@ -0,0 +1,133 @@ +SCA_JoystickSensor(SCA_ISensor) +=============================== + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: SCA_JoystickSensor(SCA_ISensor) + + This sensor detects player joystick events. + + .. attribute:: axisValues + + The state of the joysticks axis as a list of values :data:`numAxis` long. (read-only). + + :type: list of ints. + + Each specifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing. + The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. + + * left:[-32767, 0, ...] + * right:[32767, 0, ...] + * up:[0, -32767, ...] + * down:[0, 32767, ...] + + .. attribute:: axisSingle + + like :data:`axisValues` but returns a single axis value that is set by the sensor. (read-only). + + :type: integer + + .. note:: + + Only use this for "Single Axis" type sensors otherwise it will raise an error. + + .. attribute:: hatValues + + The state of the joysticks hats as a list of values :data:`numHats` long. (read-only). + + :type: list of ints + + Each specifying the direction of the hat from 1 to 12, 0 when inactive. + + Hat directions are as follows... + + * 0:None + * 1:Up + * 2:Right + * 4:Down + * 8:Left + * 3:Up - Right + * 6:Down - Right + * 12:Down - Left + * 9:Up - Left + + .. attribute:: hatSingle + + Like :data:`hatValues` but returns a single hat direction value that is set by the sensor. (read-only). + + :type: integer + + .. attribute:: numAxis + + The number of axes for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: numButtons + + The number of buttons for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: numHats + + The number of hats for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: connected + + True if a joystick is connected at this joysticks index. (read-only). + + :type: boolean + + .. attribute:: index + + The joystick index to use (from 0 to 7). The first joystick is always 0. + + :type: integer + + .. attribute:: threshold + + Axis threshold. Joystick axis motion below this threshold wont trigger an event. Use values between (0 and 32767), lower values are more sensitive. + + :type: integer + + .. attribute:: button + + The button index the sensor reacts to (first button = 0). When the "All Events" toggle is set, this option has no effect. + + :type: integer + + .. attribute:: axis + + The axis this sensor reacts to, as a list of two values [axisIndex, axisDirection] + + * axisIndex: the axis index to use when detecting axis movement, 1=primary directional control, 2=secondary directional control. + * axisDirection: 0=right, 1=up, 2=left, 3=down. + + :type: [integer, integer] + + .. attribute:: hat + + The hat the sensor reacts to, as a list of two values: [hatIndex, hatDirection] + + * hatIndex: the hat index to use when detecting hat movement, 1=primary hat, 2=secondary hat (4 max). + * hatDirection: 1-12. + + :type: [integer, integer] + + .. method:: getButtonActiveList() + + :return: A list containing the indicies of the currently pressed buttons. + :rtype: list + + .. method:: getButtonStatus(buttonIndex) + + :arg buttonIndex: the button index, 0=first button + :type buttonIndex: integer + :return: The current pressed state of the specified button. + :rtype: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_KeyboardSensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_KeyboardSensor.rst new file mode 100644 index 00000000000..91613068ad0 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_KeyboardSensor.rst @@ -0,0 +1,64 @@ +SCA_KeyboardSensor(SCA_ISensor) +=============================== + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: SCA_KeyboardSensor(SCA_ISensor) + + A keyboard sensor detects player key presses. + + See module :mod:`bge.events` for keycode values. + + .. attribute:: key + + The key code this sensor is looking for. + + :type: keycode from :mod:`bge.events` module + + .. attribute:: hold1 + + The key code for the first modifier this sensor is looking for. + + :type: keycode from :mod:`bge.events` module + + .. attribute:: hold2 + + The key code for the second modifier this sensor is looking for. + + :type: keycode from :mod:`bge.events` module + + .. attribute:: toggleProperty + + The name of the property that indicates whether or not to log keystrokes as a string. + + :type: string + + .. attribute:: targetProperty + + The name of the property that receives keystrokes in case in case a string is logged. + + :type: string + + .. attribute:: useAllKeys + + Flag to determine whether or not to accept all keys. + + :type: boolean + + .. attribute:: events + + a list of pressed keys that have either been pressed, or just released, or are active this frame. (read-only). + + :type: list [[:ref:`keycode`, :ref:`status`], ...] + + .. method:: getKeyStatus(keycode) + + Get the status of a key. + + :arg keycode: The code that represents the key you want to get the state of, use one of :ref:`these constants` + :type keycode: integer + :return: The state of the given key, can be one of :ref:`these constants` + :rtype: int + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_MouseSensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_MouseSensor.rst new file mode 100644 index 00000000000..bbc695e4cbf --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_MouseSensor.rst @@ -0,0 +1,39 @@ +SCA_MouseSensor(SCA_ISensor) +============================ + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: SCA_MouseSensor(SCA_ISensor) + + Mouse Sensor logic brick. + + .. attribute:: position + + current [x, y] coordinates of the mouse, in frame coordinates (pixels). + + :type: [integer, interger] + + .. attribute:: mode + + sensor mode. + + :type: integer + + * KX_MOUSESENSORMODE_LEFTBUTTON(1) + * KX_MOUSESENSORMODE_MIDDLEBUTTON(2) + * KX_MOUSESENSORMODE_RIGHTBUTTON(3) + * KX_MOUSESENSORMODE_WHEELUP(4) + * KX_MOUSESENSORMODE_WHEELDOWN(5) + * KX_MOUSESENSORMODE_MOVEMENT(6) + + .. method:: getButtonStatus(button) + + Get the mouse button status. + + :arg button: The code that represents the key you want to get the state of, use one of :ref:`these constants` + :type button: int + :return: The state of the given key, can be one of :ref:`these constants` + :rtype: int + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_NANDController.rst b/doc/python_api/rst/bge_types/bge.types.SCA_NANDController.rst new file mode 100644 index 00000000000..4bd67fb22ee --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_NANDController.rst @@ -0,0 +1,13 @@ +SCA_NANDController(SCA_IController) +=================================== + +.. module:: bge.types + +base class --- :class:`SCA_IController` + +.. class:: SCA_NANDController(SCA_IController) + + An NAND controller activates when all linked sensors are not active. + + There are no special python methods for this controller. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_NORController.rst b/doc/python_api/rst/bge_types/bge.types.SCA_NORController.rst new file mode 100644 index 00000000000..5a567c84ece --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_NORController.rst @@ -0,0 +1,13 @@ +SCA_NORController(SCA_IController) +================================== + +.. module:: bge.types + +base class --- :class:`SCA_IController` + +.. class:: SCA_NORController(SCA_IController) + + An NOR controller activates only when all linked sensors are de-activated. + + There are no special python methods for this controller. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_ORController.rst b/doc/python_api/rst/bge_types/bge.types.SCA_ORController.rst new file mode 100644 index 00000000000..ed57b0dbaf2 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_ORController.rst @@ -0,0 +1,13 @@ +SCA_ORController(SCA_IController) +================================= + +.. module:: bge.types + +base class --- :class:`SCA_IController` + +.. class:: SCA_ORController(SCA_IController) + + An OR controller activates when any connected sensor activates. + + There are no special python methods for this controller. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_PropertyActuator.rst b/doc/python_api/rst/bge_types/bge.types.SCA_PropertyActuator.rst new file mode 100644 index 00000000000..36a4ea7fefe --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_PropertyActuator.rst @@ -0,0 +1,29 @@ +SCA_PropertyActuator(SCA_IActuator) +=================================== + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: SCA_PropertyActuator(SCA_IActuator) + + Property Actuator + + .. attribute:: propName + + the property on which to operate. + + :type: string + + .. attribute:: value + + the value with which the actuator operates. + + :type: string + + .. attribute:: mode + + TODO - add constants to game logic dict!. + + :type: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_PropertySensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_PropertySensor.rst new file mode 100644 index 00000000000..3c41e4679db --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_PropertySensor.rst @@ -0,0 +1,41 @@ +SCA_PropertySensor(SCA_ISensor) +=============================== + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: SCA_PropertySensor(SCA_ISensor) + + Activates when the game object property matches. + + .. attribute:: mode + + Type of check on the property. Can be one of :ref:`these constants ` + + :type: integer. + + .. attribute:: propName + + the property the sensor operates. + + :type: string + + .. attribute:: value + + the value with which the sensor compares to the value of the property. + + :type: string + + .. attribute:: min + + the minimum value of the range used to evaluate the property when in interval mode. + + :type: string + + .. attribute:: max + + the maximum value of the range used to evaluate the property when in interval mode. + + :type: string + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_PythonController.rst b/doc/python_api/rst/bge_types/bge.types.SCA_PythonController.rst new file mode 100644 index 00000000000..a00e9c29ad4 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_PythonController.rst @@ -0,0 +1,48 @@ +SCA_PythonController(SCA_IController) +===================================== + +.. module:: bge.types + +base class --- :class:`SCA_IController` + +.. class:: SCA_PythonController(SCA_IController) + + A Python controller uses a Python script to activate it's actuators, + based on it's sensors. + + .. attribute:: script + + The value of this variable depends on the execution methid. + + * When 'Script' execution mode is set this value contains the entire python script as a single string (not the script name as you might expect) which can be modified to run different scripts. + * When 'Module' execution mode is set this value will contain a single line string - module name and function "module.func" or "package.modile.func" where the module names are python textblocks or external scripts. + + :type: string + + .. note:: + + Once this is set the script name given for warnings will remain unchanged. + + .. attribute:: mode + + the execution mode for this controller (read-only). + + * Script: 0, Execite the :data:`script` as a python code. + * Module: 1, Execite the :data:`script` as a module and function. + + :type: integer + + .. method:: activate(actuator) + + Activates an actuator attached to this controller. + + :arg actuator: The actuator to operate on. + :type actuator: actuator or the actuator name as a string + + .. method:: deactivate(actuator) + + Deactivates an actuator attached to this controller. + + :arg actuator: The actuator to operate on. + :type actuator: actuator or the actuator name as a string + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_PythonJoystick.rst b/doc/python_api/rst/bge_types/bge.types.SCA_PythonJoystick.rst new file mode 100644 index 00000000000..2b97b5939e2 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_PythonJoystick.rst @@ -0,0 +1,75 @@ +SCA_PythonJoystick(PyObjectPlus) +================================ + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: SCA_PythonJoystick(PyObjectPlus) + + A Python interface to a joystick. + + .. attribute:: name + + The name assigned to the joystick by the operating system. (read-only) + + :type: string + + .. attribute:: activeButtons + + A list of active button values. (read-only) + + :type: list + + .. attribute:: axisValues + + The state of the joysticks axis as a list of values :data:`numAxis` long. (read-only). + + :type: list of ints. + + Each specifying the value of an axis between -1.0 and 1.0 depending on how far the axis is pushed, 0 for nothing. + The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. + + * left:[-1.0, 0.0, ...] + * right:[1.0, 0.0, ...] + * up:[0.0, -1.0, ...] + * down:[0.0, 1.0, ...] + + .. attribute:: hatValues + + The state of the joysticks hats as a list of values :data:`numHats` long. (read-only). + + :type: list of ints + + Each specifying the direction of the hat from 1 to 12, 0 when inactive. + + Hat directions are as follows... + + * 0:None + * 1:Up + * 2:Right + * 4:Down + * 8:Left + * 3:Up - Right + * 6:Down - Right + * 12:Down - Left + * 9:Up - Left + + .. attribute:: numAxis + + The number of axes for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: numButtons + + The number of buttons for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: numHats + + The number of hats for the joystick at this index. (read-only). + + :type: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_PythonKeyboard.rst b/doc/python_api/rst/bge_types/bge.types.SCA_PythonKeyboard.rst new file mode 100644 index 00000000000..6cfef2f80f1 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_PythonKeyboard.rst @@ -0,0 +1,37 @@ +SCA_PythonKeyboard(PyObjectPlus) +================================ + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: SCA_PythonKeyboard(PyObjectPlus) + + The current keyboard. + + .. attribute:: events + + A dictionary containing the status of each keyboard event or key. (read-only). + + :type: dictionary {:ref:`keycode`::ref:`status`, ...} + + .. attribute:: active_events + + A dictionary containing the status of only the active keyboard events or keys. (read-only). + + :type: dictionary {:ref:`keycode`::ref:`status`, ...} + + + .. function:: getClipboard() + + Gets the clipboard text. + + :rtype: string + + .. function:: setClipboard(text) + + Sets the clipboard text. + + :arg text: New clipboard text + :type text: string + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_PythonMouse.rst b/doc/python_api/rst/bge_types/bge.types.SCA_PythonMouse.rst new file mode 100644 index 00000000000..b1c6e5d1487 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_PythonMouse.rst @@ -0,0 +1,35 @@ +SCA_PythonMouse(PyObjectPlus) +============================= + +.. module:: bge.types + +base class --- :class:`PyObjectPlus` + +.. class:: SCA_PythonMouse(PyObjectPlus) + + The current mouse. + + .. attribute:: events + + a dictionary containing the status of each mouse event. (read-only). + + :type: dictionary {:ref:`keycode`::ref:`status`, ...} + + .. attribute:: active_events + + a dictionary containing the status of only the active mouse events. (read-only). + + :type: dictionary {:ref:`keycode`::ref:`status`, ...} + + .. attribute:: position + + The normalized x and y position of the mouse cursor. + + :type: list [x, y] + + .. attribute:: visible + + The visibility of the mouse cursor. + + :type: boolean + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_RandomActuator.rst b/doc/python_api/rst/bge_types/bge.types.SCA_RandomActuator.rst new file mode 100644 index 00000000000..68357229262 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_RandomActuator.rst @@ -0,0 +1,127 @@ +SCA_RandomActuator(SCA_IActuator) +================================= + +.. module:: bge.types + +base class --- :class:`SCA_IActuator` + +.. class:: SCA_RandomActuator(SCA_IActuator) + + Random Actuator + + .. attribute:: seed + + Seed of the random number generator. + + :type: integer. + + Equal seeds produce equal series. If the seed is 0, the generator will produce the same value on every call. + + .. attribute:: para1 + + the first parameter of the active distribution. + + :type: float, read-only. + + Refer to the documentation of the generator types for the meaning of this value. + + .. attribute:: para2 + + the second parameter of the active distribution. + + :type: float, read-only + + Refer to the documentation of the generator types for the meaning of this value. + + .. attribute:: distribution + + Distribution type. (read-only). Can be one of :ref:`these constants ` + + :type: integer + + .. attribute:: propName + + the name of the property to set with the random value. + + :type: string + + If the generator and property types do not match, the assignment is ignored. + + .. method:: setBoolConst(value) + + Sets this generator to produce a constant boolean value. + + :arg value: The value to return. + :type value: boolean + + .. method:: setBoolUniform() + + Sets this generator to produce a uniform boolean distribution. + + The generator will generate True or False with 50% chance. + + .. method:: setBoolBernouilli(value) + + Sets this generator to produce a Bernouilli distribution. + + :arg value: Specifies the proportion of False values to produce. + + * 0.0: Always generate True + * 1.0: Always generate False + :type value: float + + .. method:: setIntConst(value) + + Sets this generator to always produce the given value. + + :arg value: the value this generator produces. + :type value: integer + + .. method:: setIntUniform(lower_bound, upper_bound) + + Sets this generator to produce a random value between the given lower and + upper bounds (inclusive). + + :type lower_bound: integer + :type upper_bound: integer + + .. method:: setIntPoisson(value) + + Generate a Poisson-distributed number. + + This performs a series of Bernouilli tests with parameter value. + It returns the number of tries needed to achieve succes. + + :type value: float + + .. method:: setFloatConst(value) + + Always generate the given value. + + :type value: float + + .. method:: setFloatUniform(lower_bound, upper_bound) + + Generates a random float between lower_bound and upper_bound with a + uniform distribution. + + :type lower_bound: float + :type upper_bound: float + + .. method:: setFloatNormal(mean, standard_deviation) + + Generates a random float from the given normal distribution. + + :arg mean: The mean (average) value of the generated numbers + :type mean: float + :arg standard_deviation: The standard deviation of the generated numbers. + :type standard_deviation: float + + .. method:: setFloatNegativeExponential(half_life) + + Generate negative-exponentially distributed numbers. + + The half-life 'time' is characterized by half_life. + + :type half_life: float + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_RandomSensor.rst b/doc/python_api/rst/bge_types/bge.types.SCA_RandomSensor.rst new file mode 100644 index 00000000000..05e61ccf118 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_RandomSensor.rst @@ -0,0 +1,23 @@ +SCA_RandomSensor(SCA_ISensor) +============================= + +.. module:: bge.types + +base class --- :class:`SCA_ISensor` + +.. class:: SCA_RandomSensor(SCA_ISensor) + + This sensor activates randomly. + + .. attribute:: lastDraw + + The seed of the random number generator. + + :type: integer + + .. attribute:: seed + + The seed of the random number generator. + + :type: integer + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_XNORController.rst b/doc/python_api/rst/bge_types/bge.types.SCA_XNORController.rst new file mode 100644 index 00000000000..d0235f29a20 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_XNORController.rst @@ -0,0 +1,13 @@ +SCA_XNORController(SCA_IController) +=================================== + +.. module:: bge.types + +base class --- :class:`SCA_IController` + +.. class:: SCA_XNORController(SCA_IController) + + An XNOR controller activates when all linked sensors are the same (activated or inative). + + There are no special python methods for this controller. + diff --git a/doc/python_api/rst/bge_types/bge.types.SCA_XORController.rst b/doc/python_api/rst/bge_types/bge.types.SCA_XORController.rst new file mode 100644 index 00000000000..98ccf142f63 --- /dev/null +++ b/doc/python_api/rst/bge_types/bge.types.SCA_XORController.rst @@ -0,0 +1,13 @@ +SCA_XORController(SCA_IController) +================================== + +.. module:: bge.types + +base class --- :class:`SCA_IController` + +.. class:: SCA_XORController(SCA_IController) + + An XOR controller activates when there is the input is mixed, but not when all are on or off. + + There are no special python methods for this controller. + diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index d36f25553ea..3170a2ef469 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -1710,7 +1710,6 @@ def copy_handwritten_rsts(basepath): # TODO put this docs in blender's code and use import as per modules above handwritten_modules = [ - "bge.types", "bge.logic", "bge.render", "bge.texture", @@ -1729,6 +1728,14 @@ def copy_handwritten_rsts(basepath): # copy2 keeps time/date stamps shutil.copy2(os.path.join(RST_DIR, "%s.rst" % mod_name), basepath) + if "bge.types" not in EXCLUDE_MODULES: + shutil.copy2(os.path.join(RST_DIR, "bge.types.rst"), basepath) + + bge_types_dir = os.path.join(RST_DIR, "bge_types") + + for i in os.listdir(bge_types_dir): + shutil.copy2(os.path.join(bge_types_dir, i), basepath) + # changelog shutil.copy2(os.path.join(RST_DIR, "change_log.rst"), basepath) From a643d28446deb9996c7baeefa01540412489a22e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 10 Feb 2013 07:11:32 +0000 Subject: [PATCH 225/227] Update translation extractor so ternary expressions are not merged. eg: ("A" if test else "B") --- .../modules/bl_i18n_utils/bl_process_msg.py | 82 +++++++++++++------ .../scripts/modules/bl_i18n_utils/settings.py | 4 + 2 files changed, 62 insertions(+), 24 deletions(-) diff --git a/release/scripts/modules/bl_i18n_utils/bl_process_msg.py b/release/scripts/modules/bl_i18n_utils/bl_process_msg.py index bd5dd091527..f0adc700a45 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_process_msg.py +++ b/release/scripts/modules/bl_i18n_utils/bl_process_msg.py @@ -361,27 +361,58 @@ def dump_py_messages_from_files(messages, check_ctxt, files): bpy_struct = bpy.types.ID.__base__ # Helper function - def extract_strings(node): + def extract_strings_ex(node, is_split=False): """ Recursively get strings, needed in case we have "Blah" + "Blah", passed as an argument in that case it won't evaluate to a string. However, break on some kind of stopper nodes, like e.g. Subscript. """ + if type(node) == ast.Str: eval_str = ast.literal_eval(node) if eval_str: - return eval_str, (node,) - return None, () + yield (is_split, eval_str, (node,)) + else: + is_split = (type(node) in separate_nodes) + for nd in ast.iter_child_nodes(node): + if type(nd) not in stopper_nodes: + yield from extract_strings_ex(nd, is_split=is_split) + + def _extract_string_merge(estr_ls, nds_ls): + return "".join(s for s in estr_ls if s is not None), tuple(n for n in nds_ls if n is not None) + + def extract_strings(node): + estr_ls = [] + nds_ls = [] + for is_split, estr, nds in extract_strings_ex(node): + estr_ls.append(estr) + nds_ls.extend(nds) + ret = _extract_string_merge(estr_ls, nds_ls) + print(ret) + return ret + + def extract_strings_split(node): + """ + Returns a list args as returned by 'extract_strings()', + But split into groups based on separate_nodes, this way + expressions like ("A" if test else "B") wont be merged but + "A" + "B" will. + """ + estr_ls = [] + nds_ls = [] + bag = [] + for is_split, estr, nds in extract_strings_ex(node): + if is_split: + bag.append((estr_ls, nds_ls)) + estr_ls = [] + nds_ls = [] + + estr_ls.append(estr) + nds_ls.extend(nds) + + bag.append((estr_ls, nds_ls)) + + return [_extract_string_merge(estr_ls, nds_ls) for estr_ls, nds_ls in bag] - eval_str = [] - nodes = [] - for nd in ast.iter_child_nodes(node): - if type(nd) not in stopper_nodes: - estr, nds = extract_strings(nd) - eval_str.append(estr) - nodes += nds - if eval_str: - return "".join(s for s in eval_str if s is not None), tuple(n for n in nodes if n is not None) - return None, () def _ctxt_to_ctxt(node): return extract_strings(node)[0] @@ -427,6 +458,8 @@ def dump_py_messages_from_files(messages, check_ctxt, files): # Break recursive nodes look up on some kind of nodes. # E.g. we don’t want to get strings inside subscripts (blah["foo"])! stopper_nodes = {ast.Subscript, } + # Consider strings separate: ("a" if test else "b") + separate_nodes = {ast.IfExp, } # For now only consider functions from UILayout... for func_id, func in bpy.types.UILayout.bl_rna.functions.items(): @@ -490,24 +523,25 @@ def dump_py_messages_from_files(messages, check_ctxt, files): #print(translate_args) # do nothing if not found for arg_kw, arg_pos in translate_args: - estr, nds = None, () + estr_lst = [(None, ())] if arg_pos < len(node.args): - estr, nds = extract_strings(node.args[arg_pos]) + estr_lst = extract_strings_split(node.args[arg_pos]) #print(estr, nds) else: for kw in node.keywords: if kw.arg == arg_kw: - estr, nds = extract_strings(kw.value) + estr_lst = extract_strings_split(kw.value) break #print(estr, nds) - if estr: - key = (context, estr) - if nds: - msgsrc = ["{}:{}".format(fp_rel, sorted({nd.lineno for nd in nds})[0])] - else: - msgsrc = ["{}:???".format(fp_rel)] - check(check_ctxt_py, messages, key, msgsrc) - messages.setdefault(key, []).extend(msgsrc) + for estr, nds in estr_lst: + if estr: + key = (context, estr) + if nds: + msgsrc = ["{}:{}".format(fp_rel, sorted({nd.lineno for nd in nds})[0])] + else: + msgsrc = ["{}:???".format(fp_rel)] + check(check_ctxt_py, messages, key, msgsrc) + messages.setdefault(key, []).extend(msgsrc) def dump_py_messages(messages, check_ctxt, addons): diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py index eb5fd4cd0fa..d9e0de64622 100644 --- a/release/scripts/modules/bl_i18n_utils/settings.py +++ b/release/scripts/modules/bl_i18n_utils/settings.py @@ -306,6 +306,10 @@ PYTHON3_EXEC = "python3" # The Blender executable! # This is just an example, you’ll most likely have to edit it in your user_settings.py! BLENDER_EXEC = os.path.abspath(os.path.join(TOOLS_DIR, "..", "..", "..", "..", "blender")) +# check for blender.bin +if not os.path.exists(BLENDER_EXEC): + if os.path.exists(BLENDER_EXEC + ".bin"): + BLENDER_EXEC = BLENDER_EXEC + ".bin" # The xgettext tool. You’ll likely have to edit it in your user_settings.py if you’re under Windows. GETTEXT_XGETTEXT_EXECUTABLE = "xgettext" From d65135ed93df0f333989c91d7f2e78bc8c6fbd96 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 10 Feb 2013 08:21:39 +0000 Subject: [PATCH 226/227] 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(-) 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]); From 63af7068ad17f30a526ccb81fbe74253b064bc89 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 10 Feb 2013 08:26:48 +0000 Subject: [PATCH 227/227] revert removal of ternary operators from r54414 --- release/scripts/startup/bl_ui/space_clip.py | 12 ++++++------ release/scripts/startup/bl_ui/space_text.py | 12 +++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index 303f47b295d..84f26acb4cc 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -313,11 +313,9 @@ class CLIP_PT_tools_solve(CLIP_PT_tracking_panel, Panel): col = layout.column(align=True) - # Note: avoid complex code in "text" values, they can't be handled right by i18n messages extractor script! - if tracking_object.is_camera: - col.operator("clip.solve_camera", text="Camera Motion") - else: - col.operator("clip.solve_camera", text="Object Motion") + col.operator("clip.solve_camera", + text="Camera Motion" if tracking_object.is_camera + else "Object Motion") col.operator("clip.clear_solution") col = layout.column() @@ -911,7 +909,9 @@ class CLIP_MT_view(Menu): text = bpy.app.translations.pgettext("Zoom %d:%d") for a, b in ratios: - layout.operator("clip.view_zoom_ratio", text=text % (a, b), translate=False).ratio = a / b + layout.operator("clip.view_zoom_ratio", + text=text % (a, b), + translate=False).ratio = a / b else: if sc.view == 'GRAPH': layout.operator_context = 'INVOKE_REGION_PREVIEW' diff --git a/release/scripts/startup/bl_ui/space_text.py b/release/scripts/startup/bl_ui/space_text.py index d976475c29e..b32172e25e0 100644 --- a/release/scripts/startup/bl_ui/space_text.py +++ b/release/scripts/startup/bl_ui/space_text.py @@ -73,13 +73,15 @@ class TEXT_HT_header(Header): if text.filepath: pgettext = bpy.app.translations.pgettext if text.is_dirty: - row.label(text=pgettext("File: *%r (unsaved)") % text.filepath, translate=False) + row.label(text=pgettext("File: *%r (unsaved)") % + text.filepath, translate=False) else: - row.label(text=pgettext("File: %r") % text.filepath, translate=False) - elif text.library: - row.label(text="Text: External") + row.label(text=pgettext("File: %r") % + text.filepath, translate=False) else: - row.label(text="Text: Internal") + row.label(text="Text: External" + if text.library + else "Text: Internal") class TEXT_PT_properties(Panel):

    v7`K?7Scq7O*wjVli-?Qf7vEnTzC?Qoe#!Mx&ZVE?RN@NakHxdZ zu@Y1gS0$V!awG;MX(W{-JtW^tj!7{|X-Wl1l}OD=pOwBT9VuNWy?$Bbvc=`3%b3e# z83h?PnLL?ES$0`{*+|(&*=;#-IeWP*xnX%`d2M-=e7*eE6^Sd3S8}h6D{v^>QixV) zRUlneyy|nc{OXdTh@!1xw&EC^6MhFC3-45-QM#stQu?ZNqMa96}gjhj@>e*MMm_XnfQlXkOBE(Ja+mzb13d z=UUCR11)8(aINO+;OjcqW3Kn#V83B{BlE_L_IYh5?Go)x9R;0Gon~DcT?5@D-7!4@ zJ$t<(y-j^Z{c!zu115vJ2AKx)H^p!I+-$r>bxZ$N%B`u}qPIP6*BJtadWI>6(|5$~ zc;ESAL~C@%D9dQkSk^eq7;~57uFc)zyZa{BOcG2cO)r}Io3@&n$J_W)>eU_AGB$rdj^BQm}e%HTpp8LC}LPYhG(N>u)x!Hg-1E zwlucpw#BwYJ43toc6$%?9%et>wAZqKW542{;gIUE_~W|_9*$$A15`Z6sM)f zh{vxVuR3cvXF6}W=(?a?4qOdg3tUg#%-t&7>D+DI8$8%OTs_)71wDg22fQS_o_pcE zmA%uvH+>9zKKg=uANbb$aZ-$_UjK{!&-~{C)B~~t4g<{stAp5rJc4?I#e-i46GF5@ z@4*NDDInaJeG-6->@#-{>L zpFG7s(|K0%oaMRC^RZ}^X!Hx}7tSyGU&_DCcu9_Ni0OVM^Xm00Vyt~^cbsfodfaLJ zqxk-Ws|mS@w22;xqe+OQ!eqAOkYs$yt(4kSq12ev-87rDuGd#yqu(&R@qdF$znNa2 zA(D}pLCk!dIg)iPt0J2}`(^e)jzi91u10P-S^)hDef-w>?f5&LceU>?ynp?H_Cvsj z#XPe-Og=on=p*mPS070Q9tF5UdU3d-&LHg zc=ZYR=#%whUb#>KN7= z?isl~GB9d7IzDDKh8uSn|1;q>vGpt9*U99QDVnL6=`+)>XZUB{&t96Xz+J_Co4Y>O zJAZe65^s-RS@2yT{(id1y!e^`B^3RU`}1{4d+F!0fk>LQ72zrh(8>lqW^ILg*OjA#@CMw6yfh^bCxQOiWA=dS(`8CKd{0{QHo< zW5NH7rD3F_rK9M>|DWZw8DOKMqWDr^(0PE04FqNbowfr|3Rg4~V}?@xVe>DSRA6cv z3Plt;C>?6fP{;>^sVKzKP*bccP&lO>pk||C7naqe^W{8UeOC;7cYrlQMjrIS5nrxenVSFS5N=0iK&@6#q6_paD3$S*xAL` z&p#kAC^#hQ>9gn2FJ8tZr=+I6ev_V&`Tj#*{>OsCqT;IR&o#Am^$m@!ZS6lgFr8i9 zgG0k3qhsR}zvkxg3%?f$f0mZFws&^-_74t^j{ovSS)YHg^>5Dp2fo-Sd{I%>fEx0b zFA!DWU&h&}X@q5I*)@$IcHSK4!Y@vtA8*g$w^ci3{D{^H{bn7o`|8Vxd z$5`b55oiBq>_2?{0+_%c%Ho0900eNi_)G}WVSrRd?j&LlM9b?;w@6^JOvOIf%_@YM$GmpurhjnmTd}o?Rk?&-zgA3&@X-0b&XOVhHSzckn(yC z#>qUV0B?)pAP4yqSv$hdazhtoVTJ##7+-{8mAbMlS2qcS1E)Qx0O|DV*`hB&jR(25a6BQ>s%Dt<3bPDXPaLzPsb~be<)OLn+Hl^qH z^MAzdr^ucZZ2Ib7#%?);-#Z1K*@u^9ZEzu?PXUXB&$;8oghS&+=%rc(E&+X{*eOs( z;p$t41nXLIfG0t3zleKVlW2H2(98dEV;_B@wVThI0VCNFfm48?b?4!h+gU?) z(ahwY#{6DA#n_6{-4~rq4-I!;ejE98?a~3$DWE@^BcAr1%U3+DXy9<7wTz62YhoIS zlbl{LXJ(0}+1nk!hge=4ta55#pa)Nll`o;`zw*t=eKgRkdG%uF_18DO#&qP1!_=NX zLjB7O&;q2$$<<$+Mi!a?AG;_+F=E2#r>!5xWv|d-q}Wx8g&`yLY?4lnGn$5IUL@@L z3NCrB(6uM+PTTl}ZPrSvIyW+{<)kc%?eJOHS6hs`2RMq{8>@>r_+f~`U)m6%uKwf} z83-EsiOSV1eU)P!`iVMz-CRW0^UL1GgRL&-w)sG%T;@@TFIF8#-Y|`ZQ>K>!#t5d*U#eIZJj?QR1VplNR|9~idk1VU0X{rGc zx@^Uw2CtB~rOQ21$8Yb7iYSw(R3+lLhO zTYBT;CrU<6jA^|n*5tJ}G74mVUH&jEQvb&ISSjJR8 z?Vj)!r>uwGi2gC=6VMnHpT3Ofch$$tZ)O8odN3Zbg4^N8V=?!ae}59_IQI;*NpiI@ z9KCI#0?IYyPtfn0TMD@RYnU>=;75gwUBG%X##)JR#5-Jjm@fTc!l$zHDX!>FGf5{u zs4ur*B1^0YE8sh{MCPh=EKLO&_>u>(_GA=R$$`ISNYK$yvPrE2ExK;w>U|0IRG0<=YF+c*;@IYNVOzXdfOD5n>XTt5F&S~-0xtculN#4L5| zPRVBHh)5Spf$%b6J5M>P&Wt1hIk}DsL(OU@)H)qT6D)R)5>lt!H4?sdq@3JiDLWp$ zJQ=X-VpOE~=t@IW>eK_P0Mr;o92xR9lQ$_M`I&8;Cbo!pY1S3FLJ`C%8 zmwe!y?mv4|ks3OG3Vbgv$ke$>Mv#lu2WMvAP_#;Z7tO1OYtfoVb*F&!o3;3mh$Hk? zapWdp(JdT8X-|FNK-xJTTzr6eWO1UY7Wj_>Rb3C>Va1_3ilZfw)+n5IZvKfq`S{8@ zb%#HBiSicb>+c$Ap_&f@TPq@v6hgdMpOq57(AZYZPNfKZwn{`klv}Wky(q%(1kOBW zY(`Y;JXPl@Hk|iT)hoKhlewf(r-hk{N?Pi9BeV;v-Tkyvx|-Bw!*l!j#$CcjG!#s{ zwWU#-%UhKxadu($0S8wdZd{b4t}(9WZH=8XoCs`FXMXu;tB?3=Z(R86w?#&W7VPxh zhHos3LJ4zRv##H-WbU%L>6#vyLlO+JF^d%ynbr@gG2QpJ$f%C*(ex?#PV(&)nIupX-_O2uD9Fru(=X&D> z-9Kt}C_3>OjxCL?{IIUSRTdd6VlPJXNd;evLc8Q6F`*LTv74IQkXiNInIM@%>;cq*R}w0Y6!e`K z43qVkWRwImu%|%9X#MidKQY3&H>*8n?nw{zQ^g`1`b=G;^%yQq*`!2u1gQoTiKTY6 z$uK~ALu`-zv8dl0rg`J&E3xt;(E=(5<@Y;(T?~68(#dO0ho`omthphuT;j73Y%9=k zgz8-UkiPa1>P+q5)d4#Ac;$!ur;R&4tjHV$nqXC(RBGhx`SK3SCO3*DNNJZ`<1=QY z#*-j+7=f+8-)mj?{4{(ZHW4l$OAan#_Y^gM#0ZXv>W8=xQsdYge*T)>HlX4gf(agC zjuva&YgGB8vN=olLG*&@iMv*?pc$}E*~S$LDM?lZ_Rd9ap6Qih z0HMa+`B(f;O~(ffc-4fRKJTj`uiyZwzk$4=N^-SsGm^+YYyL;)i0GmemAY2yFB`uQ zuZz7)zU8*m_yWiOgvF3Y;fM3D2sm{%Azt2+*CRi!u(Vn-#+L#IoQNu*|=i{Cd7}^8ReLy~tLA z%V^bbm4;MO?k(?H#o}ffrG6F_WLlYXXm;4t-VZOcx9RbxfZmpBVpZBBSgjHqqd%>j zmhkFIhTkc0Zo>Su(^uVihpcC;+n;P2vbscMbkv0h5u*gZ?7O8UYe6xZ zb7gUMW_KpC4SygG#h_2fqB>HuZI&e!kYzbpVc17*CiFMykQGoZs$_vM-}@V? z@~lMRU%PKVH4M!|9n%tm-K#ivlJ&W}RFhrjp})lTHMg2pv0j6RczuI!T-lP!-(EXb zr-=P#^5VUq1a^Ja)jvJn7ht!;YdR}ExJuDWx9hv*M+8I0gbp~dpF`2z)#P8%hi8zS zO|DkET$8=8bbngb-0ean7Dz3pw0L%!1vLn~_^@_w9U*SjVt>n{>knodir4qhBg-F~ znNMnvmxz~c9K5yZWeDq3x^96nN6B#5++}1au(XQ`Rlg~cva?;-a<@aWGZLvce$|;B5n1J(a^v4 z`B(vCB&v&|3zZ@}lBcWvl!%w+oz&tSNhO{Y1f5B>K%}29O`J`Qoc|O8cQ60M84-*o zAOH1*bQ>YHC|;i_rcE0D76;#MR8u_?N(u=E62798pCAyS&^Y+j5IC{K^t^?j5yja^ zCF#BOv}yW879%=;MWYUx`QzU;ZDa<5=I3-wp@gmc6C*M;MU&>}d_~nA-Qhs@P=M?Bq zb_Yr5&;B4TUv=A?J~H;eZaMAbi5og1;#8(2uSAAG`=6OXiphRuLpdL|DlACoCWi-} zc#Q<((aZ;|ZTG2Xx&$2>1%5O_zb$XHP zL$vYtth5-mPUy@-U52j-885)F3*WO2O;67KAu~iW>)<6nxt^n}-o5LF z2xAw`Jzwjhxyy`)p}4weL=}>EBEQrF^!m|a=o|8GmA_a@#7{qfMMBJERPfwk-ST%k$^~mk_`p|ey$zi_xs_~d^oNa9^wJtuPM>i3;TKESLsEmh~ zKid9HuoX>uDRdk+tA#dNGVV8!i(A!%UM|G&Y~(&QW$(!;1^xE%@q!Crc7B9k5Pa$^ zaYIl(wOFN!zB#;?6zBn0bt2+33;g6d`yzQhX^N~9h$kl1O??x(EifL>o~`1lo=Ck; zo3C^o!E4rO@JZwO7X|JE@@564#r+zn~=0 zDK1lzGIVsjW#$3x@+nvcf}o+p{KwvC%x3A4NH0yik4|595jXXIxpU`I49tB%_>qsn zHhg1ajUv%VAs_9{Uv}p-qrcTV@j!-_%nH(KE4>u?SvZq5cS$a>v6FN{Pv|jjd;Q_Z z3=7$D$qh8^SsB;A`ew7*ctI%MmU5XaoLSgDUIR;UXVr?GA!*wOu-MEZpL{y0WHtGC z-`O3C!kReGlX0^k`v7@cSLhT-Sh`c1Zui9N`v;na<71N)()0k1_^rNWe|O2~X0yTe zf|FRe9#nrZ^_8xT(#*|nC7}iX4gGk~atI-c99~SX%|~!NSURMJ2ORxc=Y9a?#oZL{5irXtszhbkxQu+1!mFuEc!$c2TLN8IA>)x!<#K z=eeft21;g`-S*Xyl@dsMo{xd6Y^wMmy2^S~C^8Rxh_S*8&i2=TQ{HLlxhkjIPm9cE z-I=NLJ6U88%jn@xn%ycux_3TaDP8}R(V?_NLgctkEDJp`jYnu%#iPSS01T!`;2R>} zb$nL#ls|-Bpyu(&}EJXPHCI2<&-i=rh?areXmRtrn&{+ekT? zAO(Vj`w>!ptWuCf@ug=5_XMiW7=G92M|6DUH)At+S1NYVC1W1?xsJ$Q-G*j=-!O`B z(!*``SNX!6eF!JY3wy#c@*ctDGk2d*Rb2Q^eVDO{X@^3>?yE;{De8V1*fT&{@cay0 znHcCWyAFptir!{nM*dh*9(a}Nk$&ObVdZ9EtIcP0)a3QUn*5f+b~)RO+dWx|WTITW zQ9TaLjUUaA*sSj<5Po;`kpOnl*(yLX zLv)>Q_hSYhLLIeH9D93WUl84$ z;)Q5CX5D;0_YiML`ia2eb;ZKAk`6OV8g%X;E|Y5nUG^o8P6?vClcbVBN@{pVj$MR8|<}kSu*MbVJQ5)J$Ar z7(}>#j?}@zi5EpNIM1Q9jH~K%Jn3&*}9Y-oxk4rrFL+M*MK zQ~Kwpx64(2M*#LaO9}mjQz|{%k*wTI5U_}SQ`6Df#^AH~$0b~gX$?W-6(3Xc?1lY< z#iCBUw@}eae@N!*`}bjY?pr#EnuP8Wm-E|E(smviov?Sz)1-FcV9F2ioKo7ssn zEb7^0ME;#j)t`x{7l!nr2~-zP4+W`srC2@3}a@!JZb+D8mBva2%~ zh0VCZ2_ISH$*4=&aSvaJHB82a|MUV`ks(`aYe#p|-4k47jv6{>QLJTF^;zC1Q3DQ) z)y^J*Aeg4_aVOp9>6ze-Rb)fCUgw|4^VxF#1aBp7Od&pAJZE^(jPFGcI~`t4g`B3k zy-BuHxrc`@^&^<}=1U&H?UE9G$5c5e#$LHzPi57O(C4DxZ@=|W3qJ*5MABSF6 zKLy^5UBP(W-I_C!aN6pTQ04;J9Jm+}p0VM+vTB`3c-gP=Z4Lq`p1OyA$Um;Ho|7 z-pk6rEBKva(%<^wDsUqX2kgsQ#Hi88D>csL#WB%pseKg+*IsjK{7pLn+M8 zP_5+{iO%;JpLwY8kf9ovf;QAI;C@Xy(J-86%>?{gWqaoT9W*M=audhSoJdsjAK z#;9uCHduV3vvC2m4X(xwV)yNWt^$Svl|OkWE1P~52ZAOk8^h{Ze*fxaA$#IMS(Zf8 zWpAFA{T66`&|!=sb$|u(eW2XJUccaihP9Z3$ZMHKbo`d&Qb4^2M>=wL$eGe_kq1|v+GUd<;VV@W(F z&Dh+OBR{7HOa@V(YY~h!0_Rt>hdm_svVu!Dq(mM&MF#cyv{BB7axKFrp-8&U^Y3Jn zhRcwZ`nLDJP1*wbC{z z;p=W|_~b6d1$&6grA6_23l3Y^r#g)h$yZ3(2d2^en1%pQ7fj+q_S;Ta#WHrJwEn;MnCaNRrhe#wfP?+GcpV38-5o3nF^ zWm`@i0Tz%5cjlRV2ACJy;JjgK?EuDe&zMSY_{6i;t6mgik$#o+sLyHY=7VOKOE$p^mrW3xO^P|VbUnSjO!c?T0j}^D zPwfIB8y6cIf9uhV!J;(M4V?~r6@>7IcpsVejLHeb7E;xMtf!B5*T^@FlD<~v)C0D; z%Mt^5$yZ~9GH-rrt%N~f<%kL{Gd=Drks5LzL|DDNAQk$r?g^P%mR5Dn4M7k z7daDu#2e^y*IK%P^Os_SndwkAsr(^ea=3WhSTAQJ%i=7?BRXXT1D^d=s;hNjF1a*F z)OW0IF&w4;LB2peAaK(QGQF~dF)|l>SFClJM=_-y$6^u{o6XO}ns59i$yj*D!H1Hu z;rl{39(k1&`+;6vv*RZ#fK*djN?0+K7KO^ZOqlD!YJ{r=p8~MVymC)!EtxmP6=K5i z%DZ@2?#S&xrmH!5k(N(%_lesm!&WD81GRZy-yLs)O(0kJYp>K zcXr(Ti`c9;k~-Fa684*Ez;@^CHqNO6Sr5yajp5fmfO)QKAU<}s{La73+*2PSAMQrNjbAa0o!NNP&O)^S4$j7Soh zZUe%}m2q-`XOv*@eM%m){NC9fhgeiL)Fs(dYlwd<^SL&Y#>HUbmoe3h_gVt`ugBrG zK5C~x$9p+dRVNW>GYY+QJFQP=rNc{<@*dqz|^9VnDVaCHRAh3~%-ji9Nxw zmOXeLz}n^`!z>Y{J)M0*Yq`|CbWBbwaSd85mz0TiA2knatiV`y!D{#}sOx(p-ME`-n5vom=f#(R1g}Z2B2aT(!!J)_0AJ z%DH>+Sv1E#AJgyS8#Nw<@eCQM{Koj4rcQ9Y8Qip6Zrw_7bBI@D$~OBE*D{6kXd1%*!pHM*wAj-Bwt@QlT$8vWd7Fer^8EMuK3$+v82>#ZJyv2TV~mapu_0! zxrCR;q4!)~OXX(0Z-`B)eQX0&b&q z%@;1GL4St?zftz2PBq2$anJ`b2oNh{22GgdQD-@f!ilv%&}p6JaAS@yDNyGIH!A%k zO+0jC-ukqlh|>^?*gZnp^Eo>?1GI2)co(1bOjd(HE` zMB8#3h>yiX@jHdzZ48HvJ#6kEc+IJ-sz@`BchEnF6l48uPL|(7_9^gXQ)l@ zpc8Zk8V9m7*wJ(nTaY@udo!D~eTgyZAUo5Xd$nhIHplr;t2MJAo@n6s;qZ3<1FgHm zj%OxYpi(gC0zmy5&Hxg5LSI_{{^WXbBCHFRSX@jmX{Z4#yY8y&Um&H~lX6u#!*1XU zxm4{-Cv!SUeub>+h9?Wpq(i+vypv)_i|@d<((7?cJ8H*#P1WdCLIJWz5ES%k(mE*R zZmhs<5@&YcnIE~=T|zhS5!+d~{QR>P8|#_9*2H?@B3nOktQDRvKesN_k8zw$YVLHi zB_TiXkRLVlU0c)!tJ?(}rA9nqh2sm1$TvcQBvlf=Nlk19#opYy>yvWH<|acVTRo<` zEg8P59JqAN7BxZGE#4KBWcc$EEM%fK5qr z+j`y~;y{U5y`FzKfV;|>&BX5zibib}SKp>nId?f8PJ9+H6c=YK+>k=xnZ z2U=A)_2o^xn(x|5ZkjQ!BZeu9@iKM8AHDsRvE0yb@xGQ{P2$Cs09!{8EMb5 z8>-icPW{O5qK+6|Um5l%$=nk#78RVqTFk8jfC7Re>AfL+i8w}3x%&GosW>#!ihP&$F3#AZj|CT^rY z6R{u7-H6nLfwQ+(?x?`zTi&+ituN&t)iF%?5fp;J<`5J56DPI~o)qL+7 zd^0)IHy#e(pvSTg$Z94gEMPRV}srk4+C1!ybp z9u#)|`gU8sQ@!R@pp>v?OZNfiR`j~wDnyBLoe&nW_Unl+C5^C0Mm=+w(5*_K+%wg} zl#4efWhI*|@bB~)LBM=3dDj1i9lg!Y=ja^w;=c!%PBQYc8Kh*htxzmc%bBttLKh+Q zxglE^i$1+(tHPzIp^9%7by=NibZfEX8b$GrvTq&q+a0?6OnzYWl7-nA6W{L^%uPR1 zc-+HDeMO4rACf&9SJwSbT$e$K5=$j>W^ri$&Td0J_=-a}?^vEqp-HtRe$!<}@60rO zam{w`(BEAUM82#*48W={nvM)U*XmZ-a|D$nc<5a z-l2dDT!@K{%+>8Yv_On$ z3!sO9DXByE@dpd>#e8p>SUoGQ==q-KRkoCP_k_Qa-zgr!VR`l((jqRJrg9dp&^uvu zwqp~_Po>P-M)65qW7$5l{kaW49?P*#kI!wL`_KX37t2N^OL(*%h%N9u+9y$h!#$B%yxCLBQ3~ssRogFUG)#Q#I z$Lf%(kbLQimP<2IgGp%J;c>5mqDVKUbaaz(0TXCJ@xxL|@~hW47Wtn9t_o+rKo-}o zuYYdc&Z^cya*$o=@6qgOIw&zTJ-WM1XppG%G8mg%(B zq>f~E2&?~{*>oR;%eVQ|iX28#a!OCpb2VRG@zYe`-|wHWRJzICYC!D#bV%=7*UzS% zYD!T&qn6+HBalDIfP>S||5s--E|OI!>eu%=a9q3`T5j5-sXV%P%=A;{8eF5~fte>UPWFzxmcJ&i zy*n#nlV)ndM7a|zJH%a%Fs_${l?HprCd$_(dnee~R9Ji!6*IOTw7IN>ljnD<^tb%u zG>gd8uWYgZj0?4gS{p7S(+?yqn97OLAp2PK8y>9h3fVVg;rsq0`ysF=$U9zXX%}+} z*zktFA0!rtvrqzAel1IwBZXZ*;c!#H4YG1bEeI!Qm8OLWXKA*R$H+wWyQjd>C z-^EapJsc*|0$R)qwA_>wMFDDOuypx0BbPPbVsIJIy%9yqe!*EtmUC0zwOzz zY|2U5T8&hA$rN9zBYa=)mwCAo_M>?9r|roe>ZI&XEwBm%$UHdf*Zn80&v&sr zRcDr48U7g${MMA_ie&1yQTAqfRk@9KpjD!tUSmEgp! z(FRe8tUR-ZjCPj^5rUFBI>-FAthA11C+sIGnzDdp>VYhZx>t!!m&72maPs#w>v_+s zxSR~7$vQZ=py212WJd9Iw=brV3k&vQ!y(9~GPBnYe~-kkvd9_M<9CXjQhfp=O>95m zhYF6CT|TF{Z{!9mb?ESuO|eS6BH9kZUih)c5bi<;7@hpEZD_z!Ojuk)Op`SWOUQ1a zgB^QL*=&;4TIO|!{vUdLULo0Rn4>=P)FXS5u;~tXzjObLm7UFR2@HSWaj1#(WCWPI z8KK{Cd+~+qrq?v;%~79B)dGI6K-SFu=fV&lU*$pd+F)gh6a&lbmzBeTkx7Yg^DbCvS?8PCePmdXnhGjTzqI?Pt3$>An76O$)u;ML z7r&WT6x1JZxo|Z9($8&xBSD@uD+j&en*JC?cBptVn!CVzBp+56J4PqFoKZjoIEh(T*q@qM6ztyJATTk z3AHon(n?qdv_c4V@bZVP3v#iE&HTqG*lyV?1GHp0z1mS3hrE-alkZa=#xFFr$Gc01 zD2vIV^+;;5C%4r!%Z)ocFK?tIjw>w<)m4N{3|;17(~n3K=m?=i$@T)~KT{mfs_u=x zSldVqYQHWDMI)AHt5?DNf;h@~Cmfl}+WE~Gb3{e;vjmgTB$tWmdM6PXI&Dpi<{EKD zxw28-$-vdSl7%4vqb6b9zba$Sb4Qyth!Vlw8&j}Tzq;l={hXG?)vVthhFkAkiH}x8 zRS>Lih1mL=DLOWl)9RH?%Pll8H>FT6AC4XKF04w+Xx@FMD$QzxS&5k(tbpIaEDEsb zK+$v77tW^(xW^s5=8W}_7)RxjDl?}m8@eOVSpa@$Ysu=_v(dZB3|m-LGNdBpkK|?U zoN~%tD)P6WpiDE~fZ-*{%c=zs)xZjD#i0at^;+Yt-lntPIVQw^J*XEHsd)yEF@sw+ ze~;I_FH5{(1M&TIGC%qdB9=?fXCo{z9EgS z2-_dmm}kMZ#l=ZS<$w0Q{D;Rx5(pI0zI1F%NqP|!)=_mEtHJ&!!bGR!9>e=in;+}G zZ)i2T)vdSiy$w)vcu^JUuJ65;FZ^D2iPPg%ir2-xacpWH{^X3$TD;0- zoVexli#++J;^S`q7%?y+f)rfrWB8h;6ZWi=*g!U&rpwIJ^wNm?WV#*6)!JSgzZP*BH+k&Vaku@dCMZ5EHQRN0wyrL;hzvKMkuo!G&=v|oN&e73cg0W;t82(iAVqUp3M zbVu4$v0IZ#M_Ye_3bPb+9d=ZxxD&Zv^!w1NqX}hq8{HUA~YP2pmRYC&R?^iawalIv+k>79vm_yPZ;_W@JB zQ7s#WId!t)v^v%`Y$WfaQ8`CpumkSQZKe4S)CbFk`O@PZ@H8|#WTF9sw{mENJ2j7)`FYm$3zzd^Saaq0M+)nYn z7}b-|gFe>@tBcLC$zI-(hDUql$eHk#048abN&dvZmX~$Fng4%GF{3!>Z^cq_O_3F!f36OC?!c9!XG;(RbWMYvZp3v2qVtdu9mk< z`N$q<+FMJ7*eho-ept=(KQdfa3o2U^Ulp3t=ifsB(}s%D(W$ z{Rm_tOj0a$cm)UB&6}%b(r+G1UrT7U9R(Toz19?tBV~l=!CpMoi+Lr$^{y6z(pNU@x z;^ORLKsi%ZNByn1CyWs%DxYGyxBb3xi~-$o9c{y}IJo>k*xcbdtsp9fQz_)_r|uH0 zNA-(MXa zPF3`6afz+p7WtQ-q0Tv?V>rgy2GnpcG>P|eaoOQS%CG-{{B|dVnWA69{v%9nJAb4J zzrI&nWn{JmpwJU377uom)Gj?WosT$3GJOp`RgH7;3q>?6F5U@4KZG8MgHeMfF&u1) zLv5((>Al?3a+`|{vR9GaWee5v?S>wf`gXTc$g*Tz65YPs@a*dK$d^`%=!eyeUzR~e z^6x~8S(A2A1;_k~dYCeetV$MT&MshCME}5bB}0v-Aew#;aL&>$c|C7dDuN8d<$_#Z zU;aHncw7|cV=Nb7>jkH?#*RMR!_e zAJeN^Z-voxAf()dx&tHU5>2jEo&`%Bdcpb>u|X3z{bl9hU-IQ5WEdI(Uj40wwfS>H zcfgXrM<7&M)TL7T{bIjK>=QAYDhgatV1plU?CUO@emOyot;&6x&M(@`*QJW5KFFMS zG6xdxkhvn_8H-HNw|468e?+Vp)<#zjuKdR0;3et3(_XjzuJi8?r%ARiQe?|9=7!&| zg2byBfB=@Q3ciHrN*Pf?s=iI|aM=S5dZ3;v9? zML;xj%2Wuxe#l4vX;hm@fVv_0-e3|chYYip3J?%05FzFnv|m0m$T8!mmqxYh?qY+* zMF1x=wy`V=VMp0X9dTGx6npgw$D8Ue+^kFRm6UX5%+UPVM6pm0>w@q?R zDZpR?>z#VEq;&no?gjI-_hUrtkeRt)gq*tqFEi<-&w)P&IN|&o@0yr%O`-!ijs$ZH z=jT79F03=cqz#pi_lt>Br!C+tLgVY~fL@|&2=DnY941*1+5@ule*rU=5JBxdxOU2M zPJ+chlk>2OBHikM^8e9J8GNS%s*&=3%!0C3i{GX$$_1B{L`b3fZ%U!!qS;OdzjsrF zx8(zH#GT>3h-ya^KL>T^eXsfFwjfa$+itPj?I7+>PjSOZOEs&5HK^r*N{7D2E`0@p zA?i-(+VS?QaJpA{`$ZPBj?u6!=Rm$rRkej78Tk=Oyn43S!dDhk@DI$gCFKWLi5PajSJc> zv7t*=WR(ckkX!8q1;#~t5lp(O=sO6k)a)^VK)rVq?WhwqrTq`IQ|jD>*O05~{=2+) z2%{;M8y|2(RZ{Vj)<}O@8E)IsgbGGha+d9n8))6svVs^drXS$6UYt^XKwXVdreb2L zSUf57>kre@vLC6de>4UWk-%;#mDXH=K*J<=?21#VZ!NNd?C2B{+CpZ=IkVOq=4qKA z4BO!DNAKMIbx{x^su#|xv?uv0vG-Hk~?u95y9YF&IB2gFe7Ke1K^i=@Xgz zsoCyPL8oJ!nlr+9!nSeVwRG(=W~FH>eOs!S*PnNCb6Iek99-jbV!vy{kJ>=Fdmqoo z`~&$2r}M$!PRx_DVUf7Z9pH%GU%HnACg@7~;EzUW1UB7T`7|MIlg}xvPWuN6Wi_tN zMY)E)d^+p9ew2TR*UE6Y8~bH1Ajx~QvU0O{zE{)j=`c2N|7TL(Nb+oC{Q|&EHZIKo zT#R$mMdLC$!5ps?aDtm-*_M*+zWP>~cheUQc}q|D{H!(kAL#gosPKJ{f}N@HwgJ8j z0fP%F4Tw;~itXjPR_73D4T}~0cF;+xtAo^xOZ zZY`N)D8%uBGWlQA0{b@0l)G+wOv$JRng6LnfFv1YzrU4lI;^XWsQSl36qV4EX-TP9 zJTi7d_AE@hS}onKOFegu2@)ma7nU8gs=K63_ciANTsn_D$Y$UED|Urs&zWCrm;t}pu$34LMA_Nkh?)`Rhg}BE9S&iGsAvIhW>sq)oy$9VaXo}3AkcL z4;Sw;dUnYZJ(&Qb{z(-blp(ja4z!r6U3n@#@jmOX=VS9Z?TEI8SYil^A5ea5yr!D| zhWk&(nMm%zOU2B3cXPvWAVozeezR5UEk-rM^zFSm7IIa%%f5g-;!cP6(@Fh2*i1d&~}%{Xk9naGx&Gr zc!%JD^GY^zhQ@kegce{Z+IpdJ_rD~zv2^&BQ_M-Z*HJ@hfYlcvA?II0k(7`Yb;|24 z>D?Xuix#&E^V97b#pEgtLV2ryi8aO>mAz(tNzr7`HySUr0;q-qS+adfq#Is7%-+Qr0}PU-QA^ znnS()J?xZq9@gfl;KA4-LQAoU96=w!Yc(yGPjKUt=w1L&7PIei8LU(KJUvo*)w15KP*AXkvPT|F7 zOp-f+Q{?Q1`9OjgRp6=TycA@YgP|C+Fab~yoBeTVo=G+Y zMnO7Z3d2JgR~-0^nn~<`Kb9%`E`k#1fR@c7B(z*LSx$L1PJ$k#NffzSNHHPXi`HPp zq&4uI?ORMneA3W+B9S5Sv*3ES2UVxJf-zdfDtD-N3-gE5tPWW|{d*)SV=&hKLX8|J zWqOh0eT)w)$eWcDH5eVuX*}w2*dl!X=PG50C%^J} z9QwZNYX*?rz&i{MlH07CB$rbb*d$-!A8XC7acGSR?z+Q^f&JDs=YKp4>%w1rT&|tk zKOqSfgt_t|ZbQ8%7Jx%;%(N?{L%M%PvPWh())RKedRZg59VQ^#RqO8|Vu*Q6-woRd z+fzyt`CY!Geh^BJqDWh`k_-KOvK%!9+6C6Id0l|FnM{v(=q=%D!dd}783O*J=J|W8 z5x?Gfsc569E%xS~vdxmGLdfy;%&X>@jd^6xp0eF%YYCN@bS+nJ8DiRKIR+cj z<)-l1^Bw`8>pS-G;XZ?8GWl|!!-;FT7joOXyNo6H43Sy04qMj8`QK(OP+U4j8k>X+ z?$w`zGk5-$KRd6VrcM#T&=f@1G@LI3%VhM$z*p%~%0xyy;1XBVZc8}xf@Y|qxV)@?pps^@o7%A>>?}xkQx9$T$5#0b z6ZP;eTy4M4pzFDXO`SY4cB&>@D}cXJqCY%j*6S`D{h@DXCc#f9au#vJVAW43;+^mD z>N|Go_M53dei75&C}*Qe6)qaG@FcKS%;O}zV^!N?oy zx`|19<;Y98FhPnrURdCvO#E5_@=BqU2HVB*cK!~Oclko$hw(>~mbb61TWCLFB=cR6 zKN^!Cra-h2IQs2Z%RdlL==D8UuVL%(5>kBIaOeMWzsXa9jBG*T=*eI#(=SwAJ? zKa@(vsG}3e{L%;zc=c~ZO;>%MPmX0!87k!!j7NUW=3V~cdo&<=AYi|q0D&>NwfhyR zMf+boZhdMVcjsxz!Z6xPw=hUSsoNmwNXELy#sUY2%cMTb`hPVr@PgnZSM- zqGpyUuksJ{`Adra^27jnNa3vJ3584@Z^<4ONVcoU$#_C=Kya8ZNP{8?gZ^D!Tz2j} zC)IhZ0{SIvUw^tNSR2J&m;sXO)W+10S?(WXaW*?gQmi6M!(9FS)YRSgTS!X$-Pxeq z3NfwvJ`{oIhc%OA=e~`SO{7jY57M<_Zg`VF35t^QO9D}i;8hZsKWXzP8BH4{aAh2! z`|wJI3NJI1!qi|>@$Fp^8|=g-@==c`if-MGOXunS6#1m1OF>8^_4%^Qm#f)^pEJR! zk)rn&t>=%HxpE@l60TA(_D~oig0^kzn_CX`*e|f!)2$QC0z8E&W%p}|_8Q9FhU%i= zp{?c7Y&iGCg~+cI?zdy^A~Vy6&3i52-hrdcT3?pMs!_etJ;0rh1E*YIJah z0~jdfPJ`apZXLWx3CxIH%V=-w<|jMHua}^^i@pvLz32HB+3dDrPqV7EuDzDqGRYeV z{LZGiV`_;=B8ngw0f0i*ga5q=#%t9e;H=f#d)lG`o3aV-)NGhp=S-3(P+tMGwgvv~fPXY4TJ(I(ymE%e!mq>P zeCdw$T&6+B5!N@71&7gMm$vnKl0y}uyOOZ>DnClZ++aPDx7xv%osDj1KcYijiAO1e zE94t;2XMC@_kc)m#c%iCSY++aSdZ=i6laOv8BPW?CXy7tV*^1EAx5o&1-bQN2I(4I zSl;E^q$VwfK=8iz8JCRhGn79QQ@Y+n2;!XMGZu}h_AS>GoHU;ctf=&T5)eyVdd8yaTU1uLQc-aiC zuW+wbrcoCN#a?E1VbVxJFv|9jrgO)amy&RWFj(8$Qx-5bLFp1bi9~cu{sESh6hAa} zKO1>7KW!pqgam!T5-cqZ3QbFKNY&-*3iFoeQj+*%aa5X)7Bnt?gTqj@hi%aLFC-8e zIaLX|pC&hp&%F7pJD?5&%U^aoI&a)*{q%|Zi*f9Z?GvXMHJa{+isS$5RP`F4&ei%^ zey96Z1Tf;fCjc3L!%2`0lkkI%C)EaA(ecRa{TsNxY}iLQ~dh4%qr^+Hn9?ZBmdY4u62_$Qm?{+i1y zP;oD}bnzSBQknSv`Mc1lPJQ==AW>J~16H~RdCtm%>P1jVyUfU8;ASL@Fuxqr)QlyV zBjpo+R1?+rqxHMMWB}U2+|2OVrw0Ma$)MGEmy12M#UK)*A2I2;{7rt&j z5ZxUx56(7!T;YFLn=1AC)iiDgAmaz@YPah>3(jT}@m7v+NBib~jPWA>SAKS2`CZ-6 zsdTAlVfPCYuaAHKNEDZUFK{F= zQs+Z@o(tlvA0&3Kxw=d>agSZ5jBYGC)s-q$$Jdm)GDSkTJIu(@ z(zwTo6jth}wX&6+RQ=HxiWfel^HFenc>R&8TJVvQ=OU^?uI9^>q(~mD+~1V`G4N3x z)L6KWG!Ph-=_>_qBESNk~u84SgMhMNMnI5iXN9QnfBmmv{L(=E!n5j?*) zng^sCz=$CDf^+Vakv`O*%W#HIr-E^7nH5}&wv@^o2jb8_4JsU$|JD__szw{_c#lYI*QrvhIRf(im; zA4da}#7;@%7w>5|a2Q_;XjA+Z>hu$jnZ|?Xsi<~t3u<)7wts9~D|J$vf)l_!Wl-GX1_Dok7ruLQGzI9*S_a)K^OL(Pdl z=`i@G5z8q=A-MgB8RqDb^QSCU`Qm4w!JT#_clEkCSFnyu{KWdDg<^cDyM7$<*&reX z@6uaBo#f{W%+py-hyUjazL8vM5IBd%sz$0l@=68L;08*)^K^QU z4G>CL2wt?E`Yw81s!==INTR|-!{!MyBly)f`v2sCEwmfWL`qX&(hu%1+dJY)N{Ks> zq7TZ<%}1b+Mp%W<1OH=UaA(KmBZDi;q?@+h^aukWGdMF^idO?Nu; z(2HmMryi>tFY<7iTA%3Q^Wn5LUWl0*n?g2y>8OO(|6APf$H}mF3GPq%t>n4)gH>pq zc>OSU&!TA2?p~@Ye}y4hn-_h~?A7tqCB-mRLr*sEJ{MLYoR z^4`BM6>M#0JOEfj^8C9EI_@)x^#>nAMJg?|m;iWu{G4hw5Tyaq4-MJTBh0-eFlXys zcFv`8=D{Fz8`B;9E%euiMQ@f8WJP0RtL#a^|JoFX_y!RVHf!6wwQqZ@gmbHd5c8?Y z&rF)D4tjVKB1N&oAM$*(dGi}ABCA4eR6O|sz59_qKa?1xe6@GB`hYy>=%^&n9x(i+ zKX-q5*XRMYjIb<{+c$_4QKfeT=GMw=A@R3^7UL2v`kUj&$ckq6U`|J0L; zmXc_vSWrKhJq|wUF@Y{f)gY!v0E1!$-gLA&yDU5)uM@DwmGcIF?NdMYR6RoeF%*kK zX8QS517R%@aY;!!qn@)_?shHh`&jS31UKUzDh##=$YIE?x({sb7fHX4H)+wh9xx$-)Bn-QjhWE$${prdpKq1-q}yL zPALyAv(lXQ9<>SlIRjDaija<6pW%$uK0R}_RY`-2hG_BU6{77DP||0TCTzpRJQM_B zJ;+CX>`@(Mqg z_;t)YW@cftGmxF0diZ>|3ZL~5c6Y17-t>7vqJ&7*0@oDTv9JD8Q=CV)D-|+Hu&9?_ z==fqi3Hd~I7NUwu_WL;8_(sZJxUJ<$J0I`=2MW(0@(i{Ks{5;VsDIbPvX?zndg|5V-_;gAG_xcv~?X@JFq~?V~KMBpj#k(MQb}@ ztFUQ!>CFY%#~Y5%o-mmYa}14baOV|fGI0;XsdS^DyDQ}%=#Yoecz#}Z#e81#7ehqW zCP(&A=jCPC;9ZD?W1~m*UUqt0>6QdT60|-@0N)#FjJC6Mk1lIHuX3O-k}g{e#bve@ z-&L_ny(<;oeGUsH=(Z;4k2m(;jL(Yrj7rt^2wvF6!7Jakca7*e3mTGx`>%922uE}S z!!g|({0_wvkH@5LyBZmMNMbFp+spl}Txrjz(m}$gQJny;^2zNNhDRCaV>IL25GIIL z;T;jJZ|tY0JIEQawx)A^AlzRv9{aT=bu#(=r>-~}GQ)Yn9pHXT^GPOJkA=(|{p34Rc)b3~Q`1$B_T#C^9p);9Txiw!>Tls=V;H;} zED$2kWtx3K*I2_!WtURAkTsr$Ql zL1w}JI3`rhGax}egH}(6(F%no>w}2I7m|Nza0!V$B;SK2JA&6#rbq-7qU}xy|5<#u zTRJ1OlqP_h+!>a7Ar%z4MHylSX-w2R?T(5Y26rC0Tes#UtG1%w zL&t6aQj(QVRGXQHbO#)ovi=|V;uTcDagEQNQKil}<7v*BR(Ax5YaQ>@MjIDq#v9M} zyFE7Bh5YOYMXPFU>?t)FYnk3S-qU3W`Ulc|&S4%{j5Ayb-=F|Dk8MPD@%b3AbsI~( z@2u}J^*P#w2KrwCkDRzW_|RyrOw;Hu0X8b+dN2?I^pu-xaAK@f_%umf7Y3?% z-s;5vSA6-%Zl-|+>(??N^nWKZWSV*62hGq2Q(FP}f57X#5b-$Q`y@1~Q(vdi9F>Zq z6fGL$wq?PEBk^Xo=$R`pDrO1oE2;jCE$ccN^h1{$_A~#58%2ScK?F=4P3A!>G+c-Qj!!GmYJeL+8y|@i?b8Q$fW0A8H1My+%#fX z*{eg8Qg48CG?fKDttt{jz&l(4ML)U`D*e>vu`I*f=#LOrYe>Ilh%Sr`-q|5!Ub%2I zKpw`8F0l=A1m~2bLt~rPmaXOe5rF)adFJdL!?U{4YVn(;YCVmyNz8ws|E)bBhWmhE zawH>wI(?U*(yFRr)MDQD9s9qfq;wz`vcAbJ`6}9IE3rz_XLEQVrkX%TXdW+$eeXA; zs$>Y1JnV#(m}M9WLKC`XCuPYN>*E!jQ_t1fH+zt*l-`;P9`0+U?s9nsd8Um4bmOlN z_fyE5z}GU8{jyM?86-q!Eiq+zbr1HE9%Y|D^(wZT3U*m3%T_>W5F!6SLp#F@@X$X~ zYxLO!C(+O4>W5yz>(AP#!NH_M_Z>|W9dp-?zL4lDho5t*re-VI8Hxf&_PkEX1T=8Swmou0j$^}c;lU36dLqGr^i zwJtRpGkm`AeXY-%c*PRYiex)%iT$*+K18`SLxOWTx|t-fSdQ|RosJ`#u(#$l{i_?o@EE&VFX=g?ScG@|ugczNl0Jw5d=?%MC;XIg8; zPpHfN{=iAhw7j|nt}xeHb=Zlb>M0#mA`-NDF0Azm>}Qu(Vj1b?(_=uObk<=f_{*V5 zsAvmGgYA4XoNw@lv7@`_NBWU5)G{FUj5_WF$6aW-a$W>ki2mr&`1C4Ef=OJ%{$0$O z7$m#Bl34FDW`Jc{2)-R(+901l-~A#0yVp)Nq16VA^|bJdL`~8mnY}(5$6pmK#u+ms z@yWrVK-NY=jy1>`rTx5juk**`?@Ps|-GaDH+)>`xj0m_rZ#;`al1hXvE^h3(h1Mox z&wLYrvnOBA`pw-=EHtrC0Fs&bGkqNM89I9=Ro7)ud#!#Vd}8n%?!;Me-)>$=h*u zFHM!I?&bFK$v#H37Dk3gnm5mEzUGYJt;gNw7C84Y*uLmDMu$>`U~K>rxC1PzTE8ye zx!z@CXbC!@6lBuQm?_%x#XCIzn7KDz{Q|@~vv7XH8I`Yfxugii)v~+#)k)t#p+$T#U81OkyvoA+)1g8B|(moSJOBIUUy(zwI=_q|fW0_$>glN8QXN{&%2tUduUIuaC&YIn0Iygk+ z9&Fiu>6@Ql-S?&#dQ>A+3=E#rub%gxFD6PxM^D$j-Tz^SzXg!D4;wAS<;lt9#;3M=5_bGBnY~p~2lqkd+_bDz!nA<5B#3W2rP2vI+<5lL>%NciKn#*L zI8wd##wCycP)66)6;&)F30Par!?1q7;%McU_8Ch157uUW^oCKRvA`&_={0pT_nnm> zBgQZ&w<$7yTNYa%dJ8!mpXFvEImx%lBDE-MF41dBgB3ya^gdcZ2aJEc!Xb$rcj{AC z&(pj1DuR4aW^^Rv=B*d5#UE|YU{d+r`N`mJUIHS-OFw0TdadB8yF^jaR(Kpu%J1w90Dld@t>Cmm_ zSND*3CF4_1<&r{JY(gzXGf*7$$>Y9b-y|mH0GC4>DD9nlUq7cy&a>!!5ek`!lvmUV z0s&TE`r~`Vq?HI>9MHq^_Hd5%DOk6HN7};P18`K;RE(g053TaSMdGXl@;uF)D1$UD z$DBL3o-T-?;n$a)2C+G>Ym9}oZ^w5TVR+XK6v#e(0TK&7rCp{Cd&L7$znjKuo=!*u$mq!uJA~Lnscub7npShF((j?s;XNA*3&wAlXck;~vRrI)yl4sS)<;CE0gkY5XxOb6$|*k)M&h^uy~9zI zzzU6-Rt{qo2y1xph|I$h#c=SLOk^JRM|E0(0n0Tah8dr(Ho@gZFYN2wQhzDo9ym1_ zWT-JX$_89Ps{1kGy)b%}yaan;pj=(@`_=B-VkK~$jO|!p&{7(GAL>uw5_3P1*SNlU z9~#7rTko$!Am*aTtN)n`rGe)>{J)y((+oJfBk#TZZ?iA$R+*+7nlKNmhEo)FP}?Jm z&q|8g8K5xcZi=&SR+YTM9$j}8FbV7P%crzlTO=(c+=>45BRk$}6lVMggL8BlW=x={90_>JO`$M{eo<*t?0*ie>?wt?n^zccQU& z!;jih1)1xk2;a^x)(zB3lkEQ)x~W4@qhQ?@<+p=pulK$!mQ*A`P{5XjP);52SeI`{ zKnw-(G?&5k-x~|5wnqpsNtjOPf(tV7@lUNtxORNbwlDACAl(|jGBG=oX!+=5=-ZG& z7=PC8wHrz-_LdP)j$FF9sOgvQS3DD+_6;CZm07aeD)>j%U-GIR7e}i0tZbFK<((A7HLj{#m3)UrIuxB$WBjNY^>aA$LR_I#)&3Xi}$? zG?T{_(2JH+kChJG?W*?x_rk< zeS)cij!;O|lRGlRNZAvtznoN-{P@BLLcY5IgUb_tRP59>gQ1F;&xwS_11)Z($kEYz zw(06m(~7R-%Gvj+!Wl^$(g>K&E_USd*EqXL+jg1!)vh3oQL=MwVZ_PQ?_Jg6u4qgW zipy)Zv!(J$cz*G-hwo0oSY+qvT;-|!4_c?aZhlgY74lLP}Yjq_@^!E0-QGSVV( z;m{kKkIz-&`^~CmBhxqptq|^fGGo8Xb4ihxP(q_@HXTE1C{6kak7LHy=QGj>M$B+t zbah3g*|n5BAJ~}`WdhS30Y=$srZpcipZ7Z+rc(!^NU#WkN*T?!oK&C0K?(XC!)V=X z**u2T)QnojgZe3}PCe@P(FzR5yVapo=PPl!Hxm{WWR9gri;jx7-^x{!YtjzDqeK0n z?n?IG7$ZeffyvbX{!t-Xgz#DK6_U9HheD?JjI2i|T5OtU#SI{h@U|%e{^ZZ1exM!{ zJ!ZLYKNP75W^YF;m4E$$KC%78B};;TD2zPa_wi-{KQ&yZSn`j>;95zIlZtz|pL?8I z1`q$af!Y7_v5DsQc8*E6?7Ig|-KJ4L4kg9%Zr)IdIeU8z0%vglmJD9W9#aT3lZoiA z@Tu{94J8=Msef#wO)v1I=M}ScyniWRSwOZ*Gj!ZoelTp4vS3@76}qPSB`@I9HrF@D z>_dg18V;KpLmORw=2;+bsb3WOjMUbOX}k_%>!Uh40BCC8tmf7WD^R%_sXW-4-Yfw&K|}1FlYZ9A;g6sKnR#yO z$xMZ=1IvRGE8G&I`aNnJ=(ivssuOeG3tgDxPBNt5>z)1+fLrH|(TAT*=}jr(RJGS4 z!%Eb2wKn({?B4jj?gpi`(_Geb1ilv@iw_d*GLi*E_iT?-S5yI@ImtU^;m#^neV-#Jbd&LZ z+1`Ing&q)~1<41rMAHJ1!MY68-HCcrJ$_ifi^;)#U-S1Ff;PaFYup7T5s}AG89~hG zW!(7H&a0{&(5Qaktd%9Nm6&}UjBXcp<_1IK|b_iFuHa0Nm>yN29S8uXB>_3lw(cwkd!6!ZIy6$No zj_lwB7~}uRvvul{9%f4c>UK=al%ST2f zxd{NrS$~NmlBa436EW721>iONEBEAJa&u28W_*CF@5r&E=BZ{H=&o1oFhCnS>&}{| zCvPuIdZXAb=S3ll!J??kHtlQ0vDh%QYVB)%75szP@G#X{-#hsY#j zkP-y0$PZt_2E&(uoAS|;d_`4nk(k&4NqJyPbq?9ZhP(am1g`_2YW*)7&LvzW?aD4X zrhGWh{V6`pw&&aOt^oBo1?=E5U#>1(4;05yKj{uIdZKT1^5g1TQ?g@bnU)_J;~6~@2xs{O}Mn^GQw_gSU@T-7c~cwvOK3t~H3%(U6?VlOJODK6ZynEYcMV~r z&5$_Y6zV6Mkd#BGUVn3%C)oYC#8i9N&meeUl-=dwc6IGb4=5lph#`!nnBqeHuxWBj z7Io@LcbnW15_4zGf^#`5MA_s8&V0IKf9uYV-@2sXrEd=Zt%PKy2&;sAOQZgI0Nu{} zTpf^e4SCM$i))>p9D#@$3oacUH4Hw}KofvQ;vM>%Cr`--DejNH68#_W=3FZ=-u3kL6aXTy6Yq^l4LAFjbJpumXkzj)8uBU_)DFcvD)Y#6x{@}>01m^ zNq-EL*0KU(4?;s_bHh6C`-`LN3gxUi$Cg~J1=Zq2^)r%0Mm(o}v7Rd~5w9qJ(~!ZE zTK57mc1*X#1j)hU%aY1^WGtFR&OYe$@aF|LTo z7axjKBY~kYcz|J5v$Z}x$FIOg;YXlom27Ks+aJwU@c9X)LiJZD>V} z00PRmY^9ziCV!KCi3S+nB%E!hmEr0&vHsK5&)u6b>{0e+Q2|Hyx4;&EtqSdz|5&e< z>yhq$o2FNNJscrLk_K>ERKRQAobH`|5YriCt|uP{L@2H9+~%jMssZAf#rnVt6J$&5 zyt*Fn%Kz-pmNv__QZNl%w@j%;)2zOAH8>p_V=V2UCOE@k{(nq#Sg&<*Wb_i0aQ9Mz z4qaO-mBCPr1*s#W zZU+e~w>*800k360A%@mHQ_&|c47|FFlr%g-7{bUiq#$X`E_ zdUG9;-EZKDPS3If2X#g0zDq^I0+QLC2EY91kmdnS)6G+3IhrEdR}X;8jnDi@*E&j* zp0DnUiI8M(kPBF0{IUZX`z&`G1=6)vtrI}APvs&vO4921>o$l{W;pmt1Z6({?P#c8pgp^*>2&IdqOz;^-~ArF0Np)R|I$^Vx-7pnM2UkAu^;F`S%Y<+mDd ztDhgp2*iPa4g;=l=x2Irqf=D=k@$??x-Ceu!!JMSCxIGL7EqBC8t`u+qr!SDvpXmMdM;8LZ{E*aR(w{Akw+1}dA-IZlORN-Uvn*9fS0C0%rG z{3AjuIOj6wsf)q3eQe?rLjARm5ZJiT+>`m4O3qgKKhT-LOV7GJ_(qJS5BxzFxHU!} zM;izQ>1)@;Ifm6Kmw%tYssknPaG)u->y!5h8M_dAZpmA!PWZHEW$z#UbFRnMDD^E7 zFDlhM&nssp>(Td1P+=6Ac((JipRdv)-rTtvcv{P19}F&XKnc!Gj-WOOl)djF=Vi$y z)l0WvGxEqIpDNEg|J3C_%JqR(lp!%6RPP*^iKkQ?kZG1_>Br=}5jPX-S)&(q844mh z2)=lm=P!jjn$U3?^`|UwpYq=Mz8XHm*O7JAwgU|`=IP+@1D|NZr1;om{3!!o+FW;W zYKNqfDjKoP^B$-UY*&&HoCJS8CUOP#Cwjr!KIG|v6k#KzYMX>2d|{B#@DC&sN%oB? zJa*~9mBTP;YBY+f?bWh#&@1>0^<$_&phs7@w3du0XREAfA~{{_p-AWooT?tqQmm}U zes9iJdVy+Y&GFY)fOz<1&l%IOi<6!NR8o3)+vbuv#<}*GzgT8xmz)(ph;K4<4cE&1 z*q;*?{?~7@_6bZrV+iL$z#klKYJTGZ5k!64XVNY6<5!W>YNIEb!5@Th9F<_xq~TPp zQLpalGY8r7>Wg^-(Ts+??ATFgNcU!05A&KV8!{W)^S>UDYlz}xBrg*^?{-99FRF|4 zR8m?y6_sbcx2LSWcCS^*vV<`T?2_%{)|Lt=G~zuX7Y1vNIv=DUt_AV!kR zyV4I0seTIdAiX``7iQDvd>cfjVi<&oBF|S~F)=>r-=UL2iYt2$gwFKtW4b~K|HUjG zsn6}k;LY=9Et^D_Lv&8cT-B3bp@{Rh_EF$lY^OEP0{E+C8NBWgB}()~4lUz_4mRgW zAH`|4-}9`4g7?PG(DnL@{H}uzP9Q;bN_;psahBDEC8cD2jsWs7h7t>e|PNTd)w9o8csLa%T z>7H9{ikx3WQFB<4!4k~6dr8}R#2ij@vQfKaUcNVAA`i`5A1BE^SP2Iv#pJ56CZIoM!Hm`M7P{2PWSeL~<{Xygba{}?(=|75?i@0rR z?HtlYPx^6roe-|F?s-)MNNx>>#kQC8|9vAEtbo_CJ-h!m)M&U3fFii7JHt(I{@m|$ z1`%Qr7^tVLJAN;=DJclPhs?Zv$Dry$>TMRRjl#A$n|%AmqpM$q7J8Nm7+SegJx8kI zE96t2L*K*MtoyezrarFIW@(&$XM3d%;m%iNgcfi+gvkxZS$)=!5j-J#ix6YmP{^ZS z)YD-?_C#mzpkTAdwz`)ITI=?U7gbxE+ApLYkd$sj=32S-JNlSBi$Ulvq0*5ZgCifx zZ>P_w-TOv(1#GeZl`gwaG&skoZ~mohEIVkX3!X|%g&cG*lBE%4qD!xN`QAakJRADR z=??(sIsq*>zCox2FL?n_o;fbJ)2-uF+nDhBTDoeqvemS{JUZ4~ZE%fM@1D|Cp`d{t zU_rjbX>`;42rs*3UILfSuR0Z{<~AA3W9@JeL8Fa5Us7%KS5wGgcR7}T``Q8zGWS|{oHiN2;mNx7Yv zk&AV6qTOm)2vmwQA_cGt@0XRc)wXuX|Tu9j+F|7+)SLZ_aNrFIhX0SAv!P6O; zd(J+^d8x@v{h^!t4+Qi)%RCscxuZ^=gB==DQ`n%GZ?+VEjrw{%ii{ybT97pCcgah^ zc1HaIW^_XSqK+tju+WcPoeBIQBE+a3KZw}w#Oy@a^c`ZPV-NqJwQ_#emHo0y7LJjC zia?B{kvr4F9e15F3I>)02YOm11;~w@TuXgl4+W%n<>JgKb zGrQrF`AR1V%DOLKKRWWUDf0RIZx@%Ki^hx7MqV%pVe{w&2aaFx&6ONmBLY`_RAJTV z&o2F@xt-m~goNPT7mAW@TfZqlbwtbHbmPp?G`Q!@HLWDRjBmt!`m}rdd8-wUHtjE8Ty}XL^A!8wVnqLb>n-mcA$L2=k6#hsHqA3L1f zV8fvo`ALNz52H3Ivkq5SU#ClBPtDuV<0+Rjip7?UzE&iGb%+dtHUvEIDK1Xyw6|05 zgvZeeN3TD{a-kGlGjOD4p-yS{1xz-;+avw5k+PYyhSXs}EhUVepb1^EqRv@{QHUc0;JCvKZ z-Us*FdckD>cfA|7Nb1qw?>ahT$gb&o6G-K6fZ?q%R+a;z@h7y03~fJurhcko66yMj~dvmHR2p5 zqm3oYE1?%ri-MK^&(XPuGyVT>d_wCWN+-*lnnO`?C^n~|PnevANRdNI2y@z;>8Q0~ z&Sq22=O{TuNX&67=bW{%kh8@Y-`~5RKe{g0)gNnX@7MEnKkxf~IDV)^>ii+a2!e+f z2O^zJ=6%#>-+>c`#k4~QiztFNVwu4*Mgm~hJXcoi_+TA1;_H_v8cW#VHfhk9 zZp)*U;iRifAE1vgyYOGh?ctoZO)A_}1;ln1NrhOKv28HKgD>oR{J-N4#bfK!{N#QeoFbZ+61O ztD%IC1ii8Mg*{ovfc%2^dh8ZKOkUQ-yzy#>T6}AP_J#9(!fc=I$9fV*C3{2x%wjGiK8cuQ;M$ z6UI=%n{|H-@E#k5M?!@OGZG24Yz|zOE9k>uccX= zz&8%PW7BN_aAQzMyU00f;z=D3@;*-M4DdzyQ5pN!{2}=16CwAB(OdO`LQDmX@k0|e zF}{8^k`i