Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-03-29 02:45:14 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-03-29 02:45:14 +0400
commitf4e9c5d71e7de908384c713da52585e027abe49e (patch)
tree48e1dab2ae492a1e1aa0d3f7ae191a844b86adf0 /source/blender/blenkernel
parente2cb63574485efb2a9ccde1f0b15a29d086dd194 (diff)
parent33ee3fc6fe0d387e1efb2b545cab441867fb1b48 (diff)
Merged changes in the trunk up to revision 27817.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_image.h3
-rw-r--r--source/blender/blenkernel/intern/collision.c2
-rw-r--r--source/blender/blenkernel/intern/displist.c6
-rw-r--r--source/blender/blenkernel/intern/image.c95
-rw-r--r--source/blender/blenkernel/intern/modifier.c3
-rw-r--r--source/blender/blenkernel/intern/sequencer.c4
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c39
7 files changed, 104 insertions, 48 deletions
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/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);
}
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..2d582157233 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; a<IMA_MAX_RENDER_SLOT; a++) {
+ if(ima->renders[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,11 +1941,18 @@ 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;
- 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;
@@ -1915,9 +1965,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/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);
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);
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"
"<html><head><title>Blender Frameserver</title></head>\n"
"<body><pre>\n"
"<H2>Blender Frameserver</H2>\n"
@@ -156,9 +158,10 @@ static char index_page[]
"\n"
"</pre></body></html>\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"
"<html><head><title>Blender Frameserver</title></head>\n"
"<body><pre>\n"
"Render stopped. Goodbye</pre></body></html>";
@@ -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);