[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13436] trunk/blender/source/blender: New rendering option: FSA!
Ton Roosendaal
ton at blender.org
Mon Jan 28 17:33:59 CET 2008
Revision: 13436
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13436
Author: ton
Date: 2008-01-28 17:33:59 +0100 (Mon, 28 Jan 2008)
Log Message:
-----------
New rendering option: FSA!
This completes the pipeline make-over, as started in 2006. With this
option, during rendering, each sample for every layer and pass is being
saved on disk (looks like non-antialiased images). Then the composite
and color correction happens, then a clip to 0-1 range, and only in end
all samples get combined - using sampling filters such as gauss/mitch/catmul.
This results in artefact-free antialiased images. Even Z-combine or
ID masks now work perfect for it!
This is an unfinished commit btw; Brecht will finish this for strands.
Also Halo doesnt work yet.
To activate FSA: press "Save Buffers" and the new button next to it. :)
Modified Paths:
--------------
trunk/blender/source/blender/makesdna/DNA_scene_types.h
trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
trunk/blender/source/blender/render/extern/include/RE_pipeline.h
trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
trunk/blender/source/blender/render/intern/include/render_types.h
trunk/blender/source/blender/render/intern/include/rendercore.h
trunk/blender/source/blender/render/intern/include/shading.h
trunk/blender/source/blender/render/intern/source/convertblender.c
trunk/blender/source/blender/render/intern/source/pipeline.c
trunk/blender/source/blender/render/intern/source/pixelblending.c
trunk/blender/source/blender/render/intern/source/rendercore.c
trunk/blender/source/blender/render/intern/source/shadeinput.c
trunk/blender/source/blender/render/intern/source/strand.c
trunk/blender/source/blender/render/intern/source/zbuf.c
trunk/blender/source/blender/src/buttons_scene.c
trunk/blender/source/blender/src/buttons_shading.c
Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h 2008-01-28 16:33:59 UTC (rev 13436)
@@ -589,8 +589,9 @@
#define R_EXR_TILE_FILE 0x0400
#define R_COMP_FREE 0x0800
#define R_NO_IMAGE_LOAD 0x1000
-#define R_NO_TEX 0x2000
+#define R_NO_TEX 0x2000
#define R_STAMP_INFO 0x4000
+#define R_FULL_SAMPLE 0x8000
/* r->stamp */
#define R_STAMP_TIME 0x0001
Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c 2008-01-28 16:33:59 UTC (rev 13436)
@@ -376,8 +376,10 @@
// some sort of visual feedback would be nice, or at least this text in the renderwin header
// but for now just print some info in the console every 8 scanlines.
if (((y & 7)==0) || (y==(img->y-1))) {
- printf("\rdefocus: Processing Line %d of %d ... ", y+1, img->y);
- fflush(stdout);
+ if(G.background==0) {
+ printf("\rdefocus: Processing Line %d of %d ... ", y+1, img->y);
+ fflush(stdout);
+ }
}
// esc set by main calling process
if(node->exec & NODE_BREAK)
Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c 2008-01-28 16:33:59 UTC (rev 13436)
@@ -63,8 +63,25 @@
MEM_freeN(abuf);
}
+/* full sample version */
+static void do_idmask_fsa(CompBuf *stackbuf, CompBuf *cbuf, float idnr)
+{
+ float *rect, *rs;
+ int x;
+
+ rect= cbuf->rect;
+ rs= stackbuf->rect;
+ for(x= cbuf->x*cbuf->y - 1; x>=0; x--)
+ if(rect[x]==idnr)
+ rs[x]= 1.0f;
+
+}
+
+
static void node_composit_exec_idmask(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
+ RenderData *rd= data;
+
if(out[0]->hasoutput==0)
return;
@@ -77,7 +94,10 @@
stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */;
- do_idmask(stackbuf, cbuf, (float)node->custom1);
+ if(rd->scemode & R_FULL_SAMPLE)
+ do_idmask_fsa(stackbuf, cbuf, (float)node->custom1);
+ else
+ do_idmask(stackbuf, cbuf, (float)node->custom1);
out[0]->data= stackbuf;
}
Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c 2008-01-28 16:33:59 UTC (rev 13436)
@@ -45,6 +45,16 @@
{ -1, 0, "" }
};
+static void do_zcombine(bNode *node, float *out, float *src1, float *z1, float *src2, float *z2)
+{
+ if(*z1 <= *z2) {
+ QUATCOPY(out, src1);
+ }
+ else {
+ QUATCOPY(out, src2);
+ }
+}
+
static void do_zcombine_mask(bNode *node, float *out, float *z1, float *z2)
{
if(*z1 > *z2) {
@@ -67,6 +77,8 @@
static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
+ RenderData *rd= data;
+
/* stack order in: col z col z */
/* stack order out: col z */
if(out[0]->hasoutput==0)
@@ -76,6 +88,16 @@
if(in[0]->data==NULL) {
return;
}
+ else if(rd->scemode & R_FULL_SAMPLE) {
+ /* make output size of first input image */
+ CompBuf *cbuf= in[0]->data;
+ CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs
+
+ composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec,
+ in[3]->data, in[3]->vec, do_zcombine, CB_RGBA, CB_VAL, CB_RGBA, CB_VAL);
+
+ out[0]->data= stackbuf;
+ }
else {
/* make output size of first input image */
CompBuf *cbuf= in[0]->data;
Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h 2008-01-28 16:33:59 UTC (rev 13436)
@@ -88,10 +88,11 @@
} RenderLayer;
typedef struct RenderResult {
+ struct RenderResult *next, *prev;
/* target image size */
int rectx, recty;
- short crop, pad;
+ short crop, sample_nr;
/* optional, 32 bits version of picture, used for ogl render and image curves */
int *rect32;
@@ -113,7 +114,6 @@
volatile RenderLayer *renlay;
/* optional saved endresult on disk */
- char exrfile[FILE_MAXDIR];
void *exrhandle;
/* for render results in Image, verify validity for sequences */
@@ -121,6 +121,7 @@
} RenderResult;
+
typedef struct RenderStats {
int totface, totvert, totstrand, tothalo, totlamp, totpart;
short curfield, curblur, curpart, partsdone, convertdone;
Modified: trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_shader_ext.h 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/extern/include/RE_shader_ext.h 2008-01-28 16:33:59 UTC (rev 13436)
@@ -157,6 +157,7 @@
int xs, ys; /* pixel to be rendered */
int mask; /* subsample mask */
+
int samplenr; /* sample counter, to detect if we should do shadow again */
int depth; /* 1 or larger on raytrace shading */
@@ -169,6 +170,7 @@
/* from initialize, part or renderlayer */
short do_preview; /* for nodes, in previewrender */
short thread, sample; /* sample: ShadeSample array index */
+
unsigned int lay;
int layflag, passflag, combinedflag;
struct Group *light_override;
Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/include/render_types.h 2008-01-28 16:33:59 UTC (rev 13436)
@@ -79,8 +79,8 @@
{
struct RenderPart *next, *prev;
- /* result of part rendering */
- RenderResult *result;
+ RenderResult *result; /* result of part rendering */
+ ListBase fullresult; /* optional full sample buffers */
int *recto; /* object table for objects */
int *rectp; /* polygon index table */
@@ -113,6 +113,8 @@
RenderResult *result;
/* if render with single-layer option, other rendered layers are stored here */
RenderResult *pushedresult;
+ /* a list of RenderResults, for fullsample */
+ ListBase fullresult;
/* window size, display rect, viewplane */
int winx, winy;
Modified: trunk/blender/source/blender/render/intern/include/rendercore.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/rendercore.h 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/include/rendercore.h 2008-01-28 16:33:59 UTC (rev 13436)
@@ -93,6 +93,9 @@
void addps(struct ListBase *lb, long *rd, int obi, int facenr, int z, unsigned short mask);
+int get_sample_layers(struct RenderPart *pa, struct RenderLayer *rl, struct RenderLayer **rlpp);
+
+
/* -------- ray.c ------- */
extern void freeraytree(Render *re);
Modified: trunk/blender/source/blender/render/intern/include/shading.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/shading.h 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/include/shading.h 2008-01-28 16:33:59 UTC (rev 13436)
@@ -40,8 +40,10 @@
/* needed to calculate shadow and AO for an entire pixel */
typedef struct ShadeSample {
- int tot; /* amount of shi in use, can be 1 for not FULL_OSA */
+ int tot; /* amount of shi in use, can be 1 for not FULL_OSA */
+ RenderLayer *rlpp[RE_MAX_OSA]; /* fast lookup from sample to renderlayer (fullsample buf) */
+
/* could be malloced once */
ShadeInput shi[RE_MAX_OSA];
ShadeResult shr[RE_MAX_OSA];
Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c 2008-01-28 16:33:59 UTC (rev 13436)
@@ -3704,7 +3704,7 @@
}
/* per face check if all samples should be taken.
- if raytrace, do always for raytraced material, or when material full_osa set */
+ if raytrace or multisample, do always for raytraced material, or when material full_osa set */
static void set_fullsample_flag(Render *re, ObjectRen *obr)
{
VlakRen *vlr;
@@ -3718,7 +3718,8 @@
for(a=obr->totvlak-1; a>=0; a--) {
vlr= RE_findOrAddVlak(obr, a);
- if(vlr->mat->mode & MA_FULL_OSA) vlr->flag |= R_FULL_OSA;
+ if(vlr->mat->mode & MA_FULL_OSA)
+ vlr->flag |= R_FULL_OSA;
else if(trace) {
if(vlr->mat->mode & MA_SHLESS);
else if(vlr->mat->mode & (MA_RAYTRANSP|MA_RAYMIRROR))
Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c 2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c 2008-01-28 16:33:59 UTC (rev 13436)
@@ -78,6 +78,7 @@
#include "envmap.h"
#include "initrender.h"
#include "shadbuf.h"
+#include "pixelblending.h"
#include "zbuf.h"
@@ -195,6 +196,22 @@
MEM_freeN(res);
}
+/* version that's compatible with fullsample buffers */
+static void free_render_result(ListBase *lb, RenderResult *rr)
+{
+ RenderResult *rrnext;
+
+ for(; rr; rr= rrnext) {
+ rrnext= rr->next;
+
+ if(lb && lb->first)
+ BLI_remlink(lb, rr);
+
+ RE_FreeRenderResult(rr);
+ }
+}
+
+
/* all layers except the active one get temporally pushed away */
static void push_render_result(Render *re)
{
@@ -391,13 +408,18 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list