From e7669caf5a21cfda67fd73aee795932eaba8067e Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 21 Jul 2011 08:10:34 +0000 Subject: Fixed bug with multires baking to float buffers. Was missed a flag to set rect marked as changed. --- source/blender/editors/object/object_bake.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source') diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index bdd911d68ee..679e4e58017 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -860,6 +860,10 @@ static void finish_images(MultiresBakeRender *bkr) RE_bake_ibuf_filter(ibuf, (char *)ibuf->userdata, bkr->bake_filter); ibuf->userflags|= IB_BITMAPDIRTY; + + if(ibuf->rect_float) + ibuf->userflags|= IB_RECT_INVALID; + if(ibuf->mipmap[0]) { ibuf->userflags|= IB_MIPMAP_INVALID; imb_freemipmapImBuf(ibuf); -- cgit v1.2.3 From 3e9d1d7683c7d7bf2386c73048808bacd238d550 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 21 Jul 2011 09:50:39 +0000 Subject: Corrected View Selected operator for image editor so now it works fine for images with different X and Y aspect ratio. --- source/blender/editors/space_image/image_ops.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 10b8cb238aa..d5515bd1cf8 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -500,7 +500,7 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op)) Scene *scene; Object *obedit; Image *ima; - float size, min[2], max[2], d[2]; + float size, min[2], max[2], d[2], aspx, aspy; int width, height; /* retrieve state */ @@ -511,6 +511,10 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op)) ima= ED_space_image(sima); ED_space_image_size(sima, &width, &height); + ED_image_aspect(ima, &aspx, &aspy); + + width= width*aspx; + height= height*aspy; /* get bounds */ if(!ED_uvedit_minmax(scene, ima, obedit, min, max)) -- cgit v1.2.3 From bbfe3c9c49523d3987a3144da119d8f6afd09cf9 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Thu, 21 Jul 2011 17:40:20 +0000 Subject: Bugfix #28034 Blender render optimizes alpha=0 materials away, unless it has a number of properties... but there wasn't a check for material being ray-mirror, it then should be rendered always. --- source/blender/render/intern/source/convertblender.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 583b792f240..2a7fb468bfa 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -3375,7 +3375,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) /* test for 100% transparant */ ok= 1; - if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP)) { + if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP) && (ma->mode & MA_RAYMIRROR)==0) { ok= 0; /* texture on transparency? */ for(a=0; a Date: Thu, 21 Jul 2011 21:34:08 +0000 Subject: Adding Shear transform to UV menu and Ctrl Alt Shift S hotkey (same as in 3D View) --- source/blender/editors/transform/transform_ops.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source') diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 7bdf6c909d9..2d0c1ac2818 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -954,6 +954,8 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0); + WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0); km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0); -- cgit v1.2.3 From e6604288c8886b2c236c1765734a6ed71b8f0ae8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Jul 2011 23:06:51 +0000 Subject: cmake - option to disable the frame server --- source/blender/blenkernel/CMakeLists.txt | 4 ++++ source/blender/blenkernel/SConscript | 1 + source/blender/blenkernel/intern/writeframeserver.c | 2 ++ source/blender/makesrna/intern/CMakeLists.txt | 4 ++++ source/blender/makesrna/intern/SConscript | 2 ++ source/blender/makesrna/intern/rna_scene.c | 2 ++ 6 files changed, 15 insertions(+) (limited to 'source') diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 9a384c40e24..defcef58463 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -279,6 +279,10 @@ if(WITH_IMAGE_CINEON) add_definitions(-DWITH_CINEON) endif() +if(WITH_IMAGE_FRAMESERVER) + add_definitions(-DWITH_FRAMESERVER) +endif() + if(WITH_IMAGE_HDR) add_definitions(-DWITH_HDR) endif() diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript index 36afce7946c..5ea42ee65ae 100644 --- a/source/blender/blenkernel/SConscript +++ b/source/blender/blenkernel/SConscript @@ -22,6 +22,7 @@ incs += ' ' + env['BF_ZLIB_INC'] defs = [ 'GLEW_STATIC' ] defs.append('WITH_SMOKE') # TODO, make optional +defs.append('WITH_FRAMESERVER') # TODO, make optional if env['WITH_BF_PYTHON']: incs += ' ../python' diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c index 2239f6d3147..d13d15d1269 100644 --- a/source/blender/blenkernel/intern/writeframeserver.c +++ b/source/blender/blenkernel/intern/writeframeserver.c @@ -22,6 +22,7 @@ * */ +#ifdef WITH_FRAMESERVER #include #include @@ -381,3 +382,4 @@ void end_frameserver(void) shutdown_socket_system(); } +#endif /* WITH_FRAMESERVER */ diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index c9865bf3df4..cb593e7deab 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -171,6 +171,10 @@ if(WITH_IMAGE_HDR) add_definitions(-DWITH_HDR) endif() +if(WITH_IMAGE_FRAMESERVER) + add_definitions(-DWITH_FRAMESERVER) +endif() + if(WITH_AUDASPACE) add_definitions(-DWITH_AUDASPACE) endif() diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript index 421c3a60691..5e43ed9b2fb 100644 --- a/source/blender/makesrna/intern/SConscript +++ b/source/blender/makesrna/intern/SConscript @@ -54,6 +54,8 @@ if env['WITH_BF_CINEON']: if env['WITH_BF_HDR']: defs.append('WITH_HDR') +defs.append('WITH_FRAMESERVER') # TODO, make optional + if env['WITH_BF_FFMPEG']: defs.append('WITH_FFMPEG') incs += ' ' + env['BF_FFMPEG_INC'] diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 662ce04552e..9f751da484e 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -135,7 +135,9 @@ EnumPropertyItem image_type_items[] = { #endif {R_AVIJPEG, "AVI_JPEG", ICON_FILE_MOVIE, "AVI JPEG", "Output video in AVI JPEG format"}, {R_AVIRAW, "AVI_RAW", ICON_FILE_MOVIE, "AVI Raw", "Output video in AVI Raw format"}, +#ifdef WITH_FRAMESERVER {R_FRAMESERVER, "FRAMESERVER", ICON_FILE_SCRIPT, "Frame Server", "Output image to a frameserver"}, +#endif #ifdef WITH_FFMPEG {R_H264, "H264", ICON_FILE_MOVIE, "H.264", "Output video in H.264 format"}, {R_FFMPEG, "FFMPEG", ICON_FILE_MOVIE, "MPEG", "Output video in MPEG format"}, -- cgit v1.2.3 From 58895bee7bb1b877a7ba1e1648e75c9598706566 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Jul 2011 23:36:17 +0000 Subject: fix [#28052] PET: Shift-O cycling skips "random falloff" --- source/blender/editors/transform/transform.c | 2 +- source/blender/makesdna/DNA_scene_types.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index d3a30991aa6..eea77e36f7c 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -969,7 +969,7 @@ int transformEvent(TransInfo *t, wmEvent *event) break; case OKEY: if (t->flag & T_PROP_EDIT && event->shift) { - t->prop_mode = (t->prop_mode + 1) % 6; + t->prop_mode = (t->prop_mode + 1) % PROP_MODE_MAX; calculatePropRatio(t); t->redraw |= TREDRAW_HARD; } diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 3c14dacf973..8203a4dd77c 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1107,7 +1107,8 @@ typedef struct Scene { #define PROP_SHARP 3 #define PROP_LIN 4 #define PROP_CONST 5 -#define PROP_RANDOM 6 +#define PROP_RANDOM 6 +#define PROP_MODE_MAX 7 /* toolsettings->proportional */ #define PROP_EDIT_OFF 0 -- cgit v1.2.3 From 03bae345bebd01cd513e2b477e8409048c3f142c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Jul 2011 00:31:24 +0000 Subject: fix [#28053] New material tooltip --- source/blender/editors/render/render_shading.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index fdd53d27b02..cfed2750e18 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -108,7 +108,7 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot) /* identifiers */ ot->name= "Add Material Slot"; ot->idname= "OBJECT_OT_material_slot_add"; - ot->description="Add a new material slot or duplicate the selected one"; + ot->description="Add a new material slot"; /* api callbacks */ ot->exec= material_slot_add_exec; -- cgit v1.2.3 From 6040a28f039dc73cc62372fd329fe38e25b8f31f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Jul 2011 00:34:03 +0000 Subject: missed this file when adding option to disable frameserver --- source/blender/blenkernel/intern/writeavi.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c index ba7f9bdd415..769a3f9b11e 100644 --- a/source/blender/blenkernel/intern/writeavi.c +++ b/source/blender/blenkernel/intern/writeavi.c @@ -105,13 +105,18 @@ bMovieHandle *BKE_get_movie_handle(int imtype) mh.get_movie_path = filepath_ffmpeg; } #endif +#ifdef WITH_FRAMESERVER if (imtype == R_FRAMESERVER) { mh.start_movie = start_frameserver; mh.append_movie = append_frameserver; mh.end_movie = end_frameserver; mh.get_next_frame = frameserver_loop; } - +#endif + + /* incase all above are disabled */ + (void)imtype; + return &mh; } -- cgit v1.2.3 From 30da1336a8d7811fb9409c6e48209f7a533af1cc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Jul 2011 01:21:20 +0000 Subject: patch [#28045] Straighten tool from Simple Todos from Kyle Mills (khonkhortisan) --- source/blender/editors/uvedit/uvedit_ops.c | 131 +++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) (limited to 'source') diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index c09f8cff02d..d0393c970a6 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1057,6 +1057,134 @@ static void weld_align_uv(bContext *C, int tool) } } + if(tool == 's' || tool == 't' || tool == 'u') { + /* pass 1&2 variables */ + int i, j; + int starttmpl= -1, connectedtostarttmpl, startcorner; + int endtmpl= -1, connectedtoendtmpl, endcorner; + MTFace *startface, *endface; + int itmpl, jtmpl; + EditVert *eve; + int pass; /* first 2 passes find endpoints, 3rd pass moves middle points, 4th pass is fail-on-face-selected */ + EditFace *startefa, *endefa; + + /* pass 3 variables */ + float startx, starty, firstm, firstb, midx, midy; + float endx, endy, secondm, secondb, midmovedx, midmovedy; + float IsVertical_check= -1; + float IsHorizontal_check= -1; + + for(i= 0, eve= em->verts.first; eve; eve= eve->next, i++) /* give each point a unique name */ + eve->tmp.l= i; + for(pass= 1; pass <= 3; pass++) { /* do this for each endpoint */ + if(pass == 3){ /* calculate */ + startx= startface->uv[startcorner][0]; + starty= startface->uv[startcorner][1]; + endx= endface->uv[endcorner][0]; + endy= endface->uv[endcorner][1]; + firstm= (endy-starty)/(endx-startx); + firstb= starty-(firstm*startx); + secondm= -1.0f/firstm; + if(startx == endx) IsVertical_check= startx; + if(starty == endy) IsHorizontal_check= starty; + } + for(efa= em->faces.first; efa; efa= efa->next) { /* for each face */ + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); /* get face */ + if(uvedit_face_visible(scene, ima, efa, tf)) { /* if you can see it */ + if(uvedit_face_selected(scene, efa, tf)) { /* if the face is selected, get out now! */ + pass= 4; + break; + } + for(i= 0; (i < 3 || (i == 3 && efa->v4)); i++) { /* for each point of the face */ + itmpl= (*(&efa->v1 + i))->tmp.l; /* get unique name for points */ + if(pass == 3) { /* move */ + if(uvedit_uv_selected(scene, efa, tf, i)) { + if(!(itmpl == starttmpl || itmpl == endtmpl)) { + if(IsVertical_check != -1) tf->uv[i][0]= IsVertical_check; + if(IsHorizontal_check != -1) tf->uv[i][1]= IsHorizontal_check; + if((IsVertical_check == -1) && (IsHorizontal_check == -1)) { + midx= tf->uv[i][0]; + midy= tf->uv[i][1]; + if(tool == 's') { + secondb= midy-(secondm*midx); + midmovedx= (secondb-firstb)/(firstm-secondm); + midmovedy= (secondm*midmovedx)+secondb; + tf->uv[i][0]= midmovedx; + tf->uv[i][1]= midmovedy; + } + else if(tool == 't') { + tf->uv[i][0]= (midy-firstb)/firstm; /* midmovedx */ + } + else if(tool == 'u') { + tf->uv[i][1]= (firstm*midx)+firstb; /* midmovedy */ + } + } + } + } + } + else { + for(j= 0; (j < 3 || (j == 3 && efa->v4)); j++) { /* also for each point on the face */ + jtmpl= (*(&efa->v1 + j))->tmp.l; + if(i != j && (!efa->v4 || ABS(i-j) != 2)) { /* if the points are connected */ + /* quad (0,1,2,3) 0,1 0,3 1,0 1,2 2,1 2,3 3,0 3,2 + * triangle (0,1,2) 0,1 0,2 1,0 1,2 2,0 2,1 */ + if(uvedit_uv_selected(scene, efa, tf, i) && uvedit_uv_selected(scene, efa, tf, j)) { + /* if the edge is selected */ + if(pass == 1) { /* if finding first endpoint */ + if(starttmpl == -1) { /* if the first endpoint isn't found yet */ + starttmpl= itmpl; /* set unique name for endpoint */ + connectedtostarttmpl= jtmpl; + /* get point that endpoint is connected to */ + startface= tf; /* get face it's on */ + startcorner= i; /* what corner of the face? */ + startefa= efa; + efa= em->faces.first; + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + i= -1; + break; + } + if(starttmpl == itmpl && jtmpl != connectedtostarttmpl) { + starttmpl= -1; /* not an endpoint */ + efa= startefa; + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + i= startcorner; + break; + } + } + else if(pass == 2) { /* if finding second endpoint */ + if(endtmpl == -1 && itmpl != starttmpl) { + endtmpl= itmpl; + connectedtoendtmpl= jtmpl; + endface= tf; + endcorner= i; + endefa= efa; + efa= em->faces.first; + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + i= -1; + break; + } + if(endtmpl == itmpl && jtmpl != connectedtoendtmpl) { + endtmpl= -1; + efa= endefa; + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + i= endcorner; + break; + } + } + } + } + } + } + } + } + } + if(pass == 2 && (starttmpl == -1 || endtmpl == -1)) { + /* if endpoints aren't found */ + pass=4; + } + } + } + uvedit_live_unwrap_update(sima, scene, obedit); DAG_id_tag_update(obedit->data, 0); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); @@ -1074,6 +1202,9 @@ static int align_exec(bContext *C, wmOperator *op) static void UV_OT_align(wmOperatorType *ot) { static EnumPropertyItem axis_items[] = { + {'s', "ALIGN_S", 0, "Straighten", "Align UVs along the line defined by the endpoints"}, + {'t', "ALIGN_T", 0, "Straighten X", "Align UVs along the line defined by the endpoints along the X axis"}, + {'u', "ALIGN_U", 0, "Straighten Y", "Align UVs along the line defined by the endpoints along the Y axis"}, {'a', "ALIGN_AUTO", 0, "Align Auto", "Automatically choose the axis on which there is most alignment already"}, {'x', "ALIGN_X", 0, "Align X", "Align UVs on X axis"}, {'y', "ALIGN_Y", 0, "Align Y", "Align UVs on Y axis"}, -- cgit v1.2.3 From 0e933d089df3a17327caf8700c19df9f419a2973 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Jul 2011 05:33:06 +0000 Subject: fix [#27910] baking ambient occlusion, do not consider closer object for blender 2.58a --- source/blender/render/intern/source/convertblender.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 2a7fb468bfa..7782077604d 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -5685,7 +5685,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, Object *camera; float mat[4][4]; float amb[3]; - const short onlyselected= !ELEM3(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW); + const short onlyselected= !ELEM4(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW, RE_BAKE_AO); const short nolamps= ELEM3(type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_DISPLACEMENT); re->main= bmain; -- cgit v1.2.3 From 382050501dc0036dc28434b205215ebc21a0cf1b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Jul 2011 11:21:01 +0000 Subject: remove duplicate function for printing the current file:line of a python script in the BGE. --- source/gameengine/Expressions/PyObjectPlus.cpp | 38 +------------------------- source/gameengine/Expressions/PyObjectPlus.h | 1 + 2 files changed, 2 insertions(+), 37 deletions(-) (limited to 'source') diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp index 3a25df73f9b..92be769ed71 100644 --- a/source/gameengine/Expressions/PyObjectPlus.cpp +++ b/source/gameengine/Expressions/PyObjectPlus.cpp @@ -1184,46 +1184,10 @@ void PyObjectPlus::SetDeprecationWarnings(bool ignoreDeprecationWarnings) m_ignore_deprecation_warnings = ignoreDeprecationWarnings; } -void PyDebugLine() -{ - // import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno) - - PyObject *getframe, *frame; - PyObject *f_lineno, *f_code, *co_filename; - - getframe = PySys_GetObject((char *)"_getframe"); // borrowed - if (getframe) { - frame = PyObject_CallObject(getframe, NULL); - if (frame) { - f_lineno= PyObject_GetAttrString(frame, "f_lineno"); - f_code= PyObject_GetAttrString(frame, "f_code"); - if (f_lineno && f_code) { - co_filename= ((PyCodeObject *)f_code)->co_filename; /* borrow */ - if (co_filename) { - - printf("\t%s:%d\n", _PyUnicode_AsString(co_filename), (int)PyLong_AsSsize_t(f_lineno)); - - Py_DECREF(f_lineno); - Py_DECREF(f_code); - Py_DECREF(frame); - return; - } - } - - Py_XDECREF(f_lineno); - Py_XDECREF(f_code); - Py_DECREF(frame); - } - - } - PyErr_Clear(); - printf("\tERROR - Could not access sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n"); -} - void PyObjectPlus::ShowDeprecationWarning_func(const char* old_way,const char* new_way) { printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way); - PyDebugLine(); + PyC_LineSpit(); } void PyObjectPlus::ClearDeprecationWarning() diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h index 587f3e4ef35..51cfb5471c0 100644 --- a/source/gameengine/Expressions/PyObjectPlus.h +++ b/source/gameengine/Expressions/PyObjectPlus.h @@ -55,6 +55,7 @@ #ifdef USE_MATHUTILS extern "C" { #include "../../blender/python/mathutils/mathutils.h" /* so we can have mathutils callbacks */ +#include "../../blender/python/generic/py_capi_utils.h" /* for PyC_LineSpit only */ } #endif -- cgit v1.2.3 From ea90544d65a5b2549d5e0b4761de3bf0f2631688 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 22 Jul 2011 15:28:50 +0000 Subject: Need some fun once a while: On dragging a non-connected node on a noodle, it will insert it. Functionality tweaks are possible, but it already feels non-intrusive. Rules: - Insertion only when a single noodle is intersecting with node. - Default connects first matching socket type. - If no socket match, it connects the first. --- source/blender/editors/include/ED_node.h | 3 + source/blender/editors/space_node/drawnode.c | 15 ++- source/blender/editors/space_node/node_edit.c | 126 ++++++++++++++++++++- .../editors/transform/transform_conversions.c | 14 ++- source/blender/makesdna/DNA_node_types.h | 4 + 5 files changed, 156 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index 829ad3217a9..dfa457c22de 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -39,6 +39,7 @@ struct Tex; struct bContext; struct bNode; struct ID; +struct ScrArea; /* drawnode.c */ void ED_init_node_butfuncs(void); @@ -51,6 +52,8 @@ void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct void ED_node_shader_default(struct Material *ma); void ED_node_composit_default(struct Scene *sce); void ED_node_texture_default(struct Tex *tex); +void ED_node_link_intersect_test(struct ScrArea *sa, int test); +void ED_node_link_insert(struct ScrArea *sa); /* node ops.c */ void ED_operatormacros_node(void); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 1bf2c3d89bd..50e657bbb61 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1869,10 +1869,17 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) else { /* check cyclic */ if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) { - if(link->fromnode->flag & SELECT) - th_col1= TH_EDGE_SELECT; - if(link->tonode->flag & SELECT) - th_col2= TH_EDGE_SELECT; + /* special indicated link, on drop-node */ + if(link->flag & NODE_LINKFLAG_HILITE) { + th_col1= th_col2= TH_ACTIVE; + } + else { + /* regular link */ + if(link->fromnode->flag & SELECT) + th_col1= TH_EDGE_SELECT; + if(link->tonode->flag & SELECT) + th_col2= TH_EDGE_SELECT; + } do_shaded= 1; do_triple= 1; } diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index abc7b273ec9..b5648b67d86 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -2492,6 +2492,127 @@ void NODE_OT_links_cut(wmOperatorType *ot) RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, "Cursor", "", 0, INT_MAX); } +/* ********************* automatic node insert on dragging ******************* */ + +static bNodeSocket *socket_best_match(ListBase *sockets, int type) +{ + bNodeSocket *sock; + + for(sock= sockets->first; sock; sock= sock->next) + if(type == sock->type) + return sock; + + return sockets->first; +} + +/* prevent duplicate testing code below */ +static SpaceNode *ed_node_link_conditions(ScrArea *sa, bNode **select) +{ + SpaceNode *snode= sa?sa->spacedata.first:NULL; + bNode *node; + bNodeLink *link; + + /* no unlucky accidents */ + if(sa==NULL || sa->spacetype!=SPACE_NODE) return NULL; + + *select= NULL; + + for(node= snode->edittree->nodes.first; node; node= node->next) { + if(node->flag & SELECT) { + if(*select) + break; + else + *select= node; + } + } + /* only one selected */ + if(node || *select==NULL) return NULL; + + /* correct node */ + if((*select)->inputs.first==NULL || (*select)->outputs.first==NULL) return NULL; + + /* test node for links */ + for(link= snode->edittree->links.first; link; link=link->next) { + if(link->tonode == *select || link->fromnode == *select) + return NULL; + } + + return snode; +} + +/* assumes link with NODE_LINKFLAG_HILITE set */ +void ED_node_link_insert(ScrArea *sa) +{ + bNode *node, *select; + SpaceNode *snode= ed_node_link_conditions(sa, &select); + bNodeLink *link; + bNodeSocket *sockto; + + if(snode==NULL) return; + + /* get the link */ + for(link= snode->edittree->links.first; link; link=link->next) + if(link->flag & NODE_LINKFLAG_HILITE) + break; + + if(link) { + node= link->tonode; + sockto= link->tosock; + + link->tonode= select; + link->tosock= socket_best_match(&select->inputs, link->fromsock->type); + link->flag &= ~NODE_LINKFLAG_HILITE; + + nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto); + ntreeSolveOrder(snode->edittree); /* needed for pointers */ + snode_tag_changed(snode, select); + ED_node_changed_update(snode->id, select); + } +} + + +/* test == 0, clear all intersect flags */ +void ED_node_link_intersect_test(ScrArea *sa, int test) +{ + bNode *select; + SpaceNode *snode= ed_node_link_conditions(sa, &select); + bNodeLink *link, *selink=NULL; + float mcoords[4][2]; + + if(snode==NULL) return; + + /* clear flags */ + for(link= snode->edittree->links.first; link; link=link->next) + link->flag &= ~NODE_LINKFLAG_HILITE; + + if(test==0) return; + + /* okay, there's 1 node, without links, now intersect */ + mcoords[0][0]= select->totr.xmin; + mcoords[0][1]= select->totr.ymin; + mcoords[1][0]= select->totr.xmax; + mcoords[1][1]= select->totr.ymin; + mcoords[2][0]= select->totr.xmax; + mcoords[2][1]= select->totr.ymax; + mcoords[3][0]= select->totr.xmin; + mcoords[3][1]= select->totr.ymax; + + /* we only tag a single link for intersect now */ + /* idea; use header dist when more? */ + for(link= snode->edittree->links.first; link; link=link->next) { + + if(cut_links_intersect(link, mcoords, 4)) { + if(selink) + break; + selink= link; + } + } + + if(link==NULL && selink) + selink->flag |= NODE_LINKFLAG_HILITE; +} + + /* ******************************** */ // XXX some code needing updating to operators... @@ -2914,7 +3035,8 @@ void NODE_OT_delete(wmOperatorType *ot) /* note: in cmp_util.c is similar code, for node_compo_pass_on() */ /* used for disabling node (similar code in node_draw.c for disable line) */ -static void node_delete_reconnect(bNodeTree* tree, bNode* node) { +static void node_delete_reconnect(bNodeTree* tree, bNode* node) +{ bNodeLink *link, *next; bNodeSocket *valsocket= NULL, *colsocket= NULL, *vecsocket= NULL; bNodeSocket *deliveringvalsocket= NULL, *deliveringcolsocket= NULL, *deliveringvecsocket= NULL; @@ -3142,3 +3264,5 @@ void NODE_OT_add_file(wmOperatorType *ot) RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Datablock name to assign."); } + + diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 16bfc75c979..0a5e290643a 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -87,6 +87,7 @@ #include "ED_object.h" #include "ED_markers.h" #include "ED_mesh.h" +#include "ED_node.h" #include "ED_types.h" #include "ED_uvedit.h" #include "ED_curve.h" /* for ED_curve_editnurbs */ @@ -2182,6 +2183,12 @@ void flushTransNodes(TransInfo *t) td->loc2d[0]= td->loc[0]; td->loc2d[1]= td->loc[1]; } + + /* handle intersection with noodles */ + if(t->total==1) { + ED_node_link_intersect_test(t->sa, 1); + } + } /* *** SEQUENCE EDITOR *** */ @@ -4756,7 +4763,12 @@ void special_aftertrans_update(bContext *C, TransInfo *t) } else if (t->spacetype == SPACE_NODE) { - /* pass */ + if(cancelled == 0) + ED_node_link_insert(t->sa); + + /* clear link line */ + ED_node_link_intersect_test(t->sa, 0); + } else if (t->spacetype == SPACE_ACTION) { SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 03387c3a63a..efaf30b02f6 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -179,6 +179,10 @@ typedef struct bNodeLink { } bNodeLink; + +/* link->flag */ +#define NODE_LINKFLAG_HILITE 1 + /* the basis for a Node tree, all links and nodes reside internal here */ /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */ typedef struct bNodeTree { -- cgit v1.2.3 From eed7702c9932653c68b72e291e30cbca3a741c16 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 22 Jul 2011 16:02:56 +0000 Subject: Small fix in drop-node-on-noodle: intersect code only did 3 edges of node. --- source/blender/editors/space_node/node_edit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index b5648b67d86..8cb7528c4d7 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -2577,7 +2577,7 @@ void ED_node_link_intersect_test(ScrArea *sa, int test) bNode *select; SpaceNode *snode= ed_node_link_conditions(sa, &select); bNodeLink *link, *selink=NULL; - float mcoords[4][2]; + float mcoords[5][2]; if(snode==NULL) return; @@ -2601,7 +2601,7 @@ void ED_node_link_intersect_test(ScrArea *sa, int test) /* idea; use header dist when more? */ for(link= snode->edittree->links.first; link; link=link->next) { - if(cut_links_intersect(link, mcoords, 4)) { + if(cut_links_intersect(link, mcoords, 5)) { /* 5 - silly intersect code */ if(selink) break; selink= link; -- cgit v1.2.3 From ffc490cbf1d93c7e0a9b97953f6f52e69b9bc8ec Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 22 Jul 2011 16:39:06 +0000 Subject: Two fixes in drop-node-on-noodle: - Intersection code was using undefined vector caused wrong lines to be picked - Code now also copes with hidden sockets. If all fails, is just unhides a good socket. --- source/blender/editors/space_node/node_edit.c | 30 ++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 8cb7528c4d7..4230a43d2ec 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -2494,13 +2494,33 @@ void NODE_OT_links_cut(wmOperatorType *ot) /* ********************* automatic node insert on dragging ******************* */ +/* assumes sockets in list */ static bNodeSocket *socket_best_match(ListBase *sockets, int type) { bNodeSocket *sock; + /* first, match type */ for(sock= sockets->first; sock; sock= sock->next) - if(type == sock->type) + if(!(sock->flag & SOCK_HIDDEN)) + if(type == sock->type) + return sock; + + /* then just use first unhidden socket */ + for(sock= sockets->first; sock; sock= sock->next) + if(!(sock->flag & SOCK_HIDDEN)) + return sock; + + /* OK, let's unhide proper one */ + for(sock= sockets->first; sock; sock= sock->next) { + if(type == sock->type) { + sock->flag &= ~SOCK_HIDDEN; return sock; + } + } + + /* just the first */ + sock= sockets->first; + sock->flag &= ~SOCK_HIDDEN; return sockets->first; } @@ -2577,7 +2597,7 @@ void ED_node_link_intersect_test(ScrArea *sa, int test) bNode *select; SpaceNode *snode= ed_node_link_conditions(sa, &select); bNodeLink *link, *selink=NULL; - float mcoords[5][2]; + float mcoords[6][2]; if(snode==NULL) return; @@ -2596,12 +2616,16 @@ void ED_node_link_intersect_test(ScrArea *sa, int test) mcoords[2][1]= select->totr.ymax; mcoords[3][0]= select->totr.xmin; mcoords[3][1]= select->totr.ymax; + mcoords[4][0]= select->totr.xmin; + mcoords[4][1]= select->totr.ymin; + mcoords[5][0]= select->totr.xmax; + mcoords[5][1]= select->totr.ymax; /* we only tag a single link for intersect now */ /* idea; use header dist when more? */ for(link= snode->edittree->links.first; link; link=link->next) { - if(cut_links_intersect(link, mcoords, 5)) { /* 5 - silly intersect code */ + if(cut_links_intersect(link, mcoords, 5)) { /* intersect code wants edges */ if(selink) break; selink= link; -- cgit v1.2.3 From 742225d9b4c3888c1cfd155b575420abf0cf7869 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Sat, 23 Jul 2011 18:03:01 +0000 Subject: bugfix: [#28026] Copy Game Property broken not exactly a bug, but the option to copy individual properties was not working from the SPACE menu. I believe this was happening because we are using dynamic enums. This commit makes the "merge" option to be the default one. So if you call it from the SPACE menu it will be the one used. --- source/blender/editors/object/object_edit.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 29a740affc5..395705dc029 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -2162,16 +2162,20 @@ static int game_property_copy_exec(bContext *C, wmOperator *op) } CTX_DATA_END; } } - else if (ELEM(type, COPY_PROPERTIES_REPLACE, COPY_PROPERTIES_MERGE)) { + + else { CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { if (ob != ob_iter) { if (ob->data != ob_iter->data){ - if (type == 2) {/* merge */ + if (type == COPY_PROPERTIES_REPLACE) + copy_properties( &ob_iter->prop, &ob->prop ); + + /* merge - the default when calling with no argument */ + else { for(prop = ob->prop.first; prop; prop= prop->next ) { set_ob_property(ob_iter, prop); } - } else /* replace */ - copy_properties( &ob_iter->prop, &ob->prop ); + } } } } -- cgit v1.2.3 From 43994ce213d43ecc4448493a8920b1a9e7f34492 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sat, 23 Jul 2011 22:08:37 +0000 Subject: 2.5: * Removed some old not used code. --- source/blender/editors/space_view3d/view3d_header.c | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 75c8d5cae73..ae80a554e08 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -505,17 +505,6 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); - /* NDOF */ - /* Not implemented yet - if (G.ndofdevice ==0 ) { - uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), 0,0,UI_UNIT_X+10,UI_UNIT_Y, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode"); - - uiDefIconButC(block, TOG, B_NDOF, ICON_NDOF_DOM, - 0,0,UI_UNIT_X,UI_UNIT_Y, - &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis"); - } - */ - /* Transform widget / manipulators */ row= uiLayoutRow(layout, 1); uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); -- cgit v1.2.3 From b154b5993829f92e03233a04410b3667f2976556 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 24 Jul 2011 10:26:22 +0000 Subject: New dilation function from Morten Mikkelsen (aka sparky). This commit fixes very noticeable seams caused by margins calculated incorrectly. This commit changes way margin is calculated in and makes textures really seamless. Also margin limited to 32 isn't good now -- artists are baking really large textures nowadays so margin is now limited to 64px. Thank you, Morten! --- source/blender/imbuf/IMB_imbuf.h | 2 +- source/blender/imbuf/intern/filter.c | 219 ++++++++++++----------- source/blender/makesrna/intern/rna_scene.c | 2 +- source/blender/render/intern/source/rendercore.c | 22 +-- 4 files changed, 118 insertions(+), 127 deletions(-) (limited to 'source') diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index ff01e3a8a1e..36123592c54 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -252,7 +252,7 @@ void IMB_filter(struct ImBuf *ibuf); void IMB_filterN(struct ImBuf *out, struct ImBuf *in); void IMB_mask_filter_extend(char *mask, int width, int height); void IMB_mask_clear(struct ImBuf *ibuf, char *mask, int val); -void IMB_filter_extend(struct ImBuf *ibuf, char *mask); +void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter); void IMB_makemipmap(struct ImBuf *ibuf, int use_filter); void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter); struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level); diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c index d12360e5a7e..1644e653df4 100644 --- a/source/blender/imbuf/intern/filter.c +++ b/source/blender/imbuf/intern/filter.c @@ -21,7 +21,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Morten Mikkelsen. * * ***** END GPL LICENSE BLOCK ***** * filter.c @@ -326,121 +326,132 @@ void IMB_mask_clear(ImBuf *ibuf, char *mask, int val) } } -#define EXTEND_PIXEL(color, w) if((color)[3]) {r+= w*(color)[0]; g+= w*(color)[1]; b+= w*(color)[2]; a+= w*(color)[3]; tot+=w;} +static int filter_make_index(const int x, const int y, const int w, const int h) +{ + if(x<0 || x>=w || y<0 || y>=h) return -1; /* return bad index */ + else return y*w+x; +} + +static int check_pixel_assigned(const void *buffer, const char *mask, const int index, const int depth, const int is_float) +{ + int res = 0; + + if(index>=0) { + const int alpha_index = depth*index+(depth-1); + + if(mask!=NULL) { + res = mask[index]!=0 ? 1 : 0; + } + else if( (is_float && ((const float *) buffer)[alpha_index]!=0.0f) || + (!is_float && ((const unsigned char *) buffer)[alpha_index]!=0) ) { + res=1; + } + } + + return res; +} /* if alpha is zero, it checks surrounding pixels and averages color. sets new alphas to 1.0 * * When a mask is given, only effect pixels with a mask value of 1, defined as BAKE_MASK_MARGIN in rendercore.c * */ -void IMB_filter_extend(struct ImBuf *ibuf, char *mask) +void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter) { - register char *row1, *row2, *row3; - register char *cp; - int rowlen, x, y; - - rowlen= ibuf->x; - - - if (ibuf->rect_float) { - float *temprect; - float *row1f, *row2f, *row3f; - float *fp; - temprect= MEM_dupallocN(ibuf->rect_float); - - for(y=1; y<=ibuf->y; y++) { - /* setup rows */ - row1f= (float *)(temprect + (y-2)*rowlen*4); - row2f= row1f + 4*rowlen; - row3f= row2f + 4*rowlen; - if(y==1) - row1f= row2f; - else if(y==ibuf->y) - row3f= row2f; - - fp= (float *)(ibuf->rect_float + (y-1)*rowlen*4); - - for(x=0; xx; + const int height= ibuf->y; + const int depth= 4; /* always 4 channels */ + const int chsize= ibuf->rect_float ? sizeof(float) : sizeof(unsigned char); + const int bsize= width*height*depth*chsize; + const int is_float= ibuf->rect_float!=NULL; + void *dstbuf= (void *) MEM_dupallocN(ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect); + char *dstmask= mask==NULL ? NULL : (char *) MEM_dupallocN(mask); + void *srcbuf= ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect; + char *srcmask= mask; + int cannot_early_out= 1, r, n, k, i, j, c; + float weight[25]; + + /* build a weights buffer */ + n= 2; + k= 0; + for(i = -n; i <= n; i++) + for(j = -n; j <= n; j++) + weight[k++] = sqrt((float) i * i + j * j); + + /* run passes */ + for(r = 0; cannot_early_out == 1 && r < filter; r++) { + int x, y; + cannot_early_out = 0; + + for(y= 0; y 255 ? 255 : (acc[c] < 0 ? 0 : ((unsigned char) (acc[c]+0.5f))); + } + } + + if(dstmask!=NULL) dstmask[index]=FILTER_MASK_MARGIN; /* assigned */ + cannot_early_out = 1; + } } } - fp+=4; - - if(x!=0) { - row1f+=4; row2f+=4; row3f+=4; - } } } - MEM_freeN(temprect); - } - else if(ibuf->rect) { - int *temprect; - - /* make a copy, to prevent flooding */ - temprect= MEM_dupallocN(ibuf->rect); - - for(y=1; y<=ibuf->y; y++) { - /* setup rows */ - row1= (char *)(temprect + (y-2)*rowlen); - row2= row1 + 4*rowlen; - row3= row2 + 4*rowlen; - if(y==1) - row1= row2; - else if(y==ibuf->y) - row3= row2; - - cp= (char *)(ibuf->rect + (y-1)*rowlen); - - for(x=0; xx, ibuf->y); - - temprect = MEM_dupallocN(mask); - - /* expand twice to clear this many pixels, so they blend back in */ - IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y); - IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y); - - /* clear all pixels in the margin */ - IMB_mask_clear(ibuf, temprect, FILTER_MASK_MARGIN); - MEM_freeN(temprect); - - for(i= 0; i < filter; i++) - IMB_filter_extend(ibuf, mask); + IMB_filter_extend(ibuf, mask, filter); } /* if the bake results in new alpha then change the image setting */ -- cgit v1.2.3 From b401d09d8f05d5b7fd81bbaaa27722f24faba165 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sun, 24 Jul 2011 11:11:23 +0000 Subject: * Minor code cleanup / comment changing. No functional changes. --- source/blender/editors/interface/interface_templates.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 25dbb68a258..f388710d5b8 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -851,7 +851,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr) /* verify we have valid data */ if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) { - RNA_warning("uiTemplateModifier: expected modifier on object.\n"); + RNA_warning("uiTemplateModifier: Expected modifier on object.\n"); return NULL; } @@ -859,7 +859,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr) md= ptr->data; if(!ob || !(GS(ob->id.name) == ID_OB)) { - RNA_warning("uiTemplateModifier: expected modifier on object.\n"); + RNA_warning("uiTemplateModifier: Expected modifier on object.\n"); return NULL; } @@ -976,9 +976,6 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con) block= uiLayoutGetBlock(box); /* Draw constraint header */ - - /* rounded header */ - // rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20; // UNUSED /* open/close */ uiBlockSetEmboss(block, UI_EMBOSSN); @@ -1083,7 +1080,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr) /* verify we have valid data */ if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) { - RNA_warning("uiTemplateConstraint: expected constraint on object.\n"); + RNA_warning("uiTemplateConstraint: Expected constraint on object.\n"); return NULL; } @@ -1091,7 +1088,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr) con= ptr->data; if(!ob || !(GS(ob->id.name) == ID_OB)) { - RNA_warning("uiTemplateConstraint: expected constraint on object.\n"); + RNA_warning("uiTemplateConstraint: Expected constraint on object.\n"); return NULL; } @@ -1137,7 +1134,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M PointerRNA texture_ptr; if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) { - RNA_warning("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n"); + RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n"); return; } @@ -2171,14 +2168,14 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char * if(prop) { type= RNA_property_type(prop); if(type != PROP_COLLECTION) { - RNA_warning("uiTemplateList: expected collection property.\n"); + RNA_warning("uiTemplateList: Expected collection property.\n"); return; } } activetype= RNA_property_type(activeprop); if(activetype != PROP_INT) { - RNA_warning("uiTemplateList: expected integer property.\n"); + RNA_warning("uiTemplateList: Expected integer property.\n"); return; } -- cgit v1.2.3 From a22de3f73c28b86f481376d52fbcfd7bb8ee25f2 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Sun, 24 Jul 2011 17:44:22 +0000 Subject: Effector calculations are now thread safe. * where_is_object_time was called for every effector evaluation only to determine the object velocity in some rare cases. * Calculating the effector velocity is now done in the effector precalculation stage. * Removing this makes the code thread safe and also should give some nice performance boosts when simulating a lot of points. * Thanks to MiikaH for noticing this problem. --- source/blender/blenkernel/BKE_effect.h | 1 + source/blender/blenkernel/intern/effect.c | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h index 97ac711651b..12f9383cefb 100644 --- a/source/blender/blenkernel/BKE_effect.h +++ b/source/blender/blenkernel/BKE_effect.h @@ -105,6 +105,7 @@ typedef struct EffectorCache { /* precalculated for guides */ struct GuideEffectorData *guide_data; float guide_loc[4], guide_dir[3], guide_radius; + float velocity[3]; float frame; int flag; diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index ee46bef6038..4b95c44f55f 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -241,6 +241,16 @@ static void precalculate_effector(EffectorCache *eff) } else if(eff->psys) psys_update_particle_tree(eff->psys, eff->scene->r.cfra); + + /* Store object velocity */ + if(eff->ob) { + float old_vel[3]; + + where_is_object_time(eff->scene, eff->ob, cfra - 1.0f); + copy_v3_v3(old_vel, eff->ob->obmat[3]); + where_is_object_time(eff->scene, eff->ob, cfra); + sub_v3_v3v3(eff->velocity, eff->ob->obmat[3], old_vel); + } } static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd) { @@ -680,10 +690,6 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin Object *ob = eff->ob; Object obcopy = *ob; - /* XXX this is not thread-safe, but used from multiple threads by - particle system */ - where_is_object_time(eff->scene, ob, cfra); - /* use z-axis as normal*/ normalize_v3_v3(efd->nor, ob->obmat[2]); @@ -702,13 +708,8 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin VECCOPY(efd->loc, ob->obmat[3]); } - if(real_velocity) { - VECCOPY(efd->vel, ob->obmat[3]); - - where_is_object_time(eff->scene, ob, cfra - 1.0f); - - sub_v3_v3v3(efd->vel, efd->vel, ob->obmat[3]); - } + if(real_velocity) + copy_v3_v3(efd->vel, eff->velocity); *eff->ob = obcopy; -- cgit v1.2.3 From ced8f1dffcb9b054d7197a21e2a0426056b2babf Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 25 Jul 2011 01:44:19 +0000 Subject: deprecate multiplication orders: vector * matrix vector *= matrix vector * quaternion vector *= quaternion Use the reverse order instead, enable WITH_ASSERT_ABORT in cmake to promote the warnings into errors. --- source/blender/python/mathutils/mathutils.h | 2 + source/blender/python/mathutils/mathutils_Matrix.c | 14 +++- .../python/mathutils/mathutils_Quaternion.c | 26 ++++++- source/blender/python/mathutils/mathutils_Vector.c | 80 +++++++++++++++++++++- 4 files changed, 118 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/python/mathutils/mathutils.h b/source/blender/python/mathutils/mathutils.h index 7454cfe78b3..b798b5e7003 100644 --- a/source/blender/python/mathutils/mathutils.h +++ b/source/blender/python/mathutils/mathutils.h @@ -108,4 +108,6 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index); int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix); int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix); +int column_vector_multiplication(float rvec[4], VectorObject *vec, MatrixObject *mat); + #endif /* MATHUTILS_H */ diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c index 76a0994c3aa..3953171f263 100644 --- a/source/blender/python/mathutils/mathutils_Matrix.c +++ b/source/blender/python/mathutils/mathutils_Matrix.c @@ -1612,8 +1612,20 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2) } } else if(mat1) { + /*VEC * MATRIX */ + if(VectorObject_Check(m2)) { + VectorObject *vec2= (VectorObject *)m2; + float tvec[4]; + if(BaseMath_ReadCallback(vec2) == -1) + return NULL; + if(column_vector_multiplication(tvec, vec2, mat1) == -1) { + return NULL; + } + + return newVectorObject(tvec, vec2->size, Py_NEW, Py_TYPE(m2)); + } /*FLOAT/INT * MATRIX */ - if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) { + else if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) { return matrix_mul_float(mat1, scalar); } } diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c index 3b05b9a250b..2be258a1ef0 100644 --- a/source/blender/python/mathutils/mathutils_Quaternion.c +++ b/source/blender/python/mathutils/mathutils_Quaternion.c @@ -753,8 +753,30 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2) return quat_mul_float(quat2, scalar); } } - else if (quat1) { /* QUAT*FLOAT */ - if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) { + else if (quat1) { + /* QUAT * VEC */ + if (VectorObject_Check(q2)) { + VectorObject *vec2 = (VectorObject *)q2; + float tvec[3]; + + if(vec2->size != 3) { + PyErr_SetString(PyExc_ValueError, + "Vector multiplication: " + "only 3D vector rotations (with quats) " + "currently supported"); + return NULL; + } + if(BaseMath_ReadCallback(vec2) == -1) { + return NULL; + } + + copy_v3_v3(tvec, vec2->vec); + mul_qt_v3(quat1->quat, tvec); + + return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec2)); + } + /* QUAT * FLOAT */ + else if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) { return quat_mul_float(quat1, scalar); } } diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c index e2c958adaa5..a954c07c98d 100644 --- a/source/blender/python/mathutils/mathutils_Vector.c +++ b/source/blender/python/mathutils/mathutils_Vector.c @@ -37,6 +37,8 @@ #include "BLI_math.h" #include "BLI_utildefines.h" +extern void PyC_LineSpit(void); + #define MAX_DIMENSIONS 4 /* Swizzle axes get packed into a single value that is used as a closure. Each @@ -1081,7 +1083,7 @@ static PyObject *Vector_isub(PyObject *v1, PyObject *v2) * note: vector/matrix multiplication IS NOT COMMUTATIVE!!!! * note: assume read callbacks have been done first. */ -static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat) +int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat) { float vec_cpy[MAX_DIMENSIONS]; double dot = 0.0f; @@ -1159,8 +1161,29 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2) } else if (vec1) { if (MatrixObject_Check(v2)) { + extern void PyC_LineSpit(void); + /* VEC * MATRIX */ + /* this is deprecated!, use the reverse instead */ float tvec[MAX_DIMENSIONS]; + + +/* ------ to be removed ------*/ +#ifndef MATH_STANDALONE +#ifdef WITH_ASSERT_ABORT + PyErr_SetString(PyExc_ValueError, + "(Vector * Matrix) is now removed, reverse the " + "order (promoted to an Error for Debug builds)"); + return NULL; +#else + printf("Warning: (Vector * Matrix) is now deprecated, " + "reverse the multiplication order in the script.\n"); + PyC_LineSpit(); +#endif +#endif /* ifndef MATH_STANDALONE */ +/* ------ to be removed ------*/ + + if(BaseMath_ReadCallback((MatrixObject *)v2) == -1) return NULL; if(column_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1) { @@ -1183,6 +1206,24 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2) if(BaseMath_ReadCallback(quat2) == -1) { return NULL; } + + +/* ------ to be removed ------*/ +#ifndef MATH_STANDALONE +#ifdef WITH_ASSERT_ABORT + PyErr_SetString(PyExc_ValueError, + "(Vector * Quat) is now removed, reverse the " + "order (promoted to an Error for Debug builds)"); + return NULL; +#else + printf("Warning: (Vector * Quat) is now deprecated, " + "reverse the multiplication order in the script.\n"); + PyC_LineSpit(); +#endif +#endif /* ifndef MATH_STANDALONE */ +/* ------ to be removed ------*/ + + copy_v3_v3(tvec, vec1->vec); mul_qt_v3(quat2->quat, tvec); return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec1)); @@ -1226,6 +1267,24 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2) if(column_vector_multiplication(rvec, vec, (MatrixObject*)v2) == -1) return NULL; + +/* ------ to be removed ------*/ +#ifndef MATH_STANDALONE +#ifdef WITH_ASSERT_ABORT + PyErr_SetString(PyExc_ValueError, + "(Vector *= Matrix) is now removed, reverse the " + "order (promoted to an Error for Debug builds) " + "and uses the non in-place multiplication."); + return NULL; +#else + printf("Warning: (Vector *= Matrix) is now deprecated, " + "reverse the (non in-place) multiplication order in the script.\n"); + PyC_LineSpit(); +#endif +#endif /* ifndef MATH_STANDALONE */ +/* ------ to be removed ------*/ + + memcpy(vec->vec, rvec, sizeof(float) * vec->size); } else if (QuaternionObject_Check(v2)) { @@ -1242,6 +1301,25 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2) if(BaseMath_ReadCallback(quat2) == -1) { return NULL; } + + +/* ------ to be removed ------*/ +#ifndef MATH_STANDALONE +#ifdef WITH_ASSERT_ABORT + PyErr_SetString(PyExc_ValueError, + "(Vector *= Quat) is now removed, reverse the " + "order (promoted to an Error for Debug builds) " + "and uses the non in-place multiplication."); + return NULL; +#else + printf("Warning: (Vector *= Quat) is now deprecated, " + "reverse the (non in-place) multiplication order in the script.\n"); + PyC_LineSpit(); +#endif +#endif /* ifndef MATH_STANDALONE */ +/* ------ to be removed ------*/ + + mul_qt_v3(quat2->quat, vec->vec); } else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC *= FLOAT */ -- cgit v1.2.3 From 5132be21d1697a636e62b9b71b9741e1b6c5e0b3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 25 Jul 2011 04:00:11 +0000 Subject: fix [#28075] After the correction of No.38528 is applied, the following phenomenon has been generated. own fault in recent addition of bpy.path.basename() not supporting byte paths. --- source/tests/CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/tests/CMakeLists.txt b/source/tests/CMakeLists.txt index d1696223ec6..8fd0d6e7099 100644 --- a/source/tests/CMakeLists.txt +++ b/source/tests/CMakeLists.txt @@ -196,7 +196,7 @@ add_test(export_x3d_cube ${TEST_BLENDER_EXE} --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_cube.x3d',use_selection=False\) --md5_source=${TEST_OUT_DIR}/export_x3d_cube.x3d - --md5=6ae36be272d6f84c697e84a8b6463273 --md5_method=FILE + --md5=5e804c689896116331fa190a9fabbad4 --md5_method=FILE ) add_test(export_x3d_nurbs ${TEST_BLENDER_EXE} @@ -212,7 +212,7 @@ add_test(export_x3d_all_objects ${TEST_BLENDER_EXE} --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_all_objects.x3d',use_selection=False\) --md5_source=${TEST_OUT_DIR}/export_x3d_all_objects.x3d - --md5=bba48ca191e8891adb27c59ed4ce4735 --md5_method=FILE + --md5=2809ec13a4cab55d265ce7525c5db1b7 --md5_method=FILE ) @@ -261,7 +261,7 @@ add_test(export_3ds_all_objects ${TEST_BLENDER_EXE} --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- --run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_all_objects.3ds',use_selection=False\) --md5_source=${TEST_OUT_DIR}/export_3ds_all_objects.3ds - --md5=cdf8fa8475fda0b9ef565ac09339254b --md5_method=FILE + --md5=0940ea889498cd437d503670738639ae --md5_method=FILE ) @@ -273,7 +273,7 @@ add_test(export_fbx_cube ${TEST_BLENDER_EXE} --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_cube.fbx',use_selection=False,use_metadata=False\) --md5_source=${TEST_OUT_DIR}/export_fbx_cube.fbx - --md5=642a5a1fa199d5b9bbf1643519ae974d --md5_method=FILE + --md5=83dca99a0cb338852b8c85951a44c68a --md5_method=FILE ) add_test(export_fbx_nurbs ${TEST_BLENDER_EXE} @@ -281,7 +281,7 @@ add_test(export_fbx_nurbs ${TEST_BLENDER_EXE} --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_nurbs.fbx',use_selection=False,use_metadata=False\) --md5_source=${TEST_OUT_DIR}/export_fbx_nurbs.fbx - --md5=ec1e8965bdbc3bf70707d77f82c2cb9c --md5_method=FILE + --md5=c7d9491ffa6264e820ed1e12df63f871 --md5_method=FILE ) add_test(export_fbx_all_objects ${TEST_BLENDER_EXE} @@ -289,5 +289,5 @@ add_test(export_fbx_all_objects ${TEST_BLENDER_EXE} --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_all_objects.fbx',use_selection=False,use_metadata=False\) --md5_source=${TEST_OUT_DIR}/export_fbx_all_objects.fbx - --md5=af3b65665687ac92e4aba07b017d87fe --md5_method=FILE + --md5=22867f82e1615fd1eae18cfaac8ba035 --md5_method=FILE ) -- cgit v1.2.3 From fee1594a650175babe009005c4d4f6ad5da20a03 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Mon, 25 Jul 2011 15:37:55 +0000 Subject: BGE BugFix for: [#23874] Custom projection matrix doesn't work in custom viewport This was never highly tested, that's why I never committed (my patch for this was from September 2010). But once again I got a report that this bug was a deal-break and the patch seems to work for this artist. I believe it's working, but I will keep my eyes open for this. --- source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index ea0b00e52fd..0aa36b4cd5f 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -1220,7 +1220,7 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam) projmat.setValue(m_overrideCamProjMat.getPointer()); cam->SetProjectionMatrix(projmat); } - } else if (cam->hasValidProjectionMatrix() && !cam->GetViewport() ) + } else if (cam->hasValidProjectionMatrix()) { m_rasterizer->SetProjectionMatrix(cam->GetProjectionMatrix()); } else -- cgit v1.2.3 From 62415cab0520c70b4af874def93897c42d17e3d1 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 25 Jul 2011 15:44:41 +0000 Subject: Fix #28014: joystick sensor not working. Broke this with an earlier commit trying to fix blenderplayer startup warnings. It seems we do need to init the SDL video subsystem even if we only want events, thanks Juha Maki-Kanto for pointing this out. --- source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp index 0e08f157a6a..48ba09e67d2 100644 --- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp +++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp @@ -89,7 +89,7 @@ SCA_Joystick *SCA_Joystick::GetInstance( short int joyindex ) { int i; // do this once only - if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1 ){ + if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO) == -1 ){ echo("Error-Initializing-SDL: " << SDL_GetError()); return NULL; } @@ -124,7 +124,7 @@ void SCA_Joystick::ReleaseInstance() m_instance[i]= NULL; } - SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO); #endif } } -- cgit v1.2.3 From aec8d72ca7532ccea6daee9ff099ff3f5feafb96 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 25 Jul 2011 16:16:32 +0000 Subject: Fix #28079: UV propertional editing was incorrectly influenced by the mesh X mirror option. --- source/blender/editors/transform/transform_generics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 20a26d8c58d..6d0a978700f 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1070,7 +1070,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) } } // Need stuff to take it from edit mesh or whatnot here - else + else if (t->spacetype == SPACE_VIEW3D) { if (t->obedit && t->obedit->type == OB_MESH && (((Mesh *)t->obedit->data)->editflag & ME_EDIT_MIRROR_X)) { -- cgit v1.2.3 From 5b3906728fa358fccd857cbeca85ff102df6e6c7 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 25 Jul 2011 16:37:10 +0000 Subject: Fix #28035: point density texture doesn't bake. --- source/blender/render/intern/source/convertblender.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'source') diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 7782077604d..b385b507707 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -5778,6 +5778,14 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, if(re->r.mode & R_RAYTRACE) makeraytree(re); + /* point density texture */ + if(!re->test_break(re->tbh)) + make_pointdensities(re); + + /* voxel data texture */ + if(!re->test_break(re->tbh)) + make_voxeldata(re); + /* occlusion */ if((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && !re->test_break(re->tbh)) if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX) -- cgit v1.2.3 From 71692e802fc50ad9dd76659d2868843e708dbd40 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 26 Jul 2011 07:39:00 +0000 Subject: py api: - added menu templates - move template menu into the header of the text editor (so users will find more easily) - updated mathutils examples, switching the order of multiplication. --- source/blenderplayer/bad_level_call_stubs/stubs.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source') diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 7bf5fe9dde3..548d272ffd2 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -136,7 +136,6 @@ int RE_RenderInProgress(struct Render *re){return 0;} struct Scene *RE_GetScene(struct Render *re){return (struct Scene *) NULL;} void RE_Database_Free(struct Render *re){} void RE_FreeRender(struct Render *re){} -void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr){} void RE_DataBase_GetView(struct Render *re, float mat[][4]){} int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta){return 0;} float texture_value_blend(float tex, float out, float fact, float facg, int blendtype, int flip){return 0.0f;} -- cgit v1.2.3 From 9e1a5531274e6b00b877ef924994ceae8ba956e3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 26 Jul 2011 07:41:14 +0000 Subject: set the development cycle to 'beta'. --- source/blender/blenkernel/BKE_blender.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 25fb6f9f9ff..18f6ad21333 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -53,7 +53,7 @@ extern "C" { /* can be left blank, otherwise a,b,c... etc with no quotes */ #define BLENDER_VERSION_CHAR a /* alpha/beta/rc/release, docs use this */ -#define BLENDER_VERSION_CYCLE release +#define BLENDER_VERSION_CYCLE beta struct ListBase; struct MemFile; -- cgit v1.2.3 From 7c9033d606a35dd4311e9f84b06b013e5cb7712a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 26 Jul 2011 08:13:27 +0000 Subject: Fix #28087: Opening files in the text editor ignores the last newline '\n' It was tricky conversion of file buffer to text lines. Should work fine now. --- source/blender/blenkernel/intern/text.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index da329503c9f..56723476251 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -400,7 +400,13 @@ Text *add_text(const char *file, const char *relpath) llen++; } - if (llen!=0 || ta->nlines==0) { + /* create new line in cases: + - rest of line (if last line in file hasn't got \n terminator). + in this case content of such line would be used to fill text line buffer + - file is empty. in this case new line is needed to start editing from. + - last characted in buffer is \n. in this case new line is needed to + deal with newline at end of file. (see [#28087]) (sergey) */ + if (llen!=0 || ta->nlines==0 || buffer[len-1]=='\n') { tmp= (TextLine*) MEM_mallocN(sizeof(TextLine), "textline"); tmp->line= (char*) MEM_mallocN(llen+1, "textline_string"); tmp->format= NULL; -- cgit v1.2.3 From 06ae122f604a00ebe57903439a2a0cedd0f3ffca Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 26 Jul 2011 09:19:51 +0000 Subject: include menu ID's in tooltips when python tips are enabled, there was no way to find the ID of a menu which become annoying if you wanted to reference it from a script. --- source/blender/editors/interface/interface_regions.c | 11 +++++++++++ source/blender/makesrna/intern/rna_wm.c | 2 +- source/blender/windowmanager/WM_api.h | 1 + source/blender/windowmanager/intern/wm.c | 6 ++++++ 4 files changed, 19 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 62043f240e4..9e7717260e6 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -484,6 +484,17 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) } } } + else if (ELEM(but->type, MENU, PULLDOWN)) { + if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) { + if(but->menu_create_func && WM_menutype_contains((MenuType *)but->poin)) { + MenuType *mt= (MenuType *)but->poin; + BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", mt->idname); + data->color[data->totline]= 0x888888; + data->totline++; + } + } + + } assert(data->totline < MAX_TOOLTIP_LINES); diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 7ea4701dec3..73221c47c90 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -940,7 +940,7 @@ static StructRNA *rna_Operator_register(Main *bmain, ReportList *reports, void * rna_Operator_unregister(bmain, ot->ext.srna); } - /* create a new menu type */ + /* create a new operator type */ dummyot.ext.srna= RNA_def_struct(&BLENDER_RNA, dummyot.idname, "Operator"); RNA_def_struct_flag(dummyot.ext.srna, STRUCT_NO_IDPROPERTIES); /* operator properties are registered separately */ dummyot.ext.data= data; diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 67294a8eb53..e6325e2101a 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -272,6 +272,7 @@ void WM_operator_py_idname(char *to, const char *from); /* *************** menu types ******************** */ struct MenuType *WM_menutype_find(const char *idname, int quiet); int WM_menutype_add(struct MenuType* mt); +int WM_menutype_contains(struct MenuType* mt); void WM_menutype_freelink(struct MenuType* mt); void WM_menutype_free(void); diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index bcd5cf38f88..a535c0bc1f8 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -175,6 +175,12 @@ int WM_menutype_add(MenuType* mt) return 1; } +/* inefficient but only used for tooltip code */ +int WM_menutype_contains(MenuType* mt) +{ + return (mt != NULL && BLI_findindex(&menutypes, mt) != -1); +} + void WM_menutype_freelink(MenuType* mt) { BLI_freelinkN(&menutypes, mt); -- cgit v1.2.3 From 40353fe0d841e006d11ad5833eaedbc93fc0d608 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 26 Jul 2011 13:05:22 +0000 Subject: fix for NULL pointer crash with operator repeat, looks like error print got mixed up. --- source/blender/editors/util/undo.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index 8a6ec7f75db..a2381a208ef 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -358,19 +358,25 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) ret= 1; } } + else { + if (G.f & G_DEBUG) { + printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name); + } + } /* set region back */ CTX_wm_region_set(C, ar); } else { if (G.f & G_DEBUG) { - printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name); + printf("redo_cb: ED_undo_operator_repeat called with NULL 'op'\n"); } } return ret; } + void ED_undo_operator_repeat_cb(bContext *C, void *arg_op, void *UNUSED(arg_unused)) { ED_undo_operator_repeat(C, (wmOperator *)arg_op); -- cgit v1.2.3 From ca293c835f15e8b0d19116456c75ba971f02e16b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 26 Jul 2011 13:33:04 +0000 Subject: correct misc warnings --- source/blender/editors/object/object_add.c | 4 ++-- source/blender/editors/space_view3d/view3d_edit.c | 1 - source/blender/editors/transform/transform_snap.c | 5 +++++ source/blender/editors/uvedit/uvedit_ops.c | 4 ++-- source/blender/makesrna/intern/rna_object_api.c | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 7ca172c6945..f5f97c6a5f6 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -806,14 +806,14 @@ static int object_delete_exec(bContext *C, wmOperator *UNUSED(op)) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); - int islamp= 0; + /* int islamp= 0; */ /* UNUSED */ if(CTX_data_edit_object(C)) return OPERATOR_CANCELLED; CTX_DATA_BEGIN(C, Base*, base, selected_bases) { - if(base->object->type==OB_LAMP) islamp= 1; + /* if(base->object->type==OB_LAMP) islamp= 1; */ /* deselect object -- it could be used in other scenes */ base->object->flag &= ~SELECT; diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 9ff73767b4c..d563c07baf3 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -129,7 +129,6 @@ void ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d) } else { ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist); - root_parent= v3d->camera; DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB); WM_main_add_notifier(NC_OBJECT|ND_TRANSFORM, v3d->camera); } diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index d9d9b0f9102..a4307ea336d 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -1944,6 +1944,11 @@ static void applyGrid(TransInfo *t, float *val, int max_index, float fac[3], Gea int i; float asp[3] = {1.0f, 1.0f, 1.0f}; // TODO: Remove hard coded limit here (3) + if(max_index > 3) { + printf("applyGrid: invalid index %d, clamping\n", max_index); + max_index= 3; + } + // Early bailing out if no need to snap if (fac[action] == 0.0f) return; diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index d0393c970a6..70659994c55 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1060,8 +1060,8 @@ static void weld_align_uv(bContext *C, int tool) if(tool == 's' || tool == 't' || tool == 'u') { /* pass 1&2 variables */ int i, j; - int starttmpl= -1, connectedtostarttmpl, startcorner; - int endtmpl= -1, connectedtoendtmpl, endcorner; + int starttmpl= -1, connectedtostarttmpl= -1, startcorner; + int endtmpl= -1, connectedtoendtmpl= -1, endcorner; MTFace *startface, *endface; int itmpl, jtmpl; EditVert *eve; diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 9018fd8c71a..21fa28af01a 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -544,7 +544,7 @@ void RNA_api_object(StructRNA *srna) /* location of point for test and max distance */ parm= RNA_def_float_vector(func, "point", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4); RNA_def_property_flag(parm, PROP_REQUIRED); - parm= RNA_def_float(func, "max_dist", sqrt(FLT_MAX), 0.0, FLT_MAX, "", "", 0.0, FLT_MAX); + RNA_def_float(func, "max_dist", sqrt(FLT_MAX), 0.0, FLT_MAX, "", "", 0.0, FLT_MAX); /* return location and normal */ parm= RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "The location on the object closest to the point", -1e4, 1e4); -- cgit v1.2.3 From 3e81de486a648d06660e3cc2355698b1c27965a5 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 26 Jul 2011 16:01:09 +0000 Subject: RNA: function calls with optional parameters were not giving correct default values for arrays. --- source/blender/makesrna/intern/rna_access.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index d9fbdd7caf2..dcf2400b9ba 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -4407,15 +4407,15 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE if(!(parm->flag & PROP_REQUIRED) && !(parm->flag & PROP_DYNAMIC)) { switch(parm->type) { case PROP_BOOLEAN: - if(parm->arraydimension) memcpy(data, &((BooleanPropertyRNA*)parm)->defaultarray, size); + if(parm->arraydimension) memcpy(data, ((BooleanPropertyRNA*)parm)->defaultarray, size); else memcpy(data, &((BooleanPropertyRNA*)parm)->defaultvalue, size); break; case PROP_INT: - if(parm->arraydimension) memcpy(data, &((IntPropertyRNA*)parm)->defaultarray, size); + if(parm->arraydimension) memcpy(data, ((IntPropertyRNA*)parm)->defaultarray, size); else memcpy(data, &((IntPropertyRNA*)parm)->defaultvalue, size); break; case PROP_FLOAT: - if(parm->arraydimension) memcpy(data, &((FloatPropertyRNA*)parm)->defaultarray, size); + if(parm->arraydimension) memcpy(data, ((FloatPropertyRNA*)parm)->defaultarray, size); else memcpy(data, &((FloatPropertyRNA*)parm)->defaultvalue, size); break; case PROP_ENUM: -- cgit v1.2.3 From a460299b08303d3cfbd9b83d036d87351cb52693 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 26 Jul 2011 19:47:56 +0000 Subject: - bugfix for icon listview where the icons would only wrap once - also quiet some clang warnings --- source/blender/editors/interface/interface_handlers.c | 11 +++++------ source/blender/editors/interface/interface_layout.c | 2 +- source/blender/editors/interface/interface_panel.c | 4 ++-- source/blender/editors/interface/interface_templates.c | 3 +-- 4 files changed, 9 insertions(+), 11 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index e9ec4ccc66d..c5275ea98b5 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -1879,7 +1879,6 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle if(but->autocomplete_func || data->searchbox) { changed= ui_textedit_autocomplete(C, but, data); update= 1; /* do live update for tab key */ - retval= WM_UI_HANDLER_BREAK; } /* the hotkey here is not well defined, was G.qual so we check all */ else if(event->shift || event->ctrl || event->alt || event->oskey) { @@ -2325,8 +2324,8 @@ static float ui_numedit_apply_snapf(uiBut *but, float tempf, float softmin, floa if(fac != 1.0f) { /* snap in unit-space */ tempf /= fac; - softmin /= fac; - softmax /= fac; + /* softmin /= fac; */ /* UNUSED */ + /* softmax /= fac; */ /* UNUSED */ softrange /= fac; } @@ -3469,13 +3468,13 @@ static int ui_numedit_but_CURVE(uiBut *but, uiHandleButtonData *data, int snap, CurveMapping *cumap= (CurveMapping*)but->poin; CurveMap *cuma= cumap->cm+cumap->cur; CurveMapPoint *cmp= cuma->curve; - float fx, fy, zoomx, zoomy, offsx, offsy; + float fx, fy, zoomx, zoomy /*, offsx, offsy */ /* UNUSED */; int a, changed= 0; zoomx= (but->x2-but->x1)/(cumap->curr.xmax-cumap->curr.xmin); zoomy= (but->y2-but->y1)/(cumap->curr.ymax-cumap->curr.ymin); - offsx= cumap->curr.xmin; - offsy= cumap->curr.ymin; + /* offsx= cumap->curr.xmin; */ + /* offsy= cumap->curr.ymin; */ if(snap) { float d[2]; diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 79a90fb9d1d..b309198d937 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1615,7 +1615,7 @@ static void ui_litem_layout_row(uiLayout *litem) int x, y, w, tot, totw, neww, itemw, minw, itemh, offset; int fixedw, freew, fixedx, freex, flag= 0, lastw= 0; - x= litem->x; + /* x= litem->x; */ /* UNUSED */ y= litem->y; w= litem->w; totw= 0; diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 9ed3cabb4cb..3b20533dcd4 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -575,8 +575,8 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, rcti *rect) ui_draw_tria_rect(&itemrect, 'h'); else ui_draw_tria_rect(&itemrect, 'v'); - - + + (void)ofsx; } /************************** panel alignment *************************/ diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index f388710d5b8..34315494e14 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -2197,7 +2197,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char * /* create list items */ RNA_PROP_BEGIN(ptr, itemptr, prop) { /* create button */ - if(i == 9) + if(!(i % 9)) row= uiLayoutRow(col, 0); icon= list_item_icon_get(C, &itemptr, rnaicon, 1); @@ -2212,7 +2212,6 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char * } else if(listtype == 'c') { /* compact layout */ - found= 0; row= uiLayoutRow(layout, 1); -- cgit v1.2.3 From 955ba3f7fb5bca6d454ee6a1158cbdc094d6d060 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 26 Jul 2011 20:22:54 +0000 Subject: * Fixed a typo in the code (uiLayoutItemSplt -> uiLayoutItemSplit) --- source/blender/editors/interface/interface_layout.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index b309198d937..2f0bcc9d5b4 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -149,10 +149,10 @@ typedef struct uiLayoutItemBx { uiBut *roundbox; } uiLayoutItemBx; -typedef struct uiLayoutItemSplt { +typedef struct uiLayoutItemSplit { uiLayout litem; float percentage; -} uiLayoutItemSplt; +} uiLayoutItemSplit; typedef struct uiLayoutItemRoot { uiLayout litem; @@ -2020,7 +2020,7 @@ static void ui_litem_estimate_split(uiLayout *litem) static void ui_litem_layout_split(uiLayout *litem) { - uiLayoutItemSplt *split= (uiLayoutItemSplt*)litem; + uiLayoutItemSplit *split= (uiLayoutItemSplit*)litem; uiItem *item; float percentage; const int tot= BLI_countlist(&litem->items); @@ -2242,9 +2242,9 @@ uiLayout *uiLayoutOverlap(uiLayout *layout) uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, int align) { - uiLayoutItemSplt *split; + uiLayoutItemSplit *split; - split= MEM_callocN(sizeof(uiLayoutItemSplt), "uiLayoutItemSplt"); + split= MEM_callocN(sizeof(uiLayoutItemSplit), "uiLayoutItemSplit"); split->litem.item.type= ITEM_LAYOUT_SPLIT; split->litem.root= layout->root; split->litem.align= align; -- cgit v1.2.3 From 48a64ffa702b0b7599aa8d8071d4a2265e9ba122 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 27 Jul 2011 06:55:20 +0000 Subject: more minor warning cleanups and improve error reporting if text fails to save. --- source/blender/blenkernel/intern/seqeffects.c | 2 +- source/blender/blenkernel/intern/text.c | 2 ++ source/blender/editors/armature/editarmature.c | 2 -- source/blender/editors/space_node/node_draw.c | 13 +++++++------ .../blender/editors/space_sequencer/sequencer_add.c | 6 +++--- source/blender/editors/space_text/text_ops.c | 21 +++++++++++++-------- source/blender/gpu/intern/gpu_material.c | 2 +- 7 files changed, 27 insertions(+), 21 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index fbb5a77fa04..8c19b0c15c3 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -2373,7 +2373,7 @@ static void RVBlurBitmap2_float ( float* map, int width,int height, /* Blancmange (bmange@airdmhor.gen.nz) */ k = -1.0f/(2.0f*(float)M_PI*blur*blur); - fval=0; + for (ix = 0;ix< halfWidth;ix++){ weight = (float)exp(k*(ix*ix)); filter[halfWidth - ix] = weight; diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 56723476251..2c507370288 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -1423,6 +1423,8 @@ void txt_insert_buf(Text *text, const char *in_buffer) } undoing= u; + + (void)count; } /******************/ diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 20352206121..628cdbf21e9 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -1478,10 +1478,8 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, wmEvent *e bArmature *arm; EditBone *bone, *curBone, *next; int extend= RNA_boolean_get(op->ptr, "extend"); - ARegion *ar; Object *obedit= CTX_data_edit_object(C); arm= obedit->data; - ar= CTX_wm_region(C); view3d_operator_needs_opengl(C); diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index cd1fa5c16a7..950b3c72fe7 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -781,14 +781,15 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, ""); } { /* always hide/reveal unused sockets */ - int shade; - - iconofs-=iconbutw; // XXX re-enable - /*if(node_has_hidden_sockets(node)) + /* int shade; + if(node_has_hidden_sockets(node)) shade= -40; - else*/ - shade= -90; + else + shade= -90; */ + + iconofs-=iconbutw; + uiDefIconBut(node->block, LABEL, B_REDR, ICON_PLUS, iconofs, rct->ymax-NODE_DY, iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, ""); } diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index f6e3dc3dd0a..36e334990cb 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -303,7 +303,7 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad Scene *scene= CTX_data_scene(C); /* only for sound */ Editing *ed= seq_give_editing(scene, TRUE); SeqLoadInfo seq_load; - Sequence *seq; + /* Sequence *seq; */ /* UNUSED */ int tot_files; seq_load_operator_info(&seq_load, op); @@ -324,13 +324,13 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad RNA_string_get(&itemptr, "name", file_only); BLI_join_dirfile(seq_load.path, sizeof(seq_load.path), dir_only, file_only); - seq= seq_load_func(C, ed->seqbasep, &seq_load); + /* seq= */ seq_load_func(C, ed->seqbasep, &seq_load); } RNA_END; } else { /* single file */ - seq= seq_load_func(C, ed->seqbasep, &seq_load); + /* seq= */ seq_load_func(C, ed->seqbasep, &seq_load); } if (seq_load.tot_success==0) { diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 2bd6bd624df..13eb24ed1f2 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -36,6 +36,7 @@ #include #include /* ispunct */ #include +#include #include "MEM_guardedalloc.h" @@ -449,15 +450,14 @@ static void txt_write_file(Text *text, ReportList *reports) FILE *fp; TextLine *tmp; struct stat st; - int res; - char file[FILE_MAXDIR+FILE_MAXFILE]; + char filepath[FILE_MAXDIR+FILE_MAXFILE]; - BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE); - BLI_path_abs(file, G.main->name); + BLI_strncpy(filepath, text->name, FILE_MAXDIR+FILE_MAXFILE); + BLI_path_abs(filepath, G.main->name); - fp= fopen(file, "w"); + fp= fopen(filepath, "w"); if(fp==NULL) { - BKE_report(reports, RPT_ERROR, "Unable to save file."); + BKE_reportf(reports, RPT_ERROR, "Unable to save \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error writing file"); return; } @@ -471,8 +471,13 @@ static void txt_write_file(Text *text, ReportList *reports) fclose (fp); - res= stat(file, &st); - text->mtime= st.st_mtime; + if(stat(filepath, &st) == 0) { + text->mtime= st.st_mtime; + } + else { + text->mtime= 0; + BKE_reportf(reports, RPT_WARNING, "Unable to stat \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error starrng file"); + } if(text->flags & TXT_ISDIRTY) text->flags ^= TXT_ISDIRTY; diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 3804aad6848..806c70d841f 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -671,7 +671,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la i = is; GPU_link(mat, "shade_visifac", i, visifac, shi->refl, &i); - vn = shi->vn; + /*if(ma->mode & MA_TANGENT_VN) GPU_link(mat, "shade_tangent_v_spec", GPU_attribute(CD_TANGENT, ""), &vn);*/ -- cgit v1.2.3 From 46cea372669f25b691fd90dc792a1fee33e36887 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 27 Jul 2011 07:22:31 +0000 Subject: fix [#28066] Unchecking 'self project' messes up 'Snap to Vertex' this option is useful for all non-grid snapping modes (when in editmode) so make available in those cases too. --- source/blender/editors/transform/transform.h | 2 +- source/blender/editors/transform/transform_snap.c | 8 ++++---- source/blender/makesdna/DNA_scene_types.h | 2 +- source/blender/makesrna/intern/rna_scene.c | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index d8e750acb88..d8e42488787 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -96,7 +96,7 @@ typedef struct TransSnap { short modeSelect; short align; char project; - char project_self; + char snap_self; short peel; short status; float snapPoint[3]; /* snapping from this point */ diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index a4307ea336d..933d90ebbf2 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -392,7 +392,7 @@ static void initSnappingMode(TransInfo *t) } else { - t->tsnap.modeSelect = t->tsnap.project_self ? SNAP_ALL : SNAP_NOT_OBEDIT; + t->tsnap.modeSelect = t->tsnap.snap_self ? SNAP_ALL : SNAP_NOT_OBEDIT; } } /* Particles edit mode*/ @@ -458,9 +458,9 @@ void initSnapping(TransInfo *t, wmOperator *op) t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project"); } - if (RNA_struct_find_property(op->ptr, "use_snap_project_self")) + if (RNA_struct_find_property(op->ptr, "use_snap_self")) { - t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project_self"); + t->tsnap.snap_self = RNA_boolean_get(op->ptr, "use_snap_self"); } } } @@ -473,7 +473,7 @@ void initSnapping(TransInfo *t, wmOperator *op) t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE); t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT); - t->tsnap.project_self = !((t->settings->snap_flag & SCE_SNAP_PROJECT_NO_SELF) == SCE_SNAP_PROJECT_NO_SELF); + t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) == SCE_SNAP_NO_SELF); t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT); } diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 8203a4dd77c..2211f93a8ae 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1074,7 +1074,7 @@ typedef struct Scene { #define SCE_SNAP_ROTATE 2 #define SCE_SNAP_PEEL_OBJECT 4 #define SCE_SNAP_PROJECT 8 -#define SCE_SNAP_PROJECT_NO_SELF 16 +#define SCE_SNAP_NO_SELF 16 /* toolsettings->snap_target */ #define SCE_SNAP_TARGET_CLOSEST 0 #define SCE_SNAP_TARGET_CENTER 1 diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index d9475eaa683..f4028e45e96 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1178,9 +1178,9 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_ui_icon(prop, ICON_RETOPO, 0); RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */ - prop= RNA_def_property(srna, "use_snap_project_self", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_PROJECT_NO_SELF); - RNA_def_property_ui_text(prop, "Project to Self", "Project into its self (editmode)"); + prop= RNA_def_property(srna, "use_snap_self", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_NO_SELF); + RNA_def_property_ui_text(prop, "Project to Self", "Snap onto its self (editmode)"); RNA_def_property_ui_icon(prop, ICON_ORTHO, 0); RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */ -- cgit v1.2.3 From 3b6cb504b199471d0a3c80b917d16b11827ae84e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 27 Jul 2011 13:03:56 +0000 Subject: minor warning fixes for clang-static-checker --- source/blender/blenkernel/intern/cdderivedmesh.c | 2 ++ source/blender/blenkernel/intern/customdata.c | 1 - source/blender/editors/transform/transform_snap.c | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 3abfa05e1fd..662c872b7f1 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1287,6 +1287,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang); offset += sizeof(float)*4; } + (void)offset; } curface++; if(mface->v4) { @@ -1327,6 +1328,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang); offset += sizeof(float)*4; } + (void)offset; } curface++; i++; diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 45faba8439c..8d19322c0db 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -466,7 +466,6 @@ static void layerInterp_mdisps(void **sources, float *UNUSED(weights), MDisps tris[2]; int vindex[4] = {0}; - S = 0; for(i = 0; i < 2; i++) for(y = 0; y < 4; y++) for(x = 0; x < 4; x++) diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 933d90ebbf2..f677e1ac6b4 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -1944,9 +1944,9 @@ static void applyGrid(TransInfo *t, float *val, int max_index, float fac[3], Gea int i; float asp[3] = {1.0f, 1.0f, 1.0f}; // TODO: Remove hard coded limit here (3) - if(max_index > 3) { + if(max_index > 2) { printf("applyGrid: invalid index %d, clamping\n", max_index); - max_index= 3; + max_index= 2; } // Early bailing out if no need to snap -- cgit v1.2.3 From 7e466266d36f326798de150e7d7d27a81a0e9ee5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 27 Jul 2011 17:49:35 +0000 Subject: fix [#28098] Continuous Grab does not work for movement of the "Backdrop" in the Node Editor --- source/blender/editors/space_node/node_edit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 4230a43d2ec..18d4d85e3ff 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1101,7 +1101,7 @@ void NODE_OT_backimage_move(wmOperatorType *ot) ot->cancel= snode_bg_viewmove_cancel; /* flags */ - ot->flag= OPTYPE_BLOCKING; + ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER; } static int backimage_zoom(bContext *C, wmOperator *op) -- cgit v1.2.3 From f532ccedf5c3898a5726ba4295297ebb58ba4909 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 27 Jul 2011 20:36:11 +0000 Subject: refix for #27912: crash after mesh.materials.pop() (fixed wrongly on rev. 38299 - patch by Benoit Boilsee bug spotted while reviewing a patch. things are working now --- source/blender/blenkernel/intern/material.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 962c7fd5e86..3f01c55e935 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -550,7 +550,7 @@ Material *material_pop_id(ID *id, int index) Material **mat; if(index + 1 != (*totcol)) - memmove((*matar), (*matar) + 1, sizeof(void *) * ((*totcol) - (index + 1))); + memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1))); (*totcol)--; -- cgit v1.2.3 From 7e87165eea9af2e0e9b9e2192341a5a0842bc81e Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Thu, 28 Jul 2011 00:08:03 +0000 Subject: Don't write library_materials tag when there are no materials. --- source/blender/collada/MaterialExporter.cpp | 32 +++++++++++++++++++++++++---- source/blender/collada/MaterialExporter.h | 3 +++ 2 files changed, 31 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/collada/MaterialExporter.cpp b/source/blender/collada/MaterialExporter.cpp index a44fa6802f2..9d29177578d 100644 --- a/source/blender/collada/MaterialExporter.cpp +++ b/source/blender/collada/MaterialExporter.cpp @@ -37,12 +37,36 @@ MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::Li void MaterialsExporter::exportMaterials(Scene *sce, bool export_selected) { - openLibrary(); + if(hasMaterials(sce)) { + openLibrary(); - MaterialFunctor mf; - mf.forEachMaterialInScene(sce, *this, export_selected); + MaterialFunctor mf; + mf.forEachMaterialInScene(sce, *this, export_selected); - closeLibrary(); + closeLibrary(); + } +} + + +bool MaterialsExporter::hasMaterials(Scene *sce) +{ + Base *base = (Base *)sce->base.first; + + while(base) { + Object *ob= base->object; + int a; + for(a = 0; a < ob->totcol; a++) + { + Material *ma = give_current_material(ob, a+1); + + // no material, but check all of the slots + if (!ma) continue; + + return true; + } + base= base->next; + } + return false; } void MaterialsExporter::operator()(Material *ma, Object *ob) diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h index 0a7a276d857..c080e4b0596 100644 --- a/source/blender/collada/MaterialExporter.h +++ b/source/blender/collada/MaterialExporter.h @@ -51,6 +51,9 @@ public: MaterialsExporter(COLLADASW::StreamWriter *sw); void exportMaterials(Scene *sce, bool export_selected); void operator()(Material *ma, Object *ob); + +private: + bool hasMaterials(Scene *sce); }; // used in forEachMaterialInScene -- cgit v1.2.3 From a5631dba8902b8f6732b88ddcc2ef2ba36c49b75 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 28 Jul 2011 02:15:58 +0000 Subject: only initialize snap from the scene settings for view3d and image spaces since snap in the 3D view was enabling snap in the graph editor and sequencer without a button to disable it in those spaces. --- source/blender/editors/transform/transform_snap.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index f677e1ac6b4..ca89670dedb 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -467,14 +467,17 @@ void initSnapping(TransInfo *t, wmOperator *op) /* use scene defaults only when transform is modal */ else if (t->flag & T_MODAL) { - if (ts->snap_flag & SCE_SNAP) { - t->modifiers |= MOD_SNAP; - } + if(ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE)) + { + if (ts->snap_flag & SCE_SNAP) { + t->modifiers |= MOD_SNAP; + } - t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE); - t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT); - t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) == SCE_SNAP_NO_SELF); - t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT); + t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE); + t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT); + t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) == SCE_SNAP_NO_SELF); + t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT); + } } t->tsnap.target = snap_target; -- cgit v1.2.3 From 784a68e8f1047de0e71beabbc44654ccad743910 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 28 Jul 2011 03:44:17 +0000 Subject: sequencer add strips now check for overlap by default (option can be disabled for python when this can become problematic for automation). --- .../editors/space_sequencer/sequencer_add.c | 33 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index 36e334990cb..b105b2507ab 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -101,6 +101,8 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag) RNA_def_boolean(ot->srna, "replace_sel", 1, "Replace Selection", "replace the current selection"); + RNA_def_boolean(ot->srna, "overlap", 0, "Allow Overlap", "Don't correct overlap on new sequence strips"); + if(flag & SEQPROP_FILES) RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, "Files", ""); } @@ -250,7 +252,11 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op) seq_active_set(scene, seq); seq->flag |= SELECT; } - + + if(RNA_boolean_get(op->ptr, "overlap") == FALSE) { + if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene); + } + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); return OPERATOR_FINISHED; @@ -303,8 +309,9 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad Scene *scene= CTX_data_scene(C); /* only for sound */ Editing *ed= seq_give_editing(scene, TRUE); SeqLoadInfo seq_load; - /* Sequence *seq; */ /* UNUSED */ + Sequence *seq; int tot_files; + const short overlap= RNA_boolean_get(op->ptr, "overlap"); seq_load_operator_info(&seq_load, op); @@ -324,13 +331,21 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad RNA_string_get(&itemptr, "name", file_only); BLI_join_dirfile(seq_load.path, sizeof(seq_load.path), dir_only, file_only); - /* seq= */ seq_load_func(C, ed->seqbasep, &seq_load); + seq= seq_load_func(C, ed->seqbasep, &seq_load); + + if(overlap == FALSE) { + if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene); + } } RNA_END; } else { /* single file */ - /* seq= */ seq_load_func(C, ed->seqbasep, &seq_load); + seq= seq_load_func(C, ed->seqbasep, &seq_load); + + if(overlap == FALSE) { + if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene); + } } if (seq_load.tot_success==0) { @@ -506,7 +521,11 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op) /* last active name */ strncpy(ed->act_imagedir, strip->dir, FILE_MAXDIR-1); - + + if(RNA_boolean_get(op->ptr, "overlap") == FALSE) { + if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene); + } + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); return OPERATOR_FINISHED; @@ -656,7 +675,9 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) } } - if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene); + if(RNA_boolean_get(op->ptr, "overlap") == FALSE) { + if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene); + } update_changed_seq_and_deps(scene, seq, 1, 1); /* runs calc_sequence */ -- cgit v1.2.3 From 2dc826f083c2209aab83981a8d1dc39c621e0841 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 28 Jul 2011 11:16:10 +0000 Subject: New option for multires modifier: Subdivide UVs Enabled by default and also enabled for older filesm so there should be no regressions. In some cases it's useful to not use subdivided uvs for multires. --- source/blender/blenkernel/intern/multires.c | 18 ++++++++++-------- source/blender/makesdna/DNA_modifier_types.h | 1 + source/blender/makesrna/intern/rna_modifier.c | 5 +++++ 3 files changed, 16 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index d833c184274..88a670ecb22 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -465,12 +465,13 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0); } -static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal) +static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal, int plain_uv) { SubsurfModifierData smd= {{NULL}}; smd.levels = smd.renderLevels = lvl; - smd.flags |= eSubsurfModifierFlag_SubsurfUv; + if(!plain_uv) + smd.flags |= eSubsurfModifierFlag_SubsurfUv; if(simple) smd.subdivType = ME_SIMPLE_SUBSURF; if(optimal) @@ -591,7 +592,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob) /* subdivide the mesh to highest level without displacements */ cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0); + origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv); cddm->release(cddm); /* calc disps */ @@ -626,7 +627,7 @@ static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl /* create subsurf DM from original mesh at high level */ cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0); + highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv); /* create multires DM from original mesh at low level */ lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple); @@ -830,7 +831,7 @@ static void multiresModifier_update(DerivedMesh *dm) else cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0); + highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv); /* create multires DM from original mesh and displacements */ lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple); @@ -884,7 +885,7 @@ static void multiresModifier_update(DerivedMesh *dm) else cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0); + subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv); cddm->release(cddm); multiresModifier_disp_run(dm, me, 1, 0, subdm->getGridData(subdm), mmd->totlvl); @@ -927,7 +928,8 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca return dm; result = subsurf_dm_create_local(ob, dm, lvl, - mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges); + mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges, + mmd->flags & eMultiresModifierFlag_PlainUv); if(!local_mmd) { ccgdm = (CCGDerivedMesh*)result; @@ -1633,7 +1635,7 @@ static void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3]) MEM_freeN(vertCos); /* scaled ccgDM for tangent space of object with applied scale */ - dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0); + dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv); cddm->release(cddm); /*numGrids= dm->getNumGrids(dm);*/ /*UNUSED*/ diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index d2d8e014015..3787675f339 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -624,6 +624,7 @@ typedef struct MultiresModifierData { typedef enum { eMultiresModifierFlag_ControlEdges = (1<<0), + eMultiresModifierFlag_PlainUv = (1<<1), } MultiresModifierFlag; typedef struct FluidsimModifierData { diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index d2c1b862fee..ba655915fb6 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -805,6 +805,11 @@ static void rna_def_modifier_multires(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flags", eMultiresModifierFlag_ControlEdges); RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "use_subsurf_uv", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flags", eMultiresModifierFlag_PlainUv); + RNA_def_property_ui_text(prop, "Subdivide UVs", "Use subsurf to subdivide UVs"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); } static void rna_def_modifier_lattice(BlenderRNA *brna) -- cgit v1.2.3 From b948459031dd6d0f1ccc81d607a589fd7d1e8ab2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 28 Jul 2011 12:17:24 +0000 Subject: fix [#28096] Custom gradient for weightpainting in mask mode not working properly. --- source/blender/editors/interface/resources.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 3f825762d74..56ef5e9e8cc 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -1115,10 +1115,11 @@ void init_userdef_do_versions(void) } if(U.pad_rot_angle==0) U.pad_rot_angle= 15; - - if(U.flag & USER_CUSTOM_RANGE) - vDM_ColorBand_store(&U.coba_weight); /* signal for derivedmesh to use colorband */ - + + /* signal for derivedmesh to use colorband */ + /* run incase this was on and is now off in the user prefs [#28096] */ + vDM_ColorBand_store((U.flag & USER_CUSTOM_RANGE) ? (&U.coba_weight):NULL); + if (bmain->versionfile <= 191) { strcpy(U.plugtexdir, U.textudir); strcpy(U.sounddir, "/"); -- cgit v1.2.3 From b8dcf3a662f35fef388294c635386b952f6bf981 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 28 Jul 2011 14:28:27 +0000 Subject: Fix part of #27944: color managment discrepancy in GLSL materials with nodes. --- source/blender/gpu/intern/gpu_material.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 806c70d841f..274884000db 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -1371,9 +1371,6 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr) mat->obcolalpha = 1; GPU_link(mat, "shade_alpha_obcolor", shr->combined, GPU_builtin(GPU_OBCOLOR), &shr->combined); } - - if(gpu_do_color_management(mat)) - GPU_link(mat, "linearrgb_to_srgb", shr->combined, &shr->combined); } static GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma) @@ -1408,6 +1405,10 @@ GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma) GPU_material_output_link(mat, outlink); } + if(gpu_do_color_management(mat)) + if(mat->outlink) + GPU_link(mat, "linearrgb_to_srgb", mat->outlink, &mat->outlink); + /*if(!GPU_material_construct_end(mat)) { GPU_material_free(mat); mat= NULL; -- cgit v1.2.3 From 6d2754e07d0785e30c75cf6498b94f1fb5f54f46 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 28 Jul 2011 15:51:59 +0000 Subject: Fix #27719: custom RNA properties fail to update drivers. Hopefully this is not too slow, but now we do a dependency graph tag also for these in addition to regular ID properties, not sure how to get around it. --- source/blender/makesrna/intern/rna_access.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index dcf2400b9ba..e71be8c153e 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -1364,13 +1364,13 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR if(prop->noteflag) WM_main_add_notifier(prop->noteflag, ptr->id.data); } - else { + + if(!is_rna || (prop->flag & PROP_IDPROPERTY)) { /* WARNING! This is so property drivers update the display! * not especially nice */ DAG_id_tag_update(ptr->id.data, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME); WM_main_add_notifier(NC_WINDOW, NULL); } - } /* must keep in sync with 'rna_property_update' -- cgit v1.2.3 From 26589497529ca3c8da85391d4976d286a371e258 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 29 Jul 2011 01:24:03 +0000 Subject: pep8 cleanup, also print message when attempting to run in animation player mode. --- source/blender/windowmanager/intern/wm_init_exit.c | 3 ++- source/creator/creator.c | 7 +++++-- source/tests/check_deprecated.py | 13 +++++++++---- 3 files changed, 16 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index ed28696ef69..4c280fe4341 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -155,7 +155,8 @@ void WM_init(bContext *C, int argc, const char **argv) BPY_python_start(argc, argv); BPY_driver_reset(); - BPY_app_handlers_reset(); + BPY_app_handlers_reset(); /* causes addon callbacks to be freed [#28068], + * but this is actually what we want. */ BPY_modules_load_user(C); #else (void)argc; /* unused */ diff --git a/source/creator/creator.c b/source/creator/creator.c index fddd6d286db..36209dbda78 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -434,9 +434,12 @@ static int playback_mode(int UNUSED(argc), const char **UNUSED(argv), void *UNUS { /* not if -b was given first */ if (G.background == 0) { - -// XXX playanim(argc, argv); /* not the same argc and argv as before */ +#if 0 /* TODO, bring player back? */ + playanim(argc, argv); /* not the same argc and argv as before */ +#else + fprintf(stderr, "Playback mode not supported in blender 2.5x\n"); exit(0); +#endif } return -2; diff --git a/source/tests/check_deprecated.py b/source/tests/check_deprecated.py index 11c7ce646b9..856e1f6d272 100644 --- a/source/tests/check_deprecated.py +++ b/source/tests/check_deprecated.py @@ -28,6 +28,7 @@ SKIP_DIRS = ("extern", os.path.join("source", "tests"), # not this dir ) + def is_c_header(filename): ext = splitext(filename)[1] return (ext in (".h", ".hpp", ".hxx")) @@ -41,13 +42,16 @@ def is_c(filename): def is_c_any(filename): return is_c(filename) or is_c_header(filename) + def is_py(filename): ext = splitext(filename)[1] return (ext == ".py") + def is_source_any(filename): return is_c_any(filename) or is_py(filename) + def source_list(path, filename_check=None): for dirpath, dirnames, filenames in os.walk(path): @@ -67,7 +71,7 @@ def deprecations(): /* *DEPRECATED* 2011/7/17 bgl.Buffer.list info text */ Or... - + # *DEPRECATED* 2010/12/22 some.py.func more info */ """ @@ -105,12 +109,12 @@ def deprecations(): if len(data) != 3: print(" poorly formatting line:\n" " %r:%d\n" - " %s"% + " %s" % (fn, i + 1, l) ) else: data = datetime.datetime(*tuple([int(w) for w in data])) - + deprecations_ls.append((data, (fn, i + 1), info)) except: print("Error file - %r:%d" % (fn, i + 1)) @@ -123,10 +127,11 @@ def deprecations(): return deprecations_ls + def main(): import datetime now = datetime.datetime.now()\ - + deps = deprecations() print("\nAll deprecations...") -- cgit v1.2.3 From fb738f4929e88b21ebcfb724ae3f460ef6e0f949 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Fri, 29 Jul 2011 07:14:03 +0000 Subject: When relinking node group outputs from sockets of different type, automatically change the output to the source type. Feature request by Daniel Salazar. --- source/blender/editors/space_node/node_edit.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source') diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 18d4d85e3ff..c719f749582 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -2216,6 +2216,12 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) /* we might need to remove a link */ if(in_out==SOCK_OUT) node_remove_extra_links(snode, link->tosock, link); + + /* when linking to group outputs, update the socket type */ + /* XXX this should all be part of a generic update system */ + if (!link->tonode) { + link->tosock->type = link->fromsock->type; + } } else if (outside_group_rect(snode) && (link->tonode || link->fromnode)) { /* automatically add new group socket */ -- cgit v1.2.3 From 99997ccd181a6fcae5288fbd67a8eb32c71e9e3e Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Fri, 29 Jul 2011 20:46:30 +0000 Subject: Fix for [#28117] Diffuse reflection IPO curve not imported correctly from 2.49b files --- source/blender/blenkernel/intern/ipo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 4f921f005f4..2ae6f533bd4 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -518,7 +518,7 @@ static const char *material_adrcodes_to_paths (int adrcode, int *array_index) return "alpha"; case MA_REF: - return "diffuse_reflection"; + return "diffuse_intensity"; case MA_EMIT: return "emit"; -- cgit v1.2.3 From 6a27da310c61b3372d565060506221a5afb9fe43 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Fri, 29 Jul 2011 20:59:46 +0000 Subject: While looking at the bug report, found some more issues... This is the result of RNA renaming at it's glance. ;-) --- source/blender/blenkernel/intern/ipo.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 2ae6f533bd4..104ce2b3b32 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -527,7 +527,7 @@ static const char *material_adrcodes_to_paths (int adrcode, int *array_index) return "ambient"; case MA_SPEC: - return "specular_reflection"; + return "specular_intensity"; case MA_HARD: return "specular_hardness"; @@ -551,13 +551,13 @@ static const char *material_adrcodes_to_paths (int adrcode, int *array_index) return "raytrace_mirror.fresnel"; case MA_FRESMIRI: - return "raytrace_mirror.fresnel_fac"; + return "raytrace_mirror.fresnel_factor"; case MA_FRESTRA: return "raytrace_transparency.fresnel"; case MA_FRESTRAI: - return "raytrace_transparency.fresnel_fac"; + return "raytrace_transparency.fresnel_factor"; case MA_ADD: return "halo.add"; -- cgit v1.2.3 From f66ec41b6a3b74f079c19494357c268e1ab39e85 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 30 Jul 2011 09:24:10 +0000 Subject: quiet some compiler warnings & fix possible (but unlikely) crash. also added GPLv2+ header to resources.c. --- source/blender/blenlib/intern/BLI_args.c | 6 ++++-- source/blender/editors/curve/editcurve.c | 15 ++++++++------ source/blender/editors/interface/interface_anim.c | 24 +++++++++++++++++++++++ source/blender/editors/interface/resources.c | 7 ++++--- source/blender/editors/object/object_relations.c | 6 +++--- 5 files changed, 44 insertions(+), 14 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c index 7bc93a3d3a0..5f31565d65b 100644 --- a/source/blender/blenlib/intern/BLI_args.c +++ b/source/blender/blenlib/intern/BLI_args.c @@ -290,8 +290,10 @@ void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void * } i += retval; } else if (retval == -1){ - if (a->key->pass != -1) - ba->passes[i] = pass; + if (a) { + if (a->key->pass != -1) + ba->passes[i] = pass; + } break; } } diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 06d88b16fa8..8b9477adf92 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -6544,12 +6544,15 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob) BLI_assert(!"invalid nurbs type"); return NULL; } - - /* always do: */ - nu->flag |= CU_SMOOTH; - - test2DNurb(nu); - + + BLI_assert(nu != NULL); + + if(nu) { /* should always be set */ + nu->flag |= CU_SMOOTH; + + test2DNurb(nu); + } + return nu; } diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 75e7ee701a2..03003173e20 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -1,3 +1,27 @@ +/* + * $Id: + * + * ***** 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): + * + * ***** END GPL LICENSE BLOCK ***** + */ + /** \file blender/editors/interface/interface_anim.c * \ingroup edinterface */ diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 56ef5e9e8cc..2b4003c7af0 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -1,6 +1,3 @@ -/** \file blender/editors/interface/resources.c - * \ingroup edinterface - */ /* * $Id$ * @@ -33,6 +30,10 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ +/** \file blender/editors/interface/resources.c + * \ingroup edinterface + */ + #include #include #include diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index f21241b6e7a..0fb7cf8b640 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -1096,7 +1096,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); View3D *v3d= CTX_wm_view3d(C); unsigned int lay, local; - int islamp= 0; + /* int islamp= 0; */ /* UNUSED */ lay= move_to_layer_init(C, op); lay &= 0xFFFFFF; @@ -1112,7 +1112,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) base->object->lay= lay; base->object->flag &= ~SELECT; base->flag &= ~SELECT; - if(base->object->type==OB_LAMP) islamp= 1; + /* if(base->object->type==OB_LAMP) islamp= 1; */ } CTX_DATA_END; } @@ -1124,7 +1124,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) local= base->lay & 0xFF000000; base->lay= lay + local; base->object->lay= lay; - if(base->object->type==OB_LAMP) islamp= 1; + /* if(base->object->type==OB_LAMP) islamp= 1; */ } CTX_DATA_END; } -- cgit v1.2.3 From d163ce55953bd04b42c2c79f6729e47228c01a9a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 30 Jul 2011 13:18:04 +0000 Subject: bpy fix for crash/assert on running dir() on a non collection property + some other minor corrections. --- source/blender/editors/transform/transform.c | 2 +- source/blender/makesrna/intern/rna_wm_api.c | 2 +- source/blender/python/intern/bpy_rna.c | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index eea77e36f7c..59e9e681e2b 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4659,7 +4659,7 @@ static int createSlideVerts(TransInfo *t) #define EDGE_SLIDE_MIN 30 if (len_squared_v2v2(start, end) < (EDGE_SLIDE_MIN * EDGE_SLIDE_MIN)) { if(ABS(start[0]-end[0]) + ABS(start[1]-end[1]) < 4.0f) { - /* even more exceptional case, points are ontop of eachother */ + /* even more exceptional case, points are ontop of each other */ end[0]= start[0]; end[1]= start[1] + EDGE_SLIDE_MIN; } diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c index e250cc84aa3..d44b68950f7 100644 --- a/source/blender/makesrna/intern/rna_wm_api.c +++ b/source/blender/makesrna/intern/rna_wm_api.c @@ -205,7 +205,7 @@ void RNA_api_operator(StructRNA *srna) /* check */ func= RNA_def_function(srna, "check", NULL); - RNA_def_function_ui_description(func, "Check the operator settings."); + RNA_def_function_ui_description(func, "Check the operator settings, return True to signal a change to redraw."); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); parm= RNA_def_pointer(func, "context", "Context", "", ""); RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 6e1b9c807f3..2dcfe3731c7 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -3262,11 +3262,15 @@ static PyObject *pyrna_prop_dir(BPy_PropertyRNA *self) * */ ret= PyList_New(0); - if (!BPy_PropertyRNA_CheckExact(self)) + if (!BPy_PropertyRNA_CheckExact(self)) { pyrna_dir_members_py(ret, (PyObject *)self); + } - if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) - pyrna_dir_members_rna(ret, &r_ptr); + if(RNA_property_type(self->prop) == PROP_COLLECTION) { + if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) { + pyrna_dir_members_rna(ret, &r_ptr); + } + } return ret; } -- cgit v1.2.3 From 805a169f7065222ce047d950c55b585b36bc4b24 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sat, 30 Jul 2011 15:45:27 +0000 Subject: Bugfix #28121 Linked Library objects or object->data should not allow to go to sculptmode. Also cleaned up mode menu with invalid entries then. --- source/blender/editors/screen/screen_ops.c | 2 +- source/blender/editors/space_view3d/view3d_header.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 68326edfb11..1410331700f 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -301,7 +301,7 @@ int ED_operator_object_active_editable(bContext *C) int ED_operator_object_active_editable_mesh(bContext *C) { Object *ob = ED_object_active_context(C); - return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->type == OB_MESH); + return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->type == OB_MESH && !(((ID *)ob->data)->lib)); } int ED_operator_object_active_editable_font(bContext *C) diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index ae80a554e08..5b95ae63e56 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -280,7 +280,8 @@ static char *view3d_modeselect_pup(Scene *scene) str += sprintf(str, formatstr, "Object Mode", OB_MODE_OBJECT, ICON_OBJECT_DATA); - if(ob==NULL) return string; + if(ob==NULL || ob->data==NULL) return string; + if(ob->id.lib || ((ID *)ob->data)->lib) return string; /* if active object is editable */ if ( ((ob->type == OB_MESH) -- cgit v1.2.3 From dfc661565a4c4d1d4caa3872fb5d7936fb1f0fd8 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Sat, 30 Jul 2011 23:16:22 +0000 Subject: patch [#27909] Added constants in bge.constraints by Solano Felicio (solano) + some changes in rst I named all the BGE modules with their actual names (e.g. Rasterizer, Video Texture, ...). so in the API index.html page they look more like the other Blender modules. I did the same for the bgl module. For bge.constraints this patch exposes the constants values for debug mode and createConstraints (they were hardcoded innts before). + making all the "todo" and #comments into rst comments (.. comments) Thanks Solano, it's great to get help to those tasks :) --- .../gameengine/Ketsji/KX_PyConstraintBinding.cpp | 30 +++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp index 12024657149..843dbe21995 100644 --- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -38,12 +38,18 @@ #include "KX_PhysicsObjectWrapper.h" #include "PHY_IPhysicsController.h" #include "PHY_IVehicle.h" +#include "PHY_DynamicTypes.h" #include "MT_Matrix3x3.h" #include "PyObjectPlus.h" +#include "LinearMath/btIDebugDraw.h" + #ifdef WITH_PYTHON +// macro copied from KX_PythonInit.cpp +#define KX_MACRO_addTypesToDict(dict, name, name2) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name2)); Py_DECREF(item) + // nasty glob variable to connect scripting language // if there is a better way (without global), please do so! static PHY_IPhysicsEnvironment* g_CurrentActivePhysicsEnvironment = NULL; @@ -662,6 +668,7 @@ PyObject* initPythonConstraintBinding() PyObject* ErrorObject; PyObject* m; PyObject* d; + PyObject* item; /* Use existing module where possible * be careful not to init any runtime vars after this */ @@ -683,7 +690,28 @@ PyObject* initPythonConstraintBinding() PyDict_SetItemString(d, "error", ErrorObject); Py_DECREF(ErrorObject); - // XXXX Add constants here + //Debug Modes constants to be used with setDebugMode() python function + KX_MACRO_addTypesToDict(d, DBG_NODEBUG, btIDebugDraw::DBG_NoDebug); + KX_MACRO_addTypesToDict(d, DBG_DRAWWIREFRAME, btIDebugDraw::DBG_DrawWireframe); + KX_MACRO_addTypesToDict(d, DBG_DRAWAABB, btIDebugDraw::DBG_DrawAabb); + KX_MACRO_addTypesToDict(d, DBG_DRAWFREATURESTEXT, btIDebugDraw::DBG_DrawFeaturesText); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONTACTPOINTS, btIDebugDraw::DBG_DrawContactPoints); + KX_MACRO_addTypesToDict(d, DBG_NOHELPTEXT, btIDebugDraw::DBG_NoHelpText); + KX_MACRO_addTypesToDict(d, DBG_DRAWTEXT, btIDebugDraw::DBG_DrawText); + KX_MACRO_addTypesToDict(d, DBG_PROFILETIMINGS, btIDebugDraw::DBG_ProfileTimings); + KX_MACRO_addTypesToDict(d, DBG_ENABLESATCOMPARISION, btIDebugDraw::DBG_EnableSatComparison); + KX_MACRO_addTypesToDict(d, DBG_DISABLEBULLETLCP, btIDebugDraw::DBG_DisableBulletLCP); + KX_MACRO_addTypesToDict(d, DBG_ENABLECDD, btIDebugDraw::DBG_EnableCCD); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTS, btIDebugDraw::DBG_DrawConstraints); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTLIMITS, btIDebugDraw::DBG_DrawConstraintLimits); + KX_MACRO_addTypesToDict(d, DBG_FASTWIREFRAME, btIDebugDraw::DBG_FastWireframe); + + //Constraint types to be used with createConstraint() python function + KX_MACRO_addTypesToDict(d, POINTTOPOINT_CONSTRAINT, PHY_POINT2POINT_CONSTRAINT); + KX_MACRO_addTypesToDict(d, LINEHINGE_CONSTRAINT, PHY_LINEHINGE_CONSTRAINT); + KX_MACRO_addTypesToDict(d, ANGULAR_CONSTRAINT, PHY_ANGULAR_CONSTRAINT); + KX_MACRO_addTypesToDict(d, CONETWIST_CONSTRAINT, PHY_CONE_TWIST_CONSTRAINT); + KX_MACRO_addTypesToDict(d, VEHICLE_CONSTRAINT, PHY_VEHICLE_CONSTRAINT); // Check for errors if (PyErr_Occurred()) -- cgit v1.2.3 From 601eb684208eb3f5e8025b81be30817b87daeb98 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sun, 31 Jul 2011 02:03:21 +0000 Subject: Added SkinNode DNA and customdata. --- source/blender/blenkernel/intern/customdata.c | 21 ++++++++++++++++----- source/blender/makesdna/DNA_customdata_types.h | 4 +++- source/blender/makesdna/DNA_meshdata_types.h | 5 +++++ 3 files changed, 24 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 8d19322c0db..1f18c78d070 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -805,7 +805,15 @@ static void layerDefault_mcol(void *data, int count) mcol[i] = default_mcol; } - +static void layerDefault_skin(void *data, int count) +{ + SkinNode *n = data; + int i; + + for(i = 0; i < count; i++) { + n[i].radius = 1; + } +} static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { {sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL}, @@ -843,7 +851,8 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerSwap_mcol, layerDefault_mcol}, {sizeof(MCol)*4, "MCol", 4, "TexturedCol", NULL, NULL, layerInterp_mcol, layerSwap_mcol, layerDefault_mcol}, - {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL} + {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}, + {sizeof(SkinNode), "SkinNode", 1, "Skin", NULL, NULL, NULL, NULL, layerDefault_skin} }; static const char *LAYERTYPENAMES[CD_NUMTYPES] = { @@ -851,7 +860,7 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = { /* 5-9 */ "CDMTFace", "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags", /* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", /* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps", - /* 20-23 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco" + /* 20-24 */ "CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco", "CDSkinNode" }; const CustomDataMask CD_MASK_BAREMESH = @@ -859,10 +868,12 @@ const CustomDataMask CD_MASK_BAREMESH = const CustomDataMask CD_MASK_MESH = CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE | CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL | - CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS; + CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | + CD_MASK_SKIN_NODE; const CustomDataMask CD_MASK_EDITMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | - CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS; + CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | + CD_MASK_SKIN_NODE; const CustomDataMask CD_MASK_DERIVEDMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO | diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h index cdfcf465c6c..061e9460956 100644 --- a/source/blender/makesdna/DNA_customdata_types.h +++ b/source/blender/makesdna/DNA_customdata_types.h @@ -92,7 +92,8 @@ typedef struct CustomData { #define CD_ID_MCOL 21 #define CD_TEXTURE_MCOL 22 #define CD_CLOTH_ORCO 23 -#define CD_NUMTYPES 24 +#define CD_SKIN_NODE 24 +#define CD_NUMTYPES 25 /* Bits for CustomDataMask */ #define CD_MASK_MVERT (1 << CD_MVERT) @@ -117,6 +118,7 @@ typedef struct CustomData { #define CD_MASK_MDISPS (1 << CD_MDISPS) #define CD_MASK_WEIGHT_MCOL (1 << CD_WEIGHT_MCOL) #define CD_MASK_CLOTH_ORCO (1 << CD_CLOTH_ORCO) +#define CD_MASK_SKIN_NODE (1 << CD_SKIN_NODE) /* CustomData.flag */ diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index e3510b3a25a..a71c4970eb5 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -184,6 +184,11 @@ typedef struct PartialVisibility { unsigned int totface, totedge, totvert, pad; } PartialVisibility; +typedef struct SkinNode { + float radius; + int pad; +} SkinNode; + /* mvert->flag (1=SELECT) */ #define ME_SPHERETEST 2 #define ME_VERT_TMP_TAG 4 -- cgit v1.2.3 From cae05598b1d10a70a0e37f28b6e49a5b5715a30f Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sun, 31 Jul 2011 02:03:28 +0000 Subject: Added DNA and RNA for skin modifier, stubbed in skin modifier functions --- source/blender/makesdna/DNA_modifier_types.h | 14 +++++ source/blender/makesrna/intern/rna_modifier.c | 15 +++++ source/blender/modifiers/CMakeLists.txt | 1 + source/blender/modifiers/MOD_modifiertypes.h | 1 + source/blender/modifiers/intern/MOD_skin.c | 88 +++++++++++++++++++++++++++ source/blender/modifiers/intern/MOD_util.c | 1 + 6 files changed, 120 insertions(+) create mode 100644 source/blender/modifiers/intern/MOD_skin.c (limited to 'source') diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 3787675f339..483bd339b3d 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -71,6 +71,7 @@ typedef enum ModifierType { eModifierType_Solidify, eModifierType_Screw, eModifierType_Warp, + eModifierType_Skin, NUM_MODIFIER_TYPES } ModifierType; @@ -785,4 +786,17 @@ typedef enum { /* PROP_RANDOM not used */ } WarpModifierFalloff; +typedef enum SkinModifierFlags { + MOD_SKIN_DRAW_SKIN = (1<<0), + MOD_SKIN_DRAW_NODES = (1<<1), +} SkinModifierFlags; + +typedef struct SkinModifierData { + ModifierData modifier; + float threshold; + int subdiv; + int flag; + int pad; +} SkinModifierData; + #endif diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index ba655915fb6..b4a4c593ba9 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -68,6 +68,7 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, + {eModifierType_Skin, "SKIN", ICON_MOD_ARMATURE, "Skin", ""}, {0, "", 0, "Deform", ""}, {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""}, {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""}, @@ -183,6 +184,8 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr) return &RNA_ScrewModifier; case eModifierType_Warp: return &RNA_WarpModifier; + case eModifierType_Skin: + return &RNA_SkinModifier; default: return &RNA_Modifier; } @@ -2412,6 +2415,17 @@ static void rna_def_modifier_screw(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ } +static void rna_def_modifier_skin(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "SkinModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "Skin Modifier", "Generate Skin"); + RNA_def_struct_sdna(srna, "SkinModifierData"); + RNA_def_struct_ui_icon(srna, ICON_MOD_ARMATURE); +} + void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -2509,6 +2523,7 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_smoke(brna); rna_def_modifier_solidify(brna); rna_def_modifier_screw(brna); + rna_def_modifier_skin(brna); } #endif diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index d1f153265ac..7db03f48631 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -70,6 +70,7 @@ set(SRC intern/MOD_shapekey.c intern/MOD_shrinkwrap.c intern/MOD_simpledeform.c + intern/MOD_skin.c intern/MOD_smoke.c intern/MOD_smooth.c intern/MOD_softbody.c diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h index 4e44a226c64..329037ee210 100644 --- a/source/blender/modifiers/MOD_modifiertypes.h +++ b/source/blender/modifiers/MOD_modifiertypes.h @@ -72,6 +72,7 @@ extern ModifierTypeInfo modifierType_ShapeKey; extern ModifierTypeInfo modifierType_Solidify; extern ModifierTypeInfo modifierType_Screw; extern ModifierTypeInfo modifierType_Warp; +extern ModifierTypeInfo modifierType_Skin; /* MOD_util.c */ void modifier_type_init(ModifierTypeInfo *types[]); diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c new file mode 100644 index 00000000000..adc47f32c9c --- /dev/null +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -0,0 +1,88 @@ +/* +* $Id$ +* +* ***** 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. +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/** \file blender/modifiers/intern/MOD_skin.c + * \ingroup modifiers + */ + + +#include + +#include "BKE_cdderivedmesh.h" +#include "BKE_modifier.h" + +#include "DNA_mesh_types.h" +#include "DNA_object_types.h" + +#include "MOD_util.h" + +static void initData(ModifierData *md) +{ + SkinModifierData *smd = (SkinModifierData*)md; + + smd->threshold = 0; + smd->subdiv = 1; + smd->flag = MOD_SKIN_DRAW_NODES; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + SkinModifierData *smd = (SkinModifierData*) md; + SkinModifierData *tsmd = (SkinModifierData*) target; + + tsmd->threshold = smd->threshold; + tsmd->subdiv = smd->subdiv; + tsmd->flag = smd->flag; +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, + int useRenderParams, int isFinalCalc) +{ + return dm; +} + + +ModifierTypeInfo modifierType_Skin = { + /* name */ "Skin", + /* structName */ "SkinModifierData", + /* structSize */ sizeof(SkinModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh, + + /* copyData */ copyData, + /* deformVerts */ NULL, + /* deformMatrices */ NULL, + /* deformVertsEM */ NULL, + /* deformMatricesEM */ NULL, + /* applyModifier */ applyModifier, + /* applyModifierEM */ NULL, + /* initData */ initData, + /* requiredDataMask */ NULL, + /* freeData */ NULL, + /* isDisabled */ NULL, + /* updateDepgraph */ NULL, + /* dependsOnTime */ NULL, + /* dependsOnNormals */ NULL, + /* foreachObjectLink */ NULL, + /* foreachIDLink */ NULL, +}; diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index e9b835eab81..e823a347ced 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -295,5 +295,6 @@ void modifier_type_init(ModifierTypeInfo *types[]) INIT_TYPE(Solidify); INIT_TYPE(Screw); INIT_TYPE(Warp); + INIT_TYPE(Skin); #undef INIT_TYPE } -- cgit v1.2.3 From cff57b14a122a7925d8fb6aeb0ecd53984fa0c58 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sun, 31 Jul 2011 02:03:39 +0000 Subject: Imported bsphere.c, mostly ifdef'd out for now --- source/blender/blenkernel/CMakeLists.txt | 1 + source/blender/blenkernel/intern/bsphere.c | 1178 +++++++++++++++++++++++++ source/blender/blenkernel/intern/customdata.c | 2 +- 3 files changed, 1180 insertions(+), 1 deletion(-) create mode 100644 source/blender/blenkernel/intern/bsphere.c (limited to 'source') diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index defcef58463..e549a205325 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -81,6 +81,7 @@ set(SRC intern/boids.c intern/booleanops_mesh.c intern/brush.c + intern/bsphere.c intern/bullet.c intern/bvhutils.c intern/cdderivedmesh.c diff --git a/source/blender/blenkernel/intern/bsphere.c b/source/blender/blenkernel/intern/bsphere.c new file mode 100644 index 00000000000..d8a75f62172 --- /dev/null +++ b/source/blender/blenkernel/intern/bsphere.c @@ -0,0 +1,1178 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 by Nicholas Bishop + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "MEM_guardedalloc.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" + +#include "BLI_utildefines.h" +#include "BLI_heap.h" +#include "BLI_ghash.h" +#include "BLI_listbase.h" +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_DerivedMesh.h" +#include "BKE_global.h" +#include "BKE_library.h" +#include "BKE_main.h" +#include "BKE_subsurf.h" + +#include + +typedef struct Tri { + struct Tri *next, *prev; + unsigned int v[3]; + float no[3]; + float area; + int marked; +} Tri; + +typedef struct Edge { + struct Edge *next, *prev; + unsigned int v[2]; + Tri *tri[2]; +} Edge; + +/* note: a `frame' is four vertices (contiguous within the MVert + array), stored simply as the index of the first vertex */ + +static void create_frame(float frame[4][3], const float co[3], float radius, + const float mat[3][3], float x_offset) +{ + float rx[3], ry[3], rz[3]; + int i; + + mul_v3_v3fl(ry, mat[1], radius); + mul_v3_v3fl(rz, mat[2], radius); + + add_v3_v3v3(frame[3], co, ry); + add_v3_v3v3(frame[3], frame[3], rz); + + sub_v3_v3v3(frame[2], co, ry); + add_v3_v3v3(frame[2], frame[2], rz); + + sub_v3_v3v3(frame[1], co, ry); + sub_v3_v3v3(frame[1], frame[1], rz); + + add_v3_v3v3(frame[0], co, ry); + sub_v3_v3v3(frame[0], frame[0], rz); + + mul_v3_v3fl(rx, mat[0], x_offset); + for(i = 0; i < 4; i++) + add_v3_v3v3(frame[i], frame[i], rx); +} + +static void create_mid_frame(float frame[4][3], + const float co1[3], const float co2[3], + const SkinNode *n1, const SkinNode *n2, + const float mat[3][3]) +{ + create_frame(frame, co1, (n1->radius + n2->radius) / 2, + mat, len_v3v3(co1, co2) / 2); +} + +static void add_face(MFace *mface, int *totface, + int v1, int v2, int v3, int v4) +{ + MFace *f; + + f = &mface[*totface]; + f->v1 = v1; + f->v2 = v2; + f->v3 = v3; + f->v4 = v4 == -1 ? 0 : v4; + if(!v4) { + f->v1 = v3; + f->v2 = v4; + f->v3 = v1; + f->v4 = v2; + } + (*totface)++; +} + +static void connect_frames(MFace *mface, int *totface, int frame1, int frame2) +{ + int i; + + for(i = 0; i < 4; i++) { + add_face(mface, totface, + frame2 + i, + frame2 + (i+1) % 4, + frame1 + (i+1) % 4, + frame1 + i); + } +} + +static Tri *add_triangle(ListBase *tris, MVert *mvert, int v1, int v2, int v3) +{ + Tri *t; + + t = MEM_callocN(sizeof(Tri), "add_triangle.tri"); + t->v[0] = v1; + t->v[1] = v2; + t->v[2] = v3; + BLI_addtail(tris, t); + + normal_tri_v3(t->no, mvert[t->v[0]].co, mvert[t->v[1]].co, mvert[t->v[2]].co); + t->area = area_tri_v3(mvert[t->v[0]].co, mvert[t->v[1]].co, mvert[t->v[2]].co); + + return t; +} + +static int point_tri_side(const Tri *t, MVert *mvert, int v) +{ + float p[3], d; + sub_v3_v3v3(p, mvert[v].co, mvert[t->v[0]].co); + d = dot_v3v3(t->no, p); + if(d < 0) return -1; + else if(d > 0) return 1; + else return 0; +} + +static int mark_v_outside_tris(ListBase *tris, MVert *mvert, int v) +{ + Tri *t; + int outside = 0; + + /* probably there's a much better way to do this */ + for(t = tris->first; t; t = t->next) { + if((t->marked = point_tri_side(t, mvert, v) > 0)) + outside = 1; + } + return outside; +} + +static int edge_match(int e1_0, int e1_1, const unsigned int e2[2]) +{ + /* XXX: maybe isn't necesseary to check both directions? */ + return (e1_0 == e2[0] && e1_1 == e2[1]) || + (e1_0 == e2[1] && e1_1 == e2[0]); +} + +/* returns true if the edge (e1, e2) is already in edges; that edge is + deleted here as well. if not found just returns 0 */ +static int check_for_dup(ListBase *edges, unsigned int e1, unsigned int e2) +{ + Edge *e, *next; + + for(e = edges->first; e; e = next) { + next = e->next; + + if(edge_match(e1, e2, e->v)) { + /* remove the interior edge */ + BLI_freelinkN(edges, e); + return 1; + } + } + + return 0; +} + +static void expand_boundary_edges(ListBase *edges, Tri *t) +{ + Edge *new; + int i; + + /* insert each triangle edge into the boundary list; if any of + its edges are already in there, remove the edge entirely */ + for(i = 0; i < 3; i++) { + if(!check_for_dup(edges, t->v[i], t->v[(i+1)%3])) { + new = MEM_callocN(sizeof(Edge), "Edge"); + new->v[0] = t->v[i]; + new->v[1] = t->v[(i+1)%3]; + BLI_addtail(edges, new); + } + } +} + +static int tri_matches_frame(const Tri *t, int frame) +{ + int i, j, match = 0; + for(i = 0; i < 3; i++) { + for(j = 0; j < 4; j++) { + if(t->v[i] == frame + j) { + match++; + if(match >= 3) + return 1; + } + } + } + return 0; +} + +static void quad_from_tris(const Edge *e, int ndx[4]) +{ + int i, j, opp = -1; + + /* find what the second tri has that the first doesn't */ + for(i = 0; i < 3; i++) { + if(e->tri[1]->v[i] != e->tri[0]->v[0] && + e->tri[1]->v[i] != e->tri[0]->v[1] && + e->tri[1]->v[i] != e->tri[0]->v[2]) { + opp = e->tri[1]->v[i]; + break; + } + } + assert(opp != -1); + + for(i = 0, j = 0; i < 3; i++, j++) { + ndx[j] = e->tri[0]->v[i]; + /* when the triangle edge cuts across our quad-to-be, + throw in the second triangle's vertex */ + if((e->tri[0]->v[i] == e->v[0] || e->tri[0]->v[i] == e->v[1]) && + (e->tri[0]->v[(i+1)%3] == e->v[0] || e->tri[0]->v[(i+1)%3] == e->v[1])) { + j++; + ndx[j] = opp; + } + } +} + +static void add_quad_from_tris(MFace *mface, int *totface, const Edge *e) +{ + int ndx[4]; + + quad_from_tris(e, ndx); + + add_face(mface, totface, ndx[0], ndx[1], ndx[2], ndx[3]); +} + +static GHash *calc_edges(ListBase *tris) +{ + GHash *adj; + ListBase *edges; + Edge *e; + Tri *t; + int i, e1, e2; + + /* XXX: vertex range might be a little funky? so using a + hash here */ + adj = BLI_ghash_new(BLI_ghashutil_inthash, + BLI_ghashutil_intcmp, + "calc_edges adj"); + + for(t = tris->first; t; t = t->next) { + for(i = 0; i < 3; i++) { + e1 = t->v[i]; + e2 = t->v[(i+1)%3]; + assert(e1 != e2); + if(e1 > e2) + SWAP(int, e1, e2); + + edges = BLI_ghash_lookup(adj, SET_INT_IN_POINTER(e1)); + if(!edges) { + edges = MEM_callocN(sizeof(ListBase), + "calc_edges ListBase"); + BLI_ghash_insert(adj, SET_INT_IN_POINTER(e1), edges); + } + + /* find the edge in the adjacency list */ + for(e = edges->first; e; e = e->next) { + assert(e->v[0] == e1); + if(e->v[1] == e2) + break; + } + + /* if not found, create the edge */ + if(!e) { + e = MEM_callocN(sizeof(Edge), "calc_edges Edge"); + e->v[0] = e1; + e->v[1] = e2; + BLI_addtail(edges, e); + } + + /* should never be more than two faces + attached to an edge here */ + assert(!e->tri[0] || !e->tri[1]); + + if(!e->tri[0]) + e->tri[0] = t; + else if(!e->tri[1]) + e->tri[1] = t; + } + } + + return adj; +} + +static int is_quad_symmetric(const MVert *mvert, const Edge *e) +{ + int ndx[4]; + float a[3]; + + quad_from_tris(e, ndx); + + copy_v3_v3(a, mvert[ndx[0]].co); + a[0] = -a[0]; + + if(len_v3v3(a, mvert[ndx[1]].co) < FLT_EPSILON) { + copy_v3_v3(a, mvert[ndx[2]].co); + a[0] = -a[0]; + if(len_v3v3(a, mvert[ndx[3]].co) < FLT_EPSILON) + return 1; + } + else if(len_v3v3(a, mvert[ndx[3]].co) < FLT_EPSILON) { + copy_v3_v3(a, mvert[ndx[2]].co); + a[0] = -a[0]; + if(len_v3v3(a, mvert[ndx[1]].co) < FLT_EPSILON) + return 1; + } + + return 0; +} + +static void output_hull(const MVert *mvert, MFace *mface, int *totface, ListBase *tris) +{ + Heap *heap; + GHash *adj; + GHashIterator *iter; + ListBase *edges; + Edge *e; + Tri *t; + float score; + + heap = BLI_heap_new(); + adj = calc_edges(tris); + + /* unmark all triangles */ + for(t = tris->first; t; t = t->next) + t->marked = 0; + + /* build heap */ + iter = BLI_ghashIterator_new(adj); + while(!BLI_ghashIterator_isDone(iter)) { + edges = BLI_ghashIterator_getValue(iter); + for(e = edges->first; e; e = e->next) { + /* only care if the edge is used by more than + one triangle */ + if(e->tri[0] && e->tri[1]) { + score = (e->tri[0]->area + e->tri[1]->area) * + dot_v3v3(e->tri[0]->no, e->tri[1]->no); + + /* increase score if the triangles + form a symmetric quad */ + if(is_quad_symmetric(mvert, e)) + score *= 10; + + BLI_heap_insert(heap, -score, e); + } + } + + BLI_ghashIterator_step(iter); + } + BLI_ghashIterator_free(iter); + + while(!BLI_heap_empty(heap)) { + e = BLI_heap_popmin(heap); + + /* if both triangles still free, outupt as a quad */ + if(!e->tri[0]->marked && !e->tri[1]->marked) { + add_quad_from_tris(mface, totface, e); + e->tri[0]->marked = 1; + e->tri[1]->marked = 1; + } + } + + /* free edge list */ + iter = BLI_ghashIterator_new(adj); + while(!BLI_ghashIterator_isDone(iter)) { + edges = BLI_ghashIterator_getValue(iter); + BLI_freelistN(edges); + MEM_freeN(edges); + BLI_ghashIterator_step(iter); + } + BLI_ghashIterator_free(iter); + BLI_ghash_free(adj, NULL, NULL); + BLI_heap_free(heap, NULL); + + /* write out any remaining triangles */ + for(t = tris->first; t; t = t->next) { + if(!t->marked) + add_face(mface, totface, t->v[0], t->v[1], t->v[2], -1); + } +} + +/* for vertex `v', find which triangles must be deleted to extend the + hull; find the boundary edges of that hole so that it can be filled + with connections to the new vertex, and update the `tri' list to + delete the marked triangles */ +static void add_point(ListBase *tris, MVert *mvert, int v) +{ + ListBase edges = {NULL, NULL}; + Tri *t, *next; + Edge *e; + + for(t = tris->first; t; t = next) { + next = t->next; + + /* check if triangle is `visible' to v */ + if(t->marked) { + expand_boundary_edges(&edges, t); + /* remove the triangle */ + BLI_freelinkN(tris, t); + } + } + + /* fill hole boundary with triangles to new point */ + for(e = edges.first; e; e = e->next) + add_triangle(tris, mvert, e->v[0], e->v[1], v); + BLI_freelistN(&edges); +} + +static void build_hull(MFace *mface, int *totface, + MVert *mvert, int *frames, int totframe) +{ + ListBase tris = {NULL, NULL}; + Tri *t, *next; + int i, j; + + /* use first frame to make initial degenerate pyramid */ + add_triangle(&tris, mvert, frames[0], frames[0] + 1, frames[0] + 2); + add_triangle(&tris, mvert, frames[0] + 1, frames[0], frames[0] + 3); + add_triangle(&tris, mvert, frames[0] + 2, frames[0] + 1, frames[0] + 3); + add_triangle(&tris, mvert, frames[0], frames[0] + 2, frames[0] + 3); + + for(i = 1; i < totframe; i++) { + for(j = 0; j < 4; j++) { + int v = frames[i] + j; + + /* ignore point already inside hull */ + if(mark_v_outside_tris(&tris, mvert, v)) { + /* expand hull and delete interior triangles */ + add_point(&tris, mvert, v); + } + } + } + + /* remove triangles that would fill the original frames */ + for(t = tris.first; t; t = next) { + next = t->next; + + for(i = 0; i < totframe; i++) { + if(tri_matches_frame(t, frames[i])) { + BLI_freelinkN(&tris, t); + break; + } + } + } + + output_hull(mvert, mface, totface, &tris); + + BLI_freelistN(&tris); +} + +/* test: build hull on origdm */ +#if 0 +static DerivedMesh *test_hull(DerivedMesh *origdm) +{ + DerivedMesh *dm; + MVert *mvert, *origmvert; + MFace *mface; + int *frames; + int totvert = 0, totface = 0, totframe, i; + + /* TODO */ + totface = 2000; + totvert = origdm->getNumVerts(origdm); + dm = CDDM_new(totvert, 0, totface); + + mvert = CDDM_get_verts(dm); + mface = CDDM_get_faces(dm); + + origmvert = CDDM_get_verts(origdm); + for(i = 0; i < totvert; i++) + mvert[i] = origmvert[i]; + + assert(totvert % 4 == 0); + totframe = totvert / 4; + + frames = MEM_callocN(sizeof(int) * totframe, "frames"); + for(i = 0; i < totframe; i++) + frames[i] = i*4; + + totface = 0; + build_hull(mface, &totface, mvert, frames, totframe); + + CDDM_calc_edges(dm); + //CDDM_calc_normals(dm); + + MEM_freeN(frames); + + return dm; +} +#endif + +/* TODO */ +static void calc_edge_mat(float mat[3][3], const float a[3], const float b[3]) +{ + float Z[3] = {0, 0, 1}; + float dot; + + /* x = edge direction */ + sub_v3_v3v3(mat[0], b, a); + normalize_v3(mat[0]); + + dot = dot_v3v3(mat[0], Z); + if(dot > -1 + FLT_EPSILON && dot < 1 - FLT_EPSILON) { + /* y = Z cross x */ + cross_v3_v3v3(mat[1], Z, mat[0]); + normalize_v3(mat[1]); + + /* z = x cross y */ + cross_v3_v3v3(mat[2], mat[0], mat[1]); + normalize_v3(mat[2]); + } + else { + mat[1][0] = 1; + mat[1][1] = 0; + mat[1][2] = 0; + mat[2][0] = 0; + mat[2][1] = 1; + mat[2][2] = 0; + } +} + +/* BMesh paper */ +#if 0 +static float calc_R_sub_i_squared(const BSphereNode *n) +{ + const float alpha = 1.5; + //const float alpha = 1; + const float R_sub_i = n->size[0] * alpha; + return R_sub_i * R_sub_i; +} + +/* equation (2) */ +static float calc_r_squared(const float v[3], const BSphereNode *n) +{ + return len_squared_v3v3(v, n->co); +} + +/* equation (1) */ +static float calc_f_sub_i(const float v[3], const BSphereNode *n) +{ + float r_squared; + float R_sub_i_squared; + + r_squared = calc_r_squared(v, n); + R_sub_i_squared = calc_R_sub_i_squared(n); + + if(r_squared <= R_sub_i_squared) + return powf(1.0f - (r_squared / R_sub_i_squared), 2); + else + return 0; +} + +/* equation (3) */ +static float calc_I(const float x[3], float T, const ListBase *base) +{ + BSphereNode *n; + float a = -T; + + for(n = base->first; n; n = n->next) { + a += calc_I(x, 0, &n->children); + a += calc_f_sub_i(x, n); + } + + //printf("calc_I: %f, %f\n", -T, a); + + return a; +} + +/* kinda my own guess here */ +static void calc_gradient(float g[3], const float x[3], const ListBase *base) +{ + BSphereNode *n; + + for(n = base->first; n; n = n->next) { + float R_sub_i_squared = calc_R_sub_i_squared(n); + float dist = len_v3v3(x, n->co); + float f = calc_f_sub_i(x, n); + float d = 1.0f / R_sub_i_squared; + float tmp[3]; + + /* XXX: other possibilities... */ + if(f > 0) { + sub_v3_v3v3(tmp, x, n->co); + mul_v3_fl(tmp, -4*d * (1 - d * dist)); + + /* not sure if I'm doing this right; intent is + to flip direction when x is `beneath' the + level set */ + if(len_v3v3(x, n->co) > n->size[0]) + negate_v3(tmp); + + add_v3_v3(g, tmp); + } + + calc_gradient(g, x, &n->children); + } +} + +/* equation (5) */ +static float calc_F(const float x[3], const float K[2], float T, const ListBase *base) +{ + float f_of_K; + float I_target; + + /* TODO */ + f_of_K = 1.0f / (1 + fabs(K[0]) + fabs(K[1])); + //f_of_K = 1; + + /* TODO */ + I_target = 0; + + return (calc_I(x, T, base) - I_target) /*TODO: * f_of_K*/; +} + +static float smallest_radius(const ListBase *base) +{ + BSphereNode *n; + float s = FLT_MAX, t; + + for(n = base->first; n; n = n->next) { + if(n->size[0] < s) + s = n->size[0]; + if((t = smallest_radius(&n->children)) < s) + s = t; + } + + return s; +} + +/* equation (7) */ +static float calc_delta_t(float F_max, float k, const ListBase *base, int print) +{ + float min_r_sub_i; + float step; + + min_r_sub_i = smallest_radius(base); + step = min_r_sub_i / powf(2, k); + + if(print) { + printf("min_r: %f, 2^k=%f, step=%f\n", min_r_sub_i, powf(2, k), step); + } + + return step / F_max; +} + +/* equation (6) */ +static float evolve_x(float x[3], const float K[2], float T, + int k, const ListBase *base, int i, float F_max) +{ + float tmp[3], no[3]; + float F, dt; + + F = calc_F(x, K, T, base); + + if(F < FLT_EPSILON) { + //printf("stability reached for ndx=%d\n", i); + return 0; + } + + /* TODO ;-) */ + if(F > F_max) + F_max = F; + + dt = calc_delta_t(F_max, k, base, 0); + + dt = F / 2; + + if(i == 0) + ;//printf("F=%.3f, dt=%.3f\n", F, calc_delta_t(F_max, k, base, 1)); + + zero_v3(no); + calc_gradient(no, x, base); + normalize_v3(no); + negate_v3(no); + + mul_v3_v3fl(tmp, no, F * dt); + add_v3_v3(x, tmp); + + return F_max; +} + +static void bsphere_evolve(MVert *mvert, int totvert, const ListBase *base, + float T, int steps, float subdiv_level) +{ + int i, s; + + for(i = 0; i < totvert; i++) { + float F_max = 0; + /* TODO: for now just doing a constant number of steps */ + for(s = 0; s < steps; s++) { + /* TODO */ + float K[2] = {0, 0}; + + F_max = evolve_x(mvert[i].co, K, T, subdiv_level, base, i, F_max); + } + } +} +#endif + +typedef enum { + START_CAP = 1, + END_CAP = 2, + NODE_BISECT = 4, + CHILD_EDGE_BISECT = 8, + + IN_FRAME = 16, + OUT_FRAME = 32, +} FrameFlag; + +typedef struct { + int totframe; + int outbase; + FrameFlag flag; + float co[0][4][3]; +} Frames; + +static Frames *frames_create(FrameFlag flag) +{ + Frames *frames; + int totframe; + totframe = (!!(flag & START_CAP) + !!(flag & END_CAP) + + !!(flag & NODE_BISECT) + !!(flag & CHILD_EDGE_BISECT)); + assert(totframe); + frames = MEM_callocN(sizeof(Frames) + sizeof(float)*totframe*4*3, + "frames_create.frames"); + frames->totframe = totframe; + frames->flag = flag; + assert((flag & (END_CAP|CHILD_EDGE_BISECT)) != (END_CAP|CHILD_EDGE_BISECT)); + return frames; +} + +static int frame_offset(Frames *frames, FrameFlag flag) +{ + int n = 0; + + assert(flag == IN_FRAME || flag == OUT_FRAME || + !(flag & (IN_FRAME|OUT_FRAME))); + + if(flag == IN_FRAME) + return 0; + else if(flag == OUT_FRAME) + return frames->totframe-1; + + assert((flag & frames->flag) == flag); + + if(flag == START_CAP) return n; + if(frames->flag & START_CAP) n++; + + if(flag == NODE_BISECT) return n; + if(frames->flag & NODE_BISECT) n++; + + if(flag == END_CAP) return n; + if(frames->flag & END_CAP) n++; + + if(flag == CHILD_EDGE_BISECT) return n; + if(frames->flag & CHILD_EDGE_BISECT) n++; + + assert(!"bad frame offset flag"); +} + +static int frame_base(Frames *frames, FrameFlag flag) +{ + return frames->outbase + 4*frame_offset(frames, flag); +} + +static void *frame_co(Frames *frames, FrameFlag flag) +{ + return frames->co[frame_offset(frames, flag)]; +} + +static int frames_totvert(Frames *frames) +{ + return frames->totframe*4; +} + +#if 0 +static int bsphere_build_frames(BSphereNode *n, GHash *ghash, + float (*parent_mat)[3], FrameFlag flag); + +/* builds the `cap' of polygons for the end of a BSphere chain */ +static int bsphere_end_node_frames(BSphereNode *n, + GHash *ghash, + float parent_mat[3][3], + FrameFlag flag) +{ + Frames *frames; + float rad; + + assert(flag == 0 || flag == START_CAP); + frames = frames_create(NODE_BISECT|END_CAP|flag, n, ghash); + + /* TODO */ + rad = n->size[0]; + + if(flag & START_CAP) + create_frame(frame_co(frames, START_CAP), n, parent_mat, -rad, rad); + + /* frame to bisect the node */ + create_frame(frame_co(frames, NODE_BISECT), n, parent_mat, 0, rad); + + /* frame to cap end node */ + create_frame(frame_co(frames, END_CAP), n, parent_mat, rad, rad); + + return frames_totvert(frames); +} + +static int bsphere_connection_node_frames(BSphereNode *n, + GHash *ghash, + float parent_mat[3][3], + FrameFlag flag) +{ + Frames *frames; + BSphereNode *child; + float childmat[3][3], nodemat[3][3], axis[3], angle, rad, child_rad; + int totvert; + + assert(flag == 0 || flag == START_CAP); + + child = n->children.first; + + /* if child is not a branch node, bisect the child edge */ + if(BLI_countlist(&child->children) <= 1) + flag |= CHILD_EDGE_BISECT; + + frames = frames_create(NODE_BISECT|flag, n, ghash); + totvert = frames_totvert(frames); + + /* TODO */ + rad = n->size[0]; + child_rad = child->size[0]; + + /* build matrix to give to child */ + sub_v3_v3v3(childmat[0], child->co, n->co); + normalize_v3(childmat[0]); + angle = angle_normalized_v3v3(parent_mat[0], childmat[0]); + cross_v3_v3v3(axis, parent_mat[0], childmat[0]); + normalize_v3(axis); + rotate_normalized_v3_v3v3fl(childmat[1], parent_mat[1], axis, angle); + rotate_normalized_v3_v3v3fl(childmat[2], parent_mat[2], axis, angle); + + /* build child */ + totvert += bsphere_build_frames(child, ghash, childmat, 0); + + /* frame that bisects the node */ + angle /= 2; + copy_v3_v3(nodemat[0], parent_mat[0]); + rotate_normalized_v3_v3v3fl(nodemat[1], parent_mat[1], axis, angle); + rotate_normalized_v3_v3v3fl(nodemat[2], parent_mat[2], axis, angle); + create_frame(frame_co(frames, NODE_BISECT), n, nodemat, 0, rad); + + if(flag & START_CAP) + create_frame(frame_co(frames, START_CAP), n, nodemat, -rad, rad); + + if(flag & CHILD_EDGE_BISECT) + create_mid_frame(frame_co(frames, CHILD_EDGE_BISECT), n, child, childmat); + + return totvert; +} + +static int bsphere_branch_node_frames(BSphereNode *n, GHash *ghash) +{ + BSphereNode *child; + int totvert = 0; + float rad; + + rad = n->size[0]; + + /* build children */ + for(child = n->children.first; child; child = child->next) { + float childmat[3][3]; + + calc_edge_mat(childmat, n->co, child->co); + + totvert += bsphere_build_frames(child, ghash, childmat, 0); + } + + /* TODO: for now, builds no frames of its own */ + + return totvert; +} + +static int bsphere_build_frames(BSphereNode *n, GHash *ghash, + float parent_mat[3][3], FrameFlag flag) +{ + BSphereNode *child; + + child = n->children.first; + + if(!child) + return bsphere_end_node_frames(n, ghash, parent_mat, flag); + else if(!child->next) + return bsphere_connection_node_frames(n, ghash, parent_mat, flag); + else + return bsphere_branch_node_frames(n, ghash); +} + +static GHash *bsphere_frames(BSphere *bs, int *totvert) +{ + GHash *ghash; + BSphereNode *n, *child; + + ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, + "bsphere_frames.ghash"); + (*totvert) = 0; + + for(n = bs->rootbase.first; n; n = n->next) { + float mat[3][3]; + + child = n->children.first; + if(!child || (child && child->next)) { + set_v3(mat[0], 0, 0, 1); + set_v3(mat[1], 1, 0, 0); + set_v3(mat[2], 0, 1, 0); + } + else if(!child->next) { + calc_edge_mat(mat, n->co, child->co); + } + + (*totvert) += bsphere_build_frames(n, ghash, mat, START_CAP); + } + + return ghash; +} + +static void output_frames(Frames *frames, MVert *mvert, MFace *mface, + int *totvert, int *totface) +{ + int b, i, j; + + frames->outbase = (*totvert); + for(i = 0; i < frames->totframe; i++) { + for(j = 0; j < 4; j++) { + copy_v3_v3(mvert[(*totvert)].co, frames->co[i][j]); + (*totvert)++; + } + + if(i > 0) { + connect_frames(mface, totface, + frames->outbase + 4*(i-1), + frames->outbase + 4*i); + } + } + + if(frames->flag & START_CAP) { + b = frame_base(frames, START_CAP); + add_face(mface, totface, b, b+1, b+2, b+3); + } + if(frames->flag & END_CAP) { + b = frame_base(frames, END_CAP); + add_face(mface, totface, b+3, b+2, b+1, b+0); + } +} + +static void bsphere_build_skin(BSphereNode *parent, ListBase *base, + GHash *frames, MVert *mvert, + MFace *mface, int *totvert, int *totface) +{ + BSphereNode *n, *child; + Frames *node_frames, *child_frames, *parent_frames; + int *hull_frames, totchild, i; + + for(n = base->first; n; n = n->next) { + if((node_frames = BLI_ghash_lookup(frames, n))) + output_frames(node_frames, mvert, mface, totvert, totface); + + bsphere_build_skin(n, &n->children, frames, mvert, mface, totvert, totface); + + child = n->children.first; + if(child && !child->next) { + child_frames = BLI_ghash_lookup(frames, child); + if(child_frames) { + connect_frames(mface, totface, + frame_base(node_frames, OUT_FRAME), + frame_base(child_frames, IN_FRAME)); + } + } + else if(child && child->next) { + totchild = BLI_countlist(&n->children); + hull_frames = MEM_callocN(sizeof(int) * (1+totchild), + "bsphere_build_skin.hull_frames"); + i = 0; + for(child = n->children.first; child; child = child->next) { + child_frames = BLI_ghash_lookup(frames, child); + assert(child_frames); + hull_frames[i++] = frame_base(child_frames, IN_FRAME); + } + parent_frames = BLI_ghash_lookup(frames, parent); + if(parent_frames) + hull_frames[i] = frame_base(parent_frames, OUT_FRAME); + else + totchild--; + build_hull(mface, totface, mvert, hull_frames, totchild+1); + MEM_freeN(hull_frames); + } + } +} + +static DerivedMesh *bsphere_base_skin(BSphere *bs) +{ + DerivedMesh *dm; + GHash *ghash; + MVert *mvert; + MFace *mface; + int totvert, totface = 0; + + /* no nodes, nothing to do */ + if(!bs->rootbase.first) + return NULL; + + /* could probably do all this in one fell [recursive] swoop + using some tricksies and clevers, but multiple passes is + easier :) */ + ghash = bsphere_frames(bs, &totvert); + + totface = totvert * 1.5; + /* XXX: sizes OK? */ + dm = CDDM_new(totvert, 0, totface); + + mvert = CDDM_get_verts(dm); + mface = CDDM_get_faces(dm); + + totvert = totface = 0; + bsphere_build_skin(NULL, &bs->rootbase, ghash, mvert, mface, &totvert, &totface); + BLI_ghash_free(ghash, NULL, (void*)MEM_freeN); + + CDDM_lower_num_verts(dm, totvert); + CDDM_lower_num_faces(dm, totface); + + CDDM_calc_edges(dm); + CDDM_calc_normals(dm); + + return dm; +} + +/* generate random points (just for testing) */ +DerivedMesh *bsphere_random_points(BSphere *UNUSED(bs)) +{ + DerivedMesh *dm; + MVert *mvert; + const int totvert = 1;//50000; + int i; + + dm = CDDM_new(totvert, 0, 0); + + mvert = CDDM_get_verts(dm); + + srand(1); + for(i = 0; i < totvert; i++) { + mvert[i].co[0] = rand() / (float)RAND_MAX - 0.5; + mvert[i].co[1] = rand() / (float)RAND_MAX - 0.5; + mvert[i].co[2] = rand() / (float)RAND_MAX - 0.5; + } + + return dm; +} + +DerivedMesh *bsphere_test_surface(BSphere *bs, DerivedMesh *input) +{ + DerivedMesh *dm; + MVert *mvert; + + if(!input) + return NULL; + + dm = CDDM_copy(input); + mvert = CDDM_get_verts(dm); + bsphere_evolve(mvert, input->getNumVerts(input), &bs->rootbase, + bs->skin_threshold, bs->evolve, 2); + + return dm; +} + +DerivedMesh *bsphere_test_gradient(BSphere *bs, DerivedMesh *input) +{ + DerivedMesh *dm; + MVert *mvert; + MEdge *medge; + int totvert; + int i; + + if(!input) + return NULL; + + totvert = input->getNumVerts(input); + dm = CDDM_new(totvert*2, totvert, 0); + + mvert = CDDM_get_verts(dm); + medge = CDDM_get_edges(dm); + + memcpy(mvert, CDDM_get_verts(input), sizeof(MVert) * totvert); + + for(i = 0; i < totvert; i++) { + const float *b = mvert[i].co; + float *g = mvert[totvert+i].co; + float K[2] = {0, 0}; + + zero_v3(g); + calc_gradient(g, b, &bs->rootbase); + normalize_v3(g); + + mul_v3_fl(g, -calc_F(b, K, bs->skin_threshold, &bs->rootbase)); + add_v3_v3(g, b); + + medge[i].v1 = i; + medge[i].v2 = totvert+i; + } + + return dm; +} + +DerivedMesh *bsphere_get_skin_dm(BSphere *bs) +{ + DerivedMesh *dm, *subdm; + + dm = bsphere_base_skin(bs); + + /* subdivide once */ + if(dm && bs->subdiv_level > 0) { + SubsurfModifierData smd; + + memset(&smd, 0, sizeof(smd)); + smd.subdivType = ME_CC_SUBSURF; + smd.levels = bs->subdiv_level; + subdm = subsurf_make_derived_from_derived(dm, &smd, 0, 0, 0, 0); + dm->release(dm); + /* for convenience, convert back to cddm (could use ccgdm + later for better performance though? (TODO)) */ + dm = CDDM_copy(subdm); + subdm->release(subdm); + + bsphere_evolve(CDDM_get_verts(dm), dm->getNumVerts(dm), &bs->rootbase, + bs->skin_threshold, bs->evolve, bs->subdiv_level); + } + + return dm; +} +#endif diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 1f18c78d070..b9d6badfbe9 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -811,7 +811,7 @@ static void layerDefault_skin(void *data, int count) int i; for(i = 0; i < count; i++) { - n[i].radius = 1; + n[i].radius = 0.25; } } -- cgit v1.2.3 From 6c3bb8b9030a86388d42a752b0cba2826630c4c6 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sun, 31 Jul 2011 02:03:48 +0000 Subject: EditMesh-based skin node drawing --- source/blender/blenkernel/CMakeLists.txt | 1 - source/blender/blenkernel/intern/bsphere.c | 1178 ------------------------ source/blender/blenkernel/intern/customdata.c | 21 +- source/blender/makesdna/DNA_customdata_types.h | 4 +- source/blender/makesdna/DNA_meshdata_types.h | 5 - source/blender/makesdna/DNA_modifier_types.h | 14 - source/blender/makesrna/intern/rna_modifier.c | 15 - source/blender/modifiers/CMakeLists.txt | 1 - source/blender/modifiers/MOD_modifiertypes.h | 1 - source/blender/modifiers/intern/MOD_skin.c | 88 -- source/blender/modifiers/intern/MOD_util.c | 1 - 11 files changed, 6 insertions(+), 1323 deletions(-) delete mode 100644 source/blender/blenkernel/intern/bsphere.c delete mode 100644 source/blender/modifiers/intern/MOD_skin.c (limited to 'source') diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index e549a205325..defcef58463 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -81,7 +81,6 @@ set(SRC intern/boids.c intern/booleanops_mesh.c intern/brush.c - intern/bsphere.c intern/bullet.c intern/bvhutils.c intern/cdderivedmesh.c diff --git a/source/blender/blenkernel/intern/bsphere.c b/source/blender/blenkernel/intern/bsphere.c deleted file mode 100644 index d8a75f62172..00000000000 --- a/source/blender/blenkernel/intern/bsphere.c +++ /dev/null @@ -1,1178 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2011 by Nicholas Bishop - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "MEM_guardedalloc.h" - -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" - -#include "BLI_utildefines.h" -#include "BLI_heap.h" -#include "BLI_ghash.h" -#include "BLI_listbase.h" -#include "BLI_math.h" - -#include "BKE_cdderivedmesh.h" -#include "BKE_DerivedMesh.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_main.h" -#include "BKE_subsurf.h" - -#include - -typedef struct Tri { - struct Tri *next, *prev; - unsigned int v[3]; - float no[3]; - float area; - int marked; -} Tri; - -typedef struct Edge { - struct Edge *next, *prev; - unsigned int v[2]; - Tri *tri[2]; -} Edge; - -/* note: a `frame' is four vertices (contiguous within the MVert - array), stored simply as the index of the first vertex */ - -static void create_frame(float frame[4][3], const float co[3], float radius, - const float mat[3][3], float x_offset) -{ - float rx[3], ry[3], rz[3]; - int i; - - mul_v3_v3fl(ry, mat[1], radius); - mul_v3_v3fl(rz, mat[2], radius); - - add_v3_v3v3(frame[3], co, ry); - add_v3_v3v3(frame[3], frame[3], rz); - - sub_v3_v3v3(frame[2], co, ry); - add_v3_v3v3(frame[2], frame[2], rz); - - sub_v3_v3v3(frame[1], co, ry); - sub_v3_v3v3(frame[1], frame[1], rz); - - add_v3_v3v3(frame[0], co, ry); - sub_v3_v3v3(frame[0], frame[0], rz); - - mul_v3_v3fl(rx, mat[0], x_offset); - for(i = 0; i < 4; i++) - add_v3_v3v3(frame[i], frame[i], rx); -} - -static void create_mid_frame(float frame[4][3], - const float co1[3], const float co2[3], - const SkinNode *n1, const SkinNode *n2, - const float mat[3][3]) -{ - create_frame(frame, co1, (n1->radius + n2->radius) / 2, - mat, len_v3v3(co1, co2) / 2); -} - -static void add_face(MFace *mface, int *totface, - int v1, int v2, int v3, int v4) -{ - MFace *f; - - f = &mface[*totface]; - f->v1 = v1; - f->v2 = v2; - f->v3 = v3; - f->v4 = v4 == -1 ? 0 : v4; - if(!v4) { - f->v1 = v3; - f->v2 = v4; - f->v3 = v1; - f->v4 = v2; - } - (*totface)++; -} - -static void connect_frames(MFace *mface, int *totface, int frame1, int frame2) -{ - int i; - - for(i = 0; i < 4; i++) { - add_face(mface, totface, - frame2 + i, - frame2 + (i+1) % 4, - frame1 + (i+1) % 4, - frame1 + i); - } -} - -static Tri *add_triangle(ListBase *tris, MVert *mvert, int v1, int v2, int v3) -{ - Tri *t; - - t = MEM_callocN(sizeof(Tri), "add_triangle.tri"); - t->v[0] = v1; - t->v[1] = v2; - t->v[2] = v3; - BLI_addtail(tris, t); - - normal_tri_v3(t->no, mvert[t->v[0]].co, mvert[t->v[1]].co, mvert[t->v[2]].co); - t->area = area_tri_v3(mvert[t->v[0]].co, mvert[t->v[1]].co, mvert[t->v[2]].co); - - return t; -} - -static int point_tri_side(const Tri *t, MVert *mvert, int v) -{ - float p[3], d; - sub_v3_v3v3(p, mvert[v].co, mvert[t->v[0]].co); - d = dot_v3v3(t->no, p); - if(d < 0) return -1; - else if(d > 0) return 1; - else return 0; -} - -static int mark_v_outside_tris(ListBase *tris, MVert *mvert, int v) -{ - Tri *t; - int outside = 0; - - /* probably there's a much better way to do this */ - for(t = tris->first; t; t = t->next) { - if((t->marked = point_tri_side(t, mvert, v) > 0)) - outside = 1; - } - return outside; -} - -static int edge_match(int e1_0, int e1_1, const unsigned int e2[2]) -{ - /* XXX: maybe isn't necesseary to check both directions? */ - return (e1_0 == e2[0] && e1_1 == e2[1]) || - (e1_0 == e2[1] && e1_1 == e2[0]); -} - -/* returns true if the edge (e1, e2) is already in edges; that edge is - deleted here as well. if not found just returns 0 */ -static int check_for_dup(ListBase *edges, unsigned int e1, unsigned int e2) -{ - Edge *e, *next; - - for(e = edges->first; e; e = next) { - next = e->next; - - if(edge_match(e1, e2, e->v)) { - /* remove the interior edge */ - BLI_freelinkN(edges, e); - return 1; - } - } - - return 0; -} - -static void expand_boundary_edges(ListBase *edges, Tri *t) -{ - Edge *new; - int i; - - /* insert each triangle edge into the boundary list; if any of - its edges are already in there, remove the edge entirely */ - for(i = 0; i < 3; i++) { - if(!check_for_dup(edges, t->v[i], t->v[(i+1)%3])) { - new = MEM_callocN(sizeof(Edge), "Edge"); - new->v[0] = t->v[i]; - new->v[1] = t->v[(i+1)%3]; - BLI_addtail(edges, new); - } - } -} - -static int tri_matches_frame(const Tri *t, int frame) -{ - int i, j, match = 0; - for(i = 0; i < 3; i++) { - for(j = 0; j < 4; j++) { - if(t->v[i] == frame + j) { - match++; - if(match >= 3) - return 1; - } - } - } - return 0; -} - -static void quad_from_tris(const Edge *e, int ndx[4]) -{ - int i, j, opp = -1; - - /* find what the second tri has that the first doesn't */ - for(i = 0; i < 3; i++) { - if(e->tri[1]->v[i] != e->tri[0]->v[0] && - e->tri[1]->v[i] != e->tri[0]->v[1] && - e->tri[1]->v[i] != e->tri[0]->v[2]) { - opp = e->tri[1]->v[i]; - break; - } - } - assert(opp != -1); - - for(i = 0, j = 0; i < 3; i++, j++) { - ndx[j] = e->tri[0]->v[i]; - /* when the triangle edge cuts across our quad-to-be, - throw in the second triangle's vertex */ - if((e->tri[0]->v[i] == e->v[0] || e->tri[0]->v[i] == e->v[1]) && - (e->tri[0]->v[(i+1)%3] == e->v[0] || e->tri[0]->v[(i+1)%3] == e->v[1])) { - j++; - ndx[j] = opp; - } - } -} - -static void add_quad_from_tris(MFace *mface, int *totface, const Edge *e) -{ - int ndx[4]; - - quad_from_tris(e, ndx); - - add_face(mface, totface, ndx[0], ndx[1], ndx[2], ndx[3]); -} - -static GHash *calc_edges(ListBase *tris) -{ - GHash *adj; - ListBase *edges; - Edge *e; - Tri *t; - int i, e1, e2; - - /* XXX: vertex range might be a little funky? so using a - hash here */ - adj = BLI_ghash_new(BLI_ghashutil_inthash, - BLI_ghashutil_intcmp, - "calc_edges adj"); - - for(t = tris->first; t; t = t->next) { - for(i = 0; i < 3; i++) { - e1 = t->v[i]; - e2 = t->v[(i+1)%3]; - assert(e1 != e2); - if(e1 > e2) - SWAP(int, e1, e2); - - edges = BLI_ghash_lookup(adj, SET_INT_IN_POINTER(e1)); - if(!edges) { - edges = MEM_callocN(sizeof(ListBase), - "calc_edges ListBase"); - BLI_ghash_insert(adj, SET_INT_IN_POINTER(e1), edges); - } - - /* find the edge in the adjacency list */ - for(e = edges->first; e; e = e->next) { - assert(e->v[0] == e1); - if(e->v[1] == e2) - break; - } - - /* if not found, create the edge */ - if(!e) { - e = MEM_callocN(sizeof(Edge), "calc_edges Edge"); - e->v[0] = e1; - e->v[1] = e2; - BLI_addtail(edges, e); - } - - /* should never be more than two faces - attached to an edge here */ - assert(!e->tri[0] || !e->tri[1]); - - if(!e->tri[0]) - e->tri[0] = t; - else if(!e->tri[1]) - e->tri[1] = t; - } - } - - return adj; -} - -static int is_quad_symmetric(const MVert *mvert, const Edge *e) -{ - int ndx[4]; - float a[3]; - - quad_from_tris(e, ndx); - - copy_v3_v3(a, mvert[ndx[0]].co); - a[0] = -a[0]; - - if(len_v3v3(a, mvert[ndx[1]].co) < FLT_EPSILON) { - copy_v3_v3(a, mvert[ndx[2]].co); - a[0] = -a[0]; - if(len_v3v3(a, mvert[ndx[3]].co) < FLT_EPSILON) - return 1; - } - else if(len_v3v3(a, mvert[ndx[3]].co) < FLT_EPSILON) { - copy_v3_v3(a, mvert[ndx[2]].co); - a[0] = -a[0]; - if(len_v3v3(a, mvert[ndx[1]].co) < FLT_EPSILON) - return 1; - } - - return 0; -} - -static void output_hull(const MVert *mvert, MFace *mface, int *totface, ListBase *tris) -{ - Heap *heap; - GHash *adj; - GHashIterator *iter; - ListBase *edges; - Edge *e; - Tri *t; - float score; - - heap = BLI_heap_new(); - adj = calc_edges(tris); - - /* unmark all triangles */ - for(t = tris->first; t; t = t->next) - t->marked = 0; - - /* build heap */ - iter = BLI_ghashIterator_new(adj); - while(!BLI_ghashIterator_isDone(iter)) { - edges = BLI_ghashIterator_getValue(iter); - for(e = edges->first; e; e = e->next) { - /* only care if the edge is used by more than - one triangle */ - if(e->tri[0] && e->tri[1]) { - score = (e->tri[0]->area + e->tri[1]->area) * - dot_v3v3(e->tri[0]->no, e->tri[1]->no); - - /* increase score if the triangles - form a symmetric quad */ - if(is_quad_symmetric(mvert, e)) - score *= 10; - - BLI_heap_insert(heap, -score, e); - } - } - - BLI_ghashIterator_step(iter); - } - BLI_ghashIterator_free(iter); - - while(!BLI_heap_empty(heap)) { - e = BLI_heap_popmin(heap); - - /* if both triangles still free, outupt as a quad */ - if(!e->tri[0]->marked && !e->tri[1]->marked) { - add_quad_from_tris(mface, totface, e); - e->tri[0]->marked = 1; - e->tri[1]->marked = 1; - } - } - - /* free edge list */ - iter = BLI_ghashIterator_new(adj); - while(!BLI_ghashIterator_isDone(iter)) { - edges = BLI_ghashIterator_getValue(iter); - BLI_freelistN(edges); - MEM_freeN(edges); - BLI_ghashIterator_step(iter); - } - BLI_ghashIterator_free(iter); - BLI_ghash_free(adj, NULL, NULL); - BLI_heap_free(heap, NULL); - - /* write out any remaining triangles */ - for(t = tris->first; t; t = t->next) { - if(!t->marked) - add_face(mface, totface, t->v[0], t->v[1], t->v[2], -1); - } -} - -/* for vertex `v', find which triangles must be deleted to extend the - hull; find the boundary edges of that hole so that it can be filled - with connections to the new vertex, and update the `tri' list to - delete the marked triangles */ -static void add_point(ListBase *tris, MVert *mvert, int v) -{ - ListBase edges = {NULL, NULL}; - Tri *t, *next; - Edge *e; - - for(t = tris->first; t; t = next) { - next = t->next; - - /* check if triangle is `visible' to v */ - if(t->marked) { - expand_boundary_edges(&edges, t); - /* remove the triangle */ - BLI_freelinkN(tris, t); - } - } - - /* fill hole boundary with triangles to new point */ - for(e = edges.first; e; e = e->next) - add_triangle(tris, mvert, e->v[0], e->v[1], v); - BLI_freelistN(&edges); -} - -static void build_hull(MFace *mface, int *totface, - MVert *mvert, int *frames, int totframe) -{ - ListBase tris = {NULL, NULL}; - Tri *t, *next; - int i, j; - - /* use first frame to make initial degenerate pyramid */ - add_triangle(&tris, mvert, frames[0], frames[0] + 1, frames[0] + 2); - add_triangle(&tris, mvert, frames[0] + 1, frames[0], frames[0] + 3); - add_triangle(&tris, mvert, frames[0] + 2, frames[0] + 1, frames[0] + 3); - add_triangle(&tris, mvert, frames[0], frames[0] + 2, frames[0] + 3); - - for(i = 1; i < totframe; i++) { - for(j = 0; j < 4; j++) { - int v = frames[i] + j; - - /* ignore point already inside hull */ - if(mark_v_outside_tris(&tris, mvert, v)) { - /* expand hull and delete interior triangles */ - add_point(&tris, mvert, v); - } - } - } - - /* remove triangles that would fill the original frames */ - for(t = tris.first; t; t = next) { - next = t->next; - - for(i = 0; i < totframe; i++) { - if(tri_matches_frame(t, frames[i])) { - BLI_freelinkN(&tris, t); - break; - } - } - } - - output_hull(mvert, mface, totface, &tris); - - BLI_freelistN(&tris); -} - -/* test: build hull on origdm */ -#if 0 -static DerivedMesh *test_hull(DerivedMesh *origdm) -{ - DerivedMesh *dm; - MVert *mvert, *origmvert; - MFace *mface; - int *frames; - int totvert = 0, totface = 0, totframe, i; - - /* TODO */ - totface = 2000; - totvert = origdm->getNumVerts(origdm); - dm = CDDM_new(totvert, 0, totface); - - mvert = CDDM_get_verts(dm); - mface = CDDM_get_faces(dm); - - origmvert = CDDM_get_verts(origdm); - for(i = 0; i < totvert; i++) - mvert[i] = origmvert[i]; - - assert(totvert % 4 == 0); - totframe = totvert / 4; - - frames = MEM_callocN(sizeof(int) * totframe, "frames"); - for(i = 0; i < totframe; i++) - frames[i] = i*4; - - totface = 0; - build_hull(mface, &totface, mvert, frames, totframe); - - CDDM_calc_edges(dm); - //CDDM_calc_normals(dm); - - MEM_freeN(frames); - - return dm; -} -#endif - -/* TODO */ -static void calc_edge_mat(float mat[3][3], const float a[3], const float b[3]) -{ - float Z[3] = {0, 0, 1}; - float dot; - - /* x = edge direction */ - sub_v3_v3v3(mat[0], b, a); - normalize_v3(mat[0]); - - dot = dot_v3v3(mat[0], Z); - if(dot > -1 + FLT_EPSILON && dot < 1 - FLT_EPSILON) { - /* y = Z cross x */ - cross_v3_v3v3(mat[1], Z, mat[0]); - normalize_v3(mat[1]); - - /* z = x cross y */ - cross_v3_v3v3(mat[2], mat[0], mat[1]); - normalize_v3(mat[2]); - } - else { - mat[1][0] = 1; - mat[1][1] = 0; - mat[1][2] = 0; - mat[2][0] = 0; - mat[2][1] = 1; - mat[2][2] = 0; - } -} - -/* BMesh paper */ -#if 0 -static float calc_R_sub_i_squared(const BSphereNode *n) -{ - const float alpha = 1.5; - //const float alpha = 1; - const float R_sub_i = n->size[0] * alpha; - return R_sub_i * R_sub_i; -} - -/* equation (2) */ -static float calc_r_squared(const float v[3], const BSphereNode *n) -{ - return len_squared_v3v3(v, n->co); -} - -/* equation (1) */ -static float calc_f_sub_i(const float v[3], const BSphereNode *n) -{ - float r_squared; - float R_sub_i_squared; - - r_squared = calc_r_squared(v, n); - R_sub_i_squared = calc_R_sub_i_squared(n); - - if(r_squared <= R_sub_i_squared) - return powf(1.0f - (r_squared / R_sub_i_squared), 2); - else - return 0; -} - -/* equation (3) */ -static float calc_I(const float x[3], float T, const ListBase *base) -{ - BSphereNode *n; - float a = -T; - - for(n = base->first; n; n = n->next) { - a += calc_I(x, 0, &n->children); - a += calc_f_sub_i(x, n); - } - - //printf("calc_I: %f, %f\n", -T, a); - - return a; -} - -/* kinda my own guess here */ -static void calc_gradient(float g[3], const float x[3], const ListBase *base) -{ - BSphereNode *n; - - for(n = base->first; n; n = n->next) { - float R_sub_i_squared = calc_R_sub_i_squared(n); - float dist = len_v3v3(x, n->co); - float f = calc_f_sub_i(x, n); - float d = 1.0f / R_sub_i_squared; - float tmp[3]; - - /* XXX: other possibilities... */ - if(f > 0) { - sub_v3_v3v3(tmp, x, n->co); - mul_v3_fl(tmp, -4*d * (1 - d * dist)); - - /* not sure if I'm doing this right; intent is - to flip direction when x is `beneath' the - level set */ - if(len_v3v3(x, n->co) > n->size[0]) - negate_v3(tmp); - - add_v3_v3(g, tmp); - } - - calc_gradient(g, x, &n->children); - } -} - -/* equation (5) */ -static float calc_F(const float x[3], const float K[2], float T, const ListBase *base) -{ - float f_of_K; - float I_target; - - /* TODO */ - f_of_K = 1.0f / (1 + fabs(K[0]) + fabs(K[1])); - //f_of_K = 1; - - /* TODO */ - I_target = 0; - - return (calc_I(x, T, base) - I_target) /*TODO: * f_of_K*/; -} - -static float smallest_radius(const ListBase *base) -{ - BSphereNode *n; - float s = FLT_MAX, t; - - for(n = base->first; n; n = n->next) { - if(n->size[0] < s) - s = n->size[0]; - if((t = smallest_radius(&n->children)) < s) - s = t; - } - - return s; -} - -/* equation (7) */ -static float calc_delta_t(float F_max, float k, const ListBase *base, int print) -{ - float min_r_sub_i; - float step; - - min_r_sub_i = smallest_radius(base); - step = min_r_sub_i / powf(2, k); - - if(print) { - printf("min_r: %f, 2^k=%f, step=%f\n", min_r_sub_i, powf(2, k), step); - } - - return step / F_max; -} - -/* equation (6) */ -static float evolve_x(float x[3], const float K[2], float T, - int k, const ListBase *base, int i, float F_max) -{ - float tmp[3], no[3]; - float F, dt; - - F = calc_F(x, K, T, base); - - if(F < FLT_EPSILON) { - //printf("stability reached for ndx=%d\n", i); - return 0; - } - - /* TODO ;-) */ - if(F > F_max) - F_max = F; - - dt = calc_delta_t(F_max, k, base, 0); - - dt = F / 2; - - if(i == 0) - ;//printf("F=%.3f, dt=%.3f\n", F, calc_delta_t(F_max, k, base, 1)); - - zero_v3(no); - calc_gradient(no, x, base); - normalize_v3(no); - negate_v3(no); - - mul_v3_v3fl(tmp, no, F * dt); - add_v3_v3(x, tmp); - - return F_max; -} - -static void bsphere_evolve(MVert *mvert, int totvert, const ListBase *base, - float T, int steps, float subdiv_level) -{ - int i, s; - - for(i = 0; i < totvert; i++) { - float F_max = 0; - /* TODO: for now just doing a constant number of steps */ - for(s = 0; s < steps; s++) { - /* TODO */ - float K[2] = {0, 0}; - - F_max = evolve_x(mvert[i].co, K, T, subdiv_level, base, i, F_max); - } - } -} -#endif - -typedef enum { - START_CAP = 1, - END_CAP = 2, - NODE_BISECT = 4, - CHILD_EDGE_BISECT = 8, - - IN_FRAME = 16, - OUT_FRAME = 32, -} FrameFlag; - -typedef struct { - int totframe; - int outbase; - FrameFlag flag; - float co[0][4][3]; -} Frames; - -static Frames *frames_create(FrameFlag flag) -{ - Frames *frames; - int totframe; - totframe = (!!(flag & START_CAP) + !!(flag & END_CAP) + - !!(flag & NODE_BISECT) + !!(flag & CHILD_EDGE_BISECT)); - assert(totframe); - frames = MEM_callocN(sizeof(Frames) + sizeof(float)*totframe*4*3, - "frames_create.frames"); - frames->totframe = totframe; - frames->flag = flag; - assert((flag & (END_CAP|CHILD_EDGE_BISECT)) != (END_CAP|CHILD_EDGE_BISECT)); - return frames; -} - -static int frame_offset(Frames *frames, FrameFlag flag) -{ - int n = 0; - - assert(flag == IN_FRAME || flag == OUT_FRAME || - !(flag & (IN_FRAME|OUT_FRAME))); - - if(flag == IN_FRAME) - return 0; - else if(flag == OUT_FRAME) - return frames->totframe-1; - - assert((flag & frames->flag) == flag); - - if(flag == START_CAP) return n; - if(frames->flag & START_CAP) n++; - - if(flag == NODE_BISECT) return n; - if(frames->flag & NODE_BISECT) n++; - - if(flag == END_CAP) return n; - if(frames->flag & END_CAP) n++; - - if(flag == CHILD_EDGE_BISECT) return n; - if(frames->flag & CHILD_EDGE_BISECT) n++; - - assert(!"bad frame offset flag"); -} - -static int frame_base(Frames *frames, FrameFlag flag) -{ - return frames->outbase + 4*frame_offset(frames, flag); -} - -static void *frame_co(Frames *frames, FrameFlag flag) -{ - return frames->co[frame_offset(frames, flag)]; -} - -static int frames_totvert(Frames *frames) -{ - return frames->totframe*4; -} - -#if 0 -static int bsphere_build_frames(BSphereNode *n, GHash *ghash, - float (*parent_mat)[3], FrameFlag flag); - -/* builds the `cap' of polygons for the end of a BSphere chain */ -static int bsphere_end_node_frames(BSphereNode *n, - GHash *ghash, - float parent_mat[3][3], - FrameFlag flag) -{ - Frames *frames; - float rad; - - assert(flag == 0 || flag == START_CAP); - frames = frames_create(NODE_BISECT|END_CAP|flag, n, ghash); - - /* TODO */ - rad = n->size[0]; - - if(flag & START_CAP) - create_frame(frame_co(frames, START_CAP), n, parent_mat, -rad, rad); - - /* frame to bisect the node */ - create_frame(frame_co(frames, NODE_BISECT), n, parent_mat, 0, rad); - - /* frame to cap end node */ - create_frame(frame_co(frames, END_CAP), n, parent_mat, rad, rad); - - return frames_totvert(frames); -} - -static int bsphere_connection_node_frames(BSphereNode *n, - GHash *ghash, - float parent_mat[3][3], - FrameFlag flag) -{ - Frames *frames; - BSphereNode *child; - float childmat[3][3], nodemat[3][3], axis[3], angle, rad, child_rad; - int totvert; - - assert(flag == 0 || flag == START_CAP); - - child = n->children.first; - - /* if child is not a branch node, bisect the child edge */ - if(BLI_countlist(&child->children) <= 1) - flag |= CHILD_EDGE_BISECT; - - frames = frames_create(NODE_BISECT|flag, n, ghash); - totvert = frames_totvert(frames); - - /* TODO */ - rad = n->size[0]; - child_rad = child->size[0]; - - /* build matrix to give to child */ - sub_v3_v3v3(childmat[0], child->co, n->co); - normalize_v3(childmat[0]); - angle = angle_normalized_v3v3(parent_mat[0], childmat[0]); - cross_v3_v3v3(axis, parent_mat[0], childmat[0]); - normalize_v3(axis); - rotate_normalized_v3_v3v3fl(childmat[1], parent_mat[1], axis, angle); - rotate_normalized_v3_v3v3fl(childmat[2], parent_mat[2], axis, angle); - - /* build child */ - totvert += bsphere_build_frames(child, ghash, childmat, 0); - - /* frame that bisects the node */ - angle /= 2; - copy_v3_v3(nodemat[0], parent_mat[0]); - rotate_normalized_v3_v3v3fl(nodemat[1], parent_mat[1], axis, angle); - rotate_normalized_v3_v3v3fl(nodemat[2], parent_mat[2], axis, angle); - create_frame(frame_co(frames, NODE_BISECT), n, nodemat, 0, rad); - - if(flag & START_CAP) - create_frame(frame_co(frames, START_CAP), n, nodemat, -rad, rad); - - if(flag & CHILD_EDGE_BISECT) - create_mid_frame(frame_co(frames, CHILD_EDGE_BISECT), n, child, childmat); - - return totvert; -} - -static int bsphere_branch_node_frames(BSphereNode *n, GHash *ghash) -{ - BSphereNode *child; - int totvert = 0; - float rad; - - rad = n->size[0]; - - /* build children */ - for(child = n->children.first; child; child = child->next) { - float childmat[3][3]; - - calc_edge_mat(childmat, n->co, child->co); - - totvert += bsphere_build_frames(child, ghash, childmat, 0); - } - - /* TODO: for now, builds no frames of its own */ - - return totvert; -} - -static int bsphere_build_frames(BSphereNode *n, GHash *ghash, - float parent_mat[3][3], FrameFlag flag) -{ - BSphereNode *child; - - child = n->children.first; - - if(!child) - return bsphere_end_node_frames(n, ghash, parent_mat, flag); - else if(!child->next) - return bsphere_connection_node_frames(n, ghash, parent_mat, flag); - else - return bsphere_branch_node_frames(n, ghash); -} - -static GHash *bsphere_frames(BSphere *bs, int *totvert) -{ - GHash *ghash; - BSphereNode *n, *child; - - ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, - "bsphere_frames.ghash"); - (*totvert) = 0; - - for(n = bs->rootbase.first; n; n = n->next) { - float mat[3][3]; - - child = n->children.first; - if(!child || (child && child->next)) { - set_v3(mat[0], 0, 0, 1); - set_v3(mat[1], 1, 0, 0); - set_v3(mat[2], 0, 1, 0); - } - else if(!child->next) { - calc_edge_mat(mat, n->co, child->co); - } - - (*totvert) += bsphere_build_frames(n, ghash, mat, START_CAP); - } - - return ghash; -} - -static void output_frames(Frames *frames, MVert *mvert, MFace *mface, - int *totvert, int *totface) -{ - int b, i, j; - - frames->outbase = (*totvert); - for(i = 0; i < frames->totframe; i++) { - for(j = 0; j < 4; j++) { - copy_v3_v3(mvert[(*totvert)].co, frames->co[i][j]); - (*totvert)++; - } - - if(i > 0) { - connect_frames(mface, totface, - frames->outbase + 4*(i-1), - frames->outbase + 4*i); - } - } - - if(frames->flag & START_CAP) { - b = frame_base(frames, START_CAP); - add_face(mface, totface, b, b+1, b+2, b+3); - } - if(frames->flag & END_CAP) { - b = frame_base(frames, END_CAP); - add_face(mface, totface, b+3, b+2, b+1, b+0); - } -} - -static void bsphere_build_skin(BSphereNode *parent, ListBase *base, - GHash *frames, MVert *mvert, - MFace *mface, int *totvert, int *totface) -{ - BSphereNode *n, *child; - Frames *node_frames, *child_frames, *parent_frames; - int *hull_frames, totchild, i; - - for(n = base->first; n; n = n->next) { - if((node_frames = BLI_ghash_lookup(frames, n))) - output_frames(node_frames, mvert, mface, totvert, totface); - - bsphere_build_skin(n, &n->children, frames, mvert, mface, totvert, totface); - - child = n->children.first; - if(child && !child->next) { - child_frames = BLI_ghash_lookup(frames, child); - if(child_frames) { - connect_frames(mface, totface, - frame_base(node_frames, OUT_FRAME), - frame_base(child_frames, IN_FRAME)); - } - } - else if(child && child->next) { - totchild = BLI_countlist(&n->children); - hull_frames = MEM_callocN(sizeof(int) * (1+totchild), - "bsphere_build_skin.hull_frames"); - i = 0; - for(child = n->children.first; child; child = child->next) { - child_frames = BLI_ghash_lookup(frames, child); - assert(child_frames); - hull_frames[i++] = frame_base(child_frames, IN_FRAME); - } - parent_frames = BLI_ghash_lookup(frames, parent); - if(parent_frames) - hull_frames[i] = frame_base(parent_frames, OUT_FRAME); - else - totchild--; - build_hull(mface, totface, mvert, hull_frames, totchild+1); - MEM_freeN(hull_frames); - } - } -} - -static DerivedMesh *bsphere_base_skin(BSphere *bs) -{ - DerivedMesh *dm; - GHash *ghash; - MVert *mvert; - MFace *mface; - int totvert, totface = 0; - - /* no nodes, nothing to do */ - if(!bs->rootbase.first) - return NULL; - - /* could probably do all this in one fell [recursive] swoop - using some tricksies and clevers, but multiple passes is - easier :) */ - ghash = bsphere_frames(bs, &totvert); - - totface = totvert * 1.5; - /* XXX: sizes OK? */ - dm = CDDM_new(totvert, 0, totface); - - mvert = CDDM_get_verts(dm); - mface = CDDM_get_faces(dm); - - totvert = totface = 0; - bsphere_build_skin(NULL, &bs->rootbase, ghash, mvert, mface, &totvert, &totface); - BLI_ghash_free(ghash, NULL, (void*)MEM_freeN); - - CDDM_lower_num_verts(dm, totvert); - CDDM_lower_num_faces(dm, totface); - - CDDM_calc_edges(dm); - CDDM_calc_normals(dm); - - return dm; -} - -/* generate random points (just for testing) */ -DerivedMesh *bsphere_random_points(BSphere *UNUSED(bs)) -{ - DerivedMesh *dm; - MVert *mvert; - const int totvert = 1;//50000; - int i; - - dm = CDDM_new(totvert, 0, 0); - - mvert = CDDM_get_verts(dm); - - srand(1); - for(i = 0; i < totvert; i++) { - mvert[i].co[0] = rand() / (float)RAND_MAX - 0.5; - mvert[i].co[1] = rand() / (float)RAND_MAX - 0.5; - mvert[i].co[2] = rand() / (float)RAND_MAX - 0.5; - } - - return dm; -} - -DerivedMesh *bsphere_test_surface(BSphere *bs, DerivedMesh *input) -{ - DerivedMesh *dm; - MVert *mvert; - - if(!input) - return NULL; - - dm = CDDM_copy(input); - mvert = CDDM_get_verts(dm); - bsphere_evolve(mvert, input->getNumVerts(input), &bs->rootbase, - bs->skin_threshold, bs->evolve, 2); - - return dm; -} - -DerivedMesh *bsphere_test_gradient(BSphere *bs, DerivedMesh *input) -{ - DerivedMesh *dm; - MVert *mvert; - MEdge *medge; - int totvert; - int i; - - if(!input) - return NULL; - - totvert = input->getNumVerts(input); - dm = CDDM_new(totvert*2, totvert, 0); - - mvert = CDDM_get_verts(dm); - medge = CDDM_get_edges(dm); - - memcpy(mvert, CDDM_get_verts(input), sizeof(MVert) * totvert); - - for(i = 0; i < totvert; i++) { - const float *b = mvert[i].co; - float *g = mvert[totvert+i].co; - float K[2] = {0, 0}; - - zero_v3(g); - calc_gradient(g, b, &bs->rootbase); - normalize_v3(g); - - mul_v3_fl(g, -calc_F(b, K, bs->skin_threshold, &bs->rootbase)); - add_v3_v3(g, b); - - medge[i].v1 = i; - medge[i].v2 = totvert+i; - } - - return dm; -} - -DerivedMesh *bsphere_get_skin_dm(BSphere *bs) -{ - DerivedMesh *dm, *subdm; - - dm = bsphere_base_skin(bs); - - /* subdivide once */ - if(dm && bs->subdiv_level > 0) { - SubsurfModifierData smd; - - memset(&smd, 0, sizeof(smd)); - smd.subdivType = ME_CC_SUBSURF; - smd.levels = bs->subdiv_level; - subdm = subsurf_make_derived_from_derived(dm, &smd, 0, 0, 0, 0); - dm->release(dm); - /* for convenience, convert back to cddm (could use ccgdm - later for better performance though? (TODO)) */ - dm = CDDM_copy(subdm); - subdm->release(subdm); - - bsphere_evolve(CDDM_get_verts(dm), dm->getNumVerts(dm), &bs->rootbase, - bs->skin_threshold, bs->evolve, bs->subdiv_level); - } - - return dm; -} -#endif diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index b9d6badfbe9..8d19322c0db 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -805,15 +805,7 @@ static void layerDefault_mcol(void *data, int count) mcol[i] = default_mcol; } -static void layerDefault_skin(void *data, int count) -{ - SkinNode *n = data; - int i; - - for(i = 0; i < count; i++) { - n[i].radius = 0.25; - } -} + static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { {sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL}, @@ -851,8 +843,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerSwap_mcol, layerDefault_mcol}, {sizeof(MCol)*4, "MCol", 4, "TexturedCol", NULL, NULL, layerInterp_mcol, layerSwap_mcol, layerDefault_mcol}, - {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}, - {sizeof(SkinNode), "SkinNode", 1, "Skin", NULL, NULL, NULL, NULL, layerDefault_skin} + {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL} }; static const char *LAYERTYPENAMES[CD_NUMTYPES] = { @@ -860,7 +851,7 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = { /* 5-9 */ "CDMTFace", "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags", /* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", /* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps", - /* 20-24 */ "CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco", "CDSkinNode" + /* 20-23 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco" }; const CustomDataMask CD_MASK_BAREMESH = @@ -868,12 +859,10 @@ const CustomDataMask CD_MASK_BAREMESH = const CustomDataMask CD_MASK_MESH = CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE | CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL | - CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | - CD_MASK_SKIN_NODE; + CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS; const CustomDataMask CD_MASK_EDITMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | - CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | - CD_MASK_SKIN_NODE; + CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS; const CustomDataMask CD_MASK_DERIVEDMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO | diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h index 061e9460956..cdfcf465c6c 100644 --- a/source/blender/makesdna/DNA_customdata_types.h +++ b/source/blender/makesdna/DNA_customdata_types.h @@ -92,8 +92,7 @@ typedef struct CustomData { #define CD_ID_MCOL 21 #define CD_TEXTURE_MCOL 22 #define CD_CLOTH_ORCO 23 -#define CD_SKIN_NODE 24 -#define CD_NUMTYPES 25 +#define CD_NUMTYPES 24 /* Bits for CustomDataMask */ #define CD_MASK_MVERT (1 << CD_MVERT) @@ -118,7 +117,6 @@ typedef struct CustomData { #define CD_MASK_MDISPS (1 << CD_MDISPS) #define CD_MASK_WEIGHT_MCOL (1 << CD_WEIGHT_MCOL) #define CD_MASK_CLOTH_ORCO (1 << CD_CLOTH_ORCO) -#define CD_MASK_SKIN_NODE (1 << CD_SKIN_NODE) /* CustomData.flag */ diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index a71c4970eb5..e3510b3a25a 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -184,11 +184,6 @@ typedef struct PartialVisibility { unsigned int totface, totedge, totvert, pad; } PartialVisibility; -typedef struct SkinNode { - float radius; - int pad; -} SkinNode; - /* mvert->flag (1=SELECT) */ #define ME_SPHERETEST 2 #define ME_VERT_TMP_TAG 4 diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 483bd339b3d..3787675f339 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -71,7 +71,6 @@ typedef enum ModifierType { eModifierType_Solidify, eModifierType_Screw, eModifierType_Warp, - eModifierType_Skin, NUM_MODIFIER_TYPES } ModifierType; @@ -786,17 +785,4 @@ typedef enum { /* PROP_RANDOM not used */ } WarpModifierFalloff; -typedef enum SkinModifierFlags { - MOD_SKIN_DRAW_SKIN = (1<<0), - MOD_SKIN_DRAW_NODES = (1<<1), -} SkinModifierFlags; - -typedef struct SkinModifierData { - ModifierData modifier; - float threshold; - int subdiv; - int flag; - int pad; -} SkinModifierData; - #endif diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index b4a4c593ba9..ba655915fb6 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -68,7 +68,6 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, - {eModifierType_Skin, "SKIN", ICON_MOD_ARMATURE, "Skin", ""}, {0, "", 0, "Deform", ""}, {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""}, {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""}, @@ -184,8 +183,6 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr) return &RNA_ScrewModifier; case eModifierType_Warp: return &RNA_WarpModifier; - case eModifierType_Skin: - return &RNA_SkinModifier; default: return &RNA_Modifier; } @@ -2415,17 +2412,6 @@ static void rna_def_modifier_screw(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ } -static void rna_def_modifier_skin(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna= RNA_def_struct(brna, "SkinModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Skin Modifier", "Generate Skin"); - RNA_def_struct_sdna(srna, "SkinModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_ARMATURE); -} - void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -2523,7 +2509,6 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_smoke(brna); rna_def_modifier_solidify(brna); rna_def_modifier_screw(brna); - rna_def_modifier_skin(brna); } #endif diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index 7db03f48631..d1f153265ac 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -70,7 +70,6 @@ set(SRC intern/MOD_shapekey.c intern/MOD_shrinkwrap.c intern/MOD_simpledeform.c - intern/MOD_skin.c intern/MOD_smoke.c intern/MOD_smooth.c intern/MOD_softbody.c diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h index 329037ee210..4e44a226c64 100644 --- a/source/blender/modifiers/MOD_modifiertypes.h +++ b/source/blender/modifiers/MOD_modifiertypes.h @@ -72,7 +72,6 @@ extern ModifierTypeInfo modifierType_ShapeKey; extern ModifierTypeInfo modifierType_Solidify; extern ModifierTypeInfo modifierType_Screw; extern ModifierTypeInfo modifierType_Warp; -extern ModifierTypeInfo modifierType_Skin; /* MOD_util.c */ void modifier_type_init(ModifierTypeInfo *types[]); diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c deleted file mode 100644 index adc47f32c9c..00000000000 --- a/source/blender/modifiers/intern/MOD_skin.c +++ /dev/null @@ -1,88 +0,0 @@ -/* -* $Id$ -* -* ***** 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. -* -* ***** END GPL LICENSE BLOCK ***** -* -*/ - -/** \file blender/modifiers/intern/MOD_skin.c - * \ingroup modifiers - */ - - -#include - -#include "BKE_cdderivedmesh.h" -#include "BKE_modifier.h" - -#include "DNA_mesh_types.h" -#include "DNA_object_types.h" - -#include "MOD_util.h" - -static void initData(ModifierData *md) -{ - SkinModifierData *smd = (SkinModifierData*)md; - - smd->threshold = 0; - smd->subdiv = 1; - smd->flag = MOD_SKIN_DRAW_NODES; -} - -static void copyData(ModifierData *md, ModifierData *target) -{ - SkinModifierData *smd = (SkinModifierData*) md; - SkinModifierData *tsmd = (SkinModifierData*) target; - - tsmd->threshold = smd->threshold; - tsmd->subdiv = smd->subdiv; - tsmd->flag = smd->flag; -} - -static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, - int useRenderParams, int isFinalCalc) -{ - return dm; -} - - -ModifierTypeInfo modifierType_Skin = { - /* name */ "Skin", - /* structName */ "SkinModifierData", - /* structSize */ sizeof(SkinModifierData), - /* type */ eModifierTypeType_Constructive, - /* flags */ eModifierTypeFlag_AcceptsMesh, - - /* copyData */ copyData, - /* deformVerts */ NULL, - /* deformMatrices */ NULL, - /* deformVertsEM */ NULL, - /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, - /* applyModifierEM */ NULL, - /* initData */ initData, - /* requiredDataMask */ NULL, - /* freeData */ NULL, - /* isDisabled */ NULL, - /* updateDepgraph */ NULL, - /* dependsOnTime */ NULL, - /* dependsOnNormals */ NULL, - /* foreachObjectLink */ NULL, - /* foreachIDLink */ NULL, -}; diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index e823a347ced..e9b835eab81 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -295,6 +295,5 @@ void modifier_type_init(ModifierTypeInfo *types[]) INIT_TYPE(Solidify); INIT_TYPE(Screw); INIT_TYPE(Warp); - INIT_TYPE(Skin); #undef INIT_TYPE } -- cgit v1.2.3 From 670f58023c478995ed055e194482ab288db436a7 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sun, 31 Jul 2011 02:34:53 +0000 Subject: == PBVH == OK, after that failure of committing a bunch of old junk, hopefully this is what I actually meant to commit :) * Added big comments to some of the fields in struct PBVHNode. I always forget the details of these, so finally wrote it down properly. * Changed types of PBVHNode.face_vert_indices and PBVHNode.flag to better reflect their contents. * There should be no functional changes here. --- source/blender/blenlib/intern/pbvh.c | 83 +++++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 20 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c index 85d79ae3b85..0613765b868 100644 --- a/source/blender/blenlib/intern/pbvh.c +++ b/source/blender/blenlib/intern/pbvh.c @@ -26,7 +26,6 @@ - #include "DNA_meshdata_types.h" #include "MEM_guardedalloc.h" @@ -85,25 +84,61 @@ struct PBVHNode { /* Opaque handle for drawing code */ void *draw_buffers; - int *vert_indices; - /* Voxel bounds */ BB vb; BB orig_vb; - /* For internal nodes */ + /* For internal nodes, the offset of the children in the PBVH + 'nodes' array. */ int children_offset; - /* Pointer into bvh prim_indices */ - int *prim_indices; - int *face_vert_indices; + /* Pointer into the PBVH prim_indices array and the number of + primitives used by this leaf node. + Used for leaf nodes in both mesh- and multires-based PBVHs. + */ + int *prim_indices; unsigned int totprim; + + /* Array of indices into the mesh's MVert array. Contains the + indices of all vertices used by faces that are within this + node's bounding box. + + Note that a vertex might be used by a multiple faces, and + these faces might be in different leaf nodes. Such a vertex + will appear in the vert_indices array of each of those leaf + nodes. + + In order to support cases where you want access to multiple + nodes' vertices without duplication, the vert_indices array + is ordered such that the first part of the array, up to + index 'uniq_verts', contains "unique" vertex indices. These + vertices might not be truly unique to this node, but if + they appear in another node's vert_indices array, they will + be above that node's 'uniq_verts' value. + + Used for leaf nodes in a mesh-based PBVH (not multires.) + */ + int *vert_indices; unsigned int uniq_verts, face_verts; - char flag; + /* An array mapping face corners into the vert_indices + array. The array is sized to match 'totprim', and each of + the face's corners gets an index into the vert_indices + array, in the same order as the corners in the original + MFace. The fourth value should not be used if the original + face is a triangle. + + Used for leaf nodes in a mesh-based PBVH (not multires.) + */ + int (*face_vert_indices)[4]; + + /* Indicates whether this node is a leaf or not; also used for + marking various updates that need to be applied. */ + PBVHNodeFlags flag : 8; - float tmin; // used for raycasting, is how close bb is to the ray point + /* Used for raycasting: how close bb is to the ray point. */ + float tmin; int proxy_count; PBVHProxyNode* proxies; @@ -339,15 +374,15 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) node->uniq_verts = node->face_verts = 0; totface= node->totprim; - node->face_vert_indices = MEM_callocN(sizeof(int) * - 4*totface, "bvh node face vert indices"); + node->face_vert_indices = MEM_callocN(sizeof(int) * 4*totface, + "bvh node face vert indices"); for(i = 0; i < totface; ++i) { MFace *f = bvh->faces + node->prim_indices[i]; int sides = f->v4 ? 4 : 3; for(j = 0; j < sides; ++j) { - node->face_vert_indices[i*4 + j]= + node->face_vert_indices[i][j]= map_insert_vert(bvh, map, &node->face_verts, &node->uniq_verts, (&f->v1)[j]); } @@ -373,9 +408,17 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) BLI_ghashIterator_free(iter); - for(i = 0; i < totface*4; ++i) - if(node->face_vert_indices[i] < 0) - node->face_vert_indices[i]= -node->face_vert_indices[i] + node->uniq_verts - 1; + for(i = 0; i < totface; ++i) { + MFace *f = bvh->faces + node->prim_indices[i]; + int sides = f->v4 ? 4 : 3; + + for(j = 0; j < sides; ++j) { + if(node->face_vert_indices[i][j] < 0) + node->face_vert_indices[i][j]= + -node->face_vert_indices[i][j] + + node->uniq_verts - 1; + } + } if(!G.background) { node->draw_buffers = @@ -1340,20 +1383,20 @@ int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3], if(bvh->faces) { MVert *vert = bvh->verts; int *faces= node->prim_indices; - int *face_verts= node->face_vert_indices; int totface= node->totprim; int i; for(i = 0; i < totface; ++i) { MFace *f = bvh->faces + faces[i]; + int *face_verts = node->face_vert_indices[i]; if(origco) { /* intersect with backuped original coordinates */ hit |= ray_face_intersection(ray_start, ray_normal, - origco[face_verts[i*4+0]], - origco[face_verts[i*4+1]], - origco[face_verts[i*4+2]], - f->v4? origco[face_verts[i*4+3]]: NULL, + origco[face_verts[0]], + origco[face_verts[1]], + origco[face_verts[2]], + f->v4? origco[face_verts[3]]: NULL, dist); } else { -- cgit v1.2.3 From f4293067c1420827ddfa62e62430870c6b790a8a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 31 Jul 2011 03:15:37 +0000 Subject: py api: sphinx doc corrections, pep8 cleanup and style edits, also added __all__ to some modules which were missing it. --- source/blender/python/intern/bpy_rna.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 2dcfe3731c7..502b25842de 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -6411,7 +6411,9 @@ PyDoc_STRVAR(pyrna_register_class_doc, " If the class has a *register* class method it will be called\n" " before registration.\n" "\n" -" .. note:: :exc:`ValueError` exception is raised if the class is not a\n" +" .. note::\n" +"\n" +" :exc:`ValueError` exception is raised if the class is not a\n" " subclass of a registerable blender class.\n" "\n" ); -- cgit v1.2.3 From e8c3c4097a146b059fa52893a2a1b6e89cdb3094 Mon Sep 17 00:00:00 2001 From: "Guillermo S. Romero" Date: Sun, 31 Jul 2011 06:03:14 +0000 Subject: SVN maintenance. --- source/blender/editors/interface/interface_anim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 03003173e20..d9691819b29 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -1,5 +1,5 @@ /* - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * -- cgit v1.2.3 From c19e88ac26e266bd8ba7a6f15c45e3447ac5624c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 31 Jul 2011 07:45:54 +0000 Subject: fix for building without bullet --- source/gameengine/Ketsji/KX_PyConstraintBinding.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp index 843dbe21995..a7d213bff79 100644 --- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -43,7 +43,9 @@ #include "PyObjectPlus.h" -#include "LinearMath/btIDebugDraw.h" +#ifdef USE_BULLET +# include "LinearMath/btIDebugDraw.h" +#endif #ifdef WITH_PYTHON @@ -690,6 +692,7 @@ PyObject* initPythonConstraintBinding() PyDict_SetItemString(d, "error", ErrorObject); Py_DECREF(ErrorObject); +#ifdef USE_BULLET //Debug Modes constants to be used with setDebugMode() python function KX_MACRO_addTypesToDict(d, DBG_NODEBUG, btIDebugDraw::DBG_NoDebug); KX_MACRO_addTypesToDict(d, DBG_DRAWWIREFRAME, btIDebugDraw::DBG_DrawWireframe); @@ -705,6 +708,7 @@ PyObject* initPythonConstraintBinding() KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTS, btIDebugDraw::DBG_DrawConstraints); KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTLIMITS, btIDebugDraw::DBG_DrawConstraintLimits); KX_MACRO_addTypesToDict(d, DBG_FASTWIREFRAME, btIDebugDraw::DBG_FastWireframe); +#endif // USE_BULLET //Constraint types to be used with createConstraint() python function KX_MACRO_addTypesToDict(d, POINTTOPOINT_CONSTRAINT, PHY_POINT2POINT_CONSTRAINT); -- cgit v1.2.3 From c7a1a191532721e3a88cb412537027fa4dfca641 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 31 Jul 2011 07:54:24 +0000 Subject: whitespace edits, had odd space/tab mix --- .../gameengine/Ketsji/KX_PyConstraintBinding.cpp | 325 ++++++++++----------- 1 file changed, 157 insertions(+), 168 deletions(-) (limited to 'source') diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp index a7d213bff79..0600e59a1ec 100644 --- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -92,8 +92,8 @@ static char gPyGetAppliedImpulse__doc__[] = "getAppliedImpulse(int constraintId) static PyObject* gPySetGravity(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float x,y,z; if (PyArg_ParseTuple(args,"fff",&x,&y,&z)) @@ -109,8 +109,8 @@ static PyObject* gPySetGravity(PyObject* self, } static PyObject* gPySetDebugMode(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int mode; if (PyArg_ParseTuple(args,"i",&mode)) @@ -132,8 +132,8 @@ static PyObject* gPySetDebugMode(PyObject* self, static PyObject* gPySetNumTimeSubSteps(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int substep; if (PyArg_ParseTuple(args,"i",&substep)) @@ -151,8 +151,8 @@ static PyObject* gPySetNumTimeSubSteps(PyObject* self, static PyObject* gPySetNumIterations(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int iter; if (PyArg_ParseTuple(args,"i",&iter)) @@ -169,10 +169,9 @@ static PyObject* gPySetNumIterations(PyObject* self, } - static PyObject* gPySetDeactivationTime(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float deactive_time; if (PyArg_ParseTuple(args,"f",&deactive_time)) @@ -190,8 +189,8 @@ static PyObject* gPySetDeactivationTime(PyObject* self, static PyObject* gPySetDeactivationLinearTreshold(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float linearDeactivationTreshold; if (PyArg_ParseTuple(args,"f",&linearDeactivationTreshold)) @@ -209,8 +208,8 @@ static PyObject* gPySetDeactivationLinearTreshold(PyObject* self, static PyObject* gPySetDeactivationAngularTreshold(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float angularDeactivationTreshold; if (PyArg_ParseTuple(args,"f",&angularDeactivationTreshold)) @@ -227,8 +226,8 @@ static PyObject* gPySetDeactivationAngularTreshold(PyObject* self, } static PyObject* gPySetContactBreakingTreshold(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float contactBreakingTreshold; if (PyArg_ParseTuple(args,"f",&contactBreakingTreshold)) @@ -246,8 +245,8 @@ static PyObject* gPySetContactBreakingTreshold(PyObject* self, static PyObject* gPySetCcdMode(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float ccdMode; if (PyArg_ParseTuple(args,"f",&ccdMode)) @@ -264,8 +263,8 @@ static PyObject* gPySetCcdMode(PyObject* self, } static PyObject* gPySetSorConstant(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float sor; if (PyArg_ParseTuple(args,"f",&sor)) @@ -282,8 +281,8 @@ static PyObject* gPySetSorConstant(PyObject* self, } static PyObject* gPySetSolverTau(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float tau; if (PyArg_ParseTuple(args,"f",&tau)) @@ -301,8 +300,8 @@ static PyObject* gPySetSolverTau(PyObject* self, static PyObject* gPySetSolverDamping(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float damping; if (PyArg_ParseTuple(args,"f",&damping)) @@ -319,8 +318,8 @@ static PyObject* gPySetSolverDamping(PyObject* self, } static PyObject* gPySetLinearAirDamping(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float damping; if (PyArg_ParseTuple(args,"f",&damping)) @@ -338,8 +337,8 @@ static PyObject* gPySetLinearAirDamping(PyObject* self, static PyObject* gPySetUseEpa(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int epa; if (PyArg_ParseTuple(args,"i",&epa)) @@ -355,8 +354,8 @@ static PyObject* gPySetUseEpa(PyObject* self, Py_RETURN_NONE; } static PyObject* gPySetSolverType(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int solverType; if (PyArg_ParseTuple(args,"i",&solverType)) @@ -375,8 +374,8 @@ static PyObject* gPySetSolverType(PyObject* self, static PyObject* gPyGetVehicleConstraint(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { #if defined(_WIN64) __int64 constraintid; @@ -406,9 +405,6 @@ static PyObject* gPyGetVehicleConstraint(PyObject* self, } - - - static PyObject* gPyCreateConstraint(PyObject* self, PyObject* args, PyObject* kwds) @@ -433,48 +429,48 @@ static PyObject* gPyCreateConstraint(PyObject* self, success = PyArg_ParseTuple(args,"lli",&physicsid,&physicsid2,&constrainttype); #endif } - else - if (len ==6) - { + else { + if (len ==6) { #if defined(_WIN64) - success = PyArg_ParseTuple(args,"LLifff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ); + success = PyArg_ParseTuple(args,"LLifff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ); #else - success = PyArg_ParseTuple(args,"llifff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ); + success = PyArg_ParseTuple(args,"llifff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ); #endif - } - else if (len == 9) - { + } + else if (len == 9) + { #if defined(_WIN64) - success = PyArg_ParseTuple(args,"LLiffffff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); + success = PyArg_ParseTuple(args,"LLiffffff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); #else - success = PyArg_ParseTuple(args,"lliffffff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); + success = PyArg_ParseTuple(args,"lliffffff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); #endif - - } - else if (len == 10) - { + + } + else if (len == 10) + { #if defined(_WIN64) - success = PyArg_ParseTuple(args,"LLiffffffi",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); + success = PyArg_ParseTuple(args,"LLiffffffi",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); #else - success = PyArg_ParseTuple(args,"lliffffffi",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); + success = PyArg_ParseTuple(args,"lliffffffi",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); #endif - } - else if (len==4) - { + } + else if (len==4) + { #if defined(_WIN64) - success = PyArg_ParseTuple(args,"LLii",&physicsid,&physicsid2,&constrainttype,&extrainfo); + success = PyArg_ParseTuple(args,"LLii",&physicsid,&physicsid2,&constrainttype,&extrainfo); #else - success = PyArg_ParseTuple(args,"llii",&physicsid,&physicsid2,&constrainttype,&extrainfo); + success = PyArg_ParseTuple(args,"llii",&physicsid,&physicsid2,&constrainttype,&extrainfo); #endif - pivotX=extrainfo; + pivotX=extrainfo; + } } - + if (success) { if (PHY_GetActiveEnvironment()) @@ -498,20 +494,18 @@ static PyObject* gPyCreateConstraint(PyObject* self, MT_Vector3 axis0 = localCFrame.getColumn(0); MT_Vector3 axis1 = localCFrame.getColumn(1); MT_Vector3 axis2 = localCFrame.getColumn(2); - - constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype, - pivotX,pivotY,pivotZ, - (float)axis0.x(),(float)axis0.y(),(float)axis0.z(), - (float)axis1.x(),(float)axis1.y(),(float)axis1.z(), - (float)axis2.x(),(float)axis2.y(),(float)axis2.z(),flag); - } else - { + constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype, + pivotX,pivotY,pivotZ, + (float)axis0.x(),(float)axis0.y(),(float)axis0.z(), + (float)axis1.x(),(float)axis1.y(),(float)axis1.z(), + (float)axis2.x(),(float)axis2.y(),(float)axis2.z(),flag); + } + else { constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype,pivotX,pivotY,pivotZ,axisX,axisY,axisZ,0); } KX_ConstraintWrapper* wrap = new KX_ConstraintWrapper((enum PHY_ConstraintType)constrainttype,constraintid,PHY_GetActiveEnvironment()); - return wrap->NewProxy(true); } @@ -530,8 +524,8 @@ static PyObject* gPyCreateConstraint(PyObject* self, static PyObject* gPyGetAppliedImpulse(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float appliedImpulse = 0.f; @@ -557,8 +551,8 @@ static PyObject* gPyGetAppliedImpulse(PyObject* self, static PyObject* gPyRemoveConstraint(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { #if defined(_WIN64) __int64 constraintid; @@ -585,7 +579,7 @@ static PyObject* gPyExportBulletFile(PyObject*, PyObject* args) char* filename; if (!PyArg_ParseTuple(args,"s:exportBulletFile",&filename)) return NULL; - + if (PHY_GetActiveEnvironment()) { PHY_GetActiveEnvironment()->exportFile(filename); @@ -594,62 +588,61 @@ static PyObject* gPyExportBulletFile(PyObject*, PyObject* args) } static struct PyMethodDef physicsconstraints_methods[] = { - {"setGravity",(PyCFunction) gPySetGravity, - METH_VARARGS, (const char *)gPySetGravity__doc__}, - {"setDebugMode",(PyCFunction) gPySetDebugMode, - METH_VARARGS, (const char *)gPySetDebugMode__doc__}, - - /// settings that influence quality of the rigidbody dynamics - {"setNumIterations",(PyCFunction) gPySetNumIterations, - METH_VARARGS, (const char *)gPySetNumIterations__doc__}, - - {"setNumTimeSubSteps",(PyCFunction) gPySetNumTimeSubSteps, - METH_VARARGS, (const char *)gPySetNumTimeSubSteps__doc__}, - - {"setDeactivationTime",(PyCFunction) gPySetDeactivationTime, - METH_VARARGS, (const char *)gPySetDeactivationTime__doc__}, - - {"setDeactivationLinearTreshold",(PyCFunction) gPySetDeactivationLinearTreshold, - METH_VARARGS, (const char *)gPySetDeactivationLinearTreshold__doc__}, - {"setDeactivationAngularTreshold",(PyCFunction) gPySetDeactivationAngularTreshold, - METH_VARARGS, (const char *)gPySetDeactivationAngularTreshold__doc__}, - - {"setContactBreakingTreshold",(PyCFunction) gPySetContactBreakingTreshold, - METH_VARARGS, (const char *)gPySetContactBreakingTreshold__doc__}, - {"setCcdMode",(PyCFunction) gPySetCcdMode, - METH_VARARGS, (const char *)gPySetCcdMode__doc__}, - {"setSorConstant",(PyCFunction) gPySetSorConstant, - METH_VARARGS, (const char *)gPySetSorConstant__doc__}, - {"setSolverTau",(PyCFunction) gPySetSolverTau, - METH_VARARGS, (const char *)gPySetSolverTau__doc__}, - {"setSolverDamping",(PyCFunction) gPySetSolverDamping, - METH_VARARGS, (const char *)gPySetSolverDamping__doc__}, - - {"setLinearAirDamping",(PyCFunction) gPySetLinearAirDamping, - METH_VARARGS, (const char *)gPySetLinearAirDamping__doc__}, - - {"setUseEpa",(PyCFunction) gPySetUseEpa, - METH_VARARGS, (const char *)gPySetUseEpa__doc__}, + {"setGravity",(PyCFunction) gPySetGravity, + METH_VARARGS, (const char*)gPySetGravity__doc__}, + {"setDebugMode",(PyCFunction) gPySetDebugMode, + METH_VARARGS, (const char *)gPySetDebugMode__doc__}, + + /// settings that influence quality of the rigidbody dynamics + {"setNumIterations",(PyCFunction) gPySetNumIterations, + METH_VARARGS, (const char *)gPySetNumIterations__doc__}, + + {"setNumTimeSubSteps",(PyCFunction) gPySetNumTimeSubSteps, + METH_VARARGS, (const char *)gPySetNumTimeSubSteps__doc__}, + + {"setDeactivationTime",(PyCFunction) gPySetDeactivationTime, + METH_VARARGS, (const char *)gPySetDeactivationTime__doc__}, + + {"setDeactivationLinearTreshold",(PyCFunction) gPySetDeactivationLinearTreshold, + METH_VARARGS, (const char *)gPySetDeactivationLinearTreshold__doc__}, + {"setDeactivationAngularTreshold",(PyCFunction) gPySetDeactivationAngularTreshold, + METH_VARARGS, (const char *)gPySetDeactivationAngularTreshold__doc__}, + + {"setContactBreakingTreshold",(PyCFunction) gPySetContactBreakingTreshold, + METH_VARARGS, (const char *)gPySetContactBreakingTreshold__doc__}, + {"setCcdMode",(PyCFunction) gPySetCcdMode, + METH_VARARGS, (const char *)gPySetCcdMode__doc__}, + {"setSorConstant",(PyCFunction) gPySetSorConstant, + METH_VARARGS, (const char *)gPySetSorConstant__doc__}, + {"setSolverTau",(PyCFunction) gPySetSolverTau, + METH_VARARGS, (const char *)gPySetSolverTau__doc__}, + {"setSolverDamping",(PyCFunction) gPySetSolverDamping, + METH_VARARGS, (const char *)gPySetSolverDamping__doc__}, + + {"setLinearAirDamping",(PyCFunction) gPySetLinearAirDamping, + METH_VARARGS, (const char *)gPySetLinearAirDamping__doc__}, + + {"setUseEpa",(PyCFunction) gPySetUseEpa, + METH_VARARGS, (const char *)gPySetUseEpa__doc__}, {"setSolverType",(PyCFunction) gPySetSolverType, - METH_VARARGS, (const char *)gPySetSolverType__doc__}, + METH_VARARGS, (const char *)gPySetSolverType__doc__}, - {"createConstraint",(PyCFunction) gPyCreateConstraint, - METH_VARARGS, (const char *)gPyCreateConstraint__doc__}, - {"getVehicleConstraint",(PyCFunction) gPyGetVehicleConstraint, - METH_VARARGS, (const char *)gPyGetVehicleConstraint__doc__}, + {"createConstraint",(PyCFunction) gPyCreateConstraint, + METH_VARARGS, (const char *)gPyCreateConstraint__doc__}, + {"getVehicleConstraint",(PyCFunction) gPyGetVehicleConstraint, + METH_VARARGS, (const char *)gPyGetVehicleConstraint__doc__}, - {"removeConstraint",(PyCFunction) gPyRemoveConstraint, - METH_VARARGS, (const char *)gPyRemoveConstraint__doc__}, + {"removeConstraint",(PyCFunction) gPyRemoveConstraint, + METH_VARARGS, (const char *)gPyRemoveConstraint__doc__}, {"getAppliedImpulse",(PyCFunction) gPyGetAppliedImpulse, - METH_VARARGS, (const char *)gPyGetAppliedImpulse__doc__}, - - {"exportBulletFile",(PyCFunction)gPyExportBulletFile, - METH_VARARGS, "export a .bullet file"}, + METH_VARARGS, (const char *)gPyGetAppliedImpulse__doc__}, + {"exportBulletFile",(PyCFunction)gPyExportBulletFile, + METH_VARARGS, "export a .bullet file"}, - //sentinel - { NULL, (PyCFunction) NULL, 0, NULL } + //sentinel + { NULL, (PyCFunction) NULL, 0, NULL } }; static struct PyModuleDef PhysicsConstraints_module_def = { @@ -664,13 +657,13 @@ static struct PyModuleDef PhysicsConstraints_module_def = { 0, /* m_free */ }; -PyObject* initPythonConstraintBinding() +PyObject* initPythonConstraintBinding() { - PyObject* ErrorObject; - PyObject* m; - PyObject* d; - PyObject* item; + PyObject* ErrorObject; + PyObject* m; + PyObject* d; + PyObject* item; /* Use existing module where possible * be careful not to init any runtime vars after this */ @@ -686,44 +679,43 @@ PyObject* initPythonConstraintBinding() PyDict_SetItemString(PySys_GetObject("modules"), PhysicsConstraints_module_def.m_name, m); } - // Add some symbolic constants to the module - d = PyModule_GetDict(m); - ErrorObject = PyUnicode_FromString("PhysicsConstraints.error"); - PyDict_SetItemString(d, "error", ErrorObject); - Py_DECREF(ErrorObject); + // Add some symbolic constants to the module + d = PyModule_GetDict(m); + ErrorObject = PyUnicode_FromString("PhysicsConstraints.error"); + PyDict_SetItemString(d, "error", ErrorObject); + Py_DECREF(ErrorObject); #ifdef USE_BULLET - //Debug Modes constants to be used with setDebugMode() python function - KX_MACRO_addTypesToDict(d, DBG_NODEBUG, btIDebugDraw::DBG_NoDebug); - KX_MACRO_addTypesToDict(d, DBG_DRAWWIREFRAME, btIDebugDraw::DBG_DrawWireframe); - KX_MACRO_addTypesToDict(d, DBG_DRAWAABB, btIDebugDraw::DBG_DrawAabb); - KX_MACRO_addTypesToDict(d, DBG_DRAWFREATURESTEXT, btIDebugDraw::DBG_DrawFeaturesText); - KX_MACRO_addTypesToDict(d, DBG_DRAWCONTACTPOINTS, btIDebugDraw::DBG_DrawContactPoints); - KX_MACRO_addTypesToDict(d, DBG_NOHELPTEXT, btIDebugDraw::DBG_NoHelpText); - KX_MACRO_addTypesToDict(d, DBG_DRAWTEXT, btIDebugDraw::DBG_DrawText); - KX_MACRO_addTypesToDict(d, DBG_PROFILETIMINGS, btIDebugDraw::DBG_ProfileTimings); - KX_MACRO_addTypesToDict(d, DBG_ENABLESATCOMPARISION, btIDebugDraw::DBG_EnableSatComparison); - KX_MACRO_addTypesToDict(d, DBG_DISABLEBULLETLCP, btIDebugDraw::DBG_DisableBulletLCP); - KX_MACRO_addTypesToDict(d, DBG_ENABLECDD, btIDebugDraw::DBG_EnableCCD); - KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTS, btIDebugDraw::DBG_DrawConstraints); - KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTLIMITS, btIDebugDraw::DBG_DrawConstraintLimits); - KX_MACRO_addTypesToDict(d, DBG_FASTWIREFRAME, btIDebugDraw::DBG_FastWireframe); + //Debug Modes constants to be used with setDebugMode() python function + KX_MACRO_addTypesToDict(d, DBG_NODEBUG, btIDebugDraw::DBG_NoDebug); + KX_MACRO_addTypesToDict(d, DBG_DRAWWIREFRAME, btIDebugDraw::DBG_DrawWireframe); + KX_MACRO_addTypesToDict(d, DBG_DRAWAABB, btIDebugDraw::DBG_DrawAabb); + KX_MACRO_addTypesToDict(d, DBG_DRAWFREATURESTEXT, btIDebugDraw::DBG_DrawFeaturesText); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONTACTPOINTS, btIDebugDraw::DBG_DrawContactPoints); + KX_MACRO_addTypesToDict(d, DBG_NOHELPTEXT, btIDebugDraw::DBG_NoHelpText); + KX_MACRO_addTypesToDict(d, DBG_DRAWTEXT, btIDebugDraw::DBG_DrawText); + KX_MACRO_addTypesToDict(d, DBG_PROFILETIMINGS, btIDebugDraw::DBG_ProfileTimings); + KX_MACRO_addTypesToDict(d, DBG_ENABLESATCOMPARISION, btIDebugDraw::DBG_EnableSatComparison); + KX_MACRO_addTypesToDict(d, DBG_DISABLEBULLETLCP, btIDebugDraw::DBG_DisableBulletLCP); + KX_MACRO_addTypesToDict(d, DBG_ENABLECDD, btIDebugDraw::DBG_EnableCCD); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTS, btIDebugDraw::DBG_DrawConstraints); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTLIMITS, btIDebugDraw::DBG_DrawConstraintLimits); + KX_MACRO_addTypesToDict(d, DBG_FASTWIREFRAME, btIDebugDraw::DBG_FastWireframe); #endif // USE_BULLET - //Constraint types to be used with createConstraint() python function - KX_MACRO_addTypesToDict(d, POINTTOPOINT_CONSTRAINT, PHY_POINT2POINT_CONSTRAINT); - KX_MACRO_addTypesToDict(d, LINEHINGE_CONSTRAINT, PHY_LINEHINGE_CONSTRAINT); - KX_MACRO_addTypesToDict(d, ANGULAR_CONSTRAINT, PHY_ANGULAR_CONSTRAINT); - KX_MACRO_addTypesToDict(d, CONETWIST_CONSTRAINT, PHY_CONE_TWIST_CONSTRAINT); - KX_MACRO_addTypesToDict(d, VEHICLE_CONSTRAINT, PHY_VEHICLE_CONSTRAINT); + //Constraint types to be used with createConstraint() python function + KX_MACRO_addTypesToDict(d, POINTTOPOINT_CONSTRAINT, PHY_POINT2POINT_CONSTRAINT); + KX_MACRO_addTypesToDict(d, LINEHINGE_CONSTRAINT, PHY_LINEHINGE_CONSTRAINT); + KX_MACRO_addTypesToDict(d, ANGULAR_CONSTRAINT, PHY_ANGULAR_CONSTRAINT); + KX_MACRO_addTypesToDict(d, CONETWIST_CONSTRAINT, PHY_CONE_TWIST_CONSTRAINT); + KX_MACRO_addTypesToDict(d, VEHICLE_CONSTRAINT, PHY_VEHICLE_CONSTRAINT); - // Check for errors - if (PyErr_Occurred()) - { - Py_FatalError("can't initialize module PhysicsConstraints"); - } + // Check for errors + if (PyErr_Occurred()) { + Py_FatalError("can't initialize module PhysicsConstraints"); + } - return d; + return d; } @@ -741,7 +733,4 @@ PHY_IPhysicsEnvironment* PHY_GetActiveEnvironment() return g_CurrentActivePhysicsEnvironment; } - - #endif // WITH_PYTHON - -- cgit v1.2.3 From f4a1dc4c8dd353aa614bc7c00846e5076ddc2dc2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 31 Jul 2011 07:58:50 +0000 Subject: when converting curves from poly -> nurbs, dont enable Bezier-U flag. Not sure why this was enabled, possibly from copy/paste with bezier->nurbs code? If you have meny poly lines there was no nice way to convert these into a smoothed nurbs curve. Ran into this when trying to convert generated ivy into smooth nurbs. --- source/blender/editors/curve/editcurve.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 8b9477adf92..210f36ca074 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -3432,7 +3432,6 @@ static int convertspline(short type, Nurb *nu) nu->type = CU_NURBS; nu->orderu= 4; nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */ - nu->flagu |= CU_NURB_BEZIER; nurbs_knot_calc_u(nu); a= nu->pntsu*nu->pntsv; bp= nu->bp; -- cgit v1.2.3 From 432bd158fbdb9d56f9499dcc0e465f4e148abbf3 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Sun, 31 Jul 2011 11:12:38 +0000 Subject: bugfix [#28111] material.pop breaks mt->mat_nr create a new parameter for materials.pop() to not remove material slot. this way the mat_nr is still the old one. for the default behaviour we now have material remapping (i.e. data_delete_material_index_id(id, index)). This new function is brought from the material_slot remove function. --- source/blender/blenkernel/BKE_material.h | 2 +- source/blender/blenkernel/intern/material.c | 101 +++++++++++++++++----------- source/blender/blenkernel/intern/mesh.c | 4 +- source/blender/makesrna/intern/rna_ID.c | 1 + 4 files changed, 66 insertions(+), 42 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index c445408609c..88965d12e4a 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -78,7 +78,7 @@ int object_remove_material_slot(struct Object *ob); /* rna api */ void material_append_id(struct ID *id, struct Material *ma); -struct Material *material_pop_id(struct ID *id, int index); +struct Material *material_pop_id(struct ID *id, int index, int remove_material_slot); /* rendering */ diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 3f01c55e935..1f2544c9706 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -61,7 +61,7 @@ #include "BKE_material.h" #include "BKE_mesh.h" #include "BKE_node.h" - +#include "BKE_curve.h" #include "GPU_material.h" @@ -515,6 +515,37 @@ short *give_totcolp_id(ID *id) return NULL; } +void data_delete_material_index_id(ID *id, int index) +{ + Mesh *me; + Curve *cu; + Nurb *nu; + int curvetype; + + switch(GS(id->name)) { + case ID_ME: + me=(Mesh *)id; + mesh_delete_material_index(me, index); + break; + case ID_CU: + cu= (Curve *)id; + nu= cu->nurb.first; + + curvetype=curve_type(cu); + if (!ELEM(curvetype, OB_CURVE, OB_SURF)) + return; + + while (nu) { + if(nu->mat_nr && nu->mat_nr>=index) { + nu->mat_nr--; + if (curvetype == OB_CURVE) nu->charidx--; + } + nu= nu->next; + } + break; + } +} + void material_append_id(ID *id, Material *ma) { Material ***matar; @@ -532,7 +563,7 @@ void material_append_id(ID *id, Material *ma) } } -Material *material_pop_id(ID *id, int index) +Material *material_pop_id(ID *id, int index, int remove_material_slot) { Material *ret= NULL; Material ***matar; @@ -540,27 +571,36 @@ Material *material_pop_id(ID *id, int index) short *totcol= give_totcolp_id(id); if(index >= 0 && index < (*totcol)) { ret= (*matar)[index]; - id_us_min((ID *)ret); - if(*totcol <= 1) { - *totcol= 0; - MEM_freeN(*matar); - *matar= NULL; - } - else { - Material **mat; - - if(index + 1 != (*totcol)) - memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1))); + id_us_min((ID *)ret); - (*totcol)--; - - mat= MEM_callocN(sizeof(void *) * (*totcol), "newmatar"); - memcpy(mat, *matar, sizeof(void *) * (*totcol)); - MEM_freeN(*matar); + if (remove_material_slot) { + if(*totcol <= 1) { + *totcol= 0; + MEM_freeN(*matar); + *matar= NULL; + } + else { + Material **mat; + if(index + 1 != (*totcol)) + memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1))); + + (*totcol)--; + + mat= MEM_callocN(sizeof(void *) * (*totcol), "newmatar"); + memcpy(mat, *matar, sizeof(void *) * (*totcol)); + MEM_freeN(*matar); + + *matar= mat; + test_object_materials(id); + } - *matar= mat; - test_object_materials(id); + /* decrease mat_nr index */ + data_delete_material_index_id(id, index); } + + /* don't remove material slot, only clear it*/ + else + (*matar)[index]= NULL; } } @@ -1025,8 +1065,6 @@ int object_remove_material_slot(Object *ob) { Material *mao, ***matarar; Object *obt; - Curve *cu; - Nurb *nu; short *totcolp; int a, actcol; @@ -1086,23 +1124,8 @@ int object_remove_material_slot(Object *ob) } /* check indices from mesh */ - - if(ob->type==OB_MESH) { - Mesh *me= get_mesh(ob); - mesh_delete_material_index(me, actcol-1); - freedisplist(&ob->disp); - } - else if ELEM(ob->type, OB_CURVE, OB_SURF) { - cu= ob->data; - nu= cu->nurb.first; - - while(nu) { - if(nu->mat_nr && nu->mat_nr>=actcol-1) { - nu->mat_nr--; - if (ob->type == OB_CURVE) nu->charidx--; - } - nu= nu->next; - } + if (ELEM3(ob->type, OB_MESH, OB_CURVE, OB_SURF)) { + data_delete_material_index_id(&ob->id, actcol-1); freedisplist(&ob->disp); } diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 45a60b842a7..32819226361 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1254,10 +1254,10 @@ void mesh_to_curve(Scene *scene, Object *ob) void mesh_delete_material_index(Mesh *me, int index) { + MFace *mf; int i; - for (i=0; itotface; i++) { - MFace *mf = &((MFace*) me->mface)[i]; + for (i=0, mf=me->mface; itotface; i++, mf++) { if (mf->mat_nr && mf->mat_nr>=index) mf->mat_nr--; } diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index 3ce84e3a19f..6d7fc0ee57b 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -418,6 +418,7 @@ static void rna_def_ID_materials(BlenderRNA *brna) RNA_def_function_ui_description(func, "Remove a material from the data block."); parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "", "Index of material to remove.", 0, INT_MAX); RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_boolean(func, "remove_material_slot", 1, "", "Remove the material slot and assign 1st material to old faces."); parm= RNA_def_pointer(func, "material", "Material", "", "Material to remove."); RNA_def_function_return(func, parm); } -- cgit v1.2.3 From 5b3bb373432d5b0b9c4ab1135a6f344831cb83a9 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Sun, 31 Jul 2011 11:21:48 +0000 Subject: reverting part of #38876 (whitespace edits) the new if/else nesting introduced in the previous commit makes no sense. (since I was here I add a comment for extrainfo and did some small cleanup) --- .../gameengine/Ketsji/KX_PyConstraintBinding.cpp | 56 +++++++++++----------- 1 file changed, 28 insertions(+), 28 deletions(-) (limited to 'source') diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp index 0600e59a1ec..fde127b7ef5 100644 --- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -429,46 +429,46 @@ static PyObject* gPyCreateConstraint(PyObject* self, success = PyArg_ParseTuple(args,"lli",&physicsid,&physicsid2,&constrainttype); #endif } - else { - if (len ==6) { + else if (len == 6) + { #if defined(_WIN64) - success = PyArg_ParseTuple(args,"LLifff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ); + success = PyArg_ParseTuple(args,"LLifff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ); #else - success = PyArg_ParseTuple(args,"llifff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ); + success = PyArg_ParseTuple(args,"llifff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ); #endif - } - else if (len == 9) - { + } + else if (len == 9) + { #if defined(_WIN64) - success = PyArg_ParseTuple(args,"LLiffffff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); + success = PyArg_ParseTuple(args,"LLiffffff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); #else - success = PyArg_ParseTuple(args,"lliffffff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); + success = PyArg_ParseTuple(args,"lliffffff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); #endif - - } - else if (len == 10) - { + } + else if (len == 10) + { #if defined(_WIN64) - success = PyArg_ParseTuple(args,"LLiffffffi",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); + success = PyArg_ParseTuple(args,"LLiffffffi",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); #else - success = PyArg_ParseTuple(args,"lliffffffi",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); + success = PyArg_ParseTuple(args,"lliffffffi",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); #endif - } - else if (len==4) - { + } + + /* XXX extrainfo seems to be nothing implemented. right now it works as a pivot with [X,0,0] */ + else if (len == 4) + { #if defined(_WIN64) - success = PyArg_ParseTuple(args,"LLii",&physicsid,&physicsid2,&constrainttype,&extrainfo); + success = PyArg_ParseTuple(args,"LLii",&physicsid,&physicsid2,&constrainttype,&extrainfo); #else - success = PyArg_ParseTuple(args,"llii",&physicsid,&physicsid2,&constrainttype,&extrainfo); + success = PyArg_ParseTuple(args,"llii",&physicsid,&physicsid2,&constrainttype,&extrainfo); #endif - pivotX=extrainfo; - } + pivotX=extrainfo; } if (success) -- cgit v1.2.3 From c74bb09584371520b9b557cbaa8ae13356bf5e1a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 31 Jul 2011 12:43:41 +0000 Subject: fix for material slot removal (r38879) - The object ID was being passed to the data_delete_material_index_id() from object_remove_material_slot(), rather then the object data. (so the material slot fix wouldnt run in that case). - add support for fixing text object materials too. --- source/blender/blenkernel/BKE_curve.h | 1 + source/blender/blenkernel/intern/curve.c | 25 ++++++++++++++++++++++++ source/blender/blenkernel/intern/material.c | 30 +++++++---------------------- source/blender/makesrna/intern/rna_ID.c | 5 +++-- 4 files changed, 36 insertions(+), 25 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 0491116d199..557ce417b14 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -115,5 +115,6 @@ int minmax_curve(struct Curve *cu, float min[3], float max[3]); int curve_center_median(struct Curve *cu, float cent[3]); int curve_center_bounds(struct Curve *cu, float cent[3]); void curve_translate(struct Curve *cu, float offset[3], int do_keys); +void curve_delete_material_index(struct Curve *cu, int index); #endif diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 202a3f28d9a..66ab11938f3 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -3259,3 +3259,28 @@ void curve_translate(Curve *cu, float offset[3], int do_keys) } } } + +void curve_delete_material_index(Curve *cu, int index) +{ + const int curvetype= curve_type(cu); + + if(curvetype == OB_FONT) { + struct CharInfo *info= cu->strinfo; + int i; + for(i= cu->len-1; i >= 0; i--, info++) { + if (info->mat_nr && info->mat_nr>=index) { + info->mat_nr--; + } + } + } + else { + Nurb *nu; + + for (nu= cu->nurb.first; nu; nu= nu->next) { + if(nu->mat_nr && nu->mat_nr>=index) { + nu->mat_nr--; + if (curvetype == OB_CURVE) nu->charidx--; + } + } + } +} diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 1f2544c9706..9c455e84109 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -517,31 +517,15 @@ short *give_totcolp_id(ID *id) void data_delete_material_index_id(ID *id, int index) { - Mesh *me; - Curve *cu; - Nurb *nu; - int curvetype; - switch(GS(id->name)) { case ID_ME: - me=(Mesh *)id; - mesh_delete_material_index(me, index); + mesh_delete_material_index((Mesh *)id, index); break; case ID_CU: - cu= (Curve *)id; - nu= cu->nurb.first; - - curvetype=curve_type(cu); - if (!ELEM(curvetype, OB_CURVE, OB_SURF)) - return; - - while (nu) { - if(nu->mat_nr && nu->mat_nr>=index) { - nu->mat_nr--; - if (curvetype == OB_CURVE) nu->charidx--; - } - nu= nu->next; - } + curve_delete_material_index((Curve *)id, index); + break; + case ID_MB: + /* meta-elems dont have materials atm */ break; } } @@ -1124,8 +1108,8 @@ int object_remove_material_slot(Object *ob) } /* check indices from mesh */ - if (ELEM3(ob->type, OB_MESH, OB_CURVE, OB_SURF)) { - data_delete_material_index_id(&ob->id, actcol-1); + if (ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT)) { + data_delete_material_index_id((ID *)ob->data, actcol-1); freedisplist(&ob->disp); } diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index 6d7fc0ee57b..8d57403ec35 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -35,6 +35,7 @@ #include "DNA_ID.h" #include "DNA_vfont_types.h" +#include "DNA_material_types.h" #include "DNA_object_types.h" #include "WM_types.h" @@ -416,9 +417,9 @@ static void rna_def_ID_materials(BlenderRNA *brna) func= RNA_def_function(srna, "pop", "material_pop_id"); RNA_def_function_ui_description(func, "Remove a material from the data block."); - parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "", "Index of material to remove.", 0, INT_MAX); + parm= RNA_def_int(func, "index", 0, 0, MAXMAT, "", "Index of material to remove.", 0, MAXMAT); RNA_def_property_flag(parm, PROP_REQUIRED); - RNA_def_boolean(func, "remove_material_slot", 1, "", "Remove the material slot and assign 1st material to old faces."); + RNA_def_boolean(func, "update_data", 0, "", "Update data by re-adjusting the material slots assigned."); parm= RNA_def_pointer(func, "material", "Material", "", "Material to remove."); RNA_def_function_return(func, parm); } -- cgit v1.2.3 From 5c8344bcc9f8f2c319346420766d9e4110beb607 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Sun, 31 Jul 2011 16:26:02 +0000 Subject: Bug fix: loading a file that had particles using a dupligroup from a liblinked file without the library file being present crashed --- source/blender/blenloader/intern/readfile.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 4ad99c02b2d..0633794c6ed 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3162,7 +3162,7 @@ static void lib_link_particlesettings(FileData *fd, Main *main) if(part->effector_weights) part->effector_weights->group = newlibadr(fd, part->id.lib, part->effector_weights->group); - if(part->dupliweights.first) { + if(part->dupliweights.first && part->dup_group) { int index_ok = 0; /* check for old files without indices (all indexes 0) */ dw = part->dupliweights.first; @@ -3193,6 +3193,9 @@ static void lib_link_particlesettings(FileData *fd, Main *main) dw->ob = newlibadr(fd, part->id.lib, dw->ob); } } + else { + part->dupliweights.first = part->dupliweights.last = NULL; + } if(part->boids) { BoidState *state = part->boids->states.first; -- cgit v1.2.3 From f48b9062619ecc685e81dca12d588f5524efe41d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 1 Aug 2011 02:52:08 +0000 Subject: fix for failure to create curve knots when both endpoint and bezier U were enabled. use default when invalid settings given. removed odd/annoying bit shifting of the flagu/v for such basic function made code hard to understand and would fail if new flags were added. --- source/blender/blenkernel/intern/curve.c | 35 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 66ab11938f3..07e450479e4 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -580,29 +580,24 @@ void addNurbPointsBezier(Nurb *nu, int number) /* ~~~~~~~~~~~~~~~~~~~~Non Uniform Rational B Spline calculations ~~~~~~~~~~~ */ -static void calcknots(float *knots, short aantal, short order, short type) -/* knots: number of pnts NOT corrected for cyclic */ -/* type; 0: uniform, 1: endpoints, 2: bezier */ +static void calcknots(float *knots, const short aantal, const short order, const short flag) { + /* knots: number of pnts NOT corrected for cyclic */ + const int t= aantal + order; float k; - int a, t; - - t = aantal+order; - if(type==0) { + int a; - for(a=0;a=order && a<=aantal) k+= 1.0f; } - } - else if(type==2) { - /* Warning, the order MUST be 2 or 4, if this is not enforced, the displist will be corrupt */ + break; + case CU_NURB_BEZIER: + /* Warning, the order MUST be 2 or 4, + * if this is not enforced, the displist will be corrupt */ if(order==4) { k= 0.34; for(a=0;aknotsu, nu->pntsu, nu->orderu, 0); /* cyclic should be uniform */ makecyclicknots(nu->knotsu, nu->pntsu, nu->orderu); } else { - calcknots(nu->knotsu, nu->pntsu, nu->orderu, nu->flagu>>1); + calcknots(nu->knotsu, nu->pntsu, nu->orderu, nu->flagu); } } else nu->knotsu= NULL; @@ -675,7 +676,7 @@ static void makeknots(Nurb *nu, short uv) calcknots(nu->knotsv, nu->pntsv, nu->orderv, 0); /* cyclic should be uniform */ makecyclicknots(nu->knotsv, nu->pntsv, nu->orderv); } else { - calcknots(nu->knotsv, nu->pntsv, nu->orderv, nu->flagv>>1); + calcknots(nu->knotsv, nu->pntsv, nu->orderv, nu->flagv); } } else nu->knotsv= NULL; -- cgit v1.2.3 From 9da712a581f59fc7794151fe5f07a4fb396881f2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 1 Aug 2011 02:58:44 +0000 Subject: replace dutch variable name 'aantal' with 'tot' --- source/blender/blenkernel/intern/curve.c | 16 ++++++++-------- source/blender/blenkernel/intern/key.c | 8 ++++---- source/blender/editors/space_view3d/view3d_select.c | 6 +++--- 3 files changed, 15 insertions(+), 15 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 07e450479e4..7aa28c3f681 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -580,19 +580,19 @@ void addNurbPointsBezier(Nurb *nu, int number) /* ~~~~~~~~~~~~~~~~~~~~Non Uniform Rational B Spline calculations ~~~~~~~~~~~ */ -static void calcknots(float *knots, const short aantal, const short order, const short flag) +static void calcknots(float *knots, const short tot, const short order, const short flag) { /* knots: number of pnts NOT corrected for cyclic */ - const int t= aantal + order; + const int tot_order= tot + order; float k; int a; switch(flag & (CU_NURB_ENDPOINT|CU_NURB_BEZIER)) { case CU_NURB_ENDPOINT: k= 0.0; - for(a=1;a<=t;a++) { + for(a=1; a <= tot_order; a++) { knots[a-1]= k; - if(a>=order && a<=aantal) k+= 1.0f; + if(a >= order && a <= tot) k+= 1.0f; } break; case CU_NURB_BEZIER: @@ -600,15 +600,15 @@ static void calcknots(float *knots, const short aantal, const short order, const * if this is not enforced, the displist will be corrupt */ if(order==4) { k= 0.34; - for(a=0;a=order && a<=aantal) k+= 0.5f; + for(a=0; a < tot_order; a++) { + if(a >= order && a <= tot) k+= 0.5f; knots[a]= floorf(k); } } @@ -617,7 +617,7 @@ static void calcknots(float *knots, const short aantal, const short order, const } break; default: - for(a=0;aselcol; - aantal= (size-1)/2; + len= (size-1)/2; rc= 0; dirvec[0][0]= 1; @@ -910,7 +910,7 @@ static unsigned int samplerect(unsigned int *buf, int size, unsigned int dontdo) bufmin= buf; bufmax= buf+ size*size; - buf+= aantal*size+ aantal; + buf+= len*size+ len; for(tel=1;tel<=size;tel++) { -- cgit v1.2.3 From af39f2636019e387dc9f572249c09ad9cf9631bc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 1 Aug 2011 05:25:30 +0000 Subject: fix, uvproject modifier wasn't copying the uv layer name, also edit var names from recent commit to better fit with other functions. --- source/blender/blenkernel/intern/curve.c | 16 ++++++++-------- source/blender/modifiers/intern/MOD_uvproject.c | 2 ++ 2 files changed, 10 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 7aa28c3f681..eb364af6ff8 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -580,19 +580,19 @@ void addNurbPointsBezier(Nurb *nu, int number) /* ~~~~~~~~~~~~~~~~~~~~Non Uniform Rational B Spline calculations ~~~~~~~~~~~ */ -static void calcknots(float *knots, const short tot, const short order, const short flag) +static void calcknots(float *knots, const short pnts, const short order, const short flag) { /* knots: number of pnts NOT corrected for cyclic */ - const int tot_order= tot + order; + const int pnts_order= pnts + order; float k; int a; switch(flag & (CU_NURB_ENDPOINT|CU_NURB_BEZIER)) { case CU_NURB_ENDPOINT: k= 0.0; - for(a=1; a <= tot_order; a++) { + for(a=1; a <= pnts_order; a++) { knots[a-1]= k; - if(a >= order && a <= tot) k+= 1.0f; + if(a >= order && a <= pnts) k+= 1.0f; } break; case CU_NURB_BEZIER: @@ -600,15 +600,15 @@ static void calcknots(float *knots, const short tot, const short order, const sh * if this is not enforced, the displist will be corrupt */ if(order==4) { k= 0.34; - for(a=0; a < tot_order; a++) { + for(a=0; a < pnts_order; a++) { knots[a]= floorf(k); k+= (1.0f/3.0f); } } else if(order==3) { k= 0.6f; - for(a=0; a < tot_order; a++) { - if(a >= order && a <= tot) k+= 0.5f; + for(a=0; a < pnts_order; a++) { + if(a >= order && a <= pnts) k+= 0.5f; knots[a]= floorf(k); } } @@ -617,7 +617,7 @@ static void calcknots(float *knots, const short tot, const short order, const sh } break; default: - for(a=0; a < tot_order; a++) { + for(a=0; a < pnts_order; a++) { knots[a]= (float)a; } break; diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c index a5d2e0b38c7..922ae8c1e92 100644 --- a/source/blender/modifiers/intern/MOD_uvproject.c +++ b/source/blender/modifiers/intern/MOD_uvproject.c @@ -42,6 +42,7 @@ #include "DNA_object_types.h" #include "BLI_math.h" +#include "BLI_string.h" #include "BLI_uvproject.h" #include "BLI_utildefines.h" @@ -83,6 +84,7 @@ static void copyData(ModifierData *md, ModifierData *target) tumd->aspecty = umd->aspecty; tumd->scalex = umd->scalex; tumd->scaley = umd->scaley; + BLI_strncpy(tumd->uvlayer_name, umd->uvlayer_name, sizeof(umd->uvlayer_name)); } static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md)) -- cgit v1.2.3 From cd793378dbe7b761e22b2c48540ff2afc92e22ad Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 1 Aug 2011 06:50:24 +0000 Subject: fix [#28112] Vertex paint crash --- source/blender/blenkernel/intern/DerivedMesh.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index d9c98bc0200..62b8830de20 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1883,7 +1883,9 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos /* set the DerivedMesh to only copy needed data */ mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link); - DM_set_only_copy(dm, mask); + /* needMapping check here fixes bug [#28112], otherwise its + * possible that it wont be copied */ + DM_set_only_copy(dm, mask | (needMapping ? CD_MASK_ORIGINDEX : 0)); /* add cloth rest shape key if need */ if(mask & CD_MASK_CLOTH_ORCO) -- cgit v1.2.3 From c965d1d2ccfd57926476cb5c091afa35c6de217f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 1 Aug 2011 08:53:57 +0000 Subject: fix [#28061] Texture (paint) bleeding on edges respect clamp u/v image options. --- source/blender/editors/sculpt_paint/paint_image.c | 26 +++++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index c9a6aa87cd0..32004fd4525 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -2187,7 +2187,7 @@ static int IsectPoly2Df_twoside(const float pt[2], float uv[][2], const int tot) /* One of the most important function for projectiopn painting, since it selects the pixels to be added into each bucket. * initialize pixels from this face where it intersects with the bucket_index, optionally initialize pixels for removing seams */ -static void project_paint_face_init(const ProjPaintState *ps, const int thread_index, const int bucket_index, const int face_index, const int image_index, rctf *bucket_bounds, const ImBuf *ibuf) +static void project_paint_face_init(const ProjPaintState *ps, const int thread_index, const int bucket_index, const int face_index, const int image_index, rctf *bucket_bounds, const ImBuf *ibuf, const short clamp_u, const short clamp_v) { /* Projection vars, to get the 3D locations into screen space */ MemArena *arena = ps->arena_mt[thread_index]; @@ -2304,14 +2304,24 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i if (pixel_bounds_array(uv_clip, &bounds_px, ibuf->x, ibuf->y, uv_clip_tot)) { - + + if(clamp_u) { + CLAMP(bounds_px.xmin, 0, ibuf->x); + CLAMP(bounds_px.xmax, 0, ibuf->x); + } + + if(clamp_v) { + CLAMP(bounds_px.ymin, 0, ibuf->y); + CLAMP(bounds_px.ymax, 0, ibuf->y); + } + /* clip face and */ has_isect = 0; for (y = bounds_px.ymin; y < bounds_px.ymax; y++) { //uv[1] = (((float)y) + 0.5f) / (float)ibuf->y; uv[1] = (float)y / ibuf_yf; /* use pixel offset UV coords instead */ - + has_x_isect = 0; for (x = bounds_px.xmin; x < bounds_px.xmax; x++) { //uv[0] = (((float)x) + 0.5f) / ibuf->x; @@ -2630,6 +2640,7 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index LinkNode *node; int face_index, image_index=0; ImBuf *ibuf = NULL; + Image *ima = NULL; MTFace *tf; Image *tpage_last = NULL; @@ -2638,9 +2649,10 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index if (ps->image_tot==1) { /* Simple loop, no context switching */ ibuf = ps->projImages[0].ibuf; - + ima = ps->projImages[0].ima; + for (node = ps->bucketFaces[bucket_index]; node; node= node->next) { - project_paint_face_init(ps, thread_index, bucket_index, GET_INT_FROM_POINTER(node->link), 0, bucket_bounds, ibuf); + project_paint_face_init(ps, thread_index, bucket_index, GET_INT_FROM_POINTER(node->link), 0, bucket_bounds, ibuf, ima->tpageflag & IMA_CLAMP_U, ima->tpageflag & IMA_CLAMP_V); } } else { @@ -2659,14 +2671,14 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index for (image_index=0; image_index < ps->image_tot; image_index++) { if (ps->projImages[image_index].ima == tpage_last) { ibuf = ps->projImages[image_index].ibuf; + ima = ps->projImages[image_index].ima; break; } } } /* context switching done */ - project_paint_face_init(ps, thread_index, bucket_index, face_index, image_index, bucket_bounds, ibuf); - + project_paint_face_init(ps, thread_index, bucket_index, face_index, image_index, bucket_bounds, ibuf, ima->tpageflag & IMA_CLAMP_U, ima->tpageflag & IMA_CLAMP_V); } } -- cgit v1.2.3