bool RenderPort::connect(Port* inport) { if (Port::connect(inport)) { RenderPort* rp = static_cast<RenderPort*>(inport); sizeOriginChanged(rp->getSizeOrigin()); if (rp->getSizeOrigin()) { static_cast<RenderProcessor*>(getProcessor())->portResized(this, rp->size_); } return true; } return false; }
bool RenderProcessor::testSizeOrigin(const RenderPort* p, void* so) const { tgtAssert(p->isOutport(), "testSizeOrigin used with inport"); // cycle prevention if (testSizeOriginVisited_) return true; testSizeOriginVisited_ = true; if (so) { const std::vector<Port*> outports = getOutports(); for (size_t i=0; i<outports.size(); ++i) { if(p == outports[i]) continue; RenderPort* rp = dynamic_cast<RenderPort*>(outports[i]); if (rp) { if (rp->getSizeOrigin() && (rp->getSizeOrigin() != so)) { testSizeOriginVisited_ = false; return false; } } } } const std::vector<Port*> inports = getInports(); for (size_t i=0; i<inports.size(); ++i) { RenderPort* rp = dynamic_cast<RenderPort*>(inports[i]); if (rp) { if (rp->getSizeOrigin() && (rp->getSizeOrigin() != so) ) { testSizeOriginVisited_ = false; return false; } const std::vector<const Port*> connectedOutports = inports[i]->getConnected(); for (size_t j=0; j<connectedOutports.size(); ++j) { const RenderPort* op = static_cast<const RenderPort*>(connectedOutports[j]); if (!static_cast<RenderProcessor*>(op->getProcessor())->testSizeOrigin(op, so)) { testSizeOriginVisited_ = false; return false; } } } } testSizeOriginVisited_ = false; return true; }
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); } } }
void RenderPort::disconnect(Port* other) { Port::disconnect(other); RenderPort* rp = static_cast<RenderPort*>(other); if (isOutport()) { if (getSizeOrigin() != rp->getSizeOrigin()) static_cast<RenderProcessor*>(getProcessor())->sizeOriginChanged(this); other->invalidate(); } }
void RenderProcessor::sizeOriginChanged(RenderPort* p) { if (!p->getSizeOrigin()) { const std::vector<Port*> outports = getOutports(); for (size_t i=0; i<outports.size(); ++i) { RenderPort* rp = dynamic_cast<RenderPort*>(outports[i]); if (rp) { if (rp->getSizeOrigin()) return; } } } 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->sizeOriginChanged(p->getSizeOrigin()); } }
void RenderStore::sizeOriginChanged(RenderPort* p) { if (!p->getSizeOrigin()) { const std::vector<Port*> outports = getOutports(); for (size_t i=0; i<outports.size(); ++i) { RenderPort* rp = dynamic_cast<RenderPort*>(outports[i]); if (rp) { if (rp->getSizeOrigin()) return; } } } // do not propagate to inport /*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->sizeOriginChanged(p->getSizeOrigin()); } */ }