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 PortGroup::reattachTargets() { if (!fbo_) return; fbo_->activate(); fbo_->detachAll(); if (ports_.empty()) return; bool hasDepth_ = false; for (size_t i=0; i<ports_.size(); ++i) { RenderPort* p = ports_[i]; if (!ignoreConnectivity_ && !p->isConnected()) continue; if (p->getColorTexture()) fbo_->attachTexture(p->getColorTexture(), GL_COLOR_ATTACHMENT0_EXT+i); if (!hasDepth_ && p->getDepthTexture()) { hasDepth_ = true; fbo_->attachTexture(p->getDepthTexture(), GL_DEPTH_ATTACHMENT_EXT); } } LGL_ERROR; if (hasDepth_) fbo_->isComplete(); }
void RenderProcessor::manageRenderTargets() { 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->getRenderTargetSharing()) { if (rp->isConnected()) { if (!rp->hasRenderTarget()) { rp->initialize(); } } else { if (rp->hasRenderTarget() && rp->getDeinitializeOnDisconnect()) rp->deinitialize(); } } } }
bool RenderPort::doesSizeOriginConnectFailWithPort(Port* inport) const { tgtAssert(inport, "passed null pointer"); RenderPort* rin = dynamic_cast<RenderPort*>(inport); if (!rin) return false; bool unEqual = this != rin; bool outIsOutport = isOutport(); bool inIsInport = rin->isInport(); bool processorUnEqual = getProcessor() != rin->getProcessor(); bool isNotConnected = !isConnectedTo(rin); bool thisIsConnected = rin->isConnected(); bool thisAllowsMultiple = rin->allowMultipleConnections(); return rin && unEqual && outIsOutport && inIsInport && processorUnEqual && isNotConnected && (!thisIsConnected || thisAllowsMultiple); }