diff --git a/CMakeLists.txt b/CMakeLists.txt index 61251f85a..dcafb649f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -277,16 +277,14 @@ ELSEIF( CMAKE_COMPILER_IS_MINGW ) ENDIF() IF ( IOS AND NOT HUNTER_ENABLED) - -IF (CMAKE_BUILD_TYPE STREQUAL "Debug") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -Og") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -Og") -ELSE() - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -O3") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -O3") - # Experimental for pdb generation -ENDIF() - + IF (CMAKE_BUILD_TYPE STREQUAL "Debug") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -Og") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -Og") + ELSE() + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -O3") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -O3") + # Experimental for pdb generation + ENDIF() ENDIF( IOS AND NOT HUNTER_ENABLED) IF (ASSIMP_COVERALLS) @@ -559,17 +557,15 @@ ENDIF(NOT HUNTER_ENABLED) ADD_SUBDIRECTORY( code/ ) IF ( ASSIMP_BUILD_ASSIMP_TOOLS ) + # The viewer for windows only IF ( WIN32 AND DirectX_D3DX9_LIBRARY ) OPTION ( ASSIMP_BUILD_ASSIMP_VIEW "If the Assimp view tool is built. (requires DirectX)" ${DirectX_FOUND} ) IF ( ASSIMP_BUILD_ASSIMP_VIEW ) ADD_SUBDIRECTORY( tools/assimp_view/ ) ENDIF ( ASSIMP_BUILD_ASSIMP_VIEW ) ENDIF ( WIN32 AND DirectX_D3DX9_LIBRARY ) - + # Te command line tool ADD_SUBDIRECTORY( tools/assimp_cmd/ ) -IF (NOT IOS) - ADD_SUBDIRECTORY( tools/assimp_qt_viewer/ ) -ENDIF (NOT IOS) 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 deleted file mode 100644 index d8d8e27a9..000000000 --- a/tools/assimp_qt_viewer/CMakeLists.txt +++ /dev/null @@ -1,76 +0,0 @@ -set(PROJECT_VERSION "") -project(assimp_qt_viewer) - -# Qt5 requires cmake 3.1 or newer -cmake_minimum_required(VERSION 3.1) - -FIND_PACKAGE(OpenGL QUIET) - -# Qt5 version -FIND_PACKAGE(Qt5 COMPONENTS Gui Widgets OpenGL QUIET) - -SET(VIEWER_BUILD:BOOL FALSE) - -IF( Qt5Widgets_FOUND AND OPENGL_FOUND) - SET(VIEWER_BUILD TRUE) -ELSE( Qt5Widgets_FOUND AND OPENGL_FOUND) - SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "") - - IF (NOT Qt5_FOUND) - SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} Qt5") - ENDIF (NOT Qt5_FOUND) - - IF (NOT OPENGL_FOUND) - SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} OpengGL") - ENDIF (NOT OPENGL_FOUND) - - MESSAGE (WARNING "Build of assimp_qt_viewer is disabled. Unsatisfied dendencies: ${ASSIMP_QT_VIEWER_DEPENDENCIES}") -ENDIF( Qt5Widgets_FOUND AND OPENGL_FOUND) - -IF(VIEWER_BUILD) - INCLUDE_DIRECTORIES( - ${Assimp_SOURCE_DIR}/include - ${Assimp_SOURCE_DIR}/code - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR} - ${OPENGL_INCLUDE_DIR} - ) - - 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.hpp - loggerview.cpp - glview.hpp - glview.cpp - mainwindow.hpp - mainwindow.cpp - ) - - MESSAGE("assimp_qt_viewer use Qt5") - INCLUDE_DIRECTORIES(${Qt5Widgets_INCLUDES}) - 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} Qt5::Gui Qt5::Widgets Qt5::OpenGL ${OPENGL_LIBRARIES} assimp) - - 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") - ELSEIF(CMAKE_COMPILER_IS_GNUCXX) - # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested - ELSE() - MESSAGE(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)") - ENDIF() - ELSEIF(UNIX) - # Nothing special required - ELSE() - MESSAGE(SEND_ERROR "You are on an unsupported platform! (Not Win32 or Unix)") - ENDIF() - - SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) - INSTALL(TARGETS assimp_qt_viewer DESTINATION "${ASSIMP_BIN_INSTALL_DIR}") -ENDIF(VIEWER_BUILD) diff --git a/tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (en).odt b/tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (en).odt deleted file mode 100644 index 6e4e8c193..000000000 Binary files a/tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (en).odt and /dev/null differ diff --git a/tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (ru).odt b/tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (ru).odt deleted file mode 100644 index 6bd8f8dbb..000000000 Binary files a/tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (ru).odt and /dev/null differ diff --git a/tools/assimp_qt_viewer/glview.cpp b/tools/assimp_qt_viewer/glview.cpp deleted file mode 100644 index 6ecdb0f4d..000000000 --- a/tools/assimp_qt_viewer/glview.cpp +++ /dev/null @@ -1,1161 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2018, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ -#include "glview.hpp" - -// Header files, Qt. -#include - -// Header files, OpenGL. -#if defined(__APPLE__) -# include -#else -# include -#endif - -// Header files, DevIL. - -// Header files, Assimp. -#include - -#define STB_IMAGE_IMPLEMENTATION -#include "contrib/stb_image/stb_image.h" - -CGLView::SHelper_Mesh::SHelper_Mesh(const size_t pQuantity_Point, const size_t pQuantity_Line, const size_t pQuantity_Triangle, const SBBox& pBBox) -: Quantity_Point(pQuantity_Point) -, Quantity_Line(pQuantity_Line) -, Quantity_Triangle(pQuantity_Triangle) -, BBox(pBBox) { - Index_Point = pQuantity_Point ? new GLuint[pQuantity_Point * 1] : nullptr; - Index_Line = pQuantity_Line ? new GLuint[pQuantity_Line * 2] : nullptr; - Index_Triangle = pQuantity_Triangle ? new GLuint[pQuantity_Triangle * 3] : nullptr; -} - -CGLView::SHelper_Mesh::~SHelper_Mesh() { - delete [] Index_Point; - delete [] Index_Line; - delete [] Index_Triangle; -} - -void CGLView::SHelper_Camera::SetDefault() { - Position.Set(0, 0, 0); - Target.Set(0, 0, -1); - Rotation_AroundCamera = aiMatrix4x4(); - Rotation_Scene = aiMatrix4x4(); - Translation_ToScene.Set(0, 0, 2); -} - -static void 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; -} - -static void 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; -} - -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; - - ///TODO: cache materials - // Disable color material because glMaterial is used. - glDisable(GL_COLOR_MATERIAL);///TODO: cache - - // Set texture. If assigned. - if(AI_SUCCESS == pMaterial->GetTexture(aiTextureType_DIFFUSE, texture_index, &texture_path)) { - //bind texture - unsigned int texture_ID = mTexture_IDMap.value(texture_path.data, 0); - - glBindTexture(GL_TEXTURE_2D, texture_ID); - } - // - // Set material parameters from scene or default values. - // - // Diffuse - set_float4(tcol, 0.8f, 0.8f, 0.8f, 1.0f); - if ( AI_SUCCESS == aiGetMaterialColor( pMaterial, AI_MATKEY_COLOR_DIFFUSE, &taicol )) { - color4_to_float4( &taicol, tcol ); - } - - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, tcol); - - // Specular - set_float4(tcol, 0.0f, 0.0f, 0.0f, 1.0f); - if ( AI_SUCCESS == aiGetMaterialColor( pMaterial, AI_MATKEY_COLOR_SPECULAR, &taicol )) { - color4_to_float4( &taicol, tcol ); - } - - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, tcol); - // Ambient - set_float4(tcol, 0.2f, 0.2f, 0.2f, 1.0f); - if ( AI_SUCCESS == aiGetMaterialColor( pMaterial, AI_MATKEY_COLOR_AMBIENT, &taicol )) { - color4_to_float4( &taicol, tcol ); - } - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, tcol); - - // Emission - set_float4(tcol, 0.0f, 0.0f, 0.0f, 1.0f); - if(AI_SUCCESS == aiGetMaterialColor(pMaterial, AI_MATKEY_COLOR_EMISSIVE, &taicol)) color4_to_float4(&taicol, tcol); - - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, tcol); - // Shininess - ai_real shininess, strength; - - max = 1; - ret1 = aiGetMaterialFloatArray(pMaterial, AI_MATKEY_SHININESS, &shininess, &max); - // Shininess strength - max = 1; - ret2 = aiGetMaterialFloatArray(pMaterial, AI_MATKEY_SHININESS_STRENGTH, &strength, &max); - if((ret1 == AI_SUCCESS) && (ret2 == AI_SUCCESS)) { - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess * strength);///TODO: cache - } else { - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f);///TODO: cache - set_float4(tcol, 0.0f, 0.0f, 0.0f, 0.0f); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, tcol); - } - - // Fill mode - GLenum fill_mode; - int wireframe; - - max = 1; - if(AI_SUCCESS == aiGetMaterialIntegerArray(pMaterial, AI_MATKEY_ENABLE_WIREFRAME, &wireframe, &max)) - fill_mode = wireframe ? GL_LINE : GL_FILL; - else - fill_mode = GL_FILL; - - glPolygonMode(GL_FRONT_AND_BACK, fill_mode);///TODO: cache - // Fill side - int two_sided; - - max = 1; - if((AI_SUCCESS == aiGetMaterialIntegerArray(pMaterial, AI_MATKEY_TWOSIDED, &two_sided, &max)) && two_sided)///TODO: cache - glDisable(GL_CULL_FACE); - else - glEnable(GL_CULL_FACE); -} - -void CGLView::Matrix_NodeToRoot(const aiNode* pNode, aiMatrix4x4& pOutMatrix) -{ - const aiNode* node_cur; - std::list mat_list; - - pOutMatrix = aiMatrix4x4(); - // starting walk from current element to root - node_cur = pNode; - if(node_cur != nullptr) - { - do - { - // if cur_node is group then store group transformation matrix in list. - mat_list.push_back(node_cur->mTransformation); - node_cur = node_cur->mParent; - } while(node_cur != nullptr); - } - - // 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& scenePath) { - auto LoadTexture = [&](const QString& pFileName) -> bool ///TODO: IME texture mode, operation. - { - GLuint id_ogl_texture;// OpenGL texture ID. - - if(!pFileName.startsWith(AI_EMBEDDED_TEXNAME_PREFIX)) - { - QString basepath = scenePath.left(scenePath.lastIndexOf('/') + 1);// path with '/' at the end. - QString fileloc = (basepath + pFileName); - - fileloc.replace('\\', "/"); - int x, y, n; - unsigned char *data = stbi_load(fileloc.toLocal8Bit(), &x, &y, &n, STBI_rgb_alpha ); - if ( nullptr == data ) { - LogError(QString("Couldn't load Image: %1").arg(fileloc)); - - return false; - } - - // Convert every colour component into unsigned byte. If your image contains alpha channel you can replace IL_RGB with IL_RGBA. - - 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, n, x, y, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, data );// Texture specification. - stbi_image_free(data); - // Cleanup - } - 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 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); - - if(!ok) - { - LogError("Can not get index of the embedded texture from path in material."); - - return false; - } - - // 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(!ok) - { - LogError(QString("Unsupported format hint for embedded texture: [%1]").arg(als.achFormatHint)); - - 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 - - return true; - };// auto LoadTexture = [&](const aiString& pPath) - - if(mScene == nullptr) - { - LogError("Trying to load textures for empty scene."); - - return; - } - - // - // Load textures. - // - // Get textures file names and number of textures. - for(size_t idx_material = 0; idx_material < mScene->mNumMaterials; idx_material++) { - int idx_texture = 0; - aiString path; - - do { - if (mScene->mMaterials[ idx_material ]->GetTexture( aiTextureType_DIFFUSE, idx_texture, &path ) != AI_SUCCESS) { - break; - } - - LoadTexture(QString(path.C_Str())); - idx_texture++; - } while(true); - }// for(size_t idx_material = 0; idx_material < mScene->mNumMaterials; idx_material++) - - // Textures list is empty, exit. - if(mTexture_IDMap.empty()) { - LogInfo("No textures for import."); - } -} - -void CGLView::BBox_GetForNode(const aiNode& pNode, const aiMatrix4x4& pParent_TransformationMatrix, SBBox& pNodeBBox, bool& pFirstAssign) -{ - aiMatrix4x4 mat_trans = pParent_TransformationMatrix * pNode.mTransformation; - - // Check if node has meshes - for(size_t idx_idx_mesh = 0; idx_idx_mesh < pNode.mNumMeshes; idx_idx_mesh++) - { - size_t idx_mesh; - SBBox bbox_local; - aiVector3D bbox_vertices[8]; - - idx_mesh = pNode.mMeshes[idx_idx_mesh]; - // Get vertices of mesh BBox - BBox_GetVertices(mHelper_Mesh[idx_mesh]->BBox, bbox_vertices); - // Transform vertices - for(size_t idx_vert = 0; idx_vert < 8; idx_vert++) bbox_vertices[idx_vert] *= mat_trans; - - // And create BBox for transformed mesh - BBox_GetFromVertices(bbox_vertices, 8, bbox_local); - - if(!pFirstAssign) - { - BBox_Extend(bbox_local, pNodeBBox); - } - else - { - pFirstAssign = false; - pNodeBBox = bbox_local; - } - }// for(size_t idx_idx_mesh = 0; idx_idx_mesh < pNode.mNumMeshes; idx_idx_mesh++) - - for(size_t idx_node = 0; idx_node < pNode.mNumChildren; idx_node++) - { - BBox_GetForNode(*pNode.mChildren[idx_node], mat_trans, pNodeBBox, pFirstAssign); - } -} - -void CGLView::BBox_Extend(const SBBox& pChild, SBBox& pParent) -{ - // search minimal... - AssignIfLesser(&pParent.Minimum.x, pChild.Minimum.x); - AssignIfLesser(&pParent.Minimum.y, pChild.Minimum.y); - AssignIfLesser(&pParent.Minimum.z, pChild.Minimum.z); - // and maximal values - AssignIfGreater(&pParent.Maximum.x, pChild.Maximum.x); - AssignIfGreater(&pParent.Maximum.y, pChild.Maximum.y); - AssignIfGreater(&pParent.Maximum.z, pChild.Maximum.z); -} - -void CGLView::BBox_GetVertices(const SBBox& pBBox, aiVector3D pVertex[8]) -{ - pVertex[0] = pBBox.Minimum; - pVertex[1].Set(pBBox.Minimum.x, pBBox.Minimum.y, pBBox.Maximum.z); - pVertex[2].Set(pBBox.Minimum.x, pBBox.Maximum.y, pBBox.Maximum.z); - pVertex[3].Set(pBBox.Minimum.x, pBBox.Maximum.y, pBBox.Minimum.z); - - pVertex[4].Set(pBBox.Maximum.x, pBBox.Minimum.y, pBBox.Minimum.z); - pVertex[5].Set(pBBox.Maximum.x, pBBox.Minimum.y, pBBox.Maximum.z); - pVertex[6] = pBBox.Maximum; - pVertex[7].Set(pBBox.Maximum.x, pBBox.Maximum.y, pBBox.Minimum.z); - -} - -void CGLView::BBox_GetFromVertices(const aiVector3D* pVertices, const size_t pVerticesQuantity, SBBox& pBBox) -{ - if(pVerticesQuantity == 0) - { - pBBox.Maximum.Set(0, 0, 0); - pBBox.Minimum.Set(0, 0, 0); - - return; - } - - // Assign first values. - pBBox.Minimum = pVertices[0]; - pBBox.Maximum = pVertices[0]; - - for(size_t idx_vert = 1; idx_vert < pVerticesQuantity; idx_vert++) - { - const ai_real x = pVertices[idx_vert].x; - const ai_real y = pVertices[idx_vert].y; - const ai_real z = pVertices[idx_vert].z; - - // search minimal... - AssignIfLesser(&pBBox.Minimum.x, x); - AssignIfLesser(&pBBox.Minimum.y, y); - AssignIfLesser(&pBBox.Minimum.z, z); - // and maximal values - AssignIfGreater(&pBBox.Maximum.x, x); - AssignIfGreater(&pBBox.Maximum.y, y); - AssignIfGreater(&pBBox.Maximum.z, z); - } -} - -void CGLView::LogInfo(const QString& pMessage) { - Assimp::DefaultLogger::get()->info(pMessage.toStdString()); -} - -void CGLView::LogError(const QString& pMessage) { - Assimp::DefaultLogger::get()->error(pMessage.toStdString()); -} - -void CGLView::Draw_Node(const aiNode* pNode) { - aiMatrix4x4 mat_node = pNode->mTransformation; - - // Apply node transformation matrix. - mat_node.Transpose(); - glPushMatrix(); -#ifdef ASSIMP_DOUBLE_PRECISION - glMultMatrixd((GLdouble*)mat_node[0]); -#else - glMultMatrixf((GLfloat*)&mat_node); -#endif // ASSIMP_DOUBLE_PRECISION - - // Draw all meshes assigned to this node - for(size_t idx_mesh_arr = 0; idx_mesh_arr < pNode->mNumMeshes; idx_mesh_arr++) Draw_Mesh(pNode->mMeshes[idx_mesh_arr]); - - // Draw all children nodes - for(size_t idx_node = 0; idx_node < pNode->mNumChildren; idx_node++) Draw_Node(pNode->mChildren[idx_node]); - - // Restore transformation matrix. - glPopMatrix(); -} - -void CGLView::Draw_Mesh(const size_t pMesh_Index) -{ - // Check argument - if(pMesh_Index >= mHelper_Mesh_Quantity) return; - - aiMesh& mesh_cur = *mScene->mMeshes[pMesh_Index]; - - if(!mesh_cur.HasPositions()) return;// Nothing to draw. - - // If mesh use material then apply it - if(mScene->HasMaterials()) Material_Apply(mScene->mMaterials[mesh_cur.mMaterialIndex]); - - // - // Vertices array - // - glEnableClientState(GL_VERTEX_ARRAY); -#if ASSIMP_DOUBLE_PRECISION - glVertexPointer(3, GL_DOUBLE, 0, mesh_cur.mVertices); -#else - glVertexPointer(3, GL_FLOAT, 0, mesh_cur.mVertices); -#endif // ASSIMP_DOUBLE_PRECISION - - if(mesh_cur.HasVertexColors(0)) - { - glEnable(GL_COLOR_MATERIAL);///TODO: cache - glEnableClientState(GL_COLOR_ARRAY); -#ifdef ASSIMP_DOUBLE_PRECISION - glColorPointer(4, GL_DOUBLE, 0, mesh_cur.mColors[0]); -#else - glColorPointer(4, GL_FLOAT, 0, mesh_cur.mColors[0]); -#endif // ASSIMP_DOUBLE_PRECISION - } - - // - // Texture coordinates array - // - if(mesh_cur.HasTextureCoords(0)) - { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); -#ifdef ASSIMP_DOUBLE_PRECISION - glTexCoordPointer(2, GL_DOUBLE, sizeof(aiVector3D), mesh_cur.mTextureCoords[0]); -#else - glTexCoordPointer(2, GL_FLOAT, sizeof(aiVector3D), mesh_cur.mTextureCoords[0]); -#endif // ASSIMP_DOUBLE_PRECISION - } - - // - // Normals array - // - if(mesh_cur.HasNormals()) - { - glEnableClientState(GL_NORMAL_ARRAY); -#ifdef ASSIMP_DOUBLE_PRECISION - glNormalPointer(GL_DOUBLE, 0, mesh_cur.mNormals); -#else - glNormalPointer(GL_FLOAT, 0, mesh_cur.mNormals); -#endif // ASSIMP_DOUBLE_PRECISION - } - - // - // Draw arrays - // - SHelper_Mesh& helper_cur = *mHelper_Mesh[pMesh_Index]; - - if(helper_cur.Quantity_Triangle > 0) glDrawElements(GL_TRIANGLES, helper_cur.Quantity_Triangle * 3, GL_UNSIGNED_INT, helper_cur.Index_Triangle); - if(helper_cur.Quantity_Line > 0) glDrawElements(GL_LINES,helper_cur.Quantity_Line * 2, GL_UNSIGNED_INT, helper_cur.Index_Line); - if(helper_cur.Quantity_Point > 0) glDrawElements(GL_POINTS, helper_cur.Quantity_Point, GL_UNSIGNED_INT, helper_cur.Index_Point); - - // - // Clean up - // - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); -} - -void CGLView::Draw_BBox(const SBBox& pBBox) -{ - aiVector3D vertex[8]; - - BBox_GetVertices(pBBox, vertex); - // Draw - if(mLightingEnabled) glDisable(GL_LIGHTING);///TODO: display list - - glEnable(GL_COLOR_MATERIAL); - glBindTexture(GL_TEXTURE_1D, 0); - glBindTexture(GL_TEXTURE_2D, 0); - glBindTexture(GL_TEXTURE_3D, 0); - const QColor c_w(Qt::white); - - glColor3f(c_w.redF(), c_w.greenF(), c_w.blueF()); - - glBegin(GL_LINE_STRIP); -# ifdef ASSIMP_DOUBLE_PRECISION - glVertex3dv(&vertex[0][0]), glVertex3dv(&vertex[1][0]), glVertex3dv(&vertex[2][0]), glVertex3dv(&vertex[3][0]), glVertex3dv(&vertex[0][0]);// "Minimum" side. - glVertex3dv(&vertex[4][0]), glVertex3dv(&vertex[5][0]), glVertex3dv(&vertex[6][0]), glVertex3dv(&vertex[7][0]), glVertex3dv(&vertex[4][0]);// Edge and "maximum" side. -# else - glVertex3fv(&vertex[0][0]), glVertex3fv(&vertex[1][0]), glVertex3fv(&vertex[2][0]), glVertex3fv(&vertex[3][0]), glVertex3fv(&vertex[0][0]);// "Minimum" side. - glVertex3fv(&vertex[4][0]), glVertex3fv(&vertex[5][0]), glVertex3fv(&vertex[6][0]), glVertex3fv(&vertex[7][0]), glVertex3fv(&vertex[4][0]);// Edge and "maximum" side. -# endif // ASSIMP_DOUBLE_PRECISION - glEnd(); - - glBegin(GL_LINES); -# ifdef ASSIMP_DOUBLE_PRECISION - glVertex3dv(&vertex[1][0]), glVertex3dv(&vertex[5][0]); - glVertex3dv(&vertex[2][0]), glVertex3dv(&vertex[6][0]); - glVertex3dv(&vertex[3][0]), glVertex3dv(&vertex[7][0]); -# else - glVertex3fv(&vertex[1][0]), glVertex3fv(&vertex[5][0]); - glVertex3fv(&vertex[2][0]), glVertex3fv(&vertex[6][0]); - glVertex3fv(&vertex[3][0]), glVertex3fv(&vertex[7][0]); -# endif // ASSIMP_DOUBLE_PRECISION - glEnd(); - glDisable(GL_COLOR_MATERIAL); - if(mLightingEnabled) glEnable(GL_LIGHTING); - -} - -void CGLView::Enable_Textures(const bool pEnable) { - if(pEnable) { - glEnable(GL_TEXTURE_1D); - glEnable(GL_TEXTURE_2D); - glEnable(GL_TEXTURE_3D); - } else { - glDisable(GL_TEXTURE_1D); - glDisable(GL_TEXTURE_2D); - glDisable(GL_TEXTURE_3D); - } -} - -void CGLView::initializeGL() { - mGLContext_Current = true; - initializeOpenGLFunctions(); - glClearColor(0.5f, 0.5f, 0.5f, 1.0f); - glShadeModel(GL_SMOOTH); - - glEnable(GL_DEPTH_TEST); - glEnable(GL_NORMALIZE); - glEnable(GL_TEXTURE_2D); - glEnable( GL_MULTISAMPLE ); - - glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT); - glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); - glDisable(GL_COLOR_MATERIAL); - - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - - glFrontFace(GL_CCW); -} - -void CGLView::resizeGL(int width, int height) { - mCamera_Viewport_AspectRatio = (GLdouble)width / height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(mCamera_FOVY, mCamera_Viewport_AspectRatio, 1.0, 100000.0);///TODO: znear/zfar depend on scene size. -} - -void CGLView::drawCoordSystem() { - // Disable lighting. Colors must be bright and colorful) - if ( mLightingEnabled ) glDisable( GL_LIGHTING );///TODO: display list - - // For same reason - disable textures. - glBindTexture(GL_TEXTURE_1D, 0); - glBindTexture(GL_TEXTURE_2D, 0); - glBindTexture(GL_TEXTURE_3D, 0); - glEnable(GL_COLOR_MATERIAL); - glBegin(GL_LINES); - - // X, -X - glColor3f(1.0f, 0.0f, 0.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(100000.0, 0.0, 0.0); - glColor3f(0.5f, 0.5f, 1.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(-100000.0, 0.0, 0.0); - // Y, -Y - glColor3f(0.0f, 1.0f, 0.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, 100000.0, 0.0); - glColor3f(1.0f, 0.0f, 1.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, -100000.0, 0.0); - // Z, -Z - glColor3f(0.0f, 0.0f, 1.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, 0.0, 100000.0); - glColor3f(1.0f, 1.0f, 0.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, 0.0, -100000.0); - glColor3f(1.0f, 1.0f, 1.0f); - - glEnd(); - // Restore previous state of lighting. - if (mLightingEnabled) { - glEnable( GL_LIGHTING ); - } -} - -void CGLView::paintGL() { - QTime time_paintbegin; - - time_paintbegin = QTime::currentTime(); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - // Apply current camera transformations. -#if ASSIMP_DOUBLE_PRECISION - glMultMatrixd((GLdouble*)&mHelper_Camera.Rotation_AroundCamera); - glTranslated(-mHelper_Camera.Translation_ToScene.x, -mHelper_Camera.Translation_ToScene.y, -mHelper_Camera.Translation_ToScene.z); - glMultMatrixd((GLdouble*)&mHelper_Camera.Rotation_Scene); -#else - glMultMatrixf((GLfloat*)&mHelper_Camera.Rotation_AroundCamera); - glTranslatef(-mHelper_Camera.Translation_ToScene.x, -mHelper_Camera.Translation_ToScene.y, -mHelper_Camera.Translation_ToScene.z); - glMultMatrixf((GLfloat*)&mHelper_Camera.Rotation_Scene); -#endif // ASSIMP_DOUBLE_PRECISION - - // Coordinate system - if ( mScene_AxesEnabled ) { - drawCoordSystem(); - } - - glDisable(GL_COLOR_MATERIAL); - - // Scene - if(mScene != nullptr) { - Draw_Node(mScene->mRootNode); - // Scene BBox - if (mScene_DrawBBox) { - Draw_BBox( mScene_BBox ); - } - } - - emit Paint_Finished((size_t) time_paintbegin.msecsTo(QTime::currentTime()), mHelper_Camera.Translation_ToScene.Length()); -} - - -CGLView::CGLView( QWidget *pParent ) -: QOpenGLWidget( pParent ) -, mGLContext_Current( false ) { - // set initial view - mHelper_CameraDefault.SetDefault(); - Camera_Set( 0 ); -} - -CGLView::~CGLView() { - FreeScene(); -} - -void CGLView::FreeScene() { - // Set scene to null and after that \ref paintGL will not try to render it. - mScene = nullptr; - // Clean helper objects. - if(mHelper_Mesh != nullptr) - { - for(size_t idx_mesh = 0; idx_mesh < mHelper_Mesh_Quantity; idx_mesh++) delete mHelper_Mesh[idx_mesh]; - - delete [] mHelper_Mesh; - mHelper_Mesh = nullptr; - } - - mHelper_Mesh_Quantity = 0; - // Delete textures - const int id_tex_size = mTexture_IDMap.size(); - - if(id_tex_size) - { - GLuint* id_tex = new GLuint[id_tex_size]; - QMap::iterator it = mTexture_IDMap.begin(); - - for(int idx = 0; idx < id_tex_size; idx++, ++it) - { - id_tex[idx] = it.value(); - } - - glDeleteTextures(id_tex_size, id_tex); - mTexture_IDMap.clear(); - delete [] id_tex; - } -} - -void CGLView::SetScene(const aiScene *pScene, const QString& pScenePath) { - FreeScene();// Clear old data - // Why checking here, not at begin of function. Because old scene may not exist at know. So, need cleanup. - if (pScene == nullptr) { - return; - } - - mScene = pScene;// Copy pointer of new scene. - - // - // Meshes - // - // Create helper objects for meshes. This allow to render meshes as OpenGL arrays. - if(mScene->HasMeshes()) - { - // Create mesh helpers array. - mHelper_Mesh_Quantity = mScene->mNumMeshes; - mHelper_Mesh = new SHelper_Mesh*[mScene->mNumMeshes]; - - // Walk through the meshes and extract needed data and, also calculate BBox. - for(size_t idx_mesh = 0; idx_mesh < mScene->mNumMeshes; idx_mesh++) - { - aiMesh& mesh_cur = *mScene->mMeshes[idx_mesh]; - - // - // Calculate BBox - // - SBBox mesh_bbox; - - BBox_GetFromVertices(mesh_cur.mVertices, mesh_cur.mNumVertices, mesh_bbox); - // - // Create vertices indices arrays splitted by primitive type. - // - size_t indcnt_p = 0;// points quantity - size_t indcnt_l = 0;// lines quantity - size_t indcnt_t = 0;// triangles quantity - - if(mesh_cur.HasFaces()) - { - // Usual way: all faces are triangles - if(mesh_cur.mPrimitiveTypes == aiPrimitiveType_TRIANGLE) - { - indcnt_t = mesh_cur.mNumFaces; - } - else - { - // Calculate count of primitives by types. - for(size_t idx_face = 0; idx_face < mesh_cur.mNumFaces; idx_face++) - { - if(mesh_cur.mFaces[idx_face].mNumIndices == 3) - indcnt_t++; - else if(mesh_cur.mFaces[idx_face].mNumIndices == 2) - indcnt_l++; - else if(mesh_cur.mFaces[idx_face].mNumIndices == 1) - indcnt_p++; - } - }// if(mesh_cur.mPrimitiveTypes == aiPrimitiveType_TRIANGLE) else - - // Create helper - mHelper_Mesh[idx_mesh] = new SHelper_Mesh(indcnt_p, indcnt_l, indcnt_t, mesh_bbox); - // Fill indices arrays - indcnt_p = 0, indcnt_l = 0, indcnt_t = 0;// Reuse variables as indices - for(size_t idx_face = 0; idx_face < mesh_cur.mNumFaces; idx_face++) - { - if(mesh_cur.mFaces[idx_face].mNumIndices == 3) - { - mHelper_Mesh[idx_mesh]->Index_Triangle[indcnt_t++] = mesh_cur.mFaces[idx_face].mIndices[0]; - mHelper_Mesh[idx_mesh]->Index_Triangle[indcnt_t++] = mesh_cur.mFaces[idx_face].mIndices[1]; - mHelper_Mesh[idx_mesh]->Index_Triangle[indcnt_t++] = mesh_cur.mFaces[idx_face].mIndices[2]; - } - else if(mesh_cur.mFaces[idx_face].mNumIndices == 2) - { - mHelper_Mesh[idx_mesh]->Index_Line[indcnt_l++] = mesh_cur.mFaces[idx_face].mIndices[0]; - mHelper_Mesh[idx_mesh]->Index_Line[indcnt_l++] = mesh_cur.mFaces[idx_face].mIndices[1]; - } - else if(mesh_cur.mFaces[idx_face].mNumIndices == 1) - { - mHelper_Mesh[idx_mesh]->Index_Point[indcnt_p++] = mesh_cur.mFaces[idx_face].mIndices[0]; - } - }// for(size_t idx_face = 0; idx_face < mesh_cur.mNumFaces; idx_face++) - }// if(mesh_cur.HasFaces()) - else - { - // If mesh has no faces then vertices can be just points set. - indcnt_p = mesh_cur.mNumVertices; - // Create helper - mHelper_Mesh[idx_mesh] = new SHelper_Mesh(indcnt_p, 0, 0, mesh_bbox); - // Fill indices arrays - for(size_t idx = 0; idx < indcnt_p; idx++) mHelper_Mesh[idx_mesh]->Index_Point[idx] = idx; - - }// if(mesh_cur.HasFaces()) else - }// for(size_t idx_mesh = 0; idx_mesh < mScene->mNumMeshes; idx_mesh++) - }// if(mScene->HasMeshes()) - - // - // Scene BBox - // - // For calculating right BBox we must walk through all nodes and apply transformation to meshes BBoxes - if(mHelper_Mesh_Quantity > 0) - { - bool first_assign = true; - aiMatrix4x4 mat_root; - - BBox_GetForNode(*mScene->mRootNode, mat_root, mScene_BBox, first_assign); - mScene_Center = mScene_BBox.Maximum + mScene_BBox.Minimum; - mScene_Center /= 2; - } - else - { - mScene_BBox = {{0, 0, 0}, {0, 0, 0}}; - mScene_Center = {0, 0, 0}; - }// if(mHelper_Mesh_Count > 0) else - - // - // Textures - // - ImportTextures(pScenePath); - - // - // Light sources - // - Lighting_Enable(); - // If scene has no lights then enable default - if(!mScene->HasLights()) - { - const GLfloat col_amb[4] = { 0.2, 0.2, 0.2, 1.0 }; - SLightParameters lp; - - lp.Type = aiLightSource_POINT; - lp.Ambient.r = col_amb[0], lp.Ambient.g = col_amb[1], lp.Ambient.b = col_amb[2], lp.Ambient.a = col_amb[3]; - lp.Diffuse = { 1.0, 1.0, 1.0, 1.0 }; - lp.Specular = lp.Diffuse; - lp.For.Point.Position = mScene_Center; - lp.For.Point.Attenuation_Constant = 1; - lp.For.Point.Attenuation_Linear = 0; - lp.For.Point.Attenuation_Quadratic = 0; - glLightModelfv(GL_LIGHT_MODEL_AMBIENT, col_amb); - Lighting_EditSource(0, lp); - emit SceneObject_LightSource("_default");// Light source will be enabled in signal handler. - } - else - { - for(size_t idx_light = 0; idx_light < mScene->mNumLights; idx_light++) - { - SLightParameters lp; - QString name; - const aiLight& light_cur = *mScene->mLights[idx_light]; - - auto col3_to_col4 = [](const aiColor3D& pCol3) -> aiColor4D { return aiColor4D(pCol3.r, pCol3.g, pCol3.b, 1.0); }; - - ///TODO: find light source node and apply all transformations - // General properties - name = light_cur.mName.C_Str(); - lp.Ambient = col3_to_col4(light_cur.mColorAmbient); - lp.Diffuse = col3_to_col4(light_cur.mColorDiffuse); - lp.Specular = col3_to_col4(light_cur.mColorSpecular); - lp.Type = light_cur.mType; - // Depend on type properties - switch(light_cur.mType) - { - case aiLightSource_DIRECTIONAL: - lp.For.Directional.Direction = light_cur.mDirection; - break; - case aiLightSource_POINT: - lp.For.Point.Position = light_cur.mPosition; - lp.For.Point.Attenuation_Constant = light_cur.mAttenuationConstant; - lp.For.Point.Attenuation_Linear = light_cur.mAttenuationLinear; - lp.For.Point.Attenuation_Quadratic = light_cur.mAttenuationQuadratic; - break; - case aiLightSource_SPOT: - lp.For.Spot.Position = light_cur.mPosition; - lp.For.Spot.Direction = light_cur.mDirection; - lp.For.Spot.Attenuation_Constant = light_cur.mAttenuationConstant; - lp.For.Spot.Attenuation_Linear = light_cur.mAttenuationLinear; - lp.For.Spot.Attenuation_Quadratic = light_cur.mAttenuationQuadratic; - lp.For.Spot.CutOff = light_cur.mAngleOuterCone; - break; - case aiLightSource_AMBIENT: - lp.For.Point.Position = light_cur.mPosition, lp.For.Point.Attenuation_Constant = 1, lp.For.Point.Attenuation_Linear = 0, lp.For.Point.Attenuation_Quadratic = 0; - name.append("_unsup_ambient"); - break; - case aiLightSource_AREA: - lp.For.Point.Position = light_cur.mPosition, lp.For.Point.Attenuation_Constant = 1, lp.For.Point.Attenuation_Linear = 0, lp.For.Point.Attenuation_Quadratic = 0; - name.append("_unsup_area"); - break; - case aiLightSource_UNDEFINED: - lp.For.Point.Position = light_cur.mPosition, lp.For.Point.Attenuation_Constant = 1, lp.For.Point.Attenuation_Linear = 0, lp.For.Point.Attenuation_Quadratic = 0; - name.append("_unsup_undefined"); - break; - default: - lp.For.Point.Position = light_cur.mPosition, lp.For.Point.Attenuation_Constant = 1, lp.For.Point.Attenuation_Linear = 0, lp.For.Point.Attenuation_Quadratic = 0; - name.append("_unsupported_invalid"); - break; - }// switch(light_cur.mType) - - // Add light source - // Use index if name is empty. - if (name.isEmpty()) { - name += QString( "%1" ).arg( idx_light ); - } - - Lighting_EditSource(idx_light, lp); - emit SceneObject_LightSource(name);// Light source will be enabled in signal handler. - }// for(size_t idx_light = 0; idx_light < mScene->mNumLights; idx_light++) - }// if(!mScene->HasLights()) else - - // - // Cameras - // - if(!mScene->HasCameras()) - { - mCamera_DefaultAdded = true; - mHelper_CameraDefault.SetDefault(); - // Calculate distance from camera to scene. Distance must be enoguh for that viewport contain whole scene. - const GLfloat tg_angle = tan(mCamera_FOVY / 2); - - GLfloat val_x = ((mScene_BBox.Maximum.x - mScene_BBox.Minimum.x) / 2) / (mCamera_Viewport_AspectRatio * tg_angle); - GLfloat val_y = ((mScene_BBox.Maximum.y - mScene_BBox.Minimum.y) / 2) / tg_angle; - GLfloat val_step = val_x; - - AssignIfGreater(val_step, val_y); - mHelper_CameraDefault.Translation_ToScene.Set(mScene_Center.x, mScene_Center.y, val_step + mScene_BBox.Maximum.z); - emit SceneObject_Camera("_default"); - } - else - { - mCamera_DefaultAdded = false; - for(size_t idx_cam = 0; idx_cam < mScene->mNumCameras; idx_cam++) - { - emit SceneObject_Camera(mScene->mCameras[idx_cam]->mName.C_Str()); - } - }// if(!mScene->HasCameras()) else -} - -void CGLView::Lighting_Enable() { - mLightingEnabled = true; - glEnable(GL_LIGHTING); -} - -void CGLView::Lighting_Disable() { - glDisable( GL_LIGHTING ); - mLightingEnabled = false; -} - -void CGLView::Lighting_EditSource(const size_t pLightNumber, const SLightParameters& pLightParameters) -{ - const size_t light_num = GL_LIGHT0 + pLightNumber; - - GLfloat farr[4]; - - if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value; - - // Ambient color - farr[0] = pLightParameters.Ambient.r; - farr[1] = pLightParameters.Ambient.g; - farr[2] = pLightParameters.Ambient.b; - farr[3] = pLightParameters.Ambient.a; - glLightfv(light_num, GL_AMBIENT, farr); - - // Diffuse color - farr[0] = pLightParameters.Diffuse.r; - farr[1] = pLightParameters.Diffuse.g; - farr[2] = pLightParameters.Diffuse.b; - farr[3] = pLightParameters.Diffuse.a; - glLightfv(light_num, GL_DIFFUSE, farr); - - // Specular color - farr[0] = pLightParameters.Specular.r; - farr[1] = pLightParameters.Specular.g; - farr[2] = pLightParameters.Specular.b; - farr[3] = pLightParameters.Specular.a; - glLightfv(light_num, GL_SPECULAR, farr); - - // Other parameters - switch(pLightParameters.Type) - { - case aiLightSource_DIRECTIONAL: - // Direction - farr[0] = pLightParameters.For.Directional.Direction.x, farr[1] = pLightParameters.For.Directional.Direction.y; - farr[2] = pLightParameters.For.Directional.Direction.z; farr[3] = 0; - glLightfv(light_num, GL_POSITION, farr); - break; - case aiLightSource_POINT: - // Position - farr[0] = pLightParameters.For.Point.Position.x, farr[1] = pLightParameters.For.Point.Position.y; - farr[2] = pLightParameters.For.Point.Position.z; farr[3] = 1; - glLightfv(light_num, GL_POSITION, farr); - // Attenuation - glLightf(light_num, GL_CONSTANT_ATTENUATION, pLightParameters.For.Point.Attenuation_Constant); - glLightf(light_num, GL_LINEAR_ATTENUATION, pLightParameters.For.Point.Attenuation_Linear); - glLightf(light_num, GL_QUADRATIC_ATTENUATION, pLightParameters.For.Point.Attenuation_Quadratic); - glLightf(light_num, GL_SPOT_CUTOFF, 180.0); - break; - case aiLightSource_SPOT: - // Position - farr[0] = pLightParameters.For.Spot.Position.x, farr[1] = pLightParameters.For.Spot.Position.y, farr[2] = pLightParameters.For.Spot.Position.z; farr[3] = 1; - glLightfv(light_num, GL_POSITION, farr); - // Attenuation - glLightf(light_num, GL_CONSTANT_ATTENUATION, pLightParameters.For.Spot.Attenuation_Constant); - glLightf(light_num, GL_LINEAR_ATTENUATION, pLightParameters.For.Spot.Attenuation_Linear); - glLightf(light_num, GL_QUADRATIC_ATTENUATION, pLightParameters.For.Spot.Attenuation_Quadratic); - // Spot specific - farr[0] = pLightParameters.For.Spot.Direction.x, farr[1] = pLightParameters.For.Spot.Direction.y, farr[2] = pLightParameters.For.Spot.Direction.z; farr[3] = 0; - glLightfv(light_num, GL_SPOT_DIRECTION, farr); - glLightf(light_num, GL_SPOT_CUTOFF, pLightParameters.For.Spot.CutOff); - break; - default:// For unknown light source types use point source. - // Position - farr[0] = pLightParameters.For.Point.Position.x, farr[1] = pLightParameters.For.Point.Position.y; - farr[2] = pLightParameters.For.Point.Position.z; farr[3] = 1; - glLightfv(light_num, GL_POSITION, farr); - // Attenuation - glLightf(light_num, GL_CONSTANT_ATTENUATION, 1); - glLightf(light_num, GL_LINEAR_ATTENUATION, 0); - glLightf(light_num, GL_QUADRATIC_ATTENUATION, 0); - glLightf(light_num, GL_SPOT_CUTOFF, 180.0); - break; - }// switch(pLightParameters.Type) -} - -void CGLView::Lighting_EnableSource(const size_t pLightNumber) { - if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value; - - glEnable(GL_LIGHT0 + pLightNumber); -} - -void CGLView::Lighting_DisableSource(const size_t pLightNumber) -{ - if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value; - - glDisable(GL_LIGHT0 + pLightNumber); -} - -void CGLView::Camera_Set(const size_t pCameraNumber) -{ - SHelper_Camera& hcam = mHelper_Camera;// reference with short name for conveniance. - aiVector3D up; - - if(mCamera_DefaultAdded || (pCameraNumber >= mScene->mNumCameras))// If default camera used then 'pCameraNumber' doesn't matter. - { - // Transformation parameters - hcam = mHelper_CameraDefault; - up.Set(0, 1, 0); - } - else - { - const aiCamera& camera_cur = *mScene->mCameras[pCameraNumber]; - const aiNode* camera_node; - - aiMatrix4x4 camera_mat; - aiQuaternion camera_quat_rot; - aiVector3D camera_tr; - - up = camera_cur.mUp; - // - // Try to get real coordinates of the camera. - // - // Find node - camera_node = mScene->mRootNode->FindNode(camera_cur.mName); - if(camera_node != nullptr) Matrix_NodeToRoot(camera_node, camera_mat); - - hcam.Position = camera_cur.mLookAt; - hcam.Target = camera_cur.mPosition; - hcam.Rotation_AroundCamera = aiMatrix4x4(camera_quat_rot.GetMatrix()); - hcam.Rotation_AroundCamera.Transpose(); - // get components of transformation matrix. - camera_mat.DecomposeNoScaling(camera_quat_rot, camera_tr); - hcam.Rotation_Scene = aiMatrix4x4(); - hcam.Translation_ToScene = camera_tr; - } - - // Load identity matrix - travel to world begin. - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - // Set camera and update picture - gluLookAt(hcam.Position.x, hcam.Position.y, hcam.Position.z, hcam.Target.x, hcam.Target.y, hcam.Target.z, up.x, up.y, up.z); -} - -void CGLView::Camera_RotateScene(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial) { - auto deg2rad = [](const GLfloat pDegree) -> GLfloat { - return pDegree * AI_MATH_PI / 180.0f; - }; - - aiMatrix4x4 mat_rot; - - mat_rot.FromEulerAnglesXYZ(deg2rad(pAngle_X), deg2rad(pAngle_Y), deg2rad(pAngle_Z)); - if(pMatrix_Rotation_Initial != nullptr) - mHelper_Camera.Rotation_Scene = *pMatrix_Rotation_Initial * mat_rot; - else - mHelper_Camera.Rotation_Scene *= mat_rot; -} - -void CGLView::Camera_Rotate(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial) -{ - auto deg2rad = [](const GLfloat pDegree) -> GLfloat { return pDegree * AI_MATH_PI / 180.0; }; - - aiMatrix4x4 mat_rot; - - mat_rot.FromEulerAnglesXYZ(deg2rad(pAngle_X), deg2rad(pAngle_Y), deg2rad(pAngle_Z)); - if(pMatrix_Rotation_Initial != nullptr) - mHelper_Camera.Rotation_AroundCamera = *pMatrix_Rotation_Initial * mat_rot; - else - mHelper_Camera.Rotation_AroundCamera *= mat_rot; -} - -void CGLView::Camera_Translate(const GLfloat pTranslate_X, const GLfloat pTranslate_Y, const GLfloat pTranslate_Z) -{ - aiVector3D vect_tr(pTranslate_X, pTranslate_Y, pTranslate_Z); - - vect_tr *= mHelper_Camera.Rotation_AroundCamera; - mHelper_Camera.Translation_ToScene += vect_tr; -} - -void CGLView::Camera_Matrix(aiMatrix4x4& pRotation_Camera, aiMatrix4x4& pRotation_Scene, aiVector3D& pTranslation_Camera) -{ - pRotation_Camera = mHelper_Camera.Rotation_AroundCamera; - pRotation_Scene = mHelper_Camera.Rotation_Scene; - pTranslation_Camera = mHelper_Camera.Translation_ToScene; -} diff --git a/tools/assimp_qt_viewer/glview.hpp b/tools/assimp_qt_viewer/glview.hpp deleted file mode 100644 index 3cdb1fd11..000000000 --- a/tools/assimp_qt_viewer/glview.hpp +++ /dev/null @@ -1,456 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2018, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ - -#pragma once - -// Header files, Qt. -#include -#if ASSIMP_QT4_VIEWER -# include -#else -# include -# include -#endif // ASSIMP_QT4_VIEWER - -// Header files Assimp -#include - -/// \class CGLView -/// Class which hold and render scene. -#if ASSIMP_QT4_VIEWER -class CGLView : public QGLWidget -#else -class CGLView : public QOpenGLWidget, protected QOpenGLFunctions -#endif // ASSIMP_QT4_VIEWER -{ - Q_OBJECT - - /**********************************/ - /************* Types **************/ - /**********************************/ - -private: - - /// \struct SBBox - /// Bounding box for object. - struct SBBox - { - aiVector3D Minimum;///< Minimum values of coordinates. - aiVector3D Maximum;///< Maximum values of coordinates. - }; - - /// \struct SHelper_Mesh - /// Helper object for fast rendering of mesh (\ref aiMesh). - struct SHelper_Mesh - { - const size_t Quantity_Point;///< Quantity of points. - const size_t Quantity_Line;///< Quantity of lines. - const size_t Quantity_Triangle;///< Quantity of triangles. - GLuint* Index_Point;///< Array of indices for drawing points. - GLuint* Index_Line;///< Array of indices for drawing lines. - GLuint* Index_Triangle;///< Array of indices for drawing triangles. - - const SBBox BBox;///< BBox of mesh. - - /// \fn explicit SHelper_Mesh(const size_t pQuantity_Point, const size_t pQuantity_Line, const size_t pQuantity_Triangle, const SBBox& pBBox = {{0, 0, 0}, {0, 0, 0}}) - /// Constructor. - /// \param [in] pQuantity_Point - quantity of points. - /// \param [in] pQuantity_Line - quantity of lines. - /// \param [in] pQuantity_Triangle - quantity of triangles. - /// \param [in] pBBox - BBox of mesh. - explicit SHelper_Mesh(const size_t pQuantity_Point, const size_t pQuantity_Line, const size_t pQuantity_Triangle, const SBBox& pBBox = {{0, 0, 0}, {0, 0, 0}}); - - /// \fn ~SHelper_Mesh() - /// Destructor. - ~SHelper_Mesh(); - }; - - /// \struct SHelper_Camera - /// Information about position of the camera in space. - struct SHelper_Camera - { - aiVector3D Position;///< Coordinates of the camera. - aiVector3D Target;///< Target point of the camera. - // Transformation path: - // set Camera -> Rotation_AroundCamera -> Translation_ToScene -> Rotation_Scene -> draw Scene - aiMatrix4x4 Rotation_AroundCamera;///< Rotation matrix which set rotation angles of the scene around camera. - aiMatrix4x4 Rotation_Scene;///< Rotation matrix which set rotation angles of the scene around own center. - aiVector3D Translation_ToScene;///< Translation vector from camera to the scene. - - /// \fn void SetDefault() - /// Set default parameters of camera. - void SetDefault(); - }; - -public: - - /// \enum ELightType - /// Type of light source. - enum class ELightType { Directional, Point, Spot }; - - /// \struct SLightParameters - /// Parameters of light source. - struct SLightParameters - { - aiLightSourceType Type;///< Type of light source. - - aiColor4D Ambient;///< Ambient RGBA intensity of the light. - aiColor4D Diffuse;///< Diffuse RGBA intensity of the light. - aiColor4D Specular;///< Specular RGBA intensity of the light. - - union UFor - { - /// \struct SDirectional - /// Parameters of directional light source. - struct SDirectional - { - aiVector3D Direction; - - SDirectional() {} - } Directional; - - /// \struct SPoint - /// Parameters of point light source. - struct SPoint - { - aiVector3D Position; - GLfloat Attenuation_Constant; - GLfloat Attenuation_Linear; - GLfloat Attenuation_Quadratic; - - SPoint() {} - } Point; - - /// \struct SSpot - /// Parameters of spot light source. - struct SSpot - { - aiVector3D Position; - GLfloat Attenuation_Constant; - GLfloat Attenuation_Linear; - GLfloat Attenuation_Quadratic; - aiVector3D Direction; - GLfloat CutOff; - - SSpot() {} - } Spot; - - UFor() {} - } For; - - SLightParameters() {} - }; - - /**********************************/ - /************ Variables ***********/ - /**********************************/ - -private: - -#if !ASSIMP_QT4_VIEWER - // Qt5 widget has another behavior, so you must to know that you already made context are current. Yes, its a dirty hack. Better decision are welcome. - bool mGLContext_Current;///< Widget's GL-context made current. -#endif // ASSIMP_QT4_VIEWER - // Scene - const aiScene* mScene = nullptr;///< Copy of pointer to scene (\ref aiScene). - SBBox mScene_BBox;///< Bounding box of scene. - aiVector3D mScene_Center;///< Coordinates of center of the scene. - bool mScene_DrawBBox = false;///< Flag which control drawing scene BBox. - bool mScene_AxesEnabled = true;///< Flag which control drawing axes of the coordinate system. - // Meshes - size_t mHelper_Mesh_Quantity = 0;///< Quantity of meshes in scene. - SHelper_Mesh** mHelper_Mesh = nullptr;///< Array of pointers to helper objects for drawing mesh. Sequence of meshes are equivalent to \ref aiScene::mMeshes. - // Cameras - SHelper_Camera mHelper_Camera;///< Information about current camera placing in space. - SHelper_Camera mHelper_CameraDefault;///< Information about default camera initial placing in space. - bool mCamera_DefaultAdded = true;///< If true then scene has no defined cameras and default was added, if false - scene has defined cameras. - GLdouble mCamera_FOVY = 45.0;///< Specifies the field of view angle, in degrees, in the y direction. - GLdouble mCamera_Viewport_AspectRatio;///< Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). - // Lighting - bool mLightingEnabled = false;///< If true then OpenGL lighting is enabled (glEnable(GL_LIGHTING)), if false - disabled. - ///TODO: map is goooood, but not for case when one image can be used in different materials with difference in: texture transformation, targeting of the - /// texture (ambient or emission, or even height map), texture properties. - QMap mTexture_IDMap;///< Map image filenames to textures ID's. - - /**********************************/ - /************ Functions ***********/ - /**********************************/ - -private: - - // Why in some cases pointers are used? Because: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36566 - template void AssignIfLesser(TArg* pBaseValue, const TArg pTestValue) { if(pTestValue < *pBaseValue) *pBaseValue = pTestValue; } - template void AssignIfGreater(TArg* pBaseValue, const TArg pTestValue) { if(pTestValue > *pBaseValue) *pBaseValue = pTestValue; } - - template void AssignIfLesser(TArg& pBaseValue, const TArg pTestValue) { if(pTestValue < pBaseValue) pBaseValue = pTestValue; } - template void AssignIfGreater(TArg& pBaseValue, const TArg pTestValue) { if(pTestValue > pBaseValue) pBaseValue = pTestValue; } - - /// \fn void Material_Apply(const aiMaterial* pMaterial) - /// Enable pointed material. - /// \param [in] pMaterial - pointer to material which must be used. - void Material_Apply(const aiMaterial* pMaterial); - - /// \fn void Matrix_NodeToRoot(const aiNode* pNode, aiMatrix4x4& pOutMatrix) - /// Calculate matrix for transforming coordinates from pointed node to root node (read as "global coordinate system"). - /// \param [in] pNode - pointer initial node from which relative coordintaes will be taken, - /// \param [out] pOutMatrix - matrix for transform relative coordinates in \ref pNode to coordinates in root node (\ref aiScene::mRootNode). - void Matrix_NodeToRoot(const aiNode* pNode, aiMatrix4x4& pOutMatrix); - - /// \fn void ImportTextures() - /// Import textures. - /// \param [in] pScenePath - path to the file of the scene. - void ImportTextures(const QString& pScenePath); - - /// \fn void BBox_GetForNode(const aiNode& pNode, const aiMatrix4x4& pParentNode_TransformationMatrix, SBBox& pNodeBBox, bool& pFirstAssign) - /// Calculate BBox for pointed node. Function walk thru child nodes and apply all transformations. - /// \param [in] pNode - reference to node for which needed BBox. - /// \param [in] pParent_TransformationMatrix - reference to parent (parent for pNode) transformation matrix. - /// \param [in,out] pNodeBBox - reference to where pNode BBox will be placed. It will expanded by child nodes BBoxes. - /// \param [in] pFirstAssign - means that pNodeBBox not contain valid BBox at now and assign ('=') will used for setting new value, If - /// false then \ref BBox_Extend will be used for setting new BBox. - void BBox_GetForNode(const aiNode& pNode, const aiMatrix4x4& pParent_TransformationMatrix, SBBox& pNodeBBox, bool& pFirstAssign); - - /// \fn void BBox_Extend(const SBBox& pChild, SBBox& pParent) - /// Check and if need - extend current node BBox with BBox of child node. - /// \param [in] pChild - reference to BBox which used for extend parent BBox. - /// \param [in.out] pParent - BBox which will be extended using child BBox. - void BBox_Extend(const SBBox& pChild, SBBox& pParent); - - /// \fn void BBox_GetVertices(const SBBox& pBBox, aiVector3D pVertices[8]) - /// Get vertices of a parallelepiped which is described by BBox. - /// \param [in] pBBox - input BBox. - /// \param [out] pVertices - array of vertices. - void BBox_GetVertices(const SBBox& pBBox, aiVector3D pVertices[8]); - - /// \fn void BBox_GetFromVertices(const aiVector3D* pVertices, const size_t pVerticesQuantity, SBBox& pBBox) - /// Calculate BBox for vertices array. - /// \param [in] pVertices - vertices array. - /// \param [in] pVerticesQuantity - quantity of vertices in array. If 0 then pBBox will be assigned with {{0, 0, 0}, {0, 0, 0}}. - /// \param [out] pBBox - calculated BBox. - void BBox_GetFromVertices(const aiVector3D* pVertices, const size_t pVerticesQuantity, SBBox& pBBox); - - /********************************************************************/ - /************************ Logging functions *************************/ - /********************************************************************/ - - /// \fn void LogInfo(const QString& pMessage) - /// Add message with severity "Warning" to log. - void LogInfo(const QString& pMessage); - - /// \fn void LogError(const QString& pMessage) - /// Add message with severity "Error" to log. - void LogError(const QString& pMessage); - - /********************************************************************/ - /************************** Draw functions **************************/ - /********************************************************************/ - - /// \fn void Draw_Node(const aiNode* pNode) - /// Apply node transformation and draw meshes assigned to this node. - /// \param [in] pNode - pointer to node for drawing (\ref aiNode). - void Draw_Node(const aiNode* pNode); - - /// \fn void Draw_Mesh(const size_t pMesh_Index) - /// Draw mesh. - /// \param [in] pMesh_Index - index of mesh which must be drawn. Index point to mesh in \ref mHelper_Mesh. - void Draw_Mesh(const size_t pMesh_Index); - - /// \fn void Draw_BBox(const SBBox& pBBox) - /// Draw bounding box using lines. - /// \param [in] pBBox - bounding box for drawing. - void Draw_BBox(const SBBox& pBBox); - - /********************************************************************/ - /*********************** Override functions ************************/ - /********************************************************************/ - -protected: - - /// \fn void drawCoordSystem() - /// Draw axes of the coordinate system. - void drawCoordSystem(); - - /// \fn void initializeGL() override - /// Override function to initialise OpenGL. - void initializeGL() override; - - /// \fn void resizeGL(int pWidth, int pHeight) override - /// \param [in] pWidth - new width of viewport. - /// \param [in] pHeight - new height of viewport. - void resizeGL(int pWidth, int pHeight) override; - - /// \fn void paintGL() override - /// Override function for rendering. - void paintGL() override; - -public: - - /********************************************************************/ - /********************** Constructor/Destructor **********************/ - /********************************************************************/ - - /// \fn explicit CGLView(QWidget* pParent) - /// Constructor. - /// \param [in] pParent - parent widget. - explicit CGLView(QWidget* pParent); - - /// \fn virtual ~CGLView() - /// Destructor. - virtual ~CGLView(); - - /********************************************************************/ - /********************* Scene control functions **********************/ - /********************************************************************/ - - /// \fn void FreeScene() - /// Free all helper objects data. - void FreeScene(); - - /// \fn void SetScene(const aiScene* pScene) - /// Set scene for rendering. - /// \param [in] pScene - pointer to scene. - /// \param [in] pScenePath - path to the file of the scene. - void SetScene(const aiScene* pScene, const QString& pScenePath); - - /// \fn void Enable_SceneBBox(const bool pEnable) - /// Enable drawing scene bounding box. - /// \param [in] pEnable - if true then bbox will be drawing, if false - will not be drawing. - void Enable_SceneBBox(const bool pEnable) { mScene_DrawBBox = pEnable; } - - /// \fn void Enable_Textures(const bool pEnable) - /// Control textures drawing. - /// \param [in] pEnable - if true then enable textures, false - disable textures. - void Enable_Textures(const bool pEnable); - - /// \fn void Enable_Axes(const bool pEnable) - /// Control axes drawing. - /// \param [in] pEnable - if true then enable axes, false - disable axes. - void Enable_Axes(const bool pEnable) { this->mScene_AxesEnabled = pEnable; } - - /********************************************************************/ - /******************** Lighting control functions ********************/ - /********************************************************************/ - - /// \fn void Lighting_Enable() - /// Enable OpenGL lighting. - void Lighting_Enable(); - - /// \fn void Lighting_Disable() - /// Disable OpenGL lighting. - void Lighting_Disable(); - - /// \fn void Lighting_EditSource(const size_t pLightNumber, const SLightParameters& pLightParameters) - /// Edit light source properties. - /// \param [in] pLightNumber - light source number. \ref aiScene::mLights. - /// \param [in] pLightParameters - light source parameters. - void Lighting_EditSource(const size_t pLightNumber, const SLightParameters& pLightParameters);///TODO: function set - - /// \fn void Lighting_EnableSource(const size_t pLightNumber) - /// Enable light source. - /// \param [in] pLightNumber - light source number. \ref aiScene::mLights. - void Lighting_EnableSource(const size_t pLightNumber); - - ///void Lighting_DisableSource(const size_t pLightNumber) - /// Disable light source, - /// \param [in] pLightNumber - light source number. \ref aiScene::mLights. - void Lighting_DisableSource(const size_t pLightNumber); - - /********************************************************************/ - /******************** Cameras control functions *********************/ - /********************************************************************/ - - /// \fn void Camera_Set(const size_t pCameraNumber) - /// Set view from pointed camera. - /// \param [in] pCamera_Index - index of the camera (\ref aiScene::mCameras). - void Camera_Set(const size_t pCameraNumber); - - /// \fn void Camera_RotateScene(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial) - /// Rotate scene around axisees. - /// \param [in] pAngle_X - specifies the angle of rotation around axis oX, in degrees. - /// \param [in] pAngle_Y - specifies the angle of rotation around axis oY, in degrees. - /// \param [in] pAngle_Z - specifies the angle of rotation around axis oZ, in degrees. - /// \param [in] pMatrix_Rotation_Initial - matrix from which calculates new transformation matrix. If not set (equal to nullptr) then current transformation matrix - /// will be used. - void Camera_RotateScene(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial = nullptr); - - /// \fn void Camera_Rotate(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial = nullptr) - /// Rotate camera around axisees. - /// \param [in] pAngle_X - specifies the angle of rotation around axis oX, in degrees. - /// \param [in] pAngle_Y - specifies the angle of rotation around axis oY, in degrees. - /// \param [in] pAngle_Z - specifies the angle of rotation around axis oZ, in degrees. - /// \param [in] pMatrix_Rotation_Initial - matrix from which calculates new transformation matrix. If not set (equal to nullptr) then current transformation matrix - /// will be used. - void Camera_Rotate(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial = nullptr); - - /// \fn void Camera_Translate(const size_t pTranslate_X, const size_t pTranslate_Y, const size_t pTranslate_Z) - /// Translate camera along axises. In local coordinates. - /// \param [in] pTranslate_X - specifies the X coordinate of translation vector. - /// \param [in] pTranslate_Y - specifies the Y coordinate of translation vector. - /// \param [in] pTranslate_Z - specifies the Z coordinate of translation vector. - void Camera_Translate(const GLfloat pTranslate_X, const GLfloat pTranslate_Y, const GLfloat pTranslate_Z); - - /// \fn void Camera_Matrix(aiMatrix4x4& pRotation_Camera, aiMatrix4x4& pRotation_Scene, aiVector3D& pTranslation_Camera) - /// Return data about camera position in world. - /// \param [out] pRotation_Camera - rotation matrix which set rotation angles of the scene around camera. - /// \param [out] pRotation_Scene - rotation matrix which set rotation angles of the scene around own center. - /// \param [out] pTranslation_Camera - translation vector from camera to the scene. - void Camera_Matrix(aiMatrix4x4& pRotation_Camera, aiMatrix4x4& pRotation_Scene, aiVector3D& pTranslation_Camera); - -signals: - - /// \fn void Paint_Finished(const size_t pPaintTime, const GLfloat pDistance) - ///< Signal. Emits when execution of \ref paintGL is end. - /// \param [out] pPaintTime_ms - time spent for rendering, in milliseconds. - /// \param [out] pDistance - distance between current camera and center of the scene. \sa SHelper_Camera::Translation_ToScene. - void Paint_Finished(const size_t pPaintTime_ms, const GLfloat pDistance); - - /// \fn void SceneObject_Camera(const QString& pName) - /// Signal. Emit for every camera found in scene. Also for default camera. - /// \param [out] pName - name of the camera. - void SceneObject_Camera(const QString& pName); - - /// \fn void SceneObject_LightSource(const QString& pName) - /// Signal. Emit for every light source found in scene. Also for default light source. - /// \param [out] pName - name of the light source. - void SceneObject_LightSource(const QString& pName); -};// class CGLView diff --git a/tools/assimp_qt_viewer/loggerview.cpp b/tools/assimp_qt_viewer/loggerview.cpp deleted file mode 100644 index 2e0d15547..000000000 --- a/tools/assimp_qt_viewer/loggerview.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2018, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ -#include "loggerview.hpp" - -// Header files, Qt. -#include -#include - -CLoggerView::CLoggerView(QTextBrowser* pOutputWidget) -: mOutputWidget(pOutputWidget) { - // empty -} - -CLoggerView::~CLoggerView() { - mOutputWidget = nullptr; -} - -void CLoggerView::write(const char *pMessage) { - if (nullptr == mOutputWidget) { - return; - } - - mOutputWidget->insertPlainText(QString("[%1] %2").arg(QTime::currentTime().toString()).arg(pMessage)); -} diff --git a/tools/assimp_qt_viewer/loggerview.hpp b/tools/assimp_qt_viewer/loggerview.hpp deleted file mode 100644 index 9011f671f..000000000 --- a/tools/assimp_qt_viewer/loggerview.hpp +++ /dev/null @@ -1,67 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2018, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ -#pragma once - -// Header files, Assimp. -#include - -class QTextBrowser; - -/// @class CLoggerView -/// @brief GUI-stream for Assimp logging sub-sytem. Get data for logging and write it to output widget. -class CLoggerView final : public ::Assimp::LogStream { -public: - /// @brief The class constructor. - /// @param [in] pOutputWidget - pointer to output widget. - explicit CLoggerView( QTextBrowser* pOutputWidget ); - - /// @brief The class destructor. - virtual ~CLoggerView(); - - /// Write message to output widget. Used by Assimp. - /// \param [in] pMessage - message for displaying. - virtual void write(const char *pMessage); - -private: - QTextBrowser * mOutputWidget; ///< Widget for displaying messages. -}; diff --git a/tools/assimp_qt_viewer/main.cpp b/tools/assimp_qt_viewer/main.cpp deleted file mode 100644 index 6dfdd4981..000000000 --- a/tools/assimp_qt_viewer/main.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2018, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ - -// Thanks to acorn89 for support. - -// Header files, project. -#include "mainwindow.hpp" - -// Header files, Qt. -#include - -int main(int argc, char *argv[]) { - QApplication app(argc, argv); - MainWindow win; - win.show(); - - return app.exec(); -} diff --git a/tools/assimp_qt_viewer/mainwindow.cpp b/tools/assimp_qt_viewer/mainwindow.cpp deleted file mode 100644 index 82c2fcbe3..000000000 --- a/tools/assimp_qt_viewer/mainwindow.cpp +++ /dev/null @@ -1,466 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2018, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ - -#include "mainwindow.hpp" -#include "ui_mainwindow.h" - -// Header files, Assimp. -#include -#include - -#ifndef __unused - #define __unused __attribute__((unused)) -#endif // __unused - -using namespace Assimp; - - -void MainWindow::ImportFile(const QString &pFileName) { - QTime time_begin = QTime::currentTime(); - - if ( mScene != nullptr ) { - mImporter.FreeScene(); - mGLView->FreeScene(); - } - - // Try to import scene. - mScene = mImporter.ReadFile(pFileName.toStdString(), aiProcess_Triangulate | aiProcess_GenNormals | aiProcess_ValidateDataStructure | \ - aiProcess_GenUVCoords | aiProcess_TransformUVCoords | aiProcess_FlipUVs); - if ( mScene != nullptr ) { - ui->lblLoadTime->setText(QString::number(time_begin.secsTo(QTime::currentTime()))); - LogInfo("Import done: " + pFileName); - // Prepare widgets for new scene. - ui->leFileName->setText(pFileName.right(pFileName.length() - pFileName.lastIndexOf('/') - 1)); - ui->lstLight->clear(); - ui->lstCamera->clear(); - ui->cbxLighting->setChecked(true); mGLView->Lighting_Enable(); - ui->cbxBBox->setChecked(false); mGLView->Enable_SceneBBox(false); - ui->cbxTextures->setChecked(true); mGLView->Enable_Textures(true); - - // - // Fill info labels - // - // Cameras - ui->lblCameraCount->setText(QString::number(mScene->mNumCameras)); - // Lights - ui->lblLightCount->setText(QString::number(mScene->mNumLights)); - // Meshes, faces, vertices. - size_t qty_face = 0; - size_t qty_vert = 0; - - for(size_t idx_mesh = 0; idx_mesh < mScene->mNumMeshes; idx_mesh++) { - qty_face += mScene->mMeshes[idx_mesh]->mNumFaces; - qty_vert += mScene->mMeshes[idx_mesh]->mNumVertices; - } - - ui->lblMeshCount->setText(QString::number(mScene->mNumMeshes)); - ui->lblFaceCount->setText(QString::number(qty_face)); - ui->lblVertexCount->setText(QString::number(qty_vert)); - // Animation - if(mScene->mNumAnimations) - ui->lblHasAnimation->setText("yes"); - else - ui->lblHasAnimation->setText("no"); - - // - // Set scene for GL viewer. - // - mGLView->SetScene(mScene, pFileName); - // Select first camera - ui->lstCamera->setCurrentRow(0); - mGLView->Camera_Set(0); - // Scene is loaded, do first rendering. - LogInfo("Scene is ready for rendering."); -#if ASSIMP_QT4_VIEWER - mGLView->updateGL(); -#else - mGLView->update(); -#endif // ASSIMP_QT4_VIEWER - } - else - { - ResetSceneInfos(); - - QString errorMessage = QString("Error parsing \'%1\' : \'%2\'").arg(pFileName).arg(mImporter.GetErrorString()); - QMessageBox::critical(this, "Import error", errorMessage); - LogError(errorMessage); - }// if(mScene != nullptr) -} - -void MainWindow::ResetSceneInfos() -{ - ui->lblLoadTime->clear(); - ui->leFileName->clear(); - ui->lblMeshCount->setText("0"); - ui->lblFaceCount->setText("0"); - ui->lblVertexCount->setText("0"); - ui->lblCameraCount->setText("0"); - ui->lblLightCount->setText("0"); - ui->lblHasAnimation->setText("no"); -} - -/********************************************************************/ -/************************ Logging functions *************************/ -/********************************************************************/ - -void MainWindow::LogInfo(const QString& pMessage) -{ - Assimp::DefaultLogger::get()->info(pMessage.toStdString()); -} - -void MainWindow::LogError(const QString& pMessage) -{ - Assimp::DefaultLogger::get()->error(pMessage.toStdString()); -} - -/********************************************************************/ -/*********************** Override functions ************************/ -/********************************************************************/ - -void MainWindow::mousePressEvent(QMouseEvent* pEvent) -{ - const QPoint ms_pt = pEvent->pos(); - aiVector3D temp_v3; - - // Check if GLView is pointed. - if(childAt(ms_pt) == mGLView) - { - if(!mMouse_Transformation.Position_Pressed_Valid) - { - mMouse_Transformation.Position_Pressed_Valid = true;// set flag - // Store current transformation matrices. - mGLView->Camera_Matrix(mMouse_Transformation.Rotation_AroundCamera, mMouse_Transformation.Rotation_Scene, temp_v3); - } - - if(pEvent->button() & Qt::LeftButton) - mMouse_Transformation.Position_Pressed_LMB = ms_pt; - else if(pEvent->button() & Qt::RightButton) - mMouse_Transformation.Position_Pressed_RMB = ms_pt; - } - else - { - mMouse_Transformation.Position_Pressed_Valid = false; - } -} - -void MainWindow::mouseReleaseEvent(QMouseEvent *pEvent) -{ - if(pEvent->buttons() == 0) mMouse_Transformation.Position_Pressed_Valid = false; - -} - -void MainWindow::mouseMoveEvent(QMouseEvent* pEvent) -{ - if(mMouse_Transformation.Position_Pressed_Valid) - { - if(pEvent->buttons() & Qt::LeftButton) - { - GLfloat dx = 180 * GLfloat(pEvent->x() - mMouse_Transformation.Position_Pressed_LMB.x()) / mGLView->width(); - GLfloat dy = 180 * GLfloat(pEvent->y() - mMouse_Transformation.Position_Pressed_LMB.y()) / mGLView->height(); - - if(pEvent->modifiers() & Qt::ShiftModifier) - mGLView->Camera_RotateScene(dy, 0, dx, &mMouse_Transformation.Rotation_Scene);// Rotate around oX and oZ axises. - else - mGLView->Camera_RotateScene(dy, dx, 0, &mMouse_Transformation.Rotation_Scene);// Rotate around oX and oY axises. - - #if ASSIMP_QT4_VIEWER - mGLView->updateGL(); - #else - mGLView->update(); - #endif // ASSIMP_QT4_VIEWER - } - - if(pEvent->buttons() & Qt::RightButton) - { - GLfloat dx = 180 * GLfloat(pEvent->x() - mMouse_Transformation.Position_Pressed_RMB.x()) / mGLView->width(); - GLfloat dy = 180 * GLfloat(pEvent->y() - mMouse_Transformation.Position_Pressed_RMB.y()) / mGLView->height(); - - if(pEvent->modifiers() & Qt::ShiftModifier) - mGLView->Camera_Rotate(dy, 0, dx, &mMouse_Transformation.Rotation_AroundCamera);// Rotate around oX and oZ axises. - else - mGLView->Camera_Rotate(dy, dx, 0, &mMouse_Transformation.Rotation_AroundCamera);// Rotate around oX and oY axises. - - #if ASSIMP_QT4_VIEWER - mGLView->updateGL(); - #else - mGLView->update(); - #endif // ASSIMP_QT4_VIEWER - } - } -} - -void MainWindow::keyPressEvent(QKeyEvent* pEvent) -{ -GLfloat step; - - if(pEvent->modifiers() & Qt::ControlModifier) - step = 10; - else if(pEvent->modifiers() & Qt::AltModifier) - step = 100; - else - step = 1; - - if(pEvent->key() == Qt::Key_A) - mGLView->Camera_Translate(-step, 0, 0); - else if(pEvent->key() == Qt::Key_D) - mGLView->Camera_Translate(step, 0, 0); - else if(pEvent->key() == Qt::Key_W) - mGLView->Camera_Translate(0, step, 0); - else if(pEvent->key() == Qt::Key_S) - mGLView->Camera_Translate(0, -step, 0); - else if(pEvent->key() == Qt::Key_Up) - mGLView->Camera_Translate(0, 0, -step); - else if(pEvent->key() == Qt::Key_Down) - mGLView->Camera_Translate(0, 0, step); - -#if ASSIMP_QT4_VIEWER - mGLView->updateGL(); -#else - mGLView->update(); -#endif // ASSIMP_QT4_VIEWER -} - -/********************************************************************/ -/********************** Constructor/Destructor **********************/ -/********************************************************************/ - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), ui(new Ui::MainWindow), - mScene(nullptr) -{ - - // other variables - mMouse_Transformation.Position_Pressed_Valid = false; - - ui->setupUi(this); - // Create OpenGL widget - mGLView = new CGLView(this); - mGLView->setMinimumSize(800, 600); - mGLView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding); - mGLView->setFocusPolicy(Qt::StrongFocus); - // Connect to GLView signals. - connect(mGLView, SIGNAL(Paint_Finished(size_t, GLfloat)), SLOT(Paint_Finished(size_t, GLfloat))); - connect(mGLView, SIGNAL(SceneObject_Camera(QString)), SLOT(SceneObject_Camera(QString))); - connect(mGLView, SIGNAL(SceneObject_LightSource(QString)), SLOT(SceneObject_LightSource(QString))); - // and add it to layout - ui->hlMainView->insertWidget(0, mGLView, 4); - // Create logger - mLoggerView = new CLoggerView(ui->tbLog); - DefaultLogger::create("", Logger::VERBOSE); - DefaultLogger::get()->attachStream(mLoggerView, DefaultLogger::Debugging | DefaultLogger::Info | DefaultLogger::Err | DefaultLogger::Warn); - - ResetSceneInfos(); -} - -MainWindow::~MainWindow() -{ -using namespace Assimp; - - DefaultLogger::get()->detatchStream(mLoggerView, DefaultLogger::Debugging | DefaultLogger::Info | DefaultLogger::Err | DefaultLogger::Warn); - DefaultLogger::kill(); - - if(mScene != nullptr) mImporter.FreeScene(); - if(mLoggerView != nullptr) delete mLoggerView; - if(mGLView != nullptr) delete mGLView; - delete ui; -} - -/********************************************************************/ -/****************************** Slots *******************************/ -/********************************************************************/ - -void MainWindow::Paint_Finished(const size_t pPaintTime_ms, const GLfloat pDistance) -{ - ui->lblRenderTime->setText(QString::number(pPaintTime_ms)); - ui->lblDistance->setText(QString::number(pDistance)); -} - -void MainWindow::SceneObject_Camera(const QString& pName) -{ - ui->lstCamera->addItem(pName); -} - -void MainWindow::SceneObject_LightSource(const QString& pName) -{ - ui->lstLight->addItem(pName); - // After item added "currentRow" is still contain old value (even '-1' if first item added). Because "currentRow"/"currentItem" is changed by user interaction, - // not by "addItem". So, "currentRow" must be set manually. - ui->lstLight->setCurrentRow(ui->lstLight->count() - 1); - // And after "selectAll" handler of "signal itemSelectionChanged" will get right "currentItem" and "currentRow" values. - ui->lstLight->selectAll(); -} - -void MainWindow::on_butOpenFile_clicked() { - aiString filter_temp; - mImporter.GetExtensionList( filter_temp ); - - QString filename, filter; - filter = filter_temp.C_Str(); - filter.replace(';', ' '); - filter.append(" ;; All (*.*)"); - filename = QFileDialog::getOpenFileName(this, "Choose the file", "", filter); - - if (!filename.isEmpty()) { - ImportFile( filename ); - } -} - -void MainWindow::on_butExport_clicked() -{ - using namespace Assimp; - -#ifndef ASSIMP_BUILD_NO_EXPORT - QString filename, filter, format_id; - Exporter exporter; - QTime time_begin; - aiReturn rv; - QStringList exportersList; - QMap exportersMap; - - - if(mScene == nullptr) - { - QMessageBox::critical(this, "Export error", "Scene is empty"); - - return; - } - - for (size_t i = 0; i < exporter.GetExportFormatCount(); ++i) - { - const aiExportFormatDesc* desc = exporter.GetExportFormatDescription(i); - exportersList.push_back(desc->id + QString(": ") + desc->description); - exportersMap.insert(desc->id, desc); - } - - // get an exporter - bool dialogSelectExporterOk; - QString selectedExporter = QInputDialog::getItem(this, "Export format", "Select the exporter : ", exportersList, 0, false, &dialogSelectExporterOk); - if (!dialogSelectExporterOk) - return; - - // build the filter - QString selectedId = selectedExporter.left(selectedExporter.indexOf(':')); - filter = QString("*.") + exportersMap[selectedId]->fileExtension; - - // get file path - filename = QFileDialog::getSaveFileName(this, "Set file name", "", filter); - // if it's canceled - if (filename == "") - return; - - // begin export - time_begin = QTime::currentTime(); - rv = exporter.Export(mScene, selectedId.toLocal8Bit(), filename.toLocal8Bit(), aiProcess_FlipUVs); - ui->lblExportTime->setText(QString::number(time_begin.secsTo(QTime::currentTime()))); - if(rv == aiReturn_SUCCESS) - LogInfo("Export done: " + filename); - else - { - QString errorMessage = QString("Export failed: ") + filename; - LogError(errorMessage); - QMessageBox::critical(this, "Export error", errorMessage); - } -#endif -} - -void MainWindow::on_cbxLighting_clicked(bool pChecked) -{ - if(pChecked) - mGLView->Lighting_Enable(); - else - mGLView->Lighting_Disable(); - - mGLView->update(); -} - -void MainWindow::on_lstLight_itemSelectionChanged() -{ -bool selected = ui->lstLight->isItemSelected(ui->lstLight->currentItem()); - - if(selected) - mGLView->Lighting_EnableSource(ui->lstLight->currentRow()); - else - mGLView->Lighting_DisableSource(ui->lstLight->currentRow()); - -#if ASSIMP_QT4_VIEWER - mGLView->updateGL(); -#else - mGLView->update(); -#endif // ASSIMP_QT4_VIEWER -} - -void MainWindow::on_lstCamera_clicked( const QModelIndex &) -{ - mGLView->Camera_Set(ui->lstLight->currentRow()); -#if ASSIMP_QT4_VIEWER - mGLView->updateGL(); -#else - mGLView->update(); -#endif // ASSIMP_QT4_VIEWER -} - -void MainWindow::on_cbxBBox_clicked(bool checked) -{ - mGLView->Enable_SceneBBox(checked); -#if ASSIMP_QT4_VIEWER - mGLView->updateGL(); -#else - mGLView->update(); -#endif // ASSIMP_QT4_VIEWER -} - -void MainWindow::on_cbxDrawAxes_clicked(bool checked) -{ - mGLView->Enable_Axes(checked); -#if ASSIMP_QT4_VIEWER - mGLView->updateGL(); -#else - mGLView->update(); -#endif // ASSIMP_QT4_VIEWER -} - -void MainWindow::on_cbxTextures_clicked(bool checked) -{ - mGLView->Enable_Textures(checked); - mGLView->update(); -} diff --git a/tools/assimp_qt_viewer/mainwindow.hpp b/tools/assimp_qt_viewer/mainwindow.hpp deleted file mode 100644 index 1ebd19996..000000000 --- a/tools/assimp_qt_viewer/mainwindow.hpp +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2018, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ - -#pragma once - -// Header files, Qt. -#if defined ASSIMP_QT4_VIEWER -# include -#else -# include -#endif - -// Header files, project. -#include "glview.hpp" -#include "loggerview.hpp" - -// Header files, Assimp. -#include -#include - -namespace Ui { - class MainWindow; -} - -/// \class MainWindow -/// Main window and algorithms. -class MainWindow : public QMainWindow { - Q_OBJECT - - struct SMouse_Transformation; - -public: - /// @brief The class constructor. - /// \param [in] pParent - pointer to parent widget. - explicit MainWindow( QWidget* pParent = 0 ); - - /// @brief The class destructor. - ~MainWindow(); - - /// Import scene from file. - /// \param [in] pFileName - path and name of the file. - void ImportFile(const QString& pFileName); - - /// Reset informations about the scene - void ResetSceneInfos(); - - /// Add message with severity "Warning" to log. - void LogInfo(const QString& pMessage); - - /// Add message with severity "Error" to log. - void LogError(const QString& pMessage); - -protected: - /// Override function which handles mouse event "button pressed". - /// \param [in] pEvent - pointer to event data. - void mousePressEvent(QMouseEvent* pEvent) override; - - /// Override function which handles mouse event "button released". - /// \param [in] pEvent - pointer to event data. - void mouseReleaseEvent(QMouseEvent *pEvent) override; - - /// Override function which handles mouse event "move". - /// \param [in] pEvent - pointer to event data. - void mouseMoveEvent(QMouseEvent* pEvent) override; - - /// Override function which handles key event "key pressed". - /// \param [in] pEvent - pointer to event data. - void keyPressEvent(QKeyEvent* pEvent) override; - -private slots: - /// Show paint/render time and distance between camera and center of the scene. - /// \param [in] pPaintTime_ms - paint time in milliseconds. - void Paint_Finished(const size_t pPaintTime_ms, const GLfloat pDistance); - - /// Add camera name to list. - /// \param [in] pName - name of the camera. - void SceneObject_Camera(const QString& pName); - - /// Add lighting source name to list. - /// \param [in] pName - name of the light source, - void SceneObject_LightSource(const QString& pName); - - void on_butOpenFile_clicked(); - void on_butExport_clicked(); - void on_cbxLighting_clicked(bool pChecked); - void on_lstLight_itemSelectionChanged(); - void on_lstCamera_clicked(const QModelIndex &index); - void on_cbxBBox_clicked(bool checked); - void on_cbxTextures_clicked(bool checked); - void on_cbxDrawAxes_clicked(bool checked); - -private: - Ui::MainWindow *ui; - CGLView *mGLView;///< Pointer to OpenGL render. - CLoggerView *mLoggerView;///< Pointer to logging object. - Assimp::Importer mImporter;///< Assimp importer. - const aiScene* mScene;///< Pointer to loaded scene (\ref aiScene). - - /// \struct SMouse_Transformation - /// Holds data about transformation of the scene/camera when mouse us used. - struct SMouse_Transformation { - bool Position_Pressed_Valid;///< Mouse button pressed on GLView. - QPoint Position_Pressed_LMB;///< Position where was pressed left mouse button. - QPoint Position_Pressed_RMB;///< Position where was pressed right mouse button. - aiMatrix4x4 Rotation_AroundCamera;///< Rotation matrix which set rotation angles of the scene around camera. - aiMatrix4x4 Rotation_Scene;///< Rotation matrix which set rotation angles of the scene around own center. - } mMouse_Transformation; -}; diff --git a/tools/assimp_qt_viewer/mainwindow.ui b/tools/assimp_qt_viewer/mainwindow.ui deleted file mode 100644 index 04208f585..000000000 --- a/tools/assimp_qt_viewer/mainwindow.ui +++ /dev/null @@ -1,544 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 641 - 778 - - - - MainWindow - - - - - - - - - QLayout::SetDefaultConstraint - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - File - - - - - - Qt::NoFocus - - - Open file - - - - - - - Qt::NoFocus - - - File name - - - - - - - - 160 - 16777215 - - - - Qt::NoFocus - - - false - - - true - - - - - - - Qt::NoFocus - - - Load time, s - - - - - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - Qt::NoFocus - - - Qt::Horizontal - - - - - - - Qt::NoFocus - - - Export - - - - - - - Qt::NoFocus - - - Export time, s - - - - - - - Qt::NoFocus - - - - - - - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Info - - - - - - Qt::NoFocus - - - Render time, ms - - - - - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - Qt::NoFocus - - - Meshes - - - - - - - Qt::NoFocus - - - Faces - - - - - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - Qt::NoFocus - - - Vertices - - - - - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - Qt::NoFocus - - - Lights - - - - - - - Qt::NoFocus - - - Cameras - - - - - - - Qt::NoFocus - - - Animation - - - - - - - false - - - Qt::NoFocus - - - Shaders - - - - - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - false - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - Qt::NoFocus - - - - - - Qt::AlignCenter - - - - - - - Distance - - - - - - - - - - Qt::AlignCenter - - - - - - - - - - false - - - Qt::NoFocus - - - Dynamics - - - - - - Qt::NoFocus - - - Animation start - - - - - - - Qt::NoFocus - - - Animation stop - - - - - - - - - - - - - - Qt::NoFocus - - - 2 - - - - Log - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Qt::NoFocus - - - - - - - - Lights and cameras - - - - - - Qt::NoFocus - - - Light sources of the scene - - - QAbstractItemView::SelectedClicked - - - false - - - QAbstractItemView::MultiSelection - - - - - - - Qt::NoFocus - - - Cameras of the scene - - - QAbstractItemView::NoEditTriggers - - - false - - - - - - - - Control - - - - - - Enable/Disable OpenGL lighting - - - Lighting - - - true - - - - - - - Scene BBox - - - - - - - Textures - - - - - - - Show Axes - - - true - - - - - - - - - - - - - - - - - installEventFilter() - -