diff --git a/src/common/ml_shared_data_context.cpp b/src/common/ml_shared_data_context.cpp index d625efd78..0647cb616 100644 --- a/src/common/ml_shared_data_context.cpp +++ b/src/common/ml_shared_data_context.cpp @@ -475,7 +475,51 @@ void MLSceneGLSharedDataContext::doneCurrentGLContext( QGLContext* oldone /*= NU oldone->makeCurrent(); } +void MLPoliciesStandAloneFunctions::computeRequestedRenderingDataCompatibleWithMeshSameGLOpts(MeshModel* meshmodel, const MLRenderingData& inputdt, MLRenderingData& outputdt) +{ + if (meshmodel == NULL) + return; + CMeshO& mesh = meshmodel->cm; + if (mesh.VN() == 0) + { + outputdt.reset(false); + return; + } + bool validfaces = (mesh.FN() > 0); + MLRenderingData::PRIMITIVE_MODALITY_MASK tmpoutputpm = inputdt.getPrimitiveModalityMask(); + for (size_t pmind = 0; pmind < size_t(MLRenderingData::PR_ARITY); ++pmind) + { + MLRenderingData::PRIMITIVE_MODALITY pmc = MLRenderingData::PRIMITIVE_MODALITY(pmind); + + + MLRenderingData::RendAtts tmpoutputatts; + if (inputdt.get(MLRenderingData::PRIMITIVE_MODALITY(pmind), tmpoutputatts)) + { + tmpoutputatts[MLRenderingData::ATT_NAMES::ATT_VERTPOSITION] &= meshmodel->hasDataMask(MeshModel::MM_VERTCOORD); + tmpoutputatts[MLRenderingData::ATT_NAMES::ATT_VERTNORMAL] &= meshmodel->hasDataMask(MeshModel::MM_VERTNORMAL); + tmpoutputatts[MLRenderingData::ATT_NAMES::ATT_FACENORMAL] &= validfaces && meshmodel->hasDataMask(MeshModel::MM_FACENORMAL); + tmpoutputatts[MLRenderingData::ATT_NAMES::ATT_VERTCOLOR] &= meshmodel->hasDataMask(MeshModel::MM_VERTCOLOR); + tmpoutputatts[MLRenderingData::ATT_NAMES::ATT_FACECOLOR] &= validfaces && meshmodel->hasDataMask(MeshModel::MM_FACECOLOR); + + //horrible trick caused by MeshLab GUI. In MeshLab exists just a button turning on/off the texture visualization. + //Unfortunately the RenderMode::textureMode member field is not just a boolean value but and enum one. + //The enum-value depends from the enabled attributes of input mesh. + bool wedgetexture = meshmodel->hasDataMask(MeshModel::MM_WEDGTEXCOORD); + tmpoutputatts[MLRenderingData::ATT_NAMES::ATT_VERTTEXTURE] &= (meshmodel->hasDataMask(MeshModel::MM_VERTTEXCOORD) && (!wedgetexture)); + tmpoutputatts[MLRenderingData::ATT_NAMES::ATT_WEDGETEXTURE] &= validfaces && wedgetexture; + if (MLPoliciesStandAloneFunctions::isPrimitiveModalityCompatibleWithMesh(meshmodel, pmc)) + outputdt.set(pmc, tmpoutputatts); + } + else + throw MLException(QString("MLPoliciesStandAloneFunctions: trying to access to a non defined PRIMITIVE_MODALITY!")); + + + } + MLPerViewGLOptions opts; + inputdt.get(opts); + outputdt.set(opts); +} void MLPoliciesStandAloneFunctions::computeRequestedRenderingDataCompatibleWithMesh( MeshModel* meshmodel,const MLRenderingData& inputdt,MLRenderingData& outputdt) { diff --git a/src/common/ml_shared_data_context.h b/src/common/ml_shared_data_context.h index a43d2783f..c501fc2a5 100644 --- a/src/common/ml_shared_data_context.h +++ b/src/common/ml_shared_data_context.h @@ -180,7 +180,10 @@ public: struct MLPoliciesStandAloneFunctions { - static void computeRequestedRenderingDataCompatibleWithMesh( MeshModel* meshmodel,const MLRenderingData& inputdt,MLRenderingData& outputdt); + /*WARNING!!!!! TEMPORARY!!! TO BE DELETED*/ + static void computeRequestedRenderingDataCompatibleWithMeshSameGLOpts(MeshModel * meshmodel, const MLRenderingData & inputdt, MLRenderingData & outputdt); + + static void computeRequestedRenderingDataCompatibleWithMesh( MeshModel* meshmodel,const MLRenderingData& inputdt,MLRenderingData& outputdt); static void fromMeshModelMaskToMLRenderingAtts(int meshmodelmask,MLRenderingData::RendAtts& atts); diff --git a/src/meshlab/mainwindow_RunTime.cpp b/src/meshlab/mainwindow_RunTime.cpp index 725cbbb74..7c82bc834 100644 --- a/src/meshlab/mainwindow_RunTime.cpp +++ b/src/meshlab/mainwindow_RunTime.cpp @@ -3467,7 +3467,7 @@ void MainWindow::updateRenderingDataAccordingToActionsCommonCode(int meshid, con } MeshModel* mm = meshDoc()->getMesh(meshid); if (mm != NULL) - MLPoliciesStandAloneFunctions::computeRequestedRenderingDataCompatibleWithMesh(mm, dt, dt); + MLPoliciesStandAloneFunctions::computeRequestedRenderingDataCompatibleWithMeshSameGLOpts(mm, dt, dt); setRenderingData(meshid, dt); /*if (meshid == -1) @@ -3507,37 +3507,32 @@ void MainWindow::updateRenderingDataAccordingToActions(int meshid, MLRenderingAc if ((meshDoc() == NULL) || (act == NULL)) return; - if (meshid != -1) - updateRenderingDataAccordingToActionsCommonCode(meshid, acts); - else + QList tmpacts; + for (int ii = 0; ii < acts.size(); ++ii) { - QList tmpacts; - for (int ii = 0; ii < acts.size(); ++ii) + if (acts[ii] != NULL) { - if (acts[ii] != NULL) - { - MLRenderingAction* sisteract = NULL; - acts[ii]->createSisterAction(sisteract, NULL); - sisteract->setChecked(acts[ii] == act); - tmpacts.push_back(sisteract); - } + MLRenderingAction* sisteract = NULL; + acts[ii]->createSisterAction(sisteract, NULL); + sisteract->setChecked(acts[ii] == act); + tmpacts.push_back(sisteract); } - - for (int hh = 0; hh < meshDoc()->meshList.size(); ++hh) - { - if (meshDoc()->meshList[hh] != NULL) - updateRenderingDataAccordingToActionsCommonCode(meshDoc()->meshList[hh]->id(), tmpacts); - } - - for (int ii = 0; ii < tmpacts.size(); ++ii) - delete tmpacts[ii]; - tmpacts.clear(); } + + for (int hh = 0; hh < meshDoc()->meshList.size(); ++hh) + { + if (meshDoc()->meshList[hh] != NULL) + updateRenderingDataAccordingToActionsCommonCode(meshDoc()->meshList[hh]->id(), tmpacts); + } + + for (int ii = 0; ii < tmpacts.size(); ++ii) + delete tmpacts[ii]; + tmpacts.clear(); + if (GLA() != NULL) GLA()->update(); - if (meshid == -1) - updateLayerDialog(); + updateLayerDialog(); } @@ -3554,7 +3549,7 @@ void MainWindow::updateRenderingDataAccordingToActionCommonCode(int meshid, MLRe act->updateRenderingData(dt); MeshModel* mm = meshDoc()->getMesh(meshid); if (mm != NULL) - MLPoliciesStandAloneFunctions::computeRequestedRenderingDataCompatibleWithMesh(mm, dt, dt); + MLPoliciesStandAloneFunctions::computeRequestedRenderingDataCompatibleWithMeshSameGLOpts(mm, dt, dt); setRenderingData(meshid, dt); if (mm != NULL) {