Exemplo n.º 1
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;
}
Exemplo n.º 2
0
bool OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg,
                                           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) {
    const ShaderData *sd = (const ShaderData *)xform;
    KernelGlobals *kg = sd->osl_globals;
    int object = sd->object;

    if (object != OBJECT_NONE) {
#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
      copy_matrix(result, itfm);

      return true;
    }
    else if (sd->type == PRIMITIVE_LAMP) {
      copy_matrix(result, sd->ob_itfm);

      return true;
    }
  }

  return false;
}