ClippingRectangleNode,当parent有缩放时,裁剪错位。带处理办法

void ClippingRectangleNode::onBeforeVisitScissor()
{
 if (_clippingEnabled) {
 glEnable(GL_SCISSOR_TEST);
 
        float scaleX = _scaleX;
        float scaleY = _scaleY;
        Node *parent = this->getParent();
        while (parent) {
            scaleX *= parent->getScaleX();
            scaleY *= parent->getScaleY();
            parent = parent->getParent();
        }
        scaleX = scaleY = 1; //设置为1,不做缩放
 const Point pos = convertToWorldSpace(Point(_clippingRegion.origin.x, _clippingRegion.origin.y));
 GLView* glView = Director::getInstance()->getOpenGLView();
        glView->setScissorInPoints(pos.x * scaleX,
                                   pos.y * scaleY,
                                   _clippingRegion.size.width * scaleX,
                                   _clippingRegion.size.height * scaleY);
    }
}

看代码setScissorInPoints做了缩放处理,结果导致当ClippingRectangleNode的父容器设置了scale(0.8f)后,裁剪区域错位;

我强制把scaleX = scaleY = 1;不做缩放,结果反而对了。

还请官方重视。

收到,确认中,不过能先给下你的版本吗

我版本v3.3 final

抱歉,昨晚没详细阐述我的BUG环境

昨天的修改方法还是有问题的。

下面我详细解释新的解决办法。

抱歉,昨晚没详细阐述我的BUG环境

cocos2d-x v3.3 final

我的UI树, 以及UI属性:
-parent Sprite, scale(0.8), anchorPoint(0.5, 0.5) ]
-ClippingRectangleNode anchorPoint(0.5, 0.5), postion(不为0), contentSize(不为0) ]
-Sprite anchorPoint(0, 0), position(0,0) ]

这种情况下,裁剪区域错位的问题。并且parent的位置不同,裁剪区域错位的情况也会不同。

昨天不做缩放的方式修改,还是存在问题:裁剪范围变大。

针对我的bug环境,今天我又尝试将ClippingRectangleNode修改如下,问题得以解决。


void ClippingRectangleNode::onBeforeVisitScissor()
{
 if (_clippingEnabled) {
 glEnable(GL_SCISSOR_TEST);
 
        float scaleX = _scaleX;
        float scaleY = _scaleY;
        Node *parent = this->getParent();
        while (parent) {
            scaleX *= parent->getScaleX();
            scaleY *= parent->getScaleY();
            parent = parent->getParent();
        }
       const Point pos = convertToWorldSpace(Point(_clippingRegion.origin.x, _clippingRegion.origin.y));
       GLView* glView = Director::getInstance()->getOpenGLView();
       //只做宽高缩放,位置不变,错位问题不复存在
        glView->setScissorInPoints(pos.x,
                                   pos.y,
                                   _clippingRegion.size.width * scaleX,
                                   _clippingRegion.size.height * scaleY);
        /*
        glView->setScissorInPoints(pos.x * scaleX,
                                   pos.y * scaleY,
                                   _clippingRegion.size.width * scaleX,
                                   _clippingRegion.size.height * scaleY);
         */
    }
}

我提了一个issue,你可以关注一下这个issue。

https://github.com/cocos2d/cocos2d-x/issues/10229

有什么问题也可以直接在这个issue下回复。

感谢,我昨天就想提交到github上,但是E文不好,只好来这里反馈了。

:14: :14: :14: 没事的=。=我英文也不好。但是可以理解就够了。不需要很注意语法问题。

用cocos2d-x 3.7.1版本,这个问题还没改正,感谢楼主的解决方案。

mark一下~~