diff --git a/CMakeLists.txt b/CMakeLists.txt index 77de1ee14..1f0cc2b57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,20 +40,20 @@ cmake_minimum_required( VERSION 2.8 ) PROJECT( Assimp ) # All supported options ############################################### -OPTION( BUILD_SHARED_LIBS - "Build package with shared libraries." +OPTION( BUILD_SHARED_LIBS + "Build package with shared libraries." ON ) OPTION( ASSIMP_DOUBLE_PRECISION "Set to ON to enable double precision processing" OFF ) -OPTION( ASSIMP_OPT_BUILD_PACKAGES - "Set to ON to generate CPack configuration files and packaging targets" +OPTION( ASSIMP_OPT_BUILD_PACKAGES + "Set to ON to generate CPack configuration files and packaging targets" OFF ) -OPTION( ASSIMP_ANDROID_JNIIOSYSTEM - "Android JNI IOSystem support is active" +OPTION( ASSIMP_ANDROID_JNIIOSYSTEM + "Android JNI IOSystem support is active" OFF ) OPTION( ASSIMP_NO_EXPORT @@ -77,6 +77,7 @@ OPTION ( ASSIMP_BUILD_TESTS ON ) IF(MSVC) + set (CMAKE_PREFIX_PATH "D:\\libs\\devil") OPTION( ASSIMP_INSTALL_PDB "Install MSVC debug files." ON @@ -336,10 +337,10 @@ IF ( ASSIMP_BUILD_ASSIMP_TOOLS ) # Why here? Maybe user do not want Qt viewer and have no Qt. # Why assimp_qt_viewer/CMakeLists.txt still contain similar check? # Because viewer can be build independently of Assimp. - FIND_PACKAGE(Qt5 QUIET) + FIND_PACKAGE(Qt5Widgets QUIET) FIND_PACKAGE(DevIL QUIET) FIND_PACKAGE(OpenGL QUIET) - IF ( Qt5_FOUND AND IL_FOUND AND OPENGL_FOUND) + IF ( Qt5Widgets_FOUND AND IL_FOUND AND OPENGL_FOUND) ADD_SUBDIRECTORY( tools/assimp_qt_viewer/ ) ELSE() SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "") @@ -356,7 +357,7 @@ IF ( ASSIMP_BUILD_ASSIMP_TOOLS ) ENDIF (NOT OPENGL_FOUND) MESSAGE (WARNING "Build of assimp_qt_viewer is disabled. Unsatisfied dendencies: ${ASSIMP_QT_VIEWER_DEPENDENCIES}") - ENDIF ( Qt5_FOUND AND IL_FOUND AND OPENGL_FOUND) + ENDIF ( Qt5Widgets_FOUND AND IL_FOUND AND OPENGL_FOUND) ENDIF ( ASSIMP_BUILD_ASSIMP_TOOLS ) IF ( ASSIMP_BUILD_SAMPLES) diff --git a/tools/assimp_qt_viewer/CMakeLists.txt b/tools/assimp_qt_viewer/CMakeLists.txt index 26f43c156..2985d6e30 100644 --- a/tools/assimp_qt_viewer/CMakeLists.txt +++ b/tools/assimp_qt_viewer/CMakeLists.txt @@ -3,12 +3,12 @@ set(PROJECT_VERSION "") cmake_minimum_required(VERSION 2.6) -find_package(Qt4 REQUIRED) +find_package(Qt5Widgets REQUIRED) find_package(DevIL REQUIRED) find_package(OpenGL REQUIRED) include_directories( - ${QT_INCLUDES} + ${Qt5Widgets_INCLUDES} ${Assimp_SOURCE_DIR}/include ${Assimp_SOURCE_DIR}/code ${CMAKE_CURRENT_BINARY_DIR} @@ -21,15 +21,16 @@ link_directories(${Assimp_BINARY_DIR}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pedantic -Wall") set(assimp_qt_viewer_SRCS main.cpp loggerview.cpp glview.cpp mainwindow.cpp) -qt4_wrap_ui(UISrcs mainwindow.ui) -qt4_wrap_cpp(MOCrcs mainwindow.hpp glview.hpp) +qt5_wrap_ui(UISrcs mainwindow.ui) +qt5_wrap_cpp(MOCrcs mainwindow.hpp glview.hpp) add_executable(${PROJECT_NAME} ${assimp_qt_viewer_SRCS} ${UISrcs} ${MOCrcs}) target_link_libraries(${PROJECT_NAME} ${QT_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY} ${IL_LIBRARIES} ${OPENGL_LIBRARIES} assimp) +qt5_use_modules(${PROJECT_NAME} Widgets OpenGL) if(WIN32) # Check if we are on Windows if(MSVC) # Check if we are using the Visual Studio compiler - set_target_properties(TestProject PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS") + #set_target_properties(TestProject PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS") elseif(CMAKE_COMPILER_IS_GNUCXX) # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested else() diff --git a/tools/assimp_qt_viewer/glview.cpp b/tools/assimp_qt_viewer/glview.cpp index a51e8abb7..7203f8a5d 100644 --- a/tools/assimp_qt_viewer/glview.cpp +++ b/tools/assimp_qt_viewer/glview.cpp @@ -9,7 +9,7 @@ #include // Header files, DevIL. -#include +#include // Header files, Assimp. #include @@ -56,15 +56,15 @@ void CGLView::SHelper_Camera::SetDefault() void CGLView::Material_Apply(const aiMaterial* pMaterial) { -GLfloat tcol[4]; -aiColor4D taicol; -unsigned int max; -int ret1, ret2; -int texture_index = 0; -aiString texture_path; + GLfloat tcol[4]; + aiColor4D taicol; + unsigned int max; + int ret1, ret2; + int texture_index = 0; + aiString texture_path; -auto set_float4 = [](float f[4], float a, float b, float c, float d) { f[0] = a, f[1] = b, f[2] = c, f[3] = d; }; -auto color4_to_float4 = [](const aiColor4D *c, float f[4]) { f[0] = c->r, f[1] = c->g, f[2] = c->b, f[3] = c->a; }; + auto set_float4 = [](float f[4], float a, float b, float c, float d) { f[0] = a, f[1] = b, f[2] = c, f[3] = d; }; + auto color4_to_float4 = [](const aiColor4D *c, float f[4]) { f[0] = c->r, f[1] = c->g, f[2] = c->b, f[3] = c->a; }; ///TODO: cache materials // Disable color material because glMaterial is used. @@ -158,124 +158,127 @@ std::list mat_list; } while(node_cur != nullptr); } - // multiplicate all matrices in reverse order - for(std::list::reverse_iterator rit = mat_list.rbegin(); rit != mat_list.rend(); rit++) pOutMatrix = pOutMatrix * (*rit); + // multiply all matrices in reverse order + for ( std::list::reverse_iterator rit = mat_list.rbegin(); rit != mat_list.rend(); rit++) + { + pOutMatrix = pOutMatrix * (*rit); + } } void CGLView::ImportTextures(const QString& pScenePath) { -auto LoadTexture = [&](const QString& pFileName) -> bool ///TODO: IME texture mode, operation. -{ -ILboolean success; -GLuint id_ogl_texture;// OpenGL texture ID. + auto LoadTexture = [&](const QString& pFileName) -> bool ///TODO: IME texture mode, operation. + { + ILboolean success; + GLuint id_ogl_texture;// OpenGL texture ID. - if(!pFileName.startsWith(AI_EMBEDDED_TEXNAME_PREFIX)) - { - ILuint id_image;// DevIL image ID. - QString basepath = pScenePath.left(pScenePath.lastIndexOf('/') + 1);// path with '/' at the end. - QString fileloc = (basepath + pFileName); + if(!pFileName.startsWith(AI_EMBEDDED_TEXNAME_PREFIX)) + { + ILuint id_image;// DevIL image ID. + QString basepath = pScenePath.left(pScenePath.lastIndexOf('/') + 1);// path with '/' at the end. + QString fileloc = (basepath + pFileName); - fileloc.replace('\\', "/"); - ilGenImages(1, &id_image);// Generate DevIL image ID. - ilBindImage(id_image); - success = ilLoadImage(fileloc.toLocal8Bit()); - if(!success) - { - LogError(QString("Couldn't load Image: %1").arg(fileloc)); + fileloc.replace('\\', "/"); + ilGenImages(1, &id_image);// Generate DevIL image ID. + ilBindImage(id_image); + success = ilLoadImage(fileloc.toLocal8Bit()); + if(!success) + { + LogError(QString("Couldn't load Image: %1").arg(fileloc)); - return false; - } + return false; + } - // Convert every colour component into unsigned byte. If your image contains alpha channel you can replace IL_RGB with IL_RGBA. - success = ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); - if(!success) - { - LogError("Couldn't convert image."); + // Convert every colour component into unsigned byte. If your image contains alpha channel you can replace IL_RGB with IL_RGBA. + success = ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); + if(!success) + { + LogError("Couldn't convert image."); - return false; - } + return false; + } - glGenTextures(1, &id_ogl_texture);// Texture ID generation. - mTexture_IDMap[pFileName] = id_ogl_texture;// save texture ID for filename in map - glBindTexture(GL_TEXTURE_2D, id_ogl_texture);// Binding of texture ID. - // Redefine standard texture values - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// We will use linear interpolation for magnification filter. - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);// We will use linear interpolation for minifying filter. - glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), 0, - ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());// Texture specification. + glGenTextures(1, &id_ogl_texture);// Texture ID generation. + mTexture_IDMap[pFileName] = id_ogl_texture;// save texture ID for filename in map + glBindTexture(GL_TEXTURE_2D, id_ogl_texture);// Binding of texture ID. + // Redefine standard texture values + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// We will use linear interpolation for magnification filter. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);// We will use linear interpolation for minifying filter. + glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), 0, + ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());// Texture specification. - //Cleanup - ilDeleteImages(1, &id_image);// Because we have already copied image data into texture data we can release memory used by image. - } - else - { - struct SPixel_Description - { - const char* FormatHint; - const GLint Image_InternalFormat; - const GLint Pixel_Format; - }; + //Cleanup + ilDeleteImages(1, &id_image);// Because we have already copied image data into texture data we can release memory used by image. + } + else + { + struct SPixel_Description + { + const char* FormatHint; + const GLint Image_InternalFormat; + const GLint Pixel_Format; + }; - constexpr SPixel_Description Pixel_Description[] = { - {"rgba8880", GL_RGB, GL_RGB}, - {"rgba8888", GL_RGBA, GL_RGBA} - }; + constexpr SPixel_Description Pixel_Description[] = { + {"rgba8880", GL_RGB, GL_RGB}, + {"rgba8888", GL_RGBA, GL_RGBA} + }; - constexpr size_t Pixel_Description_Count = sizeof(Pixel_Description) / sizeof(SPixel_Description); + constexpr size_t Pixel_Description_Count = sizeof(Pixel_Description) / sizeof(SPixel_Description); - size_t idx_description; - // Get texture index. - bool ok; - size_t idx_texture = pFileName.right(strlen(AI_EMBEDDED_TEXNAME_PREFIX)).toULong(&ok); + size_t idx_description; + // Get texture index. + bool ok; + size_t idx_texture = pFileName.right(strlen(AI_EMBEDDED_TEXNAME_PREFIX)).toULong(&ok); - if(!ok) - { - LogError("Can not get index of the embedded texture from path in material."); + if(!ok) + { + LogError("Can not get index of the embedded texture from path in material."); - return false; - } + return false; + } - // Create alias for conveniance. - const aiTexture& als = *mScene->mTextures[idx_texture]; + // Create alias for conveniance. + const aiTexture& als = *mScene->mTextures[idx_texture]; - if(als.mHeight == 0)// Compressed texture. - { - LogError("IME: compressed embedded textures are not implemented."); - } - else - { - ok = false; - for(size_t idx = 0; idx < Pixel_Description_Count; idx++) - { - if(als.CheckFormat(Pixel_Description[idx].FormatHint)) - { - idx_description = idx; - ok = true; - break; - } - } + if(als.mHeight == 0)// Compressed texture. + { + LogError("IME: compressed embedded textures are not implemented."); + } + else + { + ok = false; + for(size_t idx = 0; idx < Pixel_Description_Count; idx++) + { + if(als.CheckFormat(Pixel_Description[idx].FormatHint)) + { + idx_description = idx; + ok = true; + break; + } + } - if(!ok) - { - LogError(QString("Unsupported format hint for embedded texture: [%1]").arg(als.achFormatHint)); + if(!ok) + { + LogError(QString("Unsupported format hint for embedded texture: [%1]").arg(als.achFormatHint)); - return false; - } + return false; + } - glGenTextures(1, &id_ogl_texture);// Texture ID generation. - mTexture_IDMap[pFileName] = id_ogl_texture;// save texture ID for filename in map - glBindTexture(GL_TEXTURE_2D, id_ogl_texture);// Binding of texture ID. - // Redefine standard texture values - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// We will use linear interpolation for magnification filter. - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);// We will use linear interpolation for minifying filter. - // Texture specification. - glTexImage2D(GL_TEXTURE_2D, 0, Pixel_Description[idx_description].Image_InternalFormat, als.mWidth, als.mHeight, 0, - Pixel_Description[idx_description].Pixel_Format, GL_UNSIGNED_BYTE, (uint8_t*)als.pcData); - }// if(als.mHeight == 0) else - }// if(!filename.startsWith(AI_EMBEDDED_TEXNAME_PREFIX)) else + glGenTextures(1, &id_ogl_texture);// Texture ID generation. + mTexture_IDMap[pFileName] = id_ogl_texture;// save texture ID for filename in map + glBindTexture(GL_TEXTURE_2D, id_ogl_texture);// Binding of texture ID. + // Redefine standard texture values + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// We will use linear interpolation for magnification filter. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);// We will use linear interpolation for minifying filter. + // Texture specification. + glTexImage2D(GL_TEXTURE_2D, 0, Pixel_Description[idx_description].Image_InternalFormat, als.mWidth, als.mHeight, 0, + Pixel_Description[idx_description].Pixel_Format, GL_UNSIGNED_BYTE, (uint8_t*)als.pcData); + }// if(als.mHeight == 0) else + }// if(!filename.startsWith(AI_EMBEDDED_TEXNAME_PREFIX)) else - return true; -};// auto LoadTexture = [&](const aiString& pPath) + return true; + };// auto LoadTexture = [&](const aiString& pPath) if(mScene == nullptr) { diff --git a/tools/assimp_qt_viewer/mainwindow.cpp b/tools/assimp_qt_viewer/mainwindow.cpp index ea4a6efe7..cb4c4a67e 100644 --- a/tools/assimp_qt_viewer/mainwindow.cpp +++ b/tools/assimp_qt_viewer/mainwindow.cpp @@ -325,7 +325,7 @@ bool selected = ui->lstLight->isItemSelected(ui->lstLight->currentItem()); mGLView->updateGL(); } -void MainWindow::on_lstCamera_clicked(__unused const QModelIndex &index) +void MainWindow::on_lstCamera_clicked( const QModelIndex &) { mGLView->Camera_Set(ui->lstLight->currentRow()); mGLView->updateGL(); diff --git a/tools/assimp_qt_viewer/mainwindow.hpp b/tools/assimp_qt_viewer/mainwindow.hpp index f51e023ec..940840aee 100644 --- a/tools/assimp_qt_viewer/mainwindow.hpp +++ b/tools/assimp_qt_viewer/mainwindow.hpp @@ -6,7 +6,7 @@ #pragma once // Header files, Qt. -#include +#include // Header files, project. #include "glview.hpp"