Issue with CCMask

i’m using CCMask and having a problem that if i do not use a background image then it makes the empty parts black. any help??? :frowning:

Here is my code:

    CCSprite *masks = CCSprite::create("maskimage.png");
    Utils::makeMultiResolution(masks);
    masks->setPosition(ccd(30.f, 750.f));
    masks->setZOrder(2);


    CCSprite * mask = CCSprite::create(maskName);
    Utils::makeMultiResolution(mask);
    mask->setPosition(ccd(314, 275));

    CCSprite *object = mask;

// BACKGROUND image is added in "this" (this->addChild(bg);)
    CCMask * myMask = CCMask::createMaskForObject(gameLayer, masks);
    this->addChild(myMask, 2);
    myMask->mask();
    //mask a new object
    myMask->setObject(mask);
    myMask->setMask(masks);
    myMask->maskWithoutClear();

My CCMask Class code which i modified

//
//  CCMask.cpp
//
//  Created by Ashar on 5/20/13.
//
//

#include "CCMask.h"
#include "Utils.h"
using namespace cocos2d;

CCScene * CCMask::scene()
{
    CCScene * scene = CCScene::create();

    CCMask * cmask = CCMask::create();

    scene->addChild(cmask);

    return scene;
}


CCMask*  CCMask::createMaskForObject(cocos2d::CCNode* object, cocos2d::CCSprite* mask)
{
    CCMask * mak = (CCMask*)CCMask::create();
    return mak->initWithObject(object, mask);
}

CCMask* CCMask::initWithObject(cocos2d::CCNode* object, cocos2d::CCSprite* mask)
{
    if(!cocos2d::CCNode::init())
    {
        return false;
    }

    objectSprite_ = object;

    size = cocos2d::CCDirector::sharedDirector()->getWinSize();

    maskSprite_ = mask;
    // Set up the burn sprite that will "knock out" parts of the darkness layer depending on the alpha value of the pixels in the image.
    maskSprite_->setBlendFunc((ccBlendFunc) { GL_ZERO, GL_ONE_MINUS_SRC_ALPHA });


    // Create point with middle of screen
    cocos2d::CCPoint screenMid = ccp(size.width * 0.5f, size.height * 0.5f);

    // Create the rendureTextures for the mask
    masked = CCRenderTexture::create(size.width, size.height);

    //    masked->getSprite()->setBlendFunc((ccBlendFunc) { GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA });
    masked->getSprite()->setBlendFunc((ccBlendFunc) { GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA });

    // Set render textures at middle of screen
    masked->setPosition(screenMid);

    // Add the masked object to the screen
    //    [self addChild: masked_];
    this->addChild(masked);
    //    masked->beginWithClear(0.0f, 0.0f, 0.0f, 1.0f);
    //
    //    masked->end();

    return this;
}

void CCMask::mask()
{
    this->maskWithClear(0.0f, 0.0f, 0.0f, 0.0f);
}

void CCMask::maskWithClear(float r, float g, float b, float a)
{
    masked->beginWithClear(r, g, b, a);
    // Limit drawing to the alpha channel

    objectSprite_->visit();

    glColorMask(0.0f, 0.0f, 0.0f, 1.0f);

    // Draw mask
    maskSprite_->visit();

    // Reset color mask
    glColorMask(1.0f, 1.0f, 1.0f, 1.0f);

    masked->end();
}

void CCMask::maskWithoutClear()
{
    masked->begin();

    objectSprite_->visit();
    // Limit drawing to the alpha channel
    glColorMask(0.0f, 0.0f, 0.0f, 1.0f);

    // Draw mask
    maskSprite_->visit();

    // Reset color mask
    glColorMask(1.0f, 1.0f, 1.0f, 1.0f);

    masked->end();
}

void CCMask::reDrawMask()
{
    //presume object is already drawed in a previous frame

    //    CCSprite * spr = (CCSprite*)maskSprite_;
    //
    //    printf("%f", spr->boundingBox().size.width);
    //
    //
    //    if(spr->getColor().r == 0 && spr->getColor().b == 0 && spr->getColor().g == 0)
    //    {
    //        CCLog("YES");
    //    }
    //
    //    ccBlendFunc blend = (ccBlendFunc){ GL_ZERO, GL_ONE_MINUS_SRC_ALPHA };
    //
    //    if(spr->getBlendFunc().dst == blend.dst)
    //    {
    //        CCLog("YES");
    //    }


    masked->begin();
    // Limit drawing to the alpha channel

    glColorMask(0.0f, 0.0f, 0.0f, 1.0f);

    // Draw mask
    maskSprite_->visit();

    // Reset color mask
    glColorMask(1.0f, 1.0f, 1.0f, 1.0f);
    //        glColorMask(0.5f, 0.5f, 0.5f, 0.5f);

    masked->end();

}

void CCMask::setObject(CCNode* object)
{
//  objectSprite_->release();
    objectSprite_ = NULL;
    objectSprite_ = object;
    objectSprite_->retain();
}

void CCMask::setMask(CCSprite* mask)
{
//  maskSprite_->release();
    maskSprite_ = NULL;
    maskSprite_ = mask;
    maskSprite_->setBlendFunc((ccBlendFunc) { GL_ZERO, GL_ONE_MINUS_SRC_ALPHA });
    maskSprite_->retain();

    //    maskSprite_->setOpacity(125);
}

cocos2d::CCSprite* CCMask::maskSprite()
{
    return maskSprite_;
}

CCMask::CCMask()
{

}

CCMask::~CCMask()
{
    removeAllChildrenWithCleanup(true);

    //    CC_SAFE_RELEASE(mas);
    CC_SAFE_RELEASE(maskSprite_);
    CC_SAFE_RELEASE(objectSprite_);
}

Help me please :frowning:


iOS Simulator Screen shot 14-Dec-2013 5.57.08 PM.png (162.2 KB)