From 59d76439be0806ad76296337385dff1f20a3258a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 27 Mar 2010 12:16:24 +0000 Subject: Fix #21700: particles do not collide with linked objects. --- source/blender/blenkernel/intern/collision.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index c85bd2f90b3..ffd504f5945 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -1408,7 +1408,7 @@ ListBase *get_collider_cache(Scene *scene, Object *self, Group *group) } else { for(base = scene->base.first; base; base = base->next) - if(self && (base->lay & self->lay)==0) + if(!self || (base->lay & self->lay)) add_collider_cache_object(&objs, base->object, self, 0); } -- cgit v1.2.3 From 57101c4fd26a85f4994d4d4d3f433c37f95367d0 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 27 Mar 2010 15:35:34 +0000 Subject: Second attempt at committing the different render slot implementation. This has a fix that hopefully solves the problem on mac/win. Also fixes #21322, render slots not working well with FSA. --- source/blender/blenkernel/BKE_image.h | 3 + source/blender/blenkernel/intern/displist.c | 6 +- source/blender/blenkernel/intern/image.c | 90 +++++++++++++++++++++------- source/blender/blenkernel/intern/sequencer.c | 4 +- 4 files changed, 75 insertions(+), 28 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index df51d017594..915f59be01a 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -141,6 +141,9 @@ struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct Im /* for multilayer images as well as for render-viewer */ struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, struct Image *ima); void BKE_image_release_renderresult(struct Scene *scene, struct Image *ima); + +/* for multiple slot render, call this before render */ +void BKE_image_backup_render(struct Scene *scene, struct Image *ima); /* goes over all textures that use images */ void BKE_image_free_all_textures(void); diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 3e28dcc7acd..487ecb810d4 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -295,9 +295,9 @@ static Render *fastshade_get_render(Scene *scene) /* XXX ugly global still, but we can't do preview while rendering */ if(G.rendering==0) { - Render *re= RE_GetRender("_Shade View_", RE_SLOT_DEFAULT); + Render *re= RE_GetRender("_Shade View_"); if(re==NULL) { - re= RE_NewRender("_Shade View_", RE_SLOT_DEFAULT); + re= RE_NewRender("_Shade View_"); RE_Database_Baking(re, scene, 0, 0); /* 0= no faces */ } @@ -311,7 +311,7 @@ static Render *fastshade_get_render(Scene *scene) /* called on file reading */ void fastshade_free_render(void) { - Render *re= RE_GetRender("_Shade View_", RE_SLOT_DEFAULT); + Render *re= RE_GetRender("_Shade View_"); if(re) { RE_Database_Free(re); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 1a3c53e293f..f9352f1ded8 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -229,7 +229,7 @@ static void image_free_buffers(Image *ima) if(ima->anim) IMB_free_anim(ima->anim); ima->anim= NULL; - + if(ima->rr) { RE_FreeRenderResult(ima->rr); ima->rr= NULL; @@ -243,6 +243,8 @@ static void image_free_buffers(Image *ima) /* called by library too, do not free ima itself */ void free_image(Image *ima) { + int a; + image_free_buffers(ima); if (ima->packedfile) { freePackedFile(ima->packedfile); @@ -253,9 +255,11 @@ void free_image(Image *ima) if (ima->preview) { BKE_previewimg_free(&ima->preview); } - if (ima->render_text) { - MEM_freeN(ima->render_text); - ima->render_text= NULL; + for(a=0; arenders[a]) { + RE_FreeRenderResult(ima->renders[a]); + ima->renders[a]= NULL; + } } } @@ -1005,7 +1009,7 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix) } { - Render *re= RE_GetRender(scene->id.name, RE_SLOT_RENDERING); + Render *re= RE_GetRender(scene->id.name); RenderStats *stats= re ? RE_GetStats(re):NULL; if (stats && (scene->r.stamp & R_STAMP_RENDERTIME)) { @@ -1511,20 +1515,48 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser) return rpass; } -RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, Image *ima) +RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima) { - if(ima->rr) + if(ima->rr) { return ima->rr; - else if(ima->type==IMA_TYPE_R_RESULT) - return RE_AcquireResultRead(RE_GetRender(scene->id.name, RE_SLOT_VIEW)); - return NULL; + } + else if(ima->type==IMA_TYPE_R_RESULT) { + if(ima->render_slot == ima->last_render_slot) + return RE_AcquireResultRead(RE_GetRender(scene->id.name)); + else + return ima->renders[ima->render_slot]; + } + else + return NULL; } -void BKE_image_release_renderresult(struct Scene *scene, Image *ima) +void BKE_image_release_renderresult(Scene *scene, Image *ima) { if(ima->rr); - else if(ima->type==IMA_TYPE_R_RESULT) - RE_ReleaseResult(RE_GetRender(scene->id.name, RE_SLOT_VIEW)); + else if(ima->type==IMA_TYPE_R_RESULT) { + if(ima->render_slot == ima->last_render_slot) + RE_ReleaseResult(RE_GetRender(scene->id.name)); + } +} + +void BKE_image_backup_render(Scene *scene, Image *ima) +{ + /* called right before rendering, ima->renders contains render + result pointers for everything but the current render */ + Render *re= RE_GetRender(scene->id.name); + int slot= ima->render_slot, last= ima->last_render_slot; + + if(slot != last) { + if(ima->renders[slot]) { + RE_FreeRenderResult(ima->renders[slot]); + ima->renders[slot]= NULL; + } + + ima->renders[last]= NULL; + RE_SwapResult(re, &ima->renders[last]); + } + + ima->last_render_slot= slot; } /* after imbuf load, openexr type can return with a exrhandle open */ @@ -1839,6 +1871,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ float dither; int channels, layer, pass; ImBuf *ibuf; + int from_render= (ima->render_slot == ima->last_render_slot); if(!(iuser && iuser->scene)) return NULL; @@ -1847,14 +1880,29 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ if(!lock_r) return NULL; - re= RE_GetRender(iuser->scene->id.name, RE_SLOT_VIEW); + re= RE_GetRender(iuser->scene->id.name); channels= 4; layer= (iuser)? iuser->layer: 0; pass= (iuser)? iuser->pass: 0; + + if(from_render) + RE_AcquireResultImage(re, &rres); + else if(ima->renders[ima->render_slot]) + rres= *(ima->renders[ima->render_slot]); + else + memset(&rres, 0, sizeof(RenderResult)); + if(!(rres.rectx > 0 && rres.recty > 0)) { + RE_ReleaseResultImage(re); + return NULL; + } + + /* release is done in BKE_image_release_ibuf using lock_r */ + if(from_render) + *lock_r= re; + /* this gives active layer, composite or seqence result */ - RE_AcquireResultImage(re, &rres); rect= (unsigned int *)rres.rect32; rectf= rres.rectf; rectz= rres.rectz; @@ -1885,11 +1933,6 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ rectz= rpass->rect; } } - - if(!(rectf || rect)) { - RE_ReleaseResultImage(re); - return NULL; - } ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0); @@ -1898,6 +1941,10 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, 0, 0); image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); } + + if(!(rectf || rect)) + return ibuf; + ibuf->x= rres.rectx; ibuf->y= rres.recty; @@ -1915,9 +1962,6 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ ima->ok= IMA_OK_LOADED; - /* release is done in BKE_image_release_ibuf using lock_r */ - *lock_r= re; - return ibuf; } diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 17f6bd10859..913ec3d4cae 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -2175,9 +2175,9 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int RenderResult rres; if(rendering) - re= RE_NewRender(" do_build_seq_ibuf", RE_SLOT_DEFAULT); + re= RE_NewRender(" do_build_seq_ibuf"); else - re= RE_NewRender(sce->id.name, RE_SLOT_VIEW); + re= RE_NewRender(sce->id.name); RE_BlenderFrame(re, sce, NULL, sce->lay, frame); -- cgit v1.2.3 From 46895ab1f2786c2347d0d42b192197fca6d04bf5 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 28 Mar 2010 13:45:19 +0000 Subject: Attempt to fix #21796: render crash on windows after slots commit. --- source/blender/blenkernel/intern/image.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index f9352f1ded8..2d582157233 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -1948,8 +1948,11 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ ibuf->x= rres.rectx; ibuf->y= rres.recty; - if(ibuf->rect_float!=rectf || rect) /* ensure correct redraw */ + if(ibuf->rect_float!=rectf || rect) { /* ensure correct redraw */ + BLI_lock_thread(LOCK_CUSTOM1); imb_freerectImBuf(ibuf); + BLI_unlock_thread(LOCK_CUSTOM1); + } if(rect) ibuf->rect= rect; -- cgit v1.2.3 From 8ba96eb1ae5ccfb3cc61f4f8d692dd271964c1af Mon Sep 17 00:00:00 2001 From: "Guillermo S. Romero" Date: Sun, 28 Mar 2010 17:01:46 +0000 Subject: Change \n to more strict \r\n in HTTP headers (plus misc cleanups). Reported by Ralph Giles via bug 21797. --- .../blender/blenkernel/intern/writeframeserver.c | 39 ++++++++++++---------- 1 file changed, 22 insertions(+), 17 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c index cf3a36419b4..a7b6bcf3a09 100644 --- a/source/blender/blenkernel/intern/writeframeserver.c +++ b/source/blender/blenkernel/intern/writeframeserver.c @@ -1,4 +1,6 @@ /* + * $Id$ + * * Frameserver * Makes Blender accessible from TMPGenc directly using VFAPI (you can * use firefox too ;-) @@ -93,7 +95,7 @@ static int select_was_interrupted_by_signal() return (errno == EINTR); } -static int closesocket(int fd) +static int closesocket(int fd) { return close(fd); } @@ -140,10 +142,10 @@ int start_frameserver(struct Scene *scene, RenderData *rd, int rectx, int recty, return 1; } -static char index_page[] -= -"HTTP/1.1 200 OK\n" -"Content-Type: text/html\n\n" +static char index_page[] = +"HTTP/1.1 200 OK\r\n" +"Content-Type: text/html\r\n" +"\r\n" "Blender Frameserver\n" "
\n"
 "

Blender Frameserver

\n" @@ -156,9 +158,10 @@ static char index_page[] "\n" "
\n"; -static char good_bye[] -= "HTTP/1.1 200 OK\n" -"Content-Type: text/html\n\n" +static char good_bye[] = +"HTTP/1.1 200 OK\r\n" +"Content-Type: text/html\r\n" +"\r\n" "Blender Frameserver\n" "
\n"
 "Render stopped. Goodbye
"; @@ -216,13 +219,14 @@ static int handle_request(RenderData *rd, char * req) if (strcmp(path, "/info.txt") == 0) { char buf[4096]; - sprintf(buf, - "HTTP/1.1 200 OK\n" - "Content-Type: text/html\n\n" + sprintf(buf, + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html\r\n" + "\r\n" "start %d\n" "end %d\n" "width %d\n" - "height %d\n" + "height %d\n" "rate %d\n" "ratescale %d\n", rd->sfra, @@ -317,10 +321,11 @@ static void serve_ppm(int *pixels, int rectx, int recty) int y; char header[1024]; - sprintf(header, - "HTTP/1.1 200 OK\n" - "Content-Type: image/ppm\n" - "Connection: close\n\n" + sprintf(header, + "HTTP/1.1 200 OK\r\n" + "Content-Type: image/ppm\r\n" + "Connection: close\r\n" + "\r\n" "P6\n" "# Creator: blender frameserver v0.0.1\n" "%d %d\n" @@ -343,7 +348,7 @@ static void serve_ppm(int *pixels, int rectx, int recty) target += 3; src += 4; } - safe_write((char*)row, 3 * rectx); + safe_write((char*)row, 3 * rectx); } free(row); closesocket(connsock); -- cgit v1.2.3 From 751a9975e4c633e1ea8818c1f2f07fd6020c0ec0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 28 Mar 2010 18:41:49 +0000 Subject: [#21802] UVProject Modifier Crash fix for bug in recent addition of panorama support --- source/blender/blenkernel/intern/modifier.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 5cda09cad85..96877a9ae9e 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -3717,9 +3717,10 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd, /* calculate projection matrix */ invert_m4_m4(projectors[i].projmat, projectors[i].ob->obmat); + projectors[i].uci= NULL; + if(projectors[i].ob->type == OB_CAMERA) { cam = (Camera *)projectors[i].ob->data; - projectors[i].uci= NULL; if(cam->flag & CAM_PANORAMA) { projectors[i].uci= project_camera_info(projectors[i].ob, NULL, aspx, aspy); -- cgit v1.2.3