From 4b263cf5c895a34f3f24998f9861059056a69566 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 19 May 2015 21:40:05 -0700 Subject: [PATCH] derieve PolyVox Entity from Model Entity --- .../src/EntityTreeRenderer.cpp | 2 + .../src/RenderableModelEntityItem.cpp | 7 +- .../src/RenderableModelEntityItem.h | 4 +- .../src/RenderablePolyVoxEntityItem.cpp | 108 ++++++++++++++++++ .../src/RenderablePolyVoxEntityItem.h | 32 ++++++ libraries/entities/CMakeLists.txt | 2 +- libraries/entities/src/EntityItemProperties.h | 1 + libraries/entities/src/EntityTypes.cpp | 2 + libraries/entities/src/EntityTypes.h | 3 +- libraries/entities/src/ModelEntityItem.h | 2 +- libraries/shared/src/ShapeInfo.h | 3 +- 11 files changed, 157 insertions(+), 9 deletions(-) create mode 100644 libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp create mode 100644 libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index bacd6eb56e..99dc43b7db 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -39,6 +39,7 @@ #include "RenderableWebEntityItem.h" #include "RenderableZoneEntityItem.h" #include "RenderableLineEntityItem.h" +#include "RenderablePolyVoxEntityItem.h" #include "EntitiesRendererLogging.h" EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterface* viewState, @@ -65,6 +66,7 @@ EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterf REGISTER_ENTITY_TYPE_WITH_FACTORY(ParticleEffect, RenderableParticleEffectEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(Zone, RenderableZoneEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(Line, RenderableLineEntityItem::factory) + REGISTER_ENTITY_TYPE_WITH_FACTORY(PolyVox, RenderablePolyVoxEntityItem::factory) _currentHoverOverEntityID = EntityItemID::createInvalidEntityID(); // makes it the unknown ID _currentClickingOnEntityID = EntityItemID::createInvalidEntityID(); // makes it the unknown ID diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 43112d7d73..50bd0c9d5c 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -110,7 +110,7 @@ void RenderableModelEntityItem::remapTextures() { void RenderableModelEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RMEIrender"); - assert(getType() == EntityTypes::Model); + assert(getType() == EntityTypes::Model || getType() == EntityTypes::PolyVox); bool drawAsModel = hasModel(); @@ -199,6 +199,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { RenderableDebugableEntityItem::render(this, args); } +// virtual Model* RenderableModelEntityItem::getModel(EntityTreeRenderer* renderer) { Model* result = NULL; @@ -207,11 +208,11 @@ Model* RenderableModelEntityItem::getModel(EntityTreeRenderer* renderer) { _myRenderer = renderer; } assert(_myRenderer == renderer); // you should only ever render on one renderer - + if (QThread::currentThread() != _myRenderer->thread()) { return _model; } - + _needsModelReload = false; // this is the reload // if we have a URL, then we will want to end up returning a model... diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index efd60faedc..74182b4753 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -49,7 +49,7 @@ public: bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; - Model* getModel(EntityTreeRenderer* renderer); + virtual Model* getModel(EntityTreeRenderer* renderer); bool needsToCallUpdate() const; @@ -60,7 +60,7 @@ public: virtual bool contains(const glm::vec3& point) const; -private: +protected: void remapTextures(); Model* _model; diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp new file mode 100644 index 0000000000..936a833ec8 --- /dev/null +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -0,0 +1,108 @@ +// +// RenderablePolyVoxEntityItem.cpp +// libraries/entities-renderer/src/ +// +// Created by Seth Alves on 5/19/15. +// 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 + +#include + +#include +#include + +#include +#include +#include +#include + +#include "EntityTreeRenderer.h" +#include "RenderablePolyVoxEntityItem.h" + +EntityItem* RenderablePolyVoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { + return new RenderablePolyVoxEntityItem(entityID, properties); +} + + +void createSphereInVolume(PolyVox::SimpleVolume& volData, float fRadius) { + // This vector hold the position of the center of the volume + PolyVox::Vector3DFloat v3dVolCenter(volData.getWidth() / 2, volData.getHeight() / 2, volData.getDepth() / 2); + + // This three-level for loop iterates over every voxel in the volume + for (int z = 0; z < volData.getDepth(); z++) { + for (int y = 0; y < volData.getHeight(); y++) { + for (int x = 0; x < volData.getWidth(); x++) { + // Store our current position as a vector... + PolyVox::Vector3DFloat v3dCurrentPos(x,y,z); + // And compute how far the current position is from the center of the volume + float fDistToCenter = (v3dCurrentPos - v3dVolCenter).length(); + + uint8_t uVoxelValue = 0; + + // If the current voxel is less than 'radius' units from the center then we make it solid. + if(fDistToCenter <= fRadius) { + // Our new voxel value + uVoxelValue = 255; + } + + // Wrte the voxel value into the volume + volData.setVoxelAt(x, y, z, uVoxelValue); + } + } + } +} + + +// virtual +Model* RenderablePolyVoxEntityItem::getModel(EntityTreeRenderer* renderer) { + PolyVox::SimpleVolume volData(PolyVox::Region(PolyVox::Vector3DInt32(0,0,0), + PolyVox::Vector3DInt32(63, 63, 63))); + createSphereInVolume(volData, 15); + + // A mesh object to hold the result of surface extraction + PolyVox::SurfaceMesh mesh; + + //Create a surface extractor. Comment out one of the following two lines to decide which type gets created. + PolyVox::CubicSurfaceExtractorWithNormals> surfaceExtractor + (&volData, volData.getEnclosingRegion(), &mesh); + // MarchingCubesSurfaceExtractor> surfaceExtractor(&volData, + // volData.getEnclosingRegion(), + // &mesh); + + //Execute the surface extractor. + surfaceExtractor.execute(); + + const std::vector& vecIndices = mesh.getIndices(); + const std::vector& vecVertices = mesh.getVertices(); + + qDebug() << "-------------XXXXXXXXXXXXXXXXXXXX-------------------"; + qDebug() << "---- vecIndices.size() =" << vecIndices.size(); + qDebug() << "---- vecVertices.size() =" << vecVertices.size(); + + + // [DEBUG] [05/19 20:46:38] ---- vecIndices.size() = 101556 + // [DEBUG] [05/19 20:46:38] ---- vecVertices.size() = 67704 + + + Model* result = NULL; + // make sure our renderer is setup + if (!_myRenderer) { + _myRenderer = renderer; + } + assert(_myRenderer == renderer); // you should only ever render on one renderer + + result = _model = _myRenderer->allocateModel(getModelURL(), getCompoundShapeURL()); + assert(_model); + + _needsInitialSimulation = true; + + + + + return result; +} diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h new file mode 100644 index 0000000000..24359accf0 --- /dev/null +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -0,0 +1,32 @@ +// +// RenderablePolyVoxEntityItem.h +// libraries/entities-renderer/src/ +// +// Created by Seth Alves on 5/19/15. +// 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 +// + +#ifndef hifi_RenderablePolyVoxEntityItem_h +#define hifi_RenderablePolyVoxEntityItem_h + +#include + +#include "RenderableModelEntityItem.h" +#include "RenderableDebugableEntityItem.h" + +class RenderablePolyVoxEntityItem : public RenderableModelEntityItem { +public: + static EntityItem* factory(const EntityItemID& entityID, const EntityItemProperties& properties); + + RenderablePolyVoxEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : + RenderableModelEntityItem(entityItemID, properties) { } + + virtual bool hasModel() const { return true; } + virtual Model* getModel(EntityTreeRenderer* renderer); +}; + + +#endif // hifi_RenderablePolyVoxEntityItem_h diff --git a/libraries/entities/CMakeLists.txt b/libraries/entities/CMakeLists.txt index c78166b050..c4334edb3a 100644 --- a/libraries/entities/CMakeLists.txt +++ b/libraries/entities/CMakeLists.txt @@ -14,7 +14,7 @@ target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES}) find_package(PolyVox REQUIRED) -target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${POLYVOX_INCLUDE_DIRS}) +target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${POLYVOX_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${POLYVOX_LIBRARIES}) link_hifi_libraries(avatars shared octree gpu model fbx networking animation environment) diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 530013bbb6..dabd47e24e 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -54,6 +54,7 @@ class EntityItemProperties { friend class ZoneEntityItem; // TODO: consider removing this friend relationship and use public methods friend class WebEntityItem; // TODO: consider removing this friend relationship and use public methods friend class LineEntityItem; // TODO: consider removing this friend relationship and use public methods + friend class PolyVoxEntityItem; // TODO: consider removing this friend relationship and use public methods public: EntityItemProperties(); virtual ~EntityItemProperties(); diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index 794a77b194..ee62b93604 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -27,6 +27,7 @@ #include "WebEntityItem.h" #include "ZoneEntityItem.h" #include "LineEntityItem.h" +#include "PolyVoxEntityItem.h" QMap EntityTypes::_typeToNameMap; QMap EntityTypes::_nameToTypeMap; @@ -45,6 +46,7 @@ REGISTER_ENTITY_TYPE(Text) REGISTER_ENTITY_TYPE(ParticleEffect) REGISTER_ENTITY_TYPE(Zone) REGISTER_ENTITY_TYPE(Line) +REGISTER_ENTITY_TYPE(PolyVox) const QString& EntityTypes::getEntityTypeName(EntityType entityType) { QMap::iterator matchedTypeName = _typeToNameMap.find(entityType); diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index b3de3dfc8e..e02d25400d 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -39,7 +39,8 @@ public: Zone, Web, Line, - LAST = Line + PolyVox, + LAST = PolyVox } EntityType; static const QString& getEntityTypeName(EntityType entityType); diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index d4a4efda04..abfa38250c 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -56,7 +56,7 @@ public: const rgbColor& getColor() const { return _color; } xColor getXColor() const { xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; } - bool hasModel() const { return !_modelURL.isEmpty(); } + virtual bool hasModel() const { return !_modelURL.isEmpty(); } virtual bool hasCompoundShapeURL() const { return !_compoundShapeURL.isEmpty(); } static const QString DEFAULT_MODEL_URL; diff --git a/libraries/shared/src/ShapeInfo.h b/libraries/shared/src/ShapeInfo.h index e10cf1a149..5148640d2e 100644 --- a/libraries/shared/src/ShapeInfo.h +++ b/libraries/shared/src/ShapeInfo.h @@ -32,7 +32,8 @@ enum ShapeType { SHAPE_TYPE_CYLINDER_X, SHAPE_TYPE_CYLINDER_Y, SHAPE_TYPE_CYLINDER_Z, - SHAPE_TYPE_LINE + SHAPE_TYPE_LINE, + SHAPE_TYPE_POLYVOX }; class ShapeInfo {