Ejemplo n.º 1
0
void MaskSprite::draw()
{
    //draw childs
    Scene*  scene = getScene();
    Object* object = getObject();
    //
    if (object && scene && isVisible())
    {
        Render* render = dynamic_cast<Render*>(scene);
        Camera* camera = render->getCamera();
        //display/view camera
        const Mat4& disViewM4 = RenderContext::getDisplay().mul(camera->getGlobalMatrix());
        const AABox2& viewBox = camera->getBoxViewport();
        /////////////////////////////////////////////////////////////////////////////////////
        //new box pos
        AABox2 modelBox = getBox().applay(disViewM4);
        //culling
        if (!modelBox.isIntersection(viewBox)) return;
        /////////////////////////////////////////////////////////////////////////////////////
        //build queue
        queue->clear();
        //add all childs
        for (auto child : *object)
        queue->append([&](const AABox2& mbox) -> bool
        {
            const AABox2& wbox = mbox.applay(disViewM4);
            return modelBox.isIntersection(wbox);
        }, child);
        //draw filter
        RenderContext::setStencil(STENCIL_REPLACE);
        RenderContext::stencilClear();
        RenderContext::setColorWritable(false, false, false, false);
        RenderContext::setZBufferWritable(false);
        ///////////////////////////////////
        //enable state settings
        enableStates();
        //set uniform
        getShader()->uniform(uAlphaMask,alphaMask);
        //draw mesh
        if (getMesh()) getMesh()->draw();
        ///////////////////////////////////
        //set filter
        RenderContext::setStencil(STENCIL_KEEP);
        RenderContext::setColorWritable(true, true, true, true);
        RenderContext::setZBufferWritable(true);
        //draw queue
        if (render->getBatchingIsEnable())
            queue->draw(render->getBatchingMesh());
        else
            queue->draw();
        //disable filter
        RenderContext::setStencil(STENCIL_NONE);
    }
}