Răsfoiți Sursa

remove the qt-viewer from the build system.

Kim Kulling 6 ani în urmă
părinte
comite
13586eb073

+ 10 - 14
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)

+ 0 - 76
tools/assimp_qt_viewer/CMakeLists.txt

@@ -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)

BIN
tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (en).odt


BIN
tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (ru).odt


+ 0 - 1161
tools/assimp_qt_viewer/glview.cpp

@@ -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 <QTime>
-
-// Header files, OpenGL.
-#if defined(__APPLE__)
-# include <OpenGL/glu.h>
-#else
-# include <GL/glu.h>
-#endif
-
-// Header files, DevIL.
-
-// Header files, Assimp.
-#include <assimp/DefaultLogger.hpp>
-
-#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<aiMatrix4x4> 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<aiMatrix4x4>::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<QString, GLuint>::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;
-}

+ 0 - 456
tools/assimp_qt_viewer/glview.hpp

@@ -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 <QMap>
-#if ASSIMP_QT4_VIEWER
-#	include <QtOpenGL>
-#else
-#	include <QOpenGLWidget>
-#	include <QOpenGLFunctions>
-#endif // ASSIMP_QT4_VIEWER
-
-// Header files Assimp
-#include <assimp/scene.h>
-
-/// \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<QString, GLuint> 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<typename TArg> void AssignIfLesser(TArg* pBaseValue, const TArg pTestValue) { if(pTestValue < *pBaseValue) *pBaseValue = pTestValue; }
-	template<typename TArg> void AssignIfGreater(TArg* pBaseValue, const TArg pTestValue) { if(pTestValue > *pBaseValue) *pBaseValue = pTestValue; }
-
-	template<typename TArg> void AssignIfLesser(TArg& pBaseValue, const TArg pTestValue) { if(pTestValue < pBaseValue) pBaseValue = pTestValue; }
-	template<typename TArg> 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

+ 0 - 64
tools/assimp_qt_viewer/loggerview.cpp

@@ -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 <QTime>
-#include <QTextBrowser>
-
-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));
-}

+ 0 - 67
tools/assimp_qt_viewer/loggerview.hpp

@@ -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 <assimp/DefaultLogger.hpp>
-
-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.
-};

+ 0 - 58
tools/assimp_qt_viewer/main.cpp

@@ -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 <QApplication>
-
-int main(int argc, char *argv[]) {
-    QApplication app(argc, argv);
-    MainWindow win;
-    win.show();
-
-    return app.exec();
-}

+ 0 - 466
tools/assimp_qt_viewer/mainwindow.cpp

@@ -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 <assimp/Exporter.hpp>
-#include <assimp/postprocess.h>
-
-#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<QString, const aiExportFormatDesc*> 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();
-}

+ 0 - 148
tools/assimp_qt_viewer/mainwindow.hpp

@@ -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 <QMainWindow>
-#else
-#	include <QtWidgets>
-#endif
-
-// Header files, project.
-#include "glview.hpp"
-#include "loggerview.hpp"
-
-// Header files, Assimp.
-#include <assimp/Importer.hpp>
-#include <assimp/scene.h>
-
-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;
-};

+ 0 - 544
tools/assimp_qt_viewer/mainwindow.ui

@@ -1,544 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>641</width>
-    <height>778</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>MainWindow</string>
-  </property>
-  <widget class="QWidget" name="centralWidget">
-   <layout class="QVBoxLayout" name="verticalLayout_2">
-    <item>
-     <layout class="QVBoxLayout" name="verticalLayout" stretch="5,1">
-      <item>
-       <layout class="QHBoxLayout" name="hlMainView" stretch="0">
-        <property name="sizeConstraint">
-         <enum>QLayout::SetDefaultConstraint</enum>
-        </property>
-        <item>
-         <layout class="QVBoxLayout" name="verticalLayout_3">
-          <item>
-           <widget class="QGroupBox" name="grpFile">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="focusPolicy">
-             <enum>Qt::NoFocus</enum>
-            </property>
-            <property name="title">
-             <string>File</string>
-            </property>
-            <layout class="QFormLayout" name="formLayout_2">
-             <item row="0" column="0" colspan="2">
-              <widget class="QPushButton" name="butOpenFile">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Open file</string>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="0">
-              <widget class="QLabel" name="lblFileName_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>File name</string>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="1">
-              <widget class="QLineEdit" name="leFileName">
-               <property name="maximumSize">
-                <size>
-                 <width>160</width>
-                 <height>16777215</height>
-                </size>
-               </property>
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="frame">
-                <bool>false</bool>
-               </property>
-               <property name="readOnly">
-                <bool>true</bool>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="0">
-              <widget class="QLabel" name="lblLoadTime_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Load time, s</string>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="1">
-              <widget class="QLabel" name="lblLoadTime">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="4" column="0" colspan="2">
-              <widget class="Line" name="line">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="orientation">
-                <enum>Qt::Horizontal</enum>
-               </property>
-              </widget>
-             </item>
-             <item row="5" column="0" colspan="2">
-              <widget class="QPushButton" name="butExport">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Export</string>
-               </property>
-              </widget>
-             </item>
-             <item row="6" column="0">
-              <widget class="QLabel" name="lblExportTime_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Export time, s</string>
-               </property>
-              </widget>
-             </item>
-             <item row="6" column="1">
-              <widget class="QLabel" name="lblExportTime">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </widget>
-          </item>
-          <item>
-           <widget class="QGroupBox" name="grpInfo">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="focusPolicy">
-             <enum>Qt::NoFocus</enum>
-            </property>
-            <property name="title">
-             <string>Info</string>
-            </property>
-            <layout class="QFormLayout" name="formLayout_4">
-             <item row="0" column="0">
-              <widget class="QLabel" name="lblRenderTime_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Render time, ms</string>
-               </property>
-              </widget>
-             </item>
-             <item row="0" column="1">
-              <widget class="QLabel" name="lblRenderTime">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="0">
-              <widget class="QLabel" name="lblMeshCount_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Meshes</string>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="0">
-              <widget class="QLabel" name="lblFaceCount_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Faces</string>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="1">
-              <widget class="QLabel" name="lblMeshCount">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="1">
-              <widget class="QLabel" name="lblFaceCount">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="3" column="0">
-              <widget class="QLabel" name="lblVertexCount_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Vertices</string>
-               </property>
-              </widget>
-             </item>
-             <item row="3" column="1">
-              <widget class="QLabel" name="lblVertexCount">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="4" column="0">
-              <widget class="QLabel" name="lblLightCount_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Lights</string>
-               </property>
-              </widget>
-             </item>
-             <item row="5" column="0">
-              <widget class="QLabel" name="lblCameraCount_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Cameras</string>
-               </property>
-              </widget>
-             </item>
-             <item row="7" column="0">
-              <widget class="QLabel" name="lblHasAnimation_Label">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Animation</string>
-               </property>
-              </widget>
-             </item>
-             <item row="6" column="0">
-              <widget class="QLabel" name="lblShaderCount_Label">
-               <property name="enabled">
-                <bool>false</bool>
-               </property>
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Shaders</string>
-               </property>
-              </widget>
-             </item>
-             <item row="4" column="1">
-              <widget class="QLabel" name="lblLightCount">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="5" column="1">
-              <widget class="QLabel" name="lblCameraCount">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="6" column="1">
-              <widget class="QLabel" name="lblShaderCount">
-               <property name="enabled">
-                <bool>false</bool>
-               </property>
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="7" column="1">
-              <widget class="QLabel" name="lblHasAnimation">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-             <item row="8" column="0">
-              <widget class="QLabel" name="lblDistance_Label">
-               <property name="text">
-                <string>Distance</string>
-               </property>
-              </widget>
-             </item>
-             <item row="8" column="1">
-              <widget class="QLabel" name="lblDistance">
-               <property name="text">
-                <string/>
-               </property>
-               <property name="alignment">
-                <set>Qt::AlignCenter</set>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </widget>
-          </item>
-          <item>
-           <widget class="QGroupBox" name="grpDynamics">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="focusPolicy">
-             <enum>Qt::NoFocus</enum>
-            </property>
-            <property name="title">
-             <string>Dynamics</string>
-            </property>
-            <layout class="QGridLayout" name="gridLayout">
-             <item row="0" column="0">
-              <widget class="QPushButton" name="butAnimationStart">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Animation start</string>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="0">
-              <widget class="QPushButton" name="butAnimationStop">
-               <property name="focusPolicy">
-                <enum>Qt::NoFocus</enum>
-               </property>
-               <property name="text">
-                <string>Animation stop</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </widget>
-          </item>
-         </layout>
-        </item>
-       </layout>
-      </item>
-      <item>
-       <widget class="QTabWidget" name="tabInfoAndControl">
-        <property name="focusPolicy">
-         <enum>Qt::NoFocus</enum>
-        </property>
-        <property name="currentIndex">
-         <number>2</number>
-        </property>
-        <widget class="QWidget" name="tab">
-         <attribute name="title">
-          <string>Log</string>
-         </attribute>
-         <layout class="QGridLayout" name="gridLayout_2">
-          <item row="0" column="0">
-           <widget class="QTextBrowser" name="tbLog">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>0</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="focusPolicy">
-             <enum>Qt::NoFocus</enum>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-        <widget class="QWidget" name="tab_2">
-         <attribute name="title">
-          <string>Lights and cameras</string>
-         </attribute>
-         <layout class="QHBoxLayout" name="horizontalLayout">
-          <item>
-           <widget class="QListWidget" name="lstLight">
-            <property name="focusPolicy">
-             <enum>Qt::NoFocus</enum>
-            </property>
-            <property name="toolTip">
-             <string>Light sources of the scene</string>
-            </property>
-            <property name="editTriggers">
-             <set>QAbstractItemView::SelectedClicked</set>
-            </property>
-            <property name="showDropIndicator" stdset="0">
-             <bool>false</bool>
-            </property>
-            <property name="selectionMode">
-             <enum>QAbstractItemView::MultiSelection</enum>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QListWidget" name="lstCamera">
-            <property name="focusPolicy">
-             <enum>Qt::NoFocus</enum>
-            </property>
-            <property name="toolTip">
-             <string>Cameras of the scene</string>
-            </property>
-            <property name="editTriggers">
-             <set>QAbstractItemView::NoEditTriggers</set>
-            </property>
-            <property name="showDropIndicator" stdset="0">
-             <bool>false</bool>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-        <widget class="QWidget" name="tab_3">
-         <attribute name="title">
-          <string>Control</string>
-         </attribute>
-         <layout class="QGridLayout" name="gridLayout_3">
-          <item row="0" column="0">
-           <widget class="QCheckBox" name="cbxLighting">
-            <property name="toolTip">
-             <string>Enable/Disable OpenGL lighting</string>
-            </property>
-            <property name="text">
-             <string>Lighting</string>
-            </property>
-            <property name="checked">
-             <bool>true</bool>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="0">
-           <widget class="QCheckBox" name="cbxBBox">
-            <property name="text">
-             <string>Scene BBox</string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="0">
-           <widget class="QCheckBox" name="cbxTextures">
-            <property name="text">
-             <string>Textures</string>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="0">
-           <widget class="QCheckBox" name="cbxDrawAxes">
-            <property name="text">
-             <string>Show Axes</string>
-            </property>
-            <property name="checked">
-             <bool>true</bool>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </widget>
-      </item>
-     </layout>
-    </item>
-   </layout>
-  </widget>
- </widget>
- <layoutdefault spacing="6" margin="11"/>
- <resources/>
- <connections/>
- <slots>
-  <signal>installEventFilter()</signal>
- </slots>
-</ui>