std::string TGeometryFx::getAlias(double frame, const TRenderSettings &info) const { TGeometryFx *tthis = const_cast<TGeometryFx *>(this); TAffine affine = tthis->getPlacement(frame); std::string alias = getFxType(); alias += "["; // alias degli effetti connessi alle porte di input separati da virgole // una porta non connessa da luogo a un alias vuoto (stringa vuota) for (int i = 0; i < getInputPortCount(); ++i) { TFxPort *port = getInputPort(i); if (port->isConnected()) { TRasterFxP ifx = port->getFx(); assert(ifx); alias += ifx->getAlias(frame, info); } alias += ","; } return alias + (areAlmostEqual(affine.a11, 0) ? "0" : ::to_string(affine.a11, 5)) + "," + (areAlmostEqual(affine.a12, 0) ? "0" : ::to_string(affine.a12, 5)) + "," + (areAlmostEqual(affine.a13, 0) ? "0" : ::to_string(affine.a13, 5)) + "," + (areAlmostEqual(affine.a21, 0) ? "0" : ::to_string(affine.a21, 5)) + "," + (areAlmostEqual(affine.a22, 0) ? "0" : ::to_string(affine.a22, 5)) + "," + (areAlmostEqual(affine.a23, 0) ? "0" : ::to_string(affine.a23, 5)) + "]"; }
std::string Iwa_TiledParticlesFx::getAlias(double frame, const TRenderSettings &info) const { std::string alias = getFxType(); alias += "["; // alias degli effetti connessi alle porte di input separati da virgole // una porta non connessa da luogo a un alias vuoto (stringa vuota) for (int i = 0; i < getInputPortCount(); ++i) { TFxPort *port = getInputPort(i); if (port->isConnected()) { TRasterFxP ifx = port->getFx(); assert(ifx); alias += ifx->getAlias(frame, info); } alias += ","; } std::string paramalias(""); for (int i = 0; i < getParams()->getParamCount(); ++i) { TParam *param = getParams()->getParam(i); paramalias += param->getName() + "=" + param->getValueAlias(frame, 3); } return alias + toString(frame) + "," + toString(getIdentifier()) + paramalias + "]"; }
string TMacroFx::getAlias(double frame, const TRenderSettings &info) const { string alias = getFxType(); alias += "["; // alias degli effetti connessi alle porte di input separati da virgole // una porta non connessa da luogo a un alias vuoto (stringa vuota) int i; for (i = 0; i < getInputPortCount(); i++) { TFxPort *port = getInputPort(i); if (port->isConnected()) { TRasterFxP ifx = port->getFx(); assert(ifx); alias += ifx->getAlias(frame, info); } alias += ","; } // alias dei valori dei parametri dell'effetto al frame dato for (int j = 0; j < (int)m_fxs.size(); j++) { alias += (j == 0) ? "(" : ",("; for (i = 0; i < m_fxs[j]->getParams()->getParamCount(); i++) { if (i > 0) alias += ","; TParam *param = m_fxs[j]->getParams()->getParam(i); alias += param->getName() + "=" + param->getValueAlias(frame, 2); } alias += ")"; } alias += "]"; return alias; }
bool ColumnColorFilterFx::doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info) { if (!m_port.isConnected()) return false; TRasterFxP fx = m_port.getFx(); assert(fx); bool ret = fx->doGetBBox(frame, bBox, info); return ret; }
std::vector<const TFx *> calculateSortedFxs(TRasterFxP rootFx) { std::map<const TFx *, std::set<const TFx *>> E; /* 辺の情報 */ std::set<const TFx *> Sources; /* 入次数0のノード群 */ std::queue<const TFx *> Q; Q.push(rootFx.getPointer()); E[rootFx.getPointer()] = std::set<const TFx *>(); while (!Q.empty()) { const TFx *vptr = Q.front(); Q.pop(); if (!vptr) { continue; } /* 繋がっている入力ポートの先の Fx を訪問する 入力ポートが無ければ終了 */ int portCount = vptr->getInputPortCount(); if (portCount < 1) { Sources.insert(vptr); continue; } for (int i = 0; i < portCount; i++) { TFxPort *port = vptr->getInputPort(i); if (!port) { continue; } TFxP u = port->getFx(); const TFx *uptr = u.getPointer(); if (E.count(uptr) == 0) { E[uptr] = std::set<const TFx *>(); } if (E[uptr].count(vptr) == 0) { E[uptr].insert(vptr); } Q.push(uptr); } } /* トポロジカルソート */ std::set<const TFx *> visited; std::vector<const TFx *> L; std::function<void(const TFx *)> visit = [&visit, &visited, &E, &L](const TFx *fx) { if (visited.count(fx)) return; visited.insert(fx); auto edge = E[fx]; for (auto i = edge.cbegin(); i != edge.cend(); i++) { visit(*i); } L.insert(L.begin(), fx); }; for (auto i = E.cbegin(); i != E.cend(); i++) { visit(i->first); } return L; }
void ColumnColorFilterFx::doCompute(TTile &tile, double frame, const TRenderSettings &ri) { if (!m_port.isConnected()) return; if (!TRaster32P(tile.getRaster()) && !TRaster64P(tile.getRaster())) throw TException("AffineFx unsupported pixel type"); TRasterFxP src = m_port.getFx(); src->compute(tile, frame, ri); TRop::applyColorScale(tile.getRaster(), m_colorFilter); }
std::string ColumnColorFilterFx::getAlias(double frame, const TRenderSettings &info) const { std::string alias = getFxType(); alias += "["; if (m_port.isConnected()) { TRasterFxP ifx = m_port.getFx(); assert(ifx); alias += ifx->getAlias(frame, info); } alias += ","; return alias + std::to_string(m_colorFilter.r) + "," + std::to_string(m_colorFilter.g) + "," + std::to_string(m_colorFilter.b) + "," + std::to_string(m_colorFilter.m) + "]"; }
bool TGeometryFx::doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info) { TRasterFxPort *input = dynamic_cast<TRasterFxPort *>(getInputPort(0)); assert(input); if (input->isConnected()) { TRasterFxP fx = input->getFx(); assert(fx); bool ret = fx->doGetBBox(frame, bBox, info); if (getActiveTimeRegion().contains(frame)) bBox = getPlacement(frame) * bBox; return ret; } else { bBox = TRectD(); return false; } return true; };
void Iwa_TiledParticlesFx::doDryCompute(TRectD &rect, double frame, const TRenderSettings &info) { Iwa_ParticlesManager *pc = Iwa_ParticlesManager::instance(); unsigned long fxId = getIdentifier(); int inputPortCount = getInputPortCount(); int i, j, curr_frame = frame, /*- 現在のフレーム -*/ startframe = startpos_val->getValue(); /*- Particesの開始フレーム -*/ TRenderSettings infoOnInput(info); infoOnInput.m_affine = TAffine(); // Using the standard reference - indep. from cameras. infoOnInput.m_bpp = 64; // Control ports rendered at 32 bit - since not visible. for (i = startframe - 1; i <= curr_frame; ++i) { double frame = tmax(0, i); for (j = 0; j < inputPortCount; ++j) { TFxPort *port = getInputPort(j); std::string tmpName = getInputPortName(j); if (port->isConnected()) { TRasterFxP fx = port->getFx(); // Now, consider that source ports work different than control ones QString portName = QString::fromStdString(tmpName); if (portName.startsWith("C")) { // Control ports are calculated from start to current frame, since // particle mechanics at current frame is influenced by previous ones // (and therefore by all previous control images). TRectD bbox; fx->getBBox(frame, bbox, infoOnInput); if (bbox == TConsts::infiniteRectD) bbox = info.m_affine.inv() * rect; fx->dryCompute(bbox, frame, infoOnInput); } else if (portName.startsWith("T")) { // Particles handle source ports caching procedures on its own. } } } } }
void TGeometryFx::doCompute(TTile &tile, double frame, const TRenderSettings &ri) { TRasterFxPort *input = dynamic_cast<TRasterFxPort *>(getInputPort(0)); assert(input); if (!input->isConnected()) return; if (!getActiveTimeRegion().contains(frame)) { TRasterFxP(input->getFx())->compute(tile, frame, ri); return; } if (!TRaster32P(tile.getRaster()) && !TRaster64P(tile.getRaster())) throw TException("AffineFx unsupported pixel type"); TAffine aff1 = getPlacement(frame); TRenderSettings ri2(ri); ri2.m_affine = ri2.m_affine * aff1; TRasterFxP src = getInputPort("source")->getFx(); src->compute(tile, frame, ri2); return; }
void SwatchViewer::computeContent() { if (suspendedRendering) return; if (!m_enabled) return; if (!m_raster) return; //Clear the swatch cache when the zoom scale has changed (cache results are not compatible //between different scale levels) if (m_aff.a11 != m_contentAff.a11) SwatchCacheManager::instance()->clearSwatchResults(); TRect rect(0, 0, width() - 1, height() - 1); TDimension size = rect.getSize(); assert(m_raster->getSize() == size); if (m_fx) { //TFxP fx = makeAffine(m_fx, m_aff); //TRasterFxP rasterFx = fx; TRasterFxP rasterFx = m_fx; if (rasterFx) { m_executor.cancelAll(); m_executor.addTask(new ContentRender(rasterFx.getPointer(), m_frame, size, this)); submittedTasks++; return; } else { m_content = TRaster32P(size); m_content->fill(TPixel32::Red); } } else { m_content = TRaster32P(size); m_content->fill(TPixel32::Transparent); } updateRaster(); }
void RenderCommand::flashRender() { ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); TSceneProperties *sprop = scene->getProperties(); FILE *fileP = fopen(m_fp, "wb"); if (!fileP) return; ProgressDialog pb("rendering " + toQString(m_fp), "Cancel", 0, m_numFrames); pb.show(); TDimension cameraSize = scene->getCurrentCamera()->getRes(); double frameRate = sprop->getOutputProperties()->getFrameRate(); TFlash flash( cameraSize.lx, cameraSize.ly, m_numFrames, frameRate, sprop->getOutputProperties()->getFileFormatProperties("swf")); flash.setBackgroundColor(sprop->getBgColor()); std::vector<TXshSoundColumn *> columns; scene->getSoundColumns(columns); if (!columns.empty()) { TXsheet::SoundProperties *prop = new TXsheet::SoundProperties(); prop->m_frameRate = frameRate; TSoundTrack *st = scene->getXsheet()->makeSound(prop); if (st) flash.putSound(st, 0); } int i = 0; for (i = 0; i < m_numFrames; ++i, m_r += m_stepd) { flash.beginFrame(m_step * i + 1); TRasterFxP rfx = buildSceneFx(scene, m_r, 0, false); assert(rfx); rfx->compute(flash, tround(m_r)); // WARNING: This should accept a DOUBLE... #ifdef BRAVODEMO TRasterImageP ri(loadBravo(scene->getCurrentCamera()->getRes())); int lx = ri->getRaster()->getLx(); int ly = ri->getRaster()->getLx(); flash.pushMatrix(); int dx = tround(0.1 * (cameraSize.lx - lx)); int dy = tround(0.1 * (cameraSize.ly - ly)); flash.multMatrix(TTranslation((cameraSize.lx - lx) / 2 - (dx > 0 ? dx : 0), -(cameraSize.ly - ly) / 2 + (dy > 0 ? dy : 0))); flash.draw(ri, 0); flash.popMatrix(); #endif flash.endFrame(i == m_numFrames - 1, 0, true); if (pb.wasCanceled()) break; pb.setValue(i + 1); } flash.writeMovie(fileP); fclose(fileP); TSystem::showDocument(m_fp); //QDesktopServices::openUrl(QUrl(toQString(m_fp))); TImageCache::instance()->remove(toString(m_fp.getWideString() + L".0")); TNotifier::instance()->notify(TSceneNameChange()); }
std::map<std::string, RenderTask *>::iterator jt; for (it = renderDatas.begin(); it != renderDatas.end(); ++it) { // Check for user cancels if (hasToDie(renderId)) return; // Build the frame's description alias const TRenderer::RenderData &renderData = *it; /*--- カメラサイズ (LevelAutoやノイズで使用する) ---*/ TRenderSettings rs = renderData.m_info; rs.m_cameraBox = camBox; /*--- 途中でPreview計算がキャンセルされたときのフラグ ---*/ rs.m_isCanceled = &renderInfos->m_canceled; TRasterFxP fx = renderData.m_fxRoot.m_frameA; assert(fx); double frame = renderData.m_frame; std::string alias = fx->getAlias(frame, renderData.m_info); if (renderData.m_fxRoot.m_frameB) alias = alias + renderData.m_fxRoot.m_frameB->getAlias(frame, renderData.m_info); // Search the alias among stored clusters - and store the frame jt = clusters.find(alias); if (jt == clusters.end()) { RenderTask *newTask = new RenderTask(renderId, tasksIdCounter++, renderData.m_frame, rs,