diff --git a/js/materials/DMAMaterial.js b/js/materials/DMAMaterial.js index ae23b7f9d4fd2ef03ca8c74510517288b18e7152..218bb17acb8772dc4c673c56c212ce162abbf57a 100644 --- a/js/materials/DMAMaterial.js +++ b/js/materials/DMAMaterial.js @@ -5,8 +5,24 @@ define(['underscore', 'appState'], function(_, appState){ - function DMAMaterial(json, id){ + var materialNum = 0; + + function getNextMaterialNum(){ + return materialNum++; + } + + + function DMAMaterial(json, id){//todo defaults this.id = id; + + var defaults = { + name: "", + color: "#000000", + altColor: "#000000", + noDelete: false, + properties:{} + }; + json = _.extend(defaults, json); this.set(json); } @@ -16,6 +32,8 @@ define(['underscore', 'appState'], function(_, appState){ DMAMaterial.prototype.set = function(data){ + if (data.id) delete data.id;//cannot change id once set + //check if colors have changed var oldColor = this.color; var oldAltColor = this.altColor; @@ -25,13 +43,12 @@ define(['underscore', 'appState'], function(_, appState){ if (data[key] && data[key].x) self[key] = new THREE.Vector3(data[key].x, data[key].y, data[key].z); else self[key] = data[key]; }); + if (this.name === "") this.name = "Material " + getNextMaterialNum(); if (!this.threeMaterial || (data.color && oldColor != data.color) || (data.altColor && oldAltColor != data.altColor)) this.changeColorScheme();//don't need to set edited flag for this, render will handle it - if (data.noDelete === undefined) this.noDelete = false; - return false;//composite materials have edited flag to trigger upstream changes }; @@ -58,7 +75,7 @@ define(['underscore', 'appState'], function(_, appState){ DMAMaterial.prototype.getThreeMaterial = function(){ if (!this.threeMaterial) { - console.warn("no transparentMaterial found for material " + this.id); + console.warn("no transparentMaterial found for material " + this.getID()); return null; } return this.threeMaterial; @@ -66,7 +83,7 @@ define(['underscore', 'appState'], function(_, appState){ DMAMaterial.prototype.getTransparentMaterial = function(){ if (!this.transparentMaterial) { - console.warn("no transparentMaterial found for material " + this.id); + console.warn("no transparentMaterial found for material " + this.getID()); return null; } return this.transparentMaterial; @@ -80,6 +97,10 @@ define(['underscore', 'appState'], function(_, appState){ return false; }; + DMAMaterial.prototype.getName = function(){ + return this.name; + }; + DMAMaterial.prototype.getProperties = function(){ return this.properties; }; @@ -88,17 +109,18 @@ define(['underscore', 'appState'], function(_, appState){ return !this.noDelete; }; - DMAMaterial.prototype.clone = function(){ - return JSON.parse(JSON.stringify(this.toJSON())); - }; +// DMAMaterial.prototype.clone = function(){ +// return JSON.parse(JSON.stringify(this.toJSON())); +// }; DMAMaterial.prototype.toJSON = function(){ return { name: this.name, color: this.color, + id: this.getID(), altColor: this.altColor, noDelete: this.noDelete, - properties: this.properties + properties: this.getProperties() } }; diff --git a/js/materials/DMAMaterials.js b/js/materials/DMAMaterials.js index 76a0d5bbef0a9d6c7c3939e8f807a73eb4ca20d9..d8a6b3ed656a1943851ffac8ed478c986d406699 100644 --- a/js/materials/DMAMaterials.js +++ b/js/materials/DMAMaterials.js @@ -8,6 +8,7 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma var materialsList = { deleteMaterial: new DMAMaterial({ + name: "Delete", color: "#ff0000", altColor: "#ff0000", noDelete: true @@ -28,13 +29,19 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma - function newMaterial(data){ - - } - - //material objects edited through set() + function newMaterial(data, noAdd){ + if (data.sparseCells) { + console.warn("you are trying to init a composite material as a regular material"); + return null; + } + var id = data.id || getNextMaterialID(); + var material = new DMAMaterial(data, id); + if (noAdd) return material;//in the new material menu, you may init a material before saving changes + materialsList[id] = material; + return material; + } function deleteMaterial(id){ if (materialsList[id] === undefined){ @@ -53,26 +60,17 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma return deleted; } - function getMaterialForId(id, returnTHREEObject, transparent){ - var material = materialsList[id]; - if (!returnTHREEObject) return material; - if (!material){ - console.warn("no material object found for type "+ id); - return null; - } - if (transparent) return material.getTransparentMaterial(id); - return material.getThreeMaterial(id); + function getMaterialForId(id){ + return materialsList[id]; } - - - function setMaterial(id, data){ + var material = getMaterialForId(id); var edited = false; if (!material) { - materialsList[id] = new DMAMaterial(data, id); + newMaterial(data); return; } else { if (data.elementaryChildren) data.properties = getPropertiesFromChildren(data.elementaryChildren); @@ -94,19 +92,11 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma - var materialNameIndex = 1; - function getMaterialCopy(id){ - var material = getMaterialForId(id); - if (material) return material.clone(); - return { - name: "Material " + materialNameIndex++, - color: '#000000', - altColor: '#000000', - noDelete: false, - properties: {} - }; - } + + + + function getDeleteMaterial(){ return materialsList.deleteMaterial.threeMaterial; @@ -252,18 +242,18 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma } + return { list: materialsList, + newMaterial: newMaterial, setMaterial: setMaterial, deleteMaterial: deleteMaterial, getMaterialForId: getMaterialForId, - getMaterialCopy: getMaterialCopy, getCompositeKeys: getCompositeKeys, getVaildAvailableCompositeKeys: getVaildAvailableCompositeKeys, getChildCellTypes:getChildCellTypes, setToDefaultMaterial: setToDefaultMaterial, getDeleteMaterial: getDeleteMaterial, - getNextCompositeID: getNextCompositeID, - getNextMaterialID: getNextMaterialID + getNextCompositeID: getNextCompositeID }; }); \ No newline at end of file diff --git a/js/menus/MaterialEditorMenuView.js b/js/menus/MaterialEditorMenuView.js index 2b0608944a1c20e89220686655d27105597e43ac..7b08914c9ce31bf2dce20b5ba5cbdb2f97c4789a 100644 --- a/js/menus/MaterialEditorMenuView.js +++ b/js/menus/MaterialEditorMenuView.js @@ -15,15 +15,18 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi _initialize: function(options){ - var id = options.myObject; - if (!options.myObject) { + var materialID = options.myObject; + + if (!materialID) { console.warn("no editing material id passed in"); this.model.set("currentNav", plist.allMenus.navMaterial.parent); } - if (id == "new") id = materials.getNextMaterialID(); - this.materialID = id; - this.material = materials.getMaterialCopy(id); + var material = materials.getMaterialForId(materialID); + var json = {}; + if (material) json = material.toJSON(); + + this.material = materials.newMaterial(json, true); }, getPropertyOwner: function($target){ @@ -46,31 +49,26 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi _saveMaterialToFile: function(e){ e.preventDefault(); - fileSaver.saveMaterial(this.materialID, this.material); + fileSaver.saveMaterial(this.material); }, saveExitMenu: function(){ - if (this.material.name == "") this.material.name = "Material " + materials.getNextMaterialID(); - materials.setMaterial(this.materialID, _.clone(this.material)); + materials.setMaterial(this.material.getID(), this.material.toJSON()); return true; }, deleteExitMenu: function(){ - var deleted = materials.deleteMaterial(this.materialID); + var deleted = materials.deleteMaterial(this.material.getID()); return deleted; }, _makeTemplateJSON: function(){ - return _.extend(this.material); + return _.extend(this.material.toJSON()); }, _destroy: function(){ - var self = this; - _.each(_.keys(this.material), function(key){ - delete self.material[key]; - }); + if(this.material) this.material.destroy(); this.material = null; - this.materialID = null; }, template: _.template(template) diff --git a/js/models/FileSaver.js b/js/models/FileSaver.js index 9c62e776cb519ebc60e140dcbf180d3110986c38..8529d4ca78bfc301e275b7c235e152cab36c30f8 100644 --- a/js/models/FileSaver.js +++ b/js/models/FileSaver.js @@ -55,10 +55,10 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra _saveFile(seqArray, name || "seqs", "txt", true); } - function saveMaterial(id, material){ + function saveMaterial(material){ var data = {materials:{}}; - data.materials[id] = material || _getMaterialDataToSave(material); - _saveFile(data, data.materials[id].name, "json"); + data.materials[materials.getID()] = material.toJSON(); + _saveFile(data, material.getName(), "json"); } function saveMachineConfig(data){ @@ -78,14 +78,11 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra function _getMaterialsDataToSave(){ var data = {}; _.each(materials.list, function(material, key){ - data[key] = _getMaterialDataToSave(material); + data[key] = material.toJSON(); }); return data; } - function _getMaterialDataToSave(material){ - return material.toJSON(); - } function loadFile(data){//parsed json todo make this better - load composite if (data.assembler) {