Default color handling (switched off).
This commit is contained in:
parent
ca4e0ef1d4
commit
8a29a6c682
10
source/external/three.model.loader.js
vendored
10
source/external/three.model.loader.js
vendored
@ -12,16 +12,6 @@ OV.ThreeModelLoader = class
|
|||||||
this.callbacks = callbacks;
|
this.callbacks = callbacks;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetDefaultColor ()
|
|
||||||
{
|
|
||||||
return this.importer.GetDefaultColor ();
|
|
||||||
}
|
|
||||||
|
|
||||||
SetDefaultColor (defaultColor)
|
|
||||||
{
|
|
||||||
this.importer.SetDefaultColor (defaultColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
LoadFromUrlList (urls)
|
LoadFromUrlList (urls)
|
||||||
{
|
{
|
||||||
if (this.inProgress) {
|
if (this.inProgress) {
|
||||||
|
|||||||
@ -25,23 +25,6 @@ OV.Color = class
|
|||||||
this.b = b; // 0 .. 255
|
this.b = b; // 0 .. 255
|
||||||
}
|
}
|
||||||
|
|
||||||
ToHexString ()
|
|
||||||
{
|
|
||||||
function IntegerToHex (intVal)
|
|
||||||
{
|
|
||||||
let result = parseInt (intVal, 10).toString (16);
|
|
||||||
while (result.length < 2) {
|
|
||||||
result = '0' + result;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
let r = IntegerToHex (this.r);
|
|
||||||
let g = IntegerToHex (this.g);
|
|
||||||
let b = IntegerToHex (this.b);
|
|
||||||
return r + g + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
Clone ()
|
Clone ()
|
||||||
{
|
{
|
||||||
return new OV.Color (this.r, this.g, this.b);
|
return new OV.Color (this.r, this.g, this.b);
|
||||||
@ -253,3 +236,37 @@ OV.Triangle = class
|
|||||||
return cloned;
|
return cloned;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
OV.ColorToHexString = function (color)
|
||||||
|
{
|
||||||
|
function IntegerToHex (intVal)
|
||||||
|
{
|
||||||
|
let result = parseInt (intVal, 10).toString (16);
|
||||||
|
while (result.length < 2) {
|
||||||
|
result = '0' + result;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
let r = IntegerToHex (color.r);
|
||||||
|
let g = IntegerToHex (color.g);
|
||||||
|
let b = IntegerToHex (color.b);
|
||||||
|
return r + g + b;
|
||||||
|
};
|
||||||
|
|
||||||
|
OV.HexStringToColor = function (hexString)
|
||||||
|
{
|
||||||
|
if (hexString.length !== 6) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let r = parseInt (hexString.substr (0, 2), 16);
|
||||||
|
let g = parseInt (hexString.substr (2, 2), 16);
|
||||||
|
let b = parseInt (hexString.substr (4, 2), 16);
|
||||||
|
return new OV.Color (r, g, b);
|
||||||
|
};
|
||||||
|
|
||||||
|
OV.ColorIsEqual = function (a, b)
|
||||||
|
{
|
||||||
|
return a.r === b.r && a.g === b.g && a.b === b.b;
|
||||||
|
};
|
||||||
|
|||||||
@ -199,10 +199,9 @@ OV.CreateUrlParser = function (urlParams)
|
|||||||
return new OV.ParameterListParser (urlParams, '$');
|
return new OV.ParameterListParser (urlParams, '$');
|
||||||
};
|
};
|
||||||
|
|
||||||
OV.CreateUrlParameters = function (urls, camera)
|
OV.CreateModelUrlParameters = function (urls)
|
||||||
{
|
{
|
||||||
let builder = OV.CreateUrlBuilder ();
|
let builder = OV.CreateUrlBuilder ();
|
||||||
builder.AddModelUrls (urls);
|
builder.AddModelUrls (urls);
|
||||||
builder.AddCamera (camera);
|
|
||||||
return builder.GetParameterList ();
|
return builder.GetParameterList ();
|
||||||
};
|
};
|
||||||
|
|||||||
@ -70,7 +70,8 @@ OV.Init3DViewerElements = function ()
|
|||||||
if (colorParams) {
|
if (colorParams) {
|
||||||
let color = OV.ParameterConverter.StringToColor (colorParams);
|
let color = OV.ParameterConverter.StringToColor (colorParams);
|
||||||
if (color !== null) {
|
if (color !== null) {
|
||||||
loader.SetDefaultColor (color);
|
let importer = loader.GetImporter ();
|
||||||
|
importer.SetDefaultColor (color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -150,3 +150,19 @@ describe ('Model Finalization', function() {
|
|||||||
assert.strictEqual (normal.z, 0.7071067811865475);
|
assert.strictEqual (normal.z, 0.7071067811865475);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe ('Color Conversion', function() {
|
||||||
|
it ('Color equality check', function () {
|
||||||
|
assert (OV.ColorIsEqual (new OV.Color (10, 20, 30), new OV.Color (10, 20, 30)));
|
||||||
|
assert (!OV.ColorIsEqual (new OV.Color (10, 20, 30), new OV.Color (11, 20, 30)));
|
||||||
|
assert (!OV.ColorIsEqual (new OV.Color (10, 20, 30), new OV.Color (10, 21, 30)));
|
||||||
|
assert (!OV.ColorIsEqual (new OV.Color (10, 20, 30), new OV.Color (10, 20, 31)));
|
||||||
|
});
|
||||||
|
|
||||||
|
it ('Color hex string conversion', function () {
|
||||||
|
let color = new OV.Color (10, 20, 30);
|
||||||
|
let hexString = '0a141e';
|
||||||
|
assert.strictEqual (OV.ColorToHexString (color), hexString);
|
||||||
|
assert.deepStrictEqual (OV.HexStringToColor (hexString), color);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@ -1,3 +1,8 @@
|
|||||||
|
OV.FeatureSet =
|
||||||
|
{
|
||||||
|
SetDefaultColor : false
|
||||||
|
};
|
||||||
|
|
||||||
OV.ProgressDialog = class
|
OV.ProgressDialog = class
|
||||||
{
|
{
|
||||||
constructor ()
|
constructor ()
|
||||||
@ -287,13 +292,28 @@ OV.ShowExportDialog = function (model)
|
|||||||
|
|
||||||
OV.ShowEmbeddingDialog = function (importer, camera)
|
OV.ShowEmbeddingDialog = function (importer, camera)
|
||||||
{
|
{
|
||||||
function GetEmbeddingCode (files, camera, useCameraCheck)
|
function AddCheckboxLine (parentDiv, text, onChange)
|
||||||
{
|
{
|
||||||
|
let line = $('<div>').addClass ('ov_dialog_table_row').appendTo (parentDiv);
|
||||||
|
let check = $('<input>').attr ('type', 'checkbox').attr ('checked', 'true').appendTo (line);
|
||||||
|
$('<span>').html (text).appendTo (line);
|
||||||
|
check.change (function () {
|
||||||
|
onChange (check.prop ('checked'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetEmbeddingCode (params)
|
||||||
|
{
|
||||||
|
let builder = OV.CreateUrlBuilder ();
|
||||||
|
builder.AddModelUrls (params.files);
|
||||||
|
builder.AddCamera (params.camera);
|
||||||
|
builder.AddColor (params.color);
|
||||||
|
let hashParameters = builder.GetParameterList ();
|
||||||
|
|
||||||
let embeddingCode = '';
|
let embeddingCode = '';
|
||||||
embeddingCode += '<iframe';
|
embeddingCode += '<iframe';
|
||||||
embeddingCode += ' width="640" height="480"';
|
embeddingCode += ' width="640" height="480"';
|
||||||
embeddingCode += ' style="border:1px solid #eeeeee;"';
|
embeddingCode += ' style="border:1px solid #eeeeee;"';
|
||||||
let hashParameters = OV.CreateUrlParameters (files, useCameraCheck.get (0).checked ? camera : null);
|
|
||||||
embeddingCode += ' src="https://3dviewer.net/embed.html#' + hashParameters + '">';
|
embeddingCode += ' src="https://3dviewer.net/embed.html#' + hashParameters + '">';
|
||||||
embeddingCode += '</iframe>';
|
embeddingCode += '</iframe>';
|
||||||
return embeddingCode;
|
return embeddingCode;
|
||||||
@ -314,6 +334,12 @@ OV.ShowEmbeddingDialog = function (importer, camera)
|
|||||||
modelFiles.push (file.fileUrl);
|
modelFiles.push (file.fileUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let embeddingParams = {
|
||||||
|
files : modelFiles,
|
||||||
|
camera : camera,
|
||||||
|
color : null
|
||||||
|
};
|
||||||
|
|
||||||
let dialog = new OV.ButtonDialog ();
|
let dialog = new OV.ButtonDialog ();
|
||||||
let urlsTextArea = $('<textarea>').attr ('readonly', 'true').addClass ('ov_dialog_textarea');
|
let urlsTextArea = $('<textarea>').attr ('readonly', 'true').addClass ('ov_dialog_textarea');
|
||||||
let contentDiv = dialog.Init ('Embedding', [
|
let contentDiv = dialog.Init ('Embedding', [
|
||||||
@ -324,19 +350,25 @@ OV.ShowEmbeddingDialog = function (importer, camera)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let text = 'Embedding options:';
|
let text = 'Embedding options:';
|
||||||
$('<div>').html (text).addClass ('ov_dialog_section').appendTo (contentDiv);
|
$('<div>').html (text).addClass ('ov_dialog_section').appendTo (contentDiv);
|
||||||
let optionsSection = $('<div>').addClass ('ov_dialog_section').appendTo (contentDiv);
|
let optionsSection = $('<div>').addClass ('ov_dialog_section').appendTo (contentDiv);
|
||||||
let useCameraLine = $('<div>').appendTo (optionsSection);
|
|
||||||
let useCamera = $('<input>').attr ('type', 'checkbox').attr ('checked', 'true').appendTo (useCameraLine);
|
AddCheckboxLine (optionsSection, 'Use current camera position', function (checked) {
|
||||||
$('<span>').html ('Use current camera position').appendTo (useCameraLine);
|
embeddingParams.camera = checked ? camera : null;
|
||||||
useCamera.change (function () {
|
urlsTextArea.val (GetEmbeddingCode (embeddingParams));
|
||||||
let newEmbeddingCode = GetEmbeddingCode (modelFiles, camera, useCamera);
|
|
||||||
urlsTextArea.val (newEmbeddingCode);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let embeddingCode = GetEmbeddingCode (modelFiles, camera, useCamera);
|
if (OV.FeatureSet.SetDefaultColor) {
|
||||||
urlsTextArea.val (embeddingCode);
|
AddCheckboxLine (optionsSection, 'Use overridden default color', function (checked) {
|
||||||
|
embeddingParams.color = checked ? importer.GetDefaultColor () : null;
|
||||||
|
urlsTextArea.val (GetEmbeddingCode (embeddingParams));
|
||||||
|
});
|
||||||
|
embeddingParams.color = importer.GetDefaultColor ();
|
||||||
|
}
|
||||||
|
|
||||||
|
urlsTextArea.val (GetEmbeddingCode (embeddingParams));
|
||||||
|
|
||||||
urlsTextArea.appendTo (contentDiv);
|
urlsTextArea.appendTo (contentDiv);
|
||||||
let copyToClipboardText = 'copy to clipboard';
|
let copyToClipboardText = 'copy to clipboard';
|
||||||
@ -359,6 +391,42 @@ OV.ShowEmbeddingDialog = function (importer, camera)
|
|||||||
return dialog;
|
return dialog;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
OV.ShowSettingsDialog = function (importer, onOk)
|
||||||
|
{
|
||||||
|
let settings = {
|
||||||
|
defaultColor : importer.GetDefaultColor ()
|
||||||
|
};
|
||||||
|
let dialog = new OV.ButtonDialog ();
|
||||||
|
let contentDiv = dialog.Init ('Settings', [
|
||||||
|
{
|
||||||
|
name : 'Cancel',
|
||||||
|
subClass : 'outline',
|
||||||
|
onClick () {
|
||||||
|
dialog.Hide ();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name : 'OK',
|
||||||
|
onClick () {
|
||||||
|
dialog.Hide ();
|
||||||
|
onOk (settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
let colorRow = $('<div>').addClass ('ov_dialog_table_row').appendTo (contentDiv);
|
||||||
|
$('<div>').html ('Default Color').addClass ('ov_dialog_table_row_name').appendTo (colorRow);
|
||||||
|
let valueColumn = $('<div>').addClass ('ov_dialog_table_row_value').appendTo (colorRow);
|
||||||
|
let colorInput = $('<input>').attr ('type', 'color').addClass ('ov_dialog_color').appendTo (valueColumn);
|
||||||
|
colorInput.val ('#' + OV.ColorToHexString (settings.defaultColor));
|
||||||
|
colorInput.change (function () {
|
||||||
|
let colorStr = colorInput.val ().substr (1);
|
||||||
|
settings.defaultColor = OV.HexStringToColor (colorStr);
|
||||||
|
});
|
||||||
|
dialog.Show ();
|
||||||
|
return dialog;
|
||||||
|
};
|
||||||
|
|
||||||
OV.ShowListPopup = function (button, items, callbacks)
|
OV.ShowListPopup = function (button, items, callbacks)
|
||||||
{
|
{
|
||||||
let popup = new OV.ListPopup ();
|
let popup = new OV.ListPopup ();
|
||||||
|
|||||||
@ -21,7 +21,7 @@ OV.Embed = class
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.modelLoader.LoadFromUrlList (urls);
|
this.modelLoader.LoadFromUrlList (urls);
|
||||||
let hashParameters = OV.CreateUrlParameters (urls, null);
|
let hashParameters = OV.CreateModelUrlParameters (urls);
|
||||||
let websiteUrl = this.parameters.websiteLinkDiv.attr ('href') + '#' + hashParameters;
|
let websiteUrl = this.parameters.websiteLinkDiv.attr ('href') + '#' + hashParameters;
|
||||||
this.parameters.websiteLinkDiv.attr ('href', websiteUrl);
|
this.parameters.websiteLinkDiv.attr ('href', websiteUrl);
|
||||||
}
|
}
|
||||||
@ -74,7 +74,8 @@ OV.Embed = class
|
|||||||
});
|
});
|
||||||
let color = this.hashHandler.GetColorFromHash ();
|
let color = this.hashHandler.GetColorFromHash ();
|
||||||
if (color !== null) {
|
if (color !== null) {
|
||||||
this.modelLoader.SetDefaultColor (color);
|
let importer = this.modelLoader.GetImporter ();
|
||||||
|
importer.SetDefaultColor (color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -36,7 +36,7 @@ OV.HashHandler = class
|
|||||||
|
|
||||||
SetModelFilesToHash (files)
|
SetModelFilesToHash (files)
|
||||||
{
|
{
|
||||||
let params = OV.CreateUrlParameters (files, null);
|
let params = OV.CreateModelUrlParameters (files);
|
||||||
this.SetHash (params);
|
this.SetHash (params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -51,7 +51,7 @@ OV.InfoPanel = class
|
|||||||
|
|
||||||
let infoContainer = $('<div>').addClass ('ov_info_box').appendTo (contentDiv);
|
let infoContainer = $('<div>').addClass ('ov_info_box').appendTo (contentDiv);
|
||||||
AddRow (infoContainer, 'Color', function (valueDiv) {
|
AddRow (infoContainer, 'Color', function (valueDiv) {
|
||||||
let colorString = '#' + info.diffuse.ToHexString ();
|
let colorString = '#' + OV.ColorToHexString (info.diffuse);
|
||||||
$('<div>').addClass ('ov_info_box_rgbbox').css ('background', colorString).attr ('title', colorString).appendTo (valueDiv);
|
$('<div>').addClass ('ov_info_box_rgbbox').css ('background', colorString).attr ('title', colorString).appendTo (valueDiv);
|
||||||
$('<div>').addClass ('ov_info_box_rgbtext').html (colorString).attr ('title', colorString).appendTo (valueDiv);
|
$('<div>').addClass ('ov_info_box_rgbtext').html (colorString).attr ('title', colorString).appendTo (valueDiv);
|
||||||
});
|
});
|
||||||
@ -128,7 +128,7 @@ OV.InfoPanel = class
|
|||||||
let materialInfo = getMaterialInfo (info.usedMaterials[i]);
|
let materialInfo = getMaterialInfo (info.usedMaterials[i]);
|
||||||
materialItems.push ({
|
materialItems.push ({
|
||||||
name : OV.GetMaterialName (materialInfo.name),
|
name : OV.GetMaterialName (materialInfo.name),
|
||||||
color : materialInfo.diffuse.ToHexString ()
|
color : OV.ColorToHexString (materialInfo.diffuse)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -468,6 +468,12 @@ div.ov_dialog select.ov_dialog_select
|
|||||||
appearance: none;
|
appearance: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.ov_dialog input.ov_dialog_color
|
||||||
|
{
|
||||||
|
width: 36px;
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
div.ov_dialog div.ov_dialog_file_list
|
div.ov_dialog div.ov_dialog_file_list
|
||||||
{
|
{
|
||||||
max-height: 105px;
|
max-height: 105px;
|
||||||
@ -508,6 +514,23 @@ div.ov_dialog div.ov_dialog_inner_button
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.ov_dialog div.ov_dialog_table_row
|
||||||
|
{
|
||||||
|
padding: 2px 0px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.ov_dialog div.ov_dialog_table_row_name
|
||||||
|
{
|
||||||
|
width: 120px;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.ov_dialog div.ov_dialog_table_row_value
|
||||||
|
{
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
div.ov_popup
|
div.ov_popup
|
||||||
{
|
{
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
|
|||||||
@ -169,6 +169,11 @@ OV.Website = class
|
|||||||
this.ClearHashIfNotOnlyUrlList ();
|
this.ClearHashIfNotOnlyUrlList ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReloadFiles ()
|
||||||
|
{
|
||||||
|
this.modelLoader.ReloadFiles ();
|
||||||
|
}
|
||||||
|
|
||||||
ClearHashIfNotOnlyUrlList ()
|
ClearHashIfNotOnlyUrlList ()
|
||||||
{
|
{
|
||||||
let importer = this.modelLoader.GetImporter ();
|
let importer = this.modelLoader.GetImporter ();
|
||||||
@ -233,6 +238,8 @@ OV.Website = class
|
|||||||
}
|
}
|
||||||
|
|
||||||
let obj = this;
|
let obj = this;
|
||||||
|
let importer = this.modelLoader.GetImporter ();
|
||||||
|
|
||||||
AddButton (this.toolbar, 'open', 'Open model from your device', false, function () {
|
AddButton (this.toolbar, 'open', 'Open model from your device', false, function () {
|
||||||
obj.OpenFileBrowserDialog ();
|
obj.OpenFileBrowserDialog ();
|
||||||
});
|
});
|
||||||
@ -269,8 +276,23 @@ OV.Website = class
|
|||||||
obj.dialog = OV.ShowExportDialog (obj.model);
|
obj.dialog = OV.ShowExportDialog (obj.model);
|
||||||
});
|
});
|
||||||
AddButton (this.toolbar, 'embed', 'Get embedding code', true, function () {
|
AddButton (this.toolbar, 'embed', 'Get embedding code', true, function () {
|
||||||
obj.dialog = OV.ShowEmbeddingDialog (obj.modelLoader.GetImporter (), obj.viewer.GetCamera ());
|
obj.dialog = OV.ShowEmbeddingDialog (importer, obj.viewer.GetCamera ());
|
||||||
});
|
});
|
||||||
|
if (OV.FeatureSet.SetDefaultColor) {
|
||||||
|
AddSeparator (this.toolbar, true);
|
||||||
|
AddButton (this.toolbar, 'export', 'Settings', true, function () {
|
||||||
|
obj.dialog = OV.ShowSettingsDialog (importer, function (settings) {
|
||||||
|
let reload = false;
|
||||||
|
if (!OV.ColorIsEqual (importer.GetDefaultColor (), settings.defaultColor)) {
|
||||||
|
importer.SetDefaultColor (settings.defaultColor);
|
||||||
|
reload = true;
|
||||||
|
}
|
||||||
|
if (reload) {
|
||||||
|
obj.ReloadFiles ();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.parameters.fileInput.on ('change', function (ev) {
|
this.parameters.fileInput.on ('change', function (ev) {
|
||||||
obj.LoadModelFromFileList (ev.target.files);
|
obj.LoadModelFromFileList (ev.target.files);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user