From f8617bab2dee1565d58b8554388e9755c409271f Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sat, 27 Jun 2015 16:47:11 -0700 Subject: [PATCH 1/4] 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 2/4] 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 3/4] 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 4/4] 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);