Cycles:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 15 Oct 2011 23:49:01 +0000 (23:49 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 15 Oct 2011 23:49:01 +0000 (23:49 +0000)
* Sun, area and point lights with size now supported
* Cast shadow option to disable shadow casting for lamps
* Emission strength of materials tweaked such that setting strength to 1.0
  basically makes the material "shadeless" in that the value of the color
  input will be the resulting color in the image.

intern/cycles/blender/addon/ui.py
intern/cycles/blender/blender_object.cpp
intern/cycles/kernel/kernel_emission.h
intern/cycles/kernel/kernel_light.h
intern/cycles/kernel/osl/emissive.cpp
intern/cycles/kernel/svm/emissive.h
source/blender/blenkernel/BKE_blender.h
source/blender/blenloader/intern/readfile.c
source/blender/editors/space_node/node_edit.c
source/blender/nodes/shader/nodes/node_shader_emission.c

index 6f31732aa1f11fc0c54defe04ae261265cf1642e..d8f776b0114e823007bfa75b15210e407a3586ed 100644 (file)
@@ -366,8 +366,7 @@ class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
 
     @classmethod
     def poll(cls, context):
-        return False
-        #return context.lamp and CyclesButtonsPanel.poll(context)
+        return context.lamp and CyclesButtonsPanel.poll(context)
 
     def draw(self, context):
         layout = self.layout
@@ -505,17 +504,13 @@ class CyclesMaterial_PT_settings(CyclesButtonsPanel, Panel):
         mat = context.material
         cmat = mat.cycles
 
-        layout.prop(mat, "diffuse_color", text="Viewport Color")
-
-        """
         split = layout.split()
-    
+
         col = split.column()
-        col.prop(cmat, "sample_as_light")
+        col.prop(mat, "diffuse_color", text="Viewport Color")
 
         col = split.column()
-        col.prop(cmat, "homogeneous_volume")
-        """
+        col.prop(cmat, "sample_as_light")
 
 class CyclesTexture_PT_context(CyclesButtonsPanel, Panel):
     bl_label = ""
index de41484975d399200834c0a869bc33bb40513a22..1095a3ee0264eb62d9a0e1573881fe8c91159ef3 100644 (file)
@@ -91,14 +91,11 @@ void BlenderSync::sync_light(BL::Object b_parent, int b_index, BL::Object b_ob,
        BL::Lamp b_lamp(b_ob.data());
 
        /* type */
-#if 0
        switch(b_lamp.type()) {
                case BL::Lamp::type_POINT: {
                        BL::PointLamp b_point_lamp(b_lamp);
                        light->size = b_point_lamp.shadow_soft_size();
-#endif
                        light->type = LIGHT_POINT;
-#if 0
                        break;
                }
                case BL::Lamp::type_SPOT: {
@@ -132,11 +129,10 @@ void BlenderSync::sync_light(BL::Object b_parent, int b_index, BL::Object b_ob,
                        break;
                }
        }
-#endif
 
-       /* location */
+       /* location and (inverted!) direction */
        light->co = make_float3(tfm.x.w, tfm.y.w, tfm.z.w);
-       light->dir = make_float3(tfm.x.z, tfm.y.z, tfm.z.z);
+       light->dir = -make_float3(tfm.x.z, tfm.y.z, tfm.z.z);
 
        /* shader */
        vector<uint> used_shaders;
@@ -149,8 +145,8 @@ void BlenderSync::sync_light(BL::Object b_parent, int b_index, BL::Object b_ob,
        light->shader = used_shaders[0];
 
        /* shadow */
-       //PointerRNA clamp = RNA_pointer_get(&b_lamp.ptr, "cycles");
-       //light->cast_shadow = get_boolean(clamp, "cast_shadow");
+       PointerRNA clamp = RNA_pointer_get(&b_lamp.ptr, "cycles");
+       light->cast_shadow = get_boolean(clamp, "cast_shadow");
 
        /* tag */
        light->tag_update(scene);
index 13c48464088836082753b5be2e8d29e1f913fcff..22970f66669ea453baa50c90deaef8b24c9fc1dc 100644 (file)
@@ -88,14 +88,11 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
                float mis_weight = power_heuristic(pdf, bsdf_pdf);
                *eval *= mis_weight;
        }
-       else if(!(ls.shader & SHADER_AREA_LIGHT)) {
-               /* ensure point light works in Watts, this should be handled
-                * elsewhere but for now together with the diffuse emission
-                * closure it works out to the right value */
-               *eval *= 0.25f;
-
-               /* XXX verify with other light types */
-       }
+       /* todo: clean up these weights */
+       else if(ls.shader & SHADER_AREA_LIGHT)
+               *eval *= 0.25f; /* area lamp */
+       else if(ls.t != FLT_MAX)
+               *eval *= 0.25f*M_1_PI_F; /* point lamp */
 
        if(ls.shader & SHADER_CAST_SHADOW) {
                /* setup ray */
index 68d08a2655f2eb97a66eb0405f5feae5c93b271d..d5d47b28d59858b2b718b38b05fdfab5f1da9e16 100644 (file)
@@ -75,8 +75,8 @@ __device void regular_light_sample(KernelGlobals *kg, int point,
                        D = distant_light_sample(D, size, randu, randv);
 
                ls->P = D;
-               ls->Ng = -D;
-               ls->D = D;
+               ls->Ng = D;
+               ls->D = -D;
                ls->t = FLT_MAX;
        }
        else {
@@ -120,9 +120,9 @@ __device float regular_light_pdf(KernelGlobals *kg,
        if(t == FLT_MAX)
                return pdf;
 
-       float cos_pi = fabsf(dot(Ng, I));
+       float cos_pi = dot(Ng, I);
 
-       if(cos_pi == 0.0f)
+       if(cos_pi <= 0.0f)
                return 0.0f;
 
        return t*t*pdf/cos_pi;
index 28d3c73e59b934930e6983193014a53681e4dfa0..2d2d6e1fdde2a47aba84216d264e86d1294e2a18 100644 (file)
@@ -64,7 +64,7 @@ public:
     Color3 eval (const Vec3 &Ng, const Vec3 &omega_out) const
     {
         float cosNO = fabsf(Ng.dot(omega_out));
-        float res = cosNO > 0 ? 1.0f / float(M_PI) : 0.0f;
+        float res = cosNO > 0 ? 1.0f: 0.0f;
         return Color3(res, res, res);
     }
 
@@ -91,7 +91,7 @@ public:
                const Vec3 &omega_out) const
     {
         float cosNO = Ng.dot(omega_out);
-        return cosNO > 0 ? 1.0f / float(M_PI) : 0.0f;
+        return cosNO > 0 ? 1.0f: 0.0f;
     }
 };
 
index 8bd31751fb3cae18dccf577e4a8bbc2dcf3ac8f3..e3f99e9b729ba639c7ee1742363a294afcb40267 100644 (file)
@@ -37,7 +37,7 @@ CCL_NAMESPACE_BEGIN
 __device float3 emissive_eval(const float3 Ng, const float3 I)
 {
        float cosNO = fabsf(dot(Ng, I));
-       float res = (cosNO > 0.0f)? M_1_PI_F: 0.0f;
+       float res = (cosNO > 0.0f)? 1.0f: 0.0f;
        
        return make_float3(res, res, res);
 }
@@ -48,7 +48,7 @@ __device float3 emissive_eval(const float3 Ng, const float3 I)
 __device float emissive_pdf(const float3 Ng, const float3 I)
 {
        float cosNO = fabsf(dot(Ng, I));
-       return (cosNO > 0.0f)? M_1_PI_F: 0.0f;
+       return (cosNO > 0.0f)? 1.0f: 0.0f;
 }
 
 __device float3 svm_emissive_eval(ShaderData *sd, ShaderClosure *sc)
index f6910fede8ec5c1b6cd3205de49dddbed296563c..34a9321284d4f79e7d3ac889bede260bb6c34634 100644 (file)
@@ -44,7 +44,7 @@ extern "C" {
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION                        259
-#define BLENDER_SUBVERSION             4
+#define BLENDER_SUBVERSION             5
 
 #define BLENDER_MINVERSION             250
 #define BLENDER_MINSUBVERSION  0
index 1ed23361581e5b556f000ec61ac4d92a16da6ec3..fb1beec1cbfc62983d242de9b689196bde021f39 100644 (file)
@@ -2057,6 +2057,30 @@ static void lib_link_nodetree(FileData *fd, Main *main)
        }
 }
 
+static void ntree_tmp_cycles_emission_version_patch(FileData *fd, Library *lib, bNodeTree *ntree)
+{
+       bNode *node;
+       bNodeSocket *sock;
+       bNodeSocketValueFloat *valfloat;
+
+       for(node=ntree->nodes.first; node; node=node->next) {
+               if(node->type == SH_NODE_EMISSION) {
+                       for(sock=node->inputs.first; sock; sock=sock->next) {
+                               if(strcmp(sock->name, "Strength") == 0) {
+                                       valfloat= sock->default_value;
+                                       valfloat->value /= M_PI;
+                               }
+                       }
+               }
+               else if(node->type == NODE_GROUP) {
+                       bNodeTree *ntree= newlibadr(fd, lib, node->id);
+
+                       if(ntree)
+                               ntree_tmp_cycles_emission_version_patch(fd, lib, ntree);
+               }
+       }
+}
+
 static void ntree_tmp_cycles_version_patch(bNodeTree *ntree)
 {
        bNode *node;
@@ -12296,6 +12320,31 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
 
        }
 
+       if(main->versionfile < 259 || (main->versionfile == 259 && main->subversionfile < 5)) {
+               Scene *sce;
+               Base *base;
+               Material *ma;
+
+               /* compatibility tweak */
+               for(sce = main->scene.first; sce; sce = sce->id.next) {
+                       if(strcmp(sce->r.engine, "CYCLES") == 0) {
+                               for(base = sce->base.first; base; base=base->next) {
+                                       Object *ob= newlibadr(fd, lib, base->object);
+
+                                       if(ob && ob->type == OB_LAMP) {
+                                               Lamp *la= newlibadr(fd, lib, ob->data);
+                                               if(la)
+                                                       la->area_size= 0.0f;
+                                       }
+                               }
+                       }
+               }
+
+               for(ma = main->mat.first; ma; ma= ma->id.next)
+                       if(ma->nodetree)
+                               ntree_tmp_cycles_emission_version_patch(fd, lib, ma->nodetree);
+       }
+
        /* put compatibility code here until next subversion bump */
        {
        }
index 2b0ce72376fd695bfc6905ee1854fe8ea5bd72ff..82b3da675ba5f7bde3cf1d31125c0685f57fff2d 100644 (file)
@@ -331,6 +331,16 @@ void ED_node_shader_default(Scene *scene, ID *id)
        fromsock= in->outputs.first;
        tosock= out->inputs.first;
        nodeAddLink(ntree, in, fromsock, out, tosock);
+
+       if(GS(id->name) == ID_LA) {
+               Lamp *la= (Lamp*)id;
+
+               if(la->type == LA_LOCAL || la->type == LA_SPOT || la->type == LA_AREA) {
+                       bNodeSocket *sock= in->inputs.last;
+                       bNodeSocketValueFloat *default_value= sock->default_value;
+                       default_value->value= 100.0f;
+               }
+       }
        
        ntreeUpdateTree(ntree);
 }
index 32e17d772d7aa9c2af4d31d49d6f2d40b6894ad2..78644d5317dbe672972b4a534cd53cb7ecc5661b 100644 (file)
@@ -33,7 +33,7 @@
 
 static bNodeSocketTemplate sh_node_emission_in[]= {
        {       SOCK_RGBA, 1, "Color",          0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
-       {       SOCK_FLOAT, 1, "Strength",      30.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000000.0f},
+       {       SOCK_FLOAT, 1, "Strength",      1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000000.0f},
        {       -1, 0, ""       }
 };