Export only the visible meshes #169

This commit is contained in:
kovacsv 2021-12-26 14:08:58 +01:00
parent 4e7d10b3b7
commit 93358e2cd0
9 changed files with 92 additions and 38 deletions

View File

@ -17,7 +17,7 @@ OV.Exporter = class
this.exporters.push (exporter);
}
Export (exporterModel, format, extension, callbacks)
Export (model, settings, format, extension, callbacks)
{
let exporter = null;
for (let i = 0; i < this.exporters.length; i++) {
@ -32,6 +32,7 @@ OV.Exporter = class
return;
}
let exporterModel = new OV.ExporterModel (model, settings);
exporter.Export (exporterModel, format, (files) => {
if (files.length === 0) {
callbacks.onError ();

View File

@ -1,19 +1,25 @@
OV.ExporterModel = class
OV.ExporterSettings = class
{
constructor (model, parameters)
constructor (settings)
{
this.model = model;
this.parameters = {
isMeshVisible : (meshInstanceId) => {
return true;
}
this.isMeshVisible = (meshInstanceId) => {
return true;
};
if (OV.IsDefined (parameters)) {
if (OV.IsDefined (parameters.isMeshVisible)) {
this.parameters.isMeshVisible = parameters.isMeshVisible;
if (OV.IsDefined (settings)) {
if (OV.IsDefined (settings.isMeshVisible)) {
this.isMeshVisible = settings.isMeshVisible;
}
}
}
};
OV.ExporterModel = class
{
constructor (model, settings)
{
this.model = model;
this.settings = settings;
}
MaterialCount ()
{
@ -43,10 +49,19 @@ OV.ExporterModel = class
return triangleCount;
}
MeshInstanceCount ()
{
let meshInstanceCount = 0;
this.EnumerateMeshInstances ((meshInstance) => {
meshInstanceCount += 1;
});
return meshInstanceCount;
}
EnumerateMeshInstances (onMeshInstance)
{
this.model.EnumerateMeshInstances ((meshInstance) => {
if (this.parameters.isMeshVisible (meshInstance.GetId ())) {
if (this.settings.isMeshVisible (meshInstance.GetId ())) {
onMeshInstance (meshInstance);
}
});

View File

@ -123,10 +123,27 @@ OV.AddRadioButton = function (parentElement, name, id, text, onChange)
radio.setAttribute ('id', id);
radio.setAttribute ('name', name);
OV.AddDomElement (label, 'span', null, text);
radio.addEventListener ('change', onChange);
if (onChange) {
radio.addEventListener ('change', onChange);
}
return radio;
};
OV.AddCheckbox = function (parentElement, id, text, isChecked, onChange)
{
let label = OV.AddDomElement (parentElement, 'label');
label.setAttribute ('for', id);
let check = OV.AddDomElement (label, 'input', 'ov_checkbox');
check.setAttribute ('type', 'checkbox');
check.setAttribute ('checked', isChecked);
check.setAttribute ('id', id);
OV.AddDomElement (label, 'span', null, text);
if (onChange) {
check.addEventListener ('change', onChange);
}
return check;
};
OV.AddRangeSlider = function (parentElement, min, max)
{
let slider = OV.AddDomElement (parentElement, 'input', 'ov_slider');

View File

@ -65,8 +65,8 @@ function CreateTestModel ()
function Export (model, format, extension, onReady)
{
let exporter = new OV.Exporter ();
let exporterModel = new OV.ExporterModel (model);
exporter.Export (exporterModel, format, extension, {
let settings = new OV.ExporterSettings ();
exporter.Export (model, settings, format, extension, {
onSuccess : function (files) {
onReady (files);
}
@ -76,7 +76,8 @@ function Export (model, format, extension, onReady)
describe ('Exporter Model', function () {
it ('No filter test', function (done) {
let model = CreateTestModel ();
let exporterModel = new OV.ExporterModel (model);
let settings = new OV.ExporterSettings ();
let exporterModel = new OV.ExporterModel (model, settings);
let meshInstances = [];
exporterModel.EnumerateMeshInstances ((meshInstance) => {
meshInstances.push (meshInstance);
@ -89,11 +90,12 @@ describe ('Exporter Model', function () {
it ('Model filter test', function (done) {
let model = CreateTestModel ();
let exporterModel = new OV.ExporterModel (model, {
let settings = new OV.ExporterSettings ({
isMeshVisible : (meshInstanceId) => {
return meshInstanceId.IsEqual (new OV.MeshInstanceId (0, 1));
}
});
let exporterModel = new OV.ExporterModel (model, settings);
let meshInstances = [];
exporterModel.EnumerateMeshInstances ((meshInstance) => {
meshInstances.push (meshInstance);
@ -109,8 +111,8 @@ describe ('Exporter', function () {
it ('Exporter Error', function (done) {
let model = CreateTestModel ();
let exporter = new OV.Exporter ();
let exporterModel = new OV.ExporterModel (model);
exporter.Export (exporterModel, OV.FileFormat.Text, 'ext', {
let settings = new OV.ExporterSettings ();
exporter.Export (model, settings, OV.FileFormat.Text, 'ext', {
onError : function () {
done ();
}

View File

@ -109,8 +109,8 @@ function CreateTestModel ()
function ExportImport (model, format, extension, onReady)
{
let exporter = new OV.Exporter ();
let exporterModel = new OV.ExporterModel (model);
exporter.Export (exporterModel, format, extension, {
let settings = new OV.ExporterSettings ();
exporter.Export (model, settings, format, extension, {
onSuccess : function (exportedFiles) {
let importer = new OV.Importer ();
let settings = new OV.ImportSettings ();

View File

@ -132,6 +132,8 @@ select.ov_select
{
color: var(--ov_dialog_foreground_color);
background: var(--ov_dialog_background_color);
font-family: Quicksand, Helvetica, sans-serif;
font-size: 16px;
padding: 3px;
border: 1px solid var(--ov_border_color);
}

View File

@ -160,13 +160,14 @@ div.ov_dialog div.ov_dialog_copyable_input div.ov_dialog_copyable_input_button
div.ov_dialog div.ov_dialog_row
{
padding: 2px 0px;
padding: 3px 0px;
overflow: auto;
}
div.ov_dialog div.ov_dialog_row_name
{
width: 30%;
margin-top: 4px;
float: left;
}

View File

@ -34,6 +34,7 @@ OV.ModelExporterUI = class extends OV.ExporterUI
super (name);
this.format = format;
this.extension = extension;
this.visibleOnlyCheckbox = null;
}
GetType ()
@ -41,21 +42,43 @@ OV.ModelExporterUI = class extends OV.ExporterUI
return OV.ExportType.Model;
}
GenerateParametersUI (parametersDiv)
{
let line = OV.AddDiv (parametersDiv, 'ov_dialog_row');
this.visibleOnlyCheckbox = OV.AddCheckbox (line, 'export_visible_only', 'Export visible meshes only', true);
}
ExportModel (model, callbacks)
{
let visibleOnly = this.visibleOnlyCheckbox.checked;
let settings = new OV.ExporterSettings ({
isMeshVisible : (meshInstanceId) => {
if (visibleOnly) {
return callbacks.isMeshVisible (meshInstanceId);
} else {
return true;
}
}
});
// TODO
// if (exporterModel.MeshInstanceCount () === 0) {
// let errorDialog = OV.ShowMessageDialog (
// 'Export Failed',
// 'The model doesn\'t contain any meshes.',
// null
// );
// callbacks.onDialog (errorDialog);
// return;
// }
let progressDialog = new OV.ProgressDialog ();
progressDialog.Init ('Exporting Model');
progressDialog.Show ();
OV.RunTaskAsync (() => {
let exporter = new OV.Exporter ();
let exporterModel = new OV.ExporterModel (model, {
isMeshVisible : (meshInstanceId) => {
// TODO return callbacks.isMeshVisible (meshInstanceId);
return true;
}
});
exporter.Export (exporterModel, this.format, this.extension, {
exporter.Export (model, settings, this.format, this.extension, {
onError : () => {
progressDialog.Hide ();
},

View File

@ -3,15 +3,8 @@ OV.ShowSharingDialog = function (importer, settings, camera)
function AddCheckboxLine (parentDiv, text, id, onChange)
{
let line = OV.AddDiv (parentDiv, 'ov_dialog_row');
let label = OV.AddDomElement (line, 'label');
label.setAttribute ('for', id);
let check = OV.AddDomElement (label, 'input', 'ov_checkbox');
check.setAttribute ('type', 'checkbox');
check.setAttribute ('checked', 'true');
check.setAttribute ('id', id);
OV.AddDomElement (label, 'span', null, text);
check.addEventListener ('change', () => {
onChange (check.checked);
let checkbox = OV.AddCheckbox (line, id, text, true, () => {
onChange (checkbox.checked);
});
}