From b8a4d853d36f5c8ac80cdaf00dc4cf25b3135a04 Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 3 Jul 2013 09:48:33 +0200 Subject: [PATCH 01/20] SKP to SVO research --- CMakeLists.txt | 3 +- cmake/modules/FindSKETCHUP.cmake | 38 ++++++++ voxel-import/CMakeLists.txt | 32 +++++++ voxel-import/resources/model.skp | Bin 0 -> 9746 bytes voxel-import/src/SketchUp.cpp | 131 +++++++++++++++++++++++++++ voxel-import/src/SketchUp.h | 21 +++++ voxel-import/src/Triangle.cpp | 151 +++++++++++++++++++++++++++++++ voxel-import/src/Triangle.h | 38 ++++++++ voxel-import/src/VoxelHelper.cpp | 25 +++++ voxel-import/src/VoxelHelper.h | 28 ++++++ voxel-import/src/Voxelizer.cpp | 44 +++++++++ voxel-import/src/Voxelizer.h | 29 ++++++ voxel-import/src/main.cpp | 21 +++++ 13 files changed, 560 insertions(+), 1 deletion(-) create mode 100644 cmake/modules/FindSKETCHUP.cmake create mode 100644 voxel-import/CMakeLists.txt create mode 100644 voxel-import/resources/model.skp create mode 100644 voxel-import/src/SketchUp.cpp create mode 100644 voxel-import/src/SketchUp.h create mode 100644 voxel-import/src/Triangle.cpp create mode 100644 voxel-import/src/Triangle.h create mode 100644 voxel-import/src/VoxelHelper.cpp create mode 100644 voxel-import/src/VoxelHelper.h create mode 100644 voxel-import/src/Voxelizer.cpp create mode 100644 voxel-import/src/Voxelizer.h create mode 100644 voxel-import/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8af8081975..9ea391a034 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,4 +12,5 @@ add_subdirectory(injector) add_subdirectory(pairing-server) add_subdirectory(space-server) add_subdirectory(voxel-edit) -add_subdirectory(voxel-server) \ No newline at end of file +add_subdirectory(voxel-server) +add_subdirectory(voxel-import) \ No newline at end of file diff --git a/cmake/modules/FindSKETCHUP.cmake b/cmake/modules/FindSKETCHUP.cmake new file mode 100644 index 0000000000..d6c8f070f1 --- /dev/null +++ b/cmake/modules/FindSKETCHUP.cmake @@ -0,0 +1,38 @@ +# Find the static SKETCHUP library +# +# You must provide an SKETCHUP_ROOT_DIR which contains framework +# +# Once done this will define +# +# SKETCHUP_FOUND - system found SketchUp API +# SKETCHUP_FRAMEWORK - Link this to use PortAudio +# +# Created on 6/27/2013 by Stojce Slavkovski +# Copyright (c) 2013 High Fidelity +# + +if (SKETCHUP_FRAMEWORK) + # in cache already + set(SKETCHUP_FOUND TRUE) +else (SKETCHUP_FRAMEWORK) + + find_library(SKETCHUP_FRAMEWORK slapi ${SKETCHUP_ROOT_DIR}) + + if (SKETCHUP_FRAMEWORK) + set(SKETCHUP_FOUND TRUE) + endif (SKETCHUP_FRAMEWORK) + + if (SKETCHUP_FOUND) + if (NOT SKETCHUP_FIND_QUIETLY) + message(STATUS "Found SketchUp: ${SKETCHUP_FRAMEWORK}") + endif (NOT SKETCHUP_FIND_QUIETLY) + else (SKETCHUP_FOUND) + if (SKETCHUP_FIND_REQUIRED) + message(FATAL_ERROR "Could not find SketchUp") + endif (SKETCHUP_FIND_REQUIRED) + endif (SKETCHUP_FOUND) + + # show the SKETCHUP_FRAMEWORK variables only in the advanced view + mark_as_advanced(SKETCHUP_FRAMEWORK) + +endif (SKETCHUP_FRAMEWORK) \ No newline at end of file diff --git a/voxel-import/CMakeLists.txt b/voxel-import/CMakeLists.txt new file mode 100644 index 0000000000..c123e9412b --- /dev/null +++ b/voxel-import/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 2.8) + +if (APPLE) + set(CMAKE_OSX_ARCHITECTURES "i386") +endif (APPLE) + +set(TARGET_NAME voxel-import) + +set(ROOT_DIR ..) +set(MACRO_DIR ${ROOT_DIR}/cmake/macros) + +# setup for find modules +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") + +# set up the external glm library +include(${MACRO_DIR}/IncludeGLM.cmake) +include_glm(${TARGET_NAME} ${ROOT_DIR}) + +include(${MACRO_DIR}/SetupHifiProject.cmake) + +setup_hifi_project(${TARGET_NAME}) + +# link in the shared library +include(${MACRO_DIR}/LinkHifiLibrary.cmake) +link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) + +# link in the hifi voxels library +link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR}) + +# link the sketchup library +find_package(SKETCHUP REQUIRED) +target_link_libraries(${TARGET_NAME} ${SKETCHUP_FRAMEWORK}) \ No newline at end of file diff --git a/voxel-import/resources/model.skp b/voxel-import/resources/model.skp new file mode 100644 index 0000000000000000000000000000000000000000..2638e675dce64a5d850fffad03a7e98ddc26b7d2 GIT binary patch literal 9746 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 HD24n7h~z@s literal 0 HcmV?d00001 diff --git a/voxel-import/src/SketchUp.cpp b/voxel-import/src/SketchUp.cpp new file mode 100644 index 0000000000..0e9183b8fe --- /dev/null +++ b/voxel-import/src/SketchUp.cpp @@ -0,0 +1,131 @@ +// +// SketchUp.cpp +// hifi +// +// Created by Stojce Slavkovski on 6/27/13. +// +// + +#include "SketchUp.h" +#include "AABox.h" +#include "Voxelizer.h" +#include "VoxelHelper.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace glm; + +namespace voxelImport { + + vector getFacesFomModel(SUModelRef model) { + // Get the entity container of the model. + SUEntitiesRef entities = SU_INVALID; + SUModelGetEntities(model, &entities); + + // Get all the faces from the entities object + size_t faceCount = 0; + SUEntitiesGetNumFaces(entities, &faceCount); + vector faces(faceCount); + SUEntitiesGetFaces(entities, faceCount, &faces[0], &faceCount); + + return faces; + } + + SUColor getMaterialColor(SUFaceRef face) { + + SUMaterialRef mat = SU_INVALID; + SUFaceGetFrontMaterial(face, &mat); + + SUColor materialColor = SU_INVALID; + SUMaterialGetColor(mat, &materialColor); + + return materialColor; + } + + vector getEdgeVerices(SUFaceRef face) { + size_t edgeCount = 0; + SUFaceGetNumEdges(face, &edgeCount); + + vector edges(edgeCount); + SUFaceGetEdges(face, edgeCount, &edges[0], &edgeCount); + + + vector vertices(edgeCount); + + // Get the vertex positions for each edge + for (size_t j = 0; j < edgeCount; j++) { + + SUVertexRef startVertex = SU_INVALID; + SUVertexRef endVertex = SU_INVALID; + + SUEdgeGetStartVertex(edges[j], &startVertex); + SUEdgeGetEndVertex(edges[j], &endVertex); + SUPoint3D start; + // SUPoint3D end; + SUVertexGetPosition(startVertex, &start); + // SUVertexGetPosition(endVertex, &end); + + vertices[j] = vec3(start.x, start.y, start.z); + } + return vertices; + } + + bool SketchUp::importModel(const char* modelFileName, VoxelTree tree, float voxelSize, float modelVoxelSize) { + + // Always initialize the API before using it + SUInitialize(); + // Load the model from a file + SUModelRef model = SU_INVALID; + SUResult res = SUModelCreateFromFile(&model, modelFileName); + // It's best to always check the return code from each SU function call. + // Only showing this check once to keep this example short. + if (res != SU_ERROR_NONE) { + printf("error loading model"); + return false; + } + + vector faces = getFacesFomModel(model); + size_t faceCount = faces.size(); + unsigned long voxelVericesCount = 0; + + for (size_t i = 0; i < faceCount; i++) { + + SUFaceRef face = faces[i]; + SUColor materialColor = getMaterialColor(face); + + vector vertices = getEdgeVerices(face); + rgbColor voxelColor = {materialColor.red, materialColor.green, materialColor.blue}; + vector voxelVerices; + + if (vertices.size() == 2) { + voxelVerices = vertices; + } else if (vertices.size() > 2) { + Voxelizer *voxelizer = new Voxelizer(); + voxelVerices = voxelizer->Voxelize(vertices, modelVoxelSize); + } + voxelVericesCount += voxelVerices.size(); + VoxelHelper::createVoxels(&tree, voxelVerices, voxelSize, voxelColor); + } + + printf("total voxelsVerices: %ld\n", voxelVericesCount); + printf("total Voxels: %ld\n", tree.getVoxelCount()); + // Must release the model or there will be memory leaks + SUModelRelease(&model); + // Always terminate the API when done using it + SUTerminate(); + return true; + } +} diff --git a/voxel-import/src/SketchUp.h b/voxel-import/src/SketchUp.h new file mode 100644 index 0000000000..1a71a8ae8e --- /dev/null +++ b/voxel-import/src/SketchUp.h @@ -0,0 +1,21 @@ +// +// SketchUp.h +// hifi +// +// Created by Stojce Slavkovski on 6/27/13. +// +// + +#ifndef __hifi__SketchUp__ +#define __hifi__SketchUp__ + +#include +#include "VoxelTree.h" + +namespace voxelImport { + class SketchUp { + public: + static bool importModel(const char* modelFileName, VoxelTree tree, float voxelSize, float modelVoxelSize); + }; +} +#endif /* defined(__hifi__SketchUp__) */ diff --git a/voxel-import/src/Triangle.cpp b/voxel-import/src/Triangle.cpp new file mode 100644 index 0000000000..bb2eaae775 --- /dev/null +++ b/voxel-import/src/Triangle.cpp @@ -0,0 +1,151 @@ +// +// Triangle.cpp +// hifi +// +// Created by Stojce Slavkovski on 6/27/13. +// +// + +#include "Triangle.h" +namespace voxelImport { + +#define voxelOffset 2 + + int divideCeiling(double a, double b) { + return (int) (1 + ((a - 1) / b)); + } + + Triangle::Triangle(vec3 a, vec3 b, vec3 c) { + _a = a; + _b = b; + _c = c; + + double minX = fmin(a.x, fmin(b.x, c.x)); + double maxX = fmax(a.x, fmax(b.x, c.x)); + double minY = fmin(a.y, fmin(b.y, c.y)); + double maxY = fmax(a.y, fmax(b.y, c.y)); + double minZ = fmin(a.z, fmin(b.z, c.z)); + double maxZ = fmax(a.z, fmax(b.z, c.z)); + + vec3 min = vec3(minX, minY, minZ); + vec3 max = vec3(maxX, maxY, maxZ); + + _boundingBox = new AABox(min, max); + } + + vector Triangle::getCollidingVoxels(float voxelSize) { + vector result; + + vec3 min = _boundingBox->getCorner(); + vec3 max = _boundingBox->getSize(); + + vec3 minPoint = min - voxelSize * voxelOffset; + vec3 size = (max + voxelSize * voxelOffset) - minPoint; + + vec3 deltaP = vec3(voxelSize, voxelSize, voxelSize); + + // create temp voxels inside of the box + vec3 length = vec3(divideCeiling(size.x, deltaP.x), divideCeiling(size.y , deltaP.y), int(size.z / deltaP.z)); + + // iterate over each voxel + for (size_t iz = 0; iz <= length.z; iz++) { + for (size_t iy = 0; iy <= length.y; iy++) { + for (size_t ix = 0; ix <= length.x; ix++) { + + vec3 voxel = minPoint + vec3(ix, iy, iz) * deltaP; + // test if collides with triangle pane + if (this->isCollidingWithVoxel(voxel, deltaP)) { + // add it to result voxels + result.push_back(voxel); + } + } + } + } + + return result; + } + + bool Triangle::isCollidingWithVoxel(vec3 voxelCenter, vec3 delta) { + + vec3 v01 = _b - _a; + vec3 v02 = _c - _a; + + vec3 crossVector = cross(v01, v02); + vec3 faceNormal = normalize(crossVector); + + vec3 criticalPoint = vec3(faceNormal.x > 0 ? delta.x : 0, faceNormal.y > 0 ? delta.y : 0, faceNormal.z > 0 ? delta.z : 0); + + // (1) + // Check whether minPoint + criticalPoint and the opposite box corner minPoint + (deltaP - criticalPoint) + // are on different sides of the plane or one of them is on the plane. + vec3 minPoint = criticalPoint - _a; + float d1 = dot(faceNormal, minPoint); + minPoint = delta - criticalPoint - _a; + float d2 = dot(faceNormal, minPoint); + + bool isTrianglePlaneOverlappingVoxel = (dot(faceNormal, voxelCenter) + d1) * (dot(faceNormal, voxelCenter) + d2) <= 0; + + if (!isTrianglePlaneOverlappingVoxel) { + return false; + } + + vector faceEdge(3); + faceEdge[0] = _b - _a; + faceEdge[1] = _c - _b; + faceEdge[2] = _a - _c; + + for (size_t i =0; i < 3; i++) { + + vec3 v; + + if (i == 0) { + v = _a; + } else if (i == 1) { + v = _b; + } else { + v = _c; + } + + if (!testVoxelEdgeXYProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { + return false; + } + + if (!testVoxelEdgeYZProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { + return false; + } + + if (!testVoxelEdgeZXProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { + return false; + } + } + + return true; + } + + bool Triangle::testVoxelEdgeXYProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { + // XY Plane + vec2 eNormal = vec2(-faceEdge.y, faceEdge.x); + eNormal *= faceNormal.z >= 0.0f ? 1.0f : -1.0f; + float Dxy = - dot(eNormal, vec2(triVertex.x, triVertex.y)) + fmax(0.0f, delta.x * eNormal.x) + fmax(0.0f, delta.y * eNormal.y); + float test = dot(eNormal, vec2(voxelEvalPoint.x, voxelEvalPoint.y)) + Dxy; + return test >= 0.0f; + } + + bool Triangle::testVoxelEdgeYZProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { + // YZ Plane + vec2 eNormal = vec2(-faceEdge.z, faceEdge.y); + eNormal *= faceNormal.x >= 0.0f ? 1.0f : -1.0f; + double Dyz = - dot(eNormal, vec2(triVertex.y, triVertex.z)) + fmax(0.0f, delta.y * eNormal.x) + fmax(0.0f, delta.z * eNormal.y); + double test = dot(eNormal, vec2(voxelEvalPoint.y, voxelEvalPoint.z)) + Dyz; + return test >= 0.0f; + } + + bool Triangle::testVoxelEdgeZXProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { + // ZX Plane + vec2 eNormal = vec2(-faceEdge.x, faceEdge.z); + eNormal *= faceNormal.y >= 0.0f ? 1.0f : -1.0f; + float Dzx = -dot(eNormal, vec2(triVertex.z, triVertex.x)) + fmax(0.0f, delta.z * eNormal.x) + fmax(0.0f, delta.x * eNormal.y); + double test = dot(eNormal, vec2(voxelEvalPoint.z, voxelEvalPoint.x)) + Dzx; + return test >= 0.0f; + } +} diff --git a/voxel-import/src/Triangle.h b/voxel-import/src/Triangle.h new file mode 100644 index 0000000000..9abc942fe0 --- /dev/null +++ b/voxel-import/src/Triangle.h @@ -0,0 +1,38 @@ +// +// Triangle.h +// hifi +// +// Created by Stojce Slavkovski on 6/27/13. +// +// + +#ifndef __hifi__Triangle__ +#define __hifi__Triangle__ + +#include +#include +#include +#include "AABox.h" +namespace voxelImport { + using namespace std; + using namespace glm; + + class Triangle { + + public: + Triangle(glm::vec3 a, glm::vec3 b, glm::vec3 c); + vector getCollidingVoxels(float voxelSize); + + private: + vec3 _a; + vec3 _b; + vec3 _c; + AABox* _boundingBox; + + bool isCollidingWithVoxel(vec3 voxelCenter, vec3 delta); + bool testVoxelEdgeXYProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); + bool testVoxelEdgeYZProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); + bool testVoxelEdgeZXProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); + }; +} +#endif /* defined(__hifi__Triangle__) */ diff --git a/voxel-import/src/VoxelHelper.cpp b/voxel-import/src/VoxelHelper.cpp new file mode 100644 index 0000000000..de5b450650 --- /dev/null +++ b/voxel-import/src/VoxelHelper.cpp @@ -0,0 +1,25 @@ +// +// VoxelHelper.cpp +// hifi +// +// Created by Stojce Slavkovski on 6/30/13. +// +// + +#include "VoxelHelper.h" + +namespace voxelImport { + + using namespace std; + using namespace glm; + + void VoxelHelper::createVoxels(VoxelTree* tree, vector voxels, float voxelSize, rgbColor voxelColor) { + if (voxels.size() > 2) { //surface + for (size_t v = 0; v < voxels.size(); v++) { + tree->createVoxel(voxels[v].x * voxelSize, voxels[v].y * voxelSize, voxels[v].z * voxelSize, voxelSize, voxelColor[0], voxelColor[1], voxelColor[2]); + } + } else if (voxels.size() == 2) { + tree->createLine(voxels[0], voxels[1], voxelSize, voxelColor); + } + } +} \ No newline at end of file diff --git a/voxel-import/src/VoxelHelper.h b/voxel-import/src/VoxelHelper.h new file mode 100644 index 0000000000..e17fbc1995 --- /dev/null +++ b/voxel-import/src/VoxelHelper.h @@ -0,0 +1,28 @@ +// +// VoxelHelper.h +// hifi +// +// Created by Stojce Slavkovski on 6/30/13. +// +// + +#ifndef __hifi__VoxelHelper__ +#define __hifi__VoxelHelper__ + +#include +#include +#include +#include "VoxelTree.h" + +namespace voxelImport { + + using namespace std; + using namespace glm; + + class VoxelHelper { + public: + static void createVoxels(VoxelTree* tree, vector voxels, float voxelSize, rgbColor voxelColor); + }; +} + +#endif /* defined(__hifi__VoxelHelper__) */ diff --git a/voxel-import/src/Voxelizer.cpp b/voxel-import/src/Voxelizer.cpp new file mode 100644 index 0000000000..f8ab863f6d --- /dev/null +++ b/voxel-import/src/Voxelizer.cpp @@ -0,0 +1,44 @@ +// +// Voxelizer.cpp +// skpimporter +// +// Created by Stojce Slavkovski on 6/23/13. +// Copyright (c) 2013 High Fidelity. All rights reserved. +// + +#include "Voxelizer.h" +namespace voxelImport { + + using namespace std; + using namespace glm; + + vector Voxelizer::Voxelize(vector vertices, float voxelSize) { + + vector voxels; + + if (vertices.size() < 3) { + throw; + } + + vec3 aPoint = vertices[0]; + vec3 bPoint = vertices[1]; + vec3 cPoint = vertices[2]; + + // first triangle + Triangle* t = new Triangle(aPoint, bPoint, cPoint); + triangles.push_back(*t); + + for (size_t i = 3; i < vertices.size(); i++) { + bPoint = cPoint; + t = new Triangle(aPoint, bPoint, vertices[i]); + triangles.push_back(*t); + } + + for (size_t i = 0; i < triangles.size(); i++) { + vector colliding = triangles[i].getCollidingVoxels(voxelSize); + voxels.insert(voxels.end(), colliding.begin(), colliding.end()); + } + + return voxels; + } +} \ No newline at end of file diff --git a/voxel-import/src/Voxelizer.h b/voxel-import/src/Voxelizer.h new file mode 100644 index 0000000000..d38a516bb9 --- /dev/null +++ b/voxel-import/src/Voxelizer.h @@ -0,0 +1,29 @@ +// +// Voxelizer.h +// skpimporter +// +// Created by Stojce Slavkovski on 6/23/13. +// Copyright (c) 2013 High Fidelity. All rights reserved. +// + +#ifndef __skpimporter__Voxelizer__ +#define __skpimporter__Voxelizer__ + +#include +#include +#include +#include "Triangle.h" + +namespace voxelImport { + using namespace std; + using namespace glm; + + class Voxelizer { + private: + vector triangles; + public: + vector Voxelize(vector vertices, float voxelSize); + }; +} + +#endif /* defined(__skpimporter__Voxelizer__) */ diff --git a/voxel-import/src/main.cpp b/voxel-import/src/main.cpp new file mode 100644 index 0000000000..216e96527b --- /dev/null +++ b/voxel-import/src/main.cpp @@ -0,0 +1,21 @@ +// +// main.cpp +// skpimporter +// +// Created by Stojce Slavkovski on 6/14/13. +// Copyright (c) 2013 High Fidelity. All rights reserved. +// + +#include "SketchUp.h" +#include "VoxelTree.h" + +int main(int argc, const char * argv[]) +{ + VoxelTree tree; + if (voxelImport::SketchUp::importModel("model.skp", &tree, 0.1f / 512, 10)) { + tree.writeToSVOFile("voxels.svo"); + } + + return 0; +} + From 742afc9dab5e6203029177e83080e7220a79f5b8 Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 3 Jul 2013 09:57:52 +0200 Subject: [PATCH 02/20] Revert "SKP to SVO research" This reverts commit b8a4d853d36f5c8ac80cdaf00dc4cf25b3135a04. --- CMakeLists.txt | 3 +- cmake/modules/FindSKETCHUP.cmake | 38 -------- voxel-import/CMakeLists.txt | 32 ------- voxel-import/resources/model.skp | Bin 9746 -> 0 bytes voxel-import/src/SketchUp.cpp | 131 --------------------------- voxel-import/src/SketchUp.h | 21 ----- voxel-import/src/Triangle.cpp | 151 ------------------------------- voxel-import/src/Triangle.h | 38 -------- voxel-import/src/VoxelHelper.cpp | 25 ----- voxel-import/src/VoxelHelper.h | 28 ------ voxel-import/src/Voxelizer.cpp | 44 --------- voxel-import/src/Voxelizer.h | 29 ------ voxel-import/src/main.cpp | 21 ----- 13 files changed, 1 insertion(+), 560 deletions(-) delete mode 100644 cmake/modules/FindSKETCHUP.cmake delete mode 100644 voxel-import/CMakeLists.txt delete mode 100644 voxel-import/resources/model.skp delete mode 100644 voxel-import/src/SketchUp.cpp delete mode 100644 voxel-import/src/SketchUp.h delete mode 100644 voxel-import/src/Triangle.cpp delete mode 100644 voxel-import/src/Triangle.h delete mode 100644 voxel-import/src/VoxelHelper.cpp delete mode 100644 voxel-import/src/VoxelHelper.h delete mode 100644 voxel-import/src/Voxelizer.cpp delete mode 100644 voxel-import/src/Voxelizer.h delete mode 100644 voxel-import/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ea391a034..8af8081975 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,5 +12,4 @@ add_subdirectory(injector) add_subdirectory(pairing-server) add_subdirectory(space-server) add_subdirectory(voxel-edit) -add_subdirectory(voxel-server) -add_subdirectory(voxel-import) \ No newline at end of file +add_subdirectory(voxel-server) \ No newline at end of file diff --git a/cmake/modules/FindSKETCHUP.cmake b/cmake/modules/FindSKETCHUP.cmake deleted file mode 100644 index d6c8f070f1..0000000000 --- a/cmake/modules/FindSKETCHUP.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# Find the static SKETCHUP library -# -# You must provide an SKETCHUP_ROOT_DIR which contains framework -# -# Once done this will define -# -# SKETCHUP_FOUND - system found SketchUp API -# SKETCHUP_FRAMEWORK - Link this to use PortAudio -# -# Created on 6/27/2013 by Stojce Slavkovski -# Copyright (c) 2013 High Fidelity -# - -if (SKETCHUP_FRAMEWORK) - # in cache already - set(SKETCHUP_FOUND TRUE) -else (SKETCHUP_FRAMEWORK) - - find_library(SKETCHUP_FRAMEWORK slapi ${SKETCHUP_ROOT_DIR}) - - if (SKETCHUP_FRAMEWORK) - set(SKETCHUP_FOUND TRUE) - endif (SKETCHUP_FRAMEWORK) - - if (SKETCHUP_FOUND) - if (NOT SKETCHUP_FIND_QUIETLY) - message(STATUS "Found SketchUp: ${SKETCHUP_FRAMEWORK}") - endif (NOT SKETCHUP_FIND_QUIETLY) - else (SKETCHUP_FOUND) - if (SKETCHUP_FIND_REQUIRED) - message(FATAL_ERROR "Could not find SketchUp") - endif (SKETCHUP_FIND_REQUIRED) - endif (SKETCHUP_FOUND) - - # show the SKETCHUP_FRAMEWORK variables only in the advanced view - mark_as_advanced(SKETCHUP_FRAMEWORK) - -endif (SKETCHUP_FRAMEWORK) \ No newline at end of file diff --git a/voxel-import/CMakeLists.txt b/voxel-import/CMakeLists.txt deleted file mode 100644 index c123e9412b..0000000000 --- a/voxel-import/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -if (APPLE) - set(CMAKE_OSX_ARCHITECTURES "i386") -endif (APPLE) - -set(TARGET_NAME voxel-import) - -set(ROOT_DIR ..) -set(MACRO_DIR ${ROOT_DIR}/cmake/macros) - -# setup for find modules -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") - -# set up the external glm library -include(${MACRO_DIR}/IncludeGLM.cmake) -include_glm(${TARGET_NAME} ${ROOT_DIR}) - -include(${MACRO_DIR}/SetupHifiProject.cmake) - -setup_hifi_project(${TARGET_NAME}) - -# link in the shared library -include(${MACRO_DIR}/LinkHifiLibrary.cmake) -link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) - -# link in the hifi voxels library -link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR}) - -# link the sketchup library -find_package(SKETCHUP REQUIRED) -target_link_libraries(${TARGET_NAME} ${SKETCHUP_FRAMEWORK}) \ No newline at end of file diff --git a/voxel-import/resources/model.skp b/voxel-import/resources/model.skp deleted file mode 100644 index 2638e675dce64a5d850fffad03a7e98ddc26b7d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9746 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 HD24n7h~z@s diff --git a/voxel-import/src/SketchUp.cpp b/voxel-import/src/SketchUp.cpp deleted file mode 100644 index 0e9183b8fe..0000000000 --- a/voxel-import/src/SketchUp.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// -// SketchUp.cpp -// hifi -// -// Created by Stojce Slavkovski on 6/27/13. -// -// - -#include "SketchUp.h" -#include "AABox.h" -#include "Voxelizer.h" -#include "VoxelHelper.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace glm; - -namespace voxelImport { - - vector getFacesFomModel(SUModelRef model) { - // Get the entity container of the model. - SUEntitiesRef entities = SU_INVALID; - SUModelGetEntities(model, &entities); - - // Get all the faces from the entities object - size_t faceCount = 0; - SUEntitiesGetNumFaces(entities, &faceCount); - vector faces(faceCount); - SUEntitiesGetFaces(entities, faceCount, &faces[0], &faceCount); - - return faces; - } - - SUColor getMaterialColor(SUFaceRef face) { - - SUMaterialRef mat = SU_INVALID; - SUFaceGetFrontMaterial(face, &mat); - - SUColor materialColor = SU_INVALID; - SUMaterialGetColor(mat, &materialColor); - - return materialColor; - } - - vector getEdgeVerices(SUFaceRef face) { - size_t edgeCount = 0; - SUFaceGetNumEdges(face, &edgeCount); - - vector edges(edgeCount); - SUFaceGetEdges(face, edgeCount, &edges[0], &edgeCount); - - - vector vertices(edgeCount); - - // Get the vertex positions for each edge - for (size_t j = 0; j < edgeCount; j++) { - - SUVertexRef startVertex = SU_INVALID; - SUVertexRef endVertex = SU_INVALID; - - SUEdgeGetStartVertex(edges[j], &startVertex); - SUEdgeGetEndVertex(edges[j], &endVertex); - SUPoint3D start; - // SUPoint3D end; - SUVertexGetPosition(startVertex, &start); - // SUVertexGetPosition(endVertex, &end); - - vertices[j] = vec3(start.x, start.y, start.z); - } - return vertices; - } - - bool SketchUp::importModel(const char* modelFileName, VoxelTree tree, float voxelSize, float modelVoxelSize) { - - // Always initialize the API before using it - SUInitialize(); - // Load the model from a file - SUModelRef model = SU_INVALID; - SUResult res = SUModelCreateFromFile(&model, modelFileName); - // It's best to always check the return code from each SU function call. - // Only showing this check once to keep this example short. - if (res != SU_ERROR_NONE) { - printf("error loading model"); - return false; - } - - vector faces = getFacesFomModel(model); - size_t faceCount = faces.size(); - unsigned long voxelVericesCount = 0; - - for (size_t i = 0; i < faceCount; i++) { - - SUFaceRef face = faces[i]; - SUColor materialColor = getMaterialColor(face); - - vector vertices = getEdgeVerices(face); - rgbColor voxelColor = {materialColor.red, materialColor.green, materialColor.blue}; - vector voxelVerices; - - if (vertices.size() == 2) { - voxelVerices = vertices; - } else if (vertices.size() > 2) { - Voxelizer *voxelizer = new Voxelizer(); - voxelVerices = voxelizer->Voxelize(vertices, modelVoxelSize); - } - voxelVericesCount += voxelVerices.size(); - VoxelHelper::createVoxels(&tree, voxelVerices, voxelSize, voxelColor); - } - - printf("total voxelsVerices: %ld\n", voxelVericesCount); - printf("total Voxels: %ld\n", tree.getVoxelCount()); - // Must release the model or there will be memory leaks - SUModelRelease(&model); - // Always terminate the API when done using it - SUTerminate(); - return true; - } -} diff --git a/voxel-import/src/SketchUp.h b/voxel-import/src/SketchUp.h deleted file mode 100644 index 1a71a8ae8e..0000000000 --- a/voxel-import/src/SketchUp.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// SketchUp.h -// hifi -// -// Created by Stojce Slavkovski on 6/27/13. -// -// - -#ifndef __hifi__SketchUp__ -#define __hifi__SketchUp__ - -#include -#include "VoxelTree.h" - -namespace voxelImport { - class SketchUp { - public: - static bool importModel(const char* modelFileName, VoxelTree tree, float voxelSize, float modelVoxelSize); - }; -} -#endif /* defined(__hifi__SketchUp__) */ diff --git a/voxel-import/src/Triangle.cpp b/voxel-import/src/Triangle.cpp deleted file mode 100644 index bb2eaae775..0000000000 --- a/voxel-import/src/Triangle.cpp +++ /dev/null @@ -1,151 +0,0 @@ -// -// Triangle.cpp -// hifi -// -// Created by Stojce Slavkovski on 6/27/13. -// -// - -#include "Triangle.h" -namespace voxelImport { - -#define voxelOffset 2 - - int divideCeiling(double a, double b) { - return (int) (1 + ((a - 1) / b)); - } - - Triangle::Triangle(vec3 a, vec3 b, vec3 c) { - _a = a; - _b = b; - _c = c; - - double minX = fmin(a.x, fmin(b.x, c.x)); - double maxX = fmax(a.x, fmax(b.x, c.x)); - double minY = fmin(a.y, fmin(b.y, c.y)); - double maxY = fmax(a.y, fmax(b.y, c.y)); - double minZ = fmin(a.z, fmin(b.z, c.z)); - double maxZ = fmax(a.z, fmax(b.z, c.z)); - - vec3 min = vec3(minX, minY, minZ); - vec3 max = vec3(maxX, maxY, maxZ); - - _boundingBox = new AABox(min, max); - } - - vector Triangle::getCollidingVoxels(float voxelSize) { - vector result; - - vec3 min = _boundingBox->getCorner(); - vec3 max = _boundingBox->getSize(); - - vec3 minPoint = min - voxelSize * voxelOffset; - vec3 size = (max + voxelSize * voxelOffset) - minPoint; - - vec3 deltaP = vec3(voxelSize, voxelSize, voxelSize); - - // create temp voxels inside of the box - vec3 length = vec3(divideCeiling(size.x, deltaP.x), divideCeiling(size.y , deltaP.y), int(size.z / deltaP.z)); - - // iterate over each voxel - for (size_t iz = 0; iz <= length.z; iz++) { - for (size_t iy = 0; iy <= length.y; iy++) { - for (size_t ix = 0; ix <= length.x; ix++) { - - vec3 voxel = minPoint + vec3(ix, iy, iz) * deltaP; - // test if collides with triangle pane - if (this->isCollidingWithVoxel(voxel, deltaP)) { - // add it to result voxels - result.push_back(voxel); - } - } - } - } - - return result; - } - - bool Triangle::isCollidingWithVoxel(vec3 voxelCenter, vec3 delta) { - - vec3 v01 = _b - _a; - vec3 v02 = _c - _a; - - vec3 crossVector = cross(v01, v02); - vec3 faceNormal = normalize(crossVector); - - vec3 criticalPoint = vec3(faceNormal.x > 0 ? delta.x : 0, faceNormal.y > 0 ? delta.y : 0, faceNormal.z > 0 ? delta.z : 0); - - // (1) - // Check whether minPoint + criticalPoint and the opposite box corner minPoint + (deltaP - criticalPoint) - // are on different sides of the plane or one of them is on the plane. - vec3 minPoint = criticalPoint - _a; - float d1 = dot(faceNormal, minPoint); - minPoint = delta - criticalPoint - _a; - float d2 = dot(faceNormal, minPoint); - - bool isTrianglePlaneOverlappingVoxel = (dot(faceNormal, voxelCenter) + d1) * (dot(faceNormal, voxelCenter) + d2) <= 0; - - if (!isTrianglePlaneOverlappingVoxel) { - return false; - } - - vector faceEdge(3); - faceEdge[0] = _b - _a; - faceEdge[1] = _c - _b; - faceEdge[2] = _a - _c; - - for (size_t i =0; i < 3; i++) { - - vec3 v; - - if (i == 0) { - v = _a; - } else if (i == 1) { - v = _b; - } else { - v = _c; - } - - if (!testVoxelEdgeXYProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { - return false; - } - - if (!testVoxelEdgeYZProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { - return false; - } - - if (!testVoxelEdgeZXProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { - return false; - } - } - - return true; - } - - bool Triangle::testVoxelEdgeXYProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { - // XY Plane - vec2 eNormal = vec2(-faceEdge.y, faceEdge.x); - eNormal *= faceNormal.z >= 0.0f ? 1.0f : -1.0f; - float Dxy = - dot(eNormal, vec2(triVertex.x, triVertex.y)) + fmax(0.0f, delta.x * eNormal.x) + fmax(0.0f, delta.y * eNormal.y); - float test = dot(eNormal, vec2(voxelEvalPoint.x, voxelEvalPoint.y)) + Dxy; - return test >= 0.0f; - } - - bool Triangle::testVoxelEdgeYZProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { - // YZ Plane - vec2 eNormal = vec2(-faceEdge.z, faceEdge.y); - eNormal *= faceNormal.x >= 0.0f ? 1.0f : -1.0f; - double Dyz = - dot(eNormal, vec2(triVertex.y, triVertex.z)) + fmax(0.0f, delta.y * eNormal.x) + fmax(0.0f, delta.z * eNormal.y); - double test = dot(eNormal, vec2(voxelEvalPoint.y, voxelEvalPoint.z)) + Dyz; - return test >= 0.0f; - } - - bool Triangle::testVoxelEdgeZXProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { - // ZX Plane - vec2 eNormal = vec2(-faceEdge.x, faceEdge.z); - eNormal *= faceNormal.y >= 0.0f ? 1.0f : -1.0f; - float Dzx = -dot(eNormal, vec2(triVertex.z, triVertex.x)) + fmax(0.0f, delta.z * eNormal.x) + fmax(0.0f, delta.x * eNormal.y); - double test = dot(eNormal, vec2(voxelEvalPoint.z, voxelEvalPoint.x)) + Dzx; - return test >= 0.0f; - } -} diff --git a/voxel-import/src/Triangle.h b/voxel-import/src/Triangle.h deleted file mode 100644 index 9abc942fe0..0000000000 --- a/voxel-import/src/Triangle.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Triangle.h -// hifi -// -// Created by Stojce Slavkovski on 6/27/13. -// -// - -#ifndef __hifi__Triangle__ -#define __hifi__Triangle__ - -#include -#include -#include -#include "AABox.h" -namespace voxelImport { - using namespace std; - using namespace glm; - - class Triangle { - - public: - Triangle(glm::vec3 a, glm::vec3 b, glm::vec3 c); - vector getCollidingVoxels(float voxelSize); - - private: - vec3 _a; - vec3 _b; - vec3 _c; - AABox* _boundingBox; - - bool isCollidingWithVoxel(vec3 voxelCenter, vec3 delta); - bool testVoxelEdgeXYProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); - bool testVoxelEdgeYZProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); - bool testVoxelEdgeZXProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); - }; -} -#endif /* defined(__hifi__Triangle__) */ diff --git a/voxel-import/src/VoxelHelper.cpp b/voxel-import/src/VoxelHelper.cpp deleted file mode 100644 index de5b450650..0000000000 --- a/voxel-import/src/VoxelHelper.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// VoxelHelper.cpp -// hifi -// -// Created by Stojce Slavkovski on 6/30/13. -// -// - -#include "VoxelHelper.h" - -namespace voxelImport { - - using namespace std; - using namespace glm; - - void VoxelHelper::createVoxels(VoxelTree* tree, vector voxels, float voxelSize, rgbColor voxelColor) { - if (voxels.size() > 2) { //surface - for (size_t v = 0; v < voxels.size(); v++) { - tree->createVoxel(voxels[v].x * voxelSize, voxels[v].y * voxelSize, voxels[v].z * voxelSize, voxelSize, voxelColor[0], voxelColor[1], voxelColor[2]); - } - } else if (voxels.size() == 2) { - tree->createLine(voxels[0], voxels[1], voxelSize, voxelColor); - } - } -} \ No newline at end of file diff --git a/voxel-import/src/VoxelHelper.h b/voxel-import/src/VoxelHelper.h deleted file mode 100644 index e17fbc1995..0000000000 --- a/voxel-import/src/VoxelHelper.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// VoxelHelper.h -// hifi -// -// Created by Stojce Slavkovski on 6/30/13. -// -// - -#ifndef __hifi__VoxelHelper__ -#define __hifi__VoxelHelper__ - -#include -#include -#include -#include "VoxelTree.h" - -namespace voxelImport { - - using namespace std; - using namespace glm; - - class VoxelHelper { - public: - static void createVoxels(VoxelTree* tree, vector voxels, float voxelSize, rgbColor voxelColor); - }; -} - -#endif /* defined(__hifi__VoxelHelper__) */ diff --git a/voxel-import/src/Voxelizer.cpp b/voxel-import/src/Voxelizer.cpp deleted file mode 100644 index f8ab863f6d..0000000000 --- a/voxel-import/src/Voxelizer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// Voxelizer.cpp -// skpimporter -// -// Created by Stojce Slavkovski on 6/23/13. -// Copyright (c) 2013 High Fidelity. All rights reserved. -// - -#include "Voxelizer.h" -namespace voxelImport { - - using namespace std; - using namespace glm; - - vector Voxelizer::Voxelize(vector vertices, float voxelSize) { - - vector voxels; - - if (vertices.size() < 3) { - throw; - } - - vec3 aPoint = vertices[0]; - vec3 bPoint = vertices[1]; - vec3 cPoint = vertices[2]; - - // first triangle - Triangle* t = new Triangle(aPoint, bPoint, cPoint); - triangles.push_back(*t); - - for (size_t i = 3; i < vertices.size(); i++) { - bPoint = cPoint; - t = new Triangle(aPoint, bPoint, vertices[i]); - triangles.push_back(*t); - } - - for (size_t i = 0; i < triangles.size(); i++) { - vector colliding = triangles[i].getCollidingVoxels(voxelSize); - voxels.insert(voxels.end(), colliding.begin(), colliding.end()); - } - - return voxels; - } -} \ No newline at end of file diff --git a/voxel-import/src/Voxelizer.h b/voxel-import/src/Voxelizer.h deleted file mode 100644 index d38a516bb9..0000000000 --- a/voxel-import/src/Voxelizer.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// Voxelizer.h -// skpimporter -// -// Created by Stojce Slavkovski on 6/23/13. -// Copyright (c) 2013 High Fidelity. All rights reserved. -// - -#ifndef __skpimporter__Voxelizer__ -#define __skpimporter__Voxelizer__ - -#include -#include -#include -#include "Triangle.h" - -namespace voxelImport { - using namespace std; - using namespace glm; - - class Voxelizer { - private: - vector triangles; - public: - vector Voxelize(vector vertices, float voxelSize); - }; -} - -#endif /* defined(__skpimporter__Voxelizer__) */ diff --git a/voxel-import/src/main.cpp b/voxel-import/src/main.cpp deleted file mode 100644 index 216e96527b..0000000000 --- a/voxel-import/src/main.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// main.cpp -// skpimporter -// -// Created by Stojce Slavkovski on 6/14/13. -// Copyright (c) 2013 High Fidelity. All rights reserved. -// - -#include "SketchUp.h" -#include "VoxelTree.h" - -int main(int argc, const char * argv[]) -{ - VoxelTree tree; - if (voxelImport::SketchUp::importModel("model.skp", &tree, 0.1f / 512, 10)) { - tree.writeToSVOFile("voxels.svo"); - } - - return 0; -} - From 8562172584e0ba5bd562bc1c117e66ea856c451c Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 3 Jul 2013 10:21:14 +0200 Subject: [PATCH 03/20] SKP to SVO import research --- CMakeLists.txt | 3 +- cmake/modules/FindSKETCHUP.cmake | 38 ++++++++ voxel-import/CMakeLists.txt | 32 +++++++ voxel-import/resources/model.skp | Bin 0 -> 9746 bytes voxel-import/src/SketchUp.cpp | 131 +++++++++++++++++++++++++++ voxel-import/src/SketchUp.h | 21 +++++ voxel-import/src/Triangle.cpp | 151 +++++++++++++++++++++++++++++++ voxel-import/src/Triangle.h | 38 ++++++++ voxel-import/src/VoxelHelper.cpp | 25 +++++ voxel-import/src/VoxelHelper.h | 28 ++++++ voxel-import/src/Voxelizer.cpp | 44 +++++++++ voxel-import/src/Voxelizer.h | 29 ++++++ voxel-import/src/main.cpp | 21 +++++ 13 files changed, 560 insertions(+), 1 deletion(-) create mode 100644 cmake/modules/FindSKETCHUP.cmake create mode 100644 voxel-import/CMakeLists.txt create mode 100644 voxel-import/resources/model.skp create mode 100644 voxel-import/src/SketchUp.cpp create mode 100644 voxel-import/src/SketchUp.h create mode 100644 voxel-import/src/Triangle.cpp create mode 100644 voxel-import/src/Triangle.h create mode 100644 voxel-import/src/VoxelHelper.cpp create mode 100644 voxel-import/src/VoxelHelper.h create mode 100644 voxel-import/src/Voxelizer.cpp create mode 100644 voxel-import/src/Voxelizer.h create mode 100644 voxel-import/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8af8081975..9ea391a034 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,4 +12,5 @@ add_subdirectory(injector) add_subdirectory(pairing-server) add_subdirectory(space-server) add_subdirectory(voxel-edit) -add_subdirectory(voxel-server) \ No newline at end of file +add_subdirectory(voxel-server) +add_subdirectory(voxel-import) \ No newline at end of file diff --git a/cmake/modules/FindSKETCHUP.cmake b/cmake/modules/FindSKETCHUP.cmake new file mode 100644 index 0000000000..d6c8f070f1 --- /dev/null +++ b/cmake/modules/FindSKETCHUP.cmake @@ -0,0 +1,38 @@ +# Find the static SKETCHUP library +# +# You must provide an SKETCHUP_ROOT_DIR which contains framework +# +# Once done this will define +# +# SKETCHUP_FOUND - system found SketchUp API +# SKETCHUP_FRAMEWORK - Link this to use PortAudio +# +# Created on 6/27/2013 by Stojce Slavkovski +# Copyright (c) 2013 High Fidelity +# + +if (SKETCHUP_FRAMEWORK) + # in cache already + set(SKETCHUP_FOUND TRUE) +else (SKETCHUP_FRAMEWORK) + + find_library(SKETCHUP_FRAMEWORK slapi ${SKETCHUP_ROOT_DIR}) + + if (SKETCHUP_FRAMEWORK) + set(SKETCHUP_FOUND TRUE) + endif (SKETCHUP_FRAMEWORK) + + if (SKETCHUP_FOUND) + if (NOT SKETCHUP_FIND_QUIETLY) + message(STATUS "Found SketchUp: ${SKETCHUP_FRAMEWORK}") + endif (NOT SKETCHUP_FIND_QUIETLY) + else (SKETCHUP_FOUND) + if (SKETCHUP_FIND_REQUIRED) + message(FATAL_ERROR "Could not find SketchUp") + endif (SKETCHUP_FIND_REQUIRED) + endif (SKETCHUP_FOUND) + + # show the SKETCHUP_FRAMEWORK variables only in the advanced view + mark_as_advanced(SKETCHUP_FRAMEWORK) + +endif (SKETCHUP_FRAMEWORK) \ No newline at end of file diff --git a/voxel-import/CMakeLists.txt b/voxel-import/CMakeLists.txt new file mode 100644 index 0000000000..c123e9412b --- /dev/null +++ b/voxel-import/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 2.8) + +if (APPLE) + set(CMAKE_OSX_ARCHITECTURES "i386") +endif (APPLE) + +set(TARGET_NAME voxel-import) + +set(ROOT_DIR ..) +set(MACRO_DIR ${ROOT_DIR}/cmake/macros) + +# setup for find modules +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") + +# set up the external glm library +include(${MACRO_DIR}/IncludeGLM.cmake) +include_glm(${TARGET_NAME} ${ROOT_DIR}) + +include(${MACRO_DIR}/SetupHifiProject.cmake) + +setup_hifi_project(${TARGET_NAME}) + +# link in the shared library +include(${MACRO_DIR}/LinkHifiLibrary.cmake) +link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) + +# link in the hifi voxels library +link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR}) + +# link the sketchup library +find_package(SKETCHUP REQUIRED) +target_link_libraries(${TARGET_NAME} ${SKETCHUP_FRAMEWORK}) \ No newline at end of file diff --git a/voxel-import/resources/model.skp b/voxel-import/resources/model.skp new file mode 100644 index 0000000000000000000000000000000000000000..2638e675dce64a5d850fffad03a7e98ddc26b7d2 GIT binary patch literal 9746 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 HD24n7h~z@s literal 0 HcmV?d00001 diff --git a/voxel-import/src/SketchUp.cpp b/voxel-import/src/SketchUp.cpp new file mode 100644 index 0000000000..0e9183b8fe --- /dev/null +++ b/voxel-import/src/SketchUp.cpp @@ -0,0 +1,131 @@ +// +// SketchUp.cpp +// hifi +// +// Created by Stojce Slavkovski on 6/27/13. +// +// + +#include "SketchUp.h" +#include "AABox.h" +#include "Voxelizer.h" +#include "VoxelHelper.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace glm; + +namespace voxelImport { + + vector getFacesFomModel(SUModelRef model) { + // Get the entity container of the model. + SUEntitiesRef entities = SU_INVALID; + SUModelGetEntities(model, &entities); + + // Get all the faces from the entities object + size_t faceCount = 0; + SUEntitiesGetNumFaces(entities, &faceCount); + vector faces(faceCount); + SUEntitiesGetFaces(entities, faceCount, &faces[0], &faceCount); + + return faces; + } + + SUColor getMaterialColor(SUFaceRef face) { + + SUMaterialRef mat = SU_INVALID; + SUFaceGetFrontMaterial(face, &mat); + + SUColor materialColor = SU_INVALID; + SUMaterialGetColor(mat, &materialColor); + + return materialColor; + } + + vector getEdgeVerices(SUFaceRef face) { + size_t edgeCount = 0; + SUFaceGetNumEdges(face, &edgeCount); + + vector edges(edgeCount); + SUFaceGetEdges(face, edgeCount, &edges[0], &edgeCount); + + + vector vertices(edgeCount); + + // Get the vertex positions for each edge + for (size_t j = 0; j < edgeCount; j++) { + + SUVertexRef startVertex = SU_INVALID; + SUVertexRef endVertex = SU_INVALID; + + SUEdgeGetStartVertex(edges[j], &startVertex); + SUEdgeGetEndVertex(edges[j], &endVertex); + SUPoint3D start; + // SUPoint3D end; + SUVertexGetPosition(startVertex, &start); + // SUVertexGetPosition(endVertex, &end); + + vertices[j] = vec3(start.x, start.y, start.z); + } + return vertices; + } + + bool SketchUp::importModel(const char* modelFileName, VoxelTree tree, float voxelSize, float modelVoxelSize) { + + // Always initialize the API before using it + SUInitialize(); + // Load the model from a file + SUModelRef model = SU_INVALID; + SUResult res = SUModelCreateFromFile(&model, modelFileName); + // It's best to always check the return code from each SU function call. + // Only showing this check once to keep this example short. + if (res != SU_ERROR_NONE) { + printf("error loading model"); + return false; + } + + vector faces = getFacesFomModel(model); + size_t faceCount = faces.size(); + unsigned long voxelVericesCount = 0; + + for (size_t i = 0; i < faceCount; i++) { + + SUFaceRef face = faces[i]; + SUColor materialColor = getMaterialColor(face); + + vector vertices = getEdgeVerices(face); + rgbColor voxelColor = {materialColor.red, materialColor.green, materialColor.blue}; + vector voxelVerices; + + if (vertices.size() == 2) { + voxelVerices = vertices; + } else if (vertices.size() > 2) { + Voxelizer *voxelizer = new Voxelizer(); + voxelVerices = voxelizer->Voxelize(vertices, modelVoxelSize); + } + voxelVericesCount += voxelVerices.size(); + VoxelHelper::createVoxels(&tree, voxelVerices, voxelSize, voxelColor); + } + + printf("total voxelsVerices: %ld\n", voxelVericesCount); + printf("total Voxels: %ld\n", tree.getVoxelCount()); + // Must release the model or there will be memory leaks + SUModelRelease(&model); + // Always terminate the API when done using it + SUTerminate(); + return true; + } +} diff --git a/voxel-import/src/SketchUp.h b/voxel-import/src/SketchUp.h new file mode 100644 index 0000000000..1a71a8ae8e --- /dev/null +++ b/voxel-import/src/SketchUp.h @@ -0,0 +1,21 @@ +// +// SketchUp.h +// hifi +// +// Created by Stojce Slavkovski on 6/27/13. +// +// + +#ifndef __hifi__SketchUp__ +#define __hifi__SketchUp__ + +#include +#include "VoxelTree.h" + +namespace voxelImport { + class SketchUp { + public: + static bool importModel(const char* modelFileName, VoxelTree tree, float voxelSize, float modelVoxelSize); + }; +} +#endif /* defined(__hifi__SketchUp__) */ diff --git a/voxel-import/src/Triangle.cpp b/voxel-import/src/Triangle.cpp new file mode 100644 index 0000000000..bb2eaae775 --- /dev/null +++ b/voxel-import/src/Triangle.cpp @@ -0,0 +1,151 @@ +// +// Triangle.cpp +// hifi +// +// Created by Stojce Slavkovski on 6/27/13. +// +// + +#include "Triangle.h" +namespace voxelImport { + +#define voxelOffset 2 + + int divideCeiling(double a, double b) { + return (int) (1 + ((a - 1) / b)); + } + + Triangle::Triangle(vec3 a, vec3 b, vec3 c) { + _a = a; + _b = b; + _c = c; + + double minX = fmin(a.x, fmin(b.x, c.x)); + double maxX = fmax(a.x, fmax(b.x, c.x)); + double minY = fmin(a.y, fmin(b.y, c.y)); + double maxY = fmax(a.y, fmax(b.y, c.y)); + double minZ = fmin(a.z, fmin(b.z, c.z)); + double maxZ = fmax(a.z, fmax(b.z, c.z)); + + vec3 min = vec3(minX, minY, minZ); + vec3 max = vec3(maxX, maxY, maxZ); + + _boundingBox = new AABox(min, max); + } + + vector Triangle::getCollidingVoxels(float voxelSize) { + vector result; + + vec3 min = _boundingBox->getCorner(); + vec3 max = _boundingBox->getSize(); + + vec3 minPoint = min - voxelSize * voxelOffset; + vec3 size = (max + voxelSize * voxelOffset) - minPoint; + + vec3 deltaP = vec3(voxelSize, voxelSize, voxelSize); + + // create temp voxels inside of the box + vec3 length = vec3(divideCeiling(size.x, deltaP.x), divideCeiling(size.y , deltaP.y), int(size.z / deltaP.z)); + + // iterate over each voxel + for (size_t iz = 0; iz <= length.z; iz++) { + for (size_t iy = 0; iy <= length.y; iy++) { + for (size_t ix = 0; ix <= length.x; ix++) { + + vec3 voxel = minPoint + vec3(ix, iy, iz) * deltaP; + // test if collides with triangle pane + if (this->isCollidingWithVoxel(voxel, deltaP)) { + // add it to result voxels + result.push_back(voxel); + } + } + } + } + + return result; + } + + bool Triangle::isCollidingWithVoxel(vec3 voxelCenter, vec3 delta) { + + vec3 v01 = _b - _a; + vec3 v02 = _c - _a; + + vec3 crossVector = cross(v01, v02); + vec3 faceNormal = normalize(crossVector); + + vec3 criticalPoint = vec3(faceNormal.x > 0 ? delta.x : 0, faceNormal.y > 0 ? delta.y : 0, faceNormal.z > 0 ? delta.z : 0); + + // (1) + // Check whether minPoint + criticalPoint and the opposite box corner minPoint + (deltaP - criticalPoint) + // are on different sides of the plane or one of them is on the plane. + vec3 minPoint = criticalPoint - _a; + float d1 = dot(faceNormal, minPoint); + minPoint = delta - criticalPoint - _a; + float d2 = dot(faceNormal, minPoint); + + bool isTrianglePlaneOverlappingVoxel = (dot(faceNormal, voxelCenter) + d1) * (dot(faceNormal, voxelCenter) + d2) <= 0; + + if (!isTrianglePlaneOverlappingVoxel) { + return false; + } + + vector faceEdge(3); + faceEdge[0] = _b - _a; + faceEdge[1] = _c - _b; + faceEdge[2] = _a - _c; + + for (size_t i =0; i < 3; i++) { + + vec3 v; + + if (i == 0) { + v = _a; + } else if (i == 1) { + v = _b; + } else { + v = _c; + } + + if (!testVoxelEdgeXYProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { + return false; + } + + if (!testVoxelEdgeYZProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { + return false; + } + + if (!testVoxelEdgeZXProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { + return false; + } + } + + return true; + } + + bool Triangle::testVoxelEdgeXYProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { + // XY Plane + vec2 eNormal = vec2(-faceEdge.y, faceEdge.x); + eNormal *= faceNormal.z >= 0.0f ? 1.0f : -1.0f; + float Dxy = - dot(eNormal, vec2(triVertex.x, triVertex.y)) + fmax(0.0f, delta.x * eNormal.x) + fmax(0.0f, delta.y * eNormal.y); + float test = dot(eNormal, vec2(voxelEvalPoint.x, voxelEvalPoint.y)) + Dxy; + return test >= 0.0f; + } + + bool Triangle::testVoxelEdgeYZProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { + // YZ Plane + vec2 eNormal = vec2(-faceEdge.z, faceEdge.y); + eNormal *= faceNormal.x >= 0.0f ? 1.0f : -1.0f; + double Dyz = - dot(eNormal, vec2(triVertex.y, triVertex.z)) + fmax(0.0f, delta.y * eNormal.x) + fmax(0.0f, delta.z * eNormal.y); + double test = dot(eNormal, vec2(voxelEvalPoint.y, voxelEvalPoint.z)) + Dyz; + return test >= 0.0f; + } + + bool Triangle::testVoxelEdgeZXProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { + // ZX Plane + vec2 eNormal = vec2(-faceEdge.x, faceEdge.z); + eNormal *= faceNormal.y >= 0.0f ? 1.0f : -1.0f; + float Dzx = -dot(eNormal, vec2(triVertex.z, triVertex.x)) + fmax(0.0f, delta.z * eNormal.x) + fmax(0.0f, delta.x * eNormal.y); + double test = dot(eNormal, vec2(voxelEvalPoint.z, voxelEvalPoint.x)) + Dzx; + return test >= 0.0f; + } +} diff --git a/voxel-import/src/Triangle.h b/voxel-import/src/Triangle.h new file mode 100644 index 0000000000..9abc942fe0 --- /dev/null +++ b/voxel-import/src/Triangle.h @@ -0,0 +1,38 @@ +// +// Triangle.h +// hifi +// +// Created by Stojce Slavkovski on 6/27/13. +// +// + +#ifndef __hifi__Triangle__ +#define __hifi__Triangle__ + +#include +#include +#include +#include "AABox.h" +namespace voxelImport { + using namespace std; + using namespace glm; + + class Triangle { + + public: + Triangle(glm::vec3 a, glm::vec3 b, glm::vec3 c); + vector getCollidingVoxels(float voxelSize); + + private: + vec3 _a; + vec3 _b; + vec3 _c; + AABox* _boundingBox; + + bool isCollidingWithVoxel(vec3 voxelCenter, vec3 delta); + bool testVoxelEdgeXYProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); + bool testVoxelEdgeYZProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); + bool testVoxelEdgeZXProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); + }; +} +#endif /* defined(__hifi__Triangle__) */ diff --git a/voxel-import/src/VoxelHelper.cpp b/voxel-import/src/VoxelHelper.cpp new file mode 100644 index 0000000000..de5b450650 --- /dev/null +++ b/voxel-import/src/VoxelHelper.cpp @@ -0,0 +1,25 @@ +// +// VoxelHelper.cpp +// hifi +// +// Created by Stojce Slavkovski on 6/30/13. +// +// + +#include "VoxelHelper.h" + +namespace voxelImport { + + using namespace std; + using namespace glm; + + void VoxelHelper::createVoxels(VoxelTree* tree, vector voxels, float voxelSize, rgbColor voxelColor) { + if (voxels.size() > 2) { //surface + for (size_t v = 0; v < voxels.size(); v++) { + tree->createVoxel(voxels[v].x * voxelSize, voxels[v].y * voxelSize, voxels[v].z * voxelSize, voxelSize, voxelColor[0], voxelColor[1], voxelColor[2]); + } + } else if (voxels.size() == 2) { + tree->createLine(voxels[0], voxels[1], voxelSize, voxelColor); + } + } +} \ No newline at end of file diff --git a/voxel-import/src/VoxelHelper.h b/voxel-import/src/VoxelHelper.h new file mode 100644 index 0000000000..e17fbc1995 --- /dev/null +++ b/voxel-import/src/VoxelHelper.h @@ -0,0 +1,28 @@ +// +// VoxelHelper.h +// hifi +// +// Created by Stojce Slavkovski on 6/30/13. +// +// + +#ifndef __hifi__VoxelHelper__ +#define __hifi__VoxelHelper__ + +#include +#include +#include +#include "VoxelTree.h" + +namespace voxelImport { + + using namespace std; + using namespace glm; + + class VoxelHelper { + public: + static void createVoxels(VoxelTree* tree, vector voxels, float voxelSize, rgbColor voxelColor); + }; +} + +#endif /* defined(__hifi__VoxelHelper__) */ diff --git a/voxel-import/src/Voxelizer.cpp b/voxel-import/src/Voxelizer.cpp new file mode 100644 index 0000000000..f8ab863f6d --- /dev/null +++ b/voxel-import/src/Voxelizer.cpp @@ -0,0 +1,44 @@ +// +// Voxelizer.cpp +// skpimporter +// +// Created by Stojce Slavkovski on 6/23/13. +// Copyright (c) 2013 High Fidelity. All rights reserved. +// + +#include "Voxelizer.h" +namespace voxelImport { + + using namespace std; + using namespace glm; + + vector Voxelizer::Voxelize(vector vertices, float voxelSize) { + + vector voxels; + + if (vertices.size() < 3) { + throw; + } + + vec3 aPoint = vertices[0]; + vec3 bPoint = vertices[1]; + vec3 cPoint = vertices[2]; + + // first triangle + Triangle* t = new Triangle(aPoint, bPoint, cPoint); + triangles.push_back(*t); + + for (size_t i = 3; i < vertices.size(); i++) { + bPoint = cPoint; + t = new Triangle(aPoint, bPoint, vertices[i]); + triangles.push_back(*t); + } + + for (size_t i = 0; i < triangles.size(); i++) { + vector colliding = triangles[i].getCollidingVoxels(voxelSize); + voxels.insert(voxels.end(), colliding.begin(), colliding.end()); + } + + return voxels; + } +} \ No newline at end of file diff --git a/voxel-import/src/Voxelizer.h b/voxel-import/src/Voxelizer.h new file mode 100644 index 0000000000..d38a516bb9 --- /dev/null +++ b/voxel-import/src/Voxelizer.h @@ -0,0 +1,29 @@ +// +// Voxelizer.h +// skpimporter +// +// Created by Stojce Slavkovski on 6/23/13. +// Copyright (c) 2013 High Fidelity. All rights reserved. +// + +#ifndef __skpimporter__Voxelizer__ +#define __skpimporter__Voxelizer__ + +#include +#include +#include +#include "Triangle.h" + +namespace voxelImport { + using namespace std; + using namespace glm; + + class Voxelizer { + private: + vector triangles; + public: + vector Voxelize(vector vertices, float voxelSize); + }; +} + +#endif /* defined(__skpimporter__Voxelizer__) */ diff --git a/voxel-import/src/main.cpp b/voxel-import/src/main.cpp new file mode 100644 index 0000000000..216e96527b --- /dev/null +++ b/voxel-import/src/main.cpp @@ -0,0 +1,21 @@ +// +// main.cpp +// skpimporter +// +// Created by Stojce Slavkovski on 6/14/13. +// Copyright (c) 2013 High Fidelity. All rights reserved. +// + +#include "SketchUp.h" +#include "VoxelTree.h" + +int main(int argc, const char * argv[]) +{ + VoxelTree tree; + if (voxelImport::SketchUp::importModel("model.skp", &tree, 0.1f / 512, 10)) { + tree.writeToSVOFile("voxels.svo"); + } + + return 0; +} + From 74a4f77e52c0b927cec668eda5afc65e8ee3ea7f Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 3 Jul 2013 10:36:51 +0200 Subject: [PATCH 04/20] Revert "SKP to SVO import research" This reverts commit 8562172584e0ba5bd562bc1c117e66ea856c451c. --- CMakeLists.txt | 3 +- cmake/modules/FindSKETCHUP.cmake | 38 -------- voxel-import/CMakeLists.txt | 32 ------- voxel-import/resources/model.skp | Bin 9746 -> 0 bytes voxel-import/src/SketchUp.cpp | 131 --------------------------- voxel-import/src/SketchUp.h | 21 ----- voxel-import/src/Triangle.cpp | 151 ------------------------------- voxel-import/src/Triangle.h | 38 -------- voxel-import/src/VoxelHelper.cpp | 25 ----- voxel-import/src/VoxelHelper.h | 28 ------ voxel-import/src/Voxelizer.cpp | 44 --------- voxel-import/src/Voxelizer.h | 29 ------ voxel-import/src/main.cpp | 21 ----- 13 files changed, 1 insertion(+), 560 deletions(-) delete mode 100644 cmake/modules/FindSKETCHUP.cmake delete mode 100644 voxel-import/CMakeLists.txt delete mode 100644 voxel-import/resources/model.skp delete mode 100644 voxel-import/src/SketchUp.cpp delete mode 100644 voxel-import/src/SketchUp.h delete mode 100644 voxel-import/src/Triangle.cpp delete mode 100644 voxel-import/src/Triangle.h delete mode 100644 voxel-import/src/VoxelHelper.cpp delete mode 100644 voxel-import/src/VoxelHelper.h delete mode 100644 voxel-import/src/Voxelizer.cpp delete mode 100644 voxel-import/src/Voxelizer.h delete mode 100644 voxel-import/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ea391a034..8af8081975 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,5 +12,4 @@ add_subdirectory(injector) add_subdirectory(pairing-server) add_subdirectory(space-server) add_subdirectory(voxel-edit) -add_subdirectory(voxel-server) -add_subdirectory(voxel-import) \ No newline at end of file +add_subdirectory(voxel-server) \ No newline at end of file diff --git a/cmake/modules/FindSKETCHUP.cmake b/cmake/modules/FindSKETCHUP.cmake deleted file mode 100644 index d6c8f070f1..0000000000 --- a/cmake/modules/FindSKETCHUP.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# Find the static SKETCHUP library -# -# You must provide an SKETCHUP_ROOT_DIR which contains framework -# -# Once done this will define -# -# SKETCHUP_FOUND - system found SketchUp API -# SKETCHUP_FRAMEWORK - Link this to use PortAudio -# -# Created on 6/27/2013 by Stojce Slavkovski -# Copyright (c) 2013 High Fidelity -# - -if (SKETCHUP_FRAMEWORK) - # in cache already - set(SKETCHUP_FOUND TRUE) -else (SKETCHUP_FRAMEWORK) - - find_library(SKETCHUP_FRAMEWORK slapi ${SKETCHUP_ROOT_DIR}) - - if (SKETCHUP_FRAMEWORK) - set(SKETCHUP_FOUND TRUE) - endif (SKETCHUP_FRAMEWORK) - - if (SKETCHUP_FOUND) - if (NOT SKETCHUP_FIND_QUIETLY) - message(STATUS "Found SketchUp: ${SKETCHUP_FRAMEWORK}") - endif (NOT SKETCHUP_FIND_QUIETLY) - else (SKETCHUP_FOUND) - if (SKETCHUP_FIND_REQUIRED) - message(FATAL_ERROR "Could not find SketchUp") - endif (SKETCHUP_FIND_REQUIRED) - endif (SKETCHUP_FOUND) - - # show the SKETCHUP_FRAMEWORK variables only in the advanced view - mark_as_advanced(SKETCHUP_FRAMEWORK) - -endif (SKETCHUP_FRAMEWORK) \ No newline at end of file diff --git a/voxel-import/CMakeLists.txt b/voxel-import/CMakeLists.txt deleted file mode 100644 index c123e9412b..0000000000 --- a/voxel-import/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -if (APPLE) - set(CMAKE_OSX_ARCHITECTURES "i386") -endif (APPLE) - -set(TARGET_NAME voxel-import) - -set(ROOT_DIR ..) -set(MACRO_DIR ${ROOT_DIR}/cmake/macros) - -# setup for find modules -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") - -# set up the external glm library -include(${MACRO_DIR}/IncludeGLM.cmake) -include_glm(${TARGET_NAME} ${ROOT_DIR}) - -include(${MACRO_DIR}/SetupHifiProject.cmake) - -setup_hifi_project(${TARGET_NAME}) - -# link in the shared library -include(${MACRO_DIR}/LinkHifiLibrary.cmake) -link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) - -# link in the hifi voxels library -link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR}) - -# link the sketchup library -find_package(SKETCHUP REQUIRED) -target_link_libraries(${TARGET_NAME} ${SKETCHUP_FRAMEWORK}) \ No newline at end of file diff --git a/voxel-import/resources/model.skp b/voxel-import/resources/model.skp deleted file mode 100644 index 2638e675dce64a5d850fffad03a7e98ddc26b7d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9746 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 HD24n7h~z@s diff --git a/voxel-import/src/SketchUp.cpp b/voxel-import/src/SketchUp.cpp deleted file mode 100644 index 0e9183b8fe..0000000000 --- a/voxel-import/src/SketchUp.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// -// SketchUp.cpp -// hifi -// -// Created by Stojce Slavkovski on 6/27/13. -// -// - -#include "SketchUp.h" -#include "AABox.h" -#include "Voxelizer.h" -#include "VoxelHelper.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace glm; - -namespace voxelImport { - - vector getFacesFomModel(SUModelRef model) { - // Get the entity container of the model. - SUEntitiesRef entities = SU_INVALID; - SUModelGetEntities(model, &entities); - - // Get all the faces from the entities object - size_t faceCount = 0; - SUEntitiesGetNumFaces(entities, &faceCount); - vector faces(faceCount); - SUEntitiesGetFaces(entities, faceCount, &faces[0], &faceCount); - - return faces; - } - - SUColor getMaterialColor(SUFaceRef face) { - - SUMaterialRef mat = SU_INVALID; - SUFaceGetFrontMaterial(face, &mat); - - SUColor materialColor = SU_INVALID; - SUMaterialGetColor(mat, &materialColor); - - return materialColor; - } - - vector getEdgeVerices(SUFaceRef face) { - size_t edgeCount = 0; - SUFaceGetNumEdges(face, &edgeCount); - - vector edges(edgeCount); - SUFaceGetEdges(face, edgeCount, &edges[0], &edgeCount); - - - vector vertices(edgeCount); - - // Get the vertex positions for each edge - for (size_t j = 0; j < edgeCount; j++) { - - SUVertexRef startVertex = SU_INVALID; - SUVertexRef endVertex = SU_INVALID; - - SUEdgeGetStartVertex(edges[j], &startVertex); - SUEdgeGetEndVertex(edges[j], &endVertex); - SUPoint3D start; - // SUPoint3D end; - SUVertexGetPosition(startVertex, &start); - // SUVertexGetPosition(endVertex, &end); - - vertices[j] = vec3(start.x, start.y, start.z); - } - return vertices; - } - - bool SketchUp::importModel(const char* modelFileName, VoxelTree tree, float voxelSize, float modelVoxelSize) { - - // Always initialize the API before using it - SUInitialize(); - // Load the model from a file - SUModelRef model = SU_INVALID; - SUResult res = SUModelCreateFromFile(&model, modelFileName); - // It's best to always check the return code from each SU function call. - // Only showing this check once to keep this example short. - if (res != SU_ERROR_NONE) { - printf("error loading model"); - return false; - } - - vector faces = getFacesFomModel(model); - size_t faceCount = faces.size(); - unsigned long voxelVericesCount = 0; - - for (size_t i = 0; i < faceCount; i++) { - - SUFaceRef face = faces[i]; - SUColor materialColor = getMaterialColor(face); - - vector vertices = getEdgeVerices(face); - rgbColor voxelColor = {materialColor.red, materialColor.green, materialColor.blue}; - vector voxelVerices; - - if (vertices.size() == 2) { - voxelVerices = vertices; - } else if (vertices.size() > 2) { - Voxelizer *voxelizer = new Voxelizer(); - voxelVerices = voxelizer->Voxelize(vertices, modelVoxelSize); - } - voxelVericesCount += voxelVerices.size(); - VoxelHelper::createVoxels(&tree, voxelVerices, voxelSize, voxelColor); - } - - printf("total voxelsVerices: %ld\n", voxelVericesCount); - printf("total Voxels: %ld\n", tree.getVoxelCount()); - // Must release the model or there will be memory leaks - SUModelRelease(&model); - // Always terminate the API when done using it - SUTerminate(); - return true; - } -} diff --git a/voxel-import/src/SketchUp.h b/voxel-import/src/SketchUp.h deleted file mode 100644 index 1a71a8ae8e..0000000000 --- a/voxel-import/src/SketchUp.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// SketchUp.h -// hifi -// -// Created by Stojce Slavkovski on 6/27/13. -// -// - -#ifndef __hifi__SketchUp__ -#define __hifi__SketchUp__ - -#include -#include "VoxelTree.h" - -namespace voxelImport { - class SketchUp { - public: - static bool importModel(const char* modelFileName, VoxelTree tree, float voxelSize, float modelVoxelSize); - }; -} -#endif /* defined(__hifi__SketchUp__) */ diff --git a/voxel-import/src/Triangle.cpp b/voxel-import/src/Triangle.cpp deleted file mode 100644 index bb2eaae775..0000000000 --- a/voxel-import/src/Triangle.cpp +++ /dev/null @@ -1,151 +0,0 @@ -// -// Triangle.cpp -// hifi -// -// Created by Stojce Slavkovski on 6/27/13. -// -// - -#include "Triangle.h" -namespace voxelImport { - -#define voxelOffset 2 - - int divideCeiling(double a, double b) { - return (int) (1 + ((a - 1) / b)); - } - - Triangle::Triangle(vec3 a, vec3 b, vec3 c) { - _a = a; - _b = b; - _c = c; - - double minX = fmin(a.x, fmin(b.x, c.x)); - double maxX = fmax(a.x, fmax(b.x, c.x)); - double minY = fmin(a.y, fmin(b.y, c.y)); - double maxY = fmax(a.y, fmax(b.y, c.y)); - double minZ = fmin(a.z, fmin(b.z, c.z)); - double maxZ = fmax(a.z, fmax(b.z, c.z)); - - vec3 min = vec3(minX, minY, minZ); - vec3 max = vec3(maxX, maxY, maxZ); - - _boundingBox = new AABox(min, max); - } - - vector Triangle::getCollidingVoxels(float voxelSize) { - vector result; - - vec3 min = _boundingBox->getCorner(); - vec3 max = _boundingBox->getSize(); - - vec3 minPoint = min - voxelSize * voxelOffset; - vec3 size = (max + voxelSize * voxelOffset) - minPoint; - - vec3 deltaP = vec3(voxelSize, voxelSize, voxelSize); - - // create temp voxels inside of the box - vec3 length = vec3(divideCeiling(size.x, deltaP.x), divideCeiling(size.y , deltaP.y), int(size.z / deltaP.z)); - - // iterate over each voxel - for (size_t iz = 0; iz <= length.z; iz++) { - for (size_t iy = 0; iy <= length.y; iy++) { - for (size_t ix = 0; ix <= length.x; ix++) { - - vec3 voxel = minPoint + vec3(ix, iy, iz) * deltaP; - // test if collides with triangle pane - if (this->isCollidingWithVoxel(voxel, deltaP)) { - // add it to result voxels - result.push_back(voxel); - } - } - } - } - - return result; - } - - bool Triangle::isCollidingWithVoxel(vec3 voxelCenter, vec3 delta) { - - vec3 v01 = _b - _a; - vec3 v02 = _c - _a; - - vec3 crossVector = cross(v01, v02); - vec3 faceNormal = normalize(crossVector); - - vec3 criticalPoint = vec3(faceNormal.x > 0 ? delta.x : 0, faceNormal.y > 0 ? delta.y : 0, faceNormal.z > 0 ? delta.z : 0); - - // (1) - // Check whether minPoint + criticalPoint and the opposite box corner minPoint + (deltaP - criticalPoint) - // are on different sides of the plane or one of them is on the plane. - vec3 minPoint = criticalPoint - _a; - float d1 = dot(faceNormal, minPoint); - minPoint = delta - criticalPoint - _a; - float d2 = dot(faceNormal, minPoint); - - bool isTrianglePlaneOverlappingVoxel = (dot(faceNormal, voxelCenter) + d1) * (dot(faceNormal, voxelCenter) + d2) <= 0; - - if (!isTrianglePlaneOverlappingVoxel) { - return false; - } - - vector faceEdge(3); - faceEdge[0] = _b - _a; - faceEdge[1] = _c - _b; - faceEdge[2] = _a - _c; - - for (size_t i =0; i < 3; i++) { - - vec3 v; - - if (i == 0) { - v = _a; - } else if (i == 1) { - v = _b; - } else { - v = _c; - } - - if (!testVoxelEdgeXYProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { - return false; - } - - if (!testVoxelEdgeYZProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { - return false; - } - - if (!testVoxelEdgeZXProjection(v, delta, voxelCenter, faceNormal, faceEdge[i])) { - return false; - } - } - - return true; - } - - bool Triangle::testVoxelEdgeXYProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { - // XY Plane - vec2 eNormal = vec2(-faceEdge.y, faceEdge.x); - eNormal *= faceNormal.z >= 0.0f ? 1.0f : -1.0f; - float Dxy = - dot(eNormal, vec2(triVertex.x, triVertex.y)) + fmax(0.0f, delta.x * eNormal.x) + fmax(0.0f, delta.y * eNormal.y); - float test = dot(eNormal, vec2(voxelEvalPoint.x, voxelEvalPoint.y)) + Dxy; - return test >= 0.0f; - } - - bool Triangle::testVoxelEdgeYZProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { - // YZ Plane - vec2 eNormal = vec2(-faceEdge.z, faceEdge.y); - eNormal *= faceNormal.x >= 0.0f ? 1.0f : -1.0f; - double Dyz = - dot(eNormal, vec2(triVertex.y, triVertex.z)) + fmax(0.0f, delta.y * eNormal.x) + fmax(0.0f, delta.z * eNormal.y); - double test = dot(eNormal, vec2(voxelEvalPoint.y, voxelEvalPoint.z)) + Dyz; - return test >= 0.0f; - } - - bool Triangle::testVoxelEdgeZXProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge) { - // ZX Plane - vec2 eNormal = vec2(-faceEdge.x, faceEdge.z); - eNormal *= faceNormal.y >= 0.0f ? 1.0f : -1.0f; - float Dzx = -dot(eNormal, vec2(triVertex.z, triVertex.x)) + fmax(0.0f, delta.z * eNormal.x) + fmax(0.0f, delta.x * eNormal.y); - double test = dot(eNormal, vec2(voxelEvalPoint.z, voxelEvalPoint.x)) + Dzx; - return test >= 0.0f; - } -} diff --git a/voxel-import/src/Triangle.h b/voxel-import/src/Triangle.h deleted file mode 100644 index 9abc942fe0..0000000000 --- a/voxel-import/src/Triangle.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Triangle.h -// hifi -// -// Created by Stojce Slavkovski on 6/27/13. -// -// - -#ifndef __hifi__Triangle__ -#define __hifi__Triangle__ - -#include -#include -#include -#include "AABox.h" -namespace voxelImport { - using namespace std; - using namespace glm; - - class Triangle { - - public: - Triangle(glm::vec3 a, glm::vec3 b, glm::vec3 c); - vector getCollidingVoxels(float voxelSize); - - private: - vec3 _a; - vec3 _b; - vec3 _c; - AABox* _boundingBox; - - bool isCollidingWithVoxel(vec3 voxelCenter, vec3 delta); - bool testVoxelEdgeXYProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); - bool testVoxelEdgeYZProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); - bool testVoxelEdgeZXProjection(vec3 triVertex, vec3 delta, vec3 voxelEvalPoint, vec3 faceNormal, vec3 faceEdge); - }; -} -#endif /* defined(__hifi__Triangle__) */ diff --git a/voxel-import/src/VoxelHelper.cpp b/voxel-import/src/VoxelHelper.cpp deleted file mode 100644 index de5b450650..0000000000 --- a/voxel-import/src/VoxelHelper.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// VoxelHelper.cpp -// hifi -// -// Created by Stojce Slavkovski on 6/30/13. -// -// - -#include "VoxelHelper.h" - -namespace voxelImport { - - using namespace std; - using namespace glm; - - void VoxelHelper::createVoxels(VoxelTree* tree, vector voxels, float voxelSize, rgbColor voxelColor) { - if (voxels.size() > 2) { //surface - for (size_t v = 0; v < voxels.size(); v++) { - tree->createVoxel(voxels[v].x * voxelSize, voxels[v].y * voxelSize, voxels[v].z * voxelSize, voxelSize, voxelColor[0], voxelColor[1], voxelColor[2]); - } - } else if (voxels.size() == 2) { - tree->createLine(voxels[0], voxels[1], voxelSize, voxelColor); - } - } -} \ No newline at end of file diff --git a/voxel-import/src/VoxelHelper.h b/voxel-import/src/VoxelHelper.h deleted file mode 100644 index e17fbc1995..0000000000 --- a/voxel-import/src/VoxelHelper.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// VoxelHelper.h -// hifi -// -// Created by Stojce Slavkovski on 6/30/13. -// -// - -#ifndef __hifi__VoxelHelper__ -#define __hifi__VoxelHelper__ - -#include -#include -#include -#include "VoxelTree.h" - -namespace voxelImport { - - using namespace std; - using namespace glm; - - class VoxelHelper { - public: - static void createVoxels(VoxelTree* tree, vector voxels, float voxelSize, rgbColor voxelColor); - }; -} - -#endif /* defined(__hifi__VoxelHelper__) */ diff --git a/voxel-import/src/Voxelizer.cpp b/voxel-import/src/Voxelizer.cpp deleted file mode 100644 index f8ab863f6d..0000000000 --- a/voxel-import/src/Voxelizer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// Voxelizer.cpp -// skpimporter -// -// Created by Stojce Slavkovski on 6/23/13. -// Copyright (c) 2013 High Fidelity. All rights reserved. -// - -#include "Voxelizer.h" -namespace voxelImport { - - using namespace std; - using namespace glm; - - vector Voxelizer::Voxelize(vector vertices, float voxelSize) { - - vector voxels; - - if (vertices.size() < 3) { - throw; - } - - vec3 aPoint = vertices[0]; - vec3 bPoint = vertices[1]; - vec3 cPoint = vertices[2]; - - // first triangle - Triangle* t = new Triangle(aPoint, bPoint, cPoint); - triangles.push_back(*t); - - for (size_t i = 3; i < vertices.size(); i++) { - bPoint = cPoint; - t = new Triangle(aPoint, bPoint, vertices[i]); - triangles.push_back(*t); - } - - for (size_t i = 0; i < triangles.size(); i++) { - vector colliding = triangles[i].getCollidingVoxels(voxelSize); - voxels.insert(voxels.end(), colliding.begin(), colliding.end()); - } - - return voxels; - } -} \ No newline at end of file diff --git a/voxel-import/src/Voxelizer.h b/voxel-import/src/Voxelizer.h deleted file mode 100644 index d38a516bb9..0000000000 --- a/voxel-import/src/Voxelizer.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// Voxelizer.h -// skpimporter -// -// Created by Stojce Slavkovski on 6/23/13. -// Copyright (c) 2013 High Fidelity. All rights reserved. -// - -#ifndef __skpimporter__Voxelizer__ -#define __skpimporter__Voxelizer__ - -#include -#include -#include -#include "Triangle.h" - -namespace voxelImport { - using namespace std; - using namespace glm; - - class Voxelizer { - private: - vector triangles; - public: - vector Voxelize(vector vertices, float voxelSize); - }; -} - -#endif /* defined(__skpimporter__Voxelizer__) */ diff --git a/voxel-import/src/main.cpp b/voxel-import/src/main.cpp deleted file mode 100644 index 216e96527b..0000000000 --- a/voxel-import/src/main.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// main.cpp -// skpimporter -// -// Created by Stojce Slavkovski on 6/14/13. -// Copyright (c) 2013 High Fidelity. All rights reserved. -// - -#include "SketchUp.h" -#include "VoxelTree.h" - -int main(int argc, const char * argv[]) -{ - VoxelTree tree; - if (voxelImport::SketchUp::importModel("model.skp", &tree, 0.1f / 512, 10)) { - tree.writeToSVOFile("voxels.svo"); - } - - return 0; -} - From fef70098a33a6e0a810baf65d8591ab9d7d4c2ab Mon Sep 17 00:00:00 2001 From: stojce Date: Sun, 8 Sep 2013 21:28:30 +0200 Subject: [PATCH 05/20] #19418 Load a local HTML file in a web view within Interface --- interface/CMakeLists.txt | 1 + .../html/interface-welcome-allsvg.html | 137 ++++++++++++++++++ interface/src/Application.cpp | 3 + interface/src/InfoView.cpp | 60 ++++++++ interface/src/InfoView.h | 27 ++++ 5 files changed, 228 insertions(+) create mode 100644 interface/resources/html/interface-welcome-allsvg.html create mode 100644 interface/src/InfoView.cpp create mode 100644 interface/src/InfoView.h diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 009f7d46ec..08ae5816a5 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -52,6 +52,7 @@ find_package(Qt5Multimedia REQUIRED) find_package(Qt5Network REQUIRED) find_package(Qt5OpenGL REQUIRED) find_package(Qt5Svg REQUIRED) +find_package(Qt5WebKitWidgets REQUIRED) if (APPLE) set(MACOSX_BUNDLE_BUNDLE_NAME Interface) diff --git a/interface/resources/html/interface-welcome-allsvg.html b/interface/resources/html/interface-welcome-allsvg.html new file mode 100644 index 0000000000..c61d457bb9 --- /dev/null +++ b/interface/resources/html/interface-welcome-allsvg.html @@ -0,0 +1,137 @@ + + + + Welcome to Interface + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + What you can do with Hifi so far: + + + Move around. + + + Listen and talk. + + + Build something. + + + Connect devices. + + + Look around. + + + Move around with WASD + & fly up or down with E & C + + + Use your best headphones + and microphone for high fidelity + audio. Look for the blue balls + around the universe – walk up + to them (they become people + as you get closer) and talk! + + + Refer to the Tools menu for + available tools. Each tool is a + ‘mode’ that enables actions through + clicking. Press the V key to enter + voxel ‘add mode’ where you’ll be + able to click to add a voxel. + + + Have an Oculus Rift or a + Leap Motion? Gyros in your + headset? An Xbox Kinect? + We have experimental + features for them all. + + + Use two fingers to look + around via the trackpad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + + + C + + + D + + + S + + + WE + + + + + + path d="M41.277,11.18 L46.981,19.663 L35.579,19.663 L41.277,11.18" id="Fill-12" fill="#FFFFFF" sketch:type="MSShapeGroup"> + + + + + diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index eefbc69d25..168adbc30c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -65,6 +65,7 @@ #include "devices/OculusManager.h" #include "renderer/ProgramObject.h" #include "ui/TextRenderer.h" +#include "InfoView.h" using namespace std; @@ -328,6 +329,8 @@ void Application::initializeGL() { #if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) Menu::getInstance()->checkForUpdates(); #endif + + InfoView::showFirstTime(); } void Application::paintGL() { diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp new file mode 100644 index 0000000000..591149c619 --- /dev/null +++ b/interface/src/InfoView.cpp @@ -0,0 +1,60 @@ +// +// InfoView +// hifi +// +// Created by Stojce Slavkovski on 9/7/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#include "InfoView.h" +#include +#include "Application.h" +#include +#include +#include + +#define VIEW_FIXED_WIDTH 808 +#define SETTINGS_KEY_VERSION "info-version" + +InfoView::InfoView() +{ + this->settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, true); + +#ifdef Q_OS_MAC + QString resourcesPath = QCoreApplication::applicationDirPath() + "/../Resources"; +#else + QString resourcesPath = QCoreApplication::applicationDirPath() + "/resources"; +#endif + + QUrl url = QUrl::fromLocalFile(resourcesPath + "/html/interface-welcome-allsvg.html"); + this->load(url); + connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loaded(bool))); +} + +void InfoView::showFirstTime() +{ + new InfoView(); +} + +void InfoView::loaded(bool ok) +{ + QSettings* settings = Application::getInstance()->getSettings(); + + QString lastVersion = settings->value(SETTINGS_KEY_VERSION).toString(); + + + QWebFrame* mainFrame = this->page()->mainFrame(); + QWebElement versionTag = mainFrame->findFirstElement("#version"); + QString version = versionTag.attribute("value"); + + if (lastVersion == QString::null || version == QString::null || lastVersion != version) { + if (version != QString::null) { + settings->setValue(SETTINGS_KEY_VERSION, version); + } + + this->setWindowModality(Qt::WindowModal); + this->setFixedSize(VIEW_FIXED_WIDTH, this->height()); + this->setWindowTitle(this->title()); + this->show(); + } +} diff --git a/interface/src/InfoView.h b/interface/src/InfoView.h new file mode 100644 index 0000000000..184793055f --- /dev/null +++ b/interface/src/InfoView.h @@ -0,0 +1,27 @@ +// +// InfoView.h +// hifi +// +// Created by Stojce Slavkovski on 9/7/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#ifndef __hifi__InfoView__ +#define __hifi__InfoView__ + +#include + +class InfoView : public QWebView +{ + Q_OBJECT +public: + static void showFirstTime(); + +private: + InfoView(); + +private slots: + void loaded(bool ok); +}; + +#endif /* defined(__hifi__InfoView__) */ From 8779e000fe1e42c623ab16c0c54b5d8496beb3f1 Mon Sep 17 00:00:00 2001 From: stojce Date: Sun, 8 Sep 2013 21:29:35 +0200 Subject: [PATCH 06/20] #19418 Load a local HTML file in a web view within Interface --- interface/resources/html/interface-welcome-allsvg.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/html/interface-welcome-allsvg.html b/interface/resources/html/interface-welcome-allsvg.html index c61d457bb9..6ee14b7414 100644 --- a/interface/resources/html/interface-welcome-allsvg.html +++ b/interface/resources/html/interface-welcome-allsvg.html @@ -1,5 +1,5 @@ - + Welcome to Interface Created with Sketch (http://www.bohemiancoding.com/sketch) From 3b2b09a67ec75f7e23e7ecdf8b36602e26d30ba2 Mon Sep 17 00:00:00 2001 From: stojce Date: Sun, 8 Sep 2013 21:31:14 +0200 Subject: [PATCH 07/20] removed QDebug --- interface/src/InfoView.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 591149c619..6583c9ee0f 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -11,7 +11,6 @@ #include "Application.h" #include #include -#include #define VIEW_FIXED_WIDTH 808 #define SETTINGS_KEY_VERSION "info-version" From 52f413b59c82a40d2d978949cbfb87427f919591 Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 9 Sep 2013 22:11:44 +0200 Subject: [PATCH 08/20] QtWebKitWidgets reference fix --- interface/src/InfoView.cpp | 2 -- interface/src/InfoView.h | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 6583c9ee0f..b5381a7499 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -9,8 +9,6 @@ #include "InfoView.h" #include #include "Application.h" -#include -#include #define VIEW_FIXED_WIDTH 808 #define SETTINGS_KEY_VERSION "info-version" diff --git a/interface/src/InfoView.h b/interface/src/InfoView.h index 184793055f..6c01fc7b13 100644 --- a/interface/src/InfoView.h +++ b/interface/src/InfoView.h @@ -9,7 +9,7 @@ #ifndef __hifi__InfoView__ #define __hifi__InfoView__ -#include +#include class InfoView : public QWebView { From 29c62d366f87edc6f6dd7376a6bd9305a046d1af Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 9 Sep 2013 22:41:03 +0200 Subject: [PATCH 09/20] QtWebKitWidgets fix #2 --- interface/src/InfoView.cpp | 3 +++ interface/src/InfoView.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index b5381a7499..007ac0aea2 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -10,6 +10,9 @@ #include #include "Application.h" +#include +#include + #define VIEW_FIXED_WIDTH 808 #define SETTINGS_KEY_VERSION "info-version" diff --git a/interface/src/InfoView.h b/interface/src/InfoView.h index 6c01fc7b13..2608d5c9c0 100644 --- a/interface/src/InfoView.h +++ b/interface/src/InfoView.h @@ -9,7 +9,7 @@ #ifndef __hifi__InfoView__ #define __hifi__InfoView__ -#include +#include class InfoView : public QWebView { From a081f081f82418ff67ae51235fb2cda5b288fb42 Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 9 Sep 2013 23:27:03 +0200 Subject: [PATCH 10/20] popup layot - center position - resizable --- .../resources/html/interface-welcome-allsvg.html | 2 ++ interface/src/InfoView.cpp | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/interface/resources/html/interface-welcome-allsvg.html b/interface/resources/html/interface-welcome-allsvg.html index 6ee14b7414..0b45a4d717 100644 --- a/interface/resources/html/interface-welcome-allsvg.html +++ b/interface/resources/html/interface-welcome-allsvg.html @@ -1,4 +1,5 @@ +
Welcome to Interface @@ -135,3 +136,4 @@ +
diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 007ac0aea2..66b1b57482 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -12,6 +12,7 @@ #include #include +#include #define VIEW_FIXED_WIDTH 808 #define SETTINGS_KEY_VERSION "info-version" @@ -52,8 +53,18 @@ void InfoView::loaded(bool ok) settings->setValue(SETTINGS_KEY_VERSION, version); } - this->setWindowModality(Qt::WindowModal); - this->setFixedSize(VIEW_FIXED_WIDTH, this->height()); + QDesktopWidget* desktop = Application::getInstance()->desktop(); + + int h = desktop->height(); + this->resize(VIEW_FIXED_WIDTH, h * 0.8); + + int w = desktop->width(); + int mw = this->size().width(); + int mh = this->size().height(); + int cw = (w/2) - (mw/2); + int ch = (h/2) - (mh/2); + this->move(cw, ch); + this->setWindowTitle(this->title()); this->show(); } From 7c7cf667ae216dbdd0d4084db2e89cb1cf72105c Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 9 Sep 2013 23:38:51 +0200 Subject: [PATCH 11/20] WindowModal --- interface/src/InfoView.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 66b1b57482..2d6f16c494 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -64,7 +64,8 @@ void InfoView::loaded(bool ok) int cw = (w/2) - (mw/2); int ch = (h/2) - (mh/2); this->move(cw, ch); - + + this->setWindowModality(Qt::WindowModal); this->setWindowTitle(this->title()); this->show(); } From 6b8162009853981a19fbaf0a272c3c0321572b70 Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 9 Sep 2013 23:54:25 +0200 Subject: [PATCH 12/20] removed redundant this keyword --- interface/src/InfoView.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 2d6f16c494..628fb177ee 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -19,7 +19,7 @@ InfoView::InfoView() { - this->settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, true); + settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, true); #ifdef Q_OS_MAC QString resourcesPath = QCoreApplication::applicationDirPath() + "/../Resources"; @@ -28,7 +28,7 @@ InfoView::InfoView() #endif QUrl url = QUrl::fromLocalFile(resourcesPath + "/html/interface-welcome-allsvg.html"); - this->load(url); + load(url); connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loaded(bool))); } @@ -44,7 +44,7 @@ void InfoView::loaded(bool ok) QString lastVersion = settings->value(SETTINGS_KEY_VERSION).toString(); - QWebFrame* mainFrame = this->page()->mainFrame(); + QWebFrame* mainFrame = page()->mainFrame(); QWebElement versionTag = mainFrame->findFirstElement("#version"); QString version = versionTag.attribute("value"); @@ -54,19 +54,11 @@ void InfoView::loaded(bool ok) } QDesktopWidget* desktop = Application::getInstance()->desktop(); - int h = desktop->height(); - this->resize(VIEW_FIXED_WIDTH, h * 0.8); - - int w = desktop->width(); - int mw = this->size().width(); - int mh = this->size().height(); - int cw = (w/2) - (mw/2); - int ch = (h/2) - (mh/2); - this->move(cw, ch); - - this->setWindowModality(Qt::WindowModal); - this->setWindowTitle(this->title()); - this->show(); + resize(VIEW_FIXED_WIDTH, h * 0.8); + move(desktop->screen()->rect().center() - rect().center()); + setWindowModality(Qt::WindowModal); + setWindowTitle(title()); + show(); } } From 1a32bf742851a3f911cfbd8cda7f5f7e4d58c2af Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 9 Sep 2013 23:59:44 +0200 Subject: [PATCH 13/20] centering fix --- interface/src/InfoView.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 628fb177ee..938ec281c6 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -57,8 +57,8 @@ void InfoView::loaded(bool ok) int h = desktop->height(); resize(VIEW_FIXED_WIDTH, h * 0.8); move(desktop->screen()->rect().center() - rect().center()); - setWindowModality(Qt::WindowModal); setWindowTitle(title()); show(); + setWindowModality(Qt::WindowModal); } } From 7bd565f1f2c26fb246715498076e11f00097c594 Mon Sep 17 00:00:00 2001 From: stojce Date: Tue, 10 Sep 2013 00:01:09 +0200 Subject: [PATCH 14/20] removed unused variable --- interface/src/InfoView.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 938ec281c6..00aaadea86 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -54,8 +54,7 @@ void InfoView::loaded(bool ok) } QDesktopWidget* desktop = Application::getInstance()->desktop(); - int h = desktop->height(); - resize(VIEW_FIXED_WIDTH, h * 0.8); + resize(VIEW_FIXED_WIDTH, desktop->height() * 0.8); move(desktop->screen()->rect().center() - rect().center()); setWindowTitle(title()); show(); From 19c8084b64c9c2735ed01fdb8fb52a7b29226660 Mon Sep 17 00:00:00 2001 From: stojce Date: Tue, 10 Sep 2013 00:38:43 +0200 Subject: [PATCH 15/20] dynamic height --- .gitignore | 1 + interface/src/InfoView.cpp | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 9dc509bc19..b90059c479 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ CMakeScripts/ cmake_install.cmake build/ Makefile +*.user # Xcode *.xcodeproj diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 00aaadea86..8789bf27c8 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -14,8 +14,7 @@ #include #include -#define VIEW_FIXED_WIDTH 808 -#define SETTINGS_KEY_VERSION "info-version" +#define SETTINGS_VERSION_KEY "info-version" InfoView::InfoView() { @@ -41,7 +40,7 @@ void InfoView::loaded(bool ok) { QSettings* settings = Application::getInstance()->getSettings(); - QString lastVersion = settings->value(SETTINGS_KEY_VERSION).toString(); + QString lastVersion = settings->value(SETTINGS_VERSION_KEY).toString(); QWebFrame* mainFrame = page()->mainFrame(); @@ -50,11 +49,15 @@ void InfoView::loaded(bool ok) if (lastVersion == QString::null || version == QString::null || lastVersion != version) { if (version != QString::null) { - settings->setValue(SETTINGS_KEY_VERSION, version); + settings->setValue(SETTINGS_VERSION_KEY, version); } QDesktopWidget* desktop = Application::getInstance()->desktop(); - resize(VIEW_FIXED_WIDTH, desktop->height() * 0.8); + int height = mainFrame->contentsSize().height() > desktop->height() ? + desktop->height() * 0.9 : + mainFrame->contentsSize().height(); + + resize(mainFrame->contentsSize().width(), height); move(desktop->screen()->rect().center() - rect().center()); setWindowTitle(title()); show(); From 54e7de8e9697e2c50872f5ec92dff88b0c1b57d6 Mon Sep 17 00:00:00 2001 From: stojce Date: Tue, 10 Sep 2013 00:44:16 +0200 Subject: [PATCH 16/20] remove empty line --- interface/src/InfoView.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 8789bf27c8..6be8238cf8 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -42,7 +42,6 @@ void InfoView::loaded(bool ok) QString lastVersion = settings->value(SETTINGS_VERSION_KEY).toString(); - QWebFrame* mainFrame = page()->mainFrame(); QWebElement versionTag = mainFrame->findFirstElement("#version"); QString version = versionTag.attribute("value"); From 330b1cdaf10c6df42b43f314413431b71f2d45ae Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 11 Sep 2013 22:08:07 +0200 Subject: [PATCH 17/20] About menu added About menu - OS X version only --- interface/src/InfoView.cpp | 49 +++++++++++++++++++++++++++----------- interface/src/InfoView.h | 5 +++- interface/src/Menu.cpp | 13 +++++++++- interface/src/Menu.h | 2 ++ 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 6be8238cf8..352effbae2 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -16,8 +16,9 @@ #define SETTINGS_VERSION_KEY "info-version" -InfoView::InfoView() +InfoView::InfoView(bool forced) { + _forced = forced; settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, true); #ifdef Q_OS_MAC @@ -33,11 +34,20 @@ InfoView::InfoView() void InfoView::showFirstTime() { - new InfoView(); + new InfoView(false); } -void InfoView::loaded(bool ok) +void InfoView::forcedShow() { + new InfoView(true); +} + +bool InfoView::shouldShow() +{ + if (_forced) { + return true; + } + QSettings* settings = Application::getInstance()->getSettings(); QString lastVersion = settings->value(SETTINGS_VERSION_KEY).toString(); @@ -50,16 +60,27 @@ void InfoView::loaded(bool ok) if (version != QString::null) { settings->setValue(SETTINGS_VERSION_KEY, version); } - - QDesktopWidget* desktop = Application::getInstance()->desktop(); - int height = mainFrame->contentsSize().height() > desktop->height() ? - desktop->height() * 0.9 : - mainFrame->contentsSize().height(); - - resize(mainFrame->contentsSize().width(), height); - move(desktop->screen()->rect().center() - rect().center()); - setWindowTitle(title()); - show(); - setWindowModality(Qt::WindowModal); + return true; } + + return false; +} + +void InfoView::loaded(bool ok) +{ + if (!shouldShow()) { + return; + } + + QDesktopWidget* desktop = Application::getInstance()->desktop(); + QWebFrame* mainFrame = page()->mainFrame(); + + int height = mainFrame->contentsSize().height() > desktop->height() ? + desktop->height() * 0.9 : + mainFrame->contentsSize().height(); + + resize(mainFrame->contentsSize().width(), height); + move(desktop->screen()->rect().center() - rect().center()); + setWindowTitle(title()); + show(); } diff --git a/interface/src/InfoView.h b/interface/src/InfoView.h index 2608d5c9c0..036dd39bef 100644 --- a/interface/src/InfoView.h +++ b/interface/src/InfoView.h @@ -16,9 +16,12 @@ class InfoView : public QWebView Q_OBJECT public: static void showFirstTime(); + static void forcedShow(); private: - InfoView(); + InfoView(bool forced); + bool _forced; + bool shouldShow(); private slots: void loaded(bool ok); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 1d9e12cc96..f6e4128dbb 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -24,6 +24,7 @@ #include "PairingHandler.h" #include "Menu.h" #include "Util.h" +#include "InfoView.h" Menu* Menu::_instance = NULL; @@ -52,7 +53,13 @@ Menu::Menu() : Application *appInstance = Application::getInstance(); QMenu* fileMenu = addMenu("File"); - + + (addActionToQMenuAndActionHash(fileMenu, + MenuOption::AboutApp, + 0, + this, + SLOT(aboutApp())))->setMenuRole(QAction::AboutRole); + (addActionToQMenuAndActionHash(fileMenu, MenuOption::Preferences, Qt::CTRL | Qt::Key_Comma, @@ -663,6 +670,10 @@ bool Menu::isVoxelModeActionChecked() { return false; } +void Menu::aboutApp() { + InfoView::forcedShow(); +} + void Menu::editPreferences() { Application* applicationInstance = Application::getInstance(); QDialog dialog(applicationInstance->getGLWidget()); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 934cb1b7ae..3d0ce79a36 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -65,6 +65,7 @@ public slots: void checkForUpdates(); private slots: + void aboutApp(); void editPreferences(); void goToDomain(); void goToLocation(); @@ -116,6 +117,7 @@ private: namespace MenuOption { + const QString AboutApp = "About Interface"; const QString AmbientOcclusion = "Ambient Occlusion"; const QString Avatars = "Avatars"; const QString AvatarAsBalls = "Avatar as Balls"; From eefe08e733412abafcc508efc399b36636326751 Mon Sep 17 00:00:00 2001 From: stojce Date: Thu, 12 Sep 2013 19:39:34 +0200 Subject: [PATCH 18/20] non OS X menu added help + about menu for non OS X --- interface/src/Menu.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index f6e4128dbb..744a1bff99 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -54,12 +54,14 @@ Menu::Menu() : QMenu* fileMenu = addMenu("File"); +#ifdef Q_OS_MAC (addActionToQMenuAndActionHash(fileMenu, MenuOption::AboutApp, 0, this, SLOT(aboutApp())))->setMenuRole(QAction::AboutRole); - +#endif + (addActionToQMenuAndActionHash(fileMenu, MenuOption::Preferences, Qt::CTRL | Qt::Key_Comma, @@ -441,6 +443,13 @@ Menu::Menu() : addDisabledActionAndSeparator(developerMenu, "Voxels"); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::DestructiveAddVoxel); + +#ifndef Q_OS_MAC + QMenu* helpMenu = addMenu("Help"); + QAction* helpAction = helpMenu->addAction(MenuOption::AboutApp); + connect(helpAction, SIGNAL(triggered()), this, SLOT(aboutApp())); +#endif + } Menu::~Menu() { From 4b993ec931f25848b895e62caa67e5a4b7af7ab9 Mon Sep 17 00:00:00 2001 From: stojce Date: Fri, 13 Sep 2013 20:10:27 +0200 Subject: [PATCH 19/20] CR fixes --- interface/src/InfoView.cpp | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/interface/src/InfoView.cpp b/interface/src/InfoView.cpp index 352effbae2..d5f9b1d881 100644 --- a/interface/src/InfoView.cpp +++ b/interface/src/InfoView.cpp @@ -15,35 +15,29 @@ #include #define SETTINGS_VERSION_KEY "info-version" +#define MAX_DIALOG_HEIGHT_RATIO 0.9 -InfoView::InfoView(bool forced) -{ +InfoView::InfoView(bool forced) { _forced = forced; settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, true); - -#ifdef Q_OS_MAC - QString resourcesPath = QCoreApplication::applicationDirPath() + "/../Resources"; -#else - QString resourcesPath = QCoreApplication::applicationDirPath() + "/resources"; -#endif - - QUrl url = QUrl::fromLocalFile(resourcesPath + "/html/interface-welcome-allsvg.html"); + + switchToResourcesParentIfRequired(); + QString absPath = QFileInfo("resources/html/interface-welcome-allsvg.html").absoluteFilePath(); + QUrl url = QUrl::fromLocalFile(absPath); + load(url); connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loaded(bool))); } -void InfoView::showFirstTime() -{ +void InfoView::showFirstTime() { new InfoView(false); } -void InfoView::forcedShow() -{ +void InfoView::forcedShow() { new InfoView(true); } -bool InfoView::shouldShow() -{ +bool InfoView::shouldShow() { if (_forced) { return true; } @@ -66,9 +60,8 @@ bool InfoView::shouldShow() return false; } -void InfoView::loaded(bool ok) -{ - if (!shouldShow()) { +void InfoView::loaded(bool ok) { + if (!ok || !shouldShow()) { return; } @@ -76,8 +69,8 @@ void InfoView::loaded(bool ok) QWebFrame* mainFrame = page()->mainFrame(); int height = mainFrame->contentsSize().height() > desktop->height() ? - desktop->height() * 0.9 : - mainFrame->contentsSize().height(); + desktop->height() * MAX_DIALOG_HEIGHT_RATIO : + mainFrame->contentsSize().height(); resize(mainFrame->contentsSize().width(), height); move(desktop->screen()->rect().center() - rect().center()); From 316f8a0345e37c53b9411973403b6a949e0c756d Mon Sep 17 00:00:00 2001 From: stojce Date: Sat, 14 Sep 2013 08:39:21 +0200 Subject: [PATCH 20/20] Brace placement fix --- interface/src/InfoView.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/InfoView.h b/interface/src/InfoView.h index 036dd39bef..009587c1d5 100644 --- a/interface/src/InfoView.h +++ b/interface/src/InfoView.h @@ -11,8 +11,7 @@ #include -class InfoView : public QWebView -{ +class InfoView : public QWebView { Q_OBJECT public: static void showFirstTime();