Fix (partial) referenced fills on plastic deformed levels

This commit is contained in:
manongjohn 2021-09-05 09:13:15 -04:00
parent 88618608a3
commit 1837a2ad3d
6 changed files with 27 additions and 9 deletions

View file

@ -67,6 +67,8 @@ public:
bool m_drawBlankFrame;
bool m_useChecks; //!< whether to consider paint check and ink check
bool m_forSceneIcon = false; // whether it is redered for the scene icons
bool m_forReference =
false; // whether it is rendered for reference operations
public:
VisualSettings();

View file

@ -150,7 +150,8 @@ the specified
32-bit raster.
*/
void renderFrame(const TRaster32P &ras, int row, const TXsheet *xsh = 0,
bool checkFlags = true) const;
bool checkFlags = true, bool forSceneIcon = true,
bool forReference = false) const;
/*!
Performs a camera-stand render of the specified xsheet in the specified

View file

@ -222,7 +222,10 @@ DrawableTextureDataP TTexturesStorage::getTextureData(
// If there is no known associated display lists space, the texture cannot be
// stored.
if (dlSpaceId < 0) return DrawableTextureDataP();
// if (dlSpaceId < 0) return DrawableTextureDataP();
// If from an offline display, let's see if found under display 0
if (dlSpaceId < 0) dlSpaceId = 0;
QMutexLocker locker(&l_mutex);

View file

@ -457,13 +457,18 @@ bool fill(const TRasterCM32P &r, const FillParameters &params,
ToonzScene *scene = xsheet->getScene();
TCamera *camera = scene->getCurrentCamera();
TRaster32P tmpRaster(camera->getRes());
scene->renderFrame(tmpRaster, frameIndex);
// Render for reference
scene->renderFrame(tmpRaster, frameIndex, xsheet, false, false, true);
refRaster->lock();
TPoint offset((params.m_imageSize.lx - tmpRaster->getLx()) / 2,
(params.m_imageSize.ly - tmpRaster->getLy()) / 2);
offset -= params.m_imageOffset;
refRaster->fill(color);
refRaster->copy(tmpRaster, offset);
refRaster->lock();
refpix = refRaster->pixels(p.y) + p.x;
clickedPosColor = *refpix;
@ -881,13 +886,15 @@ void fullColorFill(const TRaster32P &ras, const FillParameters &params,
ToonzScene *scene = xsheet->getScene();
TCamera *camera = scene->getCurrentCamera();
TRaster32P tmpRaster(camera->getRes());
scene->renderFrame(tmpRaster, frameIndex);
scene->renderFrame(tmpRaster, frameIndex, xsheet, false, false, true);
refRas->lock();
TPoint offset((refRas->getLx() - tmpRaster->getLx()) / 2,
(refRas->getLy() - tmpRaster->getLy()) / 2);
refRas->fill(color);
refRas->copy(tmpRaster, offset);
refRas->lock();
clickedPosColor = *(refRas->pixels(y) + x);
}

View file

@ -795,7 +795,7 @@ void RasterPainter::onImage(const Stage::Player &player) {
TStageObject *obj =
::plasticDeformedObj(player, m_vs.m_plasticVisualSettings);
if (obj && QThread::currentThread() == qGuiApp->thread() &&
!m_vs.m_forSceneIcon) {
(!m_vs.m_forSceneIcon || m_vs.m_forReference)) {
flushRasterImages();
::onPlasticDeformedImage(obj, player, m_vs, m_viewAff);
} else {
@ -809,6 +809,8 @@ void RasterPainter::onImage(const Stage::Player &player) {
else if (TToonzImageP ti = img)
onToonzImage(ti.getPointer(), player);
else if (TMeshImageP mi = img) {
// Never draw mesh when building reference image
if (m_vs.m_forReference) return;
flushRasterImages();
::onMeshImage(mi.getPointer(), player, m_vs, m_viewAff);
}

View file

@ -709,7 +709,8 @@ int ToonzScene::getFrameCount() const {
//-----------------------------------------------------------------------------
void ToonzScene::renderFrame(const TRaster32P &ras, int row, const TXsheet *xsh,
bool checkFlags) const {
bool checkFlags, bool forSceneIcon,
bool forReference) const {
if (xsh == 0) xsh = getXsheet();
TCamera *camera = xsh->getStageObjectTree()->getCurrentCamera();
@ -738,7 +739,9 @@ void ToonzScene::renderFrame(const TRaster32P &ras, int row, const TXsheet *xsh,
ImagePainter::VisualSettings vs;
vs.m_plasticVisualSettings.m_drawMeshesWireframe = false;
vs.m_forSceneIcon = true;
vs.m_forSceneIcon = forSceneIcon;
vs.m_forReference = forReference;
vs.m_sceneProperties = xsh->getScene()->getProperties();
Stage::RasterPainter painter(ras->getSize(), viewAff, clipRect, vs,
checkFlags);