本文整理汇总了C++中PointLight::light_vector方法的典型用法代码示例。如果您正苦于以下问题:C++ PointLight::light_vector方法的具体用法?C++ PointLight::light_vector怎么用?C++ PointLight::light_vector使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类PointLight
的用法示例。
在下文中一共展示了PointLight::light_vector方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: render
int FilterSpecularLighting::render(FilterSlot &slot, FilterUnits const &units) {
NRPixBlock *in = slot.get(_input);
if (!in) {
g_warning("Missing source image for feSpecularLighting (in=%d)", _input);
return 1;
}
NRPixBlock *out = new NRPixBlock;
//Fvector *L = NULL; //vector to the light
int w = in->area.x1 - in->area.x0;
int h = in->area.y1 - in->area.y0;
int x0 = in->area.x0;
int y0 = in->area.y0;
int i, j;
//As long as FilterRes and kernel unit is not supported we hardcode the
//default value
int dx = 1; //TODO setup
int dy = 1; //TODO setup
//surface scale
Geom::Matrix trans = units.get_matrix_primitiveunits2pb();
gdouble ss = surfaceScale * trans[0];
gdouble ks = specularConstant; //diffuse lighting constant
NR::Fvector L, N, LC, H;
gdouble inter;
nr_pixblock_setup_fast(out, NR_PIXBLOCK_MODE_R8G8B8A8N,
in->area.x0, in->area.y0, in->area.x1, in->area.y1,
true);
unsigned char *data_i = NR_PIXBLOCK_PX (in);
unsigned char *data_o = NR_PIXBLOCK_PX (out);
//No light, nothing to do
switch (light_type) {
case DISTANT_LIGHT:
//the light vector is constant
{
DistantLight *dl = new DistantLight(light.distant, lighting_color);
dl->light_vector(L);
dl->light_components(LC);
NR::normalized_sum(H, L, NR::EYE_VECTOR);
//finish the work
for (i = 0, j = 0; i < w*h; i++) {
NR::compute_surface_normal(N, ss, in, i / w, i % w, dx, dy);
COMPUTE_INTER(inter, N, H, ks, specularExponent);
data_o[j++] = CLAMP_D_TO_U8(inter * LC[LIGHT_RED]); // CLAMP includes rounding!
data_o[j++] = CLAMP_D_TO_U8(inter * LC[LIGHT_GREEN]);
data_o[j++] = CLAMP_D_TO_U8(inter * LC[LIGHT_BLUE]);
data_o[j] = MAX(MAX(data_o[j-3], data_o[j-2]), data_o[j-1]);
++j;
}
out->empty = FALSE;
delete dl;
}
break;
case POINT_LIGHT:
{
PointLight *pl = new PointLight(light.point, lighting_color, trans);
pl->light_components(LC);
//TODO we need a reference to the filter to determine primitiveUnits
//if objectBoundingBox is used, use a different matrix for light_vector
// UPDATE: trans is now correct matrix from primitiveUnits to
// pixblock coordinates
//finish the work
for (i = 0, j = 0; i < w*h; i++) {
NR::compute_surface_normal(N, ss, in, i / w, i % w, dx, dy);
pl->light_vector(L,
i % w + x0,
i / w + y0,
ss * (double) data_i[4*i+3]/ 255);
NR::normalized_sum(H, L, NR::EYE_VECTOR);
COMPUTE_INTER(inter, N, H, ks, specularExponent);
data_o[j++] = CLAMP_D_TO_U8(inter * LC[LIGHT_RED]);
data_o[j++] = CLAMP_D_TO_U8(inter * LC[LIGHT_GREEN]);
data_o[j++] = CLAMP_D_TO_U8(inter * LC[LIGHT_BLUE]);
data_o[j] = MAX(MAX(data_o[j-3], data_o[j-2]), data_o[j-1]);
++j;
}
out->empty = FALSE;
delete pl;
}
break;
case SPOT_LIGHT:
{
SpotLight *sl = new SpotLight(light.spot, lighting_color, trans);
//TODO we need a reference to the filter to determine primitiveUnits
//if objectBoundingBox is used, use a different matrix for light_vector
// UPDATE: trans is now correct matrix from primitiveUnits to
// pixblock coordinates
//finish the work
for (i = 0, j = 0; i < w*h; i++) {
NR::compute_surface_normal(N, ss, in, i / w, i % w, dx, dy);
sl->light_vector(L,
i % w + x0,
i / w + y0,
ss * (double) data_i[4*i+3]/ 255);
sl->light_components(LC, L);
NR::normalized_sum(H, L, NR::EYE_VECTOR);
//.........这里部分代码省略.........