Step one in bringing back Yafray Render in Blender. Need someone else

to take over now, but I'm available for help. Main notes for completing:

- Yafray module uses old global R all over... is now a pointer handle.
  It can be temporally bypassed by straight copying, which I do now.

- I am not sure in what pixel format Yafray renders... Blender now only
  uses float buffers. In the code, marked with XXX I've added the
  rudimentary code for retrieving buffers.

- This integration will skip compositing when Yafray render is used.
This commit is contained in:
Ton Roosendaal
2006-05-28 12:30:09 +00:00
parent 2e901061d9
commit eda218ecb4
3 changed files with 55 additions and 3 deletions

View File

@@ -61,6 +61,9 @@
#include "BSE_sequence.h" /* <----------------- bad!!! */
/* yafray: include for yafray export/render */
#include "YafRay_Api.h"
/* internal */
#include "render_types.h"
#include "renderpipeline.h"
@@ -71,6 +74,7 @@
#include "shadbuf.h"
#include "zbuf.h"
/* render flow
1) Initialize state
@@ -1588,6 +1592,37 @@ static void do_render_composite_fields_blur_3d(Render *re)
re->display_draw(re->result, NULL);
}
/* yafray: main yafray render/export call */
static void yafrayRender(Render *re)
{
re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
/* yafray uses this global still..., also for database stage? */
R= *re;
// switch must be done before prepareScene()
if (!R.r.YFexportxml)
YAF_switchFile();
else
YAF_switchPlugin();
printf("Starting scene conversion.\n");
RE_Database_FromScene(re, re->scene, 1);
printf("Scene conversion done.\n");
/* yafray uses this global for exporting */
R= *re;
YAF_exportScene();
RE_Database_Free(re);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* main loop: doing sequence + fields + blur + 3d render + compositing */
static void do_render_all_options(Render *re)
{
@@ -1596,7 +1631,10 @@ static void do_render_all_options(Render *re)
do_render_seq(re->result, re->r.cfra);
}
else {
do_render_composite_fields_blur_3d(re);
if(re->r.renderer==R_YAFRAY)
yafrayRender(re);
else
do_render_composite_fields_blur_3d(re);
}
}

View File

@@ -289,6 +289,13 @@ void yafrayFileRender_t::displayImage()
unsigned int idlen = (unsigned int)header[0];
if (idlen) fseek(fp, idlen, SEEK_CUR);
/* XXX how to get the image from Blender and write to it. This call doesn't allow to change buffer rects */
RenderResult rres;
RE_GetResultImage(&R, &rres);
// rres.rectx, rres.recty is width/height
// rres.rectf is float buffer, scanlines starting in bottom
// rres.rectz is zbuffer, available when associated pass is set
// read data directly into buffer, picture is upside down
for (unsigned short y=0;y<height;y++) {
unsigned char* bpt = NULL; //(unsigned char*)R.rectot + ((((height-1)-y)*width)<<2);

View File

@@ -274,8 +274,6 @@ void yafrayPluginRender_t::displayImage()
// although it is possible to load the image using blender,
// maybe it is best to just do a read here, for now the yafray output is always a raw tga anyway
// rectot already freed in initrender
// R.rectot = (unsigned int *)MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
FILE* fp = fopen(imgout.c_str(), "rb");
if (fp==NULL) {
@@ -292,6 +290,14 @@ void yafrayPluginRender_t::displayImage()
unsigned int idlen = (unsigned int)header[0];
if (idlen) fseek(fp, idlen, SEEK_CUR);
/* XXX how to get the image from Blender and write to it. This call doesn't allow to change buffer rects */
RenderResult rres;
RE_GetResultImage(&R, &rres);
// rres.rectx, rres.recty is width/height
// rres.rectf is float buffer, scanlines starting in bottom
// rres.rectz is zbuffer, available when associated pass is set
// read data directly into buffer, picture is upside down
for (unsigned short y=0;y<height;y++) {
unsigned char* bpt = NULL;//(unsigned char*)R.rectot + ((((height-1)-y)*width)<<2);
@@ -1948,6 +1954,7 @@ bool blenderYafrayOutput_t::putPixel(int x, int y, const yafray::color_t &c,
out++;
if (out==4096)
{
/* XXX second arg is rcti *rect, allows to indicate sub-rect in image to draw */
R.display_draw(R.result, NULL);
out = 0;
}