From f8617bab2dee1565d58b8554388e9755c409271f Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sat, 27 Jun 2015 16:47:11 -0700 Subject: [PATCH 01/16] expand out SIMPLE_RENDERABLE macro --- .../src/RenderablePolyVoxEntityItem.cpp | 21 +++++++++++++++++++ .../src/RenderablePolyVoxEntityItem.h | 10 ++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 46cfcefa40..a68cd86b16 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -399,6 +399,27 @@ void RenderablePolyVoxEntityItem::getModel() { _needsModelReload = false; } +bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges) { + _myItem = scene->allocateID(); + + auto renderData = RenderableEntityItemProxy::Pointer(new RenderableEntityItemProxy(self)); + auto renderPayload = render::PayloadPointer(new RenderableEntityItemProxy::Payload(renderData)); + + pendingChanges.resetItem(_myItem, renderPayload); + + return true; +} + +void RenderablePolyVoxEntityItem::removeFromScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges) { + pendingChanges.removeItem(_myItem); +} + + + void RenderablePolyVoxEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderablePolyVoxEntityItem::render"); assert(getType() == EntityTypes::PolyVox); diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index 1097ad21be..b90db6fabf 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -70,12 +70,20 @@ public: virtual void setVoxelInVolume(glm::vec3 position, uint8_t toValue); - SIMPLE_RENDERABLE(); + virtual bool addToScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges); + virtual void removeFromScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges); + protected: virtual void updateVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle); private: + render::ItemID _myItem; + // The PolyVoxEntityItem class has _voxelData which contains dimensions and compressed voxel data. The dimensions // may not match _voxelVolumeSize. From f2d8c78a88a3887690752a75d124790eb612b7d9 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 28 Jun 2015 07:53:16 -0700 Subject: [PATCH 02/16] make voxel editing work, even if the voxel-space is empty --- examples/voxels.js | 52 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/examples/voxels.js b/examples/voxels.js index 799af04bef..38b839adb1 100644 --- a/examples/voxels.js +++ b/examples/voxels.js @@ -2,6 +2,32 @@ var controlHeld = false; var shiftHeld = false; +function attemptVoxelChange(intersection) { + var ids = Entities.findEntities(intersection.intersection, 10); + var success = false; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (controlHeld) { + // hold control to erase a sphere + if (Entities.setVoxelSphere(id, intersection.intersection, 1.0, 0)) { + success = true; + } + } else if (shiftHeld) { + // hold shift to set all voxels to 255 + if (Entities.setAllVoxels(id, 255)) { + success = true; + } + } else { + // no modifier key means to add a sphere + if (Entities.setVoxelSphere(id, intersection.intersection, 1.0, 255)) { + success = true; + } + } + } + return success; +} + + function mousePressEvent(event) { if (!event.isLeftButton) { return; @@ -9,20 +35,24 @@ function mousePressEvent(event) { var pickRay = Camera.computePickRay(event.x, event.y); var intersection = Entities.findRayIntersection(pickRay, true); // accurate picking - // var props = Entities.getEntityProperties(intersection.entityID); + + // we've used a picking ray to decide where to add the new sphere of voxels. If we pick nothing + // or if we pick a non-PolyVox entity, we fall through to the next picking attempt. if (intersection.intersects) { - var ids = Entities.findEntities(intersection.intersection, 10); - for (var i = 0; i < ids.length; i++) { - var id = ids[i]; - if (controlHeld) { - Entities.setVoxelSphere(id, intersection.intersection, 1.0, 0); - } else if (shiftHeld) { - Entities.setAllVoxels(id, 255); - } else { - Entities.setVoxelSphere(id, intersection.intersection, 1.0, 255); - } + if (attemptVoxelChange(intersection)) { + print("here0"); + return; } } + + // if the PolyVox entity is empty, we can't pick against its voxel. try picking against it's + // bounding box, instead. + intersection = Entities.findRayIntersection(pickRay, false); // bounding box picking + if (intersection.intersects) { + print("here1"); + attemptVoxelChange(intersection); + } + print("here2"); } From b19517ace76787605ba7aa21652f34f39d9ced12 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 28 Jun 2015 07:53:35 -0700 Subject: [PATCH 03/16] make voxel editing work, even if the voxel-space is empty --- examples/voxels.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/voxels.js b/examples/voxels.js index 38b839adb1..991abd7253 100644 --- a/examples/voxels.js +++ b/examples/voxels.js @@ -40,7 +40,6 @@ function mousePressEvent(event) { // or if we pick a non-PolyVox entity, we fall through to the next picking attempt. if (intersection.intersects) { if (attemptVoxelChange(intersection)) { - print("here0"); return; } } @@ -49,10 +48,8 @@ function mousePressEvent(event) { // bounding box, instead. intersection = Entities.findRayIntersection(pickRay, false); // bounding box picking if (intersection.intersects) { - print("here1"); attemptVoxelChange(intersection); } - print("here2"); } From 4d2c9b39ce20b58d09498d894cfd4bed925baf10 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 29 Jun 2015 09:44:20 -0700 Subject: [PATCH 04/16] swap out auto for the actual types --- .../entities-renderer/src/RenderablePolyVoxEntityItem.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index a68cd86b16..a75e177b77 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -404,8 +404,11 @@ bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, render::PendingChanges& pendingChanges) { _myItem = scene->allocateID(); - auto renderData = RenderableEntityItemProxy::Pointer(new RenderableEntityItemProxy(self)); - auto renderPayload = render::PayloadPointer(new RenderableEntityItemProxy::Payload(renderData)); + std::shared_ptr renderData = + RenderableEntityItemProxy::Pointer(new RenderableEntityItemProxy(self)); + // render::PayloadPointer renderPayload = + std::shared_ptr renderPayload = + render::PayloadPointer(new RenderableEntityItemProxy::Payload(renderData)); pendingChanges.resetItem(_myItem, renderPayload); From 963126871093e6dd2ad87f6ee9d1df46a0b4b775 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 26 Jul 2015 21:03:11 -0700 Subject: [PATCH 05/16] don't double-call updateOnCount when RenderablePolyVoxEntityItem::setAll is called --- libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index d3ee312311..81e4654840 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -275,7 +275,6 @@ void RenderablePolyVoxEntityItem::setAll(uint8_t toValue) { for (int z = 0; z < _voxelVolumeSize.z; z++) { for (int y = 0; y < _voxelVolumeSize.y; y++) { for (int x = 0; x < _voxelVolumeSize.x; x++) { - updateOnCount(x, y, z, toValue); setVoxelInternal(x, y, z, toValue); } } From 52ee9526ce2914b9522f1de2190b73ae6497b78a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 30 Jul 2015 13:20:19 -0700 Subject: [PATCH 06/16] add 3 new texture-url properties for polyvox --- examples/html/entityProperties.html | 25 ++++++++++++++- examples/libraries/entityPropertyDialogBox.js | 32 ++++++++++++------- .../entities/src/EntityItemProperties.cpp | 26 +++++++++++++++ libraries/entities/src/EntityItemProperties.h | 6 ++++ libraries/entities/src/EntityPropertyFlags.h | 4 +++ libraries/entities/src/PolyVoxEntityItem.cpp | 24 +++++++++++++- libraries/entities/src/PolyVoxEntityItem.h | 17 ++++++++++ .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 1 + 9 files changed, 123 insertions(+), 14 deletions(-) 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 @@ - + + + +
X-axis Texture URL
+
+ +
+ +
Y-axis Texture URL
+
+ +
+ +
Z-axis Texture URL
+
+
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()), 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(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 From 8d2aacb46d9913d39046b01c10b4f2d79950aad1 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 30 Jul 2015 15:36:07 -0700 Subject: [PATCH 07/16] send X texture to renderer --- examples/html/entityProperties.html | 3 +- .../src/RenderablePolyVoxEntityItem.cpp | 33 +++++++++++++++++-- .../src/RenderablePolyVoxEntityItem.h | 9 +++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index cb680dd83a..a2358b40d5 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -618,7 +618,8 @@ elVoxelVolumeSizeZ.value = properties.voxelVolumeSize.z.toFixed(2); elVoxelSurfaceStyle.value = properties.voxelSurfaceStyle; elXTextureURL.value = properties.xTextureURL; - + elYTextureURL.value = properties.yTextureURL; + elZTextureURL.value = properties.zTextureURL; } if (selected) { diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 81e4654840..5e18f8db55 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -45,7 +45,10 @@ EntityItemPointer RenderablePolyVoxEntityItem::factory(const EntityItemID& entit RenderablePolyVoxEntityItem::RenderablePolyVoxEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - PolyVoxEntityItem(entityItemID, properties) { + PolyVoxEntityItem(entityItemID, properties), + _xTexture(nullptr), + _yTexture(nullptr), + _zTexture(nullptr) { model::Mesh* mesh = new model::Mesh(); model::MeshPointer meshPtr(mesh); @@ -410,7 +413,7 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { auto mesh = _modelGeometry.getMesh(); Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; - DependencyManager::get()->bindSimpleProgram(batch); + DependencyManager::get()->bindSimpleProgram(batch, true); batch.setModelTransform(transform); batch.setInputFormat(mesh->getVertexFormat()); batch.setInputBuffer(gpu::Stream::POSITION, mesh->getVertexBuffer()); @@ -421,6 +424,20 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { batch.setIndexBuffer(gpu::UINT32, mesh->getIndexBuffer()._buffer, 0); batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); + if (!_xTextureURL.isEmpty() && !_xTexture) { + _xTexture = DependencyManager::get()->getTexture(_xTextureURL); + } + if (!_yTextureURL.isEmpty() && !_yTexture) { + _yTexture = DependencyManager::get()->getTexture(_yTextureURL); + } + if (!_zTextureURL.isEmpty() && !_zTexture) { + _zTexture = DependencyManager::get()->getTexture(_zTextureURL); + } + + if (_xTexture) { + batch.setResourceTexture(0, _xTexture->getGPUTexture()); + } + RenderableDebugableEntityItem::render(this, args); } @@ -708,3 +725,15 @@ void RenderablePolyVoxEntityItem::computeShapeInfo(ShapeInfo& info) { info.setParams(type, collisionModelDimensions, QString(b64)); info.setConvexHulls(_points); } + +void RenderablePolyVoxEntityItem::setXTextureURL(QString xTextureURL) { + PolyVoxEntityItem::setXTextureURL(xTextureURL); +} + +void RenderablePolyVoxEntityItem::setYTextureURL(QString yTextureURL) { + PolyVoxEntityItem::setYTextureURL(yTextureURL); +} + +void RenderablePolyVoxEntityItem::setZTextureURL(QString zTextureURL) { + PolyVoxEntityItem::setZTextureURL(zTextureURL); +} diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index 1097ad21be..d3fac2a7a9 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -13,6 +13,7 @@ #define hifi_RenderablePolyVoxEntityItem_h #include +#include #include "PolyVoxEntityItem.h" #include "RenderableDebugableEntityItem.h" @@ -72,6 +73,10 @@ public: SIMPLE_RENDERABLE(); + virtual void setXTextureURL(QString xTextureURL); + virtual void setYTextureURL(QString yTextureURL); + virtual void setZTextureURL(QString zTextureURL); + protected: virtual void updateVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle); @@ -90,6 +95,10 @@ private: QVector> _points; // XXX + NetworkTexturePointer _xTexture; + NetworkTexturePointer _yTexture; + NetworkTexturePointer _zTexture; + int _onCount = 0; // how many non-zero voxels are in _volData }; From 443b9e1e786bea74491ec273470129524d7b2e4a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 31 Jul 2015 21:58:43 -0700 Subject: [PATCH 08/16] attempt to give polyvox its own rendering bung --- .../src/RenderablePolyVoxEntityItem.cpp | 285 +++++++++++------- .../src/RenderablePolyVoxEntityItem.h | 31 +- libraries/entities-renderer/src/polyvox.slf | 56 ++++ libraries/entities-renderer/src/polyvox.slv | 44 +++ 4 files changed, 300 insertions(+), 116 deletions(-) create mode 100644 libraries/entities-renderer/src/polyvox.slf create mode 100644 libraries/entities-renderer/src/polyvox.slv diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 21911618b0..d8d1975c0b 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -37,8 +38,12 @@ #include "model/Geometry.h" #include "gpu/Context.h" #include "EntityTreeRenderer.h" +#include "polyvox_vert.h" +#include "polyvox_frag.h" #include "RenderablePolyVoxEntityItem.h" +// gpu::PipelinePointer RenderablePolyVoxEntityItem::_pipeline = nullptr; + EntityItemPointer RenderablePolyVoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return std::make_shared(entityID, properties); } @@ -327,120 +332,6 @@ void RenderablePolyVoxEntityItem::setSphere(glm::vec3 centerWorldCoords, float r setSphereInVolume(glm::vec3(centerVoxelCoords), radiusVoxelCoords, toValue); } -void RenderablePolyVoxEntityItem::getModel() { - // A mesh object to hold the result of surface extraction - PolyVox::SurfaceMesh polyVoxMesh; - - switch (_voxelSurfaceStyle) { - case PolyVoxEntityItem::SURFACE_MARCHING_CUBES: { - PolyVox::MarchingCubesSurfaceExtractor> surfaceExtractor - (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); - surfaceExtractor.execute(); - break; - } - case PolyVoxEntityItem::SURFACE_EDGED_CUBIC: - case PolyVoxEntityItem::SURFACE_CUBIC: { - PolyVox::CubicSurfaceExtractorWithNormals> surfaceExtractor - (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); - surfaceExtractor.execute(); - break; - } - } - - // convert PolyVox mesh to a Sam mesh - auto mesh = _modelGeometry.getMesh(); - - const std::vector& vecIndices = polyVoxMesh.getIndices(); - auto indexBuffer = std::make_shared(vecIndices.size() * sizeof(uint32_t), - (gpu::Byte*)vecIndices.data()); - auto indexBufferPtr = gpu::BufferPointer(indexBuffer); - auto indexBufferView = new gpu::BufferView(indexBufferPtr, gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW)); - mesh->setIndexBuffer(*indexBufferView); - - - const std::vector& vecVertices = polyVoxMesh.getVertices(); - auto vertexBuffer = std::make_shared(vecVertices.size() * sizeof(PolyVox::PositionMaterialNormal), - (gpu::Byte*)vecVertices.data()); - auto vertexBufferPtr = gpu::BufferPointer(vertexBuffer); - auto vertexBufferView = new gpu::BufferView(vertexBufferPtr, - 0, - vertexBufferPtr->getSize() - sizeof(float) * 3, - sizeof(PolyVox::PositionMaterialNormal), - gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW)); - mesh->setVertexBuffer(*vertexBufferView); - mesh->addAttribute(gpu::Stream::NORMAL, - gpu::BufferView(vertexBufferPtr, - sizeof(float) * 3, - vertexBufferPtr->getSize() - sizeof(float) * 3, - sizeof(PolyVox::PositionMaterialNormal), - gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW))); - - - - // auto normalAttrib = mesh->getAttributeBuffer(gpu::Stream::NORMAL); - // for (auto normal = normalAttrib.begin(); normal != normalAttrib.end(); normal++) { - // (*normal) = -(*normal); - // } - - - // mesh->addAttribute(gpu::Stream::TEXCOORD, - // gpu::BufferView(vertexBufferPtr, - // sizeof(float) * 2, - // vertexBufferPtr->getSize() - sizeof(float) * 2, - // sizeof(PolyVox::PositionMaterialNormal), - // gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::RAW))); - - - - #ifdef WANT_DEBUG - qDebug() << "---- vecIndices.size() =" << vecIndices.size(); - qDebug() << "---- vecVertices.size() =" << vecVertices.size(); - #endif - - _needsModelReload = false; -} - -void RenderablePolyVoxEntityItem::render(RenderArgs* args) { - PerformanceTimer perfTimer("RenderablePolyVoxEntityItem::render"); - assert(getType() == EntityTypes::PolyVox); - - if (_needsModelReload) { - getModel(); - } - - Transform transform(voxelToWorldMatrix()); - - auto mesh = _modelGeometry.getMesh(); - Q_ASSERT(args->_batch); - gpu::Batch& batch = *args->_batch; - DependencyManager::get()->bindSimpleProgram(batch, true); - batch.setModelTransform(transform); - batch.setInputFormat(mesh->getVertexFormat()); - batch.setInputBuffer(gpu::Stream::POSITION, mesh->getVertexBuffer()); - batch.setInputBuffer(gpu::Stream::NORMAL, - mesh->getVertexBuffer()._buffer, - sizeof(float) * 3, - mesh->getVertexBuffer()._stride); - batch.setIndexBuffer(gpu::UINT32, mesh->getIndexBuffer()._buffer, 0); - batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); - - if (!_xTextureURL.isEmpty() && !_xTexture) { - _xTexture = DependencyManager::get()->getTexture(_xTextureURL); - } - if (!_yTextureURL.isEmpty() && !_yTexture) { - _yTexture = DependencyManager::get()->getTexture(_yTextureURL); - } - if (!_zTextureURL.isEmpty() && !_zTexture) { - _zTexture = DependencyManager::get()->getTexture(_zTextureURL); - } - - if (_xTexture) { - batch.setResourceTexture(0, _xTexture->getGPUTexture()); - } - - RenderableDebugableEntityItem::render(this, args); -} - class RaycastFunctor { public: @@ -737,3 +628,169 @@ void RenderablePolyVoxEntityItem::setYTextureURL(QString yTextureURL) { void RenderablePolyVoxEntityItem::setZTextureURL(QString zTextureURL) { PolyVoxEntityItem::setZTextureURL(zTextureURL); } + +void RenderablePolyVoxEntityItem::getModel() { + // A mesh object to hold the result of surface extraction + PolyVox::SurfaceMesh polyVoxMesh; + + switch (_voxelSurfaceStyle) { + case PolyVoxEntityItem::SURFACE_MARCHING_CUBES: { + PolyVox::MarchingCubesSurfaceExtractor> surfaceExtractor + (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); + surfaceExtractor.execute(); + break; + } + case PolyVoxEntityItem::SURFACE_EDGED_CUBIC: + case PolyVoxEntityItem::SURFACE_CUBIC: { + PolyVox::CubicSurfaceExtractorWithNormals> surfaceExtractor + (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); + surfaceExtractor.execute(); + break; + } + } + + // convert PolyVox mesh to a Sam mesh + auto mesh = _modelGeometry.getMesh(); + + const std::vector& vecIndices = polyVoxMesh.getIndices(); + auto indexBuffer = std::make_shared(vecIndices.size() * sizeof(uint32_t), + (gpu::Byte*)vecIndices.data()); + auto indexBufferPtr = gpu::BufferPointer(indexBuffer); + auto indexBufferView = new gpu::BufferView(indexBufferPtr, gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW)); + mesh->setIndexBuffer(*indexBufferView); + + + const std::vector& vecVertices = polyVoxMesh.getVertices(); + auto vertexBuffer = std::make_shared(vecVertices.size() * sizeof(PolyVox::PositionMaterialNormal), + (gpu::Byte*)vecVertices.data()); + auto vertexBufferPtr = gpu::BufferPointer(vertexBuffer); + auto vertexBufferView = new gpu::BufferView(vertexBufferPtr, + 0, + vertexBufferPtr->getSize() - sizeof(float) * 3, + sizeof(PolyVox::PositionMaterialNormal), + gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW)); + mesh->setVertexBuffer(*vertexBufferView); + mesh->addAttribute(gpu::Stream::NORMAL, + gpu::BufferView(vertexBufferPtr, + sizeof(float) * 3, + vertexBufferPtr->getSize() - sizeof(float) * 3, + sizeof(PolyVox::PositionMaterialNormal), + gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW))); + + + + // mesh->addAttribute(gpu::Stream::TEXCOORD, + // gpu::BufferView(vertexBufferPtr, + // sizeof(float) * 2, + // vertexBufferPtr->getSize() - sizeof(float) * 2, + // sizeof(PolyVox::PositionMaterialNormal), + // gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::RAW))); + + + + #ifdef WANT_DEBUG + qDebug() << "---- vecIndices.size() =" << vecIndices.size(); + qDebug() << "---- vecVertices.size() =" << vecVertices.size(); + #endif + + _needsModelReload = false; +} + +void RenderablePolyVoxEntityItem::render(RenderArgs* args) { + PerformanceTimer perfTimer("RenderablePolyVoxEntityItem::render"); + assert(getType() == EntityTypes::PolyVox); + Q_ASSERT(args->_batch); + + if (!_pipeline) { + gpu::ShaderPointer vertexShader = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(polyvox_vert))); + gpu::ShaderPointer pixelShader = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(polyvox_frag))); + + gpu::Shader::BindingSet slotBindings; + // slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), MATERIAL_GPU_SLOT)); + + gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(vertexShader, pixelShader)); + gpu::Shader::makeProgram(*program, slotBindings); + + auto state = std::make_shared(); + state->setCullMode(gpu::State::CULL_BACK); + state->setDepthTest(true, true, gpu::LESS_EQUAL); + + _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, state)); + } + + if (_needsModelReload) { + getModel(); + } + + gpu::Batch& batch = *args->_batch; + batch.setPipeline(_pipeline); + + auto mesh = _modelGeometry.getMesh(); + Transform transform(voxelToWorldMatrix()); + batch.setModelTransform(transform); + batch.setInputFormat(mesh->getVertexFormat()); + batch.setInputBuffer(gpu::Stream::POSITION, mesh->getVertexBuffer()); + batch.setInputBuffer(gpu::Stream::NORMAL, + mesh->getVertexBuffer()._buffer, + sizeof(float) * 3, + mesh->getVertexBuffer()._stride); + batch.setIndexBuffer(gpu::UINT32, mesh->getIndexBuffer()._buffer, 0); + batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); + + if (!_xTextureURL.isEmpty() && !_xTexture) { + _xTexture = DependencyManager::get()->getTexture(_xTextureURL); + } + if (!_yTextureURL.isEmpty() && !_yTexture) { + _yTexture = DependencyManager::get()->getTexture(_yTextureURL); + } + if (!_zTextureURL.isEmpty() && !_zTexture) { + _zTexture = DependencyManager::get()->getTexture(_zTextureURL); + } + + // batch._glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + if (_xTexture) { + batch.setResourceTexture(0, _xTexture->getGPUTexture()); + } + + RenderableDebugableEntityItem::render(this, args); +} + +bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges) { + _myItem = scene->allocateID(); + + auto renderItem = std::make_shared(shared_from_this()); + auto renderData = PolyVoxPayload::Pointer(renderItem); + auto renderPayload = std::make_shared(renderData); + + pendingChanges.resetItem(_myItem, renderPayload); + + return true; +} + +void RenderablePolyVoxEntityItem::removeFromScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges) { + pendingChanges.removeItem(_myItem); +} + +namespace render { + template <> const ItemKey payloadGetKey(const PolyVoxPayload::Pointer& payload) { + return ItemKey::Builder::opaqueShape(); + } + + template <> const Item::Bound payloadGetBound(const PolyVoxPayload::Pointer& payload) { + if (payload) { + return payload->_bounds; + } + return render::Item::Bound(); + } + + template <> void payloadRender(const PolyVoxPayload::Pointer& payload, RenderArgs* args) { + if (args) { + payload->_owner->render(args); + } + } +} diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index d3fac2a7a9..6b65d834cc 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -19,6 +19,24 @@ #include "RenderableDebugableEntityItem.h" #include "RenderableEntityItem.h" + +class PolyVoxPayload { +public: + PolyVoxPayload(EntityItemPointer owner) : _owner(owner), _bounds(AABox()) { } + typedef render::Payload Payload; + typedef Payload::DataPointer Pointer; + + EntityItemPointer _owner; + AABox _bounds; +}; + +namespace render { + template <> const ItemKey payloadGetKey(const PolyVoxPayload::Pointer& payload); + template <> const Item::Bound payloadGetBound(const PolyVoxPayload::Pointer& payload); + template <> void payloadRender(const PolyVoxPayload::Pointer& payload, RenderArgs* args); +} + + class RenderablePolyVoxEntityItem : public PolyVoxEntityItem { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); @@ -71,12 +89,17 @@ public: virtual void setVoxelInVolume(glm::vec3 position, uint8_t toValue); - SIMPLE_RENDERABLE(); - virtual void setXTextureURL(QString xTextureURL); virtual void setYTextureURL(QString yTextureURL); virtual void setZTextureURL(QString zTextureURL); + virtual bool addToScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges); + virtual void removeFromScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges); + protected: virtual void updateVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle); @@ -100,6 +123,10 @@ private: NetworkTexturePointer _zTexture; int _onCount = 0; // how many non-zero voxels are in _volData + + const int MATERIAL_GPU_SLOT = 3; + render::ItemID _myItem; + /*static*/ gpu::PipelinePointer _pipeline; }; diff --git a/libraries/entities-renderer/src/polyvox.slf b/libraries/entities-renderer/src/polyvox.slf new file mode 100644 index 0000000000..28433a70ca --- /dev/null +++ b/libraries/entities-renderer/src/polyvox.slf @@ -0,0 +1,56 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// model.frag +// fragment shader +// +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + + +// the glow intensity +uniform float glowIntensity; + +// the alpha threshold +uniform float alphaThreshold; + +float evalOpaqueFinalAlpha(float alpha, float mapAlpha) { + return mix(alpha * glowIntensity, 1.0 - alpha * glowIntensity, step(mapAlpha, alphaThreshold)); +} + +void packDeferredFragment(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { + if (alpha != glowIntensity) { + discard; + } + gl_FragData[0] = vec4(diffuse.rgb, alpha); + gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[2] = vec4(specular, shininess / 128.0); +} + +<@include model/Material.slh@> + +// the diffuse texture +uniform sampler2D diffuseMap; + +// the interpolated normal +varying vec4 interpolatedNormal; + +varying vec3 color; + + +void main(void) { + // Fetch diffuse map + vec4 diffuse = texture2D(diffuseMap, gl_TexCoord[0].st); + + Material mat = getMaterial(); + + packDeferredFragment( + normalize(interpolatedNormal.xyz), + evalOpaqueFinalAlpha(getMaterialOpacity(mat), diffuse.a), + getMaterialDiffuse(mat) * diffuse.rgb * color, + getMaterialSpecular(mat), + getMaterialShininess(mat)); +} diff --git a/libraries/entities-renderer/src/polyvox.slv b/libraries/entities-renderer/src/polyvox.slv new file mode 100644 index 0000000000..e413b852dc --- /dev/null +++ b/libraries/entities-renderer/src/polyvox.slv @@ -0,0 +1,44 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// polyvox.vert +// vertex shader +// +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include gpu/Transform.slh@> + +<$declareStandardTransform()$> + +const int MAX_TEXCOORDS = 2; + +uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; + +// interpolated eye position +varying vec4 interpolatedPosition; + +// the interpolated normal +varying vec4 interpolatedNormal; + +varying vec3 color; + +void main(void) { + + // pass along the diffuse color + color = gl_Color.xyz; + + // and the texture coordinates + gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); + + // standard transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + <$transformModelToEyeAndClipPos(cam, obj, gl_Vertex, interpolatedPosition, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); +} From dbca3fe2fbda2297e466b32ac9573e147dde21da Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sat, 1 Aug 2015 05:58:22 -0700 Subject: [PATCH 09/16] attempt to give polyvox its own rendering bung --- .../src/RenderablePolyVoxEntityItem.cpp | 21 ++++++++++++------- .../src/RenderablePolyVoxEntityItem.h | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index d8d1975c0b..4f21fec4d3 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -42,7 +42,7 @@ #include "polyvox_frag.h" #include "RenderablePolyVoxEntityItem.h" -// gpu::PipelinePointer RenderablePolyVoxEntityItem::_pipeline = nullptr; +gpu::PipelinePointer RenderablePolyVoxEntityItem::_pipeline = nullptr; EntityItemPointer RenderablePolyVoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return std::make_shared(entityID, properties); @@ -54,7 +54,6 @@ RenderablePolyVoxEntityItem::RenderablePolyVoxEntityItem(const EntityItemID& ent _xTexture(nullptr), _yTexture(nullptr), _zTexture(nullptr) { - model::Mesh* mesh = new model::Mesh(); model::MeshPointer meshPtr(mesh); _modelGeometry.setMesh(meshPtr); @@ -706,7 +705,12 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { gpu::ShaderPointer pixelShader = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(polyvox_frag))); gpu::Shader::BindingSet slotBindings; - // slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), MATERIAL_GPU_SLOT)); + slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), MATERIAL_GPU_SLOT)); + // slotBindings.insert(gpu::Shader::Binding(std::string("diffuseMap"), 0)); + // slotBindings.insert(gpu::Shader::Binding(std::string("normalMap"), 1)); + // slotBindings.insert(gpu::Shader::Binding(std::string("specularMap"), 2)); + // slotBindings.insert(gpu::Shader::Binding(std::string("emissiveMap"), 3)); + // slotBindings.insert(gpu::Shader::Binding(std::string("lightBuffer"), 4)); gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(vertexShader, pixelShader)); gpu::Shader::makeProgram(*program, slotBindings); @@ -747,7 +751,7 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { _zTexture = DependencyManager::get()->getTexture(_zTextureURL); } - // batch._glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + batch._glColor4f(1.0f, 1.0f, 1.0f, 1.0f); if (_xTexture) { batch.setResourceTexture(0, _xTexture->getGPUTexture()); @@ -782,14 +786,15 @@ namespace render { } template <> const Item::Bound payloadGetBound(const PolyVoxPayload::Pointer& payload) { - if (payload) { - return payload->_bounds; - } + // if (payload && payload->_owner) { + // auto polyVoxEntity = std::dynamic_pointer_cast(payload->_owner); + // return polyVoxEntity->getBoundingBox(); + // } return render::Item::Bound(); } template <> void payloadRender(const PolyVoxPayload::Pointer& payload, RenderArgs* args) { - if (args) { + if (args && payload && payload->_owner) { payload->_owner->render(args); } } diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index 6b65d834cc..d495900ce9 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -126,7 +126,7 @@ private: const int MATERIAL_GPU_SLOT = 3; render::ItemID _myItem; - /*static*/ gpu::PipelinePointer _pipeline; + static gpu::PipelinePointer _pipeline; }; From dbda5ba40e0f08dfd502b174611fa1e16e02fe7e Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 4 Aug 2015 11:26:29 -0700 Subject: [PATCH 10/16] change polyvox rendering --- examples/voxels.js | 2 +- .../src/RenderablePolyVoxEntityItem.cpp | 138 ++++++++++++++++++ .../src/RenderablePolyVoxEntityItem.h | 10 ++ 3 files changed, 149 insertions(+), 1 deletion(-) diff --git a/examples/voxels.js b/examples/voxels.js index e110f15260..9627b40701 100644 --- a/examples/voxels.js +++ b/examples/voxels.js @@ -44,7 +44,7 @@ function mousePressEvent(event) { } } - // if the PolyVox entity is empty, we can't pick against its voxel. try picking against its + // if the PolyVox entity is empty, we can't pick against its "on" voxels. try picking against its // bounding box, instead. intersection = Entities.findRayIntersection(pickRay, false); // bounding box picking if (intersection.intersects) { diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 4f21fec4d3..ca049e45b1 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -331,6 +331,144 @@ void RenderablePolyVoxEntityItem::setSphere(glm::vec3 centerWorldCoords, float r setSphereInVolume(glm::vec3(centerVoxelCoords), radiusVoxelCoords, toValue); } +void RenderablePolyVoxEntityItem::getModel() { + // A mesh object to hold the result of surface extraction + PolyVox::SurfaceMesh polyVoxMesh; + + switch (_voxelSurfaceStyle) { + case PolyVoxEntityItem::SURFACE_MARCHING_CUBES: { + PolyVox::MarchingCubesSurfaceExtractor> surfaceExtractor + (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); + surfaceExtractor.execute(); + break; + } + case PolyVoxEntityItem::SURFACE_EDGED_CUBIC: + case PolyVoxEntityItem::SURFACE_CUBIC: { + PolyVox::CubicSurfaceExtractorWithNormals> surfaceExtractor + (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); + surfaceExtractor.execute(); + break; + } + } + + // convert PolyVox mesh to a Sam mesh + auto mesh = _modelGeometry.getMesh(); + + const std::vector& vecIndices = polyVoxMesh.getIndices(); + auto indexBuffer = std::make_shared(vecIndices.size() * sizeof(uint32_t), + (gpu::Byte*)vecIndices.data()); + auto indexBufferPtr = gpu::BufferPointer(indexBuffer); + auto indexBufferView = new gpu::BufferView(indexBufferPtr, gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW)); + mesh->setIndexBuffer(*indexBufferView); + + + const std::vector& vecVertices = polyVoxMesh.getVertices(); + auto vertexBuffer = std::make_shared(vecVertices.size() * sizeof(PolyVox::PositionMaterialNormal), + (gpu::Byte*)vecVertices.data()); + auto vertexBufferPtr = gpu::BufferPointer(vertexBuffer); + auto vertexBufferView = new gpu::BufferView(vertexBufferPtr, + 0, + vertexBufferPtr->getSize() - sizeof(float) * 3, + sizeof(PolyVox::PositionMaterialNormal), + gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW)); + mesh->setVertexBuffer(*vertexBufferView); + mesh->addAttribute(gpu::Stream::NORMAL, + gpu::BufferView(vertexBufferPtr, + sizeof(float) * 3, + vertexBufferPtr->getSize() - sizeof(float) * 3, + sizeof(PolyVox::PositionMaterialNormal), + gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW))); + + + + // auto normalAttrib = mesh->getAttributeBuffer(gpu::Stream::NORMAL); + // for (auto normal = normalAttrib.begin(); normal != normalAttrib.end(); normal++) { + // (*normal) = -(*normal); + // } + + + // mesh->addAttribute(gpu::Stream::TEXCOORD, + // gpu::BufferView(vertexBufferPtr, + // sizeof(float) * 2, + // vertexBufferPtr->getSize() - sizeof(float) * 2, + // sizeof(PolyVox::PositionMaterialNormal), + // gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::RAW))); + + + + #ifdef WANT_DEBUG + qDebug() << "---- vecIndices.size() =" << vecIndices.size(); + qDebug() << "---- vecVertices.size() =" << vecVertices.size(); + #endif + + _needsModelReload = false; +} + +bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges) { + _myItem = scene->allocateID(); + + std::shared_ptr renderData = + RenderableEntityItemProxy::Pointer(new RenderableEntityItemProxy(self)); + // render::PayloadPointer renderPayload = + std::shared_ptr renderPayload = + render::PayloadPointer(new RenderableEntityItemProxy::Payload(renderData)); + + pendingChanges.resetItem(_myItem, renderPayload); + + return true; +} + +void RenderablePolyVoxEntityItem::removeFromScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges) { + pendingChanges.removeItem(_myItem); +} + + + +void RenderablePolyVoxEntityItem::render(RenderArgs* args) { + PerformanceTimer perfTimer("RenderablePolyVoxEntityItem::render"); + assert(getType() == EntityTypes::PolyVox); + + if (_needsModelReload) { + getModel(); + } + + Transform transform(voxelToWorldMatrix()); + + auto mesh = _modelGeometry.getMesh(); + Q_ASSERT(args->_batch); + gpu::Batch& batch = *args->_batch; + DependencyManager::get()->bindSimpleProgram(batch, true); + batch.setModelTransform(transform); + batch.setInputFormat(mesh->getVertexFormat()); + batch.setInputBuffer(gpu::Stream::POSITION, mesh->getVertexBuffer()); + batch.setInputBuffer(gpu::Stream::NORMAL, + mesh->getVertexBuffer()._buffer, + sizeof(float) * 3, + mesh->getVertexBuffer()._stride); + batch.setIndexBuffer(gpu::UINT32, mesh->getIndexBuffer()._buffer, 0); + batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); + + if (!_xTextureURL.isEmpty() && !_xTexture) { + _xTexture = DependencyManager::get()->getTexture(_xTextureURL); + } + if (!_yTextureURL.isEmpty() && !_yTexture) { + _yTexture = DependencyManager::get()->getTexture(_yTextureURL); + } + if (!_zTextureURL.isEmpty() && !_zTexture) { + _zTexture = DependencyManager::get()->getTexture(_zTextureURL); + } + + if (_xTexture) { + batch.setResourceTexture(0, _xTexture->getGPUTexture()); + } + + RenderableDebugableEntityItem::render(this, args); +} + class RaycastFunctor { public: diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index d495900ce9..40925cb765 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -89,6 +89,14 @@ public: virtual void setVoxelInVolume(glm::vec3 position, uint8_t toValue); + virtual bool addToScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges); + virtual void removeFromScene(EntityItemPointer self, + std::shared_ptr scene, + render::PendingChanges& pendingChanges); + + virtual void setXTextureURL(QString xTextureURL); virtual void setYTextureURL(QString yTextureURL); virtual void setZTextureURL(QString zTextureURL); @@ -104,6 +112,8 @@ protected: virtual void updateVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle); private: + render::ItemID _myItem; + // The PolyVoxEntityItem class has _voxelData which contains dimensions and compressed voxel data. The dimensions // may not match _voxelVolumeSize. From 419caccd8ec9675ff204d203d67de81d931688ae Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 4 Aug 2015 17:06:17 -0700 Subject: [PATCH 11/16] unmangle merge --- .../src/RenderablePolyVoxEntityItem.cpp | 138 ------------------ .../src/RenderablePolyVoxEntityItem.h | 10 -- 2 files changed, 148 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index ca049e45b1..4f21fec4d3 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -331,144 +331,6 @@ void RenderablePolyVoxEntityItem::setSphere(glm::vec3 centerWorldCoords, float r setSphereInVolume(glm::vec3(centerVoxelCoords), radiusVoxelCoords, toValue); } -void RenderablePolyVoxEntityItem::getModel() { - // A mesh object to hold the result of surface extraction - PolyVox::SurfaceMesh polyVoxMesh; - - switch (_voxelSurfaceStyle) { - case PolyVoxEntityItem::SURFACE_MARCHING_CUBES: { - PolyVox::MarchingCubesSurfaceExtractor> surfaceExtractor - (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); - surfaceExtractor.execute(); - break; - } - case PolyVoxEntityItem::SURFACE_EDGED_CUBIC: - case PolyVoxEntityItem::SURFACE_CUBIC: { - PolyVox::CubicSurfaceExtractorWithNormals> surfaceExtractor - (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); - surfaceExtractor.execute(); - break; - } - } - - // convert PolyVox mesh to a Sam mesh - auto mesh = _modelGeometry.getMesh(); - - const std::vector& vecIndices = polyVoxMesh.getIndices(); - auto indexBuffer = std::make_shared(vecIndices.size() * sizeof(uint32_t), - (gpu::Byte*)vecIndices.data()); - auto indexBufferPtr = gpu::BufferPointer(indexBuffer); - auto indexBufferView = new gpu::BufferView(indexBufferPtr, gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW)); - mesh->setIndexBuffer(*indexBufferView); - - - const std::vector& vecVertices = polyVoxMesh.getVertices(); - auto vertexBuffer = std::make_shared(vecVertices.size() * sizeof(PolyVox::PositionMaterialNormal), - (gpu::Byte*)vecVertices.data()); - auto vertexBufferPtr = gpu::BufferPointer(vertexBuffer); - auto vertexBufferView = new gpu::BufferView(vertexBufferPtr, - 0, - vertexBufferPtr->getSize() - sizeof(float) * 3, - sizeof(PolyVox::PositionMaterialNormal), - gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW)); - mesh->setVertexBuffer(*vertexBufferView); - mesh->addAttribute(gpu::Stream::NORMAL, - gpu::BufferView(vertexBufferPtr, - sizeof(float) * 3, - vertexBufferPtr->getSize() - sizeof(float) * 3, - sizeof(PolyVox::PositionMaterialNormal), - gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW))); - - - - // auto normalAttrib = mesh->getAttributeBuffer(gpu::Stream::NORMAL); - // for (auto normal = normalAttrib.begin(); normal != normalAttrib.end(); normal++) { - // (*normal) = -(*normal); - // } - - - // mesh->addAttribute(gpu::Stream::TEXCOORD, - // gpu::BufferView(vertexBufferPtr, - // sizeof(float) * 2, - // vertexBufferPtr->getSize() - sizeof(float) * 2, - // sizeof(PolyVox::PositionMaterialNormal), - // gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::RAW))); - - - - #ifdef WANT_DEBUG - qDebug() << "---- vecIndices.size() =" << vecIndices.size(); - qDebug() << "---- vecVertices.size() =" << vecVertices.size(); - #endif - - _needsModelReload = false; -} - -bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, - std::shared_ptr scene, - render::PendingChanges& pendingChanges) { - _myItem = scene->allocateID(); - - std::shared_ptr renderData = - RenderableEntityItemProxy::Pointer(new RenderableEntityItemProxy(self)); - // render::PayloadPointer renderPayload = - std::shared_ptr renderPayload = - render::PayloadPointer(new RenderableEntityItemProxy::Payload(renderData)); - - pendingChanges.resetItem(_myItem, renderPayload); - - return true; -} - -void RenderablePolyVoxEntityItem::removeFromScene(EntityItemPointer self, - std::shared_ptr scene, - render::PendingChanges& pendingChanges) { - pendingChanges.removeItem(_myItem); -} - - - -void RenderablePolyVoxEntityItem::render(RenderArgs* args) { - PerformanceTimer perfTimer("RenderablePolyVoxEntityItem::render"); - assert(getType() == EntityTypes::PolyVox); - - if (_needsModelReload) { - getModel(); - } - - Transform transform(voxelToWorldMatrix()); - - auto mesh = _modelGeometry.getMesh(); - Q_ASSERT(args->_batch); - gpu::Batch& batch = *args->_batch; - DependencyManager::get()->bindSimpleProgram(batch, true); - batch.setModelTransform(transform); - batch.setInputFormat(mesh->getVertexFormat()); - batch.setInputBuffer(gpu::Stream::POSITION, mesh->getVertexBuffer()); - batch.setInputBuffer(gpu::Stream::NORMAL, - mesh->getVertexBuffer()._buffer, - sizeof(float) * 3, - mesh->getVertexBuffer()._stride); - batch.setIndexBuffer(gpu::UINT32, mesh->getIndexBuffer()._buffer, 0); - batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); - - if (!_xTextureURL.isEmpty() && !_xTexture) { - _xTexture = DependencyManager::get()->getTexture(_xTextureURL); - } - if (!_yTextureURL.isEmpty() && !_yTexture) { - _yTexture = DependencyManager::get()->getTexture(_yTextureURL); - } - if (!_zTextureURL.isEmpty() && !_zTexture) { - _zTexture = DependencyManager::get()->getTexture(_zTextureURL); - } - - if (_xTexture) { - batch.setResourceTexture(0, _xTexture->getGPUTexture()); - } - - RenderableDebugableEntityItem::render(this, args); -} - class RaycastFunctor { public: diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index 40925cb765..d495900ce9 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -89,14 +89,6 @@ public: virtual void setVoxelInVolume(glm::vec3 position, uint8_t toValue); - virtual bool addToScene(EntityItemPointer self, - std::shared_ptr scene, - render::PendingChanges& pendingChanges); - virtual void removeFromScene(EntityItemPointer self, - std::shared_ptr scene, - render::PendingChanges& pendingChanges); - - virtual void setXTextureURL(QString xTextureURL); virtual void setYTextureURL(QString yTextureURL); virtual void setZTextureURL(QString zTextureURL); @@ -112,8 +104,6 @@ protected: virtual void updateVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle); private: - render::ItemID _myItem; - // The PolyVoxEntityItem class has _voxelData which contains dimensions and compressed voxel data. The dimensions // may not match _voxelVolumeSize. From 56c0f9c814b32266cd9c599bc1a7d71f0035cbce Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 4 Aug 2015 17:37:15 -0700 Subject: [PATCH 12/16] work toward getting textures on polyvox entities --- .../src/RenderablePolyVoxEntityItem.cpp | 10 +++++++--- libraries/entities-renderer/src/polyvox.slf | 8 ++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 4f21fec4d3..748ca29770 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -706,8 +706,8 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), MATERIAL_GPU_SLOT)); - // slotBindings.insert(gpu::Shader::Binding(std::string("diffuseMap"), 0)); - // slotBindings.insert(gpu::Shader::Binding(std::string("normalMap"), 1)); + slotBindings.insert(gpu::Shader::Binding(std::string("xMap"), 0)); + slotBindings.insert(gpu::Shader::Binding(std::string("yMap"), 1)); // slotBindings.insert(gpu::Shader::Binding(std::string("specularMap"), 2)); // slotBindings.insert(gpu::Shader::Binding(std::string("emissiveMap"), 3)); // slotBindings.insert(gpu::Shader::Binding(std::string("lightBuffer"), 4)); @@ -739,7 +739,6 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { sizeof(float) * 3, mesh->getVertexBuffer()._stride); batch.setIndexBuffer(gpu::UINT32, mesh->getIndexBuffer()._buffer, 0); - batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); if (!_xTextureURL.isEmpty() && !_xTexture) { _xTexture = DependencyManager::get()->getTexture(_xTextureURL); @@ -756,6 +755,11 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { if (_xTexture) { batch.setResourceTexture(0, _xTexture->getGPUTexture()); } + if (_yTexture) { + batch.setResourceTexture(1, _yTexture->getGPUTexture()); + } + + batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); RenderableDebugableEntityItem::render(this, args); } diff --git a/libraries/entities-renderer/src/polyvox.slf b/libraries/entities-renderer/src/polyvox.slf index 28433a70ca..2d67149bf8 100644 --- a/libraries/entities-renderer/src/polyvox.slf +++ b/libraries/entities-renderer/src/polyvox.slf @@ -49,8 +49,8 @@ void main(void) { packDeferredFragment( normalize(interpolatedNormal.xyz), - evalOpaqueFinalAlpha(getMaterialOpacity(mat), diffuse.a), - getMaterialDiffuse(mat) * diffuse.rgb * color, - getMaterialSpecular(mat), - getMaterialShininess(mat)); + 0.0, + /*getMaterialDiffuse(mat)*/ /*diffuse.rgb * color*/ vec3(1.0, 1.0, 1.0), + /*getMaterialSpecular(mat)*/ vec3(0.02, 0.02, 0.02), + /*getMaterialShininess(mat)*/ 10.0); } From 19aec4a3e7cf1c748aeb03e5330a4f455349ecc3 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 7 Aug 2015 09:07:54 -0700 Subject: [PATCH 13/16] update polyvox shader --- libraries/entities-renderer/src/polyvox.slf | 42 +++------------------ 1 file changed, 5 insertions(+), 37 deletions(-) diff --git a/libraries/entities-renderer/src/polyvox.slf b/libraries/entities-renderer/src/polyvox.slf index c85f301051..4ca3c17db3 100644 --- a/libraries/entities-renderer/src/polyvox.slf +++ b/libraries/entities-renderer/src/polyvox.slf @@ -10,48 +10,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // - -// the glow intensity -uniform float glowIntensity; - -// the alpha threshold -uniform float alphaThreshold; - -float evalOpaqueFinalAlpha(float alpha, float mapAlpha) { - return mix(alpha * glowIntensity, 1.0 - alpha * glowIntensity, step(mapAlpha, alphaThreshold)); -} - void packDeferredFragment(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { - if (alpha != glowIntensity) { - discard; - } - gl_FragData[0] = vec4(diffuse.rgb, alpha); - gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); - gl_FragData[2] = vec4(specular, shininess / 128.0); + _fragColor0 = vec4(diffuse.rgb, alpha); + _fragColor1 = vec4(bestFitNormal(normal), 1.0); + _fragColor2 = vec4(specular, shininess / 128.0); } <@include model/Material.slh@> -// the diffuse texture -uniform sampler2D xMap; -uniform sampler2D yMap; - -// the interpolated normal -varying vec4 interpolatedNormal; - -varying vec3 color; - +in vec3 _normal; void main(void) { - // Fetch diffuse map - // vec4 diffuse = texture2D(xMap, interpolatedNormal.xz * 0.5 + vec2(0.5)); - - Material mat = getMaterial(); - - packDeferredFragment( - normalize(interpolatedNormal.xyz), - 0.0, - /*getMaterialDiffuse(mat)*/ /*diffuse.rgb * */ vec3(1.0, 1.0, 1.0), - /*getMaterialSpecular(mat)*/ vec3(0.02, 0.02, 0.02), - /*getMaterialShininess(mat)*/ 10.0); + packDeferredFragment(normalize(_normal.xyz), 0.0, vec3(1.0, 1.0, 1.0), vec3(0.02, 0.02, 0.02), 10.0); } From fcb30dbbe741c893377edb70d74da48639fbb26a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 7 Aug 2015 13:33:00 -0700 Subject: [PATCH 14/16] hook textures up to polyvoxs --- .../src/RenderablePolyVoxEntityItem.cpp | 15 ++++++-- libraries/entities-renderer/src/polyvox.slf | 36 +++++++++++++++---- libraries/entities-renderer/src/polyvox.slv | 30 +++++----------- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 748ca29770..ecd18bfb41 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -708,9 +708,9 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), MATERIAL_GPU_SLOT)); slotBindings.insert(gpu::Shader::Binding(std::string("xMap"), 0)); slotBindings.insert(gpu::Shader::Binding(std::string("yMap"), 1)); - // slotBindings.insert(gpu::Shader::Binding(std::string("specularMap"), 2)); - // slotBindings.insert(gpu::Shader::Binding(std::string("emissiveMap"), 3)); - // slotBindings.insert(gpu::Shader::Binding(std::string("lightBuffer"), 4)); + slotBindings.insert(gpu::Shader::Binding(std::string("zMap"), 2)); + slotBindings.insert(gpu::Shader::Binding(std::string("polyVoxDimensions"), 3)); + gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(vertexShader, pixelShader)); gpu::Shader::makeProgram(*program, slotBindings); @@ -754,9 +754,18 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { if (_xTexture) { batch.setResourceTexture(0, _xTexture->getGPUTexture()); + } else { + batch.setResourceTexture(0, DependencyManager::get()->getWhiteTexture()); } if (_yTexture) { batch.setResourceTexture(1, _yTexture->getGPUTexture()); + } else { + batch.setResourceTexture(1, DependencyManager::get()->getWhiteTexture()); + } + if (_zTexture) { + batch.setResourceTexture(2, _zTexture->getGPUTexture()); + } else { + batch.setResourceTexture(2, DependencyManager::get()->getWhiteTexture()); } batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); diff --git a/libraries/entities-renderer/src/polyvox.slf b/libraries/entities-renderer/src/polyvox.slf index 4ca3c17db3..e661769947 100644 --- a/libraries/entities-renderer/src/polyvox.slf +++ b/libraries/entities-renderer/src/polyvox.slf @@ -4,22 +4,46 @@ // model.frag // fragment shader // +// Created by Seth Alves on 2015-8-3 // Copyright 2015 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -void packDeferredFragment(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { - _fragColor0 = vec4(diffuse.rgb, alpha); - _fragColor1 = vec4(bestFitNormal(normal), 1.0); - _fragColor2 = vec4(specular, shininess / 128.0); -} +<@include gpu/Inputs.slh@> + +layout(location = 0) out vec4 _fragColor0; +layout(location = 1) out vec4 _fragColor1; +layout(location = 2) out vec4 _fragColor2; <@include model/Material.slh@> in vec3 _normal; +in vec4 _position; +in vec4 _inPosition; + +uniform sampler2D xMap; +uniform sampler2D yMap; +uniform sampler2D zMap; void main(void) { - packDeferredFragment(normalize(_normal.xyz), 0.0, vec3(1.0, 1.0, 1.0), vec3(0.02, 0.02, 0.02), 10.0); + vec3 worldNormal = cross(dFdy(_inPosition.xyz), dFdx(_inPosition.xyz)); + worldNormal = normalize(worldNormal); + + vec4 xyDiffuse = texture2D(xMap, (_inPosition.xy - vec2(0.5)) / -8.0); + vec4 xzDiffuse = texture2D(yMap, (_inPosition.xz - vec2(0.5)) / -8.0); + vec4 yzDiffuse = texture2D(zMap, (_inPosition.yz - vec2(0.5)) / -8.0); + + vec3 xyDiffuseScaled = xyDiffuse.rgb * abs(worldNormal.z); + vec3 xzDiffuseScaled = xzDiffuse.rgb * abs(worldNormal.y); + vec3 yzDiffuseScaled = yzDiffuse.rgb * abs(worldNormal.x); + + vec4 diffuse = vec4(xyDiffuseScaled + xzDiffuseScaled + yzDiffuseScaled, 1.0); + + Material mat = getMaterial(); + + _fragColor0 = vec4(diffuse.rgb, 0.0); + _fragColor1 = vec4(_normal, 1.0); + _fragColor2 = vec4(getMaterialSpecular(mat), getMaterialShininess(mat) / 128.0); } diff --git a/libraries/entities-renderer/src/polyvox.slv b/libraries/entities-renderer/src/polyvox.slv index e413b852dc..0074993c80 100644 --- a/libraries/entities-renderer/src/polyvox.slv +++ b/libraries/entities-renderer/src/polyvox.slv @@ -10,35 +10,21 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Inputs.slh@> + <@include gpu/Transform.slh@> <$declareStandardTransform()$> -const int MAX_TEXCOORDS = 2; - -uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; - -// interpolated eye position -varying vec4 interpolatedPosition; - -// the interpolated normal -varying vec4 interpolatedNormal; - -varying vec3 color; +out vec4 _position; +out vec4 _inPosition; +out vec3 _normal; void main(void) { - - // pass along the diffuse color - color = gl_Color.xyz; - - // and the texture coordinates - gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToEyeAndClipPos(cam, obj, gl_Vertex, interpolatedPosition, gl_Position)$> - <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> - - interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + <$transformModelToEyeAndClipPos(cam, obj, inPosition, _position, gl_Position)$> + <$transformModelToEyeDir(cam, obj, inNormal.xyz, _normal)$> + _inPosition = inPosition; } From f9685efa4b083a124fd96503de14381b04a6e1a5 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 7 Aug 2015 13:43:34 -0700 Subject: [PATCH 15/16] set payload bounds for polyvoxs --- .../entities-renderer/src/RenderablePolyVoxEntityItem.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index ecd18bfb41..f1dea2e3d1 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -799,10 +799,10 @@ namespace render { } template <> const Item::Bound payloadGetBound(const PolyVoxPayload::Pointer& payload) { - // if (payload && payload->_owner) { - // auto polyVoxEntity = std::dynamic_pointer_cast(payload->_owner); - // return polyVoxEntity->getBoundingBox(); - // } + if (payload && payload->_owner) { + auto polyVoxEntity = std::dynamic_pointer_cast(payload->_owner); + return polyVoxEntity->getAABox(); + } return render::Item::Bound(); } From 732f9ceca58989fab9087441c322ad48b848105a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 7 Aug 2015 14:21:20 -0700 Subject: [PATCH 16/16] pass voxel dimensions from PolyVoxEntityItem to pixel-shader so that the textures line up with the edges --- .../src/RenderablePolyVoxEntityItem.cpp | 16 +++------------- libraries/entities-renderer/src/polyvox.slf | 11 ++++++++--- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index f1dea2e3d1..2a41ea63fb 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -676,17 +676,6 @@ void RenderablePolyVoxEntityItem::getModel() { sizeof(PolyVox::PositionMaterialNormal), gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW))); - - - // mesh->addAttribute(gpu::Stream::TEXCOORD, - // gpu::BufferView(vertexBufferPtr, - // sizeof(float) * 2, - // vertexBufferPtr->getSize() - sizeof(float) * 2, - // sizeof(PolyVox::PositionMaterialNormal), - // gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::RAW))); - - - #ifdef WANT_DEBUG qDebug() << "---- vecIndices.size() =" << vecIndices.size(); qDebug() << "---- vecVertices.size() =" << vecVertices.size(); @@ -709,8 +698,6 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { slotBindings.insert(gpu::Shader::Binding(std::string("xMap"), 0)); slotBindings.insert(gpu::Shader::Binding(std::string("yMap"), 1)); slotBindings.insert(gpu::Shader::Binding(std::string("zMap"), 2)); - slotBindings.insert(gpu::Shader::Binding(std::string("polyVoxDimensions"), 3)); - gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(vertexShader, pixelShader)); gpu::Shader::makeProgram(*program, slotBindings); @@ -768,6 +755,9 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { batch.setResourceTexture(2, DependencyManager::get()->getWhiteTexture()); } + int voxelVolumeSizeLocation = _pipeline->getProgram()->getUniforms().findLocation("voxelVolumeSize"); + batch._glUniform3f(voxelVolumeSizeLocation, _voxelVolumeSize.x, _voxelVolumeSize.y, _voxelVolumeSize.z); + batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0); RenderableDebugableEntityItem::render(this, args); diff --git a/libraries/entities-renderer/src/polyvox.slf b/libraries/entities-renderer/src/polyvox.slf index e661769947..e5c8a49133 100644 --- a/libraries/entities-renderer/src/polyvox.slf +++ b/libraries/entities-renderer/src/polyvox.slf @@ -26,14 +26,19 @@ in vec4 _inPosition; uniform sampler2D xMap; uniform sampler2D yMap; uniform sampler2D zMap; +uniform vec3 voxelVolumeSize; void main(void) { vec3 worldNormal = cross(dFdy(_inPosition.xyz), dFdx(_inPosition.xyz)); worldNormal = normalize(worldNormal); - vec4 xyDiffuse = texture2D(xMap, (_inPosition.xy - vec2(0.5)) / -8.0); - vec4 xzDiffuse = texture2D(yMap, (_inPosition.xz - vec2(0.5)) / -8.0); - vec4 yzDiffuse = texture2D(zMap, (_inPosition.yz - vec2(0.5)) / -8.0); + float inPositionX = (_inPosition.x - 0.5) / voxelVolumeSize.x; + float inPositionY = (_inPosition.y - 0.5) / voxelVolumeSize.y; + float inPositionZ = (_inPosition.z - 0.5) / voxelVolumeSize.z; + + vec4 xyDiffuse = texture2D(xMap, vec2(-inPositionX, -inPositionY)); + vec4 xzDiffuse = texture2D(yMap, vec2(-inPositionX, inPositionZ)); + vec4 yzDiffuse = texture2D(zMap, vec2(inPositionZ, -inPositionY)); vec3 xyDiffuseScaled = xyDiffuse.rgb * abs(worldNormal.z); vec3 xzDiffuseScaled = xzDiffuse.rgb * abs(worldNormal.y);