Beispiel #1
0
bool OSLRenderServices::get_object_standard_attribute(KernelGlobals *kg, ShaderData *sd, ustring name,
                                                      TypeDesc type, bool derivatives, void *val)
{
	/* todo: turn this into hash table? */

	/* Object Attributes */
	if(name == u_object_location) {
		float3 f = object_location(kg, sd);
		return set_attribute_float3(f, type, derivatives, val);
	}
	else if(name == u_object_index) {
		float f = object_pass_id(kg, sd->object);
		return set_attribute_float(f, type, derivatives, val);
	}
	else if(name == u_geom_dupli_generated) {
		float3 f = object_dupli_generated(kg, sd->object);
		return set_attribute_float3(f, type, derivatives, val);
	}
	else if(name == u_geom_dupli_uv) {
		float3 f = object_dupli_uv(kg, sd->object);
		return set_attribute_float3(f, type, derivatives, val);
	}
	else if(name == u_material_index) {
		float f = shader_pass_id(kg, sd);
		return set_attribute_float(f, type, derivatives, val);
	}
	else if(name == u_object_random) {
		float f = object_random_number(kg, sd->object);
		return set_attribute_float(f, type, derivatives, val);
	}

	/* Particle Attributes */
	else if(name == u_particle_index) {
		int particle_id = object_particle_id(kg, sd->object);
		float f = particle_index(kg, particle_id);
		return set_attribute_float(f, type, derivatives, val);
	}
	else if(name == u_particle_age) {
		int particle_id = object_particle_id(kg, sd->object);
		float f = particle_age(kg, particle_id);
		return set_attribute_float(f, type, derivatives, val);
	}
	else if(name == u_particle_lifetime) {
		int particle_id = object_particle_id(kg, sd->object);
		float f = particle_lifetime(kg, particle_id);
		return set_attribute_float(f, type, derivatives, val);
	}
	else if(name == u_particle_location) {
		int particle_id = object_particle_id(kg, sd->object);
		float3 f = particle_location(kg, particle_id);
		return set_attribute_float3(f, type, derivatives, val);
	}
#if 0	/* unsupported */
	else if(name == u_particle_rotation) {
		int particle_id = object_particle_id(kg, sd->object);
		float4 f = particle_rotation(kg, particle_id);
		return set_attribute_float4(f, type, derivatives, val);
	}
#endif
	else if(name == u_particle_size) {
		int particle_id = object_particle_id(kg, sd->object);
		float f = particle_size(kg, particle_id);
		return set_attribute_float(f, type, derivatives, val);
	}
	else if(name == u_particle_velocity) {
		int particle_id = object_particle_id(kg, sd->object);
		float3 f = particle_velocity(kg, particle_id);
		return set_attribute_float3(f, type, derivatives, val);
	}
	else if(name == u_particle_angular_velocity) {
		int particle_id = object_particle_id(kg, sd->object);
		float3 f = particle_angular_velocity(kg, particle_id);
		return set_attribute_float3(f, type, derivatives, val);
	}
	
	/* Geometry Attributes */
	else if(name == u_geom_numpolyvertices) {
		return set_attribute_int(3, type, derivatives, val);
	}
	else if((name == u_geom_trianglevertices || name == u_geom_polyvertices)
#ifdef __HAIR__
		     && sd->type & PRIMITIVE_ALL_TRIANGLE)
#else
		)
#endif
	{
		float3 P[3];

		if(sd->type & PRIMITIVE_TRIANGLE)
			triangle_vertices(kg, sd->prim, P);
		else
			motion_triangle_vertices(kg, sd->object, sd->prim, sd->time, P);

		if(!(sd->flag & SD_TRANSFORM_APPLIED)) {
			object_position_transform(kg, sd, &P[0]);
			object_position_transform(kg, sd, &P[1]);
			object_position_transform(kg, sd, &P[2]);
		}

		return set_attribute_float3_3(P, type, derivatives, val);
	}
	else if(name == u_geom_name) {
bool OSLRenderServices::get_object_standard_attribute(KernelGlobals *kg, ShaderData *sd, ustring name,
        TypeDesc type, bool derivatives, void *val)
{
    /* todo: turn this into hash table? */

    /* Object Attributes */
    if (name == u_object_location) {
        float3 f = object_location(kg, sd);
        return set_attribute_float3(f, type, derivatives, val);
    }
    else if (name == u_object_index) {
        float f = object_pass_id(kg, sd->object);
        return set_attribute_float(f, type, derivatives, val);
    }
    else if (name == u_geom_dupli_generated) {
        float3 f = object_dupli_generated(kg, sd->object);
        return set_attribute_float3(f, type, derivatives, val);
    }
    else if (name == u_geom_dupli_uv) {
        float3 f = object_dupli_uv(kg, sd->object);
        return set_attribute_float3(f, type, derivatives, val);
    }
    else if (name == u_material_index) {
        float f = shader_pass_id(kg, sd);
        return set_attribute_float(f, type, derivatives, val);
    }
    else if (name == u_object_random) {
        float f = object_random_number(kg, sd->object);
        return set_attribute_float(f, type, derivatives, val);
    }

    /* Particle Attributes */
    else if (name == u_particle_index) {
        uint particle_id = object_particle_id(kg, sd->object);
        float f = particle_index(kg, particle_id);
        return set_attribute_float(f, type, derivatives, val);
    }
    else if (name == u_particle_age) {
        uint particle_id = object_particle_id(kg, sd->object);
        float f = particle_age(kg, particle_id);
        return set_attribute_float(f, type, derivatives, val);
    }
    else if (name == u_particle_lifetime) {
        uint particle_id = object_particle_id(kg, sd->object);
        float f= particle_lifetime(kg, particle_id);
        return set_attribute_float(f, type, derivatives, val);
    }
    else if (name == u_particle_location) {
        uint particle_id = object_particle_id(kg, sd->object);
        float3 f = particle_location(kg, particle_id);
        return set_attribute_float3(f, type, derivatives, val);
    }
#if 0	/* unsupported */
    else if (name == u_particle_rotation) {
        uint particle_id = object_particle_id(kg, sd->object);
        float4 f = particle_rotation(kg, particle_id);
        return set_attribute_float4(f, type, derivatives, val);
    }
#endif
    else if (name == u_particle_size) {
        uint particle_id = object_particle_id(kg, sd->object);
        float f = particle_size(kg, particle_id);
        return set_attribute_float(f, type, derivatives, val);
    }
    else if (name == u_particle_velocity) {
        uint particle_id = object_particle_id(kg, sd->object);
        float3 f = particle_velocity(kg, particle_id);
        return set_attribute_float3(f, type, derivatives, val);
    }
    else if (name == u_particle_angular_velocity) {
        uint particle_id = object_particle_id(kg, sd->object);
        float3 f = particle_angular_velocity(kg, particle_id);
        return set_attribute_float3(f, type, derivatives, val);
    }

    /* Geometry Attributes */
    else if (name == u_geom_numpolyvertices) {
        return set_attribute_int(3, type, derivatives, val);
    }
    else if ((name == u_geom_trianglevertices || name == u_geom_polyvertices)
#ifdef __HAIR__
             && sd->segment == ~0) {
#else
            ) {
#endif
        float3 P[3];
        triangle_vertices(kg, sd->prim, P);

        if(!(sd->flag & SD_TRANSFORM_APPLIED)) {
            object_position_transform(kg, sd, &P[0]);
            object_position_transform(kg, sd, &P[1]);
            object_position_transform(kg, sd, &P[2]);
        }

        return set_attribute_float3_3(P, type, derivatives, val);
    }
    else if(name == u_geom_name) {
        ustring object_name = kg->osl->object_names[sd->object];
        return set_attribute_string(object_name, type, derivatives, val);
    }

#ifdef __HAIR__
    /* Hair Attributes */
    else if (name == u_is_curve) {
        float f = (sd->segment != ~0);
        return set_attribute_float(f, type, derivatives, val);
    }
    else if (name == u_curve_thickness) {
        float f = curve_thickness(kg, sd);
        return set_attribute_float(f, type, derivatives, val);
    }
    else if (name == u_curve_tangent_normal) {
        float3 f = curve_tangent_normal(kg, sd);
        return set_attribute_float3(f, type, derivatives, val);
    }
#endif
    else
        return false;
}
Beispiel #3
0
void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, PathState *state, int path_flag)
{
	/* setup shader globals from shader data */
	OSLThreadData *tdata = kg->osl_tdata;
	shaderdata_to_shaderglobals(kg, sd, state, path_flag, tdata);

	/* execute shader for this point */
	OSL::ShadingSystem *ss = (OSL::ShadingSystem*)kg->osl_ss;
	OSL::ShaderGlobals *globals = &tdata->globals;
	OSL::ShadingContext *octx = tdata->context;
	int shader = sd->shader & SHADER_MASK;

	/* automatic bump shader */
	if(kg->osl->bump_state[shader]) {
		/* save state */
		float3 P = sd->P;
		float3 dPdx = sd->dP.dx;
		float3 dPdy = sd->dP.dy;

		/* set state as if undisplaced */
		if(sd->flag & SD_HAS_DISPLACEMENT) {
			float data[9];
			bool found = kg->osl->services->get_attribute(sd, true, OSLRenderServices::u_empty, TypeDesc::TypeVector,
			                                              OSLRenderServices::u_geom_undisplaced, data);
			(void)found;
			assert(found);

			memcpy(&sd->P, data, sizeof(float)*3);
			memcpy(&sd->dP.dx, data+3, sizeof(float)*3);
			memcpy(&sd->dP.dy, data+6, sizeof(float)*3);

			object_position_transform(kg, sd, &sd->P);
			object_dir_transform(kg, sd, &sd->dP.dx);
			object_dir_transform(kg, sd, &sd->dP.dy);

			globals->P = TO_VEC3(sd->P);
			globals->dPdx = TO_VEC3(sd->dP.dx);
			globals->dPdy = TO_VEC3(sd->dP.dy);
		}

		/* execute bump shader */
		ss->execute(octx, *(kg->osl->bump_state[shader]), *globals);

		/* reset state */
		sd->P = P;
		sd->dP.dx = dPdx;
		sd->dP.dy = dPdy;

		globals->P = TO_VEC3(P);
		globals->dPdx = TO_VEC3(dPdx);
		globals->dPdy = TO_VEC3(dPdy);
	}

	/* surface shader */
	if(kg->osl->surface_state[shader]) {
		ss->execute(octx, *(kg->osl->surface_state[shader]), *globals);
	}

	/* flatten closure tree */
	if(globals->Ci)
		flatten_surface_closure_tree(sd, path_flag, globals->Ci);
}