示例#1
0
bool OSLRenderServices::get_inverse_matrix(OSL::Matrix44 &result, ustring to)
{
    KernelGlobals *kg = kernel_globals;

    if (to == u_ndc) {
        Transform tfm = transform_transpose(kernel_data.cam.worldtondc);
        COPY_MATRIX44(&result, &tfm);
        return true;
    }
    else if (to == u_raster) {
        Transform tfm = transform_transpose(kernel_data.cam.worldtoraster);
        COPY_MATRIX44(&result, &tfm);
        return true;
    }
    else if (to == u_screen) {
        Transform tfm = transform_transpose(kernel_data.cam.worldtoscreen);
        COPY_MATRIX44(&result, &tfm);
        return true;
    }
    else if (to == u_camera) {
        Transform tfm = transform_transpose(kernel_data.cam.worldtocamera);
        COPY_MATRIX44(&result, &tfm);
        return true;
    }

    return false;
}
示例#2
0
bool OSLRenderServices::get_matrix(OSL::Matrix44 &result, ustring from)
{
    KernelGlobals *kg = kernel_globals;

    if (from == u_ndc) {
        Transform tfm = transform_transpose(transform_quick_inverse(kernel_data.cam.worldtondc));
        COPY_MATRIX44(&result, &tfm);
        return true;
    }
    else if (from == u_raster) {
        Transform tfm = transform_transpose(kernel_data.cam.rastertoworld);
        COPY_MATRIX44(&result, &tfm);
        return true;
    }
    else if (from == u_screen) {
        Transform tfm = transform_transpose(kernel_data.cam.screentoworld);
        COPY_MATRIX44(&result, &tfm);
        return true;
    }
    else if (from == u_camera) {
        Transform tfm = transform_transpose(kernel_data.cam.cameratoworld);
        COPY_MATRIX44(&result, &tfm);
        return true;
    }

    return false;
}
示例#3
0
bool OSLRenderServices::get_inverse_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform, float time)
{
    /* this is only used for shader and object space, we don't really have
     * a concept of shader space, so we just use object space for both. */
    if (xform) {
        KernelGlobals *kg = kernel_globals;
        const ShaderData *sd = (const ShaderData *)xform;
        int object = sd->object;

        if (object != ~0) {
#ifdef __OBJECT_MOTION__
            Transform itfm;

            if(time == sd->time)
                itfm = sd->ob_itfm;
            else
                object_fetch_transform_motion_test(kg, object, time, &itfm);
#else
            Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
#endif
            itfm = transform_transpose(itfm);
            COPY_MATRIX44(&result, &itfm);

            return true;
        }
    }

    return false;
}
示例#4
0
static bool set_attribute_matrix(const Transform& tfm, TypeDesc type, void *val)
{
	if(type == TypeDesc::TypeMatrix) {
		Transform transpose = transform_transpose(tfm);
		memcpy(val, &transpose, sizeof(Transform));
		return true;
	}

	return false;
}
示例#5
0
bool OSLRenderServices::get_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform)
{
    /* this is only used for shader and object space, we don't really have
     * a concept of shader space, so we just use object space for both. */
    if (xform) {
        const ShaderData *sd = (const ShaderData *)xform;
        int object = sd->object;

        if (object != ~0) {
#ifdef __OBJECT_MOTION__
            Transform tfm = sd->ob_tfm;
#else
            KernelGlobals *kg = kernel_globals;
            Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
#endif
            tfm = transform_transpose(tfm);
            COPY_MATRIX44(&result, &tfm);

            return true;
        }
    }

    return false;
}