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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user