From 45b5f54bc5c0960b5f748ac83c5608f81ca3f11b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Feb 2014 00:06:37 -0800 Subject: [PATCH 1/3] adding Matt's SvoViewer --- CMakeLists.txt | 1 + SvoViewer/CMakeLists.txt | 250 +++++++++++ SvoViewer/SvoViewer.icns | Bin 0 -> 313931 bytes SvoViewer/SvoViewerConfig.h.in | 14 + SvoViewer/SvoViewerVersion.h.in | 8 + SvoViewer/src/AABoundingVolume.h | 187 ++++++++ SvoViewer/src/Camera.cpp | 251 +++++++++++ SvoViewer/src/Camera.h | 119 +++++ SvoViewer/src/GLCanvas.cpp | 87 ++++ SvoViewer/src/GLCanvas.h | 39 ++ SvoViewer/src/ProgramObject.cpp | 20 + SvoViewer/src/ProgramObject.h | 25 ++ SvoViewer/src/Render.cpp | 744 +++++++++++++++++++++++++++++++ SvoViewer/src/Render.h | 0 SvoViewer/src/Render2.cpp | 375 ++++++++++++++++ SvoViewer/src/SvoViewer.ico | Bin 0 -> 2734 bytes SvoViewer/src/SvoViewer.rc | 2 + SvoViewer/src/globals.cpp | 67 +++ SvoViewer/src/globals.h | 33 ++ SvoViewer/src/main.cpp | 8 + SvoViewer/src/svoviewer.cpp | 644 ++++++++++++++++++++++++++ SvoViewer/src/svoviewer.h | 317 +++++++++++++ SvoViewer/src/svoviewer.qrc | 4 + SvoViewer/src/svoviewer.ui | 29 ++ 24 files changed, 3224 insertions(+) create mode 100644 SvoViewer/CMakeLists.txt create mode 100644 SvoViewer/SvoViewer.icns create mode 100644 SvoViewer/SvoViewerConfig.h.in create mode 100644 SvoViewer/SvoViewerVersion.h.in create mode 100644 SvoViewer/src/AABoundingVolume.h create mode 100755 SvoViewer/src/Camera.cpp create mode 100755 SvoViewer/src/Camera.h create mode 100755 SvoViewer/src/GLCanvas.cpp create mode 100644 SvoViewer/src/GLCanvas.h create mode 100755 SvoViewer/src/ProgramObject.cpp create mode 100755 SvoViewer/src/ProgramObject.h create mode 100755 SvoViewer/src/Render.cpp create mode 100755 SvoViewer/src/Render.h create mode 100755 SvoViewer/src/Render2.cpp create mode 100755 SvoViewer/src/SvoViewer.ico create mode 100755 SvoViewer/src/SvoViewer.rc create mode 100755 SvoViewer/src/globals.cpp create mode 100755 SvoViewer/src/globals.h create mode 100755 SvoViewer/src/main.cpp create mode 100755 SvoViewer/src/svoviewer.cpp create mode 100755 SvoViewer/src/svoviewer.h create mode 100755 SvoViewer/src/svoviewer.qrc create mode 100755 SvoViewer/src/svoviewer.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e796e3ca2..d12cf1e45d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,3 +39,4 @@ add_subdirectory(domain-server) add_subdirectory(interface) add_subdirectory(tests) add_subdirectory(voxel-edit) +add_subdirectory(SvoViewer) diff --git a/SvoViewer/CMakeLists.txt b/SvoViewer/CMakeLists.txt new file mode 100644 index 0000000000..4114b2a5bc --- /dev/null +++ b/SvoViewer/CMakeLists.txt @@ -0,0 +1,250 @@ +cmake_minimum_required(VERSION 2.8) + +set(ROOT_DIR ..) +set(MACRO_DIR ${ROOT_DIR}/cmake/macros) + +set(TARGET_NAME SvoViewer) +project(${TARGET_NAME}) + +# setup for find modules +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") + +if (APPLE) + set(GL_HEADERS "#include \n#include ") +endif (APPLE) + +if (UNIX AND NOT APPLE) + # include the right GL headers for UNIX + set(GL_HEADERS "#include \n#include \n#include ") +endif (UNIX AND NOT APPLE) + +if (WIN32) + + add_definitions( -D_USE_MATH_DEFINES ) # apparently needed to get M_PI and other defines from cmath/math.h + add_definitions( -DWINDOWS_LEAN_AND_MEAN ) # needed to make sure windows doesn't go to crazy with its defines + + # windows build needs an external glut, we're using freeglut + set(GLUT_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/freeglut) + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${GLUT_ROOT_PATH}) + + # windows build needs glew (opengl extention wrangler) this will handle providing access to OpenGL methods after 1.1 + # which are not accessible on windows without glew or some other dynamic linking mechanism + set(GLEW_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/glew) + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${GLEW_ROOT_PATH}) + include_directories(SYSTEM ${GLEW_ROOT_PATH}/include ${GLUT_ROOT_PATH}/include) + + #set(GL_HEADERS "#define GLEW_STATIC\n#define FREEGLUT_STATIC\n#define FREEGLUT_LIB_PRAGMAS 0\n#include \n#include \n#include \n#include ") + set(GL_HEADERS "#define GLEW_STATIC\n#include \n#include \n#include ") + +endif (WIN32) + +# set up the external glm library +include(${MACRO_DIR}/IncludeGLM.cmake) +include_glm(${TARGET_NAME} ${ROOT_DIR}) + +# create the ${TARGET_NAME}Config.h file based on GL_HEADERS above +configure_file(${TARGET_NAME}Config.h.in ${PROJECT_BINARY_DIR}/includes/${TARGET_NAME}Config.h) +configure_file(${TARGET_NAME}Version.h.in ${PROJECT_BINARY_DIR}/includes/${TARGET_NAME}Version.h) + +# grab the implementation and header files from src dirs +file(GLOB APPLICATION_SRCS src/*.c src/*.cpp src/*.h) +foreach(SUBDIR avatar devices renderer ui starfield) + file(GLOB_RECURSE SUBDIR_SRCS src/${SUBDIR}/*.cpp src/${SUBDIR}/*.c src/${SUBDIR}/*.h) + set(APPLICATION_SRCS ${APPLICATION_SRCS} ${SUBDIR_SRCS}) +endforeach(SUBDIR) + +foreach(EXTERNAL_SOURCE_SUBDIR ${EXTERNAL_SOURCE_SUBDIRS}) + file(GLOB_RECURSE SUBDIR_SRCS external/${EXTERNAL_SOURCE_SUBDIR}/src/*.cpp external/${EXTERNAL_SOURCE_SUBDIR}/src/*.c external/${EXTERNAL_SOURCE_SUBDIR}/src/*.h) + set(APPLICATION_SRCS ${APPLICATION_SRCS} ${SUBDIR_SRCS}) +endforeach(EXTERNAL_SOURCE_SUBDIR) + +find_package(Qt5Core REQUIRED) +find_package(Qt5Gui REQUIRED) +find_package(Qt5Multimedia REQUIRED) +find_package(Qt5Network REQUIRED) +find_package(Qt5OpenGL REQUIRED) +find_package(Qt5Svg REQUIRED) +find_package(Qt5WebKit REQUIRED) +find_package(Qt5WebKitWidgets REQUIRED) +find_package(Qt5Xml REQUIRED) + +# grab the ui files in resources/ui +file (GLOB_RECURSE QT_UI_FILES ui/*.ui) +# have qt5 wrap them and generate the appropriate header files +qt5_wrap_ui(QT_UI_HEADERS ${QT_UI_FILES}) + +# add them to the application source files +set(APPLICATION_SRCS ${APPLICATION_SRCS} ${QT_UI_HEADERS}) + +if (APPLE) + + # configure CMake to use a custom Info.plist + SET_TARGET_PROPERTIES( ${this_target} PROPERTIES MACOSX_BUNDLE_INFO_PLIST MacOSXBundleInfo.plist.in ) + + set(MACOSX_BUNDLE_BUNDLE_NAME SvoViewer) + set(MACOSX_BUNDLE_GUI_IDENTIFIER io.highfidelity.${TARGET_NAME}) + + # set how the icon shows up in the Info.plist file + SET(MACOSX_BUNDLE_ICON_FILE ${TARGET_NAME}.icns) + + # set where in the bundle to put the resources file + SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_NAME}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + + SET(APPLICATION_SRCS ${APPLICATION_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_NAME}.icns) + + # grab the directories in resources and put them in the right spot in Resources + file(GLOB RESOURCE_SUBDIRS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/resources ${CMAKE_CURRENT_SOURCE_DIR}/resources/*) + foreach(DIR ${RESOURCE_SUBDIRS}) + if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/resources/${DIR}) + FILE(GLOB DIR_CONTENTS resources/${DIR}/*) + SET_SOURCE_FILES_PROPERTIES(${DIR_CONTENTS} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/${DIR}) + + SET(APPLICATION_SRCS ${APPLICATION_SRCS} ${DIR_CONTENTS}) + endif() + endforeach() +endif (APPLE) + +# create the executable, make it a bundle on OS X +add_executable(${TARGET_NAME} MACOSX_BUNDLE ${APPLICATION_SRCS}) + +# link in the hifi shared library +include(${MACRO_DIR}/LinkHifiLibrary.cmake) + +# link required hifi libraries +link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(octree ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(metavoxels ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(particles ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(avatars ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(audio ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(script-engine ${TARGET_NAME} ${ROOT_DIR}) + +# find required libraries +find_package(Faceshift) +find_package(GLM REQUIRED) +find_package(LibOVR) +find_package(Sixense) +find_package(Visage) +find_package(ZLIB) + +# include the Sixense library for Razer Hydra if available +if (SIXENSE_FOUND AND NOT DISABLE_SIXENSE) + add_definitions(-DHAVE_SIXENSE) + include_directories(SYSTEM ${SIXENSE_INCLUDE_DIRS}) + if (APPLE OR UNIX) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${SIXENSE_INCLUDE_DIRS}") + endif (APPLE OR UNIX) + target_link_libraries(${TARGET_NAME} ${SIXENSE_LIBRARIES}) +endif (SIXENSE_FOUND AND NOT DISABLE_SIXENSE) + +# likewise with Visage library for webcam feature tracking +if (VISAGE_FOUND AND NOT DISABLE_VISAGE) + add_definitions(-DHAVE_VISAGE -DVISAGE_STATIC) + include_directories(SYSTEM ${VISAGE_INCLUDE_DIRS}) + if (APPLE) + add_definitions(-DMAC_OS_X) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment -isystem ${VISAGE_INCLUDE_DIRS}") + find_library(AVFoundation AVFoundation) + find_library(CoreMedia CoreMedia) + find_library(NEW_STD_LIBRARY libc++.dylib /usr/lib/) + target_link_libraries(${TARGET_NAME} ${AVFoundation} ${CoreMedia} ${NEW_STD_LIBRARY}) + endif (APPLE) + target_link_libraries(${TARGET_NAME} ${VISAGE_LIBRARIES}) +endif (VISAGE_FOUND AND NOT DISABLE_VISAGE) + +# and with LibOVR for Oculus Rift +if (LIBOVR_FOUND AND NOT DISABLE_LIBOVR) + add_definitions(-DHAVE_LIBOVR) + include_directories(SYSTEM ${LIBOVR_INCLUDE_DIRS}) + if (APPLE OR UNIX) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${LIBOVR_INCLUDE_DIRS}") + endif (APPLE OR UNIX) + target_link_libraries(${TARGET_NAME} ${LIBOVR_LIBRARIES}) +endif (LIBOVR_FOUND AND NOT DISABLE_LIBOVR) + +qt5_use_modules(${TARGET_NAME} Core Gui Multimedia Network OpenGL Script Svg WebKit WebKitWidgets Xml UiTools) + +# include headers for interface +include_directories( + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_BINARY_DIR}/includes +) + +# include external library headers +# use system flag so warnings are supressed +include_directories( + SYSTEM + ${FACESHIFT_INCLUDE_DIRS} + ${GLM_INCLUDE_DIRS} +) + +target_link_libraries( + ${TARGET_NAME} + ${FACESHIFT_LIBRARIES} + ${ZLIB_LIBRARIES} +) + +if (APPLE) + # link in required OS X frameworks and include the right GL headers + find_library(AppKit AppKit) + find_library(CoreAudio CoreAudio) + find_library(CoreServices CoreServices) + find_library(Carbon Carbon) + find_library(Foundation Foundation) + find_library(GLUT GLUT) + find_library(OpenGL OpenGL) + find_library(IOKit IOKit) + find_library(QTKit QTKit) + find_library(QuartzCore QuartzCore) + + target_link_libraries( + ${TARGET_NAME} + ${AppKit} + ${CoreAudio} + ${CoreServices} + ${Carbon} + ${Foundation} + ${GLUT} + ${OpenGL} + ${IOKit} + ${QTKit} + ${QuartzCore} + ) +else (APPLE) + find_package(OpenGL REQUIRED) + find_package(GLUT REQUIRED) + include_directories(${GLUT_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) + target_link_libraries(${TARGET_NAME} ${OPENGL_LIBRARY}) +endif (APPLE) + +# link target to external libraries +if (WIN32) + target_link_libraries( + ${TARGET_NAME} + + ${CMAKE_CURRENT_SOURCE_DIR}/external/glew/lib/Release/Win32/glew32s.lib + ${GLUT_ROOT_PATH}/lib/freeglut.lib + + wsock32.lib + opengl32.lib + ) +else (WIN32) + # link required libraries on UNIX + if (UNIX AND NOT APPLE) + find_package(Threads REQUIRED) + + target_link_libraries( + ${TARGET_NAME} + ${CMAKE_THREAD_LIBS_INIT} + ${GLUT_LIBRARY} + ) + endif (UNIX AND NOT APPLE) +endif (WIN32) + +# install command for OS X bundle +INSTALL(TARGETS ${TARGET_NAME} + BUNDLE DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/install COMPONENT Runtime + RUNTIME DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/install COMPONENT Runtime +) + diff --git a/SvoViewer/SvoViewer.icns b/SvoViewer/SvoViewer.icns new file mode 100644 index 0000000000000000000000000000000000000000..f32590eb21addbbb314d06ce15e0d9e6d4eb82c5 GIT binary patch literal 313931 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

$OT?oA{{-8y*AYx8A;qx&7CnL0bo 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%0AI-wTD5ER{jNcq*@~E0{Q!N4iO6N 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

YYefceMvyrPpkKd{Iu0j-4WUhsU+))T8wGmh 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 ZWZdPM3cr_$jDwMpD3x{}I627DKU( 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

u|4{D&x0ZmoJ$Sma}g3amPn5> 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 literal 0 HcmV?d00001 diff --git a/SvoViewer/SvoViewerConfig.h.in b/SvoViewer/SvoViewerConfig.h.in new file mode 100644 index 0000000000..377f14c984 --- /dev/null +++ b/SvoViewer/SvoViewerConfig.h.in @@ -0,0 +1,14 @@ +// +// SvoViewerConfig.h +// SvoViewer +// +// Copyright (c) 2014 High Fidelity, Inc.. All rights reserved. +// + +#ifndef __SvoViewerConfig__ +#define __SvoViewerConfig__ + +#define GL_GLEXT_PROTOTYPES 1 +@GL_HEADERS@ + +#endif diff --git a/SvoViewer/SvoViewerVersion.h.in b/SvoViewer/SvoViewerVersion.h.in new file mode 100644 index 0000000000..81793a0537 --- /dev/null +++ b/SvoViewer/SvoViewerVersion.h.in @@ -0,0 +1,8 @@ +// +// SvoViewerVersion.h +// Declaration of version and build data +// +// Copyright (c) 2014 High Fidelity, Inc.. All rights reserved. +// + +const QString BUILD_VERSION = "@BUILD_SEQ@"; diff --git a/SvoViewer/src/AABoundingVolume.h b/SvoViewer/src/AABoundingVolume.h new file mode 100644 index 0000000000..0fa98a9034 --- /dev/null +++ b/SvoViewer/src/AABoundingVolume.h @@ -0,0 +1,187 @@ +// +// AABoundingVolume.h - Axis Aligned Bounding Volumes +// hifi +// + +#ifndef _AABOUNDING_VOLUME_ +#define _AABOUNDING_VOLUME_ + +#include + + + +// A simple axis aligned bounding volume. +#define AABF_NUM_DIMS 3 +#define AABF_LOW 0 +#define AABF_HIGH 1 +//Todo:: make this a template. +class AABoundingVolume +{ +public: + AABoundingVolume() : _isSingleDirectionSet(false), _numPointsInSet(0) { memset(_bounds,0,sizeof(_bounds)); } + ~AABoundingVolume(){} + + void AddToSet(const glm::vec3 newPt) + { + if (_numPointsInSet == 0) + { + for (int i = 0; i < AABF_NUM_DIMS; i++) + { + _bounds[i][AABF_LOW] = _bounds[i][AABF_HIGH] = newPt[i]; + } + } + else + { + for (int i = 0; i < AABF_NUM_DIMS; i++) + { + if (newPt[i] < _bounds[i][AABF_LOW]) _bounds[i][AABF_LOW] = newPt[i]; + if (newPt[i] > _bounds[i][AABF_HIGH]) _bounds[i][AABF_HIGH] = newPt[i]; + } + } + _numPointsInSet++; + } + + float getBound(const int dim, const int lohi) { return _bounds[dim][lohi]; } + glm::vec3 getCorner(const BoxVertex i) + { + switch (i) + { + case BOTTOM_LEFT_NEAR: + return glm::vec3(_bounds[0][AABF_LOW], _bounds[1][AABF_LOW], _bounds[2][AABF_HIGH]); + break; + case BOTTOM_RIGHT_NEAR: + return glm::vec3(_bounds[0][AABF_HIGH], _bounds[1][AABF_LOW], _bounds[2][AABF_HIGH]); + break; + case TOP_RIGHT_NEAR: + return glm::vec3(_bounds[0][AABF_HIGH], _bounds[1][AABF_HIGH], _bounds[2][AABF_HIGH]); + break; + case TOP_LEFT_NEAR: + return glm::vec3(_bounds[0][AABF_LOW], _bounds[1][AABF_HIGH], _bounds[2][AABF_HIGH]); + break; + case BOTTOM_LEFT_FAR: + return glm::vec3(_bounds[0][AABF_LOW], _bounds[1][AABF_LOW], _bounds[2][AABF_LOW]); + break; + case BOTTOM_RIGHT_FAR: + return glm::vec3(_bounds[0][AABF_HIGH], _bounds[1][AABF_LOW], _bounds[2][AABF_LOW]); + break; + case TOP_RIGHT_FAR: + return glm::vec3(_bounds[0][AABF_HIGH], _bounds[1][AABF_HIGH], _bounds[2][AABF_LOW]); + break; + case TOP_LEFT_FAR: + return glm::vec3(_bounds[0][AABF_LOW], _bounds[1][AABF_HIGH], _bounds[2][AABF_LOW]); + break; + default : + assert(0 && "Requested invalid bounding volume vertex!"); + } + return glm::vec3(-1.0, -1.0, -1.0); + } + + void setIsSingleDirection(const bool enable, const glm::vec3 normal) + { + if (enable) _singleDirectionNormal = normal; + _isSingleDirectionSet = true; + } + + int within(const float loc, int dim) + { + if (loc < _bounds[dim][AABF_LOW]) return -1; + if (loc > _bounds[dim][AABF_HIGH]) return 1; + return 0; + } + + bool isSingleDirectionSet(){ return _isSingleDirectionSet; } + glm::vec3 getSingleDirectionNormal(){ return _singleDirectionNormal; } + + AABoundingVolume& operator= (const AABoundingVolume& val) { + + if (this !=&val) + + { + + memcpy(_bounds, &val._bounds, sizeof(AABoundingVolume)); + + } + + return *this; + } + +protected: + float _bounds[AABF_NUM_DIMS][2]; // Bounds for each dimension. NOTE:: Not a vector so don't store it that way! + int _numPointsInSet; + bool _isSingleDirectionSet; + glm::vec3 _singleDirectionNormal; +}; + +#define AABF2D_NUM_DIMS 2 +#define UNDEFINED_RANGE_VAL 99999.0 +class AA2DBoundingVolume +{ +public: + AA2DBoundingVolume() : _numPointsInSet(0) {} + ~AA2DBoundingVolume(){} + + void AddToSet(const float newPt[2]) + { + if (_numPointsInSet == 0) + { + for (int i = 0; i < AABF2D_NUM_DIMS; i++) + { + _bounds[i][AABF_LOW] = _bounds[i][AABF_HIGH] = newPt[i]; + } + } + else + { + for (int i = 0; i < AABF2D_NUM_DIMS; i++) + { + if (newPt[i] < _bounds[i][AABF_LOW]) _bounds[i][AABF_LOW] = newPt[i]; + if (newPt[i] > _bounds[i][AABF_HIGH]) _bounds[i][AABF_HIGH] = newPt[i]; + } + } + _numPointsInSet++; + } + + // return true if its in range. + bool clipToRegion(const float lowx, const float lowy, const float highx, const float highy) + { + assert(highx > lowx && highy > lowy); + bool inRange = true; + if (_bounds[0][AABF_LOW] > highx || _bounds[0][AABF_HIGH] < lowx) + { + _bounds[0][AABF_LOW] = _bounds[0][AABF_HIGH] = UNDEFINED_RANGE_VAL; + inRange=false; + } + else + { + if (_bounds[0][AABF_LOW] < lowx) _bounds[0][AABF_LOW] = lowx; + if (_bounds[0][AABF_HIGH] > highx) _bounds[0][AABF_HIGH] = highx; + } + if (_bounds[1][AABF_LOW] > highy || _bounds[1][AABF_HIGH] < lowy) + { + _bounds[1][AABF_LOW] = _bounds[1][AABF_HIGH] = UNDEFINED_RANGE_VAL; + inRange=false; + } + else + { + if (_bounds[1][AABF_LOW] < lowy) _bounds[1][AABF_LOW] = lowy; + if (_bounds[1][AABF_HIGH] > highy) _bounds[1][AABF_HIGH] = highy; + } + return inRange; + } + + float getHeight() + { + if (_bounds[1][AABF_HIGH] == UNDEFINED_RANGE_VAL || _bounds[1][AABF_LOW] == UNDEFINED_RANGE_VAL) return 0; + return _bounds[1][AABF_HIGH] - _bounds[1][AABF_LOW]; + } + float getWidth() + { + if (_bounds[0][AABF_HIGH] == UNDEFINED_RANGE_VAL || _bounds[0][AABF_LOW] == UNDEFINED_RANGE_VAL) return 0; + return _bounds[0][AABF_HIGH] - _bounds[0][AABF_LOW]; + } + +protected: + float _bounds[AABF2D_NUM_DIMS][2]; + int _numPointsInSet; +}; + +#endif diff --git a/SvoViewer/src/Camera.cpp b/SvoViewer/src/Camera.cpp new file mode 100755 index 0000000000..a842d2ce18 --- /dev/null +++ b/SvoViewer/src/Camera.cpp @@ -0,0 +1,251 @@ +// +// Camera.cpp +// interface +// +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. + +#include +#include + +#include +#include +#include + +#include "Camera.h" +#include "Menu.h" +#include "Util.h" + +const float CAMERA_FIRST_PERSON_MODE_UP_SHIFT = 0.0f; +const float CAMERA_FIRST_PERSON_MODE_DISTANCE = 0.0f; +const float CAMERA_FIRST_PERSON_MODE_TIGHTNESS = 100.0f; + +const float CAMERA_INDEPENDENT_MODE_UP_SHIFT = 0.0f; +const float CAMERA_INDEPENDENT_MODE_DISTANCE = 0.0f; +const float CAMERA_INDEPENDENT_MODE_TIGHTNESS = 100.0f; + +const float CAMERA_THIRD_PERSON_MODE_UP_SHIFT = -0.2f; +const float CAMERA_THIRD_PERSON_MODE_DISTANCE = 1.5f; +const float CAMERA_THIRD_PERSON_MODE_TIGHTNESS = 8.0f; + +const float CAMERA_MIRROR_MODE_UP_SHIFT = 0.0f; +const float CAMERA_MIRROR_MODE_DISTANCE = 0.17f; +const float CAMERA_MIRROR_MODE_TIGHTNESS = 100.0f; + + +Camera::Camera() : + _needsToInitialize(true), + _mode(CAMERA_MODE_THIRD_PERSON), + _prevMode(CAMERA_MODE_THIRD_PERSON), + _frustumNeedsReshape(true), + _position(0.0f, 0.0f, 0.0f), + _idealPosition(0.0f, 0.0f, 0.0f), + _targetPosition(0.0f, 0.0f, 0.0f), + _fieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES), + _aspectRatio(16.f/9.f), + _nearClip(0.08f), // default + _farClip(50.0f * TREE_SCALE), // default + _upShift(0.0f), + _distance(0.0f), + _tightness(10.0f), // default + _previousUpShift(0.0f), + _previousDistance(0.0f), + _previousTightness(0.0f), + _newUpShift(0.0f), + _newDistance(0.0f), + _newTightness(0.0f), + _modeShift(1.0f), + _linearModeShift(0.0f), + _modeShiftPeriod(1.0f), + _scale(1.0f), + _lookingAt(0.0f, 0.0f, 0.0f), + _isKeepLookingAt(false) +{ +} + +void Camera::update(float deltaTime) { + + if (_mode != CAMERA_MODE_NULL) { + // use iterative forces to push the camera towards the target position and angle + updateFollowMode(deltaTime); + } +} + +// use iterative forces to keep the camera at the desired position and angle +void Camera::updateFollowMode(float deltaTime) { + if (_linearModeShift < 1.0f) { + _linearModeShift += deltaTime / _modeShiftPeriod; + if (_needsToInitialize || _linearModeShift > 1.0f) { + _linearModeShift = 1.0f; + _modeShift = 1.0f; + _upShift = _newUpShift; + _distance = _newDistance; + _tightness = _newTightness; + } else { + _modeShift = ONE_HALF - ONE_HALF * cosf(_linearModeShift * PIE ); + _upShift = _previousUpShift * (1.0f - _modeShift) + _newUpShift * _modeShift; + _distance = _previousDistance * (1.0f - _modeShift) + _newDistance * _modeShift; + _tightness = _previousTightness * (1.0f - _modeShift) + _newTightness * _modeShift; + } + } + + // derive t from tightness + float t = _tightness * _modeShift * deltaTime; + if (t > 1.0) { + t = 1.0; + } + + // handle keepLookingAt + if (_isKeepLookingAt) { + lookAt(_lookingAt); + } + + // Update position and rotation, setting directly if tightness is 0.0 + if (_needsToInitialize || (_tightness == 0.0f)) { + _rotation = _targetRotation; + _idealPosition = _targetPosition + _scale * (_rotation * glm::vec3(0.0f, _upShift, _distance)); + _position = _idealPosition; + _needsToInitialize = false; + } else { + // pull rotation towards ideal + _rotation = safeMix(_rotation, _targetRotation, t); + _idealPosition = _targetPosition + _scale * (_rotation * glm::vec3(0.0f, _upShift, _distance)); + _position += (_idealPosition - _position) * t; + } +} + +float Camera::getFarClip() const { + return (_scale * _farClip < std::numeric_limits::max()) + ? _scale * _farClip + : std::numeric_limits::max() - 1; +} + +void Camera::setModeShiftPeriod (float period) { + const float MIN_PERIOD = 0.001f; + const float MAX_PERIOD = 3.0f; + _modeShiftPeriod = glm::clamp(period, MIN_PERIOD, MAX_PERIOD); +} + +void Camera::setMode(CameraMode m) { + + _prevMode = _mode; + _mode = m; + _modeShift = 0.0; + _linearModeShift = 0.0; + + _previousUpShift = _upShift; + _previousDistance = _distance; + _previousTightness = _tightness; + + if (_mode == CAMERA_MODE_THIRD_PERSON) { + _newUpShift = CAMERA_THIRD_PERSON_MODE_UP_SHIFT; + _newDistance = CAMERA_THIRD_PERSON_MODE_DISTANCE; + _newTightness = CAMERA_THIRD_PERSON_MODE_TIGHTNESS; + } else if (_mode == CAMERA_MODE_FIRST_PERSON) { + _newUpShift = CAMERA_FIRST_PERSON_MODE_UP_SHIFT; + _newDistance = CAMERA_FIRST_PERSON_MODE_DISTANCE; + _newTightness = CAMERA_FIRST_PERSON_MODE_TIGHTNESS; + } else if (_mode == CAMERA_MODE_MIRROR) { + _newUpShift = CAMERA_MIRROR_MODE_UP_SHIFT; + _newDistance = CAMERA_MIRROR_MODE_DISTANCE; + _newTightness = CAMERA_MIRROR_MODE_TIGHTNESS; + } else if (_mode == CAMERA_MODE_INDEPENDENT) { + _newUpShift = CAMERA_INDEPENDENT_MODE_UP_SHIFT; + _newDistance = CAMERA_INDEPENDENT_MODE_DISTANCE; + _newTightness = CAMERA_INDEPENDENT_MODE_TIGHTNESS; + + } +} + +void Camera::setTargetPosition(const glm::vec3& t) { + _targetPosition = t; + + // handle keepLookingAt + if (_isKeepLookingAt) { + lookAt(_lookingAt); + } + +} + +void Camera::setTargetRotation( const glm::quat& targetRotation ) { + _targetRotation = targetRotation; +} + +void Camera::setFieldOfView(float f) { + _fieldOfView = f; + _frustumNeedsReshape = true; +} + +void Camera::setAspectRatio(float a) { + _aspectRatio = a; + _frustumNeedsReshape = true; +} + +void Camera::setNearClip(float n) { + _nearClip = n; + _frustumNeedsReshape = true; +} + +void Camera::setFarClip(float f) { + _farClip = f; + _frustumNeedsReshape = true; +} + +void Camera::setEyeOffsetPosition(const glm::vec3& p) { + _eyeOffsetPosition = p; + _frustumNeedsReshape = true; +} + +void Camera::setEyeOffsetOrientation(const glm::quat& o) { + _eyeOffsetOrientation = o; + _frustumNeedsReshape = true; +} + +void Camera::setScale(float s) { + _scale = s; + _needsToInitialize = true; + _frustumNeedsReshape = true; +} + +void Camera::initialize() { + _needsToInitialize = true; + _modeShift = 0.0; +} + +// call to find out if the view frustum needs to be reshaped +bool Camera::getFrustumNeedsReshape() const { + return _frustumNeedsReshape; +} + +// call this when deciding whether to render the head or not +CameraMode Camera::getInterpolatedMode() const { + const float SHIFT_THRESHOLD_INTO_FIRST_PERSON = 0.7f; + const float SHIFT_THRESHOLD_OUT_OF_FIRST_PERSON = 0.6f; + if ((_mode == CAMERA_MODE_FIRST_PERSON && _linearModeShift < SHIFT_THRESHOLD_INTO_FIRST_PERSON) || + (_prevMode == CAMERA_MODE_FIRST_PERSON && _linearModeShift < SHIFT_THRESHOLD_OUT_OF_FIRST_PERSON)) { + return _prevMode; + } + return _mode; +} + +// call this after reshaping the view frustum +void Camera::setFrustumWasReshaped() { + _frustumNeedsReshape = false; +} + +void Camera::lookAt(const glm::vec3& lookAt) { + glm::vec3 up = IDENTITY_UP; + glm::mat4 lookAtMatrix = glm::lookAt(_targetPosition, lookAt, up); + glm::quat rotation = glm::quat_cast(lookAtMatrix); + rotation.w = -rotation.w; // Rosedale approved + setTargetRotation(rotation); +} + +void Camera::keepLookingAt(const glm::vec3& point) { + lookAt(point); + _isKeepLookingAt = true; + _lookingAt = point; +} + + + + diff --git a/SvoViewer/src/Camera.h b/SvoViewer/src/Camera.h new file mode 100755 index 0000000000..a688a9e3f4 --- /dev/null +++ b/SvoViewer/src/Camera.h @@ -0,0 +1,119 @@ +// +// Camera.h +// interface +// +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#ifndef __interface__camera__ +#define __interface__camera__ + +#include +#include + +//const float DEFAULT_FIELD_OF_VIEW_DEGREES = 90.0f; + +enum CameraMode +{ + CAMERA_MODE_NULL = -1, + CAMERA_MODE_THIRD_PERSON, + CAMERA_MODE_FIRST_PERSON, + CAMERA_MODE_MIRROR, + CAMERA_MODE_INDEPENDENT, + NUM_CAMERA_MODES +}; + +class Camera { + +public: + Camera(); + + void initialize(); // instantly put the camera at the ideal position and rotation. + + void update( float deltaTime ); + + void setUpShift(float u) { _upShift = u; } + void setDistance(float d) { _distance = d; } + void setPosition(const glm::vec3& p) { _position = p; } + void setTargetPosition(const glm::vec3& t); + void setTightness(float t) { _tightness = t; } + void setTargetRotation(const glm::quat& rotation); + + void setMode(CameraMode m); + void setModeShiftPeriod(float r); + void setFieldOfView(float f); + void setAspectRatio(float a); + void setNearClip(float n); + void setFarClip(float f); + void setEyeOffsetPosition(const glm::vec3& p); + void setEyeOffsetOrientation(const glm::quat& o); + void setScale(const float s); + + const glm::vec3& getPosition() const { return _position; } + const glm::quat& getRotation() const { return _rotation; } + CameraMode getMode() const { return _mode; } + const glm::vec3& getTargetPosition() const { return _targetPosition; } + const glm::quat& getTargetRotation() const { return _targetRotation; } + float getFieldOfView() const { return _fieldOfView; } + float getAspectRatio() const { return _aspectRatio; } + float getNearClip() const { return _scale * _nearClip; } + float getFarClip() const; + const glm::vec3& getEyeOffsetPosition() const { return _eyeOffsetPosition; } + const glm::quat& getEyeOffsetOrientation() const { return _eyeOffsetOrientation; } + float getScale() const { return _scale; } + + CameraMode getInterpolatedMode() const; + + bool getFrustumNeedsReshape() const; // call to find out if the view frustum needs to be reshaped + void setFrustumWasReshaped(); // call this after reshaping the view frustum. + + // These only work on independent cameras + /// one time change to what the camera is looking at + void lookAt(const glm::vec3& value); + + /// fix what the camera is looking at, and keep the camera looking at this even if position changes + void keepLookingAt(const glm::vec3& value); + + /// stops the keep looking at feature, doesn't change what's being looked at, but will stop camera from + /// continuing to update it's orientation to keep looking at the item + void stopLooking() { _isKeepLookingAt = false; } + +private: + + bool _needsToInitialize; + CameraMode _mode; + CameraMode _prevMode; + bool _frustumNeedsReshape; + glm::vec3 _position; + glm::vec3 _idealPosition; + glm::vec3 _targetPosition; + float _fieldOfView; + float _aspectRatio; + float _nearClip; + float _farClip; + glm::vec3 _eyeOffsetPosition; + glm::quat _eyeOffsetOrientation; + glm::quat _rotation; + glm::quat _targetRotation; + float _upShift; + float _distance; + float _tightness; + float _previousUpShift; + float _previousDistance; + float _previousTightness; + float _newUpShift; + float _newDistance; + float _newTightness; + float _modeShift; + float _linearModeShift; + float _modeShiftPeriod; + float _scale; + + glm::vec3 _lookingAt; + bool _isKeepLookingAt; + + void updateFollowMode(float deltaTime); +}; + + +#endif diff --git a/SvoViewer/src/GLCanvas.cpp b/SvoViewer/src/GLCanvas.cpp new file mode 100755 index 0000000000..0e2772a5b8 --- /dev/null +++ b/SvoViewer/src/GLCanvas.cpp @@ -0,0 +1,87 @@ +// +// GLCanvas.cpp +// hifi +// +// Created by Stephen Birarda on 8/14/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#include "SvoViewer.h" + +#include "GLCanvas.h" +#include +#include + +GLCanvas::GLCanvas() : QGLWidget(QGLFormat(QGL::NoDepthBuffer, QGL::NoStencilBuffer)) { +} + +void GLCanvas::initializeGL() { + SvoViewer::getInstance()->initializeGL(); + setAttribute(Qt::WA_AcceptTouchEvents); + setAcceptDrops(true); +} + +void GLCanvas::paintGL() { + SvoViewer::getInstance()->paintGL(); +} + +void GLCanvas::resizeGL(int width, int height) { + SvoViewer::getInstance()->resizeGL(width, height); +} + +void GLCanvas::keyPressEvent(QKeyEvent* event) { + SvoViewer::getInstance()->keyPressEvent(event); +} + +void GLCanvas::keyReleaseEvent(QKeyEvent* event) { + SvoViewer::getInstance()->keyReleaseEvent(event); +} + +void GLCanvas::mouseMoveEvent(QMouseEvent* event) { + SvoViewer::getInstance()->mouseMoveEvent(event); +} + +void GLCanvas::mousePressEvent(QMouseEvent* event) { + SvoViewer::getInstance()->mousePressEvent(event); +} + +void GLCanvas::mouseReleaseEvent(QMouseEvent* event) { + SvoViewer::getInstance()->mouseReleaseEvent(event); +} + +int updateTime = 0; +bool GLCanvas::event(QEvent* event) { + /* switch (event->type()) { + case QEvent::TouchBegin: + SvoViewer::getInstance()->touchBeginEvent(static_cast(event)); + event->accept(); + return true; + case QEvent::TouchEnd: + SvoViewer::getInstance()->touchEndEvent(static_cast(event)); + return true; + case QEvent::TouchUpdate: + SvoViewer::getInstance()->touchUpdateEvent(static_cast(event)); + return true; + default: + break; + }*/ + return QGLWidget::event(event); +} + +void GLCanvas::wheelEvent(QWheelEvent* event) { + //SvoViewer::getInstance()->wheelEvent(event); +} + +void GLCanvas::dragEnterEvent(QDragEnterEvent* event) { + /*const QMimeData *mimeData = event->mimeData(); + foreach (QUrl url, mimeData->urls()) { + if (url.url().toLower().endsWith(SNAPSHOT_EXTENSION)) { + event->acceptProposedAction(); + break; + } + }*/ +} + +void GLCanvas::dropEvent(QDropEvent* event) { + //SvoViewer::getInstance()->dropEvent(event); +} diff --git a/SvoViewer/src/GLCanvas.h b/SvoViewer/src/GLCanvas.h new file mode 100644 index 0000000000..0f0cb5c7d0 --- /dev/null +++ b/SvoViewer/src/GLCanvas.h @@ -0,0 +1,39 @@ +// +// GLCanvas.h +// hifi +// +// Created by Stephen Birarda on 8/14/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#ifndef __hifi__GLCanvas__ +#define __hifi__GLCanvas__ + +#include + +/// customized canvas that simply forwards requests/events to the singleton application +class GLCanvas : public QGLWidget { +public: + GLCanvas(); +protected: + + virtual void initializeGL(); + virtual void paintGL(); + virtual void resizeGL(int width, int height); + + virtual void keyPressEvent(QKeyEvent* event); + virtual void keyReleaseEvent(QKeyEvent* event); + + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void mousePressEvent(QMouseEvent* event); + virtual void mouseReleaseEvent(QMouseEvent* event); + + virtual bool event(QEvent* event); + + virtual void wheelEvent(QWheelEvent* event); + + virtual void dragEnterEvent(QDragEnterEvent *event); + virtual void dropEvent(QDropEvent* event); +}; + +#endif /* defined(__hifi__GLCanvas__) */ diff --git a/SvoViewer/src/ProgramObject.cpp b/SvoViewer/src/ProgramObject.cpp new file mode 100755 index 0000000000..5108c15068 --- /dev/null +++ b/SvoViewer/src/ProgramObject.cpp @@ -0,0 +1,20 @@ +// +// ProgramObject.cpp +// interface +// +// Created by Andrzej Kapolka on 5/7/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. + +#include "ProgramObject.h" + +ProgramObject::ProgramObject(QObject* parent) : QGLShaderProgram(parent) { +} + +void ProgramObject::setUniform(int location, const glm::vec3& value) { + setUniformValue(location, value.x, value.y, value.z); +} + +void ProgramObject::setUniform(const char* name, const glm::vec3& value) { + setUniformValue(name, value.x, value.y, value.z); +} + diff --git a/SvoViewer/src/ProgramObject.h b/SvoViewer/src/ProgramObject.h new file mode 100755 index 0000000000..78f07b7a1b --- /dev/null +++ b/SvoViewer/src/ProgramObject.h @@ -0,0 +1,25 @@ +// +// ProgramObject.h +// interface +// +// Created by Andrzej Kapolka on 5/7/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#ifndef __interface__ProgramObject__ +#define __interface__ProgramObject__ + +#include + +#include + +class ProgramObject : public QGLShaderProgram { +public: + + ProgramObject(QObject* parent = 0); + + void setUniform(int location, const glm::vec3& value); + void setUniform(const char* name, const glm::vec3& value); +}; + +#endif /* defined(__interface__ProgramObject__) */ diff --git a/SvoViewer/src/Render.cpp b/SvoViewer/src/Render.cpp new file mode 100755 index 0000000000..39a7940b4c --- /dev/null +++ b/SvoViewer/src/Render.cpp @@ -0,0 +1,744 @@ +#include "svoviewer.h" + +//////////////////////////////////////////////////// +// Some GL helper functions + +GLubyte SvoViewer::SetupGlVBO(GLuint * id, int sizeInBytes, GLenum target, GLenum usage, void * dataUp ) +{ + glGenBuffers(1, id); + glBindBuffer(target, *id); + glBufferData(target, sizeInBytes, dataUp, usage); + return PrintGLErrorCode(); +} + + +//////////////////////////////////////////////////// +// Include all the render methods here. + +//////////////////////////////////////////////////// +// Points system + +bool SvoViewer::FindNumLeaves(OctreeElement* node, void* extraData) +{ + VoxelTreeElement* voxel = (VoxelTreeElement*)node; + FindNumLeavesData* args = (FindNumLeavesData*)extraData; + if (node->isLeaf()) args->numLeaves++; + return true; +} + +struct PointRenderAssembleData +{ + glm::vec3 * buffer; + unsigned char* colorBuffer; + unsigned int count; +}; + +bool SvoViewer::PointRenderAssemblePerVoxel(OctreeElement* node, void* extraData) +{ + VoxelTreeElement* voxel = (VoxelTreeElement*)node; + PointRenderAssembleData* args = (PointRenderAssembleData*)extraData; + if (!node->isLeaf()) return true; + AABox box = voxel->getAABox(); + glm::vec3 center = box.calcCenter(); + center += glm::vec3(0, -.05, 0); + center *= 100.0; + args->buffer[args->count] = center; + int cCount = args->count * 3; + args->colorBuffer[cCount] = voxel->getTrueColor()[0]; + args->colorBuffer[cCount+1] = voxel->getTrueColor()[1]; + args->colorBuffer[cCount+2] = voxel->getTrueColor()[2]; + args->count++; + return true; // keep going! +} + +void SvoViewer::InitializePointRenderSystem() +{ + DebugPrint("Initializing point render system!\n"); + quint64 fstart = usecTimestampNow(); + _renderFlags.voxelRenderDirty = true; + _renderFlags.voxelOptRenderDirty = true; + + glGenBuffers(1, &_pointVtxBuffer); + glBindBuffer( GL_ARRAY_BUFFER, _pointVtxBuffer); + + // Assemble the buffer data. + PointRenderAssembleData args; + args.buffer = _pointVertices = new glm::vec3[_nodeCount]; + args.colorBuffer = _pointColors = new unsigned char[_nodeCount*3]; + assert(args.buffer != NULL); + args.count = 0; + _systemTree.recurseTreeWithOperation(&PointRenderAssemblePerVoxel, &args); + + assert(args.count < _nodeCount); + _pointVerticesCount = args.count; + + // create the data store. + int size = _nodeCount * sizeof(glm::vec3); + glBindBuffer( GL_ARRAY_BUFFER, _pointVtxBuffer); + glBufferData(GL_ARRAY_BUFFER, _nodeCount * 3, args.buffer, GL_STATIC_DRAW); + //glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); + + //glBindBuffer(GL_ARRAY_BUFFER, _pointColorBuffer); + //glBufferData(GL_ARRAY_BUFFER, size, args.colorBuffer, GL_STATIC_DRAW); + //glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL); + + _renderFlags.ptRenderDirty = false; + _ptRenderInitialized = true; + float elapsed = (float)(usecTimestampNow() - fstart) / 1000.f; + DebugPrint("Point render intialization took %f time for %d nodes\n", elapsed, _nodeCount); +} + +void SvoViewer::RenderTreeSystemAsPoints() +{ + + glDisable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + //glDisable(GL_DEPTH_TEST); + + glColor3f(.5, 0, 0); + glPointSize(1.0f); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, _pointVtxBuffer); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexPointer(3, GL_FLOAT, 0, _pointVertices); + + // Removed for testing. + /*glEnableClientState(GL_COLOR_ARRAY); + //glEnableVertexAttribArray(1); + glBindBuffer(GL_ARRAY_BUFFER, _pointColorBuffer);*/ + //glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL); + //glColorPointer(3, GL_UNSIGNED_BYTE, 0, _pointColors); + + glDrawArrays(GL_POINTS, 0, _pointVerticesCount); +} + +void SvoViewer::StopUsingPointRenderSystem() +{ + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); +} + +//////////////////////////////////////////////////// + +const GLchar * simpleVtxShaderSrc = + "uniform mat4 viewMatrix;\n\ + uniform mat4 projectionMatrix;\n\ + uniform mat4 modelMatrix;\n\ + void main()\n\ + {\n\ + vec4 world_pos = modelMatrix * gl_Vertex;\n\ + vec4 view_pos = viewMatrix * world_pos;\n\ + gl_Position = projectionMatrix * view_pos;\n\ + gl_FrontColor = gl_Color;\n\ + }\n"; +int simpleVtxShaderLen = strlen(simpleVtxShaderSrc); + +const GLchar * simpleGeomShaderSrc = + "#version 330 compatibility\n\ + layout(triangles) in;\n\ + layout(triangle_strip, max_vertices=3) out;\n\ + void main()\n\ + {\n\ + for(int i=0; i<3; i++)\n\ + {\n\ + gl_Position = gl_in[i].gl_Position;\n\ + EmitVertex();\n\ + }\n\ + EndPrimitive();\n\ + }"; +int simpleGeomShaderLen = strlen(simpleGeomShaderSrc); + +const GLchar * simpleFragShaderSrc = + "void main()\n\ + {\n\ + gl_FragColor = gl_Color;\n\ + }\n"; +int simpleFragShaderLen = strlen(simpleFragShaderSrc); + +struct VoxelRenderAssembleData +{ + glm::vec3 * buffer; + unsigned char* colorBuffer; + GLuint** idxBuffs; + unsigned int leafCount; + unsigned int lastBufferSegmentStart; + GLuint vtxID; + GLuint colorID; + GLuint* idxIds; + +}; + +bool SvoViewer::VoxelRenderAssemblePerVoxel(OctreeElement* node, void* extraData) +{ + VoxelTreeElement* voxel = (VoxelTreeElement*)node; + VoxelRenderAssembleData* args = (VoxelRenderAssembleData*)extraData; + if (!node->isLeaf()) return true; + + AABox box = voxel->getAABox(); + int totalNodesProcessedSinceLastFlush = args->leafCount - args->lastBufferSegmentStart; + // ack, one of these components is flags, not alpha + int cCount = totalNodesProcessedSinceLastFlush * 4; // Place it relative to the current segment. + unsigned char col[4] = {voxel->getTrueColor()[0], voxel->getTrueColor()[1], voxel->getTrueColor()[2], 1}; + for(int i = 0; i < GLOBAL_NORMALS_VERTICES_PER_VOXEL; i++) + memcpy(&args->colorBuffer[cCount+i*4], col, sizeof(col)); + + int vCount = totalNodesProcessedSinceLastFlush * GLOBAL_NORMALS_VERTICES_PER_VOXEL; // num vertices we've added so far. + { + int idxCount = totalNodesProcessedSinceLastFlush * INDICES_PER_FACE; // same for every cube face. + // Indices follow a static pattern. + for (int i = 0; i < NUM_CUBE_FACES; i++) + { + GLuint* idxBuff = args->idxBuffs[i]; + for (int j = 0; j < INDICES_PER_FACE; j++) + { + idxBuff[idxCount+j] = SvoViewerNames::cubeFaceIndices[i][j] + vCount; + } + } + } + + // Grab vtx positions according to setup from indices layout above. + //center += glm::vec3(0, -.05, 0); + float scale = 100.0; + for ( int i = 0; i < GLOBAL_NORMALS_VERTICES_PER_VOXEL; i++) + { + args->buffer[vCount] = box.getVertex((BoxVertex)i); // i corresponds to BOTTOM_LEFT_NEAR,BOTTOM_RIGHT_NEAR,... + args->buffer[vCount++] *= scale; + } + + args->leafCount++; + totalNodesProcessedSinceLastFlush++; + + if (totalNodesProcessedSinceLastFlush >= REASONABLY_LARGE_BUFFER) // Flush data to GL once we have assembled enough of it. + { + //DebugPrint("committing!\n"); + PrintGLErrorCode(); + glBindBuffer(GL_ARRAY_BUFFER, args->vtxID); + glBufferSubData(GL_ARRAY_BUFFER, args->lastBufferSegmentStart * sizeof(glm::vec3) * GLOBAL_NORMALS_VERTICES_PER_VOXEL, + totalNodesProcessedSinceLastFlush * sizeof(glm::vec3) * GLOBAL_NORMALS_VERTICES_PER_VOXEL, args->buffer); + PrintGLErrorCode(); + + glBindBuffer(GL_ARRAY_BUFFER, args->colorID); + glBufferSubData(GL_ARRAY_BUFFER, args->lastBufferSegmentStart * sizeof(GLubyte) * 4 * GLOBAL_NORMALS_VERTICES_PER_VOXEL, + totalNodesProcessedSinceLastFlush * sizeof(GLubyte) * 4 * GLOBAL_NORMALS_VERTICES_PER_VOXEL, args->colorBuffer); + PrintGLErrorCode(); + + for (int i = 0; i < NUM_CUBE_FACES; i++) + { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, args->idxIds[i]); + GLuint* idxBuff = args->idxBuffs[i]; + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, args->lastBufferSegmentStart * sizeof(GLuint) * INDICES_PER_FACE, + totalNodesProcessedSinceLastFlush * sizeof(GLuint) * INDICES_PER_FACE, idxBuff); // Rework. + PrintGLErrorCode(); + } + glFlush(); + PrintGLErrorCode(); + args->lastBufferSegmentStart = args->leafCount; + } + + return true; +} + +void SvoViewer::InitializeVoxelRenderSystem() +{ + DebugPrint("Initializing voxel render system.\n"); + + FindNumLeavesData data; + data.numLeaves = 0; + _systemTree.recurseTreeWithOperation(&FindNumLeaves, &data); + _leafCount = data.numLeaves; + + glGenBuffers(NUM_CUBE_FACES, _vboIndicesIds); + for (int i = 0; i < NUM_CUBE_FACES; i++) + { + _vboIndices[i] = new GLuint[REASONABLY_LARGE_BUFFER * INDICES_PER_FACE]; + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndicesIds[i]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, INDICES_PER_FACE * sizeof(GLuint) * _nodeCount, + NULL, GL_STATIC_DRAW); + } + + glGenBuffers(1, &_vboVerticesID); + glBindBuffer(GL_ARRAY_BUFFER, _vboVerticesID); + glBufferData(GL_ARRAY_BUFFER, GLOBAL_NORMALS_VERTICES_PER_VOXEL * sizeof(glm::vec3) * _nodeCount, NULL, GL_STATIC_DRAW); + PrintGLErrorCode(); + + glGenBuffers(1, &_vboColorsID); + glBindBuffer(GL_ARRAY_BUFFER, _vboColorsID); + glBufferData(GL_ARRAY_BUFFER, GLOBAL_NORMALS_VERTICES_PER_VOXEL * sizeof(GLubyte) * 4 * _nodeCount, NULL, GL_STATIC_DRAW); + PrintGLErrorCode(); + + //int numVertices = GLOBAL_NORMALS_VERTICES_PER_VOXEL * _nodeCount; + // Working set test = dead after about 1.5gb! I.e... don't try to allocate this here. + // This will tell you about what you have to play with. On my system, it died consistently after 1.3-1.5gb. + //glm::vec3* memPtrs[20]; + //int i; + //for (i = 0; i < 20; i++) + //{ + // memPtrs[i] = new glm::vec3[numVertices / 20]; + //} + // + //for (i = 0; i < 20; i++) + // delete [] memPtrs[i]; +#define PAD 32 + _readVerticesArray = new glm::vec3[GLOBAL_NORMALS_VERTICES_PER_VOXEL * REASONABLY_LARGE_BUFFER + PAD]; + _readColorsArray = new GLubyte[(GLOBAL_NORMALS_VERTICES_PER_VOXEL * REASONABLY_LARGE_BUFFER * 4) + PAD]; + + // Assemble the buffer data. + VoxelRenderAssembleData args; + args.buffer = _readVerticesArray; + args.colorBuffer = _readColorsArray; + assert(args.buffer != NULL && args.colorBuffer != NULL); + args.leafCount = 0; + args.lastBufferSegmentStart = 0; + args.idxIds = _vboIndicesIds; + args.idxBuffs = _vboIndices; + args.vtxID = _vboVerticesID; + args.colorID = _vboColorsID; + _systemTree.recurseTreeWithOperation(&VoxelRenderAssemblePerVoxel, &args); + + glBindBuffer(GL_ARRAY_BUFFER, _vboVerticesID); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec3), 0); + glEnableVertexAttribArray(0); + //glVertexPointer(3, GL_FLOAT, 0, 0); + + glBindBuffer(GL_ARRAY_BUFFER, _vboColorsID); + glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(unsigned char) * 4, 0); + glEnableVertexAttribArray(1); + + // Set up the shaders. + _vertexShader = glCreateShader(GL_VERTEX_SHADER); + _geometryShader = glCreateShader(GL_GEOMETRY_SHADER); + _pixelShader = glCreateShader(GL_FRAGMENT_SHADER); + + glShaderSource(_vertexShader, 1, &simpleVtxShaderSrc, &simpleVtxShaderLen); + glShaderSource(_geometryShader, 1, &simpleGeomShaderSrc, &simpleGeomShaderLen); + glShaderSource(_pixelShader, 1, &simpleFragShaderSrc, &simpleFragShaderLen); + + GLchar shaderLog[1000]; + GLsizei shaderLogLength; + GLint compiled; + glCompileShaderARB(&_vertexShader); + glGetShaderInfoLog(_vertexShader, 1000, &shaderLogLength, shaderLog); + if (shaderLog[0] != 0) DebugPrint("Shaderlog v :\n %s\n", shaderLog); + glCompileShaderARB(&_geometryShader); + glGetShaderInfoLog(_geometryShader, 1000, &shaderLogLength, shaderLog); + if (shaderLog[0] != 0) DebugPrint("Shaderlog g :\n %s\n", shaderLog); + glCompileShaderARB(&_pixelShader); + glGetShaderInfoLog(_pixelShader, 51000, &shaderLogLength, shaderLog); + if (shaderLog[0] != 0) DebugPrint("Shaderlog p :\n %s\n", shaderLog); + + _linkProgram = glCreateProgram(); + glAttachShader(_linkProgram, _vertexShader); + glAttachShader(_linkProgram, _geometryShader); + glAttachShader(_linkProgram, _pixelShader); + glLinkProgram(_linkProgram); + GLint linked; + glGetProgramiv(_linkProgram, GL_LINK_STATUS, &linked); + if (!linked) DebugPrint("Linking failed! %d\n", linked); + + + _voxelOptRenderInitialized = true; +} + +void SvoViewer::RenderTreeSystemAsVoxels() +{ + if (!_voxelOptRenderInitialized) return; // What the?? + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + // for performance, enable backface culling + glEnable(GL_CULL_FACE); + + // disable specular lighting for ground and voxels + glMaterialfv(GL_FRONT, GL_SPECULAR, NO_SPECULAR_COLOR); + + setupWorldLight(); + + glNormal3f(0,1.0f,0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndicesIds[CUBE_TOP]); + glDrawRangeElementsEXT(GL_TRIANGLES, 0, GLOBAL_NORMALS_VERTICES_PER_VOXEL * _leafCount - 1, + INDICES_PER_FACE * _leafCount, GL_UNSIGNED_INT, 0); + + glNormal3f(0,-1.0f,0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndicesIds[CUBE_BOTTOM]); + glDrawRangeElementsEXT(GL_TRIANGLES, 0, GLOBAL_NORMALS_VERTICES_PER_VOXEL * _leafCount - 1, + INDICES_PER_FACE * _leafCount, GL_UNSIGNED_INT, 0); + + glNormal3f(-1.0f,0,0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndicesIds[CUBE_LEFT]); + glDrawRangeElementsEXT(GL_TRIANGLES, 0, GLOBAL_NORMALS_VERTICES_PER_VOXEL * _leafCount - 1, + INDICES_PER_FACE * _leafCount, GL_UNSIGNED_INT, 0); + + glNormal3f(1.0f,0,0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndicesIds[CUBE_RIGHT]); + glDrawRangeElementsEXT(GL_TRIANGLES, 0, GLOBAL_NORMALS_VERTICES_PER_VOXEL * _leafCount - 1, + INDICES_PER_FACE * _leafCount, GL_UNSIGNED_INT, 0); + + glNormal3f(0,0,-1.0f); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndicesIds[CUBE_FRONT]); + glDrawRangeElementsEXT(GL_TRIANGLES, 0, GLOBAL_NORMALS_VERTICES_PER_VOXEL * _leafCount - 1, + INDICES_PER_FACE * _leafCount, GL_UNSIGNED_INT, 0); + + glNormal3f(0,0,1.0f); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndicesIds[CUBE_BACK]); + glDrawRangeElementsEXT(GL_TRIANGLES, 0, GLOBAL_NORMALS_VERTICES_PER_VOXEL * _leafCount - 1, + INDICES_PER_FACE * _leafCount, GL_UNSIGNED_INT, 0); + + //glDisable(GL_CULL_FACE); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +} + +void SvoViewer::StopUsingVoxelRenderSystem() +{ + if (!_voxelOptRenderInitialized) return; + //for (int i = 0; i < NUM_CUBE_FACES; i++) delete [] _vboIndices[i]; + //delete [] _readVerticesArray; + //delete [] _readColorsArray; + + glDeleteBuffers(1, &_vboVerticesID); + glDeleteBuffers(1, &_vboColorsID); + glDeleteBuffers(NUM_CUBE_FACES, _vboIndicesIds); + _voxelOptRenderInitialized = false; +} + +//////////////////////////////////////////////////// + + +// NOTE - the voxel tree data structure doesn't currently have neighbor information encoded in any convenient searchable +// way. So here I'm using a HUGE hack to compute repeated faces in the data structure. I 1) compute the barycentric coordinates +// of every triangle for every leaf face. 2) Compute the center point for the triangle. (edit: I removed the barycentric part after some testing), +// 3) That center point becomes a ID for that tri. +// 4) If that ID is added more than once, discard this triangle, as it must be an internal. External triangles will only be added once. +// SUBNOTE - I have NO idea how the tree traversal is actually happening as I haven't looked into its usage pattern. If traversal order was intelligent, +// static and the pattern was predetermined, traversal could actually generate a mostly sorted list automatically. Because that isn't guaranteed +// here, its uglier. + + +// The +bool SvoViewer::TrackVisibleFaces(OctreeElement* node, void* extraData) +{ + VoxelTreeElement* voxel = (VoxelTreeElement*)node; + VisibleFacesData* args = (VisibleFacesData*)extraData; + if (!node->isLeaf()) return true; + + AABox box = voxel->getAABox(); + glm::vec3 p0, p1, p2, p3, hackCenterVal; + glm::vec3 cubeVerts[GLOBAL_NORMALS_VERTICES_PER_VOXEL]; + + for (int i = 0; i < GLOBAL_NORMALS_VERTICES_PER_VOXEL; i++) // Cache as aabox reconstructs with every call. + cubeVerts[i] = box.getVertex((BoxVertex)i); + + for (int i = 0; i < NUM_CUBE_FACES; i++) + { + p0 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][0]]; + p1 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][1]]; + p2 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][2]]; + p3 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][3]]; + hackCenterVal = computeQuickAndDirtyQuadCenter(p0, p1, p2, p3); + args->ptList[args->count] += hackCenterVal; + args->count++; + } + return true; +} + +// Do a binary search on the vector list. +int SvoViewer::binVecSearch(glm::vec3 searchVal, glm::vec3* list, int count, int * found) +{ + int key = count / 2; + int lowerbound = 0; + int upperbound = count-1; + int lastkey = -1; + while (lastkey != key) + { + lastkey = key; + int ret = ptCloseEnough(&searchVal, &list[key]); + if (ret == 0) { *found = 1; return key; } + if (lowerbound == key || upperbound == key) { *found = 0; return key;} // closest we can get! + if (ret < 0) + { + upperbound = key; + if (key == lowerbound+1) key = lowerbound; + else key = ((upperbound - lowerbound) / 2) + lowerbound; + } + else if (ret > 0) + { + lowerbound = key; + if (key == upperbound-1) key = upperbound; + else key = ((upperbound - lowerbound) /2) + lowerbound; + } + } + *found = 0; + return key; +} + +struct VoxelOptRenderAssembleData +{ + Vertex* vtxBuffer; + GLuint* idxBuffer; + int vtxCount; + int idxCount; + AABoundingVolume bounds; + int faceCenterCount; + glm::vec3 * faceCenterList; + int discardedCount; + int elemCount; +}; + +bool SvoViewer::VoxelOptRenderAssemblePerVoxel(OctreeElement* node, void* extraData) +{ + VoxelTreeElement* voxel = (VoxelTreeElement*)node; + VoxelOptRenderAssembleData* args = (VoxelOptRenderAssembleData*)extraData; + if (!node->isLeaf()) return true; + + AABox box = voxel->getAABox(); + + glm::vec3 p0, p1, p2, p3, hackCenterVal; + glm::vec3 cubeVerts[GLOBAL_NORMALS_VERTICES_PER_VOXEL]; + for (int i = 0; i < GLOBAL_NORMALS_VERTICES_PER_VOXEL; i++) // Cache, as aabox reconstructs with every call. + cubeVerts[i] = box.getVertex((BoxVertex)i); + + bool doAddFace[NUM_CUBE_FACES] = {true, false, true, true, true, true}; // Cull bottom faces by default. + + // Accumulate all the faces that need to be added. + for (int i = 0; i < NUM_CUBE_FACES; i++) + { + p0 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][0]]; + p1 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][1]]; + p2 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][2]]; + p3 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][3]]; + hackCenterVal = computeQuickAndDirtyQuadCenter(p0, p1, p2, p3); + // Search for this in the face center list + //glm::vec3 * foundVal = (glm::vec3*)bsearch(&hackCenterVal, args->faceCenterList, args->faceCenterCount, sizeof(glm::vec3), ptCompFunc); + int foundBVS = 0; + int idxIntoList = binVecSearch(hackCenterVal, args->faceCenterList, args->faceCenterCount, &foundBVS); + if (foundBVS == 0) { assert(0); continue; } // What the? + //if (foundVal == NULL) { assert(0); continue; } // What the? + //unsigned int idxIntoList = (foundVal - args->faceCenterList) / sizeof(glm::vec3); + assert(idxIntoList <= args->faceCenterCount-1); + // Now check face center list values that are immmediately adjacent to this value. If they're equal, don't add this face as + // another leaf voxel must contain this triangle too. + bool foundMatch = false; + if (idxIntoList != 0) + { + if (ptCloseEnough(&hackCenterVal, &args->faceCenterList[idxIntoList-1]) == 0) foundMatch = true; + } + if (idxIntoList != args->faceCenterCount-1 && foundMatch == false) + { + if (ptCloseEnough(&hackCenterVal, &args->faceCenterList[idxIntoList+1]) == 0) foundMatch = true; + } + if (foundMatch) + { + doAddFace[i] = false; // Remove. + args->discardedCount++; + } + } + +#define VTX_NOT_USED 255 + unsigned char vtxToAddMap[GLOBAL_NORMALS_VERTICES_PER_VOXEL]; // Map from vertex to actual position in the new vtx list. + memset(vtxToAddMap, VTX_NOT_USED, sizeof(vtxToAddMap)); + + // Figure out what vertices to add. NOTE - QUICK and dirty. easy opt - precalulate bit pattern for every face and just & it. + bool useVtx[GLOBAL_NORMALS_VERTICES_PER_VOXEL]; + memset(useVtx, 0, sizeof(useVtx)); + for ( int face = 0; face < NUM_CUBE_FACES; face++) // Vertex add order. + { + if (doAddFace[face]) + { + for (int vOrder = 0; vOrder < 4; vOrder++) + { + useVtx[SvoViewerNames::cubeFaceVtxs[face][vOrder]] = true; + } + } + } + unsigned char vtxAddedCount = 0; + int baseVtxCount = args->vtxCount; + for (int i = 0; i < GLOBAL_NORMALS_VERTICES_PER_VOXEL; i++) + { + if (useVtx[i]) + { + vtxToAddMap[i] = vtxAddedCount; + vtxAddedCount++; + + args->vtxBuffer[args->vtxCount].position = cubeVerts[i]; + args->vtxBuffer[args->vtxCount].position *= 100; + args->vtxBuffer[args->vtxCount].position.x -= 25; + args->vtxBuffer[args->vtxCount].position.y -= 4; + args->vtxBuffer[args->vtxCount].color[0] = voxel->getTrueColor()[0]; + args->vtxBuffer[args->vtxCount].color[1] = voxel->getTrueColor()[1]; + args->vtxBuffer[args->vtxCount].color[2] = voxel->getTrueColor()[2]; + args->vtxBuffer[args->vtxCount].color[3] = 1; + args->bounds.AddToSet(args->vtxBuffer[args->vtxCount].position); + args->vtxCount++; + } + } + + // Assemble the index lists. + for ( int face = 0; face < NUM_CUBE_FACES; face++) + { + if (doAddFace[face]) + { + for (int i = 0; i < 6; i++) + { + // index is : current vtx + offset in map table + args->idxBuffer[args->idxCount] = baseVtxCount + vtxToAddMap[ SvoViewerNames::cubeFaceIndices[face][i] ]; + args->idxCount++; + args->elemCount += 2; // Add 2 elements per face + } + } + } + + return true; +} + +void SvoViewer::InitializeVoxelOptRenderSystem() +{ + if (_voxelOptRenderInitialized) return; + _numSegments = 0; + _totalPossibleElems = 0; + memset(_numChildNodeLeaves, 0, sizeof(_numChildNodeLeaves)); + memset(_segmentNodeReferences, 0, sizeof(_segmentNodeReferences)); + memset(_segmentBoundingVolumes, 0, sizeof(_segmentBoundingVolumes)); + + // Set up the segments. Find the number of leaves at each subtree. + OctreeElement * rootNode = _systemTree.getRoot(); + OctreeElement* node0fromRoot = rootNode->getChildAtIndex(0); // ALL the interesting data for our test SVO is in this node! HACK!! + int rootNumChildren = rootNode->getChildCount(); + for (int i = 0; i < NUMBER_OF_CHILDREN; i++) + { + OctreeElement* childNode1stOrder = node0fromRoot->getChildAtIndex(i); + if (childNode1stOrder == NULL) continue; + // Grab 2nd order nodes for better separation. At some point, this would need to be done intelligently. + for (int j = 0; j < NUMBER_OF_CHILDREN; j++) + { + OctreeElement* childNode2ndOrder = childNode1stOrder->getChildAtIndex(j); + if (childNode2ndOrder == NULL) continue; + + int num2ndOrderChildren = childNode2ndOrder->getChildCount(); + // Figure out how populated this child is. + FindNumLeavesData data; + data.numLeaves = 0; + _systemTree.recurseNodeWithOperation(childNode2ndOrder, &FindNumLeaves, &data, 0); + + // Some of these nodes have a single leaf. Ignore for the moment. We really only want the big segments in this test. Add this back in at some point. + if (data.numLeaves > 1) + { + _numChildNodeLeaves[_numSegments] = data.numLeaves; + _segmentNodeReferences[_numSegments] = childNode2ndOrder; + _totalPossibleElems += data.numLeaves * NUM_CUBE_FACES * 2; + _numSegments++; + DebugPrint("child node %d %d has %d leaves and %d children itself\n", i, j, data.numLeaves, childNode2ndOrder->getChildCount()); + if (_numSegments >= MAX_NUM_OCTREE_PARTITIONS ) { DebugPrint("Out of segment space??? What the?\n"); break; } + } + } + if (_numSegments >= MAX_NUM_OCTREE_PARTITIONS ) { DebugPrint("Out of segment space??? What the?\n"); break; } + } + + + // Set up the VBO's. Once for every partition we stored. + for (int i = 0; i < _numSegments; i++) + { + // compute the visible set of this segment first. + glm::vec3* faceCenters = new glm::vec3[NUM_CUBE_FACES *_numChildNodeLeaves[i]]; + VisibleFacesData visFaceData; + visFaceData.ptList = faceCenters; + visFaceData.count = 0; + _systemTree.recurseNodeWithOperation(_segmentNodeReferences[i], &TrackVisibleFaces, &visFaceData, 0); + // Now there's a list of all the face centers. Sort it. + qsort(faceCenters, visFaceData.count, sizeof(glm::vec3), ptCompFunc); + DebugPrint("Creating VBO's. Sorted neighbor list %d\n", i); + + _readVertexStructs = new Vertex[GLOBAL_NORMALS_VERTICES_PER_VOXEL * _numChildNodeLeaves[i]]; + _readIndicesArray = new GLuint[NUM_CUBE_FACES * 2 * 3 * _numChildNodeLeaves[i]]; + + VoxelOptRenderAssembleData args; + args.vtxBuffer = _readVertexStructs; + args.idxBuffer = _readIndicesArray; + args.vtxCount = 0; + args.idxCount = 0; + args.faceCenterCount = visFaceData.count; + args.faceCenterList = visFaceData.ptList; + args.discardedCount = 0; + args.elemCount = 0; + _systemTree.recurseNodeWithOperation(_segmentNodeReferences[i], &VoxelOptRenderAssemblePerVoxel, &args, 0); + _segmentBoundingVolumes[i] = args.bounds; + _segmentElemCount[i] = args.elemCount; + + SetupGlVBO(&_vboOVerticesIds[i], args.vtxCount * sizeof(Vertex), GL_ARRAY_BUFFER, GL_STATIC_DRAW, _readVertexStructs); + SetupGlVBO(&_vboOIndicesIds[i], args.idxCount * sizeof(GLuint), GL_ARRAY_BUFFER, GL_STATIC_DRAW, _readIndicesArray); + + DebugPrint("Partition %d, vertices %d, indices %d, discarded %d\n", i, args.vtxCount, args.idxCount, args.discardedCount); + + delete [] _readVertexStructs; + delete [] _readIndicesArray; + delete [] faceCenters; + } + + _voxelOptRenderInitialized = true; +} + +void SvoViewer::RenderTreeSystemAsOptVoxels() +{ + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + // disable specular lighting for ground and voxels + glMaterialfv(GL_FRONT, GL_SPECULAR, NO_SPECULAR_COLOR); + + setupWorldLight(); + _numElemsDrawn = 0; + for (int i = 0; i < _numSegments; i++) + { + if (_displayOnlyPartition == i || _displayOnlyPartition == NO_PARTITION ) + { + if (isVisibleBV(&_segmentBoundingVolumes[i], &_myCamera, &_viewFrustum)) // Add aggressive LOD check here. + { + glBindBuffer(GL_ARRAY_BUFFER, _vboOVerticesIds[i]); + glVertexAttribPointer(ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex,position)); + glEnableVertexAttribArray(ATTRIB_POSITION); + + glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex,color)); + glEnableVertexAttribArray(ATTRIB_COLOR); + + //glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex,position)); + glEnableClientState(GL_COLOR_ARRAY); + glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)offsetof(Vertex,color)); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboOIndicesIds[i]); + + glDrawElements(GL_TRIANGLES, _segmentElemCount[i], GL_UNSIGNED_INT, NULL); + _numElemsDrawn += _segmentElemCount[i]; + + /*glColor3f(.8f, 0.0f, 0.0f); + glBegin(GL_POINTS); + for (int j = 0; j < GLOBAL_NORMALS_VERTICES_PER_VOXEL; j++) + { + glm::vec3 pt = _segmentBoundingVolumes[i].getCorner((BoxVertex)j); + glVertex3f(pt.x, pt.y, pt.z); + } + glEnd();*/ + } + } + } + glDisableVertexAttribArray(ATTRIB_POSITION); + glDisableVertexAttribArray(ATTRIB_COLOR); +} + + +void SvoViewer::StopUsingVoxelOptRenderSystem() +{ + glDisableVertexAttribArray(ATTRIB_POSITION); + glDisableVertexAttribArray(ATTRIB_COLOR); + glDisable(GL_LIGHTING); +} + + diff --git a/SvoViewer/src/Render.h b/SvoViewer/src/Render.h new file mode 100755 index 0000000000..e69de29bb2 diff --git a/SvoViewer/src/Render2.cpp b/SvoViewer/src/Render2.cpp new file mode 100755 index 0000000000..d15e9d6b78 --- /dev/null +++ b/SvoViewer/src/Render2.cpp @@ -0,0 +1,375 @@ +#include "svoviewer.h" + +///////////////////////////////////////////////////////////////////////////// +// Helper functions + +inline glm::vec3 SvoViewer::computeQuickAndDirtyQuadCenter(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2, glm::vec3 p3) +{ + glm::vec3 avg = p0 + p1 + p2 + p3; + avg /= 4.0f; + return avg; +} + +// Precision dependent hack. After debugging - change this to a magnitude function. +// simple version for clarity/debugging. +int SvoViewer::ptCompFunc(const void * a, const void * b) +{ + if ((*(glm::vec3*)a).x < (*(glm::vec3*)b).x) return -1; + else if ((*(glm::vec3*)a).x > (*(glm::vec3*)b).x) return 1; + + if ((*(glm::vec3*)a).y < (*(glm::vec3*)b).y) return -1; + else if ((*(glm::vec3*)a).y > (*(glm::vec3*)b).y) return 1; + + if ((*(glm::vec3*)a).z < (*(glm::vec3*)b).z) return -1; + else if ((*(glm::vec3*)a).z > (*(glm::vec3*)b).z) return 1; + return 0; +} + +//#define PRECISION_ERR .00000001 +#define PRECISION_ERR .00001 +// aggressive mode +//(0.00097656250 /2) // Space of smallest voxel should define our error bounds here. Test this if time allows. +int SvoViewer::ptCloseEnough(const void * a, const void * b) +{ + glm::vec3 diffVec = (*(glm::vec3*)a) - (*(glm::vec3*)b); + if (fabs(diffVec.x) < PRECISION_ERR && fabs(diffVec.y) < PRECISION_ERR && fabs(diffVec.z) < PRECISION_ERR) return 0; + //float len = diffVec.length(); + //if (len < PRECISION_ERR) return 0; + if ((*(glm::vec3*)a).x < (*(glm::vec3*)b).x) return -1; + else if ((*(glm::vec3*)a).x > (*(glm::vec3*)b).x) return 1; + if ((*(glm::vec3*)a).y < (*(glm::vec3*)b).y) return -1; + else if ((*(glm::vec3*)a).y > (*(glm::vec3*)b).y) return 1; + if ((*(glm::vec3*)a).z < (*(glm::vec3*)b).z) return -1; + else if ((*(glm::vec3*)a).z > (*(glm::vec3*)b).z) return 1; + return 0; +} + +// return parameterized intersection in t. +bool SvoViewer::parameterizedRayPlaneIntersection(const glm::vec3 origin, const glm::vec3 direction, const glm::vec3 planePt, const glm::vec3 planeNormal, float *t) +{ + float denom = glm::dot(direction, planeNormal); + if (denom < PRECISION_ERR) return false; + + glm::vec3 p010 = planePt - origin; + *t = glm::dot(p010, planeNormal) / denom; + + return true; +} + +///////////////////////////////////////////////////////////////////////////// +// 2nd stab at optimizing this. Cull back faces more aggressively. + + +struct VoxelOpt2RenderAssembleData +{ + Vertex* vtxBuffer; + VoxelDimIdxSet* idxSet; + int vtxCount; + int faceCenterCount; + glm::vec3 * faceCenterList; + int discardedCount; +}; + +bool SvoViewer::VoxelOpt2RenderAssemblePerVoxel(OctreeElement* node, void* extraData) +{ + VoxelTreeElement* voxel = (VoxelTreeElement*)node; + VoxelOpt2RenderAssembleData* args = (VoxelOpt2RenderAssembleData*)extraData; + if (!node->isLeaf()) return true; + + AABox box = voxel->getAABox(); + + glm::vec3 p0, p1, p2, p3, hackCenterVal; + glm::vec3 cubeVerts[GLOBAL_NORMALS_VERTICES_PER_VOXEL]; + for (int i = 0; i < GLOBAL_NORMALS_VERTICES_PER_VOXEL; i++) // Cache, as aabox reconstructs with every call. + cubeVerts[i] = box.getVertex((BoxVertex)i); + + bool doAddFace[NUM_CUBE_FACES] = {true, false, true, true, true, true}; // Cull bottom faces by default. + + // Accumulate all the faces that need to be added. + for (int i = 0; i < NUM_CUBE_FACES; i++) + { + p0 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][0]]; + p1 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][1]]; + p2 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][2]]; + p3 = cubeVerts[SvoViewerNames::cubeFaceVtxs[i][3]]; + hackCenterVal = computeQuickAndDirtyQuadCenter(p0, p1, p2, p3); + // Search for this in the face center list + //glm::vec3 * foundVal = (glm::vec3*)bsearch(&hackCenterVal, args->faceCenterList, args->faceCenterCount, sizeof(glm::vec3), ptCompFunc); + // BSEARCH FAILING! What the? wrote my own index approximate version. + int foundBVS = 0; + int idxIntoList = binVecSearch(hackCenterVal, args->faceCenterList, args->faceCenterCount, &foundBVS); + if (foundBVS == 0) { assert(0); continue; } // What the? + assert(idxIntoList <= args->faceCenterCount-1); + // Now check face center list values that are immmediately adjacent to this value. If they're equal, don't add this face as + // another leaf voxel must contain this triangle too. + bool foundMatch = false; + if (idxIntoList != 0) + { + if (ptCloseEnough(&hackCenterVal, &args->faceCenterList[idxIntoList-1]) == 0) foundMatch = true; + } + if (idxIntoList != args->faceCenterCount-1 && foundMatch == false) + { + if (ptCloseEnough(&hackCenterVal, &args->faceCenterList[idxIntoList+1]) == 0) foundMatch = true; + } + if (foundMatch) + { + doAddFace[i] = false; // Remove. + args->discardedCount++; + } + } + +#define VTX_NOT_USED 255 + unsigned char vtxToAddMap[GLOBAL_NORMALS_VERTICES_PER_VOXEL]; // Map from vertex to actual position in the new vtx list. + memset(vtxToAddMap, VTX_NOT_USED, sizeof(vtxToAddMap)); + + // Figure out what vertices to add. NOTE - QUICK and dirty. easy opt - precalulate bit pattern for every face and just & it. + bool useVtx[GLOBAL_NORMALS_VERTICES_PER_VOXEL]; + memset(useVtx, 0, sizeof(useVtx)); + for ( int face = 0; face < NUM_CUBE_FACES; face++) // Vertex add order. + { + if (doAddFace[face]) + { + for (int vOrder = 0; vOrder < 4; vOrder++) + { + useVtx[SvoViewerNames::cubeFaceVtxs[face][vOrder]] = true; + } + } + } + unsigned char vtxAddedCount = 0; + int baseVtxCount = args->vtxCount; + for (int i = 0; i < GLOBAL_NORMALS_VERTICES_PER_VOXEL; i++) + { + if (useVtx[i]) + { + vtxToAddMap[i] = vtxAddedCount; + vtxAddedCount++; + + args->vtxBuffer[args->vtxCount].position = cubeVerts[i]; + args->vtxBuffer[args->vtxCount].position *= 100; + args->vtxBuffer[args->vtxCount].position.x -= 25; + args->vtxBuffer[args->vtxCount].position.y -= 4; + args->vtxBuffer[args->vtxCount].color[0] = voxel->getTrueColor()[0]; + args->vtxBuffer[args->vtxCount].color[1] = voxel->getTrueColor()[1]; + args->vtxBuffer[args->vtxCount].color[2] = voxel->getTrueColor()[2]; + args->vtxBuffer[args->vtxCount].color[3] = 1; + cubeVerts[i] = args->vtxBuffer[args->vtxCount].position; + args->vtxCount++; + } + } + + // Assemble the index lists. + for ( int face = 0; face < NUM_CUBE_FACES; face++) + { + if (doAddFace[face]) + { + for (int i = 0; i < 6; i++) // 2 * 3 triangles. + { + args->idxSet->idxBuff[face][args->idxSet->idxCount[face]] = baseVtxCount + vtxToAddMap[ SvoViewerNames::cubeFaceIndices[face][i] ]; + args->idxSet->idxCount[face]++; + } + for (int i = 0; i < 4; i++) + { + args->idxSet->bounds[face].AddToSet( cubeVerts[SvoViewerNames::cubeFaceVtxs[face][i]] ); + } + args->idxSet->elemCount[face] += 2; + } + } + + return true; +} + +void SvoViewer::InitializeVoxelOpt2RenderSystem() +{ + quint64 startInit = usecTimestampNow(); + if (_voxelOptRenderInitialized) return; + _numSegments = 0; + _totalPossibleElems = 0; + memset(_numChildNodeLeaves, 0, sizeof(_numChildNodeLeaves)); + memset(_segmentNodeReferences, 0, sizeof(_segmentNodeReferences)); + + // Set up the segments. Find the number of leaves at each subtree. + OctreeElement * rootNode = _systemTree.getRoot(); + OctreeElement* node0fromRoot = rootNode->getChildAtIndex(0); // ALL the interesting data for our test SVO is in this node! HACK!! + int rootNumChildren = rootNode->getChildCount(); + for (int i = 0; i < NUMBER_OF_CHILDREN; i++) + { + OctreeElement* childNode1stOrder = node0fromRoot->getChildAtIndex(i); + if (childNode1stOrder == NULL) continue; + // Grab 2nd order nodes for better separation. At some point, this would need to be done intelligently. + for (int j = 0; j < NUMBER_OF_CHILDREN; j++) + { + OctreeElement* childNode2ndOrder = childNode1stOrder->getChildAtIndex(j); + if (childNode2ndOrder == NULL) continue; + + int num2ndOrderChildren = childNode2ndOrder->getChildCount(); + // Figure out how populated this child is. + FindNumLeavesData data; + data.numLeaves = 0; + _systemTree.recurseNodeWithOperation(childNode2ndOrder, &FindNumLeaves, &data, 0); + + // Some of these nodes have a single leaf. Ignore for the moment. We really only want the big segments in this test. Add this back in at some point. + if (data.numLeaves > 1) + { + _numChildNodeLeaves[_numSegments] = data.numLeaves; + _segmentNodeReferences[_numSegments] = childNode2ndOrder; + _totalPossibleElems += data.numLeaves * NUM_CUBE_FACES * 2; + _numSegments++; + DebugPrint("child node %d %d has %d leaves and %d children itself\n", i, j, data.numLeaves, childNode2ndOrder->getChildCount()); + if (_numSegments >= MAX_NUM_OCTREE_PARTITIONS ) { DebugPrint("Out of segment space??? What the?\n"); break; } + } + } + if (_numSegments >= MAX_NUM_OCTREE_PARTITIONS ) { DebugPrint("Out of segment space??? What the?\n"); break; } + } + + + // Set up the VBO's. Once for every partition we stored. + for (int i = 0; i < _numSegments; i++) + { + // compute the visible set of this segment first. + glm::vec3* faceCenters = new glm::vec3[NUM_CUBE_FACES *_numChildNodeLeaves[i]]; + VisibleFacesData visFaceData; + visFaceData.ptList = faceCenters; + visFaceData.count = 0; + _systemTree.recurseNodeWithOperation(_segmentNodeReferences[i], &TrackVisibleFaces, &visFaceData, 0); + // Now there's a list of all the face centers. Sort it. + qsort(faceCenters, visFaceData.count, sizeof(glm::vec3), ptCompFunc); + DebugPrint("Creating VBO's. Sorted neighbor list %d\n", i); + + _readVertexStructs = new Vertex[GLOBAL_NORMALS_VERTICES_PER_VOXEL * _numChildNodeLeaves[i]]; + memset(&_segmentIdxBuffers[i], 0, sizeof(VoxelDimIdxSet)); // Don't do it this way if we ever use a vtable for AABoundingVolumes! + for (int k = 0; k < NUM_CUBE_FACES; k++) + { + _segmentIdxBuffers[i].idxBuff[k] = new GLuint[2 * 3 * _numChildNodeLeaves[i]]; + assert(_segmentIdxBuffers[i].idxBuff[k] != NULL); + } + + VoxelOpt2RenderAssembleData args; + args.vtxBuffer = _readVertexStructs; + args.vtxCount = 0; + args.faceCenterCount = visFaceData.count; + args.faceCenterList = visFaceData.ptList; + args.discardedCount = 0; + args.idxSet = &_segmentIdxBuffers[i]; + _systemTree.recurseNodeWithOperation(_segmentNodeReferences[i], &VoxelOpt2RenderAssemblePerVoxel, &args, 0); + + SetupGlVBO(&_vboOVerticesIds[i], args.vtxCount * sizeof(Vertex), GL_ARRAY_BUFFER, GL_STATIC_DRAW, _readVertexStructs); + unsigned int idxCount = 0; + for (int k = 0; k < NUM_CUBE_FACES; k++) + { + SetupGlVBO(&_segmentIdxBuffers[i].idxIds[k], _segmentIdxBuffers[i].idxCount[k] * sizeof(GLuint), + GL_ARRAY_BUFFER, GL_STATIC_DRAW, _segmentIdxBuffers[i].idxBuff[k]); + idxCount += _segmentIdxBuffers[i].idxCount[k]; + _segmentIdxBuffers[i].bounds[k].setIsSingleDirection(true, SvoViewerNames::faceNormals[k]); + } + + DebugPrint("Partition %d, vertices %d, indices %d, discarded %d\n", i, args.vtxCount, idxCount, args.discardedCount); + + delete [] _readVertexStructs; + //delete [] _readIndicesArray; + delete [] faceCenters; + for (int k = 0; k < NUM_CUBE_FACES; k++) if (_segmentIdxBuffers[i].idxBuff[k] != NULL) delete [] _segmentIdxBuffers[i].idxBuff[k]; + } + + _voxelOptRenderInitialized = true; + + UpdateOpt2BVFaceVisibility(); + + quint64 endInit = usecTimestampNow(); + quint64 elapsed = endInit - startInit; + qDebug() << "init elapsed:" << ((float)elapsed / (float)1000000.0f) << "seconds"; + +} + +void SvoViewer::RenderTreeSystemAsOpt2Voxels() +{ + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + // disable specular lighting for ground and voxels + glMaterialfv(GL_FRONT, GL_SPECULAR, NO_SPECULAR_COLOR); + + setupWorldLight(); + _numElemsDrawn = 0; + for (int i = 0; i < _numSegments; i++) + { + if (_displayOnlyPartition == i || _displayOnlyPartition == NO_PARTITION ) + { + glBindBuffer(GL_ARRAY_BUFFER, _vboOVerticesIds[i]); + glVertexAttribPointer(ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex,position)); + glEnableVertexAttribArray(ATTRIB_POSITION); + + glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex,color)); + glEnableVertexAttribArray(ATTRIB_COLOR); + + //glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex,position)); + glEnableClientState(GL_COLOR_ARRAY); + glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)offsetof(Vertex,color)); + + for (int j = 0; j < NUM_CUBE_FACES; j++) + { + // Add aggressive LOD check here. + if (_segmentIdxBuffers[i].visibleFace[j] || _useBoundingVolumes != true) + { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _segmentIdxBuffers[i].idxIds[j]);//_vboOIndicesIds[i]); + glDrawElements(GL_TRIANGLES, _segmentIdxBuffers[i].elemCount[j]*3, GL_UNSIGNED_INT, NULL); + _numElemsDrawn += _segmentIdxBuffers[i].elemCount[j]; + } + } + } + } + glDisableVertexAttribArray(ATTRIB_POSITION); + glDisableVertexAttribArray(ATTRIB_COLOR); +} + +// special rules for single direction bv sets. Basically, we intersect a lookat ray from the camera with two opposite faces and discard +// the entire set of the face that is further away as it must be back facing. +void SvoViewer::UpdateOpt2BVFaceVisibility() +{ + if (_currentShaderModel != RENDER_OPT_CULLED_POLYS || _voxelOptRenderInitialized != true ) return; + + float faceParamVals[NUM_CUBE_FACES]; + glm::vec3 pos = _myCamera.getPosition(); + + for (int i = 0; i < _numSegments; i++) + { + VoxelDimIdxSet* setPtr = &_segmentIdxBuffers[i]; + // Fast cull check. + setPtr->visibleFace[0] = (_segmentIdxBuffers[i].bounds[0].within(pos.y, 1) >= 0) ? true : false; + setPtr->visibleFace[1] = (_segmentIdxBuffers[i].bounds[1].within(pos.y, 1) <= 0) ? true : false; + setPtr->visibleFace[2] = (_segmentIdxBuffers[i].bounds[2].within(pos.x, 0) >= 0) ? true : false; + setPtr->visibleFace[3] = (_segmentIdxBuffers[i].bounds[3].within(pos.x, 0) <= 0) ? true : false; + setPtr->visibleFace[4] = (_segmentIdxBuffers[i].bounds[4].within(pos.z, 2) <= 0) ? true : false; + setPtr->visibleFace[5] = (_segmentIdxBuffers[i].bounds[5].within(pos.z, 2) >= 0) ? true : false; + + // Make sure its actually on the screen. + /*for (int j = 0; j < NUM_CUBE_FACES; j++) + { + if (setPtr->visibleFace[j]) + { + if (visibleAngleSubtended(&_segmentIdxBuffers[i].bounds[j], &_myCamera, &_viewFrustum) <= 0) + setPtr->visibleFace[j] = false; + } + }*/ + } + /* + for (int j = 0; j < NUM_CUBE_FACES; j++) + { + setPtr->visibleFace[i] = true; + AABoundingVolume* volume = &_segmentIdxBuffers[i].bounds[j]; + glm::vec3 randomPlaneVtx = volume->getCorner((BoxVertex)SvoViewerNames::cubeFaceIndices[j][0]); + glm::vec3 raydir = randomPlaneVtx - pos; + rayder /= glm::length(raydir); + if (glm::dot(target, raydir) < 1) raydir *= -1; + if (!parameterizedRayPlaneIntersection(pos, raydir, randomPlaneVtx, SvoViewerNames::faceNormals[j], &faceParamVals[j])) + faceParamVals[j] = -1; + } + */ +} + +void SvoViewer::StopUsingVoxelOpt2RenderSystem() +{ + glDisableVertexAttribArray(ATTRIB_POSITION); + glDisableVertexAttribArray(ATTRIB_COLOR); + glDisable(GL_LIGHTING); +} diff --git a/SvoViewer/src/SvoViewer.ico b/SvoViewer/src/SvoViewer.ico new file mode 100755 index 0000000000000000000000000000000000000000..7500a1d41376a048cae58d61e8104ecc00cfda91 GIT binary patch literal 2734 zcmeH}O%8%E5QQINNZiqI0m6zU4T)=y;?iTd@)(}aTVURlh87X6ih+bLfyo=vpD@Ft zK!g}ol_J6xrv%so$aAA_8{nD%X=-#C0hb+60;m8S0U0;O89>9U;eBPU#I*;@E6g#k zRi-ngxM6RfO4X{a^ zTyH6H;`hV<3>*Hi@c&HTL;s;&kK}r;H;NWdG#+ZT^+Iab1F0Rp)_w1KrNh76Fiao& zgw60i{wfCcdD`|m&tYRsah_`HYwOxYEnQMc)NNE*_uMpv)H5#%TgRvM;t}wZW1t;( E2e+Sr;s5{u literal 0 HcmV?d00001 diff --git a/SvoViewer/src/SvoViewer.rc b/SvoViewer/src/SvoViewer.rc new file mode 100755 index 0000000000..08bf1d355f --- /dev/null +++ b/SvoViewer/src/SvoViewer.rc @@ -0,0 +1,2 @@ +IDI_ICON1 ICON DISCARDABLE "SvoViewer.ico" + diff --git a/SvoViewer/src/globals.cpp b/SvoViewer/src/globals.cpp new file mode 100755 index 0000000000..766cd6e6d3 --- /dev/null +++ b/SvoViewer/src/globals.cpp @@ -0,0 +1,67 @@ + + +#include "globals.h" + +const GLfloat WHITE_SPECULAR_COLOR[] = { 1.0f, 1.0f, 1.0f, 1.0f }; +const GLfloat NO_SPECULAR_COLOR[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + +namespace SvoViewerNames // avoid conflicts with voxelSystem namespace objects +{ +float identityVerticesGlobalNormals[] = { 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0,1,1 }; + +float identityVertices[] = { 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0,1,1, //0-7 + 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0,1,1, //8-15 + 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0,1,1 }; // 16-23 + +GLfloat identityNormals[] = { 0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1, + 0,0,+1, 0,0,+1, 0,0,+1, 0,0,+1, + 0,-1,0, 0,-1,0, 0,+1,0, 0,+1,0, + 0,-1,0, 0,-1,0, 0,+1,0, 0,+1,0, + -1,0,0, +1,0,0, +1,0,0, -1,0,0, + -1,0,0, +1,0,0, +1,0,0, -1,0,0 }; + +GLubyte identityIndices[] = { 0,2,1, 0,3,2, // Z- + 8,9,13, 8,13,12, // Y- + 16,23,19, 16,20,23, // X- + 17,18,22, 17,22,21, // X+ + 10,11,15, 10,15,14, // Y+ + 4,5,6, 4,6,7 }; // Z+ + +GLubyte identityIndicesTop[] = { 2, 3, 7, 2, 7, 6 }; +GLubyte identityIndicesBottom[] = { 0, 1, 5, 0, 5, 4 }; +GLubyte identityIndicesLeft[] = { 0, 7, 3, 0, 4, 7 }; +GLubyte identityIndicesRight[] = { 1, 2, 6, 1, 6, 5 }; +GLubyte identityIndicesFront[] = { 0, 2, 1, 0, 3, 2 }; +GLubyte identityIndicesBack[] = { 4, 5, 6, 4, 6, 7 }; + +GLubyte cubeFaceIndices[][2*3] = +{ + { 2, 3, 7, 2, 7, 6 }, + { 0, 1, 5, 0, 5, 4 }, + { 0, 7, 3, 0, 4, 7 }, + { 1, 2, 6, 1, 6, 5 }, + { 0, 2, 1, 0, 3, 2 }, + { 4, 5, 6, 4, 6, 7 } +}; + +GLubyte cubeFaceVtxs[6][4] = +{ + { 2, 3, 6, 7 }, + { 0, 1, 4, 5 }, + { 0, 3, 4, 7 }, + { 1, 2, 5, 6 }, + { 0, 1, 2, 3 }, + { 4, 5, 6, 7 } +}; + +glm::vec3 faceNormals[6] = +{ + glm::vec3(0.0, 1.0, 0.0), + glm::vec3(0.0, -1.0, 0.0), + glm::vec3(-1.0, 0.0, 0.0), + glm::vec3(1.0, 0.0, 0.0), + glm::vec3(0.0, 0.0, 1.0), + glm::vec3(0.0, 0.0, -1.0) +}; + +} // SvoViewerNames \ No newline at end of file diff --git a/SvoViewer/src/globals.h b/SvoViewer/src/globals.h new file mode 100755 index 0000000000..4357749d33 --- /dev/null +++ b/SvoViewer/src/globals.h @@ -0,0 +1,33 @@ + +#pragma once + +#include "SvoViewerConfig.h" + +#include +#include +#include +//#include + +//#include "ui_svoviewer.h" +#include +#include +#include +//#include +//#include +//#include +#include + +#include "Camera.h" + + +extern const GLfloat WHITE_SPECULAR_COLOR[]; +extern const GLfloat NO_SPECULAR_COLOR[]; + +namespace SvoViewerNames // avoid conflicts with voxelSystem namespace objects +{ +extern GLubyte cubeFaceIndices[][2*3]; + +extern GLubyte cubeFaceVtxs[6][4]; + +extern glm::vec3 faceNormals[6]; +} \ No newline at end of file diff --git a/SvoViewer/src/main.cpp b/SvoViewer/src/main.cpp new file mode 100755 index 0000000000..23cc6c7ba4 --- /dev/null +++ b/SvoViewer/src/main.cpp @@ -0,0 +1,8 @@ +#include "svoviewer.h" +#include + +int main(int argc, char *argv[]) +{ + SvoViewer svoV(argc, argv); + return svoV.exec(); +} diff --git a/SvoViewer/src/svoviewer.cpp b/SvoViewer/src/svoviewer.cpp new file mode 100755 index 0000000000..88e75b5e42 --- /dev/null +++ b/SvoViewer/src/svoviewer.cpp @@ -0,0 +1,644 @@ +#include "svoviewer.h" +#include "GLCanvas.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + + +const int IDLE_SIMULATE_MSECS = 1; // How often should call simulate and other stuff + // in the idle loop? (60 FPS is default) + // Empirically, I found 5 to be about 60fps + +static QTimer* idleTimer = NULL; +const ViewFrustumOffset DEFAULT_FRUSTUM_OFFSET = {-135.0f, 0.0f, 0.0f, 25.0f, 0.0f}; +SvoViewer * _globalSvoViewerObj; // Hack :: var to store global pointer since this wasn't designed to work with the interface nodelist. + +SvoViewer::SvoViewer(int& argc, char** argv, QWidget *parent) + : QApplication(argc, argv), + _window(new QMainWindow(desktop())), + _glWidget(new GLCanvas()), + _width(1280), + _height(720), + _pixelCount(1280*720), + _frameCount(0), + _leafCount(0), + _nodeCount(0), + _fps(0.0), + _lastTimeFpsUpdated(0), + _lastTimeFrameUpdated(0), + _ptRenderInitialized(false), + _voxelRenderInitialized(false), + _voxelOptRenderInitialized(false), + _voxelOpt2RenderInitialized(false), + _vertexShader(0), + _pixelShader(0), + _geometryShader(0), + _maxVoxels(DEFAULT_MAX_VOXELS_PER_SYSTEM), + _voxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE), + _boundaryLevelAdjust(0), + _viewFrustumOffset(DEFAULT_FRUSTUM_OFFSET), + _fieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES), + _useVoxelTextures(false), + _pointVertices(NULL), + _pointVerticesCount(0), + //_vboShaderData(NULL), + _mousePressed(false), + _pitch(0), + _yaw(0), + _roll(0), + _numSegments(0), + _displayOnlyPartition(NO_PARTITION), + _totalPossibleElems(0), + _numElemsDrawn(0), + _useBoundingVolumes(true) +{ + gettimeofday(&_applicationStartupTime, NULL); + _appStartTickCount = usecTimestampNow(); + + _globalSvoViewerObj = this; + + //ui.setupUi(this); + _window->setWindowTitle("SvoViewer"); + _window->resize(1280,720); + + _window->setCentralWidget(_glWidget); + + DebugPrint("Window initialized\n"); + + _window->setVisible(true); + _glWidget->setFocusPolicy(Qt::StrongFocus); + _glWidget->setFocus(); + _glWidget->setMouseTracking(true); + + + _currentShaderModel = RENDER_OPT_CULLED_POLYS; //RENDER_OPT_POLYS;// RENDER_CLASSIC_POLYS; //RENDER_POINTS;// + memset(&_renderFlags, 0, sizeof(_renderFlags)); + _renderFlags.useShadows = false; + + // Load the scene. + + // We want our corner voxels to be about 1/2 meter high, and our TREE_SCALE is in meters, so... + float voxelSize = 0.5f / TREE_SCALE; + + DebugPrint("Reading SVO file\n"); + + //H:\highfidelity\hifi-19509\build\interface\resources\voxels1A.svo + const int MAX_PATH = 1024; + char svoFileToRead[MAX_PATH] = "./voxels10.svo"; //"H:\\highfidelity\\hifi-19509\\build\\interface\\resources\\voxels10.svo" + if (argc > 1) strcpy(svoFileToRead, argv[1]); // Command line is arg 0 by default. + + //DebugPrint("Sizeof Octree element is %d\n", sizeof(OctreeElement)); + + quint64 readStart = usecTimestampNow(); + bool readSucceeded = _systemTree.readFromSVOFile(svoFileToRead); + DebugPrint("Done reading SVO file : %f seconds : ", (float)(usecTimestampNow() - readStart) / 1000.0f); + readSucceeded ? DebugPrint("Succeeded\n") : DebugPrint("Failed\n"); + + // this should exist... we just loaded it... + if (_systemTree.getVoxelAt(voxelSize, 0, voxelSize, voxelSize)) { + DebugPrint("corner point voxelSize, 0, voxelSize exists...\n"); + } else { + DebugPrint("corner point voxelSize, 0, voxelSize does not exists...\n"); + } + + _nodeCount = _systemTree.getOctreeElementsCount(); + DebugPrint("Nodes after loading file: %ld nodes\n", _nodeCount); + + // Initialize the display model we're using. + switch(_currentShaderModel) + { + case RENDER_NONE: + break; + case RENDER_POINTS: + _renderFlags.useVoxelShader = false; + _renderFlags.usePtShader = true; + if (!_ptRenderInitialized) InitializePointRenderSystem(); + break; + case RENDER_CLASSIC_POLYS: + _renderFlags.useVoxelShader = true; + _renderFlags.usePtShader = false; + if (!_voxelRenderInitialized) InitializeVoxelRenderSystem(); + break; + case RENDER_OPT_POLYS: + _renderFlags.useVoxelShader = true; + _renderFlags.usePtShader = false; + if (!_voxelOptRenderInitialized) InitializeVoxelOptRenderSystem(); + break; + case RENDER_OPT_CULLED_POLYS: + _renderFlags.useVoxelShader = true; + _renderFlags.usePtShader = false; + if (!_voxelOpt2RenderInitialized) InitializeVoxelOpt2RenderSystem(); + break; + } +} + +SvoViewer::~SvoViewer() +{ + //glDeleteBuffers(_pointVtxBuffer); // TODO :: add comprehensive cleanup!! + //glDeleteBuffers(1, _pointVtxBuffer); + //glDeleteBuffers(1, _pointColorBuffer); + + if (_pointVertices) delete [] _pointVertices; + if (_pointColors) delete [] _pointColors; + //if (_vboShaderData) delete [] _vboShaderData; + + StopUsingVoxelRenderSystem(); +} + +void SvoViewer::init() { + //_voxelShader.init(); + //_pointShader.init(); + _mouseX = _glWidget->width() / 2; + _mouseY = _glWidget->height() / 2; + QCursor::setPos(_mouseX, _mouseY); + _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); + _myCamera.setPosition(glm::vec3(0.0f, 0.0f, -5.0f)); + _myCamera.setNearClip(0.01f); + //_myCamera.setFarClip(500.0f * TREE_SCALE); + _myCamera.setFarClip(TREE_SCALE); + _myCamera.setFieldOfView(_fieldOfView); + _myCamera.lookAt(glm::vec3(0.0f,0.0f,0.0f)); + _myCamera.setAspectRatio((float)_width / (float) _height); + loadViewFrustum(_myCamera, _viewFrustum); +} + +void SvoViewer::initializeGL() +{ + int argc = 0; + glutInit(&argc, 0); + init(); + #ifdef WIN32 + GLenum err = glewInit(); + if (GLEW_OK != err) { + /* Problem: glewInit failed, something is seriously wrong. */ + DebugPrint("Error: %s\n", glewGetErrorString(err)); + } + DebugPrint("Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); + #endif + glViewport(0, 0, _width, _height); + glGetIntegerv(GL_VIEWPORT, _viewport); + //glEnable(GL_BLEND); + //glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); + //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glShadeModel(GL_SMOOTH); + //glEnable(GL_LIGHTING); + //glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + //// call our idle function whenever we can + idleTimer = new QTimer(this); + connect(idleTimer, SIGNAL(timeout()), SLOT(idle())); + idleTimer->start(0); + //_idleLoopStdev.reset(); + _lastTimeFpsUpdated = _lastTimeFpsUpdated = usecTimestampNow(); + float startupTime = (float)(_lastTimeFpsUpdated - _appStartTickCount) / 1000.0; + DebugPrint("Startup time: %4.2f seconds.", startupTime); + //// update before the first render + updateProjectionMatrix(_myCamera, true); + update(0.0f); + + UpdateOpt2BVFaceVisibility(); +} + +void SvoViewer::idle() { + quint64 tc = usecTimestampNow(); + // Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran + quint64 elapsed = tc - _lastTimeFrameUpdated; + //if (elapsed >= IDLE_SIMULATE_MSECS) + { + const float BIGGEST_DELTA_TIME_SECS = 0.25f; + update(glm::clamp((float)elapsed / 1000.f, 0.f, BIGGEST_DELTA_TIME_SECS)); + _glWidget->updateGL(); + // After finishing all of the above work, restart the idle timer, allowing 2ms to process events. + idleTimer->start(2); + _lastTimeFrameUpdated = tc; + } +} + + +void SvoViewer::paintGL() +{ + glClearColor( 0.f, 0.f, .3f, 0.f ); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glEnable(GL_LINE_SMOOTH); + + glViewport(0, 0, _width, _height); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glm::vec3 pos = _myCamera.getPosition(); + glm::vec3 target = _myCamera.getTargetPosition(); + updateProjectionMatrix(_myCamera, true); + + // save matrix + glGetDoublev(GL_PROJECTION_MATRIX, _projectionMatrix); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + gluLookAt(pos.x, pos.y, pos.z, target.x, target.y, target.z, 0, 1, 0); + + glGetDoublev(GL_MODELVIEW_MATRIX, _modelviewMatrix); + + //glFrontFace(GL_CW); + + glPointSize(5.0); + + glColor3f(1.0, 1.0, 1.0); + glBegin(GL_POINTS); + glVertex3f(0,0,0); + glVertex3f(1,0,0); + glVertex3f(-1,0,0); + glVertex3f(0,1,0); + glVertex3f(0,-1,0); + glVertex3f(0,0,1); + glVertex3f(0,0,-1); + glEnd(); + + switch(_currentShaderModel) + { + case RENDER_NONE: + // Nothing to do! + break; + case RENDER_POINTS: + RenderTreeSystemAsPoints(); + break; + case RENDER_CLASSIC_POLYS: + RenderTreeSystemAsVoxels(); + break; + case RENDER_OPT_POLYS: + RenderTreeSystemAsOptVoxels(); + break; + case RENDER_OPT_CULLED_POLYS: + RenderTreeSystemAsOpt2Voxels(); + break; + } + + _frameCount++; + + // Print out some statistics. + + // Update every x seconds for more stability + quint64 tc = usecTimestampNow(); + quint64 interval = tc - _lastTimeFpsUpdated; +#define FPS_UPDATE_TIME_INTERVAL 2 + if (interval > 1000 * FPS_UPDATE_TIME_INTERVAL) + { + int numFrames = _frameCount - _lastTrackedFrameCount; + _fps = (float)numFrames / (float)(FPS_UPDATE_TIME_INTERVAL); + _lastTrackedFrameCount = _frameCount; + _lastTimeFpsUpdated = tc; + } + PrintToScreen((_width / 3) * 2, 10, "FPS is : %f", _fps ); + PrintToScreen(10, 10, "Camera Pos : %f %f %f", pos.x, pos.y, pos.z); + PrintToScreen(10, 30, "Drawing %d of %d (%% %f) total elements", _numElemsDrawn, _totalPossibleElems, ((float)_numElemsDrawn / (float)_totalPossibleElems) * 100.0); +} + +#define TEMP_STRING_BUFFER_MAX 1024 +#define SHADOW_OFFSET 2 +void SvoViewer::PrintToScreen(const int width, const int height, const char* szFormat, ...) +{ + char szBuff[TEMP_STRING_BUFFER_MAX]; + assert(strlen(szFormat) < TEMP_STRING_BUFFER_MAX); // > max_path. Use this only for small messages. + va_list arg; + va_start(arg, szFormat); + vsnprintf(szBuff, sizeof(szBuff), szFormat, arg); + va_end(arg); + // Passed in via char for convenience - convert to unsigned for glutBitmapString + unsigned char szUBuff[TEMP_STRING_BUFFER_MAX]; + memset(szUBuff, 0, sizeof(szUBuff)); + int len = strlen(szBuff); + for (int i = 0; i < len; i++) szUBuff[i] = (unsigned char)szBuff[i]; + + glEnable(GL_DEPTH_TEST); + + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, _width, 0, _height, 0, 1); + + glDisable(GL_LIGHTING); + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + glLoadIdentity(); + + glColor3f(.8f, .8f, .8f); // Matt:: reverse ordering once depth enabled. + glRasterPos2i(width, height); + //glutBitmapString(GLUT_BITMAP_HELVETICA_18, szUBuff); + + glColor3f(0.0f, 0.0f, 0.0f); + glRasterPos2i(width - SHADOW_OFFSET, height - SHADOW_OFFSET ); + //glutBitmapString(GLUT_BITMAP_HELVETICA_18, szUBuff); + + //glEnable(GL_LIGHTING); + glPopMatrix(); + glMatrixMode( GL_PROJECTION ); + glPopMatrix(); + glMatrixMode( GL_MODELVIEW ); + + glEnable(GL_DEPTH_TEST); +} + +void SvoViewer::update(float deltaTime){ +} + +void SvoViewer::resizeGL(int width, int height) +{ + + glViewport(0, 0, width, height); // shouldn't this account for the menu??? + glGetIntegerv(GL_VIEWPORT, _viewport); + _pixelCount = width * height; + _width = width; + _height = height; + + updateProjectionMatrix(_myCamera, true); + glLoadIdentity(); +} + +void SvoViewer::updateProjectionMatrix(Camera& camera, bool updateViewFrustum) +{ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + float left, right, bottom, top, nearVal, farVal; + glm::vec4 nearClipPlane, farClipPlane; + + // Tell our viewFrustum about this change, using the application camera + if (updateViewFrustum) { + loadViewFrustum(camera, _viewFrustum); + computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + } else { + ViewFrustum tempViewFrustum; + loadViewFrustum(camera, tempViewFrustum); + tempViewFrustum.computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + } + glFrustum(left, right, bottom, top, nearVal, farVal); + + // save matrix + //glGetDoublev(GL_PROJECTION_MATRIX, _projectionMatrix); + + glMatrixMode(GL_MODELVIEW); +} + + +///////////////////////////////////////////////////////////////////////////////////// +// loadViewFrustum() +// +// Description: this will load the view frustum bounds for EITHER the head +// or the "myCamera". +// +void SvoViewer::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) +{ + // We will use these below, from either the camera or head vectors calculated above + glm::vec3 position(camera.getPosition()); + float fov = camera.getFieldOfView(); + float nearClip = camera.getNearClip(); + float farClip = camera.getFarClip(); + float aspectRatio = camera.getAspectRatio(); + + glm::quat rotation = camera.getRotation(); + + // Set the viewFrustum up with the correct position and orientation of the camera + viewFrustum.setPosition(position); + viewFrustum.setOrientation(rotation); + + // Also make sure it's got the correct lens details from the camera + viewFrustum.setAspectRatio(aspectRatio); + viewFrustum.setFieldOfView(fov); + viewFrustum.setNearClip(nearClip); + viewFrustum.setFarClip(farClip); + viewFrustum.setEyeOffsetPosition(camera.getEyeOffsetPosition()); + viewFrustum.setEyeOffsetOrientation(camera.getEyeOffsetOrientation()); + + // Ask the ViewFrustum class to calculate our corners + viewFrustum.calculate(); +} + +void SvoViewer::computeOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, + float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) const +{ + + _viewFrustum.computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); +} + +void SvoViewer::updateCamera(float deltaTime) +{ + /*if (Menu::getInstance()->isOptionChecked(MenuOption::OffAxisProjection)) { + float xSign = _myCamera.getMode() == CAMERA_MODE_MIRROR ? 1.0f : -1.0f; + if (_faceshift.isActive()) { + const float EYE_OFFSET_SCALE = 0.025f; + glm::vec3 position = _faceshift.getHeadTranslation() * EYE_OFFSET_SCALE; + _myCamera.setEyeOffsetPosition(glm::vec3(position.x * xSign, position.y, -position.z)); + updateProjectionMatrix(); + } + }*/ +} + +void SvoViewer::setupWorldLight() +{ + // Setup 3D lights (after the camera transform, so that they are positioned in world space) + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); + + //glm::vec3 sunDirection = getSunDirection(); + GLfloat light_position0[] = {10.0, 10.0, -20.0, 0.0};//{ sunDirection.x, sunDirection.y, sunDirection.z, 0.0 }; + glLightfv(GL_LIGHT0, GL_POSITION, light_position0); + GLfloat ambient_color[] = { 0.7f, 0.7f, 0.8f }; + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_color); + GLfloat diffuse_color[] = { 0.8f, 0.7f, 0.7f }; + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_color); + + glLightfv(GL_LIGHT0, GL_SPECULAR, WHITE_SPECULAR_COLOR); + glMaterialfv(GL_FRONT, GL_SPECULAR, WHITE_SPECULAR_COLOR); + glMateriali(GL_FRONT, GL_SHININESS, 96); +} + +inline glm::vec3 MAD(glm::vec3 v1, float mult, glm::vec3 v2) +{ + return glm::vec3(v1.x * mult + v2.x, v1.y * mult + v2.y, v1.z * mult + v2.z); +} + +void SvoViewer::keyPressEvent(QKeyEvent* event) +{ + int keyval = event->key(); + + glm::vec3 lookAt = glm::normalize(_myCamera.getTargetPosition() - _myCamera.getPosition()); + glm::vec3 up = glm::vec3(0.0,1.0f,0.0f); + glm::vec3 right = glm::cross(lookAt, up); + glm::vec3 rotY; + switch (keyval) + { + case Qt::Key_W: + _myCamera.setPosition( MAD(lookAt, .2, _myCamera.getPosition()) ); + _myCamera.setTargetPosition( MAD(lookAt, .2, _myCamera.getTargetPosition()) ); + break; + case Qt::Key_S: + _myCamera.setPosition( MAD(lookAt, -.2, _myCamera.getPosition()) ); + _myCamera.setTargetPosition( MAD(lookAt, -.2, _myCamera.getTargetPosition()) ); + break; + case Qt::Key_A: + _myCamera.setPosition( MAD(right, -.2, _myCamera.getPosition()) ); + _myCamera.setTargetPosition( MAD(right, -.2, _myCamera.getTargetPosition()) ); + break; + case Qt::Key_D: + _myCamera.setPosition( MAD(right, .2, _myCamera.getPosition()) ); + _myCamera.setTargetPosition( MAD(right, .2, _myCamera.getTargetPosition()) ); + break; + case Qt::Key_R: + _myCamera.setPosition( MAD(up, .2, _myCamera.getPosition()) ); + _myCamera.setTargetPosition( MAD(up, .2, _myCamera.getTargetPosition()) ); + break; + case Qt::Key_F: + _myCamera.setPosition( MAD(up, -.2, _myCamera.getPosition()) ); + _myCamera.setTargetPosition( MAD(up, -.2, _myCamera.getTargetPosition()) ); + break; + case Qt::Key_Q: // rotate left + _yaw += 10; + _myCamera.setTargetRotation(glm::quat(glm::radians(glm::vec3(_pitch, _yaw, _roll)))); + break; + case Qt::Key_E: // rotate right + _yaw -= 10; + _myCamera.setTargetRotation(glm::quat(glm::radians(glm::vec3(_pitch, _yaw, _roll)))); + break; + case Qt::Key_B: // rotate right + _useBoundingVolumes ^= 1; + break; + default: + if (keyval >= Qt::Key_0 && keyval <= Qt::Key_9) + { + int newPartitionToDisplay = keyval - Qt::Key_0; + if (_displayOnlyPartition == newPartitionToDisplay) _displayOnlyPartition = NO_PARTITION; + else _displayOnlyPartition = newPartitionToDisplay; + } + + + } + loadViewFrustum(_myCamera, _viewFrustum); + UpdateOpt2BVFaceVisibility(); +} + + +void SvoViewer::keyReleaseEvent(QKeyEvent* event) {} + +void SvoViewer::mouseMoveEvent(QMouseEvent* event) +{ + int deltaX = event->x() - _mouseX; + int deltaY = event->y() - _mouseY; + _mouseX = event->x(); + _mouseY = event->y(); + + + loadViewFrustum(_myCamera, _viewFrustum); +} + +void SvoViewer::mousePressEvent(QMouseEvent* event) +{ + if (event->button() == Qt::LeftButton) + { + _mouseX = event->x(); + _mouseY = event->y(); + _mouseDragStartedX = _mouseX; + _mouseDragStartedY = _mouseY; + _mousePressed = true; + } + +} + +void SvoViewer::mouseReleaseEvent(QMouseEvent* event) { + +} + + +void SvoViewer::updateMouseRay() +{ + // if the mouse pointer isn't visible, act like it's at the center of the screen + float x = 0.5f, y = 0.5f; + if (!_mouseHidden) { + x = _mouseX / (float)_glWidget->width(); + y = _mouseY / (float)_glWidget->height(); + } + _viewFrustum.computePickRay(x, y, _mouseRayOrigin, _mouseRayDirection); + + // adjust for mirroring + if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { + glm::vec3 mouseRayOffset = _mouseRayOrigin - _viewFrustum.getPosition(); + _mouseRayOrigin -= 2.0f * (_viewFrustum.getDirection() * glm::dot(_viewFrustum.getDirection(), mouseRayOffset) + + _viewFrustum.getRight() * glm::dot(_viewFrustum.getRight(), mouseRayOffset)); + _mouseRayDirection -= 2.0f * (_viewFrustum.getDirection() * glm::dot(_viewFrustum.getDirection(), _mouseRayDirection) + + _viewFrustum.getRight() * glm::dot(_viewFrustum.getRight(), _mouseRayDirection)); + } +} + + +// Stub for the full function. +bool SvoViewer::isVisibleBV(AABoundingVolume * volume, Camera * camera, ViewFrustum * frustum) +{ + //if (pos.z >= volume->getBound(2,AABF_HIGH)) return false; + // Project all the points into screen space. + AA2DBoundingVolume twoDBounds; + float xvals[2] = {9999.0, -1.0}; + float yvals[2] = {9999.0, -1.0}; + //project all bv points into screen space. + GLdouble scr[3]; + for (int i = 0; i < 8; i++) + { + glm::vec3 pt = volume->getCorner((BoxVertex)i); + gluProject((GLdouble)pt.x, (GLdouble)pt.y, (GLdouble)pt.z, _modelviewMatrix, _projectionMatrix, _viewport, &scr[0], &scr[1], &scr[2]); + if (scr[2] > 0 && scr[2] < 1) + { + float tPt[2] = {(float)scr[0], (float)scr[1]}; + twoDBounds.AddToSet(tPt); + } + } + bool inVisibleSpace = twoDBounds.clipToRegion(0, 0, _width, _height); + return inVisibleSpace; +} + +float SvoViewer::visibleAngleSubtended(AABoundingVolume * volume, Camera * camera, ViewFrustum * frustum) +{ + AA2DBoundingVolume twoDBounds; + float xvals[2] = {9999.0, -1.0}; + float yvals[2] = {9999.0, -1.0}; + //project all bv points into screen space. + GLdouble scr[3]; + for (int i = 0; i < 8; i++) + { + glm::vec3 pt = volume->getCorner((BoxVertex)i); + gluProject((GLdouble)pt.x, (GLdouble)pt.y, (GLdouble)pt.z, _modelviewMatrix, _projectionMatrix, _viewport, &scr[0], &scr[1], &scr[2]); + if (scr[2] > 0 && scr[2] < 1) + { + float tPt[2] = {(float)scr[0], (float)scr[1]}; + twoDBounds.AddToSet(tPt); + } + } + twoDBounds.clipToRegion(0, 0, _width, _height); + float area = twoDBounds.getWidth() * twoDBounds.getHeight(); + if (area < 1) return 0.0; + return area / (float)_pixelCount; +} + +void SvoViewer::DebugPrint(const char* szFormat, ...) +{ + /** + char szBuff[TEMP_STRING_BUFFER_MAX]; + assert(strlen(szFormat) < TEMP_STRING_BUFFER_MAX); // > max_path. Use this only for small messages. + va_list arg; + va_start(arg, szFormat); + vsnprintf(szBuff, sizeof(szBuff), TEMP_STRING_BUFFER_MAX-100, szFormat, arg); + va_end(arg); + **/ + + qDebug(szFormat); +} + +GLubyte SvoViewer::PrintGLErrorCode() +{ + GLubyte err = glGetError(); + if( err != GL_NO_ERROR ) //DebugPrint("GL Error! : %x\n", err); + DebugPrint("Error! : %u, %s\n", (unsigned int)err, gluErrorString(err)); + return err; +} \ No newline at end of file diff --git a/SvoViewer/src/svoviewer.h b/SvoViewer/src/svoviewer.h new file mode 100755 index 0000000000..af4732db81 --- /dev/null +++ b/SvoViewer/src/svoviewer.h @@ -0,0 +1,317 @@ +#ifndef SVOVIEWER_H +#define SVOVIEWER_H + +#pragma once + +#include +#include + +/*** +#define GL_GLEXT_PROTOTYPES 1 +#define GLEW_STATIC +#include + ***/ +#include "globals.h" +#include "AABoundingVolume.h" + + + +enum SVOViewerShaderModel +{ + RENDER_NONE, + RENDER_POINTS, + RENDER_CLASSIC_POLYS, + RENDER_OPT_POLYS, + RENDER_OPT_CULLED_POLYS, +}; + +enum CubeOrdering +{ + CUBE_TOP, + CUBE_BOTTOM, + CUBE_LEFT, + CUBE_RIGHT, + CUBE_FRONT, + CUBE_BACK, + NUM_CUBE_FACES +}; + +struct ViewFrustumOffset { + float yaw; + float pitch; + float roll; + float distance; + float up; +}; + +struct RenderFlags +{ + bool ptRenderDirty : 1; + bool voxelRenderDirty : 1; + bool voxelOptRenderDirty : 1; + bool usePtShader : 1; + bool useVoxelShader : 1; + bool useVoxelOptShader : 1; + bool useShadows : 1; +}; + +struct Vertex +{ + glm::vec3 position; + unsigned char color[4]; +}; + +enum VtxAttributes +{ + ATTRIB_POSITION, + ATTRIB_COLOR, + ATTRIB_TEXTURE +}; + +struct VoxelDimIdxSet +{ + GLuint idxIds[NUM_CUBE_FACES]; // Id for each voxel face + GLuint idxCount[NUM_CUBE_FACES]; // count for each voxel face. + GLuint* idxBuff[NUM_CUBE_FACES]; // actual index buffers for each voxel face + GLuint elemCount[NUM_CUBE_FACES]; + AABoundingVolume bounds[NUM_CUBE_FACES]; // Super efficient bounding set here. + bool visibleFace[NUM_CUBE_FACES]; +}; + +struct VisibleFacesData +{ + int count; + glm::vec3 * ptList; +}; + +struct FindNumLeavesData +{ + int numLeaves; +}; + +//#define MAX_VOXELS 4000000 +#define MAX_VOXELS 8000000 +#define REASONABLY_LARGE_BUFFER 10000 + +#define MAX_NUM_OCTREE_PARTITIONS 20 +#define MAX_NUM_VBO_ALLOWED MAX_NUM_OCTREE_PARTITIONS * NUM_CUBE_FACES +#define NO_PARTITION -1 + +class VoxelOptRenderer : public OctreeRenderer { +}; + +class SvoViewer : public QApplication +{ + Q_OBJECT + +public: + static SvoViewer* getInstance() { return static_cast(QCoreApplication::instance()); } + + SvoViewer(int& argc, char** argv, QWidget *parent = 0); + ~SvoViewer(); + + + void initializeGL(); + void paintGL(); + void resizeGL(int width, int height); + void init(); + void update(float deltaTime); + void updateMouseRay(); + void updateProjectionMatrix(Camera& camera, bool updateViewFrustum); + void updateCamera(float deltaTime); + void loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum); + ViewFrustum* getViewFrustum() { return &_viewFrustum; } + void computeOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) const ; + void setupWorldLight(); + glm::vec2 getViewportDimensions() const{ return glm::vec2(_width,_height); } + + // User Tweakable LOD Items + void autoAdjustLOD(float currentFPS); + void setVoxelSizeScale(float sizeScale); + float getVoxelSizeScale() const { return _voxelSizeScale; } + void setBoundaryLevelAdjust(int boundaryLevelAdjust); + int getBoundaryLevelAdjust() const { return _boundaryLevelAdjust; } + + bool getIsPointShader(){ return _renderFlags.usePtShader; } + void setIsPointShader(const bool b){ _renderFlags.usePtShader = b; } + bool getIsVoxelShader(){ return _renderFlags.useVoxelShader; } + void setIsVoxelShader(const bool b){ _renderFlags.useVoxelShader = b; } + bool getIsVoxelOptShader(){ return _renderFlags.useVoxelOptShader; } + void setIsVoxelOptShader(const bool b){ _renderFlags.useVoxelOptShader = b; } + void setUseVoxelTextures(const bool b){_useVoxelTextures = b; } + bool getUseVoxelTextures(){ return _useVoxelTextures; } + void setUseShadows(const bool b){ _renderFlags.useShadows = b; } + bool getUseShadows(){ return _renderFlags.useShadows; } + + //VoxelShader* getVoxelShader(){ return &_voxelShader; } + //PointShader* getPointShader(){ return &_pointShader; } + + void keyPressEvent(QKeyEvent* event); + void keyReleaseEvent(QKeyEvent* event); + + void mouseMoveEvent(QMouseEvent* event); + void mousePressEvent(QMouseEvent* event); + void mouseReleaseEvent(QMouseEvent* event); + + void PrintToScreen(const int width, const int height, const char* szFormat, ...); + static void DebugPrint(const char* szFormat, ...); // utility function. + static GLubyte PrintGLErrorCode(); + + // Some helper functions. + GLubyte SetupGlVBO(GLuint * id, int sizeInBytes, GLenum target, GLenum usage, void * dataUp ); + static glm::vec3 computeQuickAndDirtyQuadCenter(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2, glm::vec3 p3); + bool isVisibleBV(AABoundingVolume * volume, Camera * camera, ViewFrustum * frustum); + float visibleAngleSubtended(AABoundingVolume * volume, Camera * camera, ViewFrustum * frustum); + static int ptCompFunc(const void * a, const void * b); + static int ptCloseEnough(const void * a, const void * b); + static int binVecSearch(glm::vec3 searchVal, glm::vec3* list, int count, int * found); + bool parameterizedRayPlaneIntersection(const glm::vec3 origin, const glm::vec3 direction, const glm::vec3 planePt, const glm::vec3 planeNormal, float *t); + +protected: + void InitializePointRenderSystem(); + void setupFaceIndices(GLuint& faceVBOID, GLubyte faceIdentityIndices[]); + void InitializeVoxelRenderSystem(); + void InitializeVoxelOptRenderSystem(); + void InitializeVoxelOpt2RenderSystem(); + void StopUsingPointRenderSystem(); + void StopUsingVoxelRenderSystem(); + void StopUsingVoxelOptRenderSystem(); + void StopUsingVoxelOpt2RenderSystem(); + void UpdateOpt2BVFaceVisibility(); + + + void RenderTreeSystemAsPoints(); + void RenderTreeSystemAsVoxels(); + void RenderTreeSystemAsOptVoxels(); + void RenderTreeSystemAsOpt2Voxels(); + + // Tree traversal functions. + static bool PointRenderAssemblePerVoxel(OctreeElement* node, void* extraData); + static bool VoxelRenderAssemblePerVoxel(OctreeElement* node, void* extraData); + static bool VoxelOptRenderAssemblePerVoxel(OctreeElement* node, void* extraData); + static bool VoxelOpt2RenderAssemblePerVoxel(OctreeElement* node, void* extraData); + static bool FindNumLeaves(OctreeElement* node, void* extraData); + static bool TrackVisibleFaces(OctreeElement* node, void* extraData); + + +private slots: + void idle(); + +private: + //Ui::SvoViewerClass ui; + + QMainWindow* _window; + int _width; + int _height; + int _pixelCount; + QGLWidget* _glWidget; + + //VoxelSystem _voxels; + VoxelTree _systemTree; + unsigned long _nodeCount; + unsigned int _leafCount; + + ViewFrustum _viewFrustum; + Camera _myCamera; // My view onto the world + float _pitch, _yaw, _roll; + + int _mouseX; + int _mouseY; + int _mouseDragStartedX; + int _mouseDragStartedY; + bool _mousePressed; + quint64 _lastMouseMove; + bool _mouseHidden; + bool _seenMouseMove; + + glm::vec3 _mouseRayOrigin; + glm::vec3 _mouseRayDirection; + + glm::mat4 _untranslatedViewMatrix; + glm::vec3 _viewMatrixTranslation; + GLdouble _projectionMatrix[16]; + GLdouble _modelviewMatrix[16]; + GLint _viewport[4]; + + SVOViewerShaderModel _currentShaderModel; + //VoxelShader _voxelShader; + //PointShader _pointShader; + + // Display options + int _displayOnlyPartition; + + // Frame Rate Measurement + int _frameCount; + int _lastTrackedFrameCount; + float _fps; + timeval _applicationStartupTime; + quint64 _appStartTickCount; + quint64 _lastTimeFpsUpdated; + quint64 _lastTimeFrameUpdated; + + // Render variables. + bool _ptRenderInitialized; + bool _voxelRenderInitialized; + bool _voxelOptRenderInitialized; + bool _voxelOpt2RenderInitialized; + + GLuint _vertexShader; + GLuint _pixelShader; + GLuint _geometryShader; + GLuint _linkProgram; + + // Vars for RENDER_POINTS + GLuint _pointVtxBuffer; + GLuint _pointColorBuffer; + glm::vec3* _pointVertices; + unsigned char* _pointColors; + int _pointVerticesCount; + + // Vars for RENDER_CLASSIC_POLYS + GLuint _vboVerticesID; + GLuint _vboColorsID; + GLuint _vboIndicesIds[NUM_CUBE_FACES]; + GLuint* _vboIndices[NUM_CUBE_FACES]; + //VoxelShaderVBOData* _vboShaderData; // may not need. + glm::vec3* _readVerticesArray; + unsigned char* _readColorsArray; + GLuint* _readIndicesArray; + + + // Vars for RENDER_OPT_POLYS + // Allow for primitive first level sorting at the moment. + GLuint _vboOVerticesIds[MAX_NUM_VBO_ALLOWED]; + glm::vec3* _vboOVertices[MAX_NUM_VBO_ALLOWED]; + GLuint _vboOIndicesIds[MAX_NUM_VBO_ALLOWED]; + GLuint* _vboOIndices[MAX_NUM_VBO_ALLOWED]; + GLuint _numChildNodeLeaves[MAX_NUM_VBO_ALLOWED]; + OctreeElement * _segmentNodeReferences[MAX_NUM_OCTREE_PARTITIONS]; + AABoundingVolume _segmentBoundingVolumes[MAX_NUM_OCTREE_PARTITIONS]; + int _segmentElemCount[MAX_NUM_OCTREE_PARTITIONS]; + unsigned int _numSegments; + Vertex * _readVertexStructs; + + // Vars for RENDER_OPT_CULLED_POLYS + // Use vtx vars from opt_polys version. + VoxelDimIdxSet _segmentIdxBuffers[MAX_NUM_OCTREE_PARTITIONS]; + bool _useBoundingVolumes; + + + int _numElemsDrawn; + int _totalPossibleElems; + + RenderFlags _renderFlags; + + ViewFrustumOffset _viewFrustumOffset; + int _maxVoxels; + float _voxelSizeScale; + int _boundaryLevelAdjust; + float _fieldOfView; /// in Degrees + bool _useVoxelTextures; + +}; + +//Extern hack since this wasn't built with global linking to old project in mind. +extern SvoViewer * _globalSvoViewerObj; + +#endif // SVOVIEWER_H diff --git a/SvoViewer/src/svoviewer.qrc b/SvoViewer/src/svoviewer.qrc new file mode 100755 index 0000000000..1fbe02aea2 --- /dev/null +++ b/SvoViewer/src/svoviewer.qrc @@ -0,0 +1,4 @@ + + + + diff --git a/SvoViewer/src/svoviewer.ui b/SvoViewer/src/svoviewer.ui new file mode 100755 index 0000000000..0bd1cabbae --- /dev/null +++ b/SvoViewer/src/svoviewer.ui @@ -0,0 +1,29 @@ + + SvoViewerClass + + + SvoViewerClass + + + + 0 + 0 + 600 + 400 + + + + SvoViewer + + + + + + + + + + + + + From 6bc71f899c3c359989a3a0a75eec297c95bead91 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Feb 2014 00:09:15 -0800 Subject: [PATCH 2/3] removed unused code --- SvoViewer/src/ProgramObject.cpp | 20 -------------------- SvoViewer/src/ProgramObject.h | 25 ------------------------- 2 files changed, 45 deletions(-) delete mode 100755 SvoViewer/src/ProgramObject.cpp delete mode 100755 SvoViewer/src/ProgramObject.h diff --git a/SvoViewer/src/ProgramObject.cpp b/SvoViewer/src/ProgramObject.cpp deleted file mode 100755 index 5108c15068..0000000000 --- a/SvoViewer/src/ProgramObject.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// ProgramObject.cpp -// interface -// -// Created by Andrzej Kapolka on 5/7/13. -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. - -#include "ProgramObject.h" - -ProgramObject::ProgramObject(QObject* parent) : QGLShaderProgram(parent) { -} - -void ProgramObject::setUniform(int location, const glm::vec3& value) { - setUniformValue(location, value.x, value.y, value.z); -} - -void ProgramObject::setUniform(const char* name, const glm::vec3& value) { - setUniformValue(name, value.x, value.y, value.z); -} - diff --git a/SvoViewer/src/ProgramObject.h b/SvoViewer/src/ProgramObject.h deleted file mode 100755 index 78f07b7a1b..0000000000 --- a/SvoViewer/src/ProgramObject.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// ProgramObject.h -// interface -// -// Created by Andrzej Kapolka on 5/7/13. -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// - -#ifndef __interface__ProgramObject__ -#define __interface__ProgramObject__ - -#include - -#include - -class ProgramObject : public QGLShaderProgram { -public: - - ProgramObject(QObject* parent = 0); - - void setUniform(int location, const glm::vec3& value); - void setUniform(const char* name, const glm::vec3& value); -}; - -#endif /* defined(__interface__ProgramObject__) */ From de0f320c022f1d9c6b789413d8d50f9835d5bc2d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Feb 2014 00:14:47 -0800 Subject: [PATCH 3/3] added copyright to files --- SvoViewer/src/AABoundingVolume.h | 2 ++ SvoViewer/src/GLCanvas.cpp | 3 +-- SvoViewer/src/GLCanvas.h | 4 +--- SvoViewer/src/Render.cpp | 8 ++++++++ SvoViewer/src/Render.h | 6 ++++++ SvoViewer/src/Render2.cpp | 7 +++++++ SvoViewer/src/globals.cpp | 5 +++++ SvoViewer/src/globals.h | 5 +++++ SvoViewer/src/main.cpp | 6 ++++++ SvoViewer/src/svoviewer.cpp | 7 +++++++ SvoViewer/src/svoviewer.h | 8 ++++++++ 11 files changed, 56 insertions(+), 5 deletions(-) diff --git a/SvoViewer/src/AABoundingVolume.h b/SvoViewer/src/AABoundingVolume.h index 0fa98a9034..399c2fa68c 100644 --- a/SvoViewer/src/AABoundingVolume.h +++ b/SvoViewer/src/AABoundingVolume.h @@ -2,6 +2,8 @@ // AABoundingVolume.h - Axis Aligned Bounding Volumes // hifi // +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// #ifndef _AABOUNDING_VOLUME_ #define _AABOUNDING_VOLUME_ diff --git a/SvoViewer/src/GLCanvas.cpp b/SvoViewer/src/GLCanvas.cpp index 0e2772a5b8..b77105ec19 100755 --- a/SvoViewer/src/GLCanvas.cpp +++ b/SvoViewer/src/GLCanvas.cpp @@ -2,8 +2,7 @@ // GLCanvas.cpp // hifi // -// Created by Stephen Birarda on 8/14/13. -// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. // #include "SvoViewer.h" diff --git a/SvoViewer/src/GLCanvas.h b/SvoViewer/src/GLCanvas.h index 0f0cb5c7d0..d5a075ee9a 100644 --- a/SvoViewer/src/GLCanvas.h +++ b/SvoViewer/src/GLCanvas.h @@ -1,9 +1,7 @@ // // GLCanvas.h -// hifi // -// Created by Stephen Birarda on 8/14/13. -// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. // #ifndef __hifi__GLCanvas__ diff --git a/SvoViewer/src/Render.cpp b/SvoViewer/src/Render.cpp index 39a7940b4c..2e4121a660 100755 --- a/SvoViewer/src/Render.cpp +++ b/SvoViewer/src/Render.cpp @@ -1,3 +1,11 @@ +// +// Render.cpp +// +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// + + + #include "svoviewer.h" //////////////////////////////////////////////////// diff --git a/SvoViewer/src/Render.h b/SvoViewer/src/Render.h index e69de29bb2..760d726e5e 100755 --- a/SvoViewer/src/Render.h +++ b/SvoViewer/src/Render.h @@ -0,0 +1,6 @@ +// +// Render.h +// +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// + diff --git a/SvoViewer/src/Render2.cpp b/SvoViewer/src/Render2.cpp index d15e9d6b78..3e633d6440 100755 --- a/SvoViewer/src/Render2.cpp +++ b/SvoViewer/src/Render2.cpp @@ -1,3 +1,10 @@ +// +// Render2.cpp +// +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// + + #include "svoviewer.h" ///////////////////////////////////////////////////////////////////////////// diff --git a/SvoViewer/src/globals.cpp b/SvoViewer/src/globals.cpp index 766cd6e6d3..861f6ae4de 100755 --- a/SvoViewer/src/globals.cpp +++ b/SvoViewer/src/globals.cpp @@ -1,3 +1,8 @@ +// +// globals.cpp +// +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// #include "globals.h" diff --git a/SvoViewer/src/globals.h b/SvoViewer/src/globals.h index 4357749d33..b20fa3e2a5 100755 --- a/SvoViewer/src/globals.h +++ b/SvoViewer/src/globals.h @@ -1,3 +1,8 @@ +// +// globals.h +// +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// #pragma once diff --git a/SvoViewer/src/main.cpp b/SvoViewer/src/main.cpp index 23cc6c7ba4..8287e836e2 100755 --- a/SvoViewer/src/main.cpp +++ b/SvoViewer/src/main.cpp @@ -1,3 +1,9 @@ +// +// main.cpp +// +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// + #include "svoviewer.h" #include diff --git a/SvoViewer/src/svoviewer.cpp b/SvoViewer/src/svoviewer.cpp index 88e75b5e42..a09ce203b8 100755 --- a/SvoViewer/src/svoviewer.cpp +++ b/SvoViewer/src/svoviewer.cpp @@ -1,3 +1,10 @@ +// +// svoviewer.cpp +// +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// + + #include "svoviewer.h" #include "GLCanvas.h" diff --git a/SvoViewer/src/svoviewer.h b/SvoViewer/src/svoviewer.h index af4732db81..e549115509 100755 --- a/SvoViewer/src/svoviewer.h +++ b/SvoViewer/src/svoviewer.h @@ -1,3 +1,11 @@ +// +// svoviewer.h +// +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// + + + #ifndef SVOVIEWER_H #define SVOVIEWER_H