Ejemplo n.º 1
0
void RenderProcessor::adjustRenderOutportSizes() {
    // detect dimension of first connected render inport
    tgt::ivec2 inputDim(-1);
    const std::vector<Port*> inports = getInports();
    for (size_t i=0; i<inports.size() && inputDim == tgt::ivec2(-1); ++i) {
        RenderPort* rp = dynamic_cast<RenderPort*>(inports[i]);
        if (rp && rp->hasRenderTarget()){
            inputDim = rp->getSize();
            break;
        }
    }

    // - assign inport dimension to all connected render outports, which are not size receivers
    // - if a outport is a size receiver, assign its received rendering size to it
    tgt::ivec2 resizeDim = tgt::ivec2(-1);
    const std::vector<Port*> outports = getOutports();
    for (size_t i=0; i<outports.size(); ++i) {
        RenderPort* rp = dynamic_cast<RenderPort*>(outports[i]);
        if (!rp || !rp->hasRenderTarget())
            continue;

        if (rp->getRenderSizePropagation() == RenderPort::RENDERSIZE_DEFAULT) {
            if (inputDim != rp->getSize() && inputDim != tgt::ivec2(-1)) {
                rp->resize(inputDim);
                if (resizeDim == tgt::ivec2(-1))
                    resizeDim = inputDim;
            }
        }
        else if (rp->getRenderSizePropagation() == RenderPort::RENDERSIZE_RECEIVER) {
            RenderSizeReceiveProperty* receiveProp = rp->getSizeReceiveProperty();
            tgtAssert(receiveProp, "Render outport is size receiver, but has no SizeReceiveProperty");
            if (receiveProp->get() != rp->getSize()) {
                rp->resize(receiveProp->get());
                if (resizeDim == tgt::ivec2(-1))
                    resizeDim = receiveProp->get();
            }
        }
        else if (rp->getRenderSizePropagation() == RenderPort::RENDERSIZE_STATIC) {
            // nothing to do
        }
        else {
            LERROR("Render outport has invalid render size propgation mode: " << rp->getQualifiedName());
        }
    }

    // resize private render ports to resizeDim
    if (resizeDim != tgt::ivec2(-1)) {
        for (size_t i=0; i<privateRenderPorts_.size(); i++)
            privateRenderPorts_.at(i)->resize(resizeDim);
    }
}
Ejemplo n.º 2
0
void RenderProcessor::adjustRenderOutportDimensions() {

    // detect largest inport dimension
    tgt::ivec2 dim(-1);
    const std::vector<Port*> inports = getInports();
    for (size_t i=0; i<inports.size(); ++i) {
        RenderPort* rp = dynamic_cast<RenderPort*>(inports[i]);
        if (rp && rp->hasRenderTarget() && (rp->getSize().x >= dim.x && rp->getSize().y >= dim.y))
            dim = rp->getSize();
    }
    if (dim == tgt::ivec2(-1))
        return;

    // assign largest inport dimension to all render outports without size origin
    bool assigned = false;
    const std::vector<Port*> outports = getOutports();
    for (size_t i=0; i<outports.size(); ++i) {
        RenderPort* rp = dynamic_cast<RenderPort*>(outports[i]);
        if (rp && rp->isConnected() && (rp->getSizeOrigin() == 0)) {
            rp->resize(dim);
            assigned = true;
        }
    }

    // assign size to private ports
    if (assigned) {
        const std::vector<RenderPort*> privatePorts = getPrivateRenderPorts();
        for (size_t i=0; i<privatePorts.size(); ++i) {
            privatePorts[i]->resize(dim);
        }
    }

}
Ejemplo n.º 3
0
void RenderProcessor::portResized(RenderPort* /*p*/, tgt::ivec2 newsize) {

    // cycle prevention
    if (portResizeVisited_)
        return;

    portResizeVisited_ = true;

    // propagate to predecessing RenderProcessors
    const std::vector<Port*> inports = getInports();
    for(size_t i=0; i<inports.size(); ++i) {
        RenderPort* rp = dynamic_cast<RenderPort*>(inports[i]);
        if (rp)
            rp->resize(newsize);
    }

    //distribute to outports:
    const std::vector<Port*> outports = getOutports();
    for(size_t i=0; i<outports.size(); ++i) {
        RenderPort* rp = dynamic_cast<RenderPort*>(outports[i]);
        if (rp)
            rp->resize(newsize);
    }

    //distribute to private ports:
    const std::vector<RenderPort*> pports = getPrivateRenderPorts();
    for (size_t i=0; i<pports.size(); ++i) {
        RenderPort* rp = pports[i];
        rp->resize(newsize);
    }

    // notify camera properties about viewport change
    if(newsize != tgt::ivec2(0,0)) {
        const std::vector<Property*> properties = getProperties();
        for (size_t i=0; i<properties.size(); ++i) {
            CameraProperty* cameraProp = dynamic_cast<CameraProperty*>(properties[i]);
            if (cameraProp) {
                cameraProp->viewportChanged(newsize);
            }
        }
    }

    invalidate();

    portResizeVisited_ = false;
}
Ejemplo n.º 4
0
void RenderPort::sizeOriginChanged(void* so) {
    if (isOutport()) {
        static_cast<RenderProcessor*>(getProcessor())->sizeOriginChanged(this);
        validResult_ = false;
    }
    else {
        if (sizeOrigin_ == so)
            return;
        sizeOrigin_ = so;
        for (size_t i = 0; i < connectedPorts_.size(); ++i) {
            RenderPort* rp = static_cast<RenderPort*>(connectedPorts_[i]);
            rp->sizeOriginChanged(so);
            if (so)
                rp->resize(size_);
        }
    }
}