migrate materials from userData to materialData

This commit is contained in:
SamGondelman 2018-04-09 12:49:03 -07:00
parent ae0af3ab62
commit 9b07880aab
12 changed files with 296 additions and 43 deletions

View file

@ -363,6 +363,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_POS, materialMappingPos); CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_POS, materialMappingPos);
CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_SCALE, materialMappingScale); CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_SCALE, materialMappingScale);
CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_ROT, materialMappingRot); CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_ROT, materialMappingRot);
CHECK_PROPERTY_CHANGE(PROP_MATERIAL_DATA, materialData);
// Certifiable Properties // Certifiable Properties
CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName); CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName);
@ -1376,6 +1377,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_MAPPING_POS, materialMappingPos); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_MAPPING_POS, materialMappingPos);
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_MAPPING_SCALE, materialMappingScale); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_MAPPING_SCALE, materialMappingScale);
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_MAPPING_ROT, materialMappingRot); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_MAPPING_ROT, materialMappingRot);
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_DATA, materialData);
} }
/**jsdoc /**jsdoc
@ -1539,6 +1541,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool
COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingPos, glmVec2, setMaterialMappingPos); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingPos, glmVec2, setMaterialMappingPos);
COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingScale, glmVec2, setMaterialMappingScale); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingScale, glmVec2, setMaterialMappingScale);
COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingRot, float, setMaterialMappingRot); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingRot, float, setMaterialMappingRot);
COPY_PROPERTY_FROM_QSCRIPTVALUE(materialData, QString, setMaterialData);
// Certifiable Properties // Certifiable Properties
COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName); COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName);
@ -1902,6 +1905,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue
ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, glmVec2); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, glmVec2);
ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, glmVec2); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, glmVec2);
ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float);
ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, MaterialData, materialData, QString);
// Certifiable Properties // Certifiable Properties
ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString); ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString);
@ -2298,6 +2302,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, properties.getMaterialMappingPos()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, properties.getMaterialMappingPos());
APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, properties.getMaterialMappingScale()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, properties.getMaterialMappingScale());
APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, properties.getMaterialMappingRot()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, properties.getMaterialMappingRot());
APPEND_ENTITY_PROPERTY(PROP_MATERIAL_DATA, properties.getMaterialData());
} }
APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName());
@ -2666,6 +2671,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_POS, glmVec2, setMaterialMappingPos); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_POS, glmVec2, setMaterialMappingPos);
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_SCALE, glmVec2, setMaterialMappingScale); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_SCALE, glmVec2, setMaterialMappingScale);
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_ROT, float, setMaterialMappingRot); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_ROT, float, setMaterialMappingRot);
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_DATA, QString, setMaterialData);
} }
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName);
@ -2849,6 +2855,7 @@ void EntityItemProperties::markAllChanged() {
_materialMappingPosChanged = true; _materialMappingPosChanged = true;
_materialMappingScaleChanged = true; _materialMappingScaleChanged = true;
_materialMappingRotChanged = true; _materialMappingRotChanged = true;
_materialDataChanged = true;
// Certifiable Properties // Certifiable Properties
_itemNameChanged = true; _itemNameChanged = true;
@ -3200,6 +3207,9 @@ QList<QString> EntityItemProperties::listChangedProperties() {
if (materialMappingRotChanged()) { if (materialMappingRotChanged()) {
out += "materialMappingRot"; out += "materialMappingRot";
} }
if (materialDataChanged()) {
out += "materialData";
}
// Certifiable Properties // Certifiable Properties
if (itemNameChanged()) { if (itemNameChanged()) {

View file

@ -230,6 +230,7 @@ public:
DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, glmVec2, glm::vec2(0, 0)); DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, glmVec2, glm::vec2(0, 0));
DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, glmVec2, glm::vec2(1, 1)); DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, glmVec2, glm::vec2(1, 1));
DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float, 0); DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float, 0);
DEFINE_PROPERTY_REF(PROP_MATERIAL_DATA, MaterialData, materialData, QString, "");
// Certifiable Properties - related to Proof of Purchase certificates // Certifiable Properties - related to Proof of Purchase certificates
DEFINE_PROPERTY_REF(PROP_ITEM_NAME, ItemName, itemName, QString, ENTITY_ITEM_DEFAULT_ITEM_NAME); DEFINE_PROPERTY_REF(PROP_ITEM_NAME, ItemName, itemName, QString, ENTITY_ITEM_DEFAULT_ITEM_NAME);

View file

@ -240,6 +240,7 @@ enum EntityPropertyList {
PROP_MATERIAL_MAPPING_POS, PROP_MATERIAL_MAPPING_POS,
PROP_MATERIAL_MAPPING_SCALE, PROP_MATERIAL_MAPPING_SCALE,
PROP_MATERIAL_MAPPING_ROT, PROP_MATERIAL_MAPPING_ROT,
PROP_MATERIAL_DATA,
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
// ATTENTION: add new properties to end of list just ABOVE this line // ATTENTION: add new properties to end of list just ABOVE this line

View file

@ -2376,6 +2376,30 @@ bool EntityTree::readFromMap(QVariantMap& map) {
} }
} }
// Convert old materials so that they use materialData instead of userData
if (contentVersion < (int)EntityVersion::MaterialData && properties.getType() == EntityTypes::EntityType::Material) {
if (properties.getMaterialURL().startsWith("userData")) {
QString materialURL = properties.getMaterialURL();
properties.setMaterialURL(materialURL.replace("userData", "materialData"));
QJsonObject userData = QJsonDocument::fromJson(properties.getUserData().toUtf8()).object();
QJsonObject materialData;
QJsonValue materialVersion = userData["materialVersion"];
if (!materialVersion.isNull()) {
materialData.insert("materialVersion", materialVersion);
userData.remove("materialVersion");
}
QJsonValue materials = userData["materials"];
if (!materials.isNull()) {
materialData.insert("materials", materials);
userData.remove("materials");
}
properties.setMaterialData(QJsonDocument(materialData).toJson());
properties.setUserData(QJsonDocument(userData).toJson());
}
}
EntityItemPointer entity = addEntity(entityItemID, properties); EntityItemPointer entity = addEntity(entityItemID, properties);
if (!entity) { if (!entity) {
qCDebug(entities) << "adding Entity failed:" << entityItemID << properties.getType(); qCDebug(entities) << "adding Entity failed:" << entityItemID << properties.getType();

View file

@ -36,6 +36,7 @@ EntityItemProperties MaterialEntityItem::getProperties(EntityPropertyFlags desir
COPY_ENTITY_PROPERTY_TO_PROPERTIES(materialMappingPos, getMaterialMappingPos); COPY_ENTITY_PROPERTY_TO_PROPERTIES(materialMappingPos, getMaterialMappingPos);
COPY_ENTITY_PROPERTY_TO_PROPERTIES(materialMappingScale, getMaterialMappingScale); COPY_ENTITY_PROPERTY_TO_PROPERTIES(materialMappingScale, getMaterialMappingScale);
COPY_ENTITY_PROPERTY_TO_PROPERTIES(materialMappingRot, getMaterialMappingRot); COPY_ENTITY_PROPERTY_TO_PROPERTIES(materialMappingRot, getMaterialMappingRot);
COPY_ENTITY_PROPERTY_TO_PROPERTIES(materialData, getMaterialData);
return properties; return properties;
} }
@ -49,6 +50,7 @@ bool MaterialEntityItem::setProperties(const EntityItemProperties& properties) {
SET_ENTITY_PROPERTY_FROM_PROPERTIES(materialMappingPos, setMaterialMappingPos); SET_ENTITY_PROPERTY_FROM_PROPERTIES(materialMappingPos, setMaterialMappingPos);
SET_ENTITY_PROPERTY_FROM_PROPERTIES(materialMappingScale, setMaterialMappingScale); SET_ENTITY_PROPERTY_FROM_PROPERTIES(materialMappingScale, setMaterialMappingScale);
SET_ENTITY_PROPERTY_FROM_PROPERTIES(materialMappingRot, setMaterialMappingRot); SET_ENTITY_PROPERTY_FROM_PROPERTIES(materialMappingRot, setMaterialMappingRot);
SET_ENTITY_PROPERTY_FROM_PROPERTIES(materialData, setMaterialData);
if (somethingChanged) { if (somethingChanged) {
bool wantDebug = false; bool wantDebug = false;
@ -78,6 +80,7 @@ int MaterialEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da
READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, glm::vec2, setMaterialMappingPos); READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, glm::vec2, setMaterialMappingPos);
READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, glm::vec2, setMaterialMappingScale); READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, glm::vec2, setMaterialMappingScale);
READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, float, setMaterialMappingRot); READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, float, setMaterialMappingRot);
READ_ENTITY_PROPERTY(PROP_MATERIAL_DATA, QString, setMaterialData);
return bytesRead; return bytesRead;
} }
@ -93,6 +96,7 @@ EntityPropertyFlags MaterialEntityItem::getEntityProperties(EncodeBitstreamParam
requestedProperties += PROP_MATERIAL_MAPPING_POS; requestedProperties += PROP_MATERIAL_MAPPING_POS;
requestedProperties += PROP_MATERIAL_MAPPING_SCALE; requestedProperties += PROP_MATERIAL_MAPPING_SCALE;
requestedProperties += PROP_MATERIAL_MAPPING_ROT; requestedProperties += PROP_MATERIAL_MAPPING_ROT;
requestedProperties += PROP_MATERIAL_DATA;
return requestedProperties; return requestedProperties;
} }
@ -112,6 +116,7 @@ void MaterialEntityItem::appendSubclassData(OctreePacketData* packetData, Encode
APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, getMaterialMappingPos()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, getMaterialMappingPos());
APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, getMaterialMappingScale()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, getMaterialMappingScale());
APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, getMaterialMappingRot()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, getMaterialMappingRot());
APPEND_ENTITY_PROPERTY(PROP_MATERIAL_DATA, getMaterialData());
} }
void MaterialEntityItem::debugDump() const { void MaterialEntityItem::debugDump() const {
@ -145,9 +150,9 @@ std::shared_ptr<NetworkMaterial> MaterialEntityItem::getMaterial() const {
} }
} }
void MaterialEntityItem::setMaterialURL(const QString& materialURLString, bool userDataChanged) { void MaterialEntityItem::setMaterialURL(const QString& materialURLString, bool materialDataChanged) {
bool usingUserData = materialURLString.startsWith("userData"); bool usingMaterialData = materialDataChanged || materialURLString.startsWith("materialData");
if (_materialURL != materialURLString || (usingUserData && userDataChanged)) { if (_materialURL != materialURLString || (usingMaterialData && materialDataChanged)) {
removeMaterial(); removeMaterial();
_materialURL = materialURLString; _materialURL = materialURLString;
@ -156,8 +161,8 @@ void MaterialEntityItem::setMaterialURL(const QString& materialURLString, bool u
_currentMaterialName = split.last().toStdString(); _currentMaterialName = split.last().toStdString();
} }
if (usingUserData) { if (usingMaterialData) {
_parsedMaterials = NetworkMaterialResource::parseJSONMaterials(QJsonDocument::fromJson(getUserData().toUtf8()), materialURLString); _parsedMaterials = NetworkMaterialResource::parseJSONMaterials(QJsonDocument::fromJson(getMaterialData().toUtf8()), materialURLString);
// Since our material changed, the current name might not be valid anymore, so we need to update // Since our material changed, the current name might not be valid anymore, so we need to update
setCurrentMaterialName(_currentMaterialName); setCurrentMaterialName(_currentMaterialName);
@ -191,11 +196,11 @@ void MaterialEntityItem::setCurrentMaterialName(const std::string& currentMateri
} }
} }
void MaterialEntityItem::setUserData(const QString& userData) { void MaterialEntityItem::setMaterialData(const QString& materialData) {
if (_userData != userData) { if (_materialData != materialData) {
EntityItem::setUserData(userData); _materialData = materialData;
if (_materialURL.startsWith("userData")) { if (_materialURL.startsWith("materialData")) {
// Trigger material update when user data changes // Trigger material update when material data changes
setMaterialURL(_materialURL, true); setMaterialURL(_materialURL, true);
} }
} }

View file

@ -53,7 +53,7 @@ public:
virtual void setUnscaledDimensions(const glm::vec3& value) override; virtual void setUnscaledDimensions(const glm::vec3& value) override;
QString getMaterialURL() const { return _materialURL; } QString getMaterialURL() const { return _materialURL; }
void setMaterialURL(const QString& materialURLString, bool userDataChanged = false); void setMaterialURL(const QString& materialURLString, bool materialDataChanged = false);
void setCurrentMaterialName(const std::string& currentMaterialName); void setCurrentMaterialName(const std::string& currentMaterialName);
@ -73,9 +73,11 @@ public:
float getMaterialMappingRot() const { return _materialMappingRot; } float getMaterialMappingRot() const { return _materialMappingRot; }
void setMaterialMappingRot(const float& materialMappingRot); void setMaterialMappingRot(const float& materialMappingRot);
QString getMaterialData() const { return _materialData; }
void setMaterialData(const QString& materialData);
std::shared_ptr<NetworkMaterial> getMaterial() const; std::shared_ptr<NetworkMaterial> getMaterial() const;
void setUserData(const QString& userData) override;
void setParentID(const QUuid& parentID) override; void setParentID(const QUuid& parentID) override;
void setClientOnly(bool clientOnly) override; void setClientOnly(bool clientOnly) override;
void setOwningAvatarID(const QUuid& owningAvatarID) override; void setOwningAvatarID(const QUuid& owningAvatarID) override;
@ -87,7 +89,7 @@ public:
void preDelete() override; void preDelete() override;
private: private:
// URL for this material. Currently, only JSON format is supported. Set to "userData" to use the user data to live edit a material. // URL for this material. Currently, only JSON format is supported. Set to "materialData" to use the material data to live edit a material.
// The following fields are supported in the JSON: // The following fields are supported in the JSON:
// materialVersion: a uint for the version of this network material (currently, only 1 is supported) // materialVersion: a uint for the version of this network material (currently, only 1 is supported)
// materials, which is either an object or an array of objects, each with the following properties: // materials, which is either an object or an array of objects, each with the following properties:
@ -117,6 +119,7 @@ private:
glm::vec2 _materialMappingScale { 1, 1 }; glm::vec2 _materialMappingScale { 1, 1 };
// How much to rotate this material within its parent's UV-space (degrees) // How much to rotate this material within its parent's UV-space (degrees)
float _materialMappingRot { 0 }; float _materialMappingRot { 0 };
QString _materialData;
NetworkMaterialResourcePointer _networkMaterial; NetworkMaterialResourcePointer _networkMaterial;
NetworkMaterialResource::ParsedMaterials _parsedMaterials; NetworkMaterialResource::ParsedMaterials _parsedMaterials;

View file

@ -30,7 +30,7 @@ PacketVersion versionForPacketType(PacketType packetType) {
case PacketType::EntityEdit: case PacketType::EntityEdit:
case PacketType::EntityData: case PacketType::EntityData:
case PacketType::EntityPhysics: case PacketType::EntityPhysics:
return static_cast<PacketVersion>(EntityVersion::ShadowControl); return static_cast<PacketVersion>(EntityVersion::MaterialData);
case PacketType::EntityQuery: case PacketType::EntityQuery:
return static_cast<PacketVersion>(EntityQueryPacketVersion::RemovedJurisdictions); return static_cast<PacketVersion>(EntityQueryPacketVersion::RemovedJurisdictions);
case PacketType::AvatarIdentity: case PacketType::AvatarIdentity:

View file

@ -231,7 +231,8 @@ enum class EntityVersion : PacketVersion {
ZoneStageRemoved, ZoneStageRemoved,
SoftEntities, SoftEntities,
MaterialEntities, MaterialEntities,
ShadowControl ShadowControl,
MaterialData
}; };
enum class EntityScriptCallMethodVersion : PacketVersion { enum class EntityScriptCallMethodVersion : PacketVersion {

View file

@ -409,6 +409,12 @@ var toolBar = (function () {
// default: // default:
// shapeType = "uv"; // shapeType = "uv";
//} //}
var materialData = "";
if (materialURL.startsWith("materialData")) {
materialData = JSON.stringify({
"materials": {}
})
}
var DEFAULT_LAYERED_MATERIAL_PRIORITY = 1; var DEFAULT_LAYERED_MATERIAL_PRIORITY = 1;
if (materialURL) { if (materialURL) {
@ -416,7 +422,8 @@ var toolBar = (function () {
type: "Material", type: "Material",
materialURL: materialURL, materialURL: materialURL,
//materialMappingMode: materialMappingMode, //materialMappingMode: materialMappingMode,
priority: DEFAULT_LAYERED_MATERIAL_PRIORITY priority: DEFAULT_LAYERED_MATERIAL_PRIORITY,
materialData: materialData
}); });
} }
} }
@ -2047,7 +2054,7 @@ var PropertiesTool = function (opts) {
parentSelectedEntities(); parentSelectedEntities();
} else if (data.type === 'unparent') { } else if (data.type === 'unparent') {
unparentSelectedEntities(); unparentSelectedEntities();
} else if (data.type === 'saveUserData') { } else if (data.type === 'saveUserData' || data.type === 'saveMaterialData') {
//the event bridge and json parsing handle our avatar id string differently. //the event bridge and json parsing handle our avatar id string differently.
var actualID = data.id.split('"')[1]; var actualID = data.id.split('"')[1];
Entities.editEntity(actualID, data.properties); Entities.editEntity(actualID, data.properties);

View file

@ -1387,12 +1387,14 @@ input#reset-to-natural-dimensions {
margin-top: 48px; margin-top: 48px;
} }
#userdata-clear{ #userdata-clear,
#materialdata-clear {
margin-bottom: 10px; margin-bottom: 10px;
} }
#static-userdata { #static-userdata,
#static-materialData {
display: none; display: none;
z-index: 99; z-index: 99;
position: absolute; position: absolute;
@ -1403,7 +1405,8 @@ input#reset-to-natural-dimensions {
background-color: #2e2e2e; background-color: #2e2e2e;
} }
#userdata-saved { #userdata-saved,
#materialData-saved {
margin-top:5px; margin-top:5px;
font-size:16px; font-size:16px;
display:none; display:none;

View file

@ -781,6 +781,20 @@
<label for="property-material-url">Material URL</label> <label for="property-material-url">Material URL</label>
<input type="text" id="property-material-url"> <input type="text" id="property-material-url">
</div> </div>
<div class="property textarea">
<label for="property-material-data">Material data</label>
<br><br>
<div class="row">
<input type="button" class="red" id="materialdata-clear" value="Clear Material Data">
<input type="button" class="blue" id="materialdata-new-editor" value="Edit as JSON">
<input disabled type="button" class="black" id="materialdata-save" value="Save Material Data">
<span id="materialdata-saved" visible="false">Saved!</span>
</div>
<div id="static-naterialdata"></div>
<div id="materialdata-editor"></div>
<textarea id="property-material-data"></textarea>
</div>
</fieldset> </fieldset>
<fieldset class="minor"> <fieldset class="minor">
<div class="material-group material-section property text" id="property-parent-material-id-string-container"> <div class="material-group material-section property text" id="property-parent-material-id-string-container">

View file

@ -66,6 +66,7 @@ function enableProperties() {
if (elLocked.checked === false) { if (elLocked.checked === false) {
removeStaticUserData(); removeStaticUserData();
removeStaticMaterialData();
} }
} }
@ -78,8 +79,13 @@ function disableProperties() {
} }
var elLocked = document.getElementById("property-locked"); var elLocked = document.getElementById("property-locked");
if ($('#userdata-editor').css('display') === "block" && elLocked.checked === true) { if (elLocked.checked === true) {
showStaticUserData(); if ($('#userdata-editor').css('display') === "block") {
showStaticUserData();
}
if ($('#materialdata-editor').css('display') === "block") {
showStaticMaterialData();
}
} }
} }
@ -356,15 +362,139 @@ function userDataChanger(groupName, keyName, values, userDataElement, defaultVal
multiDataUpdater(groupName, val, userDataElement, def); multiDataUpdater(groupName, val, userDataElement, def);
} }
function setMaterialDataFromEditor(noUpdate) {
var json = null;
try {
json = materialEditor.get();
} catch (e) {
alert('Invalid JSON code - look for red X in your code ', +e);
}
if (json === null) {
return;
} else {
var text = materialEditor.getText();
if (noUpdate === true) {
EventBridge.emitWebEvent(
JSON.stringify({
id: lastEntityID,
type: "saveMaterialData",
properties: {
materialData: text
}
})
);
return;
} else {
updateProperty('materialData', text);
}
}
}
function setTextareaScrolling(element) { function setTextareaScrolling(element) {
var isScrolling = element.scrollHeight > element.offsetHeight; var isScrolling = element.scrollHeight > element.offsetHeight;
element.setAttribute("scrolling", isScrolling ? "true" : "false"); element.setAttribute("scrolling", isScrolling ? "true" : "false");
} }
var materialEditor = null;
function createJSONMaterialEditor() {
var container = document.getElementById("materialdata-editor");
var options = {
search: false,
mode: 'tree',
modes: ['code', 'tree'],
name: 'materialData',
onModeChange: function() {
$('.jsoneditor-poweredBy').remove();
},
onError: function(e) {
alert('JSON editor:' + e);
},
onChange: function() {
var currentJSONString = materialEditor.getText();
if (currentJSONString === '{"":""}') {
return;
}
$('#materialdata-save').attr('disabled', false);
}
};
materialEditor = new JSONEditor(container, options);
}
function hideNewJSONMaterialEditorButton() {
$('#materialdata-new-editor').hide();
}
function showSaveMaterialDataButton() {
$('#materialdata-save').show();
}
function hideSaveMaterialDataButton() {
$('#materialdata-save').hide();
}
function showNewJSONMaterialEditorButton() {
$('#materialdata-new-editor').show();
}
function showMaterialDataTextArea() {
$('#property-material-data').show();
}
function hideMaterialDataTextArea() {
$('#property-material-data').hide();
}
function showStaticMaterialData() {
if (materialEditor !== null) {
$('#static-materialdata').show();
$('#static-materialdata').css('height', $('#materialdata-editor').height());
$('#static-materialdata').text(materialEditor.getText());
}
}
function removeStaticMaterialData() {
$('#static-materialdata').hide();
}
function setMaterialEditorJSON(json) {
materialEditor.set(json);
if (materialEditor.hasOwnProperty('expandAll')) {
materialEditor.expandAll();
}
}
function getMaterialEditorJSON() {
return materialEditor.get();
}
function deleteJSONMaterialEditor() {
if (materialEditor !== null) {
materialEditor.destroy();
materialEditor = null;
}
}
var savedMaterialJSONTimer = null;
function saveJSONMaterialData(noUpdate) {
setMaterialDataFromEditor(noUpdate);
$('#materialdata-saved').show();
$('#materialdata-save').attr('disabled', true);
if (savedMaterialJSONTimer !== null) {
clearTimeout(savedMaterialJSONTimer);
}
savedMaterialJSONTimer = setTimeout(function() {
$('#materialdata-saved').hide();
}, EDITOR_TIMEOUT_DURATION);
}
var editor = null; var editor = null;
var editorTimeout = null;
var lastJSONString = null;
function createJSONEditor() { function createJSONEditor() {
var container = document.getElementById("userdata-editor"); var container = document.getElementById("userdata-editor");
@ -395,11 +525,6 @@ function createJSONEditor() {
function hideNewJSONEditorButton() { function hideNewJSONEditorButton() {
$('#userdata-new-editor').hide(); $('#userdata-new-editor').hide();
}
function hideClearUserDataButton() {
$('#userdata-clear').hide();
} }
function showSaveUserDataButton() { function showSaveUserDataButton() {
@ -408,17 +533,10 @@ function showSaveUserDataButton() {
function hideSaveUserDataButton() { function hideSaveUserDataButton() {
$('#userdata-save').hide(); $('#userdata-save').hide();
} }
function showNewJSONEditorButton() { function showNewJSONEditorButton() {
$('#userdata-new-editor').show(); $('#userdata-new-editor').show();
}
function showClearUserDataButton() {
$('#userdata-clear').show();
} }
function showUserDataTextArea() { function showUserDataTextArea() {
@ -446,7 +564,6 @@ function setEditorJSON(json) {
if (editor.hasOwnProperty('expandAll')) { if (editor.hasOwnProperty('expandAll')) {
editor.expandAll(); editor.expandAll();
} }
} }
function getEditorJSON() { function getEditorJSON() {
@ -484,12 +601,15 @@ function bindAllNonJSONEditorElements() {
// TODO FIXME: (JSHint) Functions declared within loops referencing // TODO FIXME: (JSHint) Functions declared within loops referencing
// an outer scoped variable may lead to confusing semantics. // an outer scoped variable may lead to confusing semantics.
field.on('focus', function(e) { field.on('focus', function(e) {
if (e.target.id === "userdata-new-editor" || e.target.id === "userdata-clear") { if (e.target.id === "userdata-new-editor" || e.target.id === "userdata-clear" || e.target.id === "materialdata-new-editor" || e.target.id === "materialdata-clear") {
return; return;
} else { } else {
if ($('#userdata-editor').css('height') !== "0px") { if ($('#userdata-editor').css('height') !== "0px") {
saveJSONUserData(true); saveJSONUserData(true);
} }
if ($('#materialdata-editor').css('height') !== "0px") {
saveJSONMaterialData(true);
}
} }
}); });
} }
@ -652,6 +772,10 @@ function loaded() {
var elMaterialMappingScaleX = document.getElementById("property-material-mapping-scale-x"); var elMaterialMappingScaleX = document.getElementById("property-material-mapping-scale-x");
var elMaterialMappingScaleY = document.getElementById("property-material-mapping-scale-y"); var elMaterialMappingScaleY = document.getElementById("property-material-mapping-scale-y");
var elMaterialMappingRot = document.getElementById("property-material-mapping-rot"); var elMaterialMappingRot = document.getElementById("property-material-mapping-rot");
var elMaterialData = document.getElementById("property-material-data");
var elClearMaterialData = document.getElementById("materialdata-clear");
var elSaveMaterialData = document.getElementById("materialdata-save");
var elNewJSONMaterialEditor = document.getElementById('materialdata-new-editor');
var elImageURL = document.getElementById("property-image-url"); var elImageURL = document.getElementById("property-image-url");
@ -772,9 +896,15 @@ function loaded() {
} else if (data.type === "update") { } else if (data.type === "update") {
if (!data.selections || data.selections.length === 0) { if (!data.selections || data.selections.length === 0) {
if (editor !== null && lastEntityID !== null) { if (lastEntityID !== null) {
saveJSONUserData(true); if (editor !== null) {
deleteJSONEditor(); saveJSONUserData(true);
deleteJSONEditor();
}
if (materialEditor !== null) {
saveJSONMaterialData(true);
deleteJSONMaterialEditor();
}
} }
elTypeIcon.style.display = "none"; elTypeIcon.style.display = "none";
elType.innerHTML = "<i>No selection</i>"; elType.innerHTML = "<i>No selection</i>";
@ -783,6 +913,7 @@ function loaded() {
disableProperties(); disableProperties();
} else if (data.selections && data.selections.length > 1) { } else if (data.selections && data.selections.length > 1) {
deleteJSONEditor(); deleteJSONEditor();
deleteJSONMaterialEditor();
var selections = data.selections; var selections = data.selections;
var ids = []; var ids = [];
@ -815,8 +946,13 @@ function loaded() {
} else { } else {
properties = data.selections[0].properties; properties = data.selections[0].properties;
if (lastEntityID !== '"' + properties.id + '"' && lastEntityID !== null && editor !== null) { if (lastEntityID !== '"' + properties.id + '"' && lastEntityID !== null) {
saveJSONUserData(true); if (editor !== null) {
saveJSONUserData(true);
}
if (materialEditor !== null) {
saveJSONMaterialData(true);
}
} }
var doSelectElement = lastEntityID === '"' + properties.id + '"'; var doSelectElement = lastEntityID === '"' + properties.id + '"';
@ -993,6 +1129,28 @@ function loaded() {
hideNewJSONEditorButton(); hideNewJSONEditorButton();
} }
var materialJson = null;
try {
materialJson = JSON.parse(properties.materialData);
} catch (e) {
// normal text
deleteJSONMaterialEditor();
elMaterialData.value = properties.materialData;
showMaterialDataTextArea();
showNewJSONMaterialEditorButton();
hideSaveMaterialDataButton();
}
if (materialJson !== null) {
if (materialEditor === null) {
createJSONMaterialEditor();
}
setMaterialEditorJSON(materialJson);
showSaveMaterialDataButton();
hideMaterialDataTextArea();
hideNewJSONMaterialEditorButton();
}
elHyperlinkHref.value = properties.href; elHyperlinkHref.value = properties.href;
elDescription.value = properties.description; elDescription.value = properties.description;
@ -1200,6 +1358,7 @@ function loaded() {
} else { } else {
enableProperties(); enableProperties();
elSaveUserData.disabled = true; elSaveUserData.disabled = true;
elSaveMaterialData.disabled = true;
} }
var activeElement = document.activeElement; var activeElement = document.activeElement;
@ -1384,6 +1543,31 @@ function loaded() {
showSaveUserDataButton(); showSaveUserDataButton();
}); });
elClearMaterialData.addEventListener("click", function() {
deleteJSONMaterialEditor();
elMaterialData.value = "";
showMaterialDataTextArea();
showNewJSONMaterialEditorButton();
hideSaveMaterialDataButton();
updateProperty('materialData', elMaterialData.value);
});
elSaveMaterialData.addEventListener("click", function() {
saveJSONMaterialData(true);
});
elMaterialData.addEventListener('change', createEmitTextPropertyUpdateFunction('materialData'));
elNewJSONMaterialEditor.addEventListener('click', function() {
deleteJSONMaterialEditor();
createJSONMaterialEditor();
var data = {};
setMaterialEditorJSON(data);
hideMaterialDataTextArea();
hideNewJSONMaterialEditorButton();
showSaveMaterialDataButton();
});
var colorChangeFunction = createEmitColorPropertyUpdateFunction( var colorChangeFunction = createEmitColorPropertyUpdateFunction(
'color', elColorRed, elColorGreen, elColorBlue); 'color', elColorRed, elColorGreen, elColorBlue);
elColorRed.addEventListener('change', colorChangeFunction); elColorRed.addEventListener('change', colorChangeFunction);