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:
authorKent Mein <mein@cs.umn.edu>2006-02-11 00:10:58 +0300
committerKent Mein <mein@cs.umn.edu>2006-02-11 00:10:58 +0300
commitee4c7ef22aa95a4d1bb6ab4079576009862611d0 (patch)
tree44012c15e1f23fd8b10ef42ea284b159ade0b602 /source
parentb9425b2a3509b4715acf753cefd4a2392b537ccb (diff)
Added ability to render Zbuffer to an image.
Just use SHIFT-F3 and save an image. Basically all this does is copy the zbuffer to a new Image buffer and pass that to the save image function. Sample output: http://www.cs.umn.edu/~mein/blender/kungfu_zbuf255.jpg Also thanks to Jesterking for helping me debug dumbness... ;) and the nice screenshot. Kent
Diffstat (limited to 'source')
-rw-r--r--source/blender/imbuf/IMB_imbuf.h3
-rw-r--r--source/blender/include/BIF_writeimage.h2
-rw-r--r--source/blender/python/api2_2x/Mesh.c6
-rw-r--r--source/blender/src/header_info.c2
-rw-r--r--source/blender/src/toets.c6
-rw-r--r--source/blender/src/writeimage.c47
6 files changed, 54 insertions, 12 deletions
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 744c3b66345..39243ec50d1 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -505,6 +505,9 @@ void IMB_rectfill(struct ImBuf *drect, float col[4]);
short imb_addrectImBuf(struct ImBuf * ibuf);
void imb_freerectImBuf(struct ImBuf * ibuf);
+short imb_addrectfloatImBuf(struct ImBuf * ibuf);
+void imb_freerectfloatImBuf(struct ImBuf * ibuf);
+
#ifdef WITH_QUICKTIME
/**
*
diff --git a/source/blender/include/BIF_writeimage.h b/source/blender/include/BIF_writeimage.h
index 70978a033c2..002d382be5b 100644
--- a/source/blender/include/BIF_writeimage.h
+++ b/source/blender/include/BIF_writeimage.h
@@ -37,7 +37,7 @@ struct ImBuf;
struct EnvMap;
void BIF_save_rendered_image(char *name);
-void BIF_save_rendered_image_fs(void);
+void BIF_save_rendered_image_fs(int zbuf);
void BIF_save_envmap(struct EnvMap *env, char *str);
void save_image_filesel_str(char *str);
diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c
index 9d059af046d..1bfd0d26f27 100644
--- a/source/blender/python/api2_2x/Mesh.c
+++ b/source/blender/python/api2_2x/Mesh.c
@@ -2500,6 +2500,7 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
/* if a sequence... */
tmp = PyTuple_GET_ITEM( args, 0 );
if( PySequence_Check( tmp ) ) {
+ PyObject *tmp2 = 0;
/* ignore empty sequences */
if( !PySequence_Size( tmp ) ) {
@@ -2507,7 +2508,7 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
}
/* if another sequence, use it */
- PyObject *tmp2 = PySequence_ITEM( tmp, 0 );
+ tmp2 = PySequence_ITEM( tmp, 0 );
if( PySequence_Check( tmp2 ) )
args = tmp;
Py_INCREF( args );
@@ -4068,6 +4069,7 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
/* if a sequence... */
tmp = PyTuple_GET_ITEM( args, 0 );
if( PySequence_Check( tmp ) ) {
+ PyObject *tmp2 = 0;
/* ignore empty sequences */
if( !PySequence_Size( tmp ) ) {
@@ -4075,7 +4077,7 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
}
/* if another sequence, use it */
- PyObject *tmp2 = PySequence_ITEM( tmp, 0 );
+ tmp2 = PySequence_ITEM( tmp, 0 );
if( PySequence_Check( tmp2 ) )
args = tmp;
Py_INCREF( args );
diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c
index dfc04c6fe14..8e2b746d612 100644
--- a/source/blender/src/header_info.c
+++ b/source/blender/src/header_info.c
@@ -769,7 +769,7 @@ static void do_info_filemenu(void *arg, int event)
}
break;
case 6: /* save image */
- BIF_save_rendered_image_fs();
+ BIF_save_rendered_image_fs(0);
break;
case 22: /* save runtime */
activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
diff --git a/source/blender/src/toets.c b/source/blender/src/toets.c
index b19c5fbbcb2..972b5a0af06 100644
--- a/source/blender/src/toets.c
+++ b/source/blender/src/toets.c
@@ -403,13 +403,15 @@ int blenderqread(unsigned short event, short val)
break;
case F3KEY:
if(G.qual==0) {
- BIF_save_rendered_image_fs();
+ BIF_save_rendered_image_fs(0);
return 0;
}
else if(G.qual & LR_CTRLKEY) {
- /* all alt+ctrl+shift combos are needed here... */
BIF_screendump(0);
}
+ else if(G.qual & LR_SHIFTKEY) {
+ BIF_save_rendered_image_fs(1);
+ }
break;
case F4KEY:
if(G.qual==LR_SHIFTKEY) {
diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c
index 808c10c4a17..8bafd14d0e0 100644
--- a/source/blender/src/writeimage.c
+++ b/source/blender/src/writeimage.c
@@ -83,10 +83,15 @@ void BIF_save_envmap(EnvMap *env, char *str)
}
+#define FTOCHAR(val) val<=0.0f?255: 255-(val>=255.0f?255: (char)(val))
+
/* callback for fileselect to save rendered image, renderresult was checked to exist */
-static void save_rendered_image_cb(char *name)
+static void save_rendered_image_cb_real(char *name, int zbuf)
{
char str[FILE_MAXDIR+FILE_MAXFILE];
+ int pixel, end;
+ float *pixf = 0;
+ char *pixc = 0;
if(BLI_testextensie(name,".blend")) {
error("Wrong filename");
@@ -110,9 +115,26 @@ static void save_rendered_image_cb(char *name)
waitcursor(1); /* from screen.c */
ibuf= IMB_allocImBuf(rres.rectx, rres.recty, G.scene->r.planes, 0, 0);
- ibuf->rect= rres.rect32;
- ibuf->rect_float= rres.rectf;
- ibuf->zbuf_float= rres.rectz;
+ if (zbuf == 1) {
+ if (ibuf->rect ==NULL) imb_addrectImBuf(ibuf);
+ if (ibuf->rect_float==NULL) imb_addrectfloatImBuf(ibuf);
+
+ ibuf->zbuf_float= rres.rectz;
+
+ pixc = (char *)ibuf->rect;
+ pixf = (float *)ibuf->rect_float;
+
+ end = ibuf->x * ibuf->y;
+ for(pixel = 0; pixel < end; pixel++, pixf+=4, pixc+=4) {
+ pixf[0] = pixf[1] = pixf[2] = pixf[3] = 1-rres.rectz[pixel]/100000000000;
+ pixc[0] = pixc[1] = pixc[2] = pixc[3] = FTOCHAR(rres.rectz[pixel]);
+ }
+ ibuf->zbuf_float= rres.rectz;
+ } else {
+ ibuf->rect= rres.rect32;
+ ibuf->rect_float= rres.rectf;
+ ibuf->zbuf_float= rres.rectz;
+ }
BKE_write_ibuf(ibuf, str, G.scene->r.imtype, G.scene->r.subimtype, G.scene->r.quality);
IMB_freeImBuf(ibuf); /* imbuf knows rects are not part of ibuf */
@@ -123,6 +145,14 @@ static void save_rendered_image_cb(char *name)
}
}
+static void save_rendered_image_cb(char *name) {
+ save_rendered_image_cb_real(name,0);
+}
+
+static void save_rendered_image_zbuf_cb(char *name) {
+ save_rendered_image_cb_real(name,1);
+}
+
void save_image_filesel_str(char *str)
{
switch(G.scene->r.imtype) {
@@ -171,8 +201,8 @@ void save_image_filesel_str(char *str)
}
}
-/* calls fileselect */
-void BIF_save_rendered_image_fs(void)
+/* calls fileselect if zbuf is set we are rendering the zbuffer */
+void BIF_save_rendered_image_fs(int zbuf)
{
RenderResult *rr= RE_GetResult(RE_GetRender("Render"));
@@ -188,7 +218,12 @@ void BIF_save_rendered_image_fs(void)
}
save_image_filesel_str(str);
+ if (zbuf) {
+ activate_fileselect(FILE_SPECIAL, str, G.ima, save_rendered_image_zbuf_cb);
+ return;
+ }
activate_fileselect(FILE_SPECIAL, str, G.ima, save_rendered_image_cb);
}
}
+