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
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-03-14 20:44:19 +0300
committerTon Roosendaal <ton@blender.org>2006-03-14 20:44:19 +0300
commite3fb99ad70e1f184953724bc376bad17894f7fa8 (patch)
tree1548c1980ed04579b37bc51b95dc8f6b5c1e3e66 /source
parent705beae5175e2edc3f544af7937a94594947236a (diff)
Urgh... the commit to free texture images always also did it for preview...
Diffstat (limited to 'source')
-rw-r--r--source/blender/render/intern/source/convertblender.c1
-rw-r--r--source/blender/render/intern/source/pipeline.c94
2 files changed, 81 insertions, 14 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 30e1518ac2f..94889c7697e 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -2755,6 +2755,7 @@ void RE_Database_Free(Render *re)
re->i.convertdone= 0;
//if(re->scene->r.scemode & R_FREE_IMAGE)
+ if((re->r.scemode & R_PREVIEWBUTS)==0)
free_all_imagetextures();
}
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 5848ec4e392..14d1321bfa2 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -35,6 +35,7 @@
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -103,8 +104,6 @@ static struct ListBase RenderList= {NULL, NULL};
/* hardcopy of current render, used while rendering for speed */
Render R;
-//static SDL_mutex *exrtile_lock= NULL;
-
/* ********* alloc and free ******** */
@@ -275,6 +274,19 @@ static char *get_pass_name(int passtype, int channel)
return "Unknown";
}
+static void render_unique_exr_name(Render *re, char *str)
+{
+ char di[FILE_MAXDIR+FILE_MAXFILE], name[FILE_MAXFILE], fi[FILE_MAXFILE];
+
+ BLI_strncpy(di, G.sce, FILE_MAXDIR+FILE_MAXFILE);
+ BLI_splitdirstring(di, fi);
+ sprintf(name, "%s_%s.exr", fi, re->scene->id.name+2);
+ BLI_make_file_string("/", str, U.tempdir, name);
+
+ printf("exr file %s\n", str);
+
+}
+
static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, int passtype)
{
char *typestr= get_pass_name(passtype, 0);
@@ -495,7 +507,7 @@ static void save_render_result_tile(Render *re, RenderPart *pa)
RenderPass *rpassp;
int offs, partx, party;
-// if(exrtile_lock) SDL_mutexP(exrtile_lock);
+ BLI_lock_thread(LOCK_CUSTOM1);
for(rlp= rrpart->layers.first; rlp; rlp= rlp->next) {
@@ -529,7 +541,7 @@ static void save_render_result_tile(Render *re, RenderPart *pa)
IMB_exrtile_write_channels(re->result->exrhandle, partx, party);
-// if(exrtile_lock) SDL_mutexV(exrtile_lock);
+ BLI_unlock_thread(LOCK_CUSTOM1);
}
@@ -539,11 +551,17 @@ static void read_render_result(Render *re)
RenderPass *rpass;
void *exrhandle= IMB_exr_get_handle();
int rectx, recty;
+ char str[FILE_MAXDIR+FILE_MAXFILE];
free_render_result(re->result);
re->result= new_render_result(re, &re->disprect, 0);
- IMB_exr_begin_read(exrhandle, "/tmp/render.exr", &rectx, &recty);
+ render_unique_exr_name(re, str);
+ if(IMB_exr_begin_read(exrhandle, str, &rectx, &recty)==0) {
+ printf("cannot read render result\n");
+ return;
+ }
+
if(rectx!=re->result->rectx || recty!=re->result->recty) {
printf("error in reading render result\n");
}
@@ -567,9 +585,7 @@ static void read_render_result(Render *re)
}
}
- printf("before read\n");
IMB_exr_read_channels(exrhandle);
- printf("after read\n");
}
IMB_exr_close(exrhandle);
@@ -1059,15 +1075,17 @@ static void threaded_tile_processor(Render *re)
if(re->test_break())
return;
+ initparts(re);
+
if(rr->exrhandle) {
- IMB_exrtile_begin_write(rr->exrhandle, "/tmp/render.exr", rr->rectx, rr->recty, rr->rectx/re->xparts, rr->recty/re->yparts);
-// exrtile_lock = SDL_CreateMutex();
+ char str[FILE_MAXDIR+FILE_MAXFILE];
+ render_unique_exr_name(re, str);
+ IMB_exrtile_begin_write(rr->exrhandle, str, rr->rectx, rr->recty, rr->rectx/re->xparts, rr->recty/re->yparts);
}
if(re->r.mode & R_THREADS) maxthreads= 2;
else maxthreads= 1;
- initparts(re);
BLI_init_threads(&threads, do_part_thread, maxthreads);
/* assuming no new data gets added to dbase... */
@@ -1142,8 +1160,8 @@ static void threaded_tile_processor(Render *re)
}
if(rr->exrhandle) {
-// if(exrtile_lock) SDL_DestroyMutex(exrtile_lock);
IMB_exr_close(rr->exrhandle);
+ rr->exrhandle= NULL;
read_render_result(re);
}
@@ -1200,14 +1218,18 @@ static void do_render_fields(Render *re)
/* within context of current Render *re, render another scene.
it uses current render image size and disprect, but doesn't execute composite
*/
-void RE_RenderScene(Render *re, Scene *sce, int cfra)
+static void render_scene(Render *re, Scene *sce, int cfra)
{
Render *resc= RE_NewRender(sce->id.name);
sce->r.cfra= cfra;
+ if(G.rt)
+ resc->flag |= R_FILEBUFFER;
+
/* makes render result etc */
RE_InitState(resc, &sce->r, re->winx, re->winy, &re->disprect);
+ resc->flag &= ~R_FILEBUFFER;
/* this to enable this scene to create speed vectors */
resc->r.scemode |= R_DOCOMP;
@@ -1261,7 +1283,7 @@ static void ntree_render_scenes(Render *re)
if(node->type==CMP_NODE_R_RESULT) {
if(node->id && node->id != (ID *)re->scene) {
if(node->id->flag & LIB_DOIT) {
- RE_RenderScene(re, (Scene *)node->id, cfra);
+ render_scene(re, (Scene *)node->id, cfra);
node->id->flag &= ~LIB_DOIT;
}
}
@@ -1442,7 +1464,15 @@ static int render_initialize_from_scene(Render *re, Scene *scene)
disprect.ymax= winy;
}
-/* if(G.rt) re->flag |= R_FILEBUFFER; */
+ if(G.rt) {
+ int partx= winx/scene->r.xparts, party= winy/scene->r.yparts;
+ /* stupid exr tiles dont like different sizes */
+ if(winx != partx*scene->r.xparts || winy != party*scene->r.xparts) {
+ re->error("Sorry... exr tile saving only allowed with equally sized parts");
+ return 0;
+ }
+ re->flag |= R_FILEBUFFER;
+ }
if(scene->r.scemode & R_SINGLE_LAYER)
push_render_result(re);
@@ -1589,5 +1619,41 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra)
scene->r.cfra= cfrao;
}
+/* note; repeated win/disprect calc... solve that nicer, also in compo */
+
+void RE_ReadRenderResult(Scene *scene, Scene *scenode)
+{
+ Render *re;
+ int winx, winy;
+ rcti disprect;
+
+ /* calculate actual render result and display size */
+ winx= (scene->r.size*scene->r.xsch)/100;
+ winy= (scene->r.size*scene->r.ysch)/100;
+
+ /* only in movie case we render smaller part */
+ if(scene->r.mode & R_BORDER) {
+ disprect.xmin= scene->r.border.xmin*winx;
+ disprect.xmax= scene->r.border.xmax*winx;
+
+ disprect.ymin= scene->r.border.ymin*winy;
+ disprect.ymax= scene->r.border.ymax*winy;
+ }
+ else {
+ disprect.xmin= disprect.ymin= 0;
+ disprect.xmax= winx;
+ disprect.ymax= winy;
+ }
+
+ if(scenode)
+ scene= scenode;
+
+ re= RE_NewRender(scene->id.name);
+ RE_InitState(re, &scene->r, winx, winy, &disprect);
+ re->scene= scene;
+
+ read_render_result(re);
+}
+