Revision: 26611
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26611
Author:   blendix
Date:     2010-02-04 21:48:35 +0100 (Thu, 04 Feb 2010)

Log Message:
-----------
Render Branch: stupid path tracer I'm using for consistency testing,
only does environment lighting + diffuse at the moment, don't expect
this to make it into trunk.

Modified Paths:
--------------
    branches/render25/release/scripts/ui/properties_render.py
    branches/render25/source/blender/makesdna/DNA_scene_types.h
    branches/render25/source/blender/makesrna/intern/rna_scene.c
    branches/render25/source/blender/render/intern/include/rendercore.h
    branches/render25/source/blender/render/intern/source/pipeline.c

Added Paths:
-----------
    branches/render25/source/blender/render/intern/source/path.c

Modified: branches/render25/release/scripts/ui/properties_render.py
===================================================================
--- branches/render25/release/scripts/ui/properties_render.py   2010-02-04 
20:41:49 UTC (rev 26610)
+++ branches/render25/release/scripts/ui/properties_render.py   2010-02-04 
20:48:35 UTC (rev 26611)
@@ -60,7 +60,10 @@
         col.operator("screen.render", text="Animation", 
icon='RENDER_ANIMATION').animation = True
 
         layout.prop(rd, "display_mode", text="Display")
+        layout.prop(rd, "integrator")
 
+        if rd.integrator == 'PATH_TRACER':
+            layout.prop(rd, "path_samples")
 
 class RENDER_PT_layers(RenderButtonsPanel):
     bl_label = "Layers"

Modified: branches/render25/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/render25/source/blender/makesdna/DNA_scene_types.h 2010-02-04 
20:41:49 UTC (rev 26610)
+++ branches/render25/source/blender/makesdna/DNA_scene_types.h 2010-02-04 
20:48:35 UTC (rev 26611)
@@ -379,6 +379,10 @@
        float pad2;                     //  XXX deprecated since 2.5
        struct Text *dometext;  //  XXX deprecated since 2.5
 
+       /* path tracing */
+       int integrator;
+       int path_samples;
+
        /* render engine */
        char engine[32];
 } RenderData;
@@ -966,6 +970,10 @@
 #define R_BAKE_SPACE_OBJECT     2
 #define R_BAKE_SPACE_TANGENT 3
 
+/* r->integrator */
+#define R_INTEGRATOR_RASTERIZER        0
+#define R_INTEGRATOR_PATHTRACER        1
+
 /* **************** SCENE ********************* */
 
 /* for general use */

Modified: branches/render25/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- branches/render25/source/blender/makesrna/intern/rna_scene.c        
2010-02-04 20:41:49 UTC (rev 26610)
+++ branches/render25/source/blender/makesrna/intern/rna_scene.c        
2010-02-04 20:48:35 UTC (rev 26611)
@@ -1753,6 +1753,11 @@
                {0, "BLENDER_RENDER", 0, "Blender Render", ""},
                {0, NULL, 0, NULL, NULL}};
 
+       static EnumPropertyItem integrator_items[] = {
+               {R_INTEGRATOR_RASTERIZER, "RASTERIZER", 0, "Rasterizer", ""},
+               {R_INTEGRATOR_PATHTRACER, "PATH_TRACER", 0, "Path Tracer", ""},
+               {0, NULL, 0, NULL, NULL}};
+
        srna= RNA_def_struct(brna, "SceneRenderData", NULL);
        RNA_def_struct_sdna(srna, "RenderData");
        RNA_def_struct_nested(brna, srna, "Scene");
@@ -2442,6 +2447,17 @@
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Use Game Engine", "Current rendering 
engine is a game engine.");
 
+       /* path */
+       prop= RNA_def_property(srna, "integrator", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_items(prop, integrator_items);
+       RNA_def_property_ui_text(prop, "Integrator", "Integrator to use for 
rendering.");
+       RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+       prop= RNA_def_property(srna, "path_samples", PROP_INT, PROP_UNSIGNED);
+       RNA_def_property_range(prop, 1, INT_MAX);
+       RNA_def_property_ui_text(prop, "Path Samples", "Number of samples to 
use for path tracer.");
+       RNA_def_property_update(prop, NC_WINDOW, NULL);
+
        /* simplify */
        prop= RNA_def_property(srna, "use_simplify", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SIMPLIFY);

Modified: branches/render25/source/blender/render/intern/include/rendercore.h
===================================================================
--- branches/render25/source/blender/render/intern/include/rendercore.h 
2010-02-04 20:41:49 UTC (rev 26610)
+++ branches/render25/source/blender/render/intern/include/rendercore.h 
2010-02-04 20:48:35 UTC (rev 26611)
@@ -37,6 +37,7 @@
 
 void render_rasterize_part(struct Render *re, struct RenderPart *pa);
 void render_sss_bake_part(struct Render *re, struct RenderPart *pa);
+void render_path_trace_part(struct Render *re, struct RenderPart *pa);
 
 /* Rasterization Per Pixel Structs */
 

Added: branches/render25/source/blender/render/intern/source/path.c
===================================================================
--- branches/render25/source/blender/render/intern/source/path.c                
                (rev 0)
+++ branches/render25/source/blender/render/intern/source/path.c        
2010-02-04 20:48:35 UTC (rev 26611)
@@ -0,0 +1,259 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "DNA_material_types.h"
+
+#include "BKE_utildefines.h"
+
+#include "BLI_math.h"
+#include "BLI_rand.h"
+
+#include "RE_raytrace.h"
+
+#include "camera.h"
+#include "database.h"
+#include "environment.h"
+#include "material.h"
+#include "object_mesh.h"
+#include "part.h"
+#include "render_types.h"
+#include "rendercore.h"
+#include "sampler.h"
+#include "shading.h"
+
+typedef struct Hit {
+       ObjectInstanceRen *obi;
+       VlakRen *vlr;
+       float co[3];
+       float vec[3];
+       float n[3];
+       float u, v;
+} Hit;
+
+static void shadeinput_from_hit(Render *re, RenderLayer *rl, ShadeInput *shi, 
Hit *hit, float view[3])
+{
+       memset(shi, 0, sizeof(ShadeInput));
+
+       copy_v3_v3(shi->geometry.view, view);
+       copy_v3_v3(shi->geometry.co, hit->co);
+
+       shi->material.mat_override= rl->mat_override;
+       shi->material.mat= hit->vlr->mat;
+       shade_input_init_material(re, shi);
+       shade_input_set_triangle_i(re, shi, hit->obi, hit->vlr, 0, 1, 2);
+
+       shi->geometry.u= hit->u;
+       shi->geometry.v= hit->v;
+       shi->geometry.dx_u= shi->geometry.dx_v= shi->geometry.dy_u= 
shi->geometry.dy_v= 0.0f;
+
+       /*shade_input_set_normals(shi);*/
+       shade_input_set_shade_texco(re, shi);
+       copy_v3_v3(shi->geometry.vn, hit->n);
+
+       if(dot_v3v3(shi->geometry.facenor, shi->geometry.view) > 0.0f)
+               shade_input_flip_normals(shi);
+}
+
+static int isec_trace_ray(Render *re, Hit *from, Hit *to, int depth)
+{
+       Isect isec;
+
+       memset(&isec, 0, sizeof(isec));
+
+       copy_v3_v3(isec.start, from->co);
+       mul_v3_v3fl(isec.vec, from->vec, 100.0f);
+       isec.labda= 1.0f;
+
+       isec.mode= RE_RAY_MIRROR;
+       isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_RENDER_CHECK;
+
+       isec.orig.ob = from->obi;
+       isec.orig.face = from->vlr;
+
+       isec.lay= -1;
+
+       if(!RE_rayobject_raycast(re->db.raytree, &isec))
+               return 0;
+       
+       to->obi= isec.hit.ob;
+       to->vlr= isec.hit.face;
+       to->u= isec.u;
+       to->v= isec.v;
+
+       madd_v3_v3v3fl(to->co, isec.start, isec.vec, isec.labda);
+       copy_v3_v3(to->n, to->vlr->n);
+       mul_v3_fl(to->n, -1.0f);
+
+       return 1;
+}
+
+static void integrate_path(Render *re, RenderLayer *rl, int thread, Hit *from, 
float sample[3], int depth, float hemi[2])
+{
+       Hit to;
+       ShadeInput shi;
+       float bsdf[3], nsample[3], view[3], probability, basis[3][3], r[2];
+
+       if(isec_trace_ray(re, from, &to, depth)) {
+               copy_v3_v3(view, from->vec);
+               negate_v3(view);
+
+               shadeinput_from_hit(re, rl, &shi, &to, view);
+
+               mat_shading_begin(re, &shi, &shi.material);
+
+               /* generate new ray */
+               if(!hemi) {
+                       r[0]= BLI_thread_frand(thread);
+                       r[1]= BLI_thread_frand(thread);
+               }
+               else
+                       copy_v2_v2(r, hemi);
+
+               sample_project_hemi_cosine_weighted(to.vec, r);
+
+               copy_v3_v3(basis[2], shi.geometry.vn);
+               ortho_basis_v3v3_v3(basis[0], basis[1], shi.geometry.vn);
+               mul_m3_v3(basis, to.vec);
+
+               /* sample emit & bsdf */
+               mat_emit(sample, &shi.material, &shi.geometry, 
shi.shading.thread);
+               mat_bsdf_f(bsdf, &shi.material, &shi.geometry, 
shi.shading.thread, to.vec, BSDF_DIFFUSE);
+
+               mat_shading_end(re, &shi.material);
+
+               if(!is_zero_v3(bsdf)) {
+                       /* russian roulette */
+                       //probability= (bsdf[0] + bsdf[1] + bsdf[2])/3.0f;
+                       //probability= CLAMPIS(probability, 0.0f, 0.9f);
+                       probability= (depth > 0)? 0.9f: 1.0f;
+
+                       if(probability == 1.0f || BLI_thread_frand(thread) < 
probability) {
+                               /* keep going */
+                               integrate_path(re, rl, thread, &to, nsample, 
depth+1, NULL);
+
+                               /* bsdf & correction for russian roulette */
+                               nsample[0]= bsdf[0]*nsample[0];
+                               nsample[1]= bsdf[1]*nsample[1];
+                               nsample[2]= bsdf[2]*nsample[2];
+                               mul_v3_fl(nsample, 
(float)M_PI/(probability*dot_v3v3(to.vec, shi.geometry.vn)));
+
+                               /* accumulate */
+                               add_v3_v3v3(sample, sample, nsample);
+                       }
+                       else
+                               ; /* path terminated */
+               }
+       }
+       else {
+               /* no hit, sample environment */
+               environment_shade(re, sample, NULL, from->vec, NULL, thread);
+       }
+}
+
+static void integrate_pixel(Render *re, RenderLayer *rl, int thread, int x, 
int y, float color[3])
+{
+       Hit from;
+       QMCSampler *qsa, *qsa2;
+       float accum[3], sample[3], raster[2], hemi[2];
+       int a, tot_samples = re->params.r.path_samples;
+
+       accum[0]= accum[1]= accum[2]= 0.0f;
+
+       qsa = sampler_acquire(re, thread, SAMP_TYPE_HAMMERSLEY, tot_samples);
+       qsa2 = sampler_acquire(re, thread, SAMP_TYPE_HAMMERSLEY, tot_samples);
+
+       for(a=0; a<tot_samples; a++) {
+               /* random raster location */
+               sampler_get_float_2d(raster, qsa, a);
+               raster[0] += x;
+               raster[1] += y;
+
+               /* raster to ray */
+               memset(&from, 0, sizeof(from));
+               camera_raster_to_ray(&re->cam, from.co, from.vec, raster[0], 
raster[1]);
+
+               /* integrate path */
+               sampler_get_float_2d(hemi, qsa2, a);
+               integrate_path(re, rl, thread, &from, sample, 0, hemi);
+
+               add_v3_v3v3(accum, accum, sample);
+       }
+
+       mul_v3_fl(accum, 1.0f/re->params.r.path_samples);
+       copy_v3_v3(color, accum);
+
+       sampler_release(re, qsa);
+       sampler_release(re, qsa2);
+}
+
+void render_path_trace_part(Render *re, RenderPart *pa)
+{
+       RenderResult *rr= pa->result;
+       RenderLayer *rl= rr->layers.first;
+       float sample[3], *fp;
+       int x, y, seed=0, offs=0, crop= 0;
+
+       if(re->cb.test_break(re->cb.tbh)) return; 
+       if(!re->db.raytree) return;
+
+       /* filtered render, for now we assume only 1 filter size */
+       if(pa->crop) {
+               crop= 1;
+               offs= pa->rectx + 1;
+       }
+       
+       /* initialize scanline updates for main thread,
+          scanline updates have to be 2 lines behind for crop */
+       rr->renrect.ymin= 0;

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to