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); } }
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 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; }
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_); } } }