static void bake_set_shade_input(ObjectInstanceRen *obi, VlakRen *vlr, ShadeInput *shi, int quad, int UNUSED(isect), int x, int y, float u, float v) { if (quad) shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3); else shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2); /* cache for shadow */ shi->samplenr = R.shadowsamplenr[shi->thread]++; shi->mask = 0xFFFF; /* all samples */ shi->u = -u; shi->v = -v; shi->xs = x; shi->ys = y; shade_input_set_uv(shi); shade_input_set_normals(shi); /* no normal flip */ if (shi->flippednor) shade_input_flip_normals(shi); /* set up view vector to look right at the surface (note that the normal * is negated in the renderer so it does not need to be done here) */ shi->view[0] = shi->vn[0]; shi->view[1] = shi->vn[1]; shi->view[2] = shi->vn[2]; }
static void occ_shade(ShadeSample *ssamp, ObjectInstanceRen *obi, VlakRen *vlr, float *rad) { ShadeInput *shi = ssamp->shi; ShadeResult *shr = ssamp->shr; float l, u, v, *v1, *v2, *v3; /* init */ if (vlr->v4) { shi->u = u = 0.5f; shi->v = v = 0.5f; } else { shi->u = u = 1.0f / 3.0f; shi->v = v = 1.0f / 3.0f; } /* setup render coordinates */ v1 = vlr->v1->co; v2 = vlr->v2->co; v3 = vlr->v3->co; /* renderco */ l = 1.0f - u - v; shi->co[0] = l * v3[0] + u * v1[0] + v * v2[0]; shi->co[1] = l * v3[1] + u * v1[1] + v * v2[1]; shi->co[2] = l * v3[2] + u * v1[2] + v * v2[2]; shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2); /* set up view vector */ copy_v3_v3(shi->view, shi->co); normalize_v3(shi->view); /* cache for shadow */ shi->samplenr++; shi->xs = 0; /* TODO */ shi->ys = 0; shade_input_set_normals(shi); /* no normal flip */ if (shi->flippednor) shade_input_flip_normals(shi); madd_v3_v3fl(shi->co, shi->facenor, -0.0001f); /* ugly.. */ /* not a pretty solution, but fixes common cases */ if (shi->obr->ob && shi->obr->ob->transflag & OB_NEG_SCALE) { negate_v3(shi->vn); negate_v3(shi->vno); negate_v3(shi->nmapnorm); } /* init material vars */ shade_input_init_material(shi); /* render */ shade_input_set_shade_texco(shi); if (shi->mat->nodetree && shi->mat->use_nodes) { ntreeShaderExecTree(shi->mat->nodetree, shi, shr); shi->mat = vlr->mat; /* shi->mat is being set in nodetree */ } else { shade_material_loop(shi, shr); } copy_v3_v3(rad, shr->combined); }
static void occ_shade(ShadeSample *ssamp, ObjectInstanceRen *obi, VlakRen *vlr, float *rad) { ShadeInput *shi= ssamp->shi; ShadeResult *shr= ssamp->shr; float l, u, v, *v1, *v2, *v3; /* init */ if(vlr->v4) { shi->u= u= 0.5f; shi->v= v= 0.5f; } else { shi->u= u= 1.0f/3.0f; shi->v= v= 1.0f/3.0f; } /* setup render coordinates */ v1= vlr->v1->co; v2= vlr->v2->co; v3= vlr->v3->co; /* renderco */ l= 1.0f-u-v; shi->co[0]= l*v3[0]+u*v1[0]+v*v2[0]; shi->co[1]= l*v3[1]+u*v1[1]+v*v2[1]; shi->co[2]= l*v3[2]+u*v1[2]+v*v2[2]; shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2); /* set up view vector */ copy_v3_v3(shi->view, shi->co); normalize_v3(shi->view); /* cache for shadow */ shi->samplenr++; shi->xs= 0; // TODO shi->ys= 0; shade_input_set_normals(shi); /* no normal flip */ if(shi->flippednor) shade_input_flip_normals(shi); madd_v3_v3fl(shi->co, shi->vn, 0.0001f); /* ugly.. */ /* not a pretty solution, but fixes common cases */ if(shi->obr->ob && shi->obr->ob->transflag & OB_NEG_SCALE) { negate_v3(shi->vn); negate_v3(shi->vno); negate_v3(shi->nmapnorm); } /* init material vars */ // note, keep this synced with render_types.h memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); shi->har= shi->mat->har; /* render */ shade_input_set_shade_texco(shi); shade_material_loop(shi, shr); /* todo: nodes */ copy_v3_v3(rad, shr->combined); }