Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
0

compositing an image into the layer with rotation?

Contributor ,
Nov 15, 2015 Nov 15, 2015

plugin newbie,

looking for information about copying an image (a relatively small layer, selected in a  menu)

into my effected layer, with rotation.

currently using :

WorldTransformSuite1()->composite_rect (

to do my copy, but I do not see anything about a transform matrix or a way to transform the world prior to doing the copy (with any of the different macros I found.)

what am I missing?

thnx,

-td

TOPICS
SDK
780
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 15, 2015 Nov 15, 2015

transform_world()

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Nov 15, 2015 Nov 15, 2015

ok... I like that. straight forward. Thanks.

I do have a question or two about that though:

1. I've been staring at the documentation for transform_world() for a while, and it says :

The matrices pointer points to a matrix array used for motion-blur.

there's only 1 reference to a matrix. the documentation seems to be saying that the matrix is strictly used for information regarding motion blur. this is untrue?

2. the only example that Adobe ships that uses transform_world, sadly does not rotate the image. Could you point out an example somewhere?  Thanks.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Nov 15, 2015 Nov 15, 2015

Hi,

1.Use an array of matrices only if you want motion blur.

You can check this thread:

Transform_world and motion blur

Otherwise just pass a simple matrix like so:

ERR(suites.WorldTransformSuite1()->transform_world( in_data->effect_ref,

  in_data->quality,

  PF_MF_Alpha_STRAIGHT,

  PF_Field_FRAME,

  &sourceWorld,

  &compositeMode,

  NULL,

  &mat, //here's your matrix

  1L,

  FALSE,

  &dstRect,

  &newWorld));

2.And here you'll find the matrix transform functions you need (thanx to Shachar):

https://forums.adobe.com/message/5565152#expires_in=86399993&token_type=bearer&access_token=eyJhbGci...

The order I use is this one:

PF_FloatMatrix mat;

  SetIdentityMatrix( &mat);

  TranslateMatrix( &mat, posX, posY, NULL, NULL);

  RotateMatrix( &mat, in_data, angle, NULL, NULL);

  ScaleMatrix( &mat, scale, scale, NULL, NULL);

  TranslateMatrix( &mat,  - anchorX,  - anchorY, NULL, NULL);

Then transform_world()

Have fun!

heers,

François

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Nov 16, 2015 Nov 16, 2015

this is wonderful, thank you.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Engaged ,
Oct 16, 2022 Oct 16, 2022

Hi Francois;

 

I came across this post while searching for the matrix transform functions (I need to perform basic 2D translation, rotation and scale). However, all your links are dead.

 

Would it be possible for you to post those functions for me? I don't see them anywhere in the SDK. It would be highly appreciated.

 

Thanks!

Rich

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Engaged ,
Oct 16, 2022 Oct 16, 2022

From CCU:

 

static void CCU_ConcatMatrix(
                             const PF_FloatMatrix    *src_matrixP,
                             PF_FloatMatrix          *dst_matrixP)
{
    PF_FloatMatrix          tmp;
    
    PF_FpLong                tempF = 0;
    
    for (register A_long iL = 0; iL < 3; iL++) {
        for (register A_long jL = 0; jL < 3; jL++) {
            tempF = dst_matrixP->mat[iL][0] * src_matrixP->mat[0][jL] +
            dst_matrixP->mat[iL][1] * src_matrixP->mat[1][jL] +
            dst_matrixP->mat[iL][2] * src_matrixP->mat[2][jL];
            
            tmp.mat[iL][jL] = tempF;
        }
    }
    *dst_matrixP = tmp;
}

void SetIdentityMatrix(
                       PF_FloatMatrix *matrixP)
{
    matrixP->mat[0][0] =
    matrixP->mat[1][1] =
    matrixP->mat[2][2] = 1;
    
    matrixP->mat[0][1] =
    matrixP->mat[0][2] =
    matrixP->mat[1][0] =
    matrixP->mat[1][2] =
    matrixP->mat[2][0] =
    matrixP->mat[2][1] = 0;
}

PF_Err TranslateMatrix(
                       PF_FloatMatrix        *mP,
                       PF_FpLong           offsetX,
                       PF_FpLong           offsetY)
{
    PF_Err              err = PF_Err_NONE;
    PF_FloatMatrix      translate;
    
    translate.mat[0][0] = 1;
    translate.mat[0][1] = 0;
    translate.mat[0][2] = 0;
    
    translate.mat[1][0] = 0;
    translate.mat[1][1] = 1;
    translate.mat[1][2] = 0;
    
    translate.mat[2][0] = 0.0 + offsetX;
    translate.mat[2][1] = 0.0 + offsetY;
    translate.mat[2][2] = 1;
    
    CCU_ConcatMatrix(&translate, mP);
    return err;
}

PF_Err SkewMatrix(
                       PF_FloatMatrix        *mP,
                       PF_FpLong           skewX,
                       PF_FpLong           skewY)
{
    PF_Err              err = PF_Err_NONE;
    PF_FloatMatrix      skew;
    
skew.mat[0][0] = 1;
skew.mat[0][1] = skewY;
skew.mat[0][2] = 0;
    
skew.mat[1][0] = skewX;
skew.mat[1][1] = 1;
skew.mat[1][2] = 0;
    
skew.mat[2][0] = 0;
skew.mat[2][1] = 0;
skew.mat[2][2] = 1;
    
    CCU_ConcatMatrix(&skew, mP);
    return err;
}

PF_Err ScaleMatrix(
                   PF_FloatMatrix        *mP,
                   PF_FpLong           scaleX,
                   PF_FpLong           scaleY)
{
    PF_Err              err = PF_Err_NONE;
    PF_FloatMatrix      scale;
    
    if (scaleX != 1.0 || scaleY != 1.0)
    {
        scale.mat[0][0] = scaleX;
        scale.mat[0][1] = 0;
        scale.mat[0][2] = 0;
        
        scale.mat[1][0] = 0;
        scale.mat[1][1] = scaleY;
        scale.mat[1][2] = 0;
        
        scale.mat[2][0] = 0;
        scale.mat[2][1] = 0;
        scale.mat[2][2] = 1;
        
        CCU_ConcatMatrix(&scale, mP);
    }
    return err;
}

PF_Err RotateMatrix (
                     PF_FloatMatrix  *matrixP,
                     PF_InData       *in_data,
                     PF_FpLong       degreesF,
                     PF_FpLong       aboutXF,
                     PF_FpLong       aboutYF )
{
    AEGP_SuiteHandler suites(in_data->pica_basicP);
    PF_Err err = PF_Err_NONE;
    
    PF_FloatMatrix rotate;
    
    PF_FpLong radiansF = 0,
    sF                 = 0,
    cF                 = 0;
    
    if (degreesF){
        radiansF = PF_RAD_PER_DEGREE * degreesF;
        sF       = suites.ANSICallbacksSuite1()->sin(radiansF);
        cF       = suites.ANSICallbacksSuite1()->cos(radiansF);
        
        rotate.mat[0][0] = cF;
        rotate.mat[0][1] = sF;
        rotate.mat[0][2] = 0;
        
        rotate.mat[1][0] = -sF;
        rotate.mat[1][1] = cF;
        rotate.mat[1][2] = 0;
        
        rotate.mat[2][0] = (aboutXF * (1.0 - cF) + aboutYF * sF);
        rotate.mat[2][1] = (aboutYF * (1.0 - cF) - aboutXF * sF);
        rotate.mat[2][2] = 1;
        
        CCU_ConcatMatrix(&rotate, matrixP);
    }
    return err;
}
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Engaged ,
Oct 16, 2022 Oct 16, 2022
LATEST

James, you sir, are the best. 🙂

 

Thank you!

-Rich

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines