DrawTexture Example



  • On 01/05/2013 at 13:39, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   R14 
    Platform:   Windows  ;   
    Language(s) :     C++  ;   PYTHON  ;

    ---------
    Hi!

    Can someone provide a working example of BaseDraw::DrawTexture()? It just doesn't do what I
    want so I'm doing something wrong and I can not figure it out.

    Some C++ Code:

        Rect_t rect;
        bd->GetSafeFrame(&rect.x1, &rect.y1, &rect.x2, &rect.y2);
      
        // ...
      
        bd->SetMatrix_Screen();
      
        Vector padr4[4];
        padr4[0] = Vector(rect.x1, rect.y1, 0);
        padr4[1] = Vector(rect.x2, rect.y1, 0);
        padr4[2] = Vector(rect.x2, rect.y2, 0);
        padr4[3] = Vector(rect.x1, rect.y2, 0);
      
        Vector cadr[4] = { Vector(0.5) };
        Vector vnadr[4] = { Vector(0, 0, 1) };
        Vector uvadr[4];
        uvadr[0] = Vector(0, 0, 0);
        uvadr[1] = Vector(1, 0, 0);
        uvadr[2] = Vector(1, 1, 0);
        uvadr[3] = Vector(0, 1, 0);
      
        bd->DrawTexture(bmp, padr4, cadr, vnadr, uvadr, 4,
                        DRAW_ALPHA_NORMAL, DRAW_TEXTUREFLAGS_INTERPOLATION_LINEAR);
    

    A Python Version:

        f = bd.GetSafeFrame()
        w = f['cr'] - f['cl']
        h = f['cb'] - f['ct']
      
        # ...
      
        bmp = BaseBitmap()
        bmp.Init(w, h, 24)
        for x in xrange(w) :
            for y in xrange(h) :
                bmp[x, y] = (x, y, 50)
      
        padr4 = [None] * 4
        padr4[0] = Vector(f['cl'], f['ct'], 0)
        padr4[1] = Vector(f['cr'], f['ct'], 0)
        padr4[2] = Vector(f['cr'], f['cb'], 0)
        padr4[3] = Vector(f['cl'], f['cb'], 0)
      
        cadr = times(4, Vector)
        vnadr = times(4, lambda: Vector(0, 0, 1))
        uvadr = [None] * 4
        uvadr[0] = Vector(0, 0, 0)
        uvadr[1] = Vector(1, 0, 0)
        uvadr[2] = Vector(1, 1, 0)
        uvadr[3] = Vector(0, 1, 0)
      
        bd.SetMatrix_Screen()
        bd.DrawTexture(bmp, padr4, cadr, vnadr, uvadr, 4, c4d.DRAW_ALPHA_NONE, c4d.DRAW_TEXTUREFLAGS_INTERPOLATION_NEAREST)
    

    For the Python Version, all I get is a black screen:

    I can't really describe the behavior as the behavior seems rather random to me. For example,
    changing the cadr array a little:

        cadr = times(4, Vector)
        cadr[0].x = 255
        cadr[1].y = 255
    

    Looks quite funny:

    Thanks in advance!
    -Niklas



  • On 01/05/2013 at 14:03, xxxxxxxx wrote:

    Okay, nevermind. Seems like the colors from the cadr array are drawn in "over" the texture (in
    some strange way). So, this basically works arleady really good!

        Rect_t rect;
        bd->GetSafeFrame(&rect.x1, &rect.y1, &rect.x2, &rect.y2);
      
        // Draw the overlay image on the screen.
        BaseBitmap* bmp = image->GetBitmap();
        if (!bmp) return TRUE;
      
        bd->SetMatrix_Screen();
      
        Vector padr4[4];
        padr4[0] = Vector(rect.x1, rect.y1, 0);
        padr4[1] = Vector(rect.x2, rect.y1, 0);
        padr4[2] = Vector(rect.x2, rect.y2, 0);
        padr4[3] = Vector(rect.x1, rect.y2, 0);
      
        Vector uvadr[4];
        uvadr[0] = Vector(0, 0, 0);
        uvadr[1] = Vector(1, 0, 0);
        uvadr[2] = Vector(1, 1, 0);
        uvadr[3] = Vector(0, 1, 0);
      
        bd->DrawTexture(bmp, padr4, NULL, NULL, uvadr, 4,
                        DRAW_ALPHA_FROM_IMAGE, DRAW_TEXTUREFLAGS_0);
    

    But the alpha display is not really satisfieng:

    I am drawing Noise on the GeClipMap using this algorithm:

        image->BeginDraw();
        for (LONG x=0; x < width; x++) {
            for (LONG y=0; y < height; y++) {
                Real v = (SNoise(Vector(x / 50.0, y / 50.0, frame)) + 1) / 2;
                v *= (Real) x / width;
                LONG g = (LONG) (v * 255);
      
                image->SetPixelRGBA(x, y, 255, 255, 255, g);
            }
        }
        image->EndDraw();
    

    Is there anything wrong or is it a limitation of the DrawTexture() method?

    Thanks,
    -Niklas


Log in to reply