diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 8a15147f16..cb680dd83a 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -362,6 +362,9 @@ var elVoxelVolumeSizeY = document.getElementById("property-voxel-volume-size-y"); var elVoxelVolumeSizeZ = document.getElementById("property-voxel-volume-size-z"); var elVoxelSurfaceStyle = document.getElementById("property-voxel-surface-style"); + var elXTextureURL = document.getElementById("property-x-texture-url"); + var elYTextureURL = document.getElementById("property-y-texture-url"); + var elZTextureURL = document.getElementById("property-z-texture-url"); var elHyperlinkHref = document.getElementById("property-hyperlink-href"); var elHyperlinkDescription = document.getElementById("property-hyperlink-description"); @@ -614,6 +617,8 @@ elVoxelVolumeSizeY.value = properties.voxelVolumeSize.y.toFixed(2); elVoxelVolumeSizeZ.value = properties.voxelVolumeSize.z.toFixed(2); elVoxelSurfaceStyle.value = properties.voxelSurfaceStyle; + elXTextureURL.value = properties.xTextureURL; + } if (selected) { @@ -867,6 +872,9 @@ elVoxelVolumeSizeY.addEventListener('change', voxelVolumeSizeChangeFunction); elVoxelVolumeSizeZ.addEventListener('change', voxelVolumeSizeChangeFunction); elVoxelSurfaceStyle.addEventListener('change', createEmitTextPropertyUpdateFunction('voxelSurfaceStyle')); + elXTextureURL.addEventListener('change', createEmitTextPropertyUpdateFunction('xTextureURL')); + elYTextureURL.addEventListener('change', createEmitTextPropertyUpdateFunction('yTextureURL')); + elZTextureURL.addEventListener('change', createEmitTextPropertyUpdateFunction('zTextureURL')); elMoveSelectionToGrid.addEventListener("click", function() { EventBridge.emitWebEvent(JSON.stringify({ @@ -1063,7 +1071,22 @@ <option value='0'>marching cubes</option> <option value='1'>cubic</option> <option value='2'>edged cubic</option> - </select> + </select> + </div> + + <div class="label">X-axis Texture URL</div> + <div class="value"> + <input type="text" id="property-x-texture-url" class="url"></input> + </div> + + <div class="label">Y-axis Texture URL</div> + <div class="value"> + <input type="text" id="property-y-texture-url" class="url"></input> + </div> + + <div class="label">Z-axis Texture URL</div> + <div class="value"> + <input type="text" id="property-z-texture-url" class="url"></input> </div> </div> diff --git a/examples/libraries/entityPropertyDialogBox.js b/examples/libraries/entityPropertyDialogBox.js index 1b1a6a9c12..b386953c7c 100644 --- a/examples/libraries/entityPropertyDialogBox.js +++ b/examples/libraries/entityPropertyDialogBox.js @@ -98,8 +98,8 @@ EntityPropertyDialogBox = (function () { index++; } - if (properties.type == "PolyVox") { - array.push({ label: "Voxel Space Size:", type: "header" }); + if (properties.type == "PolyVox") { + array.push({ label: "Voxel Space Size:", type: "header" }); index++; array.push({ label: "X:", value: properties.voxelVolumeSize.x.toFixed(decimals) }); @@ -109,9 +109,16 @@ EntityPropertyDialogBox = (function () { array.push({ label: "Z:", value: properties.voxelVolumeSize.z.toFixed(decimals) }); index++; - array.push({ label: "Surface Extractor", value: properties.voxelSurfaceStyle }); - index++; - } + array.push({ label: "Surface Extractor", value: properties.voxelSurfaceStyle }); + index++; + + array.push({ label: "X-axis Texture URL:", value: properties.xTextureURL }); + index++; + array.push({ label: "Y-axis Texture URL:", value: properties.yTextureURL }); + index++; + array.push({ label: "Z-axis Texture URL:", value: properties.zTextureURL }); + index++; + } array.push({ label: "Position:", type: "header" }); index++; @@ -348,14 +355,17 @@ EntityPropertyDialogBox = (function () { properties.backgroundColor.blue = array[index++].value; } - if (properties.type == "PolyVox") { + if (properties.type == "PolyVox") { properties.shapeType = array[index++].value; - index++; // skip header - properties.voxelVolumeSize.x = array[index++].value; - properties.voxelVolumeSize.y = array[index++].value; - properties.voxelVolumeSize.z = array[index++].value; - properties.voxelSurfaceStyle = array[index++].value; + index++; // skip header + properties.voxelVolumeSize.x = array[index++].value; + properties.voxelVolumeSize.y = array[index++].value; + properties.voxelVolumeSize.z = array[index++].value; + properties.voxelSurfaceStyle = array[index++].value; + properties.xTextureURL = array[index++].value; + properties.yTextureURL = array[index++].value; + properties.zTextureURL = array[index++].value; } index++; // skip header diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 61253ba6ba..ac9bccab78 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -101,6 +101,9 @@ CONSTRUCT_PROPERTY(lineWidth, LineEntityItem::DEFAULT_LINE_WIDTH), CONSTRUCT_PROPERTY(linePoints, QVector<glm::vec3>()), CONSTRUCT_PROPERTY(faceCamera, TextEntityItem::DEFAULT_FACE_CAMERA), CONSTRUCT_PROPERTY(actionData, QByteArray()), +CONSTRUCT_PROPERTY(xTextureURL, ""), +CONSTRUCT_PROPERTY(yTextureURL, ""), +CONSTRUCT_PROPERTY(zTextureURL, ""), _id(UNKNOWN_ENTITY_ID), _idSet(false), @@ -357,6 +360,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_DESCRIPTION, description); CHECK_PROPERTY_CHANGE(PROP_FACE_CAMERA, faceCamera); CHECK_PROPERTY_CHANGE(PROP_ACTION_DATA, actionData); + CHECK_PROPERTY_CHANGE(PROP_X_TEXTURE_URL, xTextureURL); + CHECK_PROPERTY_CHANGE(PROP_Y_TEXTURE_URL, yTextureURL); + CHECK_PROPERTY_CHANGE(PROP_Z_TEXTURE_URL, zTextureURL); changedProperties += _stage.getChangedProperties(); changedProperties += _atmosphere.getChangedProperties(); @@ -493,6 +499,10 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool _atmosphere.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); _skybox.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); + COPY_PROPERTY_TO_QSCRIPTVALUE(xTextureURL); + COPY_PROPERTY_TO_QSCRIPTVALUE(yTextureURL); + COPY_PROPERTY_TO_QSCRIPTVALUE(zTextureURL); + return properties; } @@ -583,6 +593,12 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool _stage.copyFromScriptValue(object, _defaultSettings); _atmosphere.copyFromScriptValue(object, _defaultSettings); _skybox.copyFromScriptValue(object, _defaultSettings); + + + COPY_PROPERTY_FROM_QSCRIPTVALUE(xTextureURL, QString, setXTextureURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(yTextureURL, QString, setYTextureURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(zTextureURL, QString, setZTextureURL); + _lastEdited = usecTimestampNow(); } @@ -810,6 +826,9 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent APPEND_ENTITY_PROPERTY(PROP_VOXEL_VOLUME_SIZE, properties.getVoxelVolumeSize()); APPEND_ENTITY_PROPERTY(PROP_VOXEL_DATA, properties.getVoxelData()); APPEND_ENTITY_PROPERTY(PROP_VOXEL_SURFACE_STYLE, properties.getVoxelSurfaceStyle()); + APPEND_ENTITY_PROPERTY(PROP_X_TEXTURE_URL, properties.getXTextureURL()); + APPEND_ENTITY_PROPERTY(PROP_Y_TEXTURE_URL, properties.getYTextureURL()); + APPEND_ENTITY_PROPERTY(PROP_Z_TEXTURE_URL, properties.getZTextureURL()); } if (properties.getType() == EntityTypes::Line) { @@ -1061,6 +1080,9 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_VOLUME_SIZE, glm::vec3, setVoxelVolumeSize); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_DATA, QByteArray, setVoxelData); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_SURFACE_STYLE, uint16_t, setVoxelSurfaceStyle); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_X_TEXTURE_URL, QString, setXTextureURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_Y_TEXTURE_URL, QString, setYTextureURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_Z_TEXTURE_URL, QString, setZTextureURL); } if (properties.getType() == EntityTypes::Line) { @@ -1185,6 +1207,10 @@ void EntityItemProperties::markAllChanged() { _descriptionChanged = true; _faceCameraChanged = true; _actionDataChanged = true; + + _xTextureURLChanged = true; + _yTextureURLChanged = true; + _zTextureURLChanged = true; } /// The maximum bounding cube for the entity, independent of it's rotation. diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 4532ffd67b..ef5e8c54dc 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -154,6 +154,9 @@ public: DEFINE_PROPERTY_REF(PROP_DESCRIPTION, Description, description, QString); DEFINE_PROPERTY(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool); DEFINE_PROPERTY_REF(PROP_ACTION_DATA, ActionData, actionData, QByteArray); + DEFINE_PROPERTY_REF(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString); + DEFINE_PROPERTY_REF(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString); + DEFINE_PROPERTY_REF(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString); static QString getBackgroundModeString(BackgroundMode mode); @@ -313,6 +316,9 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, Href, href, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Description, description, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, ActionData, actionData, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, XTextureURL, xTextureURL, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, YTextureURL, yTextureURL, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, ZTextureURL, zTextureURL, ""); properties.getStage().debugDump(); properties.getAtmosphere().debugDump(); diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index be16683f39..c23c45fabf 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -126,6 +126,10 @@ enum EntityPropertyList { PROP_SCRIPT_TIMESTAMP, PROP_ACTION_DATA, + PROP_X_TEXTURE_URL, // used by PolyVox + PROP_Y_TEXTURE_URL, // used by PolyVox + PROP_Z_TEXTURE_URL, // used by PolyVox + //////////////////////////////////////////////////////////////////////////////////////////////////// // ATTENTION: add new properties to end of list just ABOVE this line PROP_AFTER_LAST_ITEM, diff --git a/libraries/entities/src/PolyVoxEntityItem.cpp b/libraries/entities/src/PolyVoxEntityItem.cpp index 048017de1c..c9f3705712 100644 --- a/libraries/entities/src/PolyVoxEntityItem.cpp +++ b/libraries/entities/src/PolyVoxEntityItem.cpp @@ -26,6 +26,9 @@ const float PolyVoxEntityItem::MAX_VOXEL_DIMENSION = 32.0f; const QByteArray PolyVoxEntityItem::DEFAULT_VOXEL_DATA(PolyVoxEntityItem::makeEmptyVoxelData()); const PolyVoxEntityItem::PolyVoxSurfaceStyle PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE = PolyVoxEntityItem::SURFACE_MARCHING_CUBES; +const QString PolyVoxEntityItem::DEFAULT_X_TEXTURE_URL = QString(""); +const QString PolyVoxEntityItem::DEFAULT_Y_TEXTURE_URL = QString(""); +const QString PolyVoxEntityItem::DEFAULT_Z_TEXTURE_URL = QString(""); EntityItemPointer PolyVoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return std::make_shared<PolyVoxEntityItem>(entityID, properties); @@ -49,7 +52,10 @@ PolyVoxEntityItem::PolyVoxEntityItem(const EntityItemID& entityItemID, const Ent EntityItem(entityItemID), _voxelVolumeSize(PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE), _voxelData(PolyVoxEntityItem::DEFAULT_VOXEL_DATA), - _voxelSurfaceStyle(PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE) + _voxelSurfaceStyle(PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE), + _xTextureURL(PolyVoxEntityItem::DEFAULT_X_TEXTURE_URL), + _yTextureURL(PolyVoxEntityItem::DEFAULT_Y_TEXTURE_URL), + _zTextureURL(PolyVoxEntityItem::DEFAULT_Z_TEXTURE_URL) { _type = EntityTypes::PolyVox; setProperties(properties); @@ -94,6 +100,9 @@ EntityItemProperties PolyVoxEntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(voxelVolumeSize, getVoxelVolumeSize); COPY_ENTITY_PROPERTY_TO_PROPERTIES(voxelData, getVoxelData); COPY_ENTITY_PROPERTY_TO_PROPERTIES(voxelSurfaceStyle, getVoxelSurfaceStyle); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(xTextureURL, getXTextureURL); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(yTextureURL, getYTextureURL); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(zTextureURL, getZTextureURL); return properties; } @@ -103,6 +112,9 @@ bool PolyVoxEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(voxelVolumeSize, setVoxelVolumeSize); SET_ENTITY_PROPERTY_FROM_PROPERTIES(voxelData, setVoxelData); SET_ENTITY_PROPERTY_FROM_PROPERTIES(voxelSurfaceStyle, setVoxelSurfaceStyle); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(xTextureURL, setXTextureURL); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(yTextureURL, setYTextureURL); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(zTextureURL, setZTextureURL); if (somethingChanged) { bool wantDebug = false; @@ -127,6 +139,9 @@ int PolyVoxEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* dat READ_ENTITY_PROPERTY(PROP_VOXEL_VOLUME_SIZE, glm::vec3, setVoxelVolumeSize); READ_ENTITY_PROPERTY(PROP_VOXEL_DATA, QByteArray, setVoxelData); READ_ENTITY_PROPERTY(PROP_VOXEL_SURFACE_STYLE, uint16_t, setVoxelSurfaceStyle); + READ_ENTITY_PROPERTY(PROP_X_TEXTURE_URL, QString, setXTextureURL); + READ_ENTITY_PROPERTY(PROP_Y_TEXTURE_URL, QString, setYTextureURL); + READ_ENTITY_PROPERTY(PROP_Z_TEXTURE_URL, QString, setZTextureURL); return bytesRead; } @@ -138,6 +153,9 @@ EntityPropertyFlags PolyVoxEntityItem::getEntityProperties(EncodeBitstreamParams requestedProperties += PROP_VOXEL_VOLUME_SIZE; requestedProperties += PROP_VOXEL_DATA; requestedProperties += PROP_VOXEL_SURFACE_STYLE; + requestedProperties += PROP_X_TEXTURE_URL; + requestedProperties += PROP_Y_TEXTURE_URL; + requestedProperties += PROP_Z_TEXTURE_URL; return requestedProperties; } @@ -153,6 +171,10 @@ void PolyVoxEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeB APPEND_ENTITY_PROPERTY(PROP_VOXEL_VOLUME_SIZE, getVoxelVolumeSize()); APPEND_ENTITY_PROPERTY(PROP_VOXEL_DATA, getVoxelData()); APPEND_ENTITY_PROPERTY(PROP_VOXEL_SURFACE_STYLE, (uint16_t) getVoxelSurfaceStyle()); + APPEND_ENTITY_PROPERTY(PROP_X_TEXTURE_URL, getXTextureURL()); + APPEND_ENTITY_PROPERTY(PROP_Y_TEXTURE_URL, getYTextureURL()); + APPEND_ENTITY_PROPERTY(PROP_Z_TEXTURE_URL, getZTextureURL()); + } void PolyVoxEntityItem::debugDump() const { diff --git a/libraries/entities/src/PolyVoxEntityItem.h b/libraries/entities/src/PolyVoxEntityItem.h index 9e20187195..0d0ab060f9 100644 --- a/libraries/entities/src/PolyVoxEntityItem.h +++ b/libraries/entities/src/PolyVoxEntityItem.h @@ -87,6 +87,18 @@ class PolyVoxEntityItem : public EntityItem { static QByteArray makeEmptyVoxelData(quint16 voxelXSize = 16, quint16 voxelYSize = 16, quint16 voxelZSize = 16); + static const QString DEFAULT_X_TEXTURE_URL; + virtual void setXTextureURL(QString xTextureURL) { _xTextureURL = xTextureURL; } + virtual const QString& getXTextureURL() const { return _xTextureURL; } + + static const QString DEFAULT_Y_TEXTURE_URL; + virtual void setYTextureURL(QString yTextureURL) { _yTextureURL = yTextureURL; } + virtual const QString& getYTextureURL() const { return _yTextureURL; } + + static const QString DEFAULT_Z_TEXTURE_URL; + virtual void setZTextureURL(QString zTextureURL) { _zTextureURL = zTextureURL; } + virtual const QString& getZTextureURL() const { return _zTextureURL; } + protected: virtual void updateVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle) { _voxelSurfaceStyle = voxelSurfaceStyle; @@ -95,6 +107,11 @@ class PolyVoxEntityItem : public EntityItem { glm::vec3 _voxelVolumeSize; // this is always 3 bytes QByteArray _voxelData; PolyVoxSurfaceStyle _voxelSurfaceStyle; + + QString _xTextureURL; + QString _yTextureURL; + QString _zTextureURL; + }; #endif // hifi_PolyVoxEntityItem_h diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 0591ac30fe..bddad72d29 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -67,7 +67,7 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { case EntityAdd: case EntityEdit: case EntityData: - return VERSION_ENTITIES_NEW_PROTOCOL_LAYER; + return VERSION_POLYVOX_TEXTURES; default: return 11; } diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 3f3f165e87..9c837f4594 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -139,5 +139,6 @@ const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP = 31; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP_FIX = 32; const PacketVersion VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE = 33; const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 35; +const PacketVersion VERSION_POLYVOX_TEXTURES = 36; #endif // hifi_PacketHeaders_h