* 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.
This commit is contained in:
Brecht Van Lommel 2011-10-15 23:49:01 +00:00
parent d293d74942
commit d5b679253a
10 changed files with 83 additions and 36 deletions

View 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,18 +504,14 @@ 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(mat, "diffuse_color", text="Viewport Color")
col = split.column()
col.prop(cmat, "sample_as_light")
col = split.column()
col.prop(cmat, "homogeneous_volume")
"""
class CyclesTexture_PT_context(CyclesButtonsPanel, Panel):
bl_label = ""
bl_context = "texture"

View 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);

View 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 */

View 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;

View 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;
}
};

View 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)

View 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

View 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 */
{
}

View 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);
}

View 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, "" }
};